@appium/support 2.61.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/console.d.ts +1 -1
- package/build/lib/console.js +169 -105
- package/build/lib/console.js.map +1 -1
- package/build/lib/env.js +142 -117
- package/build/lib/env.js.map +1 -1
- package/build/lib/fs.d.ts +9 -2
- package/build/lib/fs.d.ts.map +1 -1
- package/build/lib/fs.js +358 -246
- package/build/lib/fs.js.map +1 -1
- package/build/lib/image-util.js +139 -124
- package/build/lib/image-util.js.map +1 -1
- package/build/lib/index.js +64 -103
- package/build/lib/index.js.map +1 -1
- package/build/lib/log-internal.d.ts +4 -27
- package/build/lib/log-internal.d.ts.map +1 -1
- package/build/lib/log-internal.js +141 -123
- package/build/lib/log-internal.js.map +1 -1
- package/build/lib/logger.d.ts +1 -1
- package/build/lib/logger.d.ts.map +1 -1
- package/build/lib/logger.js +5 -14
- package/build/lib/logger.js.map +1 -1
- package/build/lib/logging.d.ts +3 -4
- package/build/lib/logging.d.ts.map +1 -1
- package/build/lib/logging.js +139 -110
- package/build/lib/logging.js.map +1 -1
- package/build/lib/mjpeg.js +169 -141
- package/build/lib/mjpeg.js.map +1 -1
- package/build/lib/mkdirp.js +7 -13
- package/build/lib/mkdirp.js.map +1 -1
- package/build/lib/net.d.ts.map +1 -1
- package/build/lib/net.js +278 -254
- package/build/lib/net.js.map +1 -1
- package/build/lib/node.js +203 -192
- package/build/lib/node.js.map +1 -1
- package/build/lib/npm.d.ts +19 -4
- package/build/lib/npm.d.ts.map +1 -1
- package/build/lib/npm.js +277 -228
- package/build/lib/npm.js.map +1 -1
- package/build/lib/plist.js +145 -136
- package/build/lib/plist.js.map +1 -1
- package/build/lib/process.js +41 -42
- package/build/lib/process.js.map +1 -1
- package/build/lib/system.js +39 -56
- package/build/lib/system.js.map +1 -1
- package/build/lib/tempdir.js +112 -73
- package/build/lib/tempdir.js.map +1 -1
- package/build/lib/timing.js +99 -84
- package/build/lib/timing.js.map +1 -1
- package/build/lib/util.js +454 -356
- package/build/lib/util.js.map +1 -1
- package/build/lib/zip.js +469 -423
- package/build/lib/zip.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/fs.js +15 -1
- package/lib/log-internal.js +12 -16
- package/lib/logging.js +2 -3
- package/lib/net.js +15 -6
- package/lib/npm.js +28 -18
- package/package.json +19 -18
package/build/lib/util.js
CHANGED
|
@@ -1,90 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
exports.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
exports.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
exports.
|
|
20
|
-
exports.
|
|
21
|
-
exports.
|
|
22
|
-
exports.
|
|
23
|
-
|
|
24
|
-
Object.defineProperty(exports, "shellParse", {
|
|
25
|
-
enumerable: true,
|
|
26
|
-
get: function () {
|
|
27
|
-
return _shellQuote.parse;
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
exports.toInMemoryBase64 = toInMemoryBase64;
|
|
31
|
-
exports.toReadableSizeString = toReadableSizeString;
|
|
32
|
-
exports.unleakString = unleakString;
|
|
33
|
-
exports.unwrapElement = unwrapElement;
|
|
34
|
-
Object.defineProperty(exports, "uuidV1", {
|
|
35
|
-
enumerable: true,
|
|
36
|
-
get: function () {
|
|
37
|
-
return _uuid.v1;
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
Object.defineProperty(exports, "uuidV3", {
|
|
41
|
-
enumerable: true,
|
|
42
|
-
get: function () {
|
|
43
|
-
return _uuid.v3;
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
Object.defineProperty(exports, "uuidV4", {
|
|
47
|
-
enumerable: true,
|
|
48
|
-
get: function () {
|
|
49
|
-
return _uuid.v4;
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
Object.defineProperty(exports, "uuidV5", {
|
|
53
|
-
enumerable: true,
|
|
54
|
-
get: function () {
|
|
55
|
-
return _uuid.v5;
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
exports.wrapElement = wrapElement;
|
|
59
|
-
|
|
60
|
-
require("source-map-support/register");
|
|
61
|
-
|
|
62
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
63
|
-
|
|
64
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
65
|
-
|
|
66
|
-
var _os = _interopRequireDefault(require("os"));
|
|
67
|
-
|
|
68
|
-
var _path = _interopRequireDefault(require("path"));
|
|
69
|
-
|
|
70
|
-
var _fs = _interopRequireDefault(require("./fs"));
|
|
71
|
-
|
|
72
|
-
var _semver = _interopRequireDefault(require("semver"));
|
|
73
|
-
|
|
74
|
-
var _shellQuote = require("shell-quote");
|
|
75
|
-
|
|
76
|
-
var _pluralize = _interopRequireDefault(require("pluralize"));
|
|
77
|
-
|
|
78
|
-
var _stream = _interopRequireDefault(require("stream"));
|
|
79
|
-
|
|
80
|
-
var _base64Stream = require("base64-stream");
|
|
81
|
-
|
|
82
|
-
var _uuid = require("uuid");
|
|
83
|
-
|
|
84
|
-
var _lockfile2 = _interopRequireDefault(require("lockfile"));
|
|
85
|
-
|
|
86
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
87
|
-
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getLockFileGuard = exports.shellParse = exports.uuidV5 = exports.uuidV4 = exports.uuidV3 = exports.uuidV1 = exports.toInMemoryBase64 = exports.KiB = exports.MiB = exports.GiB = exports.pluralize = exports.jsonStringify = exports.unleakString = exports.quote = exports.coerceVersion = exports.compareVersions = exports.isSameDestination = exports.W3C_WEB_ELEMENT_IDENTIFIER = exports.isSubPath = exports.toReadableSizeString = exports.filterObject = exports.unwrapElement = exports.wrapElement = exports.safeJsonParse = exports.multiResolve = exports.cancellableDelay = exports.localIp = exports.escapeSpecialChars = exports.escapeSpace = exports.hasValue = exports.hasContent = void 0;
|
|
7
|
+
const bluebird_1 = __importDefault(require("bluebird"));
|
|
8
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
9
|
+
const os_1 = __importDefault(require("os"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const fs_1 = __importDefault(require("./fs"));
|
|
12
|
+
const semver_1 = __importDefault(require("semver"));
|
|
13
|
+
const shell_quote_1 = require("shell-quote");
|
|
14
|
+
Object.defineProperty(exports, "shellParse", { enumerable: true, get: function () { return shell_quote_1.parse; } });
|
|
15
|
+
const pluralize_1 = __importDefault(require("pluralize"));
|
|
16
|
+
const stream_1 = __importDefault(require("stream"));
|
|
17
|
+
const base64_stream_1 = require("base64-stream");
|
|
18
|
+
const uuid_1 = require("uuid");
|
|
19
|
+
Object.defineProperty(exports, "uuidV1", { enumerable: true, get: function () { return uuid_1.v1; } });
|
|
20
|
+
Object.defineProperty(exports, "uuidV3", { enumerable: true, get: function () { return uuid_1.v3; } });
|
|
21
|
+
Object.defineProperty(exports, "uuidV4", { enumerable: true, get: function () { return uuid_1.v4; } });
|
|
22
|
+
Object.defineProperty(exports, "uuidV5", { enumerable: true, get: function () { return uuid_1.v5; } });
|
|
23
|
+
const lockfile_1 = __importDefault(require("lockfile"));
|
|
88
24
|
const W3C_WEB_ELEMENT_IDENTIFIER = 'element-6066-11e4-a52e-4f735466cecf';
|
|
89
25
|
exports.W3C_WEB_ELEMENT_IDENTIFIER = W3C_WEB_ELEMENT_IDENTIFIER;
|
|
90
26
|
const KiB = 1024;
|
|
@@ -93,325 +29,487 @@ const MiB = KiB * 1024;
|
|
|
93
29
|
exports.MiB = MiB;
|
|
94
30
|
const GiB = MiB * 1024;
|
|
95
31
|
exports.GiB = GiB;
|
|
96
|
-
|
|
32
|
+
/**
|
|
33
|
+
* @template {string} T
|
|
34
|
+
* @param {T} val
|
|
35
|
+
* @returns {val is NonEmptyString<T>}
|
|
36
|
+
*/
|
|
97
37
|
function hasContent(val) {
|
|
98
|
-
|
|
38
|
+
return lodash_1.default.isString(val) && val !== '';
|
|
99
39
|
}
|
|
100
|
-
|
|
40
|
+
exports.hasContent = hasContent;
|
|
41
|
+
/**
|
|
42
|
+
* return true if the the value is not `undefined`, `null`, or `NaN`.
|
|
43
|
+
*
|
|
44
|
+
* XXX: `NaN` is not expressible in TypeScript.
|
|
45
|
+
* @template T
|
|
46
|
+
* @param {T} val
|
|
47
|
+
* @returns {val is NonNullable<T>}
|
|
48
|
+
*/
|
|
101
49
|
function hasValue(val) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
50
|
+
// avoid incorrectly evaluating `0` as false
|
|
51
|
+
if (lodash_1.default.isNumber(val)) {
|
|
52
|
+
return !lodash_1.default.isNaN(val);
|
|
53
|
+
}
|
|
54
|
+
return !lodash_1.default.isUndefined(val) && !lodash_1.default.isNull(val);
|
|
107
55
|
}
|
|
108
|
-
|
|
56
|
+
exports.hasValue = hasValue;
|
|
57
|
+
// escape spaces in string, for commandline calls
|
|
109
58
|
function escapeSpace(str) {
|
|
110
|
-
|
|
59
|
+
return str.split(/ /).join('\\ ');
|
|
111
60
|
}
|
|
112
|
-
|
|
61
|
+
exports.escapeSpace = escapeSpace;
|
|
113
62
|
function escapeSpecialChars(str, quoteEscape) {
|
|
114
|
-
|
|
63
|
+
if (typeof str !== 'string') {
|
|
64
|
+
return str;
|
|
65
|
+
}
|
|
66
|
+
if (typeof quoteEscape === 'undefined') {
|
|
67
|
+
quoteEscape = false;
|
|
68
|
+
}
|
|
69
|
+
str = str
|
|
70
|
+
.replace(/[\\]/g, '\\\\')
|
|
71
|
+
.replace(/[\/]/g, '\\/') // eslint-disable-line no-useless-escape
|
|
72
|
+
.replace(/[\b]/g, '\\b')
|
|
73
|
+
.replace(/[\f]/g, '\\f')
|
|
74
|
+
.replace(/[\n]/g, '\\n')
|
|
75
|
+
.replace(/[\r]/g, '\\r')
|
|
76
|
+
.replace(/[\t]/g, '\\t')
|
|
77
|
+
.replace(/[\"]/g, '\\"') // eslint-disable-line no-useless-escape
|
|
78
|
+
.replace(/\\'/g, "\\'");
|
|
79
|
+
if (quoteEscape) {
|
|
80
|
+
let re = new RegExp(quoteEscape, 'g');
|
|
81
|
+
str = str.replace(re, `\\${quoteEscape}`);
|
|
82
|
+
}
|
|
115
83
|
return str;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
if (typeof quoteEscape === 'undefined') {
|
|
119
|
-
quoteEscape = false;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
str = str.replace(/[\\]/g, '\\\\').replace(/[\/]/g, '\\/').replace(/[\b]/g, '\\b').replace(/[\f]/g, '\\f').replace(/[\n]/g, '\\n').replace(/[\r]/g, '\\r').replace(/[\t]/g, '\\t').replace(/[\"]/g, '\\"').replace(/\\'/g, "\\'");
|
|
123
|
-
|
|
124
|
-
if (quoteEscape) {
|
|
125
|
-
let re = new RegExp(quoteEscape, 'g');
|
|
126
|
-
str = str.replace(re, `\\${quoteEscape}`);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return str;
|
|
130
84
|
}
|
|
131
|
-
|
|
85
|
+
exports.escapeSpecialChars = escapeSpecialChars;
|
|
132
86
|
function localIp() {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
87
|
+
let ip = lodash_1.default.chain(os_1.default.networkInterfaces())
|
|
88
|
+
.values()
|
|
89
|
+
.flatten()
|
|
90
|
+
// @ts-ignore
|
|
91
|
+
.filter(function (val) {
|
|
92
|
+
return val.family === 'IPv4' && val.internal === false;
|
|
93
|
+
})
|
|
94
|
+
.map('address')
|
|
95
|
+
.first()
|
|
96
|
+
.value();
|
|
97
|
+
return ip;
|
|
138
98
|
}
|
|
139
|
-
|
|
99
|
+
exports.localIp = localIp;
|
|
100
|
+
/*
|
|
101
|
+
* Creates a promise that is cancellable, and will timeout
|
|
102
|
+
* after `ms` delay
|
|
103
|
+
*/
|
|
140
104
|
function cancellableDelay(ms) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
105
|
+
let timer;
|
|
106
|
+
let resolve;
|
|
107
|
+
let reject;
|
|
108
|
+
const delay = new bluebird_1.default.Promise((_resolve, _reject) => {
|
|
109
|
+
resolve = _resolve;
|
|
110
|
+
reject = _reject;
|
|
111
|
+
timer = setTimeout(function () {
|
|
112
|
+
resolve();
|
|
113
|
+
}, ms);
|
|
114
|
+
});
|
|
115
|
+
// override Bluebird's `cancel`, which does not work when using `await` on
|
|
116
|
+
// a promise, since `resolve`/`reject` are never called
|
|
117
|
+
delay.cancel = function () {
|
|
118
|
+
clearTimeout(timer);
|
|
119
|
+
reject(new bluebird_1.default.CancellationError());
|
|
120
|
+
};
|
|
121
|
+
return delay;
|
|
158
122
|
}
|
|
159
|
-
|
|
123
|
+
exports.cancellableDelay = cancellableDelay;
|
|
160
124
|
function multiResolve(roots, ...args) {
|
|
161
|
-
|
|
125
|
+
return roots.map((root) => path_1.default.resolve(root, ...args));
|
|
162
126
|
}
|
|
163
|
-
|
|
127
|
+
exports.multiResolve = multiResolve;
|
|
128
|
+
/*
|
|
129
|
+
* Parses an object if possible. Otherwise returns the object without parsing.
|
|
130
|
+
*/
|
|
164
131
|
function safeJsonParse(obj) {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
132
|
+
try {
|
|
133
|
+
return JSON.parse(obj);
|
|
134
|
+
}
|
|
135
|
+
catch (ign) {
|
|
136
|
+
// ignore: this is not json parsable
|
|
137
|
+
return obj;
|
|
138
|
+
}
|
|
170
139
|
}
|
|
171
|
-
|
|
140
|
+
exports.safeJsonParse = safeJsonParse;
|
|
141
|
+
/*
|
|
142
|
+
* Stringifies the object passed in, converting Buffers into Strings for better
|
|
143
|
+
* display. This mimics JSON.stringify (see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)
|
|
144
|
+
* except the `replacer` argument can only be a function.
|
|
145
|
+
*
|
|
146
|
+
* @param {object} obj - the object to be serialized
|
|
147
|
+
* @param {?function} replacer - function to transform the properties added to the
|
|
148
|
+
* serialized object
|
|
149
|
+
* @param {?number|string} space - used to insert white space into the output JSON
|
|
150
|
+
* string for readability purposes. Defaults to 2
|
|
151
|
+
* returns {string} - the JSON object serialized as a string
|
|
152
|
+
*/
|
|
172
153
|
function jsonStringify(obj, replacer, space = 2) {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
154
|
+
// if no replacer is passed, or it is not a function, just use a pass-through
|
|
155
|
+
if (!lodash_1.default.isFunction(replacer)) {
|
|
156
|
+
replacer = (k, v) => v;
|
|
157
|
+
}
|
|
158
|
+
// Buffers cannot be serialized in a readable way
|
|
159
|
+
const bufferToJSON = Buffer.prototype.toJSON;
|
|
160
|
+
delete Buffer.prototype.toJSON;
|
|
161
|
+
try {
|
|
162
|
+
return JSON.stringify(obj, (key, value) => {
|
|
163
|
+
const updatedValue = Buffer.isBuffer(value) ? value.toString('utf8') : value;
|
|
164
|
+
return replacer(key, updatedValue);
|
|
165
|
+
}, space);
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
// restore the function, so as to not break further serialization
|
|
169
|
+
Buffer.prototype.toJSON = bufferToJSON;
|
|
170
|
+
}
|
|
188
171
|
}
|
|
189
|
-
|
|
172
|
+
exports.jsonStringify = jsonStringify;
|
|
173
|
+
/*
|
|
174
|
+
* Removes the wrapper from element, if it exists.
|
|
175
|
+
* { ELEMENT: 4 } becomes 4
|
|
176
|
+
* { element-6066-11e4-a52e-4f735466cecf: 5 } becomes 5
|
|
177
|
+
*/
|
|
190
178
|
function unwrapElement(el) {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
179
|
+
for (const propName of [W3C_WEB_ELEMENT_IDENTIFIER, 'ELEMENT']) {
|
|
180
|
+
if (lodash_1.default.has(el, propName)) {
|
|
181
|
+
return el[propName];
|
|
182
|
+
}
|
|
194
183
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
return el;
|
|
184
|
+
return el;
|
|
198
185
|
}
|
|
199
|
-
|
|
186
|
+
exports.unwrapElement = unwrapElement;
|
|
200
187
|
function wrapElement(elementId) {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
188
|
+
return {
|
|
189
|
+
ELEMENT: elementId,
|
|
190
|
+
[W3C_WEB_ELEMENT_IDENTIFIER]: elementId,
|
|
191
|
+
};
|
|
205
192
|
}
|
|
206
|
-
|
|
193
|
+
exports.wrapElement = wrapElement;
|
|
194
|
+
/*
|
|
195
|
+
* Returns object consisting of all properties in the original element
|
|
196
|
+
* which were truthy given the predicate.
|
|
197
|
+
* If the predicate is
|
|
198
|
+
* * missing - it will remove all properties whose values are `undefined`
|
|
199
|
+
* * a scalar - it will test all properties' values against that value
|
|
200
|
+
* * a function - it will pass each value and the original object into the function
|
|
201
|
+
*/
|
|
207
202
|
function filterObject(obj, predicate) {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
} else if (!_lodash.default.isFunction(predicate)) {
|
|
213
|
-
const valuePredicate = predicate;
|
|
214
|
-
|
|
215
|
-
predicate = v => v === valuePredicate;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
for (const key of Object.keys(obj)) {
|
|
219
|
-
if (!predicate(obj[key], obj)) {
|
|
220
|
-
delete newObj[key];
|
|
203
|
+
let newObj = lodash_1.default.clone(obj);
|
|
204
|
+
if (lodash_1.default.isUndefined(predicate)) {
|
|
205
|
+
// remove any element from the object whose value is undefined
|
|
206
|
+
predicate = (v) => !lodash_1.default.isUndefined(v);
|
|
221
207
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
208
|
+
else if (!lodash_1.default.isFunction(predicate)) {
|
|
209
|
+
// make predicate into a function
|
|
210
|
+
const valuePredicate = predicate;
|
|
211
|
+
predicate = (v) => v === valuePredicate;
|
|
212
|
+
}
|
|
213
|
+
for (const key of Object.keys(obj)) {
|
|
214
|
+
if (!predicate(obj[key], obj)) {
|
|
215
|
+
delete newObj[key];
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return newObj;
|
|
225
219
|
}
|
|
226
|
-
|
|
220
|
+
exports.filterObject = filterObject;
|
|
221
|
+
/**
|
|
222
|
+
* Converts number of bytes to a readable size string.
|
|
223
|
+
*
|
|
224
|
+
* @param {number|string} bytes - The actual number of bytes.
|
|
225
|
+
* @returns {string} The actual string representation, for example
|
|
226
|
+
* '1.00 KB' for '1024 B'
|
|
227
|
+
* @throws {Error} If bytes count cannot be converted to an integer or
|
|
228
|
+
* if it is less than zero.
|
|
229
|
+
*/
|
|
227
230
|
function toReadableSizeString(bytes) {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
return `${intBytes} B`;
|
|
231
|
+
const intBytes = parseInt(String(bytes), 10);
|
|
232
|
+
if (isNaN(intBytes) || intBytes < 0) {
|
|
233
|
+
throw new Error(`Cannot convert '${bytes}' to a readable size format`);
|
|
234
|
+
}
|
|
235
|
+
if (intBytes >= GiB) {
|
|
236
|
+
return `${(intBytes / (GiB * 1.0)).toFixed(2)} GB`;
|
|
237
|
+
}
|
|
238
|
+
else if (intBytes >= MiB) {
|
|
239
|
+
return `${(intBytes / (MiB * 1.0)).toFixed(2)} MB`;
|
|
240
|
+
}
|
|
241
|
+
else if (intBytes >= KiB) {
|
|
242
|
+
return `${(intBytes / (KiB * 1.0)).toFixed(2)} KB`;
|
|
243
|
+
}
|
|
244
|
+
return `${intBytes} B`;
|
|
243
245
|
}
|
|
244
|
-
|
|
246
|
+
exports.toReadableSizeString = toReadableSizeString;
|
|
247
|
+
/**
|
|
248
|
+
* Checks whether the given path is a subpath of the
|
|
249
|
+
* particular root folder. Both paths can include .. and . specifiers
|
|
250
|
+
*
|
|
251
|
+
* @param {string} originalPath The absolute file/folder path
|
|
252
|
+
* @param {string} root The absolute root folder path
|
|
253
|
+
* @param {?boolean} forcePosix Set it to true if paths must be interpreted in POSIX format
|
|
254
|
+
* @returns {boolean} true if the given original path is the subpath of the root folder
|
|
255
|
+
* @throws {Error} if any of the given paths is not absolute
|
|
256
|
+
*/
|
|
245
257
|
function isSubPath(originalPath, root, forcePosix = null) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
258
|
+
const pathObj = forcePosix ? path_1.default.posix : path_1.default;
|
|
259
|
+
for (const p of [originalPath, root]) {
|
|
260
|
+
if (!pathObj.isAbsolute(p)) {
|
|
261
|
+
throw new Error(`'${p}' is expected to be an absolute path`);
|
|
262
|
+
}
|
|
251
263
|
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
const normalizedPath = pathObj.normalize(originalPath);
|
|
256
|
-
return normalizedPath.startsWith(normalizedRoot);
|
|
264
|
+
const normalizedRoot = pathObj.normalize(root);
|
|
265
|
+
const normalizedPath = pathObj.normalize(originalPath);
|
|
266
|
+
return normalizedPath.startsWith(normalizedRoot);
|
|
257
267
|
}
|
|
258
|
-
|
|
268
|
+
exports.isSubPath = isSubPath;
|
|
269
|
+
/**
|
|
270
|
+
* Checks whether the given paths are pointing to the same file system
|
|
271
|
+
* destination.
|
|
272
|
+
*
|
|
273
|
+
* @param {string} path1 - Absolute or relative path to a file/folder
|
|
274
|
+
* @param {string} path2 - Absolute or relative path to a file/folder
|
|
275
|
+
* @param {...string} pathN - Zero or more absolute or relative paths to files/folders
|
|
276
|
+
* @returns {Promise<boolean>} true if all paths are pointing to the same file system item
|
|
277
|
+
*/
|
|
259
278
|
async function isSameDestination(path1, path2, ...pathN) {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
let mapCb = async x => (await _fs.default.stat(x, {
|
|
273
|
-
bigint: true
|
|
274
|
-
})).ino;
|
|
275
|
-
|
|
276
|
-
return areAllItemsEqual(await _bluebird.default.map(allPaths, mapCb));
|
|
279
|
+
const allPaths = [path1, path2, ...pathN];
|
|
280
|
+
if (!(await bluebird_1.default.reduce(allPaths, async (a, b) => a && (await fs_1.default.exists(b)), true))) {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
const areAllItemsEqual = (arr) => !!arr.reduce((a, b) => (a === b ? a : NaN));
|
|
284
|
+
if (areAllItemsEqual(allPaths)) {
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
let mapCb = async (x) => (await fs_1.default.stat(x, {
|
|
288
|
+
bigint: true,
|
|
289
|
+
})).ino;
|
|
290
|
+
return areAllItemsEqual(await bluebird_1.default.map(allPaths, mapCb));
|
|
277
291
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
292
|
+
exports.isSameDestination = isSameDestination;
|
|
293
|
+
/**
|
|
294
|
+
* Coerces the given number/string to a valid version string
|
|
295
|
+
*
|
|
296
|
+
* @template {boolean} [Strict=true]
|
|
297
|
+
* @param {string} ver - Version string to coerce
|
|
298
|
+
* @param {Strict} [strict] - If `true` then an exception will be thrown
|
|
299
|
+
* if `ver` cannot be coerced
|
|
300
|
+
* @returns {Strict extends true ? string : string|null} Coerced version number or null if the string cannot be
|
|
301
|
+
* coerced and strict mode is disabled
|
|
302
|
+
* @throws {Error} if strict mode is enabled and `ver` cannot be coerced
|
|
303
|
+
*/
|
|
304
|
+
function coerceVersion(ver, strict = /** @type {Strict} */ (true)) {
|
|
305
|
+
const result = semver_1.default.valid(semver_1.default.coerce(`${ver}`));
|
|
306
|
+
if (strict && !result) {
|
|
307
|
+
throw new Error(`'${ver}' cannot be coerced to a valid version number`);
|
|
308
|
+
}
|
|
309
|
+
return /** @type {Strict extends true ? string : string?} */ (result);
|
|
287
310
|
}
|
|
288
|
-
|
|
311
|
+
exports.coerceVersion = coerceVersion;
|
|
289
312
|
const SUPPORTED_OPERATORS = ['==', '!=', '>', '<', '>=', '<=', '='];
|
|
290
|
-
|
|
313
|
+
/**
|
|
314
|
+
* Compares two version strings
|
|
315
|
+
*
|
|
316
|
+
* @param {string} ver1 - The first version number to compare. Should be a valid
|
|
317
|
+
* version number supported by semver parser.
|
|
318
|
+
* @param {string} ver2 - The second version number to compare. Should be a valid
|
|
319
|
+
* version number supported by semver parser.
|
|
320
|
+
* @param {string} operator - One of supported version number operators:
|
|
321
|
+
* ==, !=, >, <, <=, >=, =
|
|
322
|
+
* @returns {boolean} true or false depending on the actual comparison result
|
|
323
|
+
* @throws {Error} if an unsupported operator is supplied or any of the supplied
|
|
324
|
+
* version strings cannot be coerced
|
|
325
|
+
*/
|
|
291
326
|
function compareVersions(ver1, operator, ver2) {
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
return operator === '!=' ? !result : result;
|
|
327
|
+
if (!SUPPORTED_OPERATORS.includes(operator)) {
|
|
328
|
+
throw new Error(`The '${operator}' comparison operator is not supported. ` +
|
|
329
|
+
`Only '${JSON.stringify(SUPPORTED_OPERATORS)}' operators are supported`);
|
|
330
|
+
}
|
|
331
|
+
const semverOperator = ['==', '!='].includes(operator) ? '=' : operator;
|
|
332
|
+
const result = semver_1.default.satisfies(coerceVersion(ver1), `${semverOperator}${coerceVersion(ver2)}`);
|
|
333
|
+
return operator === '!=' ? !result : result;
|
|
301
334
|
}
|
|
302
|
-
|
|
335
|
+
exports.compareVersions = compareVersions;
|
|
336
|
+
/**
|
|
337
|
+
* Add appropriate quotes to command arguments. See https://github.com/substack/node-shell-quote
|
|
338
|
+
* for more details
|
|
339
|
+
*
|
|
340
|
+
* @param {string|string[]} args - The arguments that will be parsed
|
|
341
|
+
* @returns {string} - The arguments, quoted
|
|
342
|
+
*/
|
|
303
343
|
function quote(args) {
|
|
304
|
-
|
|
344
|
+
return (0, shell_quote_1.quote)(lodash_1.default.castArray(args));
|
|
305
345
|
}
|
|
306
|
-
|
|
346
|
+
exports.quote = quote;
|
|
347
|
+
/**
|
|
348
|
+
* This function is necessary to workaround unexpected memory leaks
|
|
349
|
+
* caused by NodeJS string interning
|
|
350
|
+
* behavior described in https://bugs.chromium.org/p/v8/issues/detail?id=2869
|
|
351
|
+
*
|
|
352
|
+
* @param {*} s - The string to unleak
|
|
353
|
+
* @return {string} Either the unleaked string or the original object converted to string
|
|
354
|
+
*/
|
|
307
355
|
function unleakString(s) {
|
|
308
|
-
|
|
356
|
+
return ` ${s}`.substr(1);
|
|
309
357
|
}
|
|
310
|
-
|
|
358
|
+
exports.unleakString = unleakString;
|
|
359
|
+
/**
|
|
360
|
+
* @typedef PluralizeOptions
|
|
361
|
+
* @property {boolean} [inclusive=false] - Whether to prefix with the number (e.g., 3 ducks)
|
|
362
|
+
*/
|
|
363
|
+
/**
|
|
364
|
+
* Get the form of a word appropriate to the count
|
|
365
|
+
*
|
|
366
|
+
* @param {string} word - The word to pluralize
|
|
367
|
+
* @param {number} count - How many of the word exist
|
|
368
|
+
* @param {PluralizeOptions|boolean} options - options for word pluralization,
|
|
369
|
+
* or a boolean indicating the options.inclusive property
|
|
370
|
+
* @returns {string} The word pluralized according to the number
|
|
371
|
+
*/
|
|
311
372
|
function pluralize(word, count, options = {}) {
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
373
|
+
let inclusive = false;
|
|
374
|
+
if (lodash_1.default.isBoolean(options)) {
|
|
375
|
+
// if passed in as a boolean
|
|
376
|
+
inclusive = options;
|
|
377
|
+
}
|
|
378
|
+
else if (lodash_1.default.isBoolean(options?.inclusive)) {
|
|
379
|
+
// if passed in as an options hash
|
|
380
|
+
inclusive = options.inclusive;
|
|
381
|
+
}
|
|
382
|
+
return (0, pluralize_1.default)(word, count, inclusive);
|
|
321
383
|
}
|
|
322
|
-
|
|
384
|
+
exports.pluralize = pluralize;
|
|
385
|
+
/**
|
|
386
|
+
* @typedef EncodingOptions
|
|
387
|
+
* @property {number} [maxSize=1073741824] The maximum size of
|
|
388
|
+
* the resulting buffer in bytes. This is set to 1GB by default, because
|
|
389
|
+
* Appium limits the maximum HTTP body size to 1GB. Also, the NodeJS heap
|
|
390
|
+
* size must be enough to keep the resulting object (usually this size is
|
|
391
|
+
* limited to 1.4 GB)
|
|
392
|
+
*/
|
|
393
|
+
/**
|
|
394
|
+
* Converts contents of a local file to an in-memory base-64 encoded buffer.
|
|
395
|
+
* The operation is memory-usage friendly and should be used while encoding
|
|
396
|
+
* large files to base64
|
|
397
|
+
*
|
|
398
|
+
* @param {string} srcPath The full path to the file being encoded
|
|
399
|
+
* @param {EncodingOptions} opts
|
|
400
|
+
* @returns {Promise<Buffer>} base64-encoded content of the source file as memory buffer
|
|
401
|
+
* @throws {Error} if there was an error while reading the source file
|
|
402
|
+
* or the source file is too
|
|
403
|
+
*/
|
|
323
404
|
async function toInMemoryBase64(srcPath, opts = {}) {
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
const {
|
|
329
|
-
maxSize = 1 * GiB
|
|
330
|
-
} = opts;
|
|
331
|
-
const resultBuffers = [];
|
|
332
|
-
let resultBuffersSize = 0;
|
|
333
|
-
const resultWriteStream = new _stream.default.Writable({
|
|
334
|
-
write: (buffer, encoding, next) => {
|
|
335
|
-
resultBuffers.push(buffer);
|
|
336
|
-
resultBuffersSize += buffer.length;
|
|
337
|
-
|
|
338
|
-
if (maxSize > 0 && resultBuffersSize > maxSize) {
|
|
339
|
-
resultWriteStream.emit('error', new Error(`The size of the resulting ` + `buffer must not be greater than ${toReadableSizeString(maxSize)}`));
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
next();
|
|
405
|
+
if (!(await fs_1.default.exists(srcPath)) || (await fs_1.default.stat(srcPath)).isDirectory()) {
|
|
406
|
+
throw new Error(`No such file: ${srcPath}`);
|
|
343
407
|
}
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
408
|
+
const { maxSize = 1 * GiB } = opts;
|
|
409
|
+
const resultBuffers = [];
|
|
410
|
+
let resultBuffersSize = 0;
|
|
411
|
+
const resultWriteStream = new stream_1.default.Writable({
|
|
412
|
+
write: (buffer, encoding, next) => {
|
|
413
|
+
resultBuffers.push(buffer);
|
|
414
|
+
resultBuffersSize += buffer.length;
|
|
415
|
+
if (maxSize > 0 && resultBuffersSize > maxSize) {
|
|
416
|
+
resultWriteStream.emit('error', new Error(`The size of the resulting ` +
|
|
417
|
+
`buffer must not be greater than ${toReadableSizeString(maxSize)}`));
|
|
418
|
+
}
|
|
419
|
+
next();
|
|
420
|
+
},
|
|
421
|
+
});
|
|
422
|
+
const readerStream = fs_1.default.createReadStream(srcPath);
|
|
423
|
+
const base64EncoderStream = new base64_stream_1.Base64Encode();
|
|
424
|
+
const resultWriteStreamPromise = new bluebird_1.default((resolve, reject) => {
|
|
425
|
+
resultWriteStream.once('error', (e) => {
|
|
426
|
+
readerStream.unpipe(base64EncoderStream);
|
|
427
|
+
base64EncoderStream.unpipe(resultWriteStream);
|
|
428
|
+
readerStream.destroy();
|
|
429
|
+
reject(e);
|
|
430
|
+
});
|
|
431
|
+
resultWriteStream.once('finish', resolve);
|
|
432
|
+
});
|
|
433
|
+
const readStreamPromise = new bluebird_1.default((resolve, reject) => {
|
|
434
|
+
readerStream.once('close', resolve);
|
|
435
|
+
readerStream.once('error', (e) => reject(new Error(`Failed to read '${srcPath}': ${e.message}`)));
|
|
355
436
|
});
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
readerStream.once('error', e => reject(new Error(`Failed to read '${srcPath}': ${e.message}`)));
|
|
361
|
-
});
|
|
362
|
-
readerStream.pipe(base64EncoderStream);
|
|
363
|
-
base64EncoderStream.pipe(resultWriteStream);
|
|
364
|
-
await _bluebird.default.all([readStreamPromise, resultWriteStreamPromise]);
|
|
365
|
-
return Buffer.concat(resultBuffers);
|
|
437
|
+
readerStream.pipe(base64EncoderStream);
|
|
438
|
+
base64EncoderStream.pipe(resultWriteStream);
|
|
439
|
+
await bluebird_1.default.all([readStreamPromise, resultWriteStreamPromise]);
|
|
440
|
+
return Buffer.concat(resultBuffers);
|
|
366
441
|
}
|
|
367
|
-
|
|
442
|
+
exports.toInMemoryBase64 = toInMemoryBase64;
|
|
443
|
+
/**
|
|
444
|
+
* @typedef LockFileOptions
|
|
445
|
+
* @property {number} [timeout=120] The max time in seconds to wait for the lock
|
|
446
|
+
* @property {boolean} [tryRecovery=false] Whether to try lock recovery if
|
|
447
|
+
* the first attempt to acquire it timed out.
|
|
448
|
+
*/
|
|
449
|
+
/**
|
|
450
|
+
* Create an async function which, when called, will not proceed until a certain file is no
|
|
451
|
+
* longer present on the system. This allows for preventing concurrent behavior across processes
|
|
452
|
+
* using a known lockfile path.
|
|
453
|
+
*
|
|
454
|
+
* @template T
|
|
455
|
+
* @param {string} lockFile The full path to the file used for the lock
|
|
456
|
+
* @param {LockFileOptions} opts
|
|
457
|
+
* @returns async function that takes another async function defining the locked
|
|
458
|
+
* behavior
|
|
459
|
+
*/
|
|
368
460
|
function getLockFileGuard(lockFile, opts = {}) {
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
461
|
+
const { timeout = 120, tryRecovery = false } = opts;
|
|
462
|
+
const lock = /** @type {(lockfile: string, opts: import('lockfile').Options)=>B<void>} */ (bluebird_1.default.promisify(lockfile_1.default.lock));
|
|
463
|
+
const check = bluebird_1.default.promisify(lockfile_1.default.check);
|
|
464
|
+
const unlock = bluebird_1.default.promisify(lockfile_1.default.unlock);
|
|
465
|
+
/**
|
|
466
|
+
* @param {(...args: any[]) => T} behavior
|
|
467
|
+
* @returns {Promise<T>}
|
|
468
|
+
*/
|
|
469
|
+
const guard = async (behavior) => {
|
|
470
|
+
let triedRecovery = false;
|
|
471
|
+
do {
|
|
472
|
+
try {
|
|
473
|
+
// if the lockfile doesn't exist, lock it synchronously to make sure no other call
|
|
474
|
+
// on the same spin of the event loop can also initiate a lock. If the lockfile does exist
|
|
475
|
+
// then just use the regular async 'lock' method which will wait on the lock.
|
|
476
|
+
if (lockfile_1.default.checkSync(lockFile)) {
|
|
477
|
+
await lock(lockFile, { wait: timeout * 1000 });
|
|
478
|
+
}
|
|
479
|
+
else {
|
|
480
|
+
lockfile_1.default.lockSync(lockFile);
|
|
481
|
+
}
|
|
482
|
+
break;
|
|
483
|
+
}
|
|
484
|
+
catch (e) {
|
|
485
|
+
if (lodash_1.default.includes(e.message, 'EEXIST') && tryRecovery && !triedRecovery) {
|
|
486
|
+
// There could be cases where a process has been forcefully terminated
|
|
487
|
+
// without a chance to clean up pending locks: https://github.com/npm/lockfile/issues/26
|
|
488
|
+
lockfile_1.default.unlockSync(lockFile);
|
|
489
|
+
triedRecovery = true;
|
|
490
|
+
continue;
|
|
491
|
+
}
|
|
492
|
+
throw new Error(`Could not acquire lock on '${lockFile}' after ${timeout}s. ` +
|
|
493
|
+
`Original error: ${e.message}`);
|
|
494
|
+
}
|
|
495
|
+
// eslint-disable-next-line no-constant-condition
|
|
496
|
+
} while (true);
|
|
497
|
+
try {
|
|
498
|
+
return await behavior();
|
|
391
499
|
}
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
if (_lodash.default.includes(e.message, 'EEXIST') && tryRecovery && !triedRecovery) {
|
|
396
|
-
_lockfile2.default.unlockSync(lockFile);
|
|
397
|
-
|
|
398
|
-
triedRecovery = true;
|
|
399
|
-
continue;
|
|
500
|
+
finally {
|
|
501
|
+
// whether the behavior succeeded or not, get rid of the lock
|
|
502
|
+
await unlock(lockFile);
|
|
400
503
|
}
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
} while (true);
|
|
405
|
-
|
|
406
|
-
try {
|
|
407
|
-
return await behavior();
|
|
408
|
-
} finally {
|
|
409
|
-
await unlock(lockFile);
|
|
410
|
-
}
|
|
411
|
-
};
|
|
412
|
-
|
|
413
|
-
guard.check = async () => await check(lockFile);
|
|
414
|
-
|
|
415
|
-
return guard;
|
|
504
|
+
};
|
|
505
|
+
guard.check = async () => await check(lockFile);
|
|
506
|
+
return guard;
|
|
416
507
|
}
|
|
417
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiIsIktpQiIsIk1pQiIsIkdpQiIsImhhc0NvbnRlbnQiLCJ2YWwiLCJfIiwiaXNTdHJpbmciLCJoYXNWYWx1ZSIsImlzTnVtYmVyIiwiaXNOYU4iLCJpc1VuZGVmaW5lZCIsImlzTnVsbCIsImVzY2FwZVNwYWNlIiwic3RyIiwic3BsaXQiLCJqb2luIiwiZXNjYXBlU3BlY2lhbENoYXJzIiwicXVvdGVFc2NhcGUiLCJyZXBsYWNlIiwicmUiLCJSZWdFeHAiLCJsb2NhbElwIiwiaXAiLCJjaGFpbiIsIm9zIiwibmV0d29ya0ludGVyZmFjZXMiLCJ2YWx1ZXMiLCJmbGF0dGVuIiwiZmlsdGVyIiwiZmFtaWx5IiwiaW50ZXJuYWwiLCJtYXAiLCJmaXJzdCIsInZhbHVlIiwiY2FuY2VsbGFibGVEZWxheSIsIm1zIiwidGltZXIiLCJyZXNvbHZlIiwicmVqZWN0IiwiZGVsYXkiLCJCIiwiUHJvbWlzZSIsIl9yZXNvbHZlIiwiX3JlamVjdCIsInNldFRpbWVvdXQiLCJjYW5jZWwiLCJjbGVhclRpbWVvdXQiLCJDYW5jZWxsYXRpb25FcnJvciIsIm11bHRpUmVzb2x2ZSIsInJvb3RzIiwiYXJncyIsInJvb3QiLCJwYXRoIiwic2FmZUpzb25QYXJzZSIsIm9iaiIsIkpTT04iLCJwYXJzZSIsImlnbiIsImpzb25TdHJpbmdpZnkiLCJyZXBsYWNlciIsInNwYWNlIiwiaXNGdW5jdGlvbiIsImsiLCJ2IiwiYnVmZmVyVG9KU09OIiwiQnVmZmVyIiwicHJvdG90eXBlIiwidG9KU09OIiwic3RyaW5naWZ5Iiwia2V5IiwidXBkYXRlZFZhbHVlIiwiaXNCdWZmZXIiLCJ0b1N0cmluZyIsInVud3JhcEVsZW1lbnQiLCJlbCIsInByb3BOYW1lIiwiaGFzIiwid3JhcEVsZW1lbnQiLCJlbGVtZW50SWQiLCJFTEVNRU5UIiwiZmlsdGVyT2JqZWN0IiwicHJlZGljYXRlIiwibmV3T2JqIiwiY2xvbmUiLCJ2YWx1ZVByZWRpY2F0ZSIsIk9iamVjdCIsImtleXMiLCJ0b1JlYWRhYmxlU2l6ZVN0cmluZyIsImJ5dGVzIiwiaW50Qnl0ZXMiLCJwYXJzZUludCIsIlN0cmluZyIsIkVycm9yIiwidG9GaXhlZCIsImlzU3ViUGF0aCIsIm9yaWdpbmFsUGF0aCIsImZvcmNlUG9zaXgiLCJwYXRoT2JqIiwicG9zaXgiLCJwIiwiaXNBYnNvbHV0ZSIsIm5vcm1hbGl6ZWRSb290Iiwibm9ybWFsaXplIiwibm9ybWFsaXplZFBhdGgiLCJzdGFydHNXaXRoIiwiaXNTYW1lRGVzdGluYXRpb24iLCJwYXRoMSIsInBhdGgyIiwicGF0aE4iLCJhbGxQYXRocyIsInJlZHVjZSIsImEiLCJiIiwiZnMiLCJleGlzdHMiLCJhcmVBbGxJdGVtc0VxdWFsIiwiYXJyIiwiTmFOIiwibWFwQ2IiLCJ4Iiwic3RhdCIsImJpZ2ludCIsImlubyIsImNvZXJjZVZlcnNpb24iLCJ2ZXIiLCJzdHJpY3QiLCJyZXN1bHQiLCJzZW12ZXIiLCJ2YWxpZCIsImNvZXJjZSIsIlNVUFBPUlRFRF9PUEVSQVRPUlMiLCJjb21wYXJlVmVyc2lvbnMiLCJ2ZXIxIiwib3BlcmF0b3IiLCJ2ZXIyIiwiaW5jbHVkZXMiLCJzZW12ZXJPcGVyYXRvciIsInNhdGlzZmllcyIsInF1b3RlIiwic2hlbGxRdW90ZSIsImNhc3RBcnJheSIsInVubGVha1N0cmluZyIsInMiLCJzdWJzdHIiLCJwbHVyYWxpemUiLCJ3b3JkIiwiY291bnQiLCJvcHRpb25zIiwiaW5jbHVzaXZlIiwiaXNCb29sZWFuIiwicGx1cmFsaXplTGliIiwidG9Jbk1lbW9yeUJhc2U2NCIsInNyY1BhdGgiLCJvcHRzIiwiaXNEaXJlY3RvcnkiLCJtYXhTaXplIiwicmVzdWx0QnVmZmVycyIsInJlc3VsdEJ1ZmZlcnNTaXplIiwicmVzdWx0V3JpdGVTdHJlYW0iLCJzdHJlYW0iLCJXcml0YWJsZSIsIndyaXRlIiwiYnVmZmVyIiwiZW5jb2RpbmciLCJuZXh0IiwicHVzaCIsImxlbmd0aCIsImVtaXQiLCJyZWFkZXJTdHJlYW0iLCJjcmVhdGVSZWFkU3RyZWFtIiwiYmFzZTY0RW5jb2RlclN0cmVhbSIsIkJhc2U2NEVuY29kZSIsInJlc3VsdFdyaXRlU3RyZWFtUHJvbWlzZSIsIm9uY2UiLCJlIiwidW5waXBlIiwiZGVzdHJveSIsInJlYWRTdHJlYW1Qcm9taXNlIiwibWVzc2FnZSIsInBpcGUiLCJhbGwiLCJjb25jYXQiLCJnZXRMb2NrRmlsZUd1YXJkIiwibG9ja0ZpbGUiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJsb2NrIiwicHJvbWlzaWZ5IiwiX2xvY2tmaWxlIiwiY2hlY2siLCJ1bmxvY2siLCJndWFyZCIsImJlaGF2aW9yIiwidHJpZWRSZWNvdmVyeSIsImNoZWNrU3luYyIsIndhaXQiLCJsb2NrU3luYyIsInVubG9ja1N5bmMiXSwic291cmNlcyI6WyIuLi8uLi9saWIvdXRpbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJy4vZnMnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHtcbiAgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvc2hlbGwtcXVvdGVcbiAgcXVvdGUgYXMgc2hlbGxRdW90ZSxcbiAgcGFyc2UgYXMgc2hlbGxQYXJzZSxcbn0gZnJvbSAnc2hlbGwtcXVvdGUnO1xuaW1wb3J0IHBsdXJhbGl6ZUxpYiBmcm9tICdwbHVyYWxpemUnO1xuaW1wb3J0IHN0cmVhbSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHtCYXNlNjRFbmNvZGV9IGZyb20gJ2Jhc2U2NC1zdHJlYW0nO1xuaW1wb3J0IHtcbiAgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvdXVpZFxuICB2MSBhcyB1dWlkVjEsXG4gIHYzIGFzIHV1aWRWMyxcbiAgdjQgYXMgdXVpZFY0LFxuICB2NSBhcyB1dWlkVjUsXG59IGZyb20gJ3V1aWQnO1xuaW1wb3J0IF9sb2NrZmlsZSBmcm9tICdsb2NrZmlsZSc7XG5cbmNvbnN0IFczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSID0gJ2VsZW1lbnQtNjA2Ni0xMWU0LWE1MmUtNGY3MzU0NjZjZWNmJztcbmNvbnN0IEtpQiA9IDEwMjQ7XG5jb25zdCBNaUIgPSBLaUIgKiAxMDI0O1xuY29uc3QgR2lCID0gTWlCICogMTAyNDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gVFxuICogQHBhcmFtIHtUfSB2YWxcbiAqIEByZXR1cm5zIHt2YWwgaXMgTm9uRW1wdHlTdHJpbmc8VD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDb250ZW50KHZhbCkge1xuICByZXR1cm4gXy5pc1N0cmluZyh2YWwpICYmIHZhbCAhPT0gJyc7XG59XG5cbi8qKlxuICogcmV0dXJuIHRydWUgaWYgdGhlIHRoZSB2YWx1ZSBpcyBub3QgYHVuZGVmaW5lZGAsIGBudWxsYCwgb3IgYE5hTmAuXG4gKlxuICogWFhYOiBgTmFOYCBpcyBub3QgZXhwcmVzc2libGUgaW4gVHlwZVNjcmlwdC5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbFxuICogQHJldHVybnMge3ZhbCBpcyBOb25OdWxsYWJsZTxUPn1cbiAqL1xuZnVuY3Rpb24gaGFzVmFsdWUodmFsKSB7XG4gIC8vIGF2b2lkIGluY29ycmVjdGx5IGV2YWx1YXRpbmcgYDBgIGFzIGZhbHNlXG4gIGlmIChfLmlzTnVtYmVyKHZhbCkpIHtcbiAgICByZXR1cm4gIV8uaXNOYU4odmFsKTtcbiAgfVxuICByZXR1cm4gIV8uaXNVbmRlZmluZWQodmFsKSAmJiAhXy5pc051bGwodmFsKTtcbn1cblxuLy8gZXNjYXBlIHNwYWNlcyBpbiBzdHJpbmcsIGZvciBjb21tYW5kbGluZSBjYWxsc1xuZnVuY3Rpb24gZXNjYXBlU3BhY2Uoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoLyAvKS5qb2luKCdcXFxcICcpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVTcGVjaWFsQ2hhcnMoc3RyLCBxdW90ZUVzY2FwZSkge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIGlmICh0eXBlb2YgcXVvdGVFc2NhcGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcXVvdGVFc2NhcGUgPSBmYWxzZTtcbiAgfVxuICBzdHIgPSBzdHJcbiAgICAucmVwbGFjZSgvW1xcXFxdL2csICdcXFxcXFxcXCcpXG4gICAgLnJlcGxhY2UoL1tcXC9dL2csICdcXFxcLycpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgICAucmVwbGFjZSgvW1xcYl0vZywgJ1xcXFxiJylcbiAgICAucmVwbGFjZSgvW1xcZl0vZywgJ1xcXFxmJylcbiAgICAucmVwbGFjZSgvW1xcbl0vZywgJ1xcXFxuJylcbiAgICAucmVwbGFjZSgvW1xccl0vZywgJ1xcXFxyJylcbiAgICAucmVwbGFjZSgvW1xcdF0vZywgJ1xcXFx0JylcbiAgICAucmVwbGFjZSgvW1xcXCJdL2csICdcXFxcXCInKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgLnJlcGxhY2UoL1xcXFwnL2csIFwiXFxcXCdcIik7XG4gIGlmIChxdW90ZUVzY2FwZSkge1xuICAgIGxldCByZSA9IG5ldyBSZWdFeHAocXVvdGVFc2NhcGUsICdnJyk7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UocmUsIGBcXFxcJHtxdW90ZUVzY2FwZX1gKTtcbiAgfVxuICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBsb2NhbElwKCkge1xuICBsZXQgaXAgPSBfLmNoYWluKG9zLm5ldHdvcmtJbnRlcmZhY2VzKCkpXG4gICAgLnZhbHVlcygpXG4gICAgLmZsYXR0ZW4oKVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICAuZmlsdGVyKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiB2YWwuZmFtaWx5ID09PSAnSVB2NCcgJiYgdmFsLmludGVybmFsID09PSBmYWxzZTtcbiAgICB9KVxuICAgIC5tYXAoJ2FkZHJlc3MnKVxuICAgIC5maXJzdCgpXG4gICAgLnZhbHVlKCk7XG4gIHJldHVybiBpcDtcbn1cblxuLypcbiAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgaXMgY2FuY2VsbGFibGUsIGFuZCB3aWxsIHRpbWVvdXRcbiAqIGFmdGVyIGBtc2AgZGVsYXlcbiAqL1xuZnVuY3Rpb24gY2FuY2VsbGFibGVEZWxheShtcykge1xuICBsZXQgdGltZXI7XG4gIGxldCByZXNvbHZlO1xuICBsZXQgcmVqZWN0O1xuXG4gIGNvbnN0IGRlbGF5ID0gbmV3IEIuUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0sIG1zKTtcbiAgfSk7XG5cbiAgLy8gb3ZlcnJpZGUgQmx1ZWJpcmQncyBgY2FuY2VsYCwgd2hpY2ggZG9lcyBub3Qgd29yayB3aGVuIHVzaW5nIGBhd2FpdGAgb25cbiAgLy8gYSBwcm9taXNlLCBzaW5jZSBgcmVzb2x2ZWAvYHJlamVjdGAgYXJlIG5ldmVyIGNhbGxlZFxuICBkZWxheS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICByZWplY3QobmV3IEIuQ2FuY2VsbGF0aW9uRXJyb3IoKSk7XG4gIH07XG4gIHJldHVybiBkZWxheTtcbn1cblxuZnVuY3Rpb24gbXVsdGlSZXNvbHZlKHJvb3RzLCAuLi5hcmdzKSB7XG4gIHJldHVybiByb290cy5tYXAoKHJvb3QpID0+IHBhdGgucmVzb2x2ZShyb290LCAuLi5hcmdzKSk7XG59XG5cbi8qXG4gKiBQYXJzZXMgYW4gb2JqZWN0IGlmIHBvc3NpYmxlLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgb2JqZWN0IHdpdGhvdXQgcGFyc2luZy5cbiAqL1xuZnVuY3Rpb24gc2FmZUpzb25QYXJzZShvYmopIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShvYmopO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICAvLyBpZ25vcmU6IHRoaXMgaXMgbm90IGpzb24gcGFyc2FibGVcbiAgICByZXR1cm4gb2JqO1xuICB9XG59XG5cbi8qXG4gKiBTdHJpbmdpZmllcyB0aGUgb2JqZWN0IHBhc3NlZCBpbiwgY29udmVydGluZyBCdWZmZXJzIGludG8gU3RyaW5ncyBmb3IgYmV0dGVyXG4gKiBkaXNwbGF5LiBUaGlzIG1pbWljcyBKU09OLnN0cmluZ2lmeSAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5KVxuICogZXhjZXB0IHRoZSBgcmVwbGFjZXJgIGFyZ3VtZW50IGNhbiBvbmx5IGJlIGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtIHs/ZnVuY3Rpb259IHJlcGxhY2VyIC0gZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBwcm9wZXJ0aWVzIGFkZGVkIHRvIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCBvYmplY3RcbiAqIEBwYXJhbSB7P251bWJlcnxzdHJpbmd9IHNwYWNlIC0gdXNlZCB0byBpbnNlcnQgd2hpdGUgc3BhY2UgaW50byB0aGUgb3V0cHV0IEpTT05cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvciByZWFkYWJpbGl0eSBwdXJwb3Nlcy4gRGVmYXVsdHMgdG8gMlxuICogcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBKU09OIG9iamVjdCBzZXJpYWxpemVkIGFzIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGpzb25TdHJpbmdpZnkob2JqLCByZXBsYWNlciwgc3BhY2UgPSAyKSB7XG4gIC8vIGlmIG5vIHJlcGxhY2VyIGlzIHBhc3NlZCwgb3IgaXQgaXMgbm90IGEgZnVuY3Rpb24sIGp1c3QgdXNlIGEgcGFzcy10aHJvdWdoXG4gIGlmICghXy5pc0Z1bmN0aW9uKHJlcGxhY2VyKSkge1xuICAgIHJlcGxhY2VyID0gKGssIHYpID0+IHY7XG4gIH1cblxuICAvLyBCdWZmZXJzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGluIGEgcmVhZGFibGUgd2F5XG4gIGNvbnN0IGJ1ZmZlclRvSlNPTiA9IEJ1ZmZlci5wcm90b3R5cGUudG9KU09OO1xuICBkZWxldGUgQnVmZmVyLnByb3RvdHlwZS50b0pTT047XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFxuICAgICAgb2JqLFxuICAgICAgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZFZhbHVlID0gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSA/IHZhbHVlLnRvU3RyaW5nKCd1dGY4JykgOiB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2VyKGtleSwgdXBkYXRlZFZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBzcGFjZVxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gcmVzdG9yZSB0aGUgZnVuY3Rpb24sIHNvIGFzIHRvIG5vdCBicmVhayBmdXJ0aGVyIHNlcmlhbGl6YXRpb25cbiAgICBCdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGJ1ZmZlclRvSlNPTjtcbiAgfVxufVxuXG4vKlxuICogUmVtb3ZlcyB0aGUgd3JhcHBlciBmcm9tIGVsZW1lbnQsIGlmIGl0IGV4aXN0cy5cbiAqICAgeyBFTEVNRU5UOiA0IH0gYmVjb21lcyA0XG4gKiAgIHsgZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2Y6IDUgfSBiZWNvbWVzIDVcbiAqL1xuZnVuY3Rpb24gdW53cmFwRWxlbWVudChlbCkge1xuICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiwgJ0VMRU1FTlQnXSkge1xuICAgIGlmIChfLmhhcyhlbCwgcHJvcE5hbWUpKSB7XG4gICAgICByZXR1cm4gZWxbcHJvcE5hbWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZWw7XG59XG5cbmZ1bmN0aW9uIHdyYXBFbGVtZW50KGVsZW1lbnRJZCkge1xuICByZXR1cm4ge1xuICAgIEVMRU1FTlQ6IGVsZW1lbnRJZCxcbiAgICBbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJdOiBlbGVtZW50SWQsXG4gIH07XG59XG5cbi8qXG4gKiBSZXR1cm5zIG9iamVjdCBjb25zaXN0aW5nIG9mIGFsbCBwcm9wZXJ0aWVzIGluIHRoZSBvcmlnaW5hbCBlbGVtZW50XG4gKiB3aGljaCB3ZXJlIHRydXRoeSBnaXZlbiB0aGUgcHJlZGljYXRlLlxuICogSWYgdGhlIHByZWRpY2F0ZSBpc1xuICogICAqIG1pc3NpbmcgLSBpdCB3aWxsIHJlbW92ZSBhbGwgcHJvcGVydGllcyB3aG9zZSB2YWx1ZXMgYXJlIGB1bmRlZmluZWRgXG4gKiAgICogYSBzY2FsYXIgLSBpdCB3aWxsIHRlc3QgYWxsIHByb3BlcnRpZXMnIHZhbHVlcyBhZ2FpbnN0IHRoYXQgdmFsdWVcbiAqICAgKiBhIGZ1bmN0aW9uIC0gaXQgd2lsbCBwYXNzIGVhY2ggdmFsdWUgYW5kIHRoZSBvcmlnaW5hbCBvYmplY3QgaW50byB0aGUgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gZmlsdGVyT2JqZWN0KG9iaiwgcHJlZGljYXRlKSB7XG4gIGxldCBuZXdPYmogPSBfLmNsb25lKG9iaik7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByZWRpY2F0ZSkpIHtcbiAgICAvLyByZW1vdmUgYW55IGVsZW1lbnQgZnJvbSB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgIHByZWRpY2F0ZSA9ICh2KSA9PiAhXy5pc1VuZGVmaW5lZCh2KTtcbiAgfSBlbHNlIGlmICghXy5pc0Z1bmN0aW9uKHByZWRpY2F0ZSkpIHtcbiAgICAvLyBtYWtlIHByZWRpY2F0ZSBpbnRvIGEgZnVuY3Rpb25cbiAgICBjb25zdCB2YWx1ZVByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICBwcmVkaWNhdGUgPSAodikgPT4gdiA9PT0gdmFsdWVQcmVkaWNhdGU7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGlmICghcHJlZGljYXRlKG9ialtrZXldLCBvYmopKSB7XG4gICAgICBkZWxldGUgbmV3T2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdPYmo7XG59XG5cbi8qKlxuICogQ29udmVydHMgbnVtYmVyIG9mIGJ5dGVzIHRvIGEgcmVhZGFibGUgc2l6ZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBieXRlcyAtIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGFjdHVhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGZvciBleGFtcGxlXG4gKiAgICAgICAgICAgICAgICAgICAnMS4wMCBLQicgZm9yICcxMDI0IEInXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYnl0ZXMgY291bnQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIG9yXG4gKiAgICAgICAgICAgICAgICAgaWYgaXQgaXMgbGVzcyB0aGFuIHplcm8uXG4gKi9cbmZ1bmN0aW9uIHRvUmVhZGFibGVTaXplU3RyaW5nKGJ5dGVzKSB7XG4gIGNvbnN0IGludEJ5dGVzID0gcGFyc2VJbnQoU3RyaW5nKGJ5dGVzKSwgMTApO1xuICBpZiAoaXNOYU4oaW50Qnl0ZXMpIHx8IGludEJ5dGVzIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgJyR7Ynl0ZXN9JyB0byBhIHJlYWRhYmxlIHNpemUgZm9ybWF0YCk7XG4gIH1cbiAgaWYgKGludEJ5dGVzID49IEdpQikge1xuICAgIHJldHVybiBgJHsoaW50Qnl0ZXMgLyAoR2lCICogMS4wKSkudG9GaXhlZCgyKX0gR0JgO1xuICB9IGVsc2UgaWYgKGludEJ5dGVzID49IE1pQikge1xuICAgIHJldHVybiBgJHsoaW50Qnl0ZXMgLyAoTWlCICogMS4wKSkudG9GaXhlZCgyKX0gTUJgO1xuICB9IGVsc2UgaWYgKGludEJ5dGVzID49IEtpQikge1xuICAgIHJldHVybiBgJHsoaW50Qnl0ZXMgLyAoS2lCICogMS4wKSkudG9GaXhlZCgyKX0gS0JgO1xuICB9XG4gIHJldHVybiBgJHtpbnRCeXRlc30gQmA7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgYSBzdWJwYXRoIG9mIHRoZVxuICogcGFydGljdWxhciByb290IGZvbGRlci4gQm90aCBwYXRocyBjYW4gaW5jbHVkZSAuLiBhbmQgLiBzcGVjaWZpZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9yaWdpbmFsUGF0aCBUaGUgYWJzb2x1dGUgZmlsZS9mb2xkZXIgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHJvb3QgVGhlIGFic29sdXRlIHJvb3QgZm9sZGVyIHBhdGhcbiAqIEBwYXJhbSB7P2Jvb2xlYW59IGZvcmNlUG9zaXggU2V0IGl0IHRvIHRydWUgaWYgcGF0aHMgbXVzdCBiZSBpbnRlcnByZXRlZCBpbiBQT1NJWCBmb3JtYXRcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBnaXZlbiBvcmlnaW5hbCBwYXRoIGlzIHRoZSBzdWJwYXRoIG9mIHRoZSByb290IGZvbGRlclxuICogQHRocm93cyB7RXJyb3J9IGlmIGFueSBvZiB0aGUgZ2l2ZW4gcGF0aHMgaXMgbm90IGFic29sdXRlXG4gKi9cbmZ1bmN0aW9uIGlzU3ViUGF0aChvcmlnaW5hbFBhdGgsIHJvb3QsIGZvcmNlUG9zaXggPSBudWxsKSB7XG4gIGNvbnN0IHBhdGhPYmogPSBmb3JjZVBvc2l4ID8gcGF0aC5wb3NpeCA6IHBhdGg7XG4gIGZvciAoY29uc3QgcCBvZiBbb3JpZ2luYWxQYXRoLCByb290XSkge1xuICAgIGlmICghcGF0aE9iai5pc0Fic29sdXRlKHApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3B9JyBpcyBleHBlY3RlZCB0byBiZSBhbiBhYnNvbHV0ZSBwYXRoYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWRSb290ID0gcGF0aE9iai5ub3JtYWxpemUocm9vdCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aE9iai5ub3JtYWxpemUob3JpZ2luYWxQYXRoKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgobm9ybWFsaXplZFJvb3QpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRocyBhcmUgcG9pbnRpbmcgdG8gdGhlIHNhbWUgZmlsZSBzeXN0ZW1cbiAqIGRlc3RpbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoMSAtIEFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggdG8gYSBmaWxlL2ZvbGRlclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGgyIC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byBhIGZpbGUvZm9sZGVyXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcGF0aE4gLSBaZXJvIG9yIG1vcmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aHMgdG8gZmlsZXMvZm9sZGVyc1xuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IHRydWUgaWYgYWxsIHBhdGhzIGFyZSBwb2ludGluZyB0byB0aGUgc2FtZSBmaWxlIHN5c3RlbSBpdGVtXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzU2FtZURlc3RpbmF0aW9uKHBhdGgxLCBwYXRoMiwgLi4ucGF0aE4pIHtcbiAgY29uc3QgYWxsUGF0aHMgPSBbcGF0aDEsIHBhdGgyLCAuLi5wYXRoTl07XG4gIGlmICghKGF3YWl0IEIucmVkdWNlKGFsbFBhdGhzLCBhc3luYyAoYSwgYikgPT4gYSAmJiAoYXdhaXQgZnMuZXhpc3RzKGIpKSwgdHJ1ZSkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgYXJlQWxsSXRlbXNFcXVhbCA9IChhcnIpID0+ICEhYXJyLnJlZHVjZSgoYSwgYikgPT4gKGEgPT09IGIgPyBhIDogTmFOKSk7XG4gIGlmIChhcmVBbGxJdGVtc0VxdWFsKGFsbFBhdGhzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbGV0IG1hcENiID0gYXN5bmMgKHgpID0+XG4gICAgKFxuICAgICAgYXdhaXQgZnMuc3RhdCh4LCB7XG4gICAgICAgIGJpZ2ludDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgKS5pbm87XG4gIHJldHVybiBhcmVBbGxJdGVtc0VxdWFsKGF3YWl0IEIubWFwKGFsbFBhdGhzLCBtYXBDYikpO1xufVxuXG4vKipcbiAqIENvZXJjZXMgdGhlIGdpdmVuIG51bWJlci9zdHJpbmcgdG8gYSB2YWxpZCB2ZXJzaW9uIHN0cmluZ1xuICpcbiAqIEB0ZW1wbGF0ZSB7Ym9vbGVhbn0gW1N0cmljdD10cnVlXVxuICogQHBhcmFtIHtzdHJpbmd9IHZlciAtIFZlcnNpb24gc3RyaW5nIHRvIGNvZXJjZVxuICogQHBhcmFtIHtTdHJpY3R9IFtzdHJpY3RdIC0gSWYgYHRydWVgIHRoZW4gYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duXG4gKiBpZiBgdmVyYCBjYW5ub3QgYmUgY29lcmNlZFxuICogQHJldHVybnMge1N0cmljdCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBzdHJpbmd8bnVsbH0gQ29lcmNlZCB2ZXJzaW9uIG51bWJlciBvciBudWxsIGlmIHRoZSBzdHJpbmcgY2Fubm90IGJlXG4gKiBjb2VyY2VkIGFuZCBzdHJpY3QgbW9kZSBpcyBkaXNhYmxlZFxuICogQHRocm93cyB7RXJyb3J9IGlmIHN0cmljdCBtb2RlIGlzIGVuYWJsZWQgYW5kIGB2ZXJgIGNhbm5vdCBiZSBjb2VyY2VkXG4gKi9cbmZ1bmN0aW9uIGNvZXJjZVZlcnNpb24odmVyLCBzdHJpY3QgPSAvKiogQHR5cGUge1N0cmljdH0gKi8gKHRydWUpKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHNlbXZlci52YWxpZChzZW12ZXIuY29lcmNlKGAke3Zlcn1gKSk7XG4gIGlmIChzdHJpY3QgJiYgIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7dmVyfScgY2Fubm90IGJlIGNvZXJjZWQgdG8gYSB2YWxpZCB2ZXJzaW9uIG51bWJlcmApO1xuICB9XG4gIHJldHVybiAvKiogQHR5cGUge1N0cmljdCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBzdHJpbmc/fSAqLyAocmVzdWx0KTtcbn1cblxuY29uc3QgU1VQUE9SVEVEX09QRVJBVE9SUyA9IFsnPT0nLCAnIT0nLCAnPicsICc8JywgJz49JywgJzw9JywgJz0nXTtcblxuLyoqXG4gKiBDb21wYXJlcyB0d28gdmVyc2lvbiBzdHJpbmdzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcjEgLSBUaGUgZmlyc3QgdmVyc2lvbiBudW1iZXIgdG8gY29tcGFyZS4gU2hvdWxkIGJlIGEgdmFsaWRcbiAqIHZlcnNpb24gbnVtYmVyIHN1cHBvcnRlZCBieSBzZW12ZXIgcGFyc2VyLlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcjIgLSBUaGUgc2Vjb25kIHZlcnNpb24gbnVtYmVyIHRvIGNvbXBhcmUuIFNob3VsZCBiZSBhIHZhbGlkXG4gKiB2ZXJzaW9uIG51bWJlciBzdXBwb3J0ZWQgYnkgc2VtdmVyIHBhcnNlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIE9uZSBvZiBzdXBwb3J0ZWQgdmVyc2lvbiBudW1iZXIgb3BlcmF0b3JzOlxuICogPT0sICE9LCA+LCA8LCA8PSwgPj0sID1cbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIG9yIGZhbHNlIGRlcGVuZGluZyBvbiB0aGUgYWN0dWFsIGNvbXBhcmlzb24gcmVzdWx0XG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW4gdW5zdXBwb3J0ZWQgb3BlcmF0b3IgaXMgc3VwcGxpZWQgb3IgYW55IG9mIHRoZSBzdXBwbGllZFxuICogdmVyc2lvbiBzdHJpbmdzIGNhbm5vdCBiZSBjb2VyY2VkXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyh2ZXIxLCBvcGVyYXRvciwgdmVyMikge1xuICBpZiAoIVNVUFBPUlRFRF9PUEVSQVRPUlMuaW5jbHVkZXMob3BlcmF0b3IpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSAnJHtvcGVyYXRvcn0nIGNvbXBhcmlzb24gb3BlcmF0b3IgaXMgbm90IHN1cHBvcnRlZC4gYCArXG4gICAgICAgIGBPbmx5ICcke0pTT04uc3RyaW5naWZ5KFNVUFBPUlRFRF9PUEVSQVRPUlMpfScgb3BlcmF0b3JzIGFyZSBzdXBwb3J0ZWRgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNlbXZlck9wZXJhdG9yID0gWyc9PScsICchPSddLmluY2x1ZGVzKG9wZXJhdG9yKSA/ICc9JyA6IG9wZXJhdG9yO1xuICBjb25zdCByZXN1bHQgPSBzZW12ZXIuc2F0aXNmaWVzKGNvZXJjZVZlcnNpb24odmVyMSksIGAke3NlbXZlck9wZXJhdG9yfSR7Y29lcmNlVmVyc2lvbih2ZXIyKX1gKTtcbiAgcmV0dXJuIG9wZXJhdG9yID09PSAnIT0nID8gIXJlc3VsdCA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBZGQgYXBwcm9wcmlhdGUgcXVvdGVzIHRvIGNvbW1hbmQgYXJndW1lbnRzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3N1YnN0YWNrL25vZGUtc2hlbGwtcXVvdGVcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gYXJncyAtIFRoZSBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhcnNlZFxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgYXJndW1lbnRzLCBxdW90ZWRcbiAqL1xuZnVuY3Rpb24gcXVvdGUoYXJncykge1xuICByZXR1cm4gc2hlbGxRdW90ZShfLmNhc3RBcnJheShhcmdzKSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgdG8gd29ya2Fyb3VuZCB1bmV4cGVjdGVkIG1lbW9yeSBsZWFrc1xuICogY2F1c2VkIGJ5IE5vZGVKUyBzdHJpbmcgaW50ZXJuaW5nXG4gKiBiZWhhdmlvciBkZXNjcmliZWQgaW4gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Mjg2OVxuICpcbiAqIEBwYXJhbSB7Kn0gcyAtIFRoZSBzdHJpbmcgdG8gdW5sZWFrXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEVpdGhlciB0aGUgdW5sZWFrZWQgc3RyaW5nIG9yIHRoZSBvcmlnaW5hbCBvYmplY3QgY29udmVydGVkIHRvIHN0cmluZ1xuICovXG5mdW5jdGlvbiB1bmxlYWtTdHJpbmcocykge1xuICByZXR1cm4gYCAke3N9YC5zdWJzdHIoMSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgUGx1cmFsaXplT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbaW5jbHVzaXZlPWZhbHNlXSAtIFdoZXRoZXIgdG8gcHJlZml4IHdpdGggdGhlIG51bWJlciAoZS5nLiwgMyBkdWNrcylcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgZm9ybSBvZiBhIHdvcmQgYXBwcm9wcmlhdGUgdG8gdGhlIGNvdW50XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmQgLSBUaGUgd29yZCB0byBwbHVyYWxpemVcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIEhvdyBtYW55IG9mIHRoZSB3b3JkIGV4aXN0XG4gKiBAcGFyYW0ge1BsdXJhbGl6ZU9wdGlvbnN8Ym9vbGVhbn0gb3B0aW9ucyAtIG9wdGlvbnMgZm9yIHdvcmQgcGx1cmFsaXphdGlvbixcbiAqICAgb3IgYSBib29sZWFuIGluZGljYXRpbmcgdGhlIG9wdGlvbnMuaW5jbHVzaXZlIHByb3BlcnR5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgd29yZCBwbHVyYWxpemVkIGFjY29yZGluZyB0byB0aGUgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbGl6ZSh3b3JkLCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBpbmNsdXNpdmUgPSBmYWxzZTtcbiAgaWYgKF8uaXNCb29sZWFuKG9wdGlvbnMpKSB7XG4gICAgLy8gaWYgcGFzc2VkIGluIGFzIGEgYm9vbGVhblxuICAgIGluY2x1c2l2ZSA9IG9wdGlvbnM7XG4gIH0gZWxzZSBpZiAoXy5pc0Jvb2xlYW4ob3B0aW9ucz8uaW5jbHVzaXZlKSkge1xuICAgIC8vIGlmIHBhc3NlZCBpbiBhcyBhbiBvcHRpb25zIGhhc2hcbiAgICBpbmNsdXNpdmUgPSBvcHRpb25zLmluY2x1c2l2ZTtcbiAgfVxuICByZXR1cm4gcGx1cmFsaXplTGliKHdvcmQsIGNvdW50LCBpbmNsdXNpdmUpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIEVuY29kaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhTaXplPTEwNzM3NDE4MjRdIFRoZSBtYXhpbXVtIHNpemUgb2ZcbiAqIHRoZSByZXN1bHRpbmcgYnVmZmVyIGluIGJ5dGVzLiBUaGlzIGlzIHNldCB0byAxR0IgYnkgZGVmYXVsdCwgYmVjYXVzZVxuICogQXBwaXVtIGxpbWl0cyB0aGUgbWF4aW11bSBIVFRQIGJvZHkgc2l6ZSB0byAxR0IuIEFsc28sIHRoZSBOb2RlSlMgaGVhcFxuICogc2l6ZSBtdXN0IGJlIGVub3VnaCB0byBrZWVwIHRoZSByZXN1bHRpbmcgb2JqZWN0ICh1c3VhbGx5IHRoaXMgc2l6ZSBpc1xuICogbGltaXRlZCB0byAxLjQgR0IpXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0cyBjb250ZW50cyBvZiBhIGxvY2FsIGZpbGUgdG8gYW4gaW4tbWVtb3J5IGJhc2UtNjQgZW5jb2RlZCBidWZmZXIuXG4gKiBUaGUgb3BlcmF0aW9uIGlzIG1lbW9yeS11c2FnZSBmcmllbmRseSBhbmQgc2hvdWxkIGJlIHVzZWQgd2hpbGUgZW5jb2RpbmdcbiAqIGxhcmdlIGZpbGVzIHRvIGJhc2U2NFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUgYmVpbmcgZW5jb2RlZFxuICogQHBhcmFtIHtFbmNvZGluZ09wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59IGJhc2U2NC1lbmNvZGVkIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlIGFzIG1lbW9yeSBidWZmZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmVhZGluZyB0aGUgc291cmNlIGZpbGVcbiAqIG9yIHRoZSBzb3VyY2UgZmlsZSBpcyB0b29cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdG9Jbk1lbW9yeUJhc2U2NChzcmNQYXRoLCBvcHRzID0ge30pIHtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHNyY1BhdGgpKSB8fCAoYXdhaXQgZnMuc3RhdChzcmNQYXRoKSkuaXNEaXJlY3RvcnkoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBmaWxlOiAke3NyY1BhdGh9YCk7XG4gIH1cblxuICBjb25zdCB7bWF4U2l6ZSA9IDEgKiBHaUJ9ID0gb3B0cztcbiAgY29uc3QgcmVzdWx0QnVmZmVycyA9IFtdO1xuICBsZXQgcmVzdWx0QnVmZmVyc1NpemUgPSAwO1xuICBjb25zdCByZXN1bHRXcml0ZVN0cmVhbSA9IG5ldyBzdHJlYW0uV3JpdGFibGUoe1xuICAgIHdyaXRlOiAoYnVmZmVyLCBlbmNvZGluZywgbmV4dCkgPT4ge1xuICAgICAgcmVzdWx0QnVmZmVycy5wdXNoKGJ1ZmZlcik7XG4gICAgICByZXN1bHRCdWZmZXJzU2l6ZSArPSBidWZmZXIubGVuZ3RoO1xuICAgICAgaWYgKG1heFNpemUgPiAwICYmIHJlc3VsdEJ1ZmZlcnNTaXplID4gbWF4U2l6ZSkge1xuICAgICAgICByZXN1bHRXcml0ZVN0cmVhbS5lbWl0KFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgYCArXG4gICAgICAgICAgICAgIGBidWZmZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuICR7dG9SZWFkYWJsZVNpemVTdHJpbmcobWF4U2l6ZSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG5leHQoKTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCByZWFkZXJTdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHNyY1BhdGgpO1xuICBjb25zdCBiYXNlNjRFbmNvZGVyU3RyZWFtID0gbmV3IEJhc2U2NEVuY29kZSgpO1xuICBjb25zdCByZXN1bHRXcml0ZVN0cmVhbVByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmVzdWx0V3JpdGVTdHJlYW0ub25jZSgnZXJyb3InLCAoZSkgPT4ge1xuICAgICAgcmVhZGVyU3RyZWFtLnVucGlwZShiYXNlNjRFbmNvZGVyU3RyZWFtKTtcbiAgICAgIGJhc2U2NEVuY29kZXJTdHJlYW0udW5waXBlKHJlc3VsdFdyaXRlU3RyZWFtKTtcbiAgICAgIHJlYWRlclN0cmVhbS5kZXN0cm95KCk7XG4gICAgICByZWplY3QoZSk7XG4gICAgfSk7XG4gICAgcmVzdWx0V3JpdGVTdHJlYW0ub25jZSgnZmluaXNoJywgcmVzb2x2ZSk7XG4gIH0pO1xuICBjb25zdCByZWFkU3RyZWFtUHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZWFkZXJTdHJlYW0ub25jZSgnY2xvc2UnLCByZXNvbHZlKTtcbiAgICByZWFkZXJTdHJlYW0ub25jZSgnZXJyb3InLCAoZSkgPT5cbiAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byByZWFkICcke3NyY1BhdGh9JzogJHtlLm1lc3NhZ2V9YCkpXG4gICAgKTtcbiAgfSk7XG4gIHJlYWRlclN0cmVhbS5waXBlKGJhc2U2NEVuY29kZXJTdHJlYW0pO1xuICBiYXNlNjRFbmNvZGVyU3RyZWFtLnBpcGUocmVzdWx0V3JpdGVTdHJlYW0pO1xuXG4gIGF3YWl0IEIuYWxsKFtyZWFkU3RyZWFtUHJvbWlzZSwgcmVzdWx0V3JpdGVTdHJlYW1Qcm9taXNlXSk7XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KHJlc3VsdEJ1ZmZlcnMpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIExvY2tGaWxlT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0PTEyMF0gVGhlIG1heCB0aW1lIGluIHNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIGxvY2tcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyeVJlY292ZXJ5PWZhbHNlXSBXaGV0aGVyIHRvIHRyeSBsb2NrIHJlY292ZXJ5IGlmXG4gKiB0aGUgZmlyc3QgYXR0ZW1wdCB0byBhY3F1aXJlIGl0IHRpbWVkIG91dC5cbiAqL1xuXG4vKipcbiAqIENyZWF0ZSBhbiBhc3luYyBmdW5jdGlvbiB3aGljaCwgd2hlbiBjYWxsZWQsIHdpbGwgbm90IHByb2NlZWQgdW50aWwgYSBjZXJ0YWluIGZpbGUgaXMgbm9cbiAqIGxvbmdlciBwcmVzZW50IG9uIHRoZSBzeXN0ZW0uIFRoaXMgYWxsb3dzIGZvciBwcmV2ZW50aW5nIGNvbmN1cnJlbnQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3Nlc1xuICogdXNpbmcgYSBrbm93biBsb2NrZmlsZSBwYXRoLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9ja0ZpbGUgVGhlIGZ1bGwgcGF0aCB0byB0aGUgZmlsZSB1c2VkIGZvciB0aGUgbG9ja1xuICogQHBhcmFtIHtMb2NrRmlsZU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIGFzeW5jIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW5vdGhlciBhc3luYyBmdW5jdGlvbiBkZWZpbmluZyB0aGUgbG9ja2VkXG4gKiBiZWhhdmlvclxuICovXG5mdW5jdGlvbiBnZXRMb2NrRmlsZUd1YXJkKGxvY2tGaWxlLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge3RpbWVvdXQgPSAxMjAsIHRyeVJlY292ZXJ5ID0gZmFsc2V9ID0gb3B0cztcblxuICBjb25zdCBsb2NrID0gLyoqIEB0eXBlIHsobG9ja2ZpbGU6IHN0cmluZywgb3B0czogaW1wb3J0KCdsb2NrZmlsZScpLk9wdGlvbnMpPT5CPHZvaWQ+fSAqLyAoXG4gICAgQi5wcm9taXNpZnkoX2xvY2tmaWxlLmxvY2spXG4gICk7XG4gIGNvbnN0IGNoZWNrID0gQi5wcm9taXNpZnkoX2xvY2tmaWxlLmNoZWNrKTtcbiAgY29uc3QgdW5sb2NrID0gQi5wcm9taXNpZnkoX2xvY2tmaWxlLnVubG9jayk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBUfSBiZWhhdmlvclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn1cbiAgICovXG4gIGNvbnN0IGd1YXJkID0gYXN5bmMgKGJlaGF2aW9yKSA9PiB7XG4gICAgbGV0IHRyaWVkUmVjb3ZlcnkgPSBmYWxzZTtcbiAgICBkbyB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBpZiB0aGUgbG9ja2ZpbGUgZG9lc24ndCBleGlzdCwgbG9jayBpdCBzeW5jaHJvbm91c2x5IHRvIG1ha2Ugc3VyZSBubyBvdGhlciBjYWxsXG4gICAgICAgIC8vIG9uIHRoZSBzYW1lIHNwaW4gb2YgdGhlIGV2ZW50IGxvb3AgY2FuIGFsc28gaW5pdGlhdGUgYSBsb2NrLiBJZiB0aGUgbG9ja2ZpbGUgZG9lcyBleGlzdFxuICAgICAgICAvLyB0aGVuIGp1c3QgdXNlIHRoZSByZWd1bGFyIGFzeW5jICdsb2NrJyBtZXRob2Qgd2hpY2ggd2lsbCB3YWl0IG9uIHRoZSBsb2NrLlxuICAgICAgICBpZiAoX2xvY2tmaWxlLmNoZWNrU3luYyhsb2NrRmlsZSkpIHtcbiAgICAgICAgICBhd2FpdCBsb2NrKGxvY2tGaWxlLCB7d2FpdDogdGltZW91dCAqIDEwMDB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfbG9ja2ZpbGUubG9ja1N5bmMobG9ja0ZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoXy5pbmNsdWRlcyhlLm1lc3NhZ2UsICdFRVhJU1QnKSAmJiB0cnlSZWNvdmVyeSAmJiAhdHJpZWRSZWNvdmVyeSkge1xuICAgICAgICAgIC8vIFRoZXJlIGNvdWxkIGJlIGNhc2VzIHdoZXJlIGEgcHJvY2VzcyBoYXMgYmVlbiBmb3JjZWZ1bGx5IHRlcm1pbmF0ZWRcbiAgICAgICAgICAvLyB3aXRob3V0IGEgY2hhbmNlIHRvIGNsZWFuIHVwIHBlbmRpbmcgbG9ja3M6IGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vbG9ja2ZpbGUvaXNzdWVzLzI2XG4gICAgICAgICAgX2xvY2tmaWxlLnVubG9ja1N5bmMobG9ja0ZpbGUpO1xuICAgICAgICAgIHRyaWVkUmVjb3ZlcnkgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGFjcXVpcmUgbG9jayBvbiAnJHtsb2NrRmlsZX0nIGFmdGVyICR7dGltZW91dH1zLiBgICtcbiAgICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgIH0gd2hpbGUgKHRydWUpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYmVoYXZpb3IoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gd2hldGhlciB0aGUgYmVoYXZpb3Igc3VjY2VlZGVkIG9yIG5vdCwgZ2V0IHJpZCBvZiB0aGUgbG9ja1xuICAgICAgYXdhaXQgdW5sb2NrKGxvY2tGaWxlKTtcbiAgICB9XG4gIH07XG5cbiAgZ3VhcmQuY2hlY2sgPSBhc3luYyAoKSA9PiBhd2FpdCBjaGVjayhsb2NrRmlsZSk7XG5cbiAgcmV0dXJuIGd1YXJkO1xufVxuXG5leHBvcnQge1xuICBoYXNWYWx1ZSxcbiAgZXNjYXBlU3BhY2UsXG4gIGVzY2FwZVNwZWNpYWxDaGFycyxcbiAgbG9jYWxJcCxcbiAgY2FuY2VsbGFibGVEZWxheSxcbiAgbXVsdGlSZXNvbHZlLFxuICBzYWZlSnNvblBhcnNlLFxuICB3cmFwRWxlbWVudCxcbiAgdW53cmFwRWxlbWVudCxcbiAgZmlsdGVyT2JqZWN0LFxuICB0b1JlYWRhYmxlU2l6ZVN0cmluZyxcbiAgaXNTdWJQYXRoLFxuICBXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUixcbiAgaXNTYW1lRGVzdGluYXRpb24sXG4gIGNvbXBhcmVWZXJzaW9ucyxcbiAgY29lcmNlVmVyc2lvbixcbiAgcXVvdGUsXG4gIHVubGVha1N0cmluZyxcbiAganNvblN0cmluZ2lmeSxcbiAgcGx1cmFsaXplLFxuICBHaUIsXG4gIE1pQixcbiAgS2lCLFxuICB0b0luTWVtb3J5QmFzZTY0LFxuICB1dWlkVjEsXG4gIHV1aWRWMyxcbiAgdXVpZFY0LFxuICB1dWlkVjUsXG4gIHNoZWxsUGFyc2UsXG4gIGdldExvY2tGaWxlR3VhcmQsXG59O1xuXG4vKipcbiAqIEEgYHN0cmluZ2Agd2hpY2ggaXMgbmV2ZXIgYCcnYC5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyAnJyA/IG5ldmVyIDogVH0gTm9uRW1wdHlTdHJpbmdcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBT0E7Ozs7QUFFQSxNQUFNQSwwQkFBMEIsR0FBRyxxQ0FBbkM7O0FBQ0EsTUFBTUMsR0FBRyxHQUFHLElBQVo7O0FBQ0EsTUFBTUMsR0FBRyxHQUFHRCxHQUFHLEdBQUcsSUFBbEI7O0FBQ0EsTUFBTUUsR0FBRyxH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
|
|
508
|
+
exports.getLockFileGuard = getLockFileGuard;
|
|
509
|
+
/**
|
|
510
|
+
* A `string` which is never `''`.
|
|
511
|
+
*
|
|
512
|
+
* @template {string} T
|
|
513
|
+
* @typedef {T extends '' ? never : T} NonEmptyString
|
|
514
|
+
*/
|
|
515
|
+
//# sourceMappingURL=util.js.map
|