appium-xcode 4.0.2 → 4.0.3
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/CHANGELOG.md +1 -0
- package/build/index.js +1 -5
- package/build/lib/xcode.js +3 -72
- package/build/lib/xcode.js.map +1 -0
- package/package.json +4 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
## [4.0.3](https://github.com/appium/appium-xcode/compare/v4.0.2...v4.0.3) (2022-11-06)
|
package/build/index.js
CHANGED
|
@@ -4,13 +4,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.getVersion = exports.getPath = exports.getMaxTVOSSDKWithoutRetry = exports.getMaxTVOSSDK = exports.getMaxIOSSDKWithoutRetry = exports.getMaxIOSSDK = exports.getInstrumentsPath = exports.getConnectedDevices = exports.getCommandLineToolsVersion = exports.getClangVersion = exports.getAutomationTraceTemplatePathWithoutRetry = exports.getAutomationTraceTemplatePath = exports.default = exports.clearInternalCache = void 0;
|
|
7
|
-
|
|
8
7
|
require("source-map-support/register");
|
|
9
|
-
|
|
10
8
|
var xcode = _interopRequireWildcard(require("./lib/xcode"));
|
|
11
|
-
|
|
12
9
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
13
|
-
|
|
14
10
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
15
11
|
|
|
16
12
|
const {
|
|
@@ -43,4 +39,4 @@ exports.getVersion = getVersion;
|
|
|
43
39
|
exports.getPath = getPath;
|
|
44
40
|
var _default = xcode;
|
|
45
41
|
exports.default = _default;
|
|
46
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRQYXRoIiwiZ2V0VmVyc2lvbiIsImdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCIsImdldE1heElPU1NESyIsImdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSIsImdldE1heElPU1NES1dpdGhvdXRSZXRyeSIsImdldENvbm5lY3RlZERldmljZXMiLCJjbGVhckludGVybmFsQ2FjaGUiLCJnZXRJbnN0cnVtZW50c1BhdGgiLCJnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiIsImdldE1heFRWT1NTREsiLCJnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5IiwiZ2V0Q2xhbmdWZXJzaW9uIiwieGNvZGUiXSwic291cmNlcyI6WyIuLi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgKiBhcyB4Y29kZSBmcm9tICcuL2xpYi94Y29kZSc7XG5cblxuY29uc3Qge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufSA9IHhjb2RlO1xuXG5leHBvcnQge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufTtcbmV4cG9ydCBkZWZhdWx0IHhjb2RlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBRUE7QUFBcUM7QUFBQTs7QUFHckMsTUFBTTtFQUNKQSxPQUFPO0VBQUVDLFVBQVU7RUFBRUMsOEJBQThCO0VBQUVDLFlBQVk7RUFDakVDLDBDQUEwQztFQUFFQyx3QkFBd0I7RUFDcEVDLG1CQUFtQjtFQUFFQyxrQkFBa0I7RUFBRUMsa0JBQWtCO0VBQzNEQywwQkFBMEI7RUFBRUMsYUFBYTtFQUFFQyx5QkFBeUI7RUFDcEVDO0FBQ0YsQ0FBQyxHQUFHQyxLQUFLO0FBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxlQVNLQSxLQUFLO0FBQUEifQ==
|
package/build/lib/xcode.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
@@ -17,54 +16,38 @@ exports.getMaxTVOSSDK = void 0;
|
|
|
17
16
|
exports.getMaxTVOSSDKWithoutRetry = getMaxTVOSSDKWithoutRetry;
|
|
18
17
|
exports.getPath = void 0;
|
|
19
18
|
exports.getVersion = getVersion;
|
|
20
|
-
|
|
21
19
|
require("source-map-support/register");
|
|
22
|
-
|
|
23
20
|
var _support = require("@appium/support");
|
|
24
|
-
|
|
25
21
|
var _path = _interopRequireDefault(require("path"));
|
|
26
|
-
|
|
27
22
|
var _asyncbox = require("asyncbox");
|
|
28
|
-
|
|
29
23
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
30
|
-
|
|
31
24
|
var _plist = require("plist");
|
|
32
|
-
|
|
33
25
|
var _teen_process = require("teen_process");
|
|
34
|
-
|
|
35
26
|
var _semver = _interopRequireDefault(require("semver"));
|
|
36
|
-
|
|
37
27
|
const env = process.env;
|
|
38
28
|
const XCRUN_TIMEOUT = 15000;
|
|
39
29
|
const XCODE_SUBDIR = '/Contents/Developer';
|
|
40
30
|
const DEFAULT_NUMBER_OF_RETRIES = 3;
|
|
41
|
-
|
|
42
31
|
const log = _support.logger.getLogger('Xcode');
|
|
43
|
-
|
|
44
32
|
function hasExpectedSubDir(path) {
|
|
45
33
|
return path.substring(path.length - XCODE_SUBDIR.length) === XCODE_SUBDIR;
|
|
46
34
|
}
|
|
47
|
-
|
|
48
35
|
async function runXcrunCommand(args, timeout = XCRUN_TIMEOUT) {
|
|
49
36
|
try {
|
|
50
37
|
const res = await (0, _teen_process.exec)('xcrun', args, {
|
|
51
38
|
timeout
|
|
52
39
|
});
|
|
53
|
-
|
|
54
40
|
if (_lodash.default.isUndefined(res)) {
|
|
55
41
|
throw new Error(`Nothing returned from trying to run 'xcrun ${args.join(' ')}'`);
|
|
56
42
|
}
|
|
57
|
-
|
|
58
43
|
return res;
|
|
59
44
|
} catch (err) {
|
|
60
45
|
if (err.stderr) {
|
|
61
46
|
err.message = `${err.message}: ${err.stderr}`;
|
|
62
47
|
}
|
|
63
|
-
|
|
64
48
|
throw err;
|
|
65
49
|
}
|
|
66
50
|
}
|
|
67
|
-
|
|
68
51
|
async function getPathFromSymlink(failMessage) {
|
|
69
52
|
log.warn(`Finding XcodePath by symlink because ${failMessage}`);
|
|
70
53
|
const symlinkPath = '/var/db/xcode_select_link';
|
|
@@ -73,7 +56,6 @@ async function getPathFromSymlink(failMessage) {
|
|
|
73
56
|
|
|
74
57
|
if (_support.util.hasContent(env.DEVELOPER_DIR)) {
|
|
75
58
|
const customPath = hasExpectedSubDir(env.DEVELOPER_DIR) ? env.DEVELOPER_DIR : env.DEVELOPER_DIR + XCODE_SUBDIR;
|
|
76
|
-
|
|
77
59
|
if (await _support.fs.exists(customPath)) {
|
|
78
60
|
xcodePath = customPath;
|
|
79
61
|
} else {
|
|
@@ -86,7 +68,6 @@ async function getPathFromSymlink(failMessage) {
|
|
|
86
68
|
} else if (await _support.fs.exists(legacySymlinkPath)) {
|
|
87
69
|
xcodePath = await _support.fs.readlink(legacySymlinkPath);
|
|
88
70
|
}
|
|
89
|
-
|
|
90
71
|
if (xcodePath) {
|
|
91
72
|
return xcodePath.replace(new RegExp('/$'), '').trim();
|
|
92
73
|
}
|
|
@@ -95,19 +76,17 @@ async function getPathFromSymlink(failMessage) {
|
|
|
95
76
|
log.warn(msg);
|
|
96
77
|
throw new Error(msg);
|
|
97
78
|
}
|
|
98
|
-
|
|
99
79
|
async function getPathFromXcodeSelect(timeout = XCRUN_TIMEOUT) {
|
|
100
80
|
let {
|
|
101
81
|
stdout
|
|
102
82
|
} = await (0, _teen_process.exec)('xcode-select', ['--print-path'], {
|
|
103
83
|
timeout
|
|
104
84
|
});
|
|
105
|
-
const xcodeFolderPath = stdout.replace(/\/$/, '').trim();
|
|
106
85
|
|
|
86
|
+
const xcodeFolderPath = stdout.replace(/\/$/, '').trim();
|
|
107
87
|
if (!_support.util.hasContent(xcodeFolderPath)) {
|
|
108
88
|
log.errorAndThrow('xcode-select returned an empty string');
|
|
109
89
|
}
|
|
110
|
-
|
|
111
90
|
if (await _support.fs.exists(xcodeFolderPath)) {
|
|
112
91
|
return xcodeFolderPath;
|
|
113
92
|
} else {
|
|
@@ -115,7 +94,6 @@ async function getPathFromXcodeSelect(timeout = XCRUN_TIMEOUT) {
|
|
|
115
94
|
log.errorAndThrow(msg);
|
|
116
95
|
}
|
|
117
96
|
}
|
|
118
|
-
|
|
119
97
|
const getPath = _lodash.default.memoize(function getPath(timeout = XCRUN_TIMEOUT) {
|
|
120
98
|
return (async () => {
|
|
121
99
|
try {
|
|
@@ -125,55 +103,43 @@ const getPath = _lodash.default.memoize(function getPath(timeout = XCRUN_TIMEOUT
|
|
|
125
103
|
}
|
|
126
104
|
})();
|
|
127
105
|
});
|
|
128
|
-
|
|
129
106
|
exports.getPath = getPath;
|
|
130
|
-
|
|
131
107
|
async function getVersionWithoutRetry(timeout = XCRUN_TIMEOUT) {
|
|
132
108
|
const xcodePath = await getPath(timeout);
|
|
133
109
|
|
|
134
110
|
const plistPath = _path.default.resolve(xcodePath, '..', 'Info.plist');
|
|
135
|
-
|
|
136
111
|
if (!(await _support.fs.exists(plistPath))) {
|
|
137
112
|
throw new Error(`Could not get Xcode version. ${plistPath} does not exist on disk.`);
|
|
138
113
|
}
|
|
139
|
-
|
|
140
114
|
const version = await _support.plist.parsePlistFile(plistPath);
|
|
141
115
|
return _semver.default.coerce(version.CFBundleShortVersionString);
|
|
142
116
|
}
|
|
143
|
-
|
|
144
117
|
const getVersionMemoized = _lodash.default.memoize(function getVersionMemoized(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
145
118
|
return (0, _asyncbox.retry)(retries, getVersionWithoutRetry, timeout);
|
|
146
119
|
});
|
|
147
|
-
|
|
148
120
|
async function getVersion(parse = false, retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
149
121
|
const version = await getVersionMemoized(retries, timeout);
|
|
150
122
|
const versionString = version.patch > 0 ? version.version : `${version.major}.${version.minor}`;
|
|
151
|
-
|
|
152
123
|
if (!parse) {
|
|
153
124
|
return versionString;
|
|
154
125
|
}
|
|
155
|
-
|
|
156
126
|
return {
|
|
157
127
|
versionString,
|
|
158
128
|
versionFloat: parseFloat(versionString),
|
|
159
129
|
major: version.major,
|
|
160
130
|
minor: version.minor,
|
|
161
131
|
patch: version.patch > 0 ? version.patch : undefined,
|
|
162
|
-
|
|
163
132
|
toString() {
|
|
164
133
|
return versionString;
|
|
165
134
|
}
|
|
166
|
-
|
|
167
135
|
};
|
|
168
136
|
}
|
|
169
|
-
|
|
170
137
|
async function getCommandLineToolsVersion() {
|
|
171
138
|
const getVersionFunctions = [async () => {
|
|
172
139
|
let pkg = (await (0, _teen_process.exec)('pkgutil', ['--pkgs=com.apple.pkg.DevSDK_.*'])).stdout;
|
|
173
140
|
return (await (0, _teen_process.exec)('pkgutil', [`--pkg-info=${pkg.trim()}`])).stdout;
|
|
174
141
|
}, async () => (await (0, _teen_process.exec)('pkgutil', [`--pkg-info=com.apple.pkg.CLTools_Executables`])).stdout, async () => (await (0, _teen_process.exec)('pkgutil', [`--pkg-info=com.apple.pkg.DeveloperToolsCLI`])).stdout];
|
|
175
142
|
let stdout;
|
|
176
|
-
|
|
177
143
|
for (let getVersion of getVersionFunctions) {
|
|
178
144
|
try {
|
|
179
145
|
stdout = await getVersion();
|
|
@@ -194,74 +160,57 @@ async function getClangVersion() {
|
|
|
194
160
|
log.info('Cannot find clang executable on the local system. ' + 'Are Xcode Command Line Tools installed?');
|
|
195
161
|
return null;
|
|
196
162
|
}
|
|
197
|
-
|
|
198
163
|
const {
|
|
199
164
|
stdout
|
|
200
165
|
} = await (0, _teen_process.exec)('clang', ['--version']);
|
|
201
166
|
const match = /clang-([0-9.]+)/.exec(stdout);
|
|
202
|
-
|
|
203
167
|
if (!match) {
|
|
204
168
|
log.info(`Cannot parse clang version from ${stdout}`);
|
|
205
169
|
return null;
|
|
206
170
|
}
|
|
207
|
-
|
|
208
171
|
return match[1];
|
|
209
172
|
}
|
|
210
|
-
|
|
211
173
|
async function getAutomationTraceTemplatePathWithoutRetry(timeout = XCRUN_TIMEOUT) {
|
|
212
174
|
const xcodePath = await getPath(timeout);
|
|
213
|
-
const extensions = ['xrplugin', 'bundle'];
|
|
214
175
|
|
|
176
|
+
const extensions = ['xrplugin', 'bundle'];
|
|
215
177
|
const pathPrefix = _path.default.resolve(xcodePath, '../Applications/Instruments.app/Contents/PlugIns');
|
|
216
|
-
|
|
217
178
|
const pathSuffix = 'Contents/Resources/Automation.tracetemplate';
|
|
218
179
|
let automationTraceTemplatePaths = [_path.default.resolve(pathPrefix, `AutomationInstrument.${extensions[0]}`, pathSuffix), _path.default.resolve(pathPrefix, `AutomationInstrument.${extensions[1]}`, pathSuffix)];
|
|
219
|
-
|
|
220
180
|
if (await _support.fs.exists(automationTraceTemplatePaths[0])) {
|
|
221
181
|
return automationTraceTemplatePaths[0];
|
|
222
182
|
}
|
|
223
|
-
|
|
224
183
|
if (await _support.fs.exists(automationTraceTemplatePaths[1])) {
|
|
225
184
|
return automationTraceTemplatePaths[1];
|
|
226
185
|
}
|
|
227
|
-
|
|
228
186
|
const msg = 'Could not find Automation.tracetemplate in any of the following' + `locations ${automationTraceTemplatePaths.toString()}`;
|
|
229
187
|
log.error(msg);
|
|
230
188
|
throw new Error(msg);
|
|
231
189
|
}
|
|
232
|
-
|
|
233
190
|
const getAutomationTraceTemplatePath = _lodash.default.memoize(function getAutomationTraceTemplatePath(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
234
191
|
return (0, _asyncbox.retry)(retries, getAutomationTraceTemplatePathWithoutRetry, timeout);
|
|
235
192
|
});
|
|
236
|
-
|
|
237
193
|
exports.getAutomationTraceTemplatePath = getAutomationTraceTemplatePath;
|
|
238
|
-
|
|
239
194
|
async function getMaxIOSSDKWithoutRetry(timeout = XCRUN_TIMEOUT) {
|
|
240
195
|
const version = await getVersion(false, DEFAULT_NUMBER_OF_RETRIES, timeout);
|
|
241
|
-
|
|
242
196
|
if (version[0] === '4') {
|
|
243
197
|
return '6.1';
|
|
244
198
|
}
|
|
245
|
-
|
|
246
199
|
const args = ['--sdk', 'iphonesimulator', '--show-sdk-version'];
|
|
247
200
|
const {
|
|
248
201
|
stdout
|
|
249
202
|
} = await runXcrunCommand(args, timeout);
|
|
250
203
|
const sdkVersion = stdout.trim();
|
|
251
204
|
const match = /\d.\d/.exec(stdout);
|
|
252
|
-
|
|
253
205
|
if (!match) {
|
|
254
206
|
throw new Error(`xcrun returned a non-numeric iOS SDK version: '${sdkVersion}'`);
|
|
255
207
|
}
|
|
256
|
-
|
|
257
208
|
return sdkVersion;
|
|
258
209
|
}
|
|
259
|
-
|
|
260
210
|
async function getMaxIOSSDKFromXcodeVersion(timeout = XCRUN_TIMEOUT) {
|
|
261
211
|
const version = await getVersion(true, DEFAULT_NUMBER_OF_RETRIES, timeout);
|
|
262
212
|
return `${version.major + 2}.${version.minor}`;
|
|
263
213
|
}
|
|
264
|
-
|
|
265
214
|
const getMaxIOSSDK = _lodash.default.memoize(function getMaxIOSSDK(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
266
215
|
try {
|
|
267
216
|
return (0, _asyncbox.retry)(retries, getMaxIOSSDKWithoutRetry, timeout);
|
|
@@ -271,29 +220,22 @@ const getMaxIOSSDK = _lodash.default.memoize(function getMaxIOSSDK(retries = DEF
|
|
|
271
220
|
return getMaxIOSSDKFromXcodeVersion(timeout);
|
|
272
221
|
}
|
|
273
222
|
});
|
|
274
|
-
|
|
275
223
|
exports.getMaxIOSSDK = getMaxIOSSDK;
|
|
276
|
-
|
|
277
224
|
async function getMaxTVOSSDKWithoutRetry(timeout = XCRUN_TIMEOUT) {
|
|
278
225
|
const args = ['--sdk', 'appletvsimulator', '--show-sdk-version'];
|
|
279
226
|
const {
|
|
280
227
|
stdout
|
|
281
228
|
} = await runXcrunCommand(args, timeout);
|
|
282
229
|
const sdkVersion = stdout.trim();
|
|
283
|
-
|
|
284
230
|
if (isNaN(parseFloat(sdkVersion))) {
|
|
285
231
|
throw new Error(`xcrun returned a non-numeric tvOS SDK version: '${sdkVersion}'`);
|
|
286
232
|
}
|
|
287
|
-
|
|
288
233
|
return sdkVersion;
|
|
289
234
|
}
|
|
290
|
-
|
|
291
235
|
const getMaxTVOSSDK = _lodash.default.memoize(function getMaxTVOSSDK(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
292
236
|
return (0, _asyncbox.retry)(retries, getMaxTVOSSDKWithoutRetry, timeout);
|
|
293
237
|
});
|
|
294
|
-
|
|
295
238
|
exports.getMaxTVOSSDK = getMaxTVOSSDK;
|
|
296
|
-
|
|
297
239
|
async function getConnectedDevices(timeout = XCRUN_TIMEOUT) {
|
|
298
240
|
const cmd = '/usr/sbin/system_profiler';
|
|
299
241
|
const args = ['-xml', 'SPUSBDataType'];
|
|
@@ -305,10 +247,8 @@ async function getConnectedDevices(timeout = XCRUN_TIMEOUT) {
|
|
|
305
247
|
let plistContent = (0, _plist.parse)(stdout);
|
|
306
248
|
let devicesFound = [];
|
|
307
249
|
let entriesToSearch = [plistContent[0]];
|
|
308
|
-
|
|
309
250
|
while (entriesToSearch.length > 0) {
|
|
310
251
|
let currentEntry = entriesToSearch.pop();
|
|
311
|
-
|
|
312
252
|
if (currentEntry instanceof Array) {
|
|
313
253
|
entriesToSearch = entriesToSearch.concat(currentEntry);
|
|
314
254
|
} else if (currentEntry._name && currentEntry._name.substring(0, 4) === 'iPad' || currentEntry._name && currentEntry._name.substring(0, 6) === 'iPhone' || currentEntry._name && _lodash.default.includes(currentEntry._name, 'Apple TV')) {
|
|
@@ -323,35 +263,26 @@ async function getConnectedDevices(timeout = XCRUN_TIMEOUT) {
|
|
|
323
263
|
entriesToSearch = entriesToSearch.concat(currentEntry._items);
|
|
324
264
|
}
|
|
325
265
|
}
|
|
326
|
-
|
|
327
266
|
return devicesFound;
|
|
328
267
|
}
|
|
329
|
-
|
|
330
268
|
async function getInstrumentsPathWithoutRetry(timeout = XCRUN_TIMEOUT) {
|
|
331
269
|
const args = ['-find', 'instruments'];
|
|
332
270
|
let {
|
|
333
271
|
stdout
|
|
334
272
|
} = await runXcrunCommand(args, timeout);
|
|
335
|
-
|
|
336
273
|
if (!stdout) {
|
|
337
274
|
stdout = '';
|
|
338
275
|
}
|
|
339
|
-
|
|
340
276
|
let instrumentsPath = stdout.trim();
|
|
341
|
-
|
|
342
277
|
if (!instrumentsPath) {
|
|
343
278
|
throw new Error(`Could not find path to instruments binary using 'xcrun ${args.join(' ')}'`);
|
|
344
279
|
}
|
|
345
|
-
|
|
346
280
|
return instrumentsPath;
|
|
347
281
|
}
|
|
348
|
-
|
|
349
282
|
const getInstrumentsPath = _lodash.default.memoize(function getInstrumentsPath(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
350
283
|
return (0, _asyncbox.retry)(retries, getInstrumentsPathWithoutRetry, timeout);
|
|
351
284
|
});
|
|
352
|
-
|
|
353
285
|
exports.getInstrumentsPath = getInstrumentsPath;
|
|
354
|
-
|
|
355
286
|
function clearInternalCache() {
|
|
356
287
|
const memoized = [getPath, getVersionMemoized, getAutomationTraceTemplatePath, getMaxIOSSDK, getMaxTVOSSDK, getInstrumentsPath];
|
|
357
288
|
memoized.forEach(f => {
|
|
@@ -360,4 +291,4 @@ function clearInternalCache() {
|
|
|
360
291
|
}
|
|
361
292
|
});
|
|
362
293
|
}
|
|
363
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnYiLCJwcm9jZXNzIiwiWENSVU5fVElNRU9VVCIsIlhDT0RFX1NVQkRJUiIsIkRFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJoYXNFeHBlY3RlZFN1YkRpciIsInBhdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJydW5YY3J1bkNvbW1hbmQiLCJhcmdzIiwidGltZW91dCIsInJlcyIsImV4ZWMiLCJfIiwiaXNVbmRlZmluZWQiLCJFcnJvciIsImpvaW4iLCJlcnIiLCJzdGRlcnIiLCJtZXNzYWdlIiwiZ2V0UGF0aEZyb21TeW1saW5rIiwiZmFpbE1lc3NhZ2UiLCJ3YXJuIiwic3ltbGlua1BhdGgiLCJsZWdhY3lTeW1saW5rUGF0aCIsInhjb2RlUGF0aCIsInV0aWwiLCJoYXNDb250ZW50IiwiREVWRUxPUEVSX0RJUiIsImN1c3RvbVBhdGgiLCJmcyIsImV4aXN0cyIsIm1lc2ciLCJyZWFkbGluayIsInJlcGxhY2UiLCJSZWdFeHAiLCJ0cmltIiwibXNnIiwiZ2V0UGF0aEZyb21YY29kZVNlbGVjdCIsInN0ZG91dCIsInhjb2RlRm9sZGVyUGF0aCIsImVycm9yQW5kVGhyb3ciLCJnZXRQYXRoIiwibWVtb2l6ZSIsImUiLCJnZXRWZXJzaW9uV2l0aG91dFJldHJ5IiwicGxpc3RQYXRoIiwicmVzb2x2ZSIsInZlcnNpb24iLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIiwic2VtdmVyIiwiY29lcmNlIiwiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciLCJnZXRWZXJzaW9uTWVtb2l6ZWQiLCJyZXRyaWVzIiwicmV0cnkiLCJnZXRWZXJzaW9uIiwicGFyc2UiLCJ2ZXJzaW9uU3RyaW5nIiwicGF0Y2giLCJtYWpvciIsIm1pbm9yIiwidmVyc2lvbkZsb2F0IiwicGFyc2VGbG9hdCIsInVuZGVmaW5lZCIsInRvU3RyaW5nIiwiZ2V0Q29tbWFuZExpbmVUb29sc1ZlcnNpb24iLCJnZXRWZXJzaW9uRnVuY3Rpb25zIiwicGtnIiwiaWduIiwibWF0Y2giLCJnZXRDbGFuZ1ZlcnNpb24iLCJ3aGljaCIsImluZm8iLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnkiLCJleHRlbnNpb25zIiwicGF0aFByZWZpeCIsInBhdGhTdWZmaXgiLCJhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzIiwiZXJyb3IiLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgiLCJnZXRNYXhJT1NTREtXaXRob3V0UmV0cnkiLCJzZGtWZXJzaW9uIiwiZ2V0TWF4SU9TU0RLRnJvbVhjb2RlVmVyc2lvbiIsImdldE1heElPU1NESyIsImdldE1heFRWT1NTREtXaXRob3V0UmV0cnkiLCJpc05hTiIsImdldE1heFRWT1NTREsiLCJnZXRDb25uZWN0ZWREZXZpY2VzIiwiY21kIiwicGxpc3RDb250ZW50IiwicGFyc2VQbGlzdERhdGEiLCJkZXZpY2VzRm91bmQiLCJlbnRyaWVzVG9TZWFyY2giLCJjdXJyZW50RW50cnkiLCJwb3AiLCJBcnJheSIsImNvbmNhdCIsIl9uYW1lIiwiaW5jbHVkZXMiLCJkZXZpY2VJbmZvIiwibmFtZSIsInVkaWQiLCJzZXJpYWxfbnVtIiwicHJvZHVjdElkIiwicHJvZHVjdF9pZCIsImRldmljZVZlcnNpb24iLCJiY2RfZGV2aWNlIiwicHVzaCIsIl9pdGVtcyIsImdldEluc3RydW1lbnRzUGF0aFdpdGhvdXRSZXRyeSIsImluc3RydW1lbnRzUGF0aCIsImdldEluc3RydW1lbnRzUGF0aCIsImNsZWFySW50ZXJuYWxDYWNoZSIsIm1lbW9pemVkIiwiZm9yRWFjaCIsImYiLCJjYWNoZSIsIkNhY2hlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3hjb2RlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV0aWwsIGZzLCBwbGlzdCwgbG9nZ2VyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmV0cnkgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VQbGlzdERhdGEgfSBmcm9tICdwbGlzdCc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuXG5jb25zdCBlbnYgPSBwcm9jZXNzLmVudjtcblxuY29uc3QgWENSVU5fVElNRU9VVCA9IDE1MDAwO1xuY29uc3QgWENPREVfU1VCRElSID0gJy9Db250ZW50cy9EZXZlbG9wZXInO1xuY29uc3QgREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUyA9IDM7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1hjb2RlJyk7XG5cblxuZnVuY3Rpb24gaGFzRXhwZWN0ZWRTdWJEaXIgKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKHBhdGgubGVuZ3RoIC0gWENPREVfU1VCRElSLmxlbmd0aCkgPT09IFhDT0RFX1NVQkRJUjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuWGNydW5Db21tYW5kIChhcmdzLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4ZWMoJ3hjcnVuJywgYXJncywge3RpbWVvdXR9KTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChyZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdGhpbmcgcmV0dXJuZWQgZnJvbSB0cnlpbmcgdG8gcnVuICd4Y3J1biAke2FyZ3Muam9pbignICcpfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gdGhlIHRydWUgZXJyb3IgY2FuIGJlIGhpZGRlbiB3aXRoaW4gdGhlIHN0ZGVyclxuICAgIGlmIChlcnIuc3RkZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGAke2Vyci5tZXNzYWdlfTogJHtlcnIuc3RkZXJyfWA7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFBhdGhGcm9tU3ltbGluayAoZmFpbE1lc3NhZ2UpIHtcbiAgLy8gTm9kZSdzIGludm9jYXRpb24gb2YgeGNvZGUtc2VsZWN0IHNvbWV0aW1lcyBmbGFrZXMgYW5kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAvLyBOb3QgY2xlYXIgd2h5LiBBcyBhIHdvcmthcm91bmQsIEFwcGl1bSBjYW4gcmVsaWFibHkgZGVkdWNlIHRoZSB2ZXJzaW9uIGluIHVzZSBieSBjaGVja2luZ1xuICAvLyB0aGUgbG9jYXRpb25zIHhjb2RlLXNlbGVjdCB1c2VzIHRvIHN0b3JlIHRoZSBzZWxlY3RlZCB2ZXJzaW9uJ3MgcGF0aC4gVGhpcyBzaG91bGQgYmUgMTAwJVxuICAvLyByZWxpYWJsZSBzbyBsb25nIGFzIHRoZSBsaW5rIGxvY2F0aW9ucyByZW1haW4gdGhlIHNhbWUuIEhvd2V2ZXIsIHNpbmNlIHdlJ3JlIHJlbHlpbmcgb25cbiAgLy8gaGFyZGNvZGVkIHBhdGhzLCB0aGlzIGFwcHJvYWNoIHdpbGwgYnJlYWsgdGhlIG5leHQgdGltZSBBcHBsZSBjaGFuZ2VzIHRoZSBzeW1saW5rIGxvY2F0aW9uLlxuICBsb2cud2FybihgRmluZGluZyBYY29kZVBhdGggYnkgc3ltbGluayBiZWNhdXNlICR7ZmFpbE1lc3NhZ2V9YCk7XG5cbiAgY29uc3Qgc3ltbGlua1BhdGggPSAnL3Zhci9kYi94Y29kZV9zZWxlY3RfbGluayc7XG4gIGNvbnN0IGxlZ2FjeVN5bWxpbmtQYXRoID0gJy91c3Ivc2hhcmUveGNvZGUtc2VsZWN0L3hjb2RlX2Rpcl9saW5rJzsgLy8gIFhjb2RlIDwgNS54XG4gIGxldCB4Y29kZVBhdGggPSBudWxsO1xuXG4gIC8vIHhjb2RlLXNlbGVjdCBhbGxvd3MgdXNlcnMgdG8gb3ZlcnJpZGUgaXRzIHNldHRpbmdzIHdpdGggdGhlIERFVkVMT1BFUl9ESVIgZW52IHZhcixcbiAgLy8gc28gY2hlY2sgdGhhdCBmaXJzdFxuICBpZiAodXRpbC5oYXNDb250ZW50KGVudi5ERVZFTE9QRVJfRElSKSkge1xuICAgIGNvbnN0IGN1c3RvbVBhdGggPSBoYXNFeHBlY3RlZFN1YkRpcihlbnYuREVWRUxPUEVSX0RJUilcbiAgICAgID8gZW52LkRFVkVMT1BFUl9ESVJcbiAgICAgIDogZW52LkRFVkVMT1BFUl9ESVIgKyBYQ09ERV9TVUJESVI7XG5cbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGN1c3RvbVBhdGgpKSB7XG4gICAgICB4Y29kZVBhdGggPSBjdXN0b21QYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbWVzZyA9IGBDb3VsZCBub3QgZmluZCBwYXRoIHRvIFhjb2RlLCBlbnZpcm9ubWVudCB2YXJpYWJsZSBgICtcbiAgICAgICAgICAgICAgICAgYERFVkVMT1BFUl9ESVIgc2V0IHRvOiAke2Vudi5ERVZFTE9QRVJfRElSfSBgICtcbiAgICAgICAgICAgICAgICAgYGJ1dCBubyBYY29kZSBmb3VuZGA7XG4gICAgICBsb2cud2FybihtZXNnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXdhaXQgZnMuZXhpc3RzKHN5bWxpbmtQYXRoKSkge1xuICAgIHhjb2RlUGF0aCA9IGF3YWl0IGZzLnJlYWRsaW5rKHN5bWxpbmtQYXRoKTtcbiAgfSBlbHNlIGlmIChhd2FpdCBmcy5leGlzdHMobGVnYWN5U3ltbGlua1BhdGgpKSB7XG4gICAgeGNvZGVQYXRoID0gYXdhaXQgZnMucmVhZGxpbmsobGVnYWN5U3ltbGlua1BhdGgpO1xuICB9XG5cbiAgaWYgKHhjb2RlUGF0aCkge1xuICAgIHJldHVybiB4Y29kZVBhdGgucmVwbGFjZShuZXcgUmVnRXhwKCcvJCcpLCAnJykudHJpbSgpO1xuICB9XG5cbiAgLy8gV2Ugc2hvdWxkIG9ubHkgZ2V0IGhlcmUgaXMgd2UgZmFpbGVkIHRvIGNhcHR1cmUgeGNvZGUtc2VsZWN0J3Mgc3Rkb3V0IGFuZCBvdXJcbiAgLy8gb3RoZXIgY2hlY2tzIGZhaWxlZC4gRWl0aGVyIEFwcGxlIGhhcyBtb3ZlZCB0aGUgc3ltbGluayB0byBhIG5ldyBsb2NhdGlvbiBvciB0aGUgdXNlclxuICAvLyBpcyBub3QgdXNpbmcgdGhlIGRlZmF1bHQgaW5zdGFsbC4gOTkuOTk5JSBjaGFuY2UgaXQncyB0aGUgbGF0dGVyLCBzbyBpc3N1ZSBhIHdhcm5pbmdcbiAgLy8gc2hvdWxkIHdlIGV2ZXIgaGl0IHRoZSBlZGdlIGNhc2UuXG4gIGxldCBtc2cgPSBgQ291bGQgbm90IGZpbmQgcGF0aCB0byBYY29kZSBieSBzeW1saW5rcyBsb2NhdGVkIGluICR7c3ltbGlua1BhdGh9LCBvciAke2xlZ2FjeVN5bWxpbmtQYXRofWA7XG4gIGxvZy53YXJuKG1zZyk7XG4gIHRocm93IG5ldyBFcnJvcihtc2cpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQYXRoRnJvbVhjb2RlU2VsZWN0ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBsZXQge3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZS1zZWxlY3QnLCBbJy0tcHJpbnQtcGF0aCddLCB7dGltZW91dH0pO1xuXG4gIC8vIHRyaW0gYW5kIHJlbW92ZSB0cmFpbGluZyBzbGFzaFxuICBjb25zdCB4Y29kZUZvbGRlclBhdGggPSBzdGRvdXQucmVwbGFjZSgvXFwvJC8sICcnKS50cmltKCk7XG5cbiAgaWYgKCF1dGlsLmhhc0NvbnRlbnQoeGNvZGVGb2xkZXJQYXRoKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KCd4Y29kZS1zZWxlY3QgcmV0dXJuZWQgYW4gZW1wdHkgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoYXdhaXQgZnMuZXhpc3RzKHhjb2RlRm9sZGVyUGF0aCkpIHtcbiAgICByZXR1cm4geGNvZGVGb2xkZXJQYXRoO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG1zZyA9IGB4Y29kZS1zZWxlY3QgY291bGQgbm90IGZpbmQgeGNvZGUuIFBhdGggJyR7eGNvZGVGb2xkZXJQYXRofScgZG9lcyBub3QgZXhpc3QuYDtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhtc2cpO1xuICB9XG59XG5cbmNvbnN0IGdldFBhdGggPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0UGF0aCAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgLy8gZmlyc3Qgd2UgdHJ5IHVzaW5nIHhjb2RlLXNlbGVjdCB0byBmaW5kIHRoZSBwYXRoXG4gIC8vIHRoZW4gd2UgdHJ5IHVzaW5nIHRoZSBzeW1saW5rcyB0aGF0IEFwcGxlIGhhcyBieSBkZWZhdWx0XG4gIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0UGF0aEZyb21YY29kZVNlbGVjdCh0aW1lb3V0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0UGF0aEZyb21TeW1saW5rKGUubWVzc2FnZSk7XG4gICAgfVxuICB9KSgpO1xufSk7XG5cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgeGNvZGVQYXRoID0gYXdhaXQgZ2V0UGF0aCh0aW1lb3V0KTtcblxuICAvLyB3ZSB3YW50IHRvIHJlYWQgdGhlIENGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIGZyb20gWGNvZGUncyBwbGlzdC5cbiAgLy8gSXQgc2hvdWxkIGJlIGluIC9bcm9vdF0vWENvZGUuYXBwL0NvbnRlbnRzL1xuICBjb25zdCBwbGlzdFBhdGggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCAnLi4nLCAnSW5mby5wbGlzdCcpO1xuXG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHBsaXN0UGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgWGNvZGUgdmVyc2lvbi4gJHtwbGlzdFBhdGh9IGRvZXMgbm90IGV4aXN0IG9uIGRpc2suYCk7XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocGxpc3RQYXRoKTtcbiAgcmV0dXJuIHNlbXZlci5jb2VyY2UodmVyc2lvbi5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyk7XG59XG5cbmNvbnN0IGdldFZlcnNpb25NZW1vaXplZCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0VmVyc2lvbk1lbW9pemVkIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFZlcnNpb24gKHBhcnNlID0gZmFsc2UsIHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbk1lbW9pemVkKHJldHJpZXMsIHRpbWVvdXQpO1xuICAvLyB4Y29kZSB2ZXJzaW9uIHN0cmluZ3MgYXJlIG5vdCBleGFjdGx5IHNlbXZlciBzdHJpbmc6IHBhdGNoIHZlcnNpb25zIG9mIDBcbiAgLy8gYXJlIHJlbW92ZWQgKGUuZy4sICcxMC4wLjAnID0+ICcxMC4wJylcbiAgY29uc3QgdmVyc2lvblN0cmluZyA9IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi52ZXJzaW9uIDogYCR7dmVyc2lvbi5tYWpvcn0uJHt2ZXJzaW9uLm1pbm9yfWA7XG4gIGlmICghcGFyc2UpIHtcbiAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvblN0cmluZyxcbiAgICB2ZXJzaW9uRmxvYXQ6IHBhcnNlRmxvYXQodmVyc2lvblN0cmluZyksXG4gICAgbWFqb3I6IHZlcnNpb24ubWFqb3IsXG4gICAgbWlub3I6IHZlcnNpb24ubWlub3IsXG4gICAgcGF0Y2g6IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi5wYXRjaCA6IHVuZGVmaW5lZCxcbiAgICB0b1N0cmluZyAoKSB7XG4gICAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiAoKSB7XG4gIC8vIHRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2F5cyB0aGF0IHRoZSBDTEkgdG9vbHMgdmVyc2lvbiBoYXMgYmVlblxuICAvLyByZXByZXNlbnRlZC4gVHJ5IHRoZW0gZnJvbSBtb3N0IHJlbGlhYmxlIHRvIGxlYXN0LCBmYWxsaW5nIGRvd24gdGhlIGNoYWluXG4gIGNvbnN0IGdldFZlcnNpb25GdW5jdGlvbnMgPSBbXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHBrZyA9IChhd2FpdCBleGVjKCdwa2d1dGlsJywgWyctLXBrZ3M9Y29tLmFwcGxlLnBrZy5EZXZTREtfLionXSkpLnN0ZG91dDtcbiAgICAgIHJldHVybiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz0ke3BrZy50cmltKCl9YF0pKS5zdGRvdXQ7XG4gICAgfSxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkNMVG9vbHNfRXhlY3V0YWJsZXNgXSkpLnN0ZG91dCxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkRldmVsb3BlclRvb2xzQ0xJYF0pKS5zdGRvdXQsXG4gIF07XG4gIGxldCBzdGRvdXQ7XG4gIGZvciAobGV0IGdldFZlcnNpb24gb2YgZ2V0VmVyc2lvbkZ1bmN0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICBzdGRvdXQgPSBhd2FpdCBnZXRWZXJzaW9uKCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIHN0ZG91dCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vIHN0ZG91dCBzaG91bGQgaGF2ZSBhIGxpbmUgbGlrZSBgdmVyc2lvbjogOC4wLjAuMC4xLjE0NzI0MzU4ODFgXG4gIGxldCBtYXRjaCA9IC9edmVyc2lvbjogKC4rKSQvbS5leGVjKHN0ZG91dCk7IC8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvSFYzeDRkLzFcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaHR0cHM6Ly90cmFjLm1hY3BvcnRzLm9yZy93aWtpL1hjb2RlVmVyc2lvbkluZm9cbiAqIHRvIHNlZSB0aGUgYWN0dWFsIG1hcHBpbmcgYmV0d2VlbiBjbGFuZyBhbmQgb3RoZXIgY29tcG9uZW50cy5cbiAqXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGFjdHVhbCBDbGFuZyB2ZXJzaW9uIGluIHgueC54Lnggb3IgeC54LnggZm9ybWF0LFxuICogd2hpY2ggaXMgc3VwcGxpZWQgd2l0aCBDb21tYW5kIExpbmUgVG9vbHMuIGBudWxsYCBpcyByZXR1cm5lZFxuICogaWYgQ0xUIGFyZSBub3QgaW5zdGFsbGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDbGFuZ1ZlcnNpb24gKCkge1xuICB0cnkge1xuICAgIGF3YWl0IGZzLndoaWNoKCdjbGFuZycpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmluZm8oJ0Nhbm5vdCBmaW5kIGNsYW5nIGV4ZWN1dGFibGUgb24gdGhlIGxvY2FsIHN5c3RlbS4gJyArXG4gICAgICAnQXJlIFhjb2RlIENvbW1hbmQgTGluZSBUb29scyBpbnN0YWxsZWQ/Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdjbGFuZycsIFsnLS12ZXJzaW9uJ10pO1xuICBjb25zdCBtYXRjaCA9IC9jbGFuZy0oWzAtOS5dKykvLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIGxvZy5pbmZvKGBDYW5ub3QgcGFyc2UgY2xhbmcgdmVyc2lvbiBmcm9tICR7c3Rkb3V0fWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBtYXRjaFsxXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB4Y29kZVBhdGggPSBhd2FpdCBnZXRQYXRoKHRpbWVvdXQpO1xuXG4gIC8vIGZvciBpb3MgOCBhbmQgdXAsIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgQXV0aW9tYXRpb25JbnN0cnVtZW50IGNoYW5nZWQuXG4gIC8vIHJhdGhlciB0aGFuIHdhc3RlIHRpbWUgZ2V0dGluZyB0aGUgaU9TU0RLVmVyc2lvbiwganVzdCBnZXQgYm90aCBwYXRocyBhbmQgc2VlIHdoaWNoIG9uZSBleGlzdHNcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsneHJwbHVnaW4nLCAnYnVuZGxlJ107XG4gIGNvbnN0IHBhdGhQcmVmaXggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCAnLi4vQXBwbGljYXRpb25zL0luc3RydW1lbnRzLmFwcC9Db250ZW50cy9QbHVnSW5zJyk7XG4gIGNvbnN0IHBhdGhTdWZmaXggPSAnQ29udGVudHMvUmVzb3VyY2VzL0F1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSc7XG4gIGxldCBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzID0gW1xuICAgIHBhdGgucmVzb2x2ZShwYXRoUHJlZml4LCBgQXV0b21hdGlvbkluc3RydW1lbnQuJHtleHRlbnNpb25zWzBdfWAsIHBhdGhTdWZmaXgpLFxuICAgIHBhdGgucmVzb2x2ZShwYXRoUHJlZml4LCBgQXV0b21hdGlvbkluc3RydW1lbnQuJHtleHRlbnNpb25zWzFdfWAsIHBhdGhTdWZmaXgpXG4gIF07XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzBdKSkge1xuICAgIHJldHVybiBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzBdO1xuICB9XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzFdKSkge1xuICAgIHJldHVybiBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzFdO1xuICB9XG5cbiAgY29uc3QgbXNnID0gJ0NvdWxkIG5vdCBmaW5kIEF1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZycgK1xuICAgICAgICAgICAgICBgbG9jYXRpb25zICR7YXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRocy50b1N0cmluZygpfWA7XG4gIGxvZy5lcnJvcihtc2cpO1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcblxufVxuXG5jb25zdCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGggPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCAocmV0cmllcyA9IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gICAgcmV0dXJuIHJldHJ5KHJldHJpZXMsIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldFZlcnNpb24oZmFsc2UsIERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQpO1xuICBpZiAodmVyc2lvblswXSA9PT0gJzQnKSB7XG4gICAgcmV0dXJuICc2LjEnO1xuICB9XG5cbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnaXBob25lc2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBjb25zdCBzZGtWZXJzaW9uID0gc3Rkb3V0LnRyaW0oKTtcbiAgY29uc3QgbWF0Y2ggPSAvXFxkLlxcZC8uZXhlYyhzdGRvdXQpO1xuXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHhjcnVuIHJldHVybmVkIGEgbm9uLW51bWVyaWMgaU9TIFNESyB2ZXJzaW9uOiAnJHtzZGtWZXJzaW9ufSdgKTtcbiAgfVxuXG4gIHJldHVybiBzZGtWZXJzaW9uO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRNYXhJT1NTREtGcm9tWGNvZGVWZXJzaW9uICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbih0cnVlLCBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0KTtcbiAgLy8gYXMgb2Ygbm93LCB0aGUgaU9TIHZlcnNpb24gYXNzb2NpYXRlZCB3aXRoIGFuIFhjb2RlIHZlcnNpb24gaXNcbiAgLy8ganVzdCB0aGUgWGNvZGUgdmVyc2lvbiArIDJcbiAgcmV0dXJuIGAke3ZlcnNpb24ubWFqb3IgKyAyfS4ke3ZlcnNpb24ubWlub3J9YDtcbn1cblxuY29uc3QgZ2V0TWF4SU9TU0RLID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiBnZXRNYXhJT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBVbmFibGUgdG8gcmV0cmlldmUgbWF4aW11bSBpT1MgdmVyc2lvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGxvZy53YXJuKCdHdWVzc2luZyBmcm9tIFhjb2RlIHZlcnNpb24nKTtcbiAgICAgIHJldHVybiBnZXRNYXhJT1NTREtGcm9tWGNvZGVWZXJzaW9uKHRpbWVvdXQpO1xuICAgIH1cbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnYXBwbGV0dnNpbXVsYXRvcicsICctLXNob3ctc2RrLXZlcnNpb24nXTtcbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBydW5YY3J1bkNvbW1hbmQoYXJncywgdGltZW91dCk7XG5cbiAgY29uc3Qgc2RrVmVyc2lvbiA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKGlzTmFOKHBhcnNlRmxvYXQoc2RrVmVyc2lvbikpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB4Y3J1biByZXR1cm5lZCBhIG5vbi1udW1lcmljIHR2T1MgU0RLIHZlcnNpb246ICcke3Nka1ZlcnNpb259J2ApO1xuICB9XG5cbiAgcmV0dXJuIHNka1ZlcnNpb247XG59XG5cbmNvbnN0IGdldE1heFRWT1NTREsgPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIGdldE1heFRWT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ubmVjdGVkRGV2aWNlcyAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgY21kID0gJy91c3Ivc2Jpbi9zeXN0ZW1fcHJvZmlsZXInO1xuICBjb25zdCBhcmdzID0gWycteG1sJywgJ1NQVVNCRGF0YVR5cGUnXTtcbiAgbGV0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyhjbWQsIGFyZ3MsIHt0aW1lb3V0fSk7XG4gIGxldCBwbGlzdENvbnRlbnQgPSBwYXJzZVBsaXN0RGF0YShzdGRvdXQpO1xuXG4gIGxldCBkZXZpY2VzRm91bmQgPSBbXTtcbiAgbGV0IGVudHJpZXNUb1NlYXJjaCA9IFtwbGlzdENvbnRlbnRbMF1dO1xuICB3aGlsZSAoZW50cmllc1RvU2VhcmNoLmxlbmd0aCA+IDApIHtcbiAgICBsZXQgY3VycmVudEVudHJ5ID0gZW50cmllc1RvU2VhcmNoLnBvcCgpO1xuICAgIGlmIChjdXJyZW50RW50cnkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgZW50cmllc1RvU2VhcmNoID0gZW50cmllc1RvU2VhcmNoLmNvbmNhdChjdXJyZW50RW50cnkpO1xuICAgIH0gZWxzZSBpZiAoKGN1cnJlbnRFbnRyeS5fbmFtZSAmJlxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5fbmFtZS5zdWJzdHJpbmcoMCwgNCkgPT09ICdpUGFkJykgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiZcbiAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkuX25hbWUuc3Vic3RyaW5nKDAsIDYpID09PSAnaVBob25lJykgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiYgXy5pbmNsdWRlcyhjdXJyZW50RW50cnkuX25hbWUsICdBcHBsZSBUVicpKSkge1xuICAgICAgbGV0IGRldmljZUluZm8gPSB7XG4gICAgICAgIG5hbWU6IGN1cnJlbnRFbnRyeS5fbmFtZSxcbiAgICAgICAgdWRpZDogY3VycmVudEVudHJ5LnNlcmlhbF9udW0sXG4gICAgICAgIHByb2R1Y3RJZDogY3VycmVudEVudHJ5LnByb2R1Y3RfaWQsXG4gICAgICAgIGRldmljZVZlcnNpb246IGN1cnJlbnRFbnRyeS5iY2RfZGV2aWNlXG4gICAgICB9O1xuICAgICAgZGV2aWNlc0ZvdW5kLnB1c2goZGV2aWNlSW5mbyk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50RW50cnkuX2l0ZW1zKSB7XG4gICAgICBlbnRyaWVzVG9TZWFyY2ggPSBlbnRyaWVzVG9TZWFyY2guY29uY2F0KGN1cnJlbnRFbnRyeS5faXRlbXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGV2aWNlc0ZvdW5kO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRJbnN0cnVtZW50c1BhdGhXaXRob3V0UmV0cnkgKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGNvbnN0IGFyZ3MgPSBbJy1maW5kJywgJ2luc3RydW1lbnRzJ107XG4gIGxldCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBpZiAoIXN0ZG91dCkge1xuICAgIHN0ZG91dCA9ICcnO1xuICB9XG5cbiAgbGV0IGluc3RydW1lbnRzUGF0aCA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKCFpbnN0cnVtZW50c1BhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHBhdGggdG8gaW5zdHJ1bWVudHMgYmluYXJ5IHVzaW5nICd4Y3J1biAke2FyZ3Muam9pbignICcpfSdgKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVtZW50c1BhdGg7XG59XG5cbmNvbnN0IGdldEluc3RydW1lbnRzUGF0aCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0SW5zdHJ1bWVudHNQYXRoIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0SW5zdHJ1bWVudHNQYXRoV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuZnVuY3Rpb24gY2xlYXJJbnRlcm5hbENhY2hlICgpIHtcblxuICAvLyBtZW1vaXplZCBmdW5jdGlvbnNcbiAgY29uc3QgbWVtb2l6ZWQgPSBbXG4gICAgZ2V0UGF0aCwgZ2V0VmVyc2lvbk1lbW9pemVkLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgICBnZXRNYXhUVk9TU0RLLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIF07XG5cbiAgbWVtb2l6ZWQuZm9yRWFjaCgoZikgPT4ge1xuICAgIGlmIChmLmNhY2hlKSB7XG4gICAgICBmLmNhY2hlID0gbmV3IF8ubWVtb2l6ZS5DYWNoZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCB7XG4gIGdldFBhdGgsIGdldFZlcnNpb24sIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCwgZ2V0TWF4SU9TU0RLLFxuICBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnksIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q29ubmVjdGVkRGV2aWNlcywgY2xlYXJJbnRlcm5hbENhY2hlLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIGdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uLCBnZXRNYXhUVk9TU0RLLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LFxuICBnZXRDbGFuZ1ZlcnNpb24sXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsR0FBRyxHQUFHQyxPQUFPLENBQUNELEdBQXBCO0FBRUEsTUFBTUUsYUFBYSxHQUFHLEtBQXRCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLHFCQUFyQjtBQUNBLE1BQU1DLHlCQUF5QixHQUFHLENBQWxDOztBQUVBLE1BQU1DLEdBQUcsR0FBR0MsZUFBQSxDQUFPQyxTQUFQLENBQWlCLE9BQWpCLENBQVo7O0FBR0EsU0FBU0MsaUJBQVQsQ0FBNEJDLElBQTVCLEVBQWtDO0VBQ2hDLE9BQU9BLElBQUksQ0FBQ0MsU0FBTCxDQUFlRCxJQUFJLENBQUNFLE1BQUwsR0FBY1IsWUFBWSxDQUFDUSxNQUExQyxNQUFzRFIsWUFBN0Q7QUFDRDs7QUFFRCxlQUFlUyxlQUFmLENBQWdDQyxJQUFoQyxFQUFzQ0MsT0FBTyxHQUFHWixhQUFoRCxFQUErRDtFQUM3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
|
|
294
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnYiLCJwcm9jZXNzIiwiWENSVU5fVElNRU9VVCIsIlhDT0RFX1NVQkRJUiIsIkRFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJoYXNFeHBlY3RlZFN1YkRpciIsInBhdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJydW5YY3J1bkNvbW1hbmQiLCJhcmdzIiwidGltZW91dCIsInJlcyIsImV4ZWMiLCJfIiwiaXNVbmRlZmluZWQiLCJFcnJvciIsImpvaW4iLCJlcnIiLCJzdGRlcnIiLCJtZXNzYWdlIiwiZ2V0UGF0aEZyb21TeW1saW5rIiwiZmFpbE1lc3NhZ2UiLCJ3YXJuIiwic3ltbGlua1BhdGgiLCJsZWdhY3lTeW1saW5rUGF0aCIsInhjb2RlUGF0aCIsInV0aWwiLCJoYXNDb250ZW50IiwiREVWRUxPUEVSX0RJUiIsImN1c3RvbVBhdGgiLCJmcyIsImV4aXN0cyIsIm1lc2ciLCJyZWFkbGluayIsInJlcGxhY2UiLCJSZWdFeHAiLCJ0cmltIiwibXNnIiwiZ2V0UGF0aEZyb21YY29kZVNlbGVjdCIsInN0ZG91dCIsInhjb2RlRm9sZGVyUGF0aCIsImVycm9yQW5kVGhyb3ciLCJnZXRQYXRoIiwibWVtb2l6ZSIsImUiLCJnZXRWZXJzaW9uV2l0aG91dFJldHJ5IiwicGxpc3RQYXRoIiwicmVzb2x2ZSIsInZlcnNpb24iLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIiwic2VtdmVyIiwiY29lcmNlIiwiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciLCJnZXRWZXJzaW9uTWVtb2l6ZWQiLCJyZXRyaWVzIiwicmV0cnkiLCJnZXRWZXJzaW9uIiwicGFyc2UiLCJ2ZXJzaW9uU3RyaW5nIiwicGF0Y2giLCJtYWpvciIsIm1pbm9yIiwidmVyc2lvbkZsb2F0IiwicGFyc2VGbG9hdCIsInVuZGVmaW5lZCIsInRvU3RyaW5nIiwiZ2V0Q29tbWFuZExpbmVUb29sc1ZlcnNpb24iLCJnZXRWZXJzaW9uRnVuY3Rpb25zIiwicGtnIiwiaWduIiwibWF0Y2giLCJnZXRDbGFuZ1ZlcnNpb24iLCJ3aGljaCIsImluZm8iLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnkiLCJleHRlbnNpb25zIiwicGF0aFByZWZpeCIsInBhdGhTdWZmaXgiLCJhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzIiwiZXJyb3IiLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgiLCJnZXRNYXhJT1NTREtXaXRob3V0UmV0cnkiLCJzZGtWZXJzaW9uIiwiZ2V0TWF4SU9TU0RLRnJvbVhjb2RlVmVyc2lvbiIsImdldE1heElPU1NESyIsImdldE1heFRWT1NTREtXaXRob3V0UmV0cnkiLCJpc05hTiIsImdldE1heFRWT1NTREsiLCJnZXRDb25uZWN0ZWREZXZpY2VzIiwiY21kIiwicGxpc3RDb250ZW50IiwicGFyc2VQbGlzdERhdGEiLCJkZXZpY2VzRm91bmQiLCJlbnRyaWVzVG9TZWFyY2giLCJjdXJyZW50RW50cnkiLCJwb3AiLCJBcnJheSIsImNvbmNhdCIsIl9uYW1lIiwiaW5jbHVkZXMiLCJkZXZpY2VJbmZvIiwibmFtZSIsInVkaWQiLCJzZXJpYWxfbnVtIiwicHJvZHVjdElkIiwicHJvZHVjdF9pZCIsImRldmljZVZlcnNpb24iLCJiY2RfZGV2aWNlIiwicHVzaCIsIl9pdGVtcyIsImdldEluc3RydW1lbnRzUGF0aFdpdGhvdXRSZXRyeSIsImluc3RydW1lbnRzUGF0aCIsImdldEluc3RydW1lbnRzUGF0aCIsImNsZWFySW50ZXJuYWxDYWNoZSIsIm1lbW9pemVkIiwiZm9yRWFjaCIsImYiLCJjYWNoZSIsIkNhY2hlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3hjb2RlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV0aWwsIGZzLCBwbGlzdCwgbG9nZ2VyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmV0cnkgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VQbGlzdERhdGEgfSBmcm9tICdwbGlzdCc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuXG5jb25zdCBlbnYgPSBwcm9jZXNzLmVudjtcblxuY29uc3QgWENSVU5fVElNRU9VVCA9IDE1MDAwO1xuY29uc3QgWENPREVfU1VCRElSID0gJy9Db250ZW50cy9EZXZlbG9wZXInO1xuY29uc3QgREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUyA9IDM7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1hjb2RlJyk7XG5cblxuZnVuY3Rpb24gaGFzRXhwZWN0ZWRTdWJEaXIgKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKHBhdGgubGVuZ3RoIC0gWENPREVfU1VCRElSLmxlbmd0aCkgPT09IFhDT0RFX1NVQkRJUjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuWGNydW5Db21tYW5kIChhcmdzLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4ZWMoJ3hjcnVuJywgYXJncywge3RpbWVvdXR9KTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChyZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdGhpbmcgcmV0dXJuZWQgZnJvbSB0cnlpbmcgdG8gcnVuICd4Y3J1biAke2FyZ3Muam9pbignICcpfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gdGhlIHRydWUgZXJyb3IgY2FuIGJlIGhpZGRlbiB3aXRoaW4gdGhlIHN0ZGVyclxuICAgIGlmIChlcnIuc3RkZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGAke2Vyci5tZXNzYWdlfTogJHtlcnIuc3RkZXJyfWA7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFBhdGhGcm9tU3ltbGluayAoZmFpbE1lc3NhZ2UpIHtcbiAgLy8gTm9kZSdzIGludm9jYXRpb24gb2YgeGNvZGUtc2VsZWN0IHNvbWV0aW1lcyBmbGFrZXMgYW5kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAvLyBOb3QgY2xlYXIgd2h5LiBBcyBhIHdvcmthcm91bmQsIEFwcGl1bSBjYW4gcmVsaWFibHkgZGVkdWNlIHRoZSB2ZXJzaW9uIGluIHVzZSBieSBjaGVja2luZ1xuICAvLyB0aGUgbG9jYXRpb25zIHhjb2RlLXNlbGVjdCB1c2VzIHRvIHN0b3JlIHRoZSBzZWxlY3RlZCB2ZXJzaW9uJ3MgcGF0aC4gVGhpcyBzaG91bGQgYmUgMTAwJVxuICAvLyByZWxpYWJsZSBzbyBsb25nIGFzIHRoZSBsaW5rIGxvY2F0aW9ucyByZW1haW4gdGhlIHNhbWUuIEhvd2V2ZXIsIHNpbmNlIHdlJ3JlIHJlbHlpbmcgb25cbiAgLy8gaGFyZGNvZGVkIHBhdGhzLCB0aGlzIGFwcHJvYWNoIHdpbGwgYnJlYWsgdGhlIG5leHQgdGltZSBBcHBsZSBjaGFuZ2VzIHRoZSBzeW1saW5rIGxvY2F0aW9uLlxuICBsb2cud2FybihgRmluZGluZyBYY29kZVBhdGggYnkgc3ltbGluayBiZWNhdXNlICR7ZmFpbE1lc3NhZ2V9YCk7XG5cbiAgY29uc3Qgc3ltbGlua1BhdGggPSAnL3Zhci9kYi94Y29kZV9zZWxlY3RfbGluayc7XG4gIGNvbnN0IGxlZ2FjeVN5bWxpbmtQYXRoID0gJy91c3Ivc2hhcmUveGNvZGUtc2VsZWN0L3hjb2RlX2Rpcl9saW5rJzsgLy8gIFhjb2RlIDwgNS54XG4gIGxldCB4Y29kZVBhdGggPSBudWxsO1xuXG4gIC8vIHhjb2RlLXNlbGVjdCBhbGxvd3MgdXNlcnMgdG8gb3ZlcnJpZGUgaXRzIHNldHRpbmdzIHdpdGggdGhlIERFVkVMT1BFUl9ESVIgZW52IHZhcixcbiAgLy8gc28gY2hlY2sgdGhhdCBmaXJzdFxuICBpZiAodXRpbC5oYXNDb250ZW50KGVudi5ERVZFTE9QRVJfRElSKSkge1xuICAgIGNvbnN0IGN1c3RvbVBhdGggPSBoYXNFeHBlY3RlZFN1YkRpcihlbnYuREVWRUxPUEVSX0RJUilcbiAgICAgID8gZW52LkRFVkVMT1BFUl9ESVJcbiAgICAgIDogZW52LkRFVkVMT1BFUl9ESVIgKyBYQ09ERV9TVUJESVI7XG5cbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGN1c3RvbVBhdGgpKSB7XG4gICAgICB4Y29kZVBhdGggPSBjdXN0b21QYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbWVzZyA9IGBDb3VsZCBub3QgZmluZCBwYXRoIHRvIFhjb2RlLCBlbnZpcm9ubWVudCB2YXJpYWJsZSBgICtcbiAgICAgICAgICAgICAgICAgYERFVkVMT1BFUl9ESVIgc2V0IHRvOiAke2Vudi5ERVZFTE9QRVJfRElSfSBgICtcbiAgICAgICAgICAgICAgICAgYGJ1dCBubyBYY29kZSBmb3VuZGA7XG4gICAgICBsb2cud2FybihtZXNnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXdhaXQgZnMuZXhpc3RzKHN5bWxpbmtQYXRoKSkge1xuICAgIHhjb2RlUGF0aCA9IGF3YWl0IGZzLnJlYWRsaW5rKHN5bWxpbmtQYXRoKTtcbiAgfSBlbHNlIGlmIChhd2FpdCBmcy5leGlzdHMobGVnYWN5U3ltbGlua1BhdGgpKSB7XG4gICAgeGNvZGVQYXRoID0gYXdhaXQgZnMucmVhZGxpbmsobGVnYWN5U3ltbGlua1BhdGgpO1xuICB9XG5cbiAgaWYgKHhjb2RlUGF0aCkge1xuICAgIHJldHVybiB4Y29kZVBhdGgucmVwbGFjZShuZXcgUmVnRXhwKCcvJCcpLCAnJykudHJpbSgpO1xuICB9XG5cbiAgLy8gV2Ugc2hvdWxkIG9ubHkgZ2V0IGhlcmUgaXMgd2UgZmFpbGVkIHRvIGNhcHR1cmUgeGNvZGUtc2VsZWN0J3Mgc3Rkb3V0IGFuZCBvdXJcbiAgLy8gb3RoZXIgY2hlY2tzIGZhaWxlZC4gRWl0aGVyIEFwcGxlIGhhcyBtb3ZlZCB0aGUgc3ltbGluayB0byBhIG5ldyBsb2NhdGlvbiBvciB0aGUgdXNlclxuICAvLyBpcyBub3QgdXNpbmcgdGhlIGRlZmF1bHQgaW5zdGFsbC4gOTkuOTk5JSBjaGFuY2UgaXQncyB0aGUgbGF0dGVyLCBzbyBpc3N1ZSBhIHdhcm5pbmdcbiAgLy8gc2hvdWxkIHdlIGV2ZXIgaGl0IHRoZSBlZGdlIGNhc2UuXG4gIGxldCBtc2cgPSBgQ291bGQgbm90IGZpbmQgcGF0aCB0byBYY29kZSBieSBzeW1saW5rcyBsb2NhdGVkIGluICR7c3ltbGlua1BhdGh9LCBvciAke2xlZ2FjeVN5bWxpbmtQYXRofWA7XG4gIGxvZy53YXJuKG1zZyk7XG4gIHRocm93IG5ldyBFcnJvcihtc2cpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQYXRoRnJvbVhjb2RlU2VsZWN0ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBsZXQge3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZS1zZWxlY3QnLCBbJy0tcHJpbnQtcGF0aCddLCB7dGltZW91dH0pO1xuXG4gIC8vIHRyaW0gYW5kIHJlbW92ZSB0cmFpbGluZyBzbGFzaFxuICBjb25zdCB4Y29kZUZvbGRlclBhdGggPSBzdGRvdXQucmVwbGFjZSgvXFwvJC8sICcnKS50cmltKCk7XG5cbiAgaWYgKCF1dGlsLmhhc0NvbnRlbnQoeGNvZGVGb2xkZXJQYXRoKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KCd4Y29kZS1zZWxlY3QgcmV0dXJuZWQgYW4gZW1wdHkgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoYXdhaXQgZnMuZXhpc3RzKHhjb2RlRm9sZGVyUGF0aCkpIHtcbiAgICByZXR1cm4geGNvZGVGb2xkZXJQYXRoO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG1zZyA9IGB4Y29kZS1zZWxlY3QgY291bGQgbm90IGZpbmQgeGNvZGUuIFBhdGggJyR7eGNvZGVGb2xkZXJQYXRofScgZG9lcyBub3QgZXhpc3QuYDtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhtc2cpO1xuICB9XG59XG5cbmNvbnN0IGdldFBhdGggPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0UGF0aCAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgLy8gZmlyc3Qgd2UgdHJ5IHVzaW5nIHhjb2RlLXNlbGVjdCB0byBmaW5kIHRoZSBwYXRoXG4gIC8vIHRoZW4gd2UgdHJ5IHVzaW5nIHRoZSBzeW1saW5rcyB0aGF0IEFwcGxlIGhhcyBieSBkZWZhdWx0XG4gIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0UGF0aEZyb21YY29kZVNlbGVjdCh0aW1lb3V0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0UGF0aEZyb21TeW1saW5rKGUubWVzc2FnZSk7XG4gICAgfVxuICB9KSgpO1xufSk7XG5cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgeGNvZGVQYXRoID0gYXdhaXQgZ2V0UGF0aCh0aW1lb3V0KTtcblxuICAvLyB3ZSB3YW50IHRvIHJlYWQgdGhlIENGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIGZyb20gWGNvZGUncyBwbGlzdC5cbiAgLy8gSXQgc2hvdWxkIGJlIGluIC9bcm9vdF0vWENvZGUuYXBwL0NvbnRlbnRzL1xuICBjb25zdCBwbGlzdFBhdGggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCAnLi4nLCAnSW5mby5wbGlzdCcpO1xuXG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHBsaXN0UGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgWGNvZGUgdmVyc2lvbi4gJHtwbGlzdFBhdGh9IGRvZXMgbm90IGV4aXN0IG9uIGRpc2suYCk7XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocGxpc3RQYXRoKTtcbiAgcmV0dXJuIHNlbXZlci5jb2VyY2UodmVyc2lvbi5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyk7XG59XG5cbmNvbnN0IGdldFZlcnNpb25NZW1vaXplZCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0VmVyc2lvbk1lbW9pemVkIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFZlcnNpb24gKHBhcnNlID0gZmFsc2UsIHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbk1lbW9pemVkKHJldHJpZXMsIHRpbWVvdXQpO1xuICAvLyB4Y29kZSB2ZXJzaW9uIHN0cmluZ3MgYXJlIG5vdCBleGFjdGx5IHNlbXZlciBzdHJpbmc6IHBhdGNoIHZlcnNpb25zIG9mIDBcbiAgLy8gYXJlIHJlbW92ZWQgKGUuZy4sICcxMC4wLjAnID0+ICcxMC4wJylcbiAgY29uc3QgdmVyc2lvblN0cmluZyA9IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi52ZXJzaW9uIDogYCR7dmVyc2lvbi5tYWpvcn0uJHt2ZXJzaW9uLm1pbm9yfWA7XG4gIGlmICghcGFyc2UpIHtcbiAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvblN0cmluZyxcbiAgICB2ZXJzaW9uRmxvYXQ6IHBhcnNlRmxvYXQodmVyc2lvblN0cmluZyksXG4gICAgbWFqb3I6IHZlcnNpb24ubWFqb3IsXG4gICAgbWlub3I6IHZlcnNpb24ubWlub3IsXG4gICAgcGF0Y2g6IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi5wYXRjaCA6IHVuZGVmaW5lZCxcbiAgICB0b1N0cmluZyAoKSB7XG4gICAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiAoKSB7XG4gIC8vIHRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2F5cyB0aGF0IHRoZSBDTEkgdG9vbHMgdmVyc2lvbiBoYXMgYmVlblxuICAvLyByZXByZXNlbnRlZC4gVHJ5IHRoZW0gZnJvbSBtb3N0IHJlbGlhYmxlIHRvIGxlYXN0LCBmYWxsaW5nIGRvd24gdGhlIGNoYWluXG4gIGNvbnN0IGdldFZlcnNpb25GdW5jdGlvbnMgPSBbXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHBrZyA9IChhd2FpdCBleGVjKCdwa2d1dGlsJywgWyctLXBrZ3M9Y29tLmFwcGxlLnBrZy5EZXZTREtfLionXSkpLnN0ZG91dDtcbiAgICAgIHJldHVybiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz0ke3BrZy50cmltKCl9YF0pKS5zdGRvdXQ7XG4gICAgfSxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkNMVG9vbHNfRXhlY3V0YWJsZXNgXSkpLnN0ZG91dCxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkRldmVsb3BlclRvb2xzQ0xJYF0pKS5zdGRvdXQsXG4gIF07XG4gIGxldCBzdGRvdXQ7XG4gIGZvciAobGV0IGdldFZlcnNpb24gb2YgZ2V0VmVyc2lvbkZ1bmN0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICBzdGRvdXQgPSBhd2FpdCBnZXRWZXJzaW9uKCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIHN0ZG91dCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vIHN0ZG91dCBzaG91bGQgaGF2ZSBhIGxpbmUgbGlrZSBgdmVyc2lvbjogOC4wLjAuMC4xLjE0NzI0MzU4ODFgXG4gIGxldCBtYXRjaCA9IC9edmVyc2lvbjogKC4rKSQvbS5leGVjKHN0ZG91dCk7IC8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvSFYzeDRkLzFcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaHR0cHM6Ly90cmFjLm1hY3BvcnRzLm9yZy93aWtpL1hjb2RlVmVyc2lvbkluZm9cbiAqIHRvIHNlZSB0aGUgYWN0dWFsIG1hcHBpbmcgYmV0d2VlbiBjbGFuZyBhbmQgb3RoZXIgY29tcG9uZW50cy5cbiAqXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGFjdHVhbCBDbGFuZyB2ZXJzaW9uIGluIHgueC54Lnggb3IgeC54LnggZm9ybWF0LFxuICogd2hpY2ggaXMgc3VwcGxpZWQgd2l0aCBDb21tYW5kIExpbmUgVG9vbHMuIGBudWxsYCBpcyByZXR1cm5lZFxuICogaWYgQ0xUIGFyZSBub3QgaW5zdGFsbGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDbGFuZ1ZlcnNpb24gKCkge1xuICB0cnkge1xuICAgIGF3YWl0IGZzLndoaWNoKCdjbGFuZycpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmluZm8oJ0Nhbm5vdCBmaW5kIGNsYW5nIGV4ZWN1dGFibGUgb24gdGhlIGxvY2FsIHN5c3RlbS4gJyArXG4gICAgICAnQXJlIFhjb2RlIENvbW1hbmQgTGluZSBUb29scyBpbnN0YWxsZWQ/Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdjbGFuZycsIFsnLS12ZXJzaW9uJ10pO1xuICBjb25zdCBtYXRjaCA9IC9jbGFuZy0oWzAtOS5dKykvLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIGxvZy5pbmZvKGBDYW5ub3QgcGFyc2UgY2xhbmcgdmVyc2lvbiBmcm9tICR7c3Rkb3V0fWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBtYXRjaFsxXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB4Y29kZVBhdGggPSBhd2FpdCBnZXRQYXRoKHRpbWVvdXQpO1xuXG4gIC8vIGZvciBpb3MgOCBhbmQgdXAsIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgQXV0aW9tYXRpb25JbnN0cnVtZW50IGNoYW5nZWQuXG4gIC8vIHJhdGhlciB0aGFuIHdhc3RlIHRpbWUgZ2V0dGluZyB0aGUgaU9TU0RLVmVyc2lvbiwganVzdCBnZXQgYm90aCBwYXRocyBhbmQgc2VlIHdoaWNoIG9uZSBleGlzdHNcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsneHJwbHVnaW4nLCAnYnVuZGxlJ107XG4gIGNvbnN0IHBhdGhQcmVmaXggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCAnLi4vQXBwbGljYXRpb25zL0luc3RydW1lbnRzLmFwcC9Db250ZW50cy9QbHVnSW5zJyk7XG4gIGNvbnN0IHBhdGhTdWZmaXggPSAnQ29udGVudHMvUmVzb3VyY2VzL0F1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSc7XG4gIGxldCBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzID0gW1xuICAgIHBhdGgucmVzb2x2ZShwYXRoUHJlZml4LCBgQXV0b21hdGlvbkluc3RydW1lbnQuJHtleHRlbnNpb25zWzBdfWAsIHBhdGhTdWZmaXgpLFxuICAgIHBhdGgucmVzb2x2ZShwYXRoUHJlZml4LCBgQXV0b21hdGlvbkluc3RydW1lbnQuJHtleHRlbnNpb25zWzFdfWAsIHBhdGhTdWZmaXgpXG4gIF07XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzBdKSkge1xuICAgIHJldHVybiBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzBdO1xuICB9XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzFdKSkge1xuICAgIHJldHVybiBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzFdO1xuICB9XG5cbiAgY29uc3QgbXNnID0gJ0NvdWxkIG5vdCBmaW5kIEF1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZycgK1xuICAgICAgICAgICAgICBgbG9jYXRpb25zICR7YXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRocy50b1N0cmluZygpfWA7XG4gIGxvZy5lcnJvcihtc2cpO1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcblxufVxuXG5jb25zdCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGggPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCAocmV0cmllcyA9IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gICAgcmV0dXJuIHJldHJ5KHJldHJpZXMsIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldFZlcnNpb24oZmFsc2UsIERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQpO1xuICBpZiAodmVyc2lvblswXSA9PT0gJzQnKSB7XG4gICAgcmV0dXJuICc2LjEnO1xuICB9XG5cbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnaXBob25lc2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBjb25zdCBzZGtWZXJzaW9uID0gc3Rkb3V0LnRyaW0oKTtcbiAgY29uc3QgbWF0Y2ggPSAvXFxkLlxcZC8uZXhlYyhzdGRvdXQpO1xuXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHhjcnVuIHJldHVybmVkIGEgbm9uLW51bWVyaWMgaU9TIFNESyB2ZXJzaW9uOiAnJHtzZGtWZXJzaW9ufSdgKTtcbiAgfVxuXG4gIHJldHVybiBzZGtWZXJzaW9uO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRNYXhJT1NTREtGcm9tWGNvZGVWZXJzaW9uICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbih0cnVlLCBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0KTtcbiAgLy8gYXMgb2Ygbm93LCB0aGUgaU9TIHZlcnNpb24gYXNzb2NpYXRlZCB3aXRoIGFuIFhjb2RlIHZlcnNpb24gaXNcbiAgLy8ganVzdCB0aGUgWGNvZGUgdmVyc2lvbiArIDJcbiAgcmV0dXJuIGAke3ZlcnNpb24ubWFqb3IgKyAyfS4ke3ZlcnNpb24ubWlub3J9YDtcbn1cblxuY29uc3QgZ2V0TWF4SU9TU0RLID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiBnZXRNYXhJT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBVbmFibGUgdG8gcmV0cmlldmUgbWF4aW11bSBpT1MgdmVyc2lvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGxvZy53YXJuKCdHdWVzc2luZyBmcm9tIFhjb2RlIHZlcnNpb24nKTtcbiAgICAgIHJldHVybiBnZXRNYXhJT1NTREtGcm9tWGNvZGVWZXJzaW9uKHRpbWVvdXQpO1xuICAgIH1cbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnYXBwbGV0dnNpbXVsYXRvcicsICctLXNob3ctc2RrLXZlcnNpb24nXTtcbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBydW5YY3J1bkNvbW1hbmQoYXJncywgdGltZW91dCk7XG5cbiAgY29uc3Qgc2RrVmVyc2lvbiA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKGlzTmFOKHBhcnNlRmxvYXQoc2RrVmVyc2lvbikpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB4Y3J1biByZXR1cm5lZCBhIG5vbi1udW1lcmljIHR2T1MgU0RLIHZlcnNpb246ICcke3Nka1ZlcnNpb259J2ApO1xuICB9XG5cbiAgcmV0dXJuIHNka1ZlcnNpb247XG59XG5cbmNvbnN0IGdldE1heFRWT1NTREsgPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIGdldE1heFRWT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ubmVjdGVkRGV2aWNlcyAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgY21kID0gJy91c3Ivc2Jpbi9zeXN0ZW1fcHJvZmlsZXInO1xuICBjb25zdCBhcmdzID0gWycteG1sJywgJ1NQVVNCRGF0YVR5cGUnXTtcbiAgbGV0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyhjbWQsIGFyZ3MsIHt0aW1lb3V0fSk7XG4gIGxldCBwbGlzdENvbnRlbnQgPSBwYXJzZVBsaXN0RGF0YShzdGRvdXQpO1xuXG4gIGxldCBkZXZpY2VzRm91bmQgPSBbXTtcbiAgbGV0IGVudHJpZXNUb1NlYXJjaCA9IFtwbGlzdENvbnRlbnRbMF1dO1xuICB3aGlsZSAoZW50cmllc1RvU2VhcmNoLmxlbmd0aCA+IDApIHtcbiAgICBsZXQgY3VycmVudEVudHJ5ID0gZW50cmllc1RvU2VhcmNoLnBvcCgpO1xuICAgIGlmIChjdXJyZW50RW50cnkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgZW50cmllc1RvU2VhcmNoID0gZW50cmllc1RvU2VhcmNoLmNvbmNhdChjdXJyZW50RW50cnkpO1xuICAgIH0gZWxzZSBpZiAoKGN1cnJlbnRFbnRyeS5fbmFtZSAmJlxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5fbmFtZS5zdWJzdHJpbmcoMCwgNCkgPT09ICdpUGFkJykgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiZcbiAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkuX25hbWUuc3Vic3RyaW5nKDAsIDYpID09PSAnaVBob25lJykgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiYgXy5pbmNsdWRlcyhjdXJyZW50RW50cnkuX25hbWUsICdBcHBsZSBUVicpKSkge1xuICAgICAgbGV0IGRldmljZUluZm8gPSB7XG4gICAgICAgIG5hbWU6IGN1cnJlbnRFbnRyeS5fbmFtZSxcbiAgICAgICAgdWRpZDogY3VycmVudEVudHJ5LnNlcmlhbF9udW0sXG4gICAgICAgIHByb2R1Y3RJZDogY3VycmVudEVudHJ5LnByb2R1Y3RfaWQsXG4gICAgICAgIGRldmljZVZlcnNpb246IGN1cnJlbnRFbnRyeS5iY2RfZGV2aWNlXG4gICAgICB9O1xuICAgICAgZGV2aWNlc0ZvdW5kLnB1c2goZGV2aWNlSW5mbyk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50RW50cnkuX2l0ZW1zKSB7XG4gICAgICBlbnRyaWVzVG9TZWFyY2ggPSBlbnRyaWVzVG9TZWFyY2guY29uY2F0KGN1cnJlbnRFbnRyeS5faXRlbXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGV2aWNlc0ZvdW5kO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRJbnN0cnVtZW50c1BhdGhXaXRob3V0UmV0cnkgKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGNvbnN0IGFyZ3MgPSBbJy1maW5kJywgJ2luc3RydW1lbnRzJ107XG4gIGxldCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBpZiAoIXN0ZG91dCkge1xuICAgIHN0ZG91dCA9ICcnO1xuICB9XG5cbiAgbGV0IGluc3RydW1lbnRzUGF0aCA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKCFpbnN0cnVtZW50c1BhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHBhdGggdG8gaW5zdHJ1bWVudHMgYmluYXJ5IHVzaW5nICd4Y3J1biAke2FyZ3Muam9pbignICcpfSdgKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVtZW50c1BhdGg7XG59XG5cbmNvbnN0IGdldEluc3RydW1lbnRzUGF0aCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0SW5zdHJ1bWVudHNQYXRoIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0SW5zdHJ1bWVudHNQYXRoV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuZnVuY3Rpb24gY2xlYXJJbnRlcm5hbENhY2hlICgpIHtcblxuICAvLyBtZW1vaXplZCBmdW5jdGlvbnNcbiAgY29uc3QgbWVtb2l6ZWQgPSBbXG4gICAgZ2V0UGF0aCwgZ2V0VmVyc2lvbk1lbW9pemVkLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgICBnZXRNYXhUVk9TU0RLLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIF07XG5cbiAgbWVtb2l6ZWQuZm9yRWFjaCgoZikgPT4ge1xuICAgIGlmIChmLmNhY2hlKSB7XG4gICAgICBmLmNhY2hlID0gbmV3IF8ubWVtb2l6ZS5DYWNoZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCB7XG4gIGdldFBhdGgsIGdldFZlcnNpb24sIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCwgZ2V0TWF4SU9TU0RLLFxuICBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnksIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q29ubmVjdGVkRGV2aWNlcywgY2xlYXJJbnRlcm5hbENhY2hlLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIGdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uLCBnZXRNYXhUVk9TU0RLLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LFxuICBnZXRDbGFuZ1ZlcnNpb24sXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQSxNQUFNQSxHQUFHLEdBQUdDLE9BQU8sQ0FBQ0QsR0FBRztBQUV2QixNQUFNRSxhQUFhLEdBQUcsS0FBSztBQUMzQixNQUFNQyxZQUFZLEdBQUcscUJBQXFCO0FBQzFDLE1BQU1DLHlCQUF5QixHQUFHLENBQUM7QUFFbkMsTUFBTUMsR0FBRyxHQUFHQyxlQUFNLENBQUNDLFNBQVMsQ0FBQyxPQUFPLENBQUM7QUFHckMsU0FBU0MsaUJBQWlCLENBQUVDLElBQUksRUFBRTtFQUNoQyxPQUFPQSxJQUFJLENBQUNDLFNBQVMsQ0FBQ0QsSUFBSSxDQUFDRSxNQUFNLEdBQUdSLFlBQVksQ0FBQ1EsTUFBTSxDQUFDLEtBQUtSLFlBQVk7QUFDM0U7QUFFQSxlQUFlUyxlQUFlLENBQUVDLElBQUksRUFBRUMsT0FBTyxHQUFHWixhQUFhLEVBQUU7RUFDN0QsSUFBSTtJQUNGLE1BQU1h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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xcode.js","names":["env","process","XCRUN_TIMEOUT","XCODE_SUBDIR","DEFAULT_NUMBER_OF_RETRIES","log","logger","getLogger","hasExpectedSubDir","path","substring","length","runXcrunCommand","args","timeout","res","exec","_","isUndefined","Error","join","err","stderr","message","getPathFromSymlink","failMessage","warn","symlinkPath","legacySymlinkPath","xcodePath","util","hasContent","DEVELOPER_DIR","customPath","fs","exists","mesg","readlink","replace","RegExp","trim","msg","getPathFromXcodeSelect","stdout","xcodeFolderPath","errorAndThrow","getPath","memoize","e","getVersionWithoutRetry","plistPath","resolve","version","plist","parsePlistFile","semver","coerce","CFBundleShortVersionString","getVersionMemoized","retries","retry","getVersion","parse","versionString","patch","major","minor","versionFloat","parseFloat","undefined","toString","getCommandLineToolsVersion","getVersionFunctions","pkg","ign","match","getClangVersion","which","info","getAutomationTraceTemplatePathWithoutRetry","extensions","pathPrefix","pathSuffix","automationTraceTemplatePaths","error","getAutomationTraceTemplatePath","getMaxIOSSDKWithoutRetry","sdkVersion","getMaxIOSSDKFromXcodeVersion","getMaxIOSSDK","getMaxTVOSSDKWithoutRetry","isNaN","getMaxTVOSSDK","getConnectedDevices","cmd","plistContent","parsePlistData","devicesFound","entriesToSearch","currentEntry","pop","Array","concat","_name","includes","deviceInfo","name","udid","serial_num","productId","product_id","deviceVersion","bcd_device","push","_items","getInstrumentsPathWithoutRetry","instrumentsPath","getInstrumentsPath","clearInternalCache","memoized","forEach","f","cache","Cache"],"sources":["../../lib/xcode.js"],"sourcesContent":["import { util, fs, plist, logger } from '@appium/support';\nimport path from 'path';\nimport { retry } from 'asyncbox';\nimport _ from 'lodash';\nimport { parse as parsePlistData } from 'plist';\nimport { exec } from 'teen_process';\nimport semver from 'semver';\n\n\nconst env = process.env;\n\nconst XCRUN_TIMEOUT = 15000;\nconst XCODE_SUBDIR = '/Contents/Developer';\nconst DEFAULT_NUMBER_OF_RETRIES = 3;\n\nconst log = logger.getLogger('Xcode');\n\n\nfunction hasExpectedSubDir (path) {\n return path.substring(path.length - XCODE_SUBDIR.length) === XCODE_SUBDIR;\n}\n\nasync function runXcrunCommand (args, timeout = XCRUN_TIMEOUT) {\n try {\n const res = await exec('xcrun', args, {timeout});\n if (_.isUndefined(res)) {\n throw new Error(`Nothing returned from trying to run 'xcrun ${args.join(' ')}'`);\n }\n return res;\n } catch (err) {\n // the true error can be hidden within the stderr\n if (err.stderr) {\n err.message = `${err.message}: ${err.stderr}`;\n }\n\n throw err;\n }\n}\n\nasync function getPathFromSymlink (failMessage) {\n // Node's invocation of xcode-select sometimes flakes and returns an empty string.\n // Not clear why. As a workaround, Appium can reliably deduce the version in use by checking\n // the locations xcode-select uses to store the selected version's path. This should be 100%\n // reliable so long as the link locations remain the same. However, since we're relying on\n // hardcoded paths, this approach will break the next time Apple changes the symlink location.\n log.warn(`Finding XcodePath by symlink because ${failMessage}`);\n\n const symlinkPath = '/var/db/xcode_select_link';\n const legacySymlinkPath = '/usr/share/xcode-select/xcode_dir_link'; // Xcode < 5.x\n let xcodePath = null;\n\n // xcode-select allows users to override its settings with the DEVELOPER_DIR env var,\n // so check that first\n if (util.hasContent(env.DEVELOPER_DIR)) {\n const customPath = hasExpectedSubDir(env.DEVELOPER_DIR)\n ? env.DEVELOPER_DIR\n : env.DEVELOPER_DIR + XCODE_SUBDIR;\n\n if (await fs.exists(customPath)) {\n xcodePath = customPath;\n } else {\n let mesg = `Could not find path to Xcode, environment variable ` +\n `DEVELOPER_DIR set to: ${env.DEVELOPER_DIR} ` +\n `but no Xcode found`;\n log.warn(mesg);\n throw new Error(mesg);\n }\n } else if (await fs.exists(symlinkPath)) {\n xcodePath = await fs.readlink(symlinkPath);\n } else if (await fs.exists(legacySymlinkPath)) {\n xcodePath = await fs.readlink(legacySymlinkPath);\n }\n\n if (xcodePath) {\n return xcodePath.replace(new RegExp('/$'), '').trim();\n }\n\n // We should only get here is we failed to capture xcode-select's stdout and our\n // other checks failed. Either Apple has moved the symlink to a new location or the user\n // is not using the default install. 99.999% chance it's the latter, so issue a warning\n // should we ever hit the edge case.\n let msg = `Could not find path to Xcode by symlinks located in ${symlinkPath}, or ${legacySymlinkPath}`;\n log.warn(msg);\n throw new Error(msg);\n}\n\nasync function getPathFromXcodeSelect (timeout = XCRUN_TIMEOUT) {\n let {stdout} = await exec('xcode-select', ['--print-path'], {timeout});\n\n // trim and remove trailing slash\n const xcodeFolderPath = stdout.replace(/\\/$/, '').trim();\n\n if (!util.hasContent(xcodeFolderPath)) {\n log.errorAndThrow('xcode-select returned an empty string');\n }\n\n if (await fs.exists(xcodeFolderPath)) {\n return xcodeFolderPath;\n } else {\n const msg = `xcode-select could not find xcode. Path '${xcodeFolderPath}' does not exist.`;\n log.errorAndThrow(msg);\n }\n}\n\nconst getPath = _.memoize(function getPath (timeout = XCRUN_TIMEOUT) {\n // first we try using xcode-select to find the path\n // then we try using the symlinks that Apple has by default\n return (async () => {\n try {\n return await getPathFromXcodeSelect(timeout);\n } catch (e) {\n return await getPathFromSymlink(e.message);\n }\n })();\n});\n\n\nasync function getVersionWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const xcodePath = await getPath(timeout);\n\n // we want to read the CFBundleShortVersionString from Xcode's plist.\n // It should be in /[root]/XCode.app/Contents/\n const plistPath = path.resolve(xcodePath, '..', 'Info.plist');\n\n if (!await fs.exists(plistPath)) {\n throw new Error(`Could not get Xcode version. ${plistPath} does not exist on disk.`);\n }\n\n const version = await plist.parsePlistFile(plistPath);\n return semver.coerce(version.CFBundleShortVersionString);\n}\n\nconst getVersionMemoized = _.memoize(\n function getVersionMemoized (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n return retry(retries, getVersionWithoutRetry, timeout);\n }\n);\n\nasync function getVersion (parse = false, retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n const version = await getVersionMemoized(retries, timeout);\n // xcode version strings are not exactly semver string: patch versions of 0\n // are removed (e.g., '10.0.0' => '10.0')\n const versionString = version.patch > 0 ? version.version : `${version.major}.${version.minor}`;\n if (!parse) {\n return versionString;\n }\n\n return {\n versionString,\n versionFloat: parseFloat(versionString),\n major: version.major,\n minor: version.minor,\n patch: version.patch > 0 ? version.patch : undefined,\n toString () {\n return versionString;\n },\n };\n}\n\nasync function getCommandLineToolsVersion () {\n // there are a number of different ways that the CLI tools version has been\n // represented. Try them from most reliable to least, falling down the chain\n const getVersionFunctions = [\n async () => {\n let pkg = (await exec('pkgutil', ['--pkgs=com.apple.pkg.DevSDK_.*'])).stdout;\n return (await exec('pkgutil', [`--pkg-info=${pkg.trim()}`])).stdout;\n },\n async () => (await exec('pkgutil', [`--pkg-info=com.apple.pkg.CLTools_Executables`])).stdout,\n async () => (await exec('pkgutil', [`--pkg-info=com.apple.pkg.DeveloperToolsCLI`])).stdout,\n ];\n let stdout;\n for (let getVersion of getVersionFunctions) {\n try {\n stdout = await getVersion();\n break;\n } catch (ign) {\n stdout = '';\n }\n }\n\n // stdout should have a line like `version: 8.0.0.0.1.1472435881`\n let match = /^version: (.+)$/m.exec(stdout); // https://regex101.com/r/HV3x4d/1\n return match ? match[1] : undefined;\n}\n\n/**\n * Check https://trac.macports.org/wiki/XcodeVersionInfo\n * to see the actual mapping between clang and other components.\n *\n * @returns {?string} The actual Clang version in x.x.x.x or x.x.x format,\n * which is supplied with Command Line Tools. `null` is returned\n * if CLT are not installed.\n */\nasync function getClangVersion () {\n try {\n await fs.which('clang');\n } catch (e) {\n log.info('Cannot find clang executable on the local system. ' +\n 'Are Xcode Command Line Tools installed?');\n return null;\n }\n const {stdout} = await exec('clang', ['--version']);\n const match = /clang-([0-9.]+)/.exec(stdout);\n if (!match) {\n log.info(`Cannot parse clang version from ${stdout}`);\n return null;\n }\n return match[1];\n}\n\nasync function getAutomationTraceTemplatePathWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const xcodePath = await getPath(timeout);\n\n // for ios 8 and up, the file extension for AutiomationInstrument changed.\n // rather than waste time getting the iOSSDKVersion, just get both paths and see which one exists\n const extensions = ['xrplugin', 'bundle'];\n const pathPrefix = path.resolve(xcodePath, '../Applications/Instruments.app/Contents/PlugIns');\n const pathSuffix = 'Contents/Resources/Automation.tracetemplate';\n let automationTraceTemplatePaths = [\n path.resolve(pathPrefix, `AutomationInstrument.${extensions[0]}`, pathSuffix),\n path.resolve(pathPrefix, `AutomationInstrument.${extensions[1]}`, pathSuffix)\n ];\n\n if (await fs.exists(automationTraceTemplatePaths[0])) {\n return automationTraceTemplatePaths[0];\n }\n\n if (await fs.exists(automationTraceTemplatePaths[1])) {\n return automationTraceTemplatePaths[1];\n }\n\n const msg = 'Could not find Automation.tracetemplate in any of the following' +\n `locations ${automationTraceTemplatePaths.toString()}`;\n log.error(msg);\n throw new Error(msg);\n\n}\n\nconst getAutomationTraceTemplatePath = _.memoize(\n function getAutomationTraceTemplatePath (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n return retry(retries, getAutomationTraceTemplatePathWithoutRetry, timeout);\n }\n);\n\nasync function getMaxIOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const version = await getVersion(false, DEFAULT_NUMBER_OF_RETRIES, timeout);\n if (version[0] === '4') {\n return '6.1';\n }\n\n const args = ['--sdk', 'iphonesimulator', '--show-sdk-version'];\n const {stdout} = await runXcrunCommand(args, timeout);\n\n const sdkVersion = stdout.trim();\n const match = /\\d.\\d/.exec(stdout);\n\n if (!match) {\n throw new Error(`xcrun returned a non-numeric iOS SDK version: '${sdkVersion}'`);\n }\n\n return sdkVersion;\n}\n\nasync function getMaxIOSSDKFromXcodeVersion (timeout = XCRUN_TIMEOUT) {\n const version = await getVersion(true, DEFAULT_NUMBER_OF_RETRIES, timeout);\n // as of now, the iOS version associated with an Xcode version is\n // just the Xcode version + 2\n return `${version.major + 2}.${version.minor}`;\n}\n\nconst getMaxIOSSDK = _.memoize(\n function getMaxIOSSDK (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n try {\n return retry(retries, getMaxIOSSDKWithoutRetry, timeout);\n } catch (err) {\n log.warn(`Unable to retrieve maximum iOS version: ${err.message}`);\n log.warn('Guessing from Xcode version');\n return getMaxIOSSDKFromXcodeVersion(timeout);\n }\n }\n);\n\nasync function getMaxTVOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const args = ['--sdk', 'appletvsimulator', '--show-sdk-version'];\n const {stdout} = await runXcrunCommand(args, timeout);\n\n const sdkVersion = stdout.trim();\n\n if (isNaN(parseFloat(sdkVersion))) {\n throw new Error(`xcrun returned a non-numeric tvOS SDK version: '${sdkVersion}'`);\n }\n\n return sdkVersion;\n}\n\nconst getMaxTVOSSDK = _.memoize(\n function getMaxTVOSSDK (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n return retry(retries, getMaxTVOSSDKWithoutRetry, timeout);\n }\n);\n\nasync function getConnectedDevices (timeout = XCRUN_TIMEOUT) {\n const cmd = '/usr/sbin/system_profiler';\n const args = ['-xml', 'SPUSBDataType'];\n let {stdout} = await exec(cmd, args, {timeout});\n let plistContent = parsePlistData(stdout);\n\n let devicesFound = [];\n let entriesToSearch = [plistContent[0]];\n while (entriesToSearch.length > 0) {\n let currentEntry = entriesToSearch.pop();\n if (currentEntry instanceof Array) {\n entriesToSearch = entriesToSearch.concat(currentEntry);\n } else if ((currentEntry._name &&\n currentEntry._name.substring(0, 4) === 'iPad') ||\n (currentEntry._name &&\n currentEntry._name.substring(0, 6) === 'iPhone') ||\n (currentEntry._name && _.includes(currentEntry._name, 'Apple TV'))) {\n let deviceInfo = {\n name: currentEntry._name,\n udid: currentEntry.serial_num,\n productId: currentEntry.product_id,\n deviceVersion: currentEntry.bcd_device\n };\n devicesFound.push(deviceInfo);\n } else if (currentEntry._items) {\n entriesToSearch = entriesToSearch.concat(currentEntry._items);\n }\n }\n return devicesFound;\n}\n\nasync function getInstrumentsPathWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const args = ['-find', 'instruments'];\n let {stdout} = await runXcrunCommand(args, timeout);\n\n if (!stdout) {\n stdout = '';\n }\n\n let instrumentsPath = stdout.trim();\n\n if (!instrumentsPath) {\n throw new Error(`Could not find path to instruments binary using 'xcrun ${args.join(' ')}'`);\n }\n\n return instrumentsPath;\n}\n\nconst getInstrumentsPath = _.memoize(\n function getInstrumentsPath (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n return retry(retries, getInstrumentsPathWithoutRetry, timeout);\n }\n);\n\nfunction clearInternalCache () {\n\n // memoized functions\n const memoized = [\n getPath, getVersionMemoized, getAutomationTraceTemplatePath, getMaxIOSSDK,\n getMaxTVOSSDK, getInstrumentsPath,\n ];\n\n memoized.forEach((f) => {\n if (f.cache) {\n f.cache = new _.memoize.Cache();\n }\n });\n}\n\nexport {\n getPath, getVersion, getAutomationTraceTemplatePath, getMaxIOSSDK,\n getAutomationTraceTemplatePathWithoutRetry, getMaxIOSSDKWithoutRetry,\n getConnectedDevices, clearInternalCache, getInstrumentsPath,\n getCommandLineToolsVersion, getMaxTVOSSDK, getMaxTVOSSDKWithoutRetry,\n getClangVersion,\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"ios",
|
|
7
7
|
"xcode"
|
|
8
8
|
],
|
|
9
|
-
"version": "4.0.
|
|
9
|
+
"version": "4.0.3",
|
|
10
10
|
"author": "Appium Contributors",
|
|
11
11
|
"license": "Apache-2.0",
|
|
12
12
|
"repository": {
|
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
"index.js",
|
|
30
30
|
"lib",
|
|
31
31
|
"build/index.js",
|
|
32
|
-
"build/lib"
|
|
32
|
+
"build/lib",
|
|
33
|
+
"CHANGELOG.md"
|
|
33
34
|
],
|
|
34
35
|
"dependencies": {
|
|
35
36
|
"@appium/support": "^2.55.3",
|
|
@@ -74,6 +75,7 @@
|
|
|
74
75
|
"@babel/plugin-transform-runtime": "^7.18.10",
|
|
75
76
|
"@babel/preset-env": "^7.18.10",
|
|
76
77
|
"@babel/register": "^7.18.9",
|
|
78
|
+
"@semantic-release/changelog": "^6.0.1",
|
|
77
79
|
"@semantic-release/git": "^10.0.1",
|
|
78
80
|
"babel-plugin-source-map-support": "^2.2.0",
|
|
79
81
|
"chai": "^4.1.2",
|