appium-xcode 3.7.1 → 3.10.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/index.js +35 -11
- package/build/lib/xcode.js +234 -275
- package/index.js +17 -2
- package/lib/xcode.js +68 -22
- package/package.json +5 -10
package/build/index.js
CHANGED
|
@@ -1,22 +1,46 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
4
4
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return _xcode.default;
|
|
12
|
-
}
|
|
13
|
-
});
|
|
14
|
-
exports.default = void 0;
|
|
8
|
+
exports.default = exports.getClangVersion = exports.getMaxTVOSSDKWithoutRetry = exports.getMaxTVOSSDK = exports.getCommandLineToolsVersion = exports.getInstrumentsPath = exports.clearInternalCache = exports.getConnectedDevices = exports.getMaxIOSSDKWithoutRetry = exports.getAutomationTraceTemplatePathWithoutRetry = exports.getMaxIOSSDK = exports.getAutomationTraceTemplatePath = exports.getVersion = exports.getPath = void 0;
|
|
9
|
+
|
|
10
|
+
require("source-map-support/register");
|
|
15
11
|
|
|
16
|
-
var
|
|
12
|
+
var xcode = _interopRequireWildcard(require("./lib/xcode"));
|
|
17
13
|
|
|
18
|
-
|
|
14
|
+
const {
|
|
15
|
+
getPath,
|
|
16
|
+
getVersion,
|
|
17
|
+
getAutomationTraceTemplatePath,
|
|
18
|
+
getMaxIOSSDK,
|
|
19
|
+
getAutomationTraceTemplatePathWithoutRetry,
|
|
20
|
+
getMaxIOSSDKWithoutRetry,
|
|
21
|
+
getConnectedDevices,
|
|
22
|
+
clearInternalCache,
|
|
23
|
+
getInstrumentsPath,
|
|
24
|
+
getCommandLineToolsVersion,
|
|
25
|
+
getMaxTVOSSDK,
|
|
26
|
+
getMaxTVOSSDKWithoutRetry,
|
|
27
|
+
getClangVersion
|
|
28
|
+
} = xcode;
|
|
29
|
+
exports.getClangVersion = getClangVersion;
|
|
30
|
+
exports.getMaxTVOSSDKWithoutRetry = getMaxTVOSSDKWithoutRetry;
|
|
31
|
+
exports.getMaxTVOSSDK = getMaxTVOSSDK;
|
|
32
|
+
exports.getCommandLineToolsVersion = getCommandLineToolsVersion;
|
|
33
|
+
exports.getInstrumentsPath = getInstrumentsPath;
|
|
34
|
+
exports.clearInternalCache = clearInternalCache;
|
|
35
|
+
exports.getConnectedDevices = getConnectedDevices;
|
|
36
|
+
exports.getMaxIOSSDKWithoutRetry = getMaxIOSSDKWithoutRetry;
|
|
37
|
+
exports.getAutomationTraceTemplatePathWithoutRetry = getAutomationTraceTemplatePathWithoutRetry;
|
|
38
|
+
exports.getMaxIOSSDK = getMaxIOSSDK;
|
|
39
|
+
exports.getAutomationTraceTemplatePath = getAutomationTraceTemplatePath;
|
|
40
|
+
exports.getVersion = getVersion;
|
|
41
|
+
exports.getPath = getPath;
|
|
42
|
+
var _default = xcode;
|
|
19
43
|
exports.default = _default;require('source-map-support').install();
|
|
20
44
|
|
|
21
45
|
|
|
22
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
46
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImdldFBhdGgiLCJnZXRWZXJzaW9uIiwiZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoIiwiZ2V0TWF4SU9TU0RLIiwiZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5IiwiZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5IiwiZ2V0Q29ubmVjdGVkRGV2aWNlcyIsImNsZWFySW50ZXJuYWxDYWNoZSIsImdldEluc3RydW1lbnRzUGF0aCIsImdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uIiwiZ2V0TWF4VFZPU1NESyIsImdldE1heFRWT1NTREtXaXRob3V0UmV0cnkiLCJnZXRDbGFuZ1ZlcnNpb24iLCJ4Y29kZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7QUFHQSxNQUFNO0FBQ0pBLEVBQUFBLE9BREk7QUFDS0MsRUFBQUEsVUFETDtBQUNpQkMsRUFBQUEsOEJBRGpCO0FBQ2lEQyxFQUFBQSxZQURqRDtBQUVKQyxFQUFBQSwwQ0FGSTtBQUV3Q0MsRUFBQUEsd0JBRnhDO0FBR0pDLEVBQUFBLG1CQUhJO0FBR2lCQyxFQUFBQSxrQkFIakI7QUFHcUNDLEVBQUFBLGtCQUhyQztBQUlKQyxFQUFBQSwwQkFKSTtBQUl3QkMsRUFBQUEsYUFKeEI7QUFJdUNDLEVBQUFBLHlCQUp2QztBQUtKQyxFQUFBQTtBQUxJLElBTUZDLEtBTko7Ozs7Ozs7Ozs7Ozs7O2VBZWVBLEsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgKiBhcyB4Y29kZSBmcm9tICcuL2xpYi94Y29kZSc7XG5cblxuY29uc3Qge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufSA9IHhjb2RlO1xuXG5leHBvcnQge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufTtcbmV4cG9ydCBkZWZhdWx0IHhjb2RlO1xuIl0sImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZVJvb3QiOiIuLiJ9
|
package/build/lib/xcode.js
CHANGED
|
@@ -5,9 +5,17 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
exports.getVersion = getVersion;
|
|
9
|
+
exports.getAutomationTraceTemplatePathWithoutRetry = getAutomationTraceTemplatePathWithoutRetry;
|
|
10
|
+
exports.getMaxIOSSDKWithoutRetry = getMaxIOSSDKWithoutRetry;
|
|
11
|
+
exports.getConnectedDevices = getConnectedDevices;
|
|
12
|
+
exports.clearInternalCache = clearInternalCache;
|
|
13
|
+
exports.getCommandLineToolsVersion = getCommandLineToolsVersion;
|
|
14
|
+
exports.getMaxTVOSSDKWithoutRetry = getMaxTVOSSDKWithoutRetry;
|
|
15
|
+
exports.getClangVersion = getClangVersion;
|
|
16
|
+
exports.getMaxTVOSSDK = exports.getInstrumentsPath = exports.getMaxIOSSDK = exports.getAutomationTraceTemplatePath = exports.getPath = void 0;
|
|
17
|
+
|
|
18
|
+
require("source-map-support/register");
|
|
11
19
|
|
|
12
20
|
var _appiumSupport = require("appium-support");
|
|
13
21
|
|
|
@@ -25,7 +33,7 @@ var _semver = _interopRequireDefault(require("semver"));
|
|
|
25
33
|
|
|
26
34
|
const env = process.env;
|
|
27
35
|
const XCRUN_TIMEOUT = 15000;
|
|
28
|
-
const XCODE_SUBDIR =
|
|
36
|
+
const XCODE_SUBDIR = '/Contents/Developer';
|
|
29
37
|
const DEFAULT_NUMBER_OF_RETRIES = 3;
|
|
30
38
|
|
|
31
39
|
const log = _appiumSupport.logger.getLogger('Xcode');
|
|
@@ -34,340 +42,307 @@ function hasExpectedSubDir(path) {
|
|
|
34
42
|
return path.substring(path.length - XCODE_SUBDIR.length) === XCODE_SUBDIR;
|
|
35
43
|
}
|
|
36
44
|
|
|
37
|
-
function runXcrunCommand(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
_runXcrunCommand = (0, _asyncToGenerator2.default)(function* (args, timeout = XCRUN_TIMEOUT) {
|
|
43
|
-
try {
|
|
44
|
-
return yield (0, _teen_process.exec)('xcrun', args, {
|
|
45
|
-
timeout
|
|
46
|
-
});
|
|
47
|
-
} catch (err) {
|
|
48
|
-
if (err.stderr) {
|
|
49
|
-
err.message = `${err.message}: ${err.stderr}`;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
throw err;
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
return _runXcrunCommand.apply(this, arguments);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function getPathFromSymlink(_x2) {
|
|
59
|
-
return _getPathFromSymlink.apply(this, arguments);
|
|
60
|
-
}
|
|
45
|
+
async function runXcrunCommand(args, timeout = XCRUN_TIMEOUT) {
|
|
46
|
+
try {
|
|
47
|
+
const res = await (0, _teen_process.exec)('xcrun', args, {
|
|
48
|
+
timeout
|
|
49
|
+
});
|
|
61
50
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
log.warn(`Finding XcodePath by symlink because ${failMessage}`);
|
|
65
|
-
const symlinkPath = "/var/db/xcode_select_link";
|
|
66
|
-
const legacySymlinkPath = "/usr/share/xcode-select/xcode_dir_link";
|
|
67
|
-
let xcodePath = null;
|
|
68
|
-
|
|
69
|
-
if (_appiumSupport.util.hasContent(env.DEVELOPER_DIR)) {
|
|
70
|
-
const customPath = hasExpectedSubDir(env.DEVELOPER_DIR) ? env.DEVELOPER_DIR : env.DEVELOPER_DIR + XCODE_SUBDIR;
|
|
71
|
-
|
|
72
|
-
if (yield _appiumSupport.fs.exists(customPath)) {
|
|
73
|
-
xcodePath = customPath;
|
|
74
|
-
} else {
|
|
75
|
-
let mesg = `Could not find path to Xcode, environment variable ` + `DEVELOPER_DIR set to: ${env.DEVELOPER_DIR} ` + `but no Xcode found`;
|
|
76
|
-
log.warn(mesg);
|
|
77
|
-
throw new Error(mesg);
|
|
78
|
-
}
|
|
79
|
-
} else if (yield _appiumSupport.fs.exists(symlinkPath)) {
|
|
80
|
-
xcodePath = yield _appiumSupport.fs.readlink(symlinkPath);
|
|
81
|
-
} else if (yield _appiumSupport.fs.exists(legacySymlinkPath)) {
|
|
82
|
-
xcodePath = yield _appiumSupport.fs.readlink(legacySymlinkPath);
|
|
51
|
+
if (_lodash.default.isUndefined(res)) {
|
|
52
|
+
throw new Error(`Nothing returned from trying to run 'xcrun ${args.join(' ')}'`);
|
|
83
53
|
}
|
|
84
54
|
|
|
85
|
-
|
|
86
|
-
|
|
55
|
+
return res;
|
|
56
|
+
} catch (err) {
|
|
57
|
+
if (err.stderr) {
|
|
58
|
+
err.message = `${err.message}: ${err.stderr}`;
|
|
87
59
|
}
|
|
88
60
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
throw new Error(msg);
|
|
92
|
-
});
|
|
93
|
-
return _getPathFromSymlink.apply(this, arguments);
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
94
63
|
}
|
|
95
64
|
|
|
96
|
-
function
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
_getPathFromXcodeSelect = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
|
|
102
|
-
let _ref = yield (0, _teen_process.exec)('xcode-select', ['--print-path'], {
|
|
103
|
-
timeout
|
|
104
|
-
}),
|
|
105
|
-
stdout = _ref.stdout;
|
|
106
|
-
|
|
107
|
-
const xcodeFolderPath = stdout.replace(/\/$/, '').trim();
|
|
65
|
+
async function getPathFromSymlink(failMessage) {
|
|
66
|
+
log.warn(`Finding XcodePath by symlink because ${failMessage}`);
|
|
67
|
+
const symlinkPath = '/var/db/xcode_select_link';
|
|
68
|
+
const legacySymlinkPath = '/usr/share/xcode-select/xcode_dir_link';
|
|
69
|
+
let xcodePath = null;
|
|
108
70
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
71
|
+
if (_appiumSupport.util.hasContent(env.DEVELOPER_DIR)) {
|
|
72
|
+
const customPath = hasExpectedSubDir(env.DEVELOPER_DIR) ? env.DEVELOPER_DIR : env.DEVELOPER_DIR + XCODE_SUBDIR;
|
|
112
73
|
|
|
113
|
-
if (
|
|
114
|
-
|
|
74
|
+
if (await _appiumSupport.fs.exists(customPath)) {
|
|
75
|
+
xcodePath = customPath;
|
|
115
76
|
} else {
|
|
116
|
-
|
|
117
|
-
log.
|
|
77
|
+
let mesg = `Could not find path to Xcode, environment variable ` + `DEVELOPER_DIR set to: ${env.DEVELOPER_DIR} ` + `but no Xcode found`;
|
|
78
|
+
log.warn(mesg);
|
|
79
|
+
throw new Error(mesg);
|
|
118
80
|
}
|
|
81
|
+
} else if (await _appiumSupport.fs.exists(symlinkPath)) {
|
|
82
|
+
xcodePath = await _appiumSupport.fs.readlink(symlinkPath);
|
|
83
|
+
} else if (await _appiumSupport.fs.exists(legacySymlinkPath)) {
|
|
84
|
+
xcodePath = await _appiumSupport.fs.readlink(legacySymlinkPath);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (xcodePath) {
|
|
88
|
+
return xcodePath.replace(new RegExp('/$'), '').trim();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
let msg = `Could not find path to Xcode by symlinks located in ${symlinkPath}, or ${legacySymlinkPath}`;
|
|
92
|
+
log.warn(msg);
|
|
93
|
+
throw new Error(msg);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async function getPathFromXcodeSelect(timeout = XCRUN_TIMEOUT) {
|
|
97
|
+
let {
|
|
98
|
+
stdout
|
|
99
|
+
} = await (0, _teen_process.exec)('xcode-select', ['--print-path'], {
|
|
100
|
+
timeout
|
|
119
101
|
});
|
|
120
|
-
|
|
102
|
+
const xcodeFolderPath = stdout.replace(/\/$/, '').trim();
|
|
103
|
+
|
|
104
|
+
if (!_appiumSupport.util.hasContent(xcodeFolderPath)) {
|
|
105
|
+
log.errorAndThrow('xcode-select returned an empty string');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (await _appiumSupport.fs.exists(xcodeFolderPath)) {
|
|
109
|
+
return xcodeFolderPath;
|
|
110
|
+
} else {
|
|
111
|
+
const msg = `xcode-select could not find xcode. Path '${xcodeFolderPath}' does not exist.`;
|
|
112
|
+
log.errorAndThrow(msg);
|
|
113
|
+
}
|
|
121
114
|
}
|
|
122
115
|
|
|
123
|
-
const getPath = _lodash.default.memoize(function (timeout = XCRUN_TIMEOUT) {
|
|
116
|
+
const getPath = _lodash.default.memoize(function getPath(timeout = XCRUN_TIMEOUT) {
|
|
124
117
|
return getPathFromXcodeSelect(timeout).catch(getPathFromSymlink);
|
|
125
118
|
});
|
|
126
119
|
|
|
127
|
-
|
|
128
|
-
return _getVersionWithoutRetry.apply(this, arguments);
|
|
129
|
-
}
|
|
120
|
+
exports.getPath = getPath;
|
|
130
121
|
|
|
131
|
-
function
|
|
132
|
-
|
|
133
|
-
const xcodePath = yield getPath(timeout);
|
|
122
|
+
async function getVersionWithoutRetry(timeout = XCRUN_TIMEOUT) {
|
|
123
|
+
const xcodePath = await getPath(timeout);
|
|
134
124
|
|
|
135
|
-
|
|
125
|
+
const plistPath = _path.default.resolve(xcodePath, '..', 'Info.plist');
|
|
136
126
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
127
|
+
if (!(await _appiumSupport.fs.exists(plistPath))) {
|
|
128
|
+
throw new Error(`Could not get Xcode version. ${plistPath} does not exist on disk.`);
|
|
129
|
+
}
|
|
140
130
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
});
|
|
144
|
-
return _getVersionWithoutRetry.apply(this, arguments);
|
|
131
|
+
const version = await _appiumSupport.plist.parsePlistFile(plistPath);
|
|
132
|
+
return _semver.default.coerce(version.CFBundleShortVersionString);
|
|
145
133
|
}
|
|
146
134
|
|
|
147
|
-
const getVersionMemoized = _lodash.default.memoize(function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
135
|
+
const getVersionMemoized = _lodash.default.memoize(function getVersionMemoized(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
148
136
|
return (0, _asyncbox.retry)(retries, getVersionWithoutRetry, timeout);
|
|
149
137
|
});
|
|
150
138
|
|
|
151
|
-
function getVersion() {
|
|
152
|
-
|
|
153
|
-
}
|
|
139
|
+
async function getVersion(parse = false, retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
140
|
+
const version = await getVersionMemoized(retries, timeout);
|
|
141
|
+
const versionString = version.patch > 0 ? version.version : `${version.major}.${version.minor}`;
|
|
142
|
+
|
|
143
|
+
if (!parse) {
|
|
144
|
+
return versionString;
|
|
145
|
+
}
|
|
154
146
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
147
|
+
return {
|
|
148
|
+
versionString,
|
|
149
|
+
versionFloat: parseFloat(versionString),
|
|
150
|
+
major: version.major,
|
|
151
|
+
minor: version.minor,
|
|
152
|
+
patch: version.patch > 0 ? version.patch : undefined,
|
|
159
153
|
|
|
160
|
-
|
|
154
|
+
toString() {
|
|
161
155
|
return versionString;
|
|
162
156
|
}
|
|
163
157
|
|
|
164
|
-
|
|
165
|
-
versionString,
|
|
166
|
-
versionFloat: parseFloat(versionString),
|
|
167
|
-
major: version.major,
|
|
168
|
-
minor: version.minor,
|
|
169
|
-
patch: version.patch > 0 ? version.patch : undefined
|
|
170
|
-
};
|
|
171
|
-
});
|
|
172
|
-
return _getVersion.apply(this, arguments);
|
|
158
|
+
};
|
|
173
159
|
}
|
|
174
160
|
|
|
175
|
-
function getCommandLineToolsVersion() {
|
|
176
|
-
|
|
177
|
-
|
|
161
|
+
async function getCommandLineToolsVersion() {
|
|
162
|
+
const getVersionFunctions = [async () => {
|
|
163
|
+
let pkg = (await (0, _teen_process.exec)('pkgutil', ['--pkgs=com.apple.pkg.DevSDK_.*'])).stdout;
|
|
164
|
+
return (await (0, _teen_process.exec)('pkgutil', [`--pkg-info=${pkg.trim()}`])).stdout;
|
|
165
|
+
}, 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];
|
|
166
|
+
let stdout;
|
|
178
167
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
return (yield (0, _teen_process.exec)('pkgutil', [`--pkg-info=com.apple.pkg.CLTools_Executables`])).stdout;
|
|
186
|
-
}), (0, _asyncToGenerator2.default)(function* () {
|
|
187
|
-
return (yield (0, _teen_process.exec)('pkgutil', [`--pkg-info=com.apple.pkg.DeveloperToolsCLI`])).stdout;
|
|
188
|
-
})];
|
|
189
|
-
let stdout;
|
|
190
|
-
|
|
191
|
-
for (var _i = 0; _i < getVersionFunctions.length; _i++) {
|
|
192
|
-
let getVersion = getVersionFunctions[_i];
|
|
193
|
-
|
|
194
|
-
try {
|
|
195
|
-
stdout = yield getVersion();
|
|
196
|
-
break;
|
|
197
|
-
} catch (ign) {
|
|
198
|
-
stdout = '';
|
|
199
|
-
}
|
|
168
|
+
for (let getVersion of getVersionFunctions) {
|
|
169
|
+
try {
|
|
170
|
+
stdout = await getVersion();
|
|
171
|
+
break;
|
|
172
|
+
} catch (ign) {
|
|
173
|
+
stdout = '';
|
|
200
174
|
}
|
|
175
|
+
}
|
|
201
176
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
});
|
|
205
|
-
return _getCommandLineToolsVersion.apply(this, arguments);
|
|
177
|
+
let match = /^version: (.+)$/m.exec(stdout);
|
|
178
|
+
return match ? match[1] : undefined;
|
|
206
179
|
}
|
|
207
180
|
|
|
208
|
-
function
|
|
209
|
-
|
|
181
|
+
async function getClangVersion() {
|
|
182
|
+
try {
|
|
183
|
+
await _appiumSupport.fs.which('clang');
|
|
184
|
+
} catch (e) {
|
|
185
|
+
log.info('Cannot find clang executable on the local system. ' + 'Are Xcode Command Line Tools installed?');
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const {
|
|
190
|
+
stdout
|
|
191
|
+
} = await (0, _teen_process.exec)('clang', ['--version']);
|
|
192
|
+
const match = /clang-([0-9.]+)/.exec(stdout);
|
|
193
|
+
|
|
194
|
+
if (!match) {
|
|
195
|
+
log.info(`Cannot parse clang version from ${stdout}`);
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return match[1];
|
|
210
200
|
}
|
|
211
201
|
|
|
212
|
-
function
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
const extensions = ['xrplugin', 'bundle'];
|
|
202
|
+
async function getAutomationTraceTemplatePathWithoutRetry(timeout = XCRUN_TIMEOUT) {
|
|
203
|
+
const xcodePath = await getPath(timeout);
|
|
204
|
+
const extensions = ['xrplugin', 'bundle'];
|
|
216
205
|
|
|
217
|
-
|
|
206
|
+
const pathPrefix = _path.default.resolve(xcodePath, '../Applications/Instruments.app/Contents/PlugIns');
|
|
218
207
|
|
|
219
|
-
|
|
220
|
-
|
|
208
|
+
const pathSuffix = 'Contents/Resources/Automation.tracetemplate';
|
|
209
|
+
let automationTraceTemplatePaths = [_path.default.resolve(pathPrefix, `AutomationInstrument.${extensions[0]}`, pathSuffix), _path.default.resolve(pathPrefix, `AutomationInstrument.${extensions[1]}`, pathSuffix)];
|
|
221
210
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
211
|
+
if (await _appiumSupport.fs.exists(automationTraceTemplatePaths[0])) {
|
|
212
|
+
return automationTraceTemplatePaths[0];
|
|
213
|
+
}
|
|
225
214
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
215
|
+
if (await _appiumSupport.fs.exists(automationTraceTemplatePaths[1])) {
|
|
216
|
+
return automationTraceTemplatePaths[1];
|
|
217
|
+
}
|
|
229
218
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
});
|
|
234
|
-
return _getAutomationTraceTemplatePathWithoutRetry.apply(this, arguments);
|
|
219
|
+
const msg = 'Could not find Automation.tracetemplate in any of the following' + `locations ${automationTraceTemplatePaths.toString()}`;
|
|
220
|
+
log.error(msg);
|
|
221
|
+
throw new Error(msg);
|
|
235
222
|
}
|
|
236
223
|
|
|
237
|
-
const getAutomationTraceTemplatePath = _lodash.default.memoize(function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
224
|
+
const getAutomationTraceTemplatePath = _lodash.default.memoize(function getAutomationTraceTemplatePath(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
238
225
|
return (0, _asyncbox.retry)(retries, getAutomationTraceTemplatePathWithoutRetry, timeout);
|
|
239
226
|
});
|
|
240
227
|
|
|
241
|
-
|
|
242
|
-
return _getMaxIOSSDKWithoutRetry.apply(this, arguments);
|
|
243
|
-
}
|
|
228
|
+
exports.getAutomationTraceTemplatePath = getAutomationTraceTemplatePath;
|
|
244
229
|
|
|
245
|
-
function
|
|
246
|
-
|
|
247
|
-
const version = yield getVersion(false, DEFAULT_NUMBER_OF_RETRIES, timeout);
|
|
230
|
+
async function getMaxIOSSDKWithoutRetry(timeout = XCRUN_TIMEOUT) {
|
|
231
|
+
const version = await getVersion(false, DEFAULT_NUMBER_OF_RETRIES, timeout);
|
|
248
232
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
233
|
+
if (version[0] === '4') {
|
|
234
|
+
return '6.1';
|
|
235
|
+
}
|
|
252
236
|
|
|
253
|
-
|
|
237
|
+
const args = ['--sdk', 'iphonesimulator', '--show-sdk-version'];
|
|
238
|
+
const {
|
|
239
|
+
stdout
|
|
240
|
+
} = await runXcrunCommand(args, timeout);
|
|
241
|
+
const sdkVersion = stdout.trim();
|
|
242
|
+
const match = /\d.\d/.exec(stdout);
|
|
254
243
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
const sdkVersion = stdout.trim();
|
|
259
|
-
const match = /\d.\d/.exec(stdout);
|
|
260
|
-
|
|
261
|
-
if (!match) {
|
|
262
|
-
throw new Error(`xcrun returned a non-numeric iOS SDK version: '${sdkVersion}'`);
|
|
263
|
-
}
|
|
244
|
+
if (!match) {
|
|
245
|
+
throw new Error(`xcrun returned a non-numeric iOS SDK version: '${sdkVersion}'`);
|
|
246
|
+
}
|
|
264
247
|
|
|
265
|
-
|
|
266
|
-
});
|
|
267
|
-
return _getMaxIOSSDKWithoutRetry.apply(this, arguments);
|
|
248
|
+
return sdkVersion;
|
|
268
249
|
}
|
|
269
250
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
function getMaxTVOSSDKWithoutRetry() {
|
|
275
|
-
return _getMaxTVOSSDKWithoutRetry.apply(this, arguments);
|
|
251
|
+
async function getMaxIOSSDKFromXcodeVersion(timeout = XCRUN_TIMEOUT) {
|
|
252
|
+
const version = await getVersion(true, DEFAULT_NUMBER_OF_RETRIES, timeout);
|
|
253
|
+
return `${version.major + 2}.${version.minor}`;
|
|
276
254
|
}
|
|
277
255
|
|
|
278
|
-
function
|
|
279
|
-
|
|
280
|
-
|
|
256
|
+
const getMaxIOSSDK = _lodash.default.memoize(function getMaxIOSSDK(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
257
|
+
try {
|
|
258
|
+
return (0, _asyncbox.retry)(retries, getMaxIOSSDKWithoutRetry, timeout);
|
|
259
|
+
} catch (err) {
|
|
260
|
+
log.warn(`Unable to retrieve maximum iOS version: ${err.message}`);
|
|
261
|
+
log.warn('Guessing from Xcode version');
|
|
262
|
+
return getMaxIOSSDKFromXcodeVersion(timeout);
|
|
263
|
+
}
|
|
264
|
+
});
|
|
281
265
|
|
|
282
|
-
|
|
283
|
-
stdout = _ref6.stdout;
|
|
266
|
+
exports.getMaxIOSSDK = getMaxIOSSDK;
|
|
284
267
|
|
|
285
|
-
|
|
268
|
+
async function getMaxTVOSSDKWithoutRetry(timeout = XCRUN_TIMEOUT) {
|
|
269
|
+
const args = ['--sdk', 'appletvsimulator', '--show-sdk-version'];
|
|
270
|
+
const {
|
|
271
|
+
stdout
|
|
272
|
+
} = await runXcrunCommand(args, timeout);
|
|
273
|
+
const sdkVersion = stdout.trim();
|
|
286
274
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
275
|
+
if (isNaN(parseFloat(sdkVersion))) {
|
|
276
|
+
throw new Error(`xcrun returned a non-numeric tvOS SDK version: '${sdkVersion}'`);
|
|
277
|
+
}
|
|
290
278
|
|
|
291
|
-
|
|
292
|
-
});
|
|
293
|
-
return _getMaxTVOSSDKWithoutRetry.apply(this, arguments);
|
|
279
|
+
return sdkVersion;
|
|
294
280
|
}
|
|
295
281
|
|
|
296
|
-
const getMaxTVOSSDK = _lodash.default.memoize(function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
282
|
+
const getMaxTVOSSDK = _lodash.default.memoize(function getMaxTVOSSDK(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
297
283
|
return (0, _asyncbox.retry)(retries, getMaxTVOSSDKWithoutRetry, timeout);
|
|
298
284
|
});
|
|
299
285
|
|
|
300
|
-
|
|
301
|
-
return _getConnectedDevices.apply(this, arguments);
|
|
302
|
-
}
|
|
286
|
+
exports.getMaxTVOSSDK = getMaxTVOSSDK;
|
|
303
287
|
|
|
304
|
-
function
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
}),
|
|
312
|
-
stdout = _ref7.stdout;
|
|
313
|
-
|
|
314
|
-
let plistContent = (0, _plist.parse)(stdout);
|
|
315
|
-
let devicesFound = [];
|
|
316
|
-
let entriesToSearch = [plistContent[0]];
|
|
317
|
-
|
|
318
|
-
while (entriesToSearch.length > 0) {
|
|
319
|
-
let currentEntry = entriesToSearch.pop();
|
|
320
|
-
|
|
321
|
-
if (currentEntry instanceof Array) {
|
|
322
|
-
entriesToSearch = entriesToSearch.concat(currentEntry);
|
|
323
|
-
} 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")) {
|
|
324
|
-
let deviceInfo = {
|
|
325
|
-
name: currentEntry._name,
|
|
326
|
-
udid: currentEntry.serial_num,
|
|
327
|
-
productId: currentEntry.product_id,
|
|
328
|
-
deviceVersion: currentEntry.bcd_device
|
|
329
|
-
};
|
|
330
|
-
devicesFound.push(deviceInfo);
|
|
331
|
-
} else if (currentEntry._items) {
|
|
332
|
-
entriesToSearch = entriesToSearch.concat(currentEntry._items);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
return devicesFound;
|
|
288
|
+
async function getConnectedDevices(timeout = XCRUN_TIMEOUT) {
|
|
289
|
+
const cmd = '/usr/sbin/system_profiler';
|
|
290
|
+
const args = ['-xml', 'SPUSBDataType'];
|
|
291
|
+
let {
|
|
292
|
+
stdout
|
|
293
|
+
} = await (0, _teen_process.exec)(cmd, args, {
|
|
294
|
+
timeout
|
|
337
295
|
});
|
|
338
|
-
|
|
339
|
-
|
|
296
|
+
let plistContent = (0, _plist.parse)(stdout);
|
|
297
|
+
let devicesFound = [];
|
|
298
|
+
let entriesToSearch = [plistContent[0]];
|
|
299
|
+
|
|
300
|
+
while (entriesToSearch.length > 0) {
|
|
301
|
+
let currentEntry = entriesToSearch.pop();
|
|
302
|
+
|
|
303
|
+
if (currentEntry instanceof Array) {
|
|
304
|
+
entriesToSearch = entriesToSearch.concat(currentEntry);
|
|
305
|
+
} 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')) {
|
|
306
|
+
let deviceInfo = {
|
|
307
|
+
name: currentEntry._name,
|
|
308
|
+
udid: currentEntry.serial_num,
|
|
309
|
+
productId: currentEntry.product_id,
|
|
310
|
+
deviceVersion: currentEntry.bcd_device
|
|
311
|
+
};
|
|
312
|
+
devicesFound.push(deviceInfo);
|
|
313
|
+
} else if (currentEntry._items) {
|
|
314
|
+
entriesToSearch = entriesToSearch.concat(currentEntry._items);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
340
317
|
|
|
341
|
-
|
|
342
|
-
return _getInstrumentsPathWithoutRetry.apply(this, arguments);
|
|
318
|
+
return devicesFound;
|
|
343
319
|
}
|
|
344
320
|
|
|
345
|
-
function
|
|
346
|
-
|
|
347
|
-
|
|
321
|
+
async function getInstrumentsPathWithoutRetry(timeout = XCRUN_TIMEOUT) {
|
|
322
|
+
const args = ['-find', 'instruments'];
|
|
323
|
+
let {
|
|
324
|
+
stdout
|
|
325
|
+
} = await runXcrunCommand(args, timeout);
|
|
348
326
|
|
|
349
|
-
|
|
350
|
-
|
|
327
|
+
if (!stdout) {
|
|
328
|
+
stdout = '';
|
|
329
|
+
}
|
|
351
330
|
|
|
352
|
-
|
|
353
|
-
stdout = "";
|
|
354
|
-
}
|
|
331
|
+
let instrumentsPath = stdout.trim();
|
|
355
332
|
|
|
356
|
-
|
|
333
|
+
if (!instrumentsPath) {
|
|
334
|
+
throw new Error(`Could not find path to instruments binary using 'xcrun ${args.join(' ')}'`);
|
|
335
|
+
}
|
|
357
336
|
|
|
358
|
-
|
|
359
|
-
throw new Error(`Could not find path to instruments binary using 'xcrun ${args.join(' ')}'`);
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
return instrumentsPath;
|
|
363
|
-
});
|
|
364
|
-
return _getInstrumentsPathWithoutRetry.apply(this, arguments);
|
|
337
|
+
return instrumentsPath;
|
|
365
338
|
}
|
|
366
339
|
|
|
367
|
-
const getInstrumentsPath = _lodash.default.memoize(function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
340
|
+
const getInstrumentsPath = _lodash.default.memoize(function getInstrumentsPath(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
368
341
|
return (0, _asyncbox.retry)(retries, getInstrumentsPathWithoutRetry, timeout);
|
|
369
342
|
});
|
|
370
343
|
|
|
344
|
+
exports.getInstrumentsPath = getInstrumentsPath;
|
|
345
|
+
|
|
371
346
|
function clearInternalCache() {
|
|
372
347
|
const memoized = [getPath, getVersionMemoized, getAutomationTraceTemplatePath, getMaxIOSSDK, getMaxTVOSSDK, getInstrumentsPath];
|
|
373
348
|
memoized.forEach(f => {
|
|
@@ -375,23 +350,7 @@ function clearInternalCache() {
|
|
|
375
350
|
f.cache = new _lodash.default.memoize.Cache();
|
|
376
351
|
}
|
|
377
352
|
});
|
|
378
|
-
}
|
|
353
|
+
}require('source-map-support').install();
|
|
354
|
+
|
|
379
355
|
|
|
380
|
-
var _default = {
|
|
381
|
-
getPath,
|
|
382
|
-
getVersion,
|
|
383
|
-
getAutomationTraceTemplatePath,
|
|
384
|
-
getMaxIOSSDK,
|
|
385
|
-
getAutomationTraceTemplatePathWithoutRetry,
|
|
386
|
-
getMaxIOSSDKWithoutRetry,
|
|
387
|
-
getConnectedDevices,
|
|
388
|
-
clearInternalCache,
|
|
389
|
-
getInstrumentsPath,
|
|
390
|
-
getCommandLineToolsVersion,
|
|
391
|
-
getMaxTVOSSDK,
|
|
392
|
-
getMaxTVOSSDKWithoutRetry
|
|
393
|
-
};
|
|
394
|
-
exports.default = _default;require('source-map-support').install();
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi94Y29kZS5qcyJdLCJuYW1lcyI6WyJlbnYiLCJwcm9jZXNzIiwiWENSVU5fVElNRU9VVCIsIlhDT0RFX1NVQkRJUiIsIkRFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJoYXNFeHBlY3RlZFN1YkRpciIsInBhdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJydW5YY3J1bkNvbW1hbmQiLCJhcmdzIiwidGltZW91dCIsImVyciIsInN0ZGVyciIsIm1lc3NhZ2UiLCJnZXRQYXRoRnJvbVN5bWxpbmsiLCJmYWlsTWVzc2FnZSIsIndhcm4iLCJzeW1saW5rUGF0aCIsImxlZ2FjeVN5bWxpbmtQYXRoIiwieGNvZGVQYXRoIiwidXRpbCIsImhhc0NvbnRlbnQiLCJERVZFTE9QRVJfRElSIiwiY3VzdG9tUGF0aCIsImZzIiwiZXhpc3RzIiwibWVzZyIsIkVycm9yIiwicmVhZGxpbmsiLCJyZXBsYWNlIiwiUmVnRXhwIiwidHJpbSIsIm1zZyIsImdldFBhdGhGcm9tWGNvZGVTZWxlY3QiLCJzdGRvdXQiLCJ4Y29kZUZvbGRlclBhdGgiLCJlcnJvckFuZFRocm93IiwiZ2V0UGF0aCIsIl8iLCJtZW1vaXplIiwiY2F0Y2giLCJnZXRWZXJzaW9uV2l0aG91dFJldHJ5IiwicGxpc3RQYXRoIiwicmVzb2x2ZSIsInZlcnNpb24iLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIiwic2VtdmVyIiwiY29lcmNlIiwiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciLCJnZXRWZXJzaW9uTWVtb2l6ZWQiLCJyZXRyaWVzIiwiZ2V0VmVyc2lvbiIsInBhcnNlIiwidmVyc2lvblN0cmluZyIsInBhdGNoIiwibWFqb3IiLCJtaW5vciIsInZlcnNpb25GbG9hdCIsInBhcnNlRmxvYXQiLCJ1bmRlZmluZWQiLCJnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiIsImdldFZlcnNpb25GdW5jdGlvbnMiLCJwa2ciLCJpZ24iLCJtYXRjaCIsImV4ZWMiLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnkiLCJleHRlbnNpb25zIiwicGF0aFByZWZpeCIsInBhdGhTdWZmaXgiLCJhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzIiwidG9TdHJpbmciLCJlcnJvciIsImdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCIsImdldE1heElPU1NES1dpdGhvdXRSZXRyeSIsInNka1ZlcnNpb24iLCJnZXRNYXhJT1NTREsiLCJnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5IiwiaXNOYU4iLCJnZXRNYXhUVk9TU0RLIiwiZ2V0Q29ubmVjdGVkRGV2aWNlcyIsImNtZCIsInBsaXN0Q29udGVudCIsImRldmljZXNGb3VuZCIsImVudHJpZXNUb1NlYXJjaCIsImN1cnJlbnRFbnRyeSIsInBvcCIsIkFycmF5IiwiY29uY2F0IiwiX25hbWUiLCJpbmNsdWRlcyIsImRldmljZUluZm8iLCJuYW1lIiwidWRpZCIsInNlcmlhbF9udW0iLCJwcm9kdWN0SWQiLCJwcm9kdWN0X2lkIiwiZGV2aWNlVmVyc2lvbiIsImJjZF9kZXZpY2UiLCJwdXNoIiwiX2l0ZW1zIiwiZ2V0SW5zdHJ1bWVudHNQYXRoV2l0aG91dFJldHJ5IiwiaW5zdHJ1bWVudHNQYXRoIiwiam9pbiIsImdldEluc3RydW1lbnRzUGF0aCIsImNsZWFySW50ZXJuYWxDYWNoZSIsIm1lbW9pemVkIiwiZm9yRWFjaCIsImYiLCJjYWNoZSIsIkNhY2hlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLEdBQUcsR0FBR0MsT0FBTyxDQUFDRCxHQUFwQjtBQUVBLE1BQU1FLGFBQWEsR0FBRyxLQUF0QjtBQUNBLE1BQU1DLFlBQVksR0FBRyxxQkFBckI7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxDQUFsQzs7QUFFQSxNQUFNQyxHQUFHLEdBQUdDLHNCQUFPQyxTQUFQLENBQWlCLE9BQWpC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LE9BQU8sR0FBR25ELHlCQUFwQixFQUErQ1UsT0FBTyxHQUFHWixhQUF6RCxFQUF3RTtBQUN0RSxTQUFPLHFCQUFNcUQsT0FBTixFQUFlbUQsOEJBQWYsRUFBK0M1RixPQUEvQyxDQUFQO0FBQ0QsQ0FId0IsQ0FBM0I7O0FBTUEsU0FBU2dHLGtCQUFULEdBQStCO0FBRzdCLFFBQU1DLFFBQVEsR0FBRyxDQUNmdEUsT0FEZSxFQUNOYSxrQkFETSxFQUNjd0IsOEJBRGQsRUFDOENHLFlBRDlDLEVBRWZHLGFBRmUsRUFFQXlCLGtCQUZBLENBQWpCO0FBS0FFLEVBQUFBLFFBQVEsQ0FBQ0MsT0FBVCxDQUFrQkMsQ0FBRCxJQUFPO0FBQ3RCLFFBQUlBLENBQUMsQ0FBQ0MsS0FBTixFQUFhO0FBQ1hELE1BQUFBLENBQUMsQ0FBQ0MsS0FBRixHQUFVLElBQUl4RSxnQkFBRUMsT0FBRixDQUFVd0UsS0FBZCxFQUFWO0FBQ0Q7QUFDRixHQUpEO0FBS0Q7O2VBRWM7QUFDYjFFLEVBQUFBLE9BRGE7QUFDSmUsRUFBQUEsVUFESTtBQUNRc0IsRUFBQUEsOEJBRFI7QUFDd0NHLEVBQUFBLFlBRHhDO0FBRWJWLEVBQUFBLDBDQUZhO0FBRStCUSxFQUFBQSx3QkFGL0I7QUFHYk0sRUFBQUEsbUJBSGE7QUFHUXlCLEVBQUFBLGtCQUhSO0FBRzRCRCxFQUFBQSxrQkFINUI7QUFJYjVDLEVBQUFBLDBCQUphO0FBSWVtQixFQUFBQSxhQUpmO0FBSThCRixFQUFBQTtBQUo5QixDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRpbCwgZnMsIHBsaXN0LCBsb2dnZXIgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHJldHJ5IH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlUGxpc3REYXRhIH0gZnJvbSAncGxpc3QnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cblxuY29uc3QgZW52ID0gcHJvY2Vzcy5lbnY7XG5cbmNvbnN0IFhDUlVOX1RJTUVPVVQgPSAxNTAwMDtcbmNvbnN0IFhDT0RFX1NVQkRJUiA9IFwiL0NvbnRlbnRzL0RldmVsb3BlclwiO1xuY29uc3QgREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUyA9IDM7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1hjb2RlJyk7XG5cblxuZnVuY3Rpb24gaGFzRXhwZWN0ZWRTdWJEaXIgKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKHBhdGgubGVuZ3RoIC0gWENPREVfU1VCRElSLmxlbmd0aCkgPT09IFhDT0RFX1NVQkRJUjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuWGNydW5Db21tYW5kIChhcmdzLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBleGVjKCd4Y3J1bicsIGFyZ3MsIHt0aW1lb3V0fSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIHRoZSB0cnVlIGVycm9yIGNhbiBiZSBoaWRkZW4gd2l0aGluIHRoZSBzdGRlcnJcbiAgICBpZiAoZXJyLnN0ZGVycikge1xuICAgICAgZXJyLm1lc3NhZ2UgPSBgJHtlcnIubWVzc2FnZX06ICR7ZXJyLnN0ZGVycn1gO1xuICAgIH1cblxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQYXRoRnJvbVN5bWxpbmsgKGZhaWxNZXNzYWdlKSB7XG4gIC8vIE5vZGUncyBpbnZvY2F0aW9uIG9mIHhjb2RlLXNlbGVjdCBzb21ldGltZXMgZmxha2VzIGFuZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy5cbiAgLy8gTm90IGNsZWFyIHdoeS4gQXMgYSB3b3JrYXJvdW5kLCBBcHBpdW0gY2FuIHJlbGlhYmx5IGRlZHVjZSB0aGUgdmVyc2lvbiBpbiB1c2UgYnkgY2hlY2tpbmdcbiAgLy8gdGhlIGxvY2F0aW9ucyB4Y29kZS1zZWxlY3QgdXNlcyB0byBzdG9yZSB0aGUgc2VsZWN0ZWQgdmVyc2lvbidzIHBhdGguIFRoaXMgc2hvdWxkIGJlIDEwMCVcbiAgLy8gcmVsaWFibGUgc28gbG9uZyBhcyB0aGUgbGluayBsb2NhdGlvbnMgcmVtYWluIHRoZSBzYW1lLiBIb3dldmVyLCBzaW5jZSB3ZSdyZSByZWx5aW5nIG9uXG4gIC8vIGhhcmRjb2RlZCBwYXRocywgdGhpcyBhcHByb2FjaCB3aWxsIGJyZWFrIHRoZSBuZXh0IHRpbWUgQXBwbGUgY2hhbmdlcyB0aGUgc3ltbGluayBsb2NhdGlvbi5cbiAgbG9nLndhcm4oYEZpbmRpbmcgWGNvZGVQYXRoIGJ5IHN5bWxpbmsgYmVjYXVzZSAke2ZhaWxNZXNzYWdlfWApO1xuXG4gIGNvbnN0IHN5bWxpbmtQYXRoID0gXCIvdmFyL2RiL3hjb2RlX3NlbGVjdF9saW5rXCI7XG4gIGNvbnN0IGxlZ2FjeVN5bWxpbmtQYXRoID0gXCIvdXNyL3NoYXJlL3hjb2RlLXNlbGVjdC94Y29kZV9kaXJfbGlua1wiOyAvLyAgWGNvZGUgPCA1LnhcbiAgbGV0IHhjb2RlUGF0aCA9IG51bGw7XG5cbiAgLy8geGNvZGUtc2VsZWN0IGFsbG93cyB1c2VycyB0byBvdmVycmlkZSBpdHMgc2V0dGluZ3Mgd2l0aCB0aGUgREVWRUxPUEVSX0RJUiBlbnYgdmFyLFxuICAvLyBzbyBjaGVjayB0aGF0IGZpcnN0XG4gIGlmICh1dGlsLmhhc0NvbnRlbnQoZW52LkRFVkVMT1BFUl9ESVIpKSB7XG4gICAgY29uc3QgY3VzdG9tUGF0aCA9IGhhc0V4cGVjdGVkU3ViRGlyKGVudi5ERVZFTE9QRVJfRElSKVxuICAgICAgPyBlbnYuREVWRUxPUEVSX0RJUlxuICAgICAgOiBlbnYuREVWRUxPUEVSX0RJUiArIFhDT0RFX1NVQkRJUjtcblxuICAgIGlmIChhd2FpdCBmcy5leGlzdHMoY3VzdG9tUGF0aCkpIHtcbiAgICAgIHhjb2RlUGF0aCA9IGN1c3RvbVBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBtZXNnID0gYENvdWxkIG5vdCBmaW5kIHBhdGggdG8gWGNvZGUsIGVudmlyb25tZW50IHZhcmlhYmxlIGAgK1xuICAgICAgICAgICAgICAgICBgREVWRUxPUEVSX0RJUiBzZXQgdG86ICR7ZW52LkRFVkVMT1BFUl9ESVJ9IGAgK1xuICAgICAgICAgICAgICAgICBgYnV0IG5vIFhjb2RlIGZvdW5kYDtcbiAgICAgIGxvZy53YXJuKG1lc2cpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc2cpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChhd2FpdCBmcy5leGlzdHMoc3ltbGlua1BhdGgpKSB7XG4gICAgeGNvZGVQYXRoID0gYXdhaXQgZnMucmVhZGxpbmsoc3ltbGlua1BhdGgpO1xuICB9IGVsc2UgaWYgKGF3YWl0IGZzLmV4aXN0cyhsZWdhY3lTeW1saW5rUGF0aCkpIHtcbiAgICB4Y29kZVBhdGggPSBhd2FpdCBmcy5yZWFkbGluayhsZWdhY3lTeW1saW5rUGF0aCk7XG4gIH1cblxuICBpZiAoeGNvZGVQYXRoKSB7XG4gICAgcmV0dXJuIHhjb2RlUGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoXCIvJFwiKSwgXCJcIikudHJpbSgpO1xuICB9XG5cbiAgLy8gV2Ugc2hvdWxkIG9ubHkgZ2V0IGhlcmUgaXMgd2UgZmFpbGVkIHRvIGNhcHR1cmUgeGNvZGUtc2VsZWN0J3Mgc3Rkb3V0IGFuZCBvdXJcbiAgLy8gb3RoZXIgY2hlY2tzIGZhaWxlZC4gRWl0aGVyIEFwcGxlIGhhcyBtb3ZlZCB0aGUgc3ltbGluayB0byBhIG5ldyBsb2NhdGlvbiBvciB0aGUgdXNlclxuICAvLyBpcyBub3QgdXNpbmcgdGhlIGRlZmF1bHQgaW5zdGFsbC4gOTkuOTk5JSBjaGFuY2UgaXQncyB0aGUgbGF0dGVyLCBzbyBpc3N1ZSBhIHdhcm5pbmdcbiAgLy8gc2hvdWxkIHdlIGV2ZXIgaGl0IHRoZSBlZGdlIGNhc2UuXG4gIGxldCBtc2cgPSBgQ291bGQgbm90IGZpbmQgcGF0aCB0byBYY29kZSBieSBzeW1saW5rcyBsb2NhdGVkIGluICR7c3ltbGlua1BhdGh9LCBvciAke2xlZ2FjeVN5bWxpbmtQYXRofWA7XG4gIGxvZy53YXJuKG1zZyk7XG4gIHRocm93IG5ldyBFcnJvcihtc2cpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQYXRoRnJvbVhjb2RlU2VsZWN0ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBsZXQge3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZS1zZWxlY3QnLCBbJy0tcHJpbnQtcGF0aCddLCB7dGltZW91dH0pO1xuXG4gIC8vIHRyaW0gYW5kIHJlbW92ZSB0cmFpbGluZyBzbGFzaFxuICBjb25zdCB4Y29kZUZvbGRlclBhdGggPSBzdGRvdXQucmVwbGFjZSgvXFwvJC8sICcnKS50cmltKCk7XG5cbiAgaWYgKCF1dGlsLmhhc0NvbnRlbnQoeGNvZGVGb2xkZXJQYXRoKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KCd4Y29kZS1zZWxlY3QgcmV0dXJuZWQgYW4gZW1wdHkgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoYXdhaXQgZnMuZXhpc3RzKHhjb2RlRm9sZGVyUGF0aCkpIHtcbiAgICByZXR1cm4geGNvZGVGb2xkZXJQYXRoO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG1zZyA9IGB4Y29kZS1zZWxlY3QgY291bGQgbm90IGZpbmQgeGNvZGUuIFBhdGggJyR7eGNvZGVGb2xkZXJQYXRofScgZG9lcyBub3QgZXhpc3QuYDtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhtc2cpO1xuICB9XG59XG5cbmNvbnN0IGdldFBhdGggPSBfLm1lbW9pemUoZnVuY3Rpb24gKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIC8vIGZpcnN0IHdlIHRyeSB1c2luZyB4Y29kZS1zZWxlY3QgdG8gZmluZCB0aGUgcGF0aFxuICAvLyB0aGVuIHdlIHRyeSB1c2luZyB0aGUgc3ltbGlua3MgdGhhdCBBcHBsZSBoYXMgYnkgZGVmYXVsdFxuICByZXR1cm4gZ2V0UGF0aEZyb21YY29kZVNlbGVjdCh0aW1lb3V0KS5jYXRjaChnZXRQYXRoRnJvbVN5bWxpbmspO1xufSk7XG5cblxuXG5hc3luYyBmdW5jdGlvbiBnZXRWZXJzaW9uV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB4Y29kZVBhdGggPSBhd2FpdCBnZXRQYXRoKHRpbWVvdXQpO1xuXG4gIC8vIHdlIHdhbnQgdG8gcmVhZCB0aGUgQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmcgZnJvbSBYY29kZSdzIHBsaXN0LlxuICAvLyBJdCBzaG91bGQgYmUgaW4gL1tyb290XS9YQ29kZS5hcHAvQ29udGVudHMvXG4gIGNvbnN0IHBsaXN0UGF0aCA9IHBhdGgucmVzb2x2ZSh4Y29kZVBhdGgsIFwiLi5cIiwgXCJJbmZvLnBsaXN0XCIpO1xuXG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHBsaXN0UGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgWGNvZGUgdmVyc2lvbi4gJHtwbGlzdFBhdGh9IGRvZXMgbm90IGV4aXN0IG9uIGRpc2suYCk7XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocGxpc3RQYXRoKTtcbiAgcmV0dXJuIHNlbXZlci5jb2VyY2UodmVyc2lvbi5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyk7XG59XG5cbmNvbnN0IGdldFZlcnNpb25NZW1vaXplZCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRWZXJzaW9uV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0VmVyc2lvbiAocGFyc2UgPSBmYWxzZSwgcmV0cmllcyA9IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGNvbnN0IHZlcnNpb24gPSBhd2FpdCBnZXRWZXJzaW9uTWVtb2l6ZWQocmV0cmllcywgdGltZW91dCk7XG4gIC8vIHhjb2RlIHZlcnNpb24gc3RyaW5ncyBhcmUgbm90IGV4YWN0bHkgc2VtdmVyIHN0cmluZzogcGF0Y2ggdmVyc2lvbnMgb2YgMFxuICAvLyBhcmUgcmVtb3ZlZCAoZS5nLiwgJzEwLjAuMCcgPT4gJzEwLjAnKVxuICBjb25zdCB2ZXJzaW9uU3RyaW5nID0gdmVyc2lvbi5wYXRjaCA+IDAgPyB2ZXJzaW9uLnZlcnNpb24gOiBgJHt2ZXJzaW9uLm1ham9yfS4ke3ZlcnNpb24ubWlub3J9YDtcbiAgaWYgKCFwYXJzZSkge1xuICAgIHJldHVybiB2ZXJzaW9uU3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uU3RyaW5nLFxuICAgIHZlcnNpb25GbG9hdDogcGFyc2VGbG9hdCh2ZXJzaW9uU3RyaW5nKSxcbiAgICBtYWpvcjogdmVyc2lvbi5tYWpvcixcbiAgICBtaW5vcjogdmVyc2lvbi5taW5vcixcbiAgICBwYXRjaDogdmVyc2lvbi5wYXRjaCA+IDAgPyB2ZXJzaW9uLnBhdGNoIDogdW5kZWZpbmVkXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uICgpIHtcbiAgLy8gdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGRpZmZlcmVudCB3YXlzIHRoYXQgdGhlIENMSSB0b29scyB2ZXJzaW9uIGhhcyBiZWVuXG4gIC8vIHJlcHJlc2VudGVkLiBUcnkgdGhlbSBmcm9tIG1vc3QgcmVsaWFibGUgdG8gbGVhc3QsIGZhbGxpbmcgZG93biB0aGUgY2hhaW5cbiAgY29uc3QgZ2V0VmVyc2lvbkZ1bmN0aW9ucyA9IFtcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgcGtnID0gKGF3YWl0IGV4ZWMoJ3BrZ3V0aWwnLCBbJy0tcGtncz1jb20uYXBwbGUucGtnLkRldlNES18uKiddKSkuc3Rkb3V0O1xuICAgICAgcmV0dXJuIChhd2FpdCBleGVjKCdwa2d1dGlsJywgW2AtLXBrZy1pbmZvPSR7cGtnLnRyaW0oKX1gXSkpLnN0ZG91dDtcbiAgICB9LFxuICAgIGFzeW5jICgpID0+IChhd2FpdCBleGVjKCdwa2d1dGlsJywgW2AtLXBrZy1pbmZvPWNvbS5hcHBsZS5wa2cuQ0xUb29sc19FeGVjdXRhYmxlc2BdKSkuc3Rkb3V0LFxuICAgIGFzeW5jICgpID0+IChhd2FpdCBleGVjKCdwa2d1dGlsJywgW2AtLXBrZy1pbmZvPWNvbS5hcHBsZS5wa2cuRGV2ZWxvcGVyVG9vbHNDTElgXSkpLnN0ZG91dCxcbiAgXTtcbiAgbGV0IHN0ZG91dDtcbiAgZm9yIChsZXQgZ2V0VmVyc2lvbiBvZiBnZXRWZXJzaW9uRnVuY3Rpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0ZG91dCA9IGF3YWl0IGdldFZlcnNpb24oKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgc3Rkb3V0ID0gJyc7XG4gICAgfVxuICB9XG5cbiAgLy8gc3Rkb3V0IHNob3VsZCBoYXZlIGEgbGluZSBsaWtlIGB2ZXJzaW9uOiA4LjAuMC4wLjEuMTQ3MjQzNTg4MWBcbiAgbGV0IG1hdGNoID0gL152ZXJzaW9uOiAoLispJC9tLmV4ZWMoc3Rkb3V0KTsgLy8gaHR0cHM6Ly9yZWdleDEwMS5jb20vci9IVjN4NGQvMVxuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB4Y29kZVBhdGggPSBhd2FpdCBnZXRQYXRoKHRpbWVvdXQpO1xuXG4gIC8vIGZvciBpb3MgOCBhbmQgdXAsIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgQXV0aW9tYXRpb25JbnN0cnVtZW50IGNoYW5nZWQuXG4gIC8vIHJhdGhlciB0aGFuIHdhc3RlIHRpbWUgZ2V0dGluZyB0aGUgaU9TU0RLVmVyc2lvbiwganVzdCBnZXQgYm90aCBwYXRocyBhbmQgc2VlIHdoaWNoIG9uZSBleGlzdHNcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsneHJwbHVnaW4nLCAnYnVuZGxlJ107XG4gIGNvbnN0IHBhdGhQcmVmaXggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCBcIi4uL0FwcGxpY2F0aW9ucy9JbnN0cnVtZW50cy5hcHAvQ29udGVudHMvUGx1Z0luc1wiKTtcbiAgY29uc3QgcGF0aFN1ZmZpeCA9IFwiQ29udGVudHMvUmVzb3VyY2VzL0F1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZVwiO1xuICBsZXQgYXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRocyA9IFtcbiAgICBwYXRoLnJlc29sdmUocGF0aFByZWZpeCwgYEF1dG9tYXRpb25JbnN0cnVtZW50LiR7ZXh0ZW5zaW9uc1swXX1gLCBwYXRoU3VmZml4KSxcbiAgICBwYXRoLnJlc29sdmUocGF0aFByZWZpeCwgYEF1dG9tYXRpb25JbnN0cnVtZW50LiR7ZXh0ZW5zaW9uc1sxXX1gLCBwYXRoU3VmZml4KVxuICBdO1xuXG4gIGlmIChhd2FpdCBmcy5leGlzdHMoYXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoc1swXSkpIHtcbiAgICByZXR1cm4gYXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoc1swXTtcbiAgfVxuXG4gIGlmIChhd2FpdCBmcy5leGlzdHMoYXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoc1sxXSkpIHtcbiAgICByZXR1cm4gYXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoc1sxXTtcbiAgfVxuXG4gIGNvbnN0IG1zZyA9IFwiQ291bGQgbm90IGZpbmQgQXV0b21hdGlvbi50cmFjZXRlbXBsYXRlIGluIGFueSBvZiB0aGUgZm9sbG93aW5nXCIgK1xuICAgICAgICAgICAgICBgbG9jYXRpb25zICR7YXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRocy50b1N0cmluZygpfWA7XG4gIGxvZy5lcnJvcihtc2cpO1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcblxufVxuXG5jb25zdCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGggPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbihmYWxzZSwgREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCk7XG4gIGlmICh2ZXJzaW9uWzBdID09PSAnNCcpIHtcbiAgICByZXR1cm4gJzYuMSc7XG4gIH1cblxuICBjb25zdCBhcmdzID0gWyctLXNkaycsICdpcGhvbmVzaW11bGF0b3InLCAnLS1zaG93LXNkay12ZXJzaW9uJ107XG4gIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgcnVuWGNydW5Db21tYW5kKGFyZ3MsIHRpbWVvdXQpO1xuXG4gIGNvbnN0IHNka1ZlcnNpb24gPSBzdGRvdXQudHJpbSgpO1xuICBjb25zdCBtYXRjaCA9IC9cXGQuXFxkLy5leGVjKHN0ZG91dCk7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgeGNydW4gcmV0dXJuZWQgYSBub24tbnVtZXJpYyBpT1MgU0RLIHZlcnNpb246ICcke3Nka1ZlcnNpb259J2ApO1xuICB9XG5cbiAgcmV0dXJuIHNka1ZlcnNpb247XG59XG5cbmNvbnN0IGdldE1heElPU1NESyA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksIHRpbWVvdXQpO1xuICB9XG4pO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCBhcmdzID0gWyctLXNkaycsICdhcHBsZXR2c2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBjb25zdCBzZGtWZXJzaW9uID0gc3Rkb3V0LnRyaW0oKTtcblxuICBpZiAoaXNOYU4ocGFyc2VGbG9hdChzZGtWZXJzaW9uKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHhjcnVuIHJldHVybmVkIGEgbm9uLW51bWVyaWMgdHZPUyBTREsgdmVyc2lvbjogJyR7c2RrVmVyc2lvbn0nYCk7XG4gIH1cblxuICByZXR1cm4gc2RrVmVyc2lvbjtcbn1cblxuY29uc3QgZ2V0TWF4VFZPU1NESyA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ubmVjdGVkRGV2aWNlcyAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgY21kID0gJy91c3Ivc2Jpbi9zeXN0ZW1fcHJvZmlsZXInO1xuICBjb25zdCBhcmdzID0gWycteG1sJywgJ1NQVVNCRGF0YVR5cGUnXTtcbiAgbGV0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyhjbWQsIGFyZ3MsIHt0aW1lb3V0fSk7XG4gIGxldCBwbGlzdENvbnRlbnQgPSBwYXJzZVBsaXN0RGF0YShzdGRvdXQpO1xuXG4gIGxldCBkZXZpY2VzRm91bmQgPSBbXTtcbiAgbGV0IGVudHJpZXNUb1NlYXJjaCA9IFtwbGlzdENvbnRlbnRbMF1dO1xuICB3aGlsZSAoZW50cmllc1RvU2VhcmNoLmxlbmd0aCA+IDApIHtcbiAgICBsZXQgY3VycmVudEVudHJ5ID0gZW50cmllc1RvU2VhcmNoLnBvcCgpO1xuICAgIGlmIChjdXJyZW50RW50cnkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgZW50cmllc1RvU2VhcmNoID0gZW50cmllc1RvU2VhcmNoLmNvbmNhdChjdXJyZW50RW50cnkpO1xuICAgIH0gZWxzZSBpZiAoKGN1cnJlbnRFbnRyeS5fbmFtZSAmJlxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5fbmFtZS5zdWJzdHJpbmcoMCwgNCkgPT09IFwiaVBhZFwiKSB8fFxuICAgICAgICAgICAgICAgKGN1cnJlbnRFbnRyeS5fbmFtZSAmJlxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5fbmFtZS5zdWJzdHJpbmcoMCwgNikgPT09IFwiaVBob25lXCIpIHx8XG4gICAgICAgICAgICAgICAoY3VycmVudEVudHJ5Ll9uYW1lICYmIF8uaW5jbHVkZXMoY3VycmVudEVudHJ5Ll9uYW1lLCBcIkFwcGxlIFRWXCIpKSkge1xuICAgICAgbGV0IGRldmljZUluZm8gPSB7XG4gICAgICAgIG5hbWU6IGN1cnJlbnRFbnRyeS5fbmFtZSxcbiAgICAgICAgdWRpZDogY3VycmVudEVudHJ5LnNlcmlhbF9udW0sXG4gICAgICAgIHByb2R1Y3RJZDogY3VycmVudEVudHJ5LnByb2R1Y3RfaWQsXG4gICAgICAgIGRldmljZVZlcnNpb246IGN1cnJlbnRFbnRyeS5iY2RfZGV2aWNlXG4gICAgICB9O1xuICAgICAgZGV2aWNlc0ZvdW5kLnB1c2goZGV2aWNlSW5mbyk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50RW50cnkuX2l0ZW1zKSB7XG4gICAgICBlbnRyaWVzVG9TZWFyY2ggPSBlbnRyaWVzVG9TZWFyY2guY29uY2F0KGN1cnJlbnRFbnRyeS5faXRlbXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGV2aWNlc0ZvdW5kO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRJbnN0cnVtZW50c1BhdGhXaXRob3V0UmV0cnkgKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGNvbnN0IGFyZ3MgPSBbJy1maW5kJywgJ2luc3RydW1lbnRzJ107XG4gIGxldCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBpZiAoIXN0ZG91dCkge1xuICAgIHN0ZG91dCA9IFwiXCI7XG4gIH1cblxuICBsZXQgaW5zdHJ1bWVudHNQYXRoID0gc3Rkb3V0LnRyaW0oKTtcblxuICBpZiAoIWluc3RydW1lbnRzUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgcGF0aCB0byBpbnN0cnVtZW50cyBiaW5hcnkgdXNpbmcgJ3hjcnVuICR7YXJncy5qb2luKCcgJyl9J2ApO1xuICB9XG5cbiAgcmV0dXJuIGluc3RydW1lbnRzUGF0aDtcbn1cblxuY29uc3QgZ2V0SW5zdHJ1bWVudHNQYXRoID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiAocmV0cmllcyA9IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gICAgcmV0dXJuIHJldHJ5KHJldHJpZXMsIGdldEluc3RydW1lbnRzUGF0aFdpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmZ1bmN0aW9uIGNsZWFySW50ZXJuYWxDYWNoZSAoKSB7XG5cbiAgLy8gbWVtb2l6ZWQgZnVuY3Rpb25zXG4gIGNvbnN0IG1lbW9pemVkID0gW1xuICAgIGdldFBhdGgsIGdldFZlcnNpb25NZW1vaXplZCwgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoLCBnZXRNYXhJT1NTREssXG4gICAgZ2V0TWF4VFZPU1NESywgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBdO1xuXG4gIG1lbW9pemVkLmZvckVhY2goKGYpID0+IHtcbiAgICBpZiAoZi5jYWNoZSkge1xuICAgICAgZi5jYWNoZSA9IG5ldyBfLm1lbW9pemUuQ2FjaGUoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGdldFBhdGgsIGdldFZlcnNpb24sIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCwgZ2V0TWF4SU9TU0RLLFxuICBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnksIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q29ubmVjdGVkRGV2aWNlcywgY2xlYXJJbnRlcm5hbENhY2hlLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIGdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uLCBnZXRNYXhUVk9TU0RLLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LFxufTtcbiJdLCJmaWxlIjoibGliL3hjb2RlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
|
356
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi94Y29kZS5qcyJdLCJuYW1lcyI6WyJlbnYiLCJwcm9jZXNzIiwiWENSVU5fVElNRU9VVCIsIlhDT0RFX1NVQkRJUiIsIkRFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJoYXNFeHBlY3RlZFN1YkRpciIsInBhdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJydW5YY3J1bkNvbW1hbmQiLCJhcmdzIiwidGltZW91dCIsInJlcyIsIl8iLCJpc1VuZGVmaW5lZCIsIkVycm9yIiwiam9pbiIsImVyciIsInN0ZGVyciIsIm1lc3NhZ2UiLCJnZXRQYXRoRnJvbVN5bWxpbmsiLCJmYWlsTWVzc2FnZSIsIndhcm4iLCJzeW1saW5rUGF0aCIsImxlZ2FjeVN5bWxpbmtQYXRoIiwieGNvZGVQYXRoIiwidXRpbCIsImhhc0NvbnRlbnQiLCJERVZFTE9QRVJfRElSIiwiY3VzdG9tUGF0aCIsImZzIiwiZXhpc3RzIiwibWVzZyIsInJlYWRsaW5rIiwicmVwbGFjZSIsIlJlZ0V4cCIsInRyaW0iLCJtc2ciLCJnZXRQYXRoRnJvbVhjb2RlU2VsZWN0Iiwic3Rkb3V0IiwieGNvZGVGb2xkZXJQYXRoIiwiZXJyb3JBbmRUaHJvdyIsImdldFBhdGgiLCJtZW1vaXplIiwiY2F0Y2giLCJnZXRWZXJzaW9uV2l0aG91dFJldHJ5IiwicGxpc3RQYXRoIiwicmVzb2x2ZSIsInZlcnNpb24iLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIiwic2VtdmVyIiwiY29lcmNlIiwiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciLCJnZXRWZXJzaW9uTWVtb2l6ZWQiLCJyZXRyaWVzIiwiZ2V0VmVyc2lvbiIsInBhcnNlIiwidmVyc2lvblN0cmluZyIsInBhdGNoIiwibWFqb3IiLCJtaW5vciIsInZlcnNpb25GbG9hdCIsInBhcnNlRmxvYXQiLCJ1bmRlZmluZWQiLCJ0b1N0cmluZyIsImdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uIiwiZ2V0VmVyc2lvbkZ1bmN0aW9ucyIsInBrZyIsImlnbiIsIm1hdGNoIiwiZXhlYyIsImdldENsYW5nVmVyc2lvbiIsIndoaWNoIiwiZSIsImluZm8iLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnkiLCJleHRlbnNpb25zIiwicGF0aFByZWZpeCIsInBhdGhTdWZmaXgiLCJhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzIiwiZXJyb3IiLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgiLCJnZXRNYXhJT1NTREtXaXRob3V0UmV0cnkiLCJzZGtWZXJzaW9uIiwiZ2V0TWF4SU9TU0RLRnJvbVhjb2RlVmVyc2lvbiIsImdldE1heElPU1NESyIsImdldE1heFRWT1NTREtXaXRob3V0UmV0cnkiLCJpc05hTiIsImdldE1heFRWT1NTREsiLCJnZXRDb25uZWN0ZWREZXZpY2VzIiwiY21kIiwicGxpc3RDb250ZW50IiwiZGV2aWNlc0ZvdW5kIiwiZW50cmllc1RvU2VhcmNoIiwiY3VycmVudEVudHJ5IiwicG9wIiwiQXJyYXkiLCJjb25jYXQiLCJfbmFtZSIsImluY2x1ZGVzIiwiZGV2aWNlSW5mbyIsIm5hbWUiLCJ1ZGlkIiwic2VyaWFsX251bSIsInByb2R1Y3RJZCIsInByb2R1Y3RfaWQiLCJkZXZpY2VWZXJzaW9uIiwiYmNkX2RldmljZSIsInB1c2giLCJfaXRlbXMiLCJnZXRJbnN0cnVtZW50c1BhdGhXaXRob3V0UmV0cnkiLCJpbnN0cnVtZW50c1BhdGgiLCJnZXRJbnN0cnVtZW50c1BhdGgiLCJjbGVhckludGVybmFsQ2FjaGUiLCJtZW1vaXplZCIsImZvckVhY2giLCJmIiwiY2FjaGUiLCJDYWNoZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLEdBQUcsR0FBR0MsT0FBTyxDQUFDRCxHQUFwQjtBQUVBLE1BQU1FLGFBQWEsR0FBRyxLQUF0QjtBQUNBLE1B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RUFBYTtBQUNYQSxJQUFBQSxNQUFNLEdBQUcsRUFBVDtBQUNEOztBQUVELE1BQUl5RSxlQUFlLEdBQUd6RSxNQUFNLENBQUNILElBQVAsRUFBdEI7O0FBRUEsTUFBSSxDQUFDNEUsZUFBTCxFQUFzQjtBQUNwQixVQUFNLElBQUlqRyxLQUFKLENBQVcsMERBQXlETCxJQUFJLENBQUNNLElBQUwsQ0FBVSxHQUFWLENBQWUsR0FBbkYsQ0FBTjtBQUNEOztBQUVELFNBQU9nRyxlQUFQO0FBQ0Q7O0FBRUQsTUFBTUMsa0JBQWtCLEdBQUdwRyxnQkFBRThCLE9BQUYsQ0FDekIsU0FBU3NFLGtCQUFULENBQTZCMUQsT0FBTyxHQUFHdEQseUJBQXZDLEVBQWtFVSxPQUFPLEdBQUdaLGFBQTVFLEVBQTJGO0FBQ3pGLFNBQU8scUJBQU13RCxPQUFOLEVBQWV3RCw4QkFBZixFQUErQ3BHLE9BQS9DLENBQVA7QUFDRCxDQUh3QixDQUEzQjs7OztBQU1BLFNBQVN1RyxrQkFBVCxHQUErQjtBQUc3QixRQUFNQyxRQUFRLEdBQUcsQ0FDZnpFLE9BRGUsRUFDTlksa0JBRE0sRUFDYzRCLDhCQURkLEVBQzhDSSxZQUQ5QyxFQUVmRyxhQUZlLEVBRUF3QixrQkFGQSxDQUFqQjtBQUtBRSxFQUFBQSxRQUFRLENBQUNDLE9BQVQsQ0FBa0JDLENBQUQsSUFBTztBQUN0QixRQUFJQSxDQUFDLENBQUNDLEtBQU4sRUFBYTtBQUNYRCxNQUFBQSxDQUFDLENBQUNDLEtBQUYsR0FBVSxJQUFJekcsZ0JBQUU4QixPQUFGLENBQVU0RSxLQUFkLEVBQVY7QUFDRDtBQUNGLEdBSkQ7QUFLRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV0aWwsIGZzLCBwbGlzdCwgbG9nZ2VyIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByZXRyeSB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVBsaXN0RGF0YSB9IGZyb20gJ3BsaXN0JztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5cbmNvbnN0IGVudiA9IHByb2Nlc3MuZW52O1xuXG5jb25zdCBYQ1JVTl9USU1FT1VUID0gMTUwMDA7XG5jb25zdCBYQ09ERV9TVUJESVIgPSAnL0NvbnRlbnRzL0RldmVsb3Blcic7XG5jb25zdCBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTID0gMztcblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignWGNvZGUnKTtcblxuXG5mdW5jdGlvbiBoYXNFeHBlY3RlZFN1YkRpciAocGF0aCkge1xuICByZXR1cm4gcGF0aC5zdWJzdHJpbmcocGF0aC5sZW5ndGggLSBYQ09ERV9TVUJESVIubGVuZ3RoKSA9PT0gWENPREVfU1VCRElSO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5YY3J1bkNvbW1hbmQgKGFyZ3MsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZXhlYygneGNydW4nLCBhcmdzLCB7dGltZW91dH0pO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHJlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm90aGluZyByZXR1cm5lZCBmcm9tIHRyeWluZyB0byBydW4gJ3hjcnVuICR7YXJncy5qb2luKCcgJyl9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyB0aGUgdHJ1ZSBlcnJvciBjYW4gYmUgaGlkZGVuIHdpdGhpbiB0aGUgc3RkZXJyXG4gICAgaWYgKGVyci5zdGRlcnIpIHtcbiAgICAgIGVyci5tZXNzYWdlID0gYCR7ZXJyLm1lc3NhZ2V9OiAke2Vyci5zdGRlcnJ9YDtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UGF0aEZyb21TeW1saW5rIChmYWlsTWVzc2FnZSkge1xuICAvLyBOb2RlJ3MgaW52b2NhdGlvbiBvZiB4Y29kZS1zZWxlY3Qgc29tZXRpbWVzIGZsYWtlcyBhbmQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gIC8vIE5vdCBjbGVhciB3aHkuIEFzIGEgd29ya2Fyb3VuZCwgQXBwaXVtIGNhbiByZWxpYWJseSBkZWR1Y2UgdGhlIHZlcnNpb24gaW4gdXNlIGJ5IGNoZWNraW5nXG4gIC8vIHRoZSBsb2NhdGlvbnMgeGNvZGUtc2VsZWN0IHVzZXMgdG8gc3RvcmUgdGhlIHNlbGVjdGVkIHZlcnNpb24ncyBwYXRoLiBUaGlzIHNob3VsZCBiZSAxMDAlXG4gIC8vIHJlbGlhYmxlIHNvIGxvbmcgYXMgdGhlIGxpbmsgbG9jYXRpb25zIHJlbWFpbiB0aGUgc2FtZS4gSG93ZXZlciwgc2luY2Ugd2UncmUgcmVseWluZyBvblxuICAvLyBoYXJkY29kZWQgcGF0aHMsIHRoaXMgYXBwcm9hY2ggd2lsbCBicmVhayB0aGUgbmV4dCB0aW1lIEFwcGxlIGNoYW5nZXMgdGhlIHN5bWxpbmsgbG9jYXRpb24uXG4gIGxvZy53YXJuKGBGaW5kaW5nIFhjb2RlUGF0aCBieSBzeW1saW5rIGJlY2F1c2UgJHtmYWlsTWVzc2FnZX1gKTtcblxuICBjb25zdCBzeW1saW5rUGF0aCA9ICcvdmFyL2RiL3hjb2RlX3NlbGVjdF9saW5rJztcbiAgY29uc3QgbGVnYWN5U3ltbGlua1BhdGggPSAnL3Vzci9zaGFyZS94Y29kZS1zZWxlY3QveGNvZGVfZGlyX2xpbmsnOyAvLyAgWGNvZGUgPCA1LnhcbiAgbGV0IHhjb2RlUGF0aCA9IG51bGw7XG5cbiAgLy8geGNvZGUtc2VsZWN0IGFsbG93cyB1c2VycyB0byBvdmVycmlkZSBpdHMgc2V0dGluZ3Mgd2l0aCB0aGUgREVWRUxPUEVSX0RJUiBlbnYgdmFyLFxuICAvLyBzbyBjaGVjayB0aGF0IGZpcnN0XG4gIGlmICh1dGlsLmhhc0NvbnRlbnQoZW52LkRFVkVMT1BFUl9ESVIpKSB7XG4gICAgY29uc3QgY3VzdG9tUGF0aCA9IGhhc0V4cGVjdGVkU3ViRGlyKGVudi5ERVZFTE9QRVJfRElSKVxuICAgICAgPyBlbnYuREVWRUxPUEVSX0RJUlxuICAgICAgOiBlbnYuREVWRUxPUEVSX0RJUiArIFhDT0RFX1NVQkRJUjtcblxuICAgIGlmIChhd2FpdCBmcy5leGlzdHMoY3VzdG9tUGF0aCkpIHtcbiAgICAgIHhjb2RlUGF0aCA9IGN1c3RvbVBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBtZXNnID0gYENvdWxkIG5vdCBmaW5kIHBhdGggdG8gWGNvZGUsIGVudmlyb25tZW50IHZhcmlhYmxlIGAgK1xuICAgICAgICAgICAgICAgICBgREVWRUxPUEVSX0RJUiBzZXQgdG86ICR7ZW52LkRFVkVMT1BFUl9ESVJ9IGAgK1xuICAgICAgICAgICAgICAgICBgYnV0IG5vIFhjb2RlIGZvdW5kYDtcbiAgICAgIGxvZy53YXJuKG1lc2cpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc2cpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChhd2FpdCBmcy5leGlzdHMoc3ltbGlua1BhdGgpKSB7XG4gICAgeGNvZGVQYXRoID0gYXdhaXQgZnMucmVhZGxpbmsoc3ltbGlua1BhdGgpO1xuICB9IGVsc2UgaWYgKGF3YWl0IGZzLmV4aXN0cyhsZWdhY3lTeW1saW5rUGF0aCkpIHtcbiAgICB4Y29kZVBhdGggPSBhd2FpdCBmcy5yZWFkbGluayhsZWdhY3lTeW1saW5rUGF0aCk7XG4gIH1cblxuICBpZiAoeGNvZGVQYXRoKSB7XG4gICAgcmV0dXJuIHhjb2RlUGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoJy8kJyksICcnKS50cmltKCk7XG4gIH1cblxuICAvLyBXZSBzaG91bGQgb25seSBnZXQgaGVyZSBpcyB3ZSBmYWlsZWQgdG8gY2FwdHVyZSB4Y29kZS1zZWxlY3QncyBzdGRvdXQgYW5kIG91clxuICAvLyBvdGhlciBjaGVja3MgZmFpbGVkLiBFaXRoZXIgQXBwbGUgaGFzIG1vdmVkIHRoZSBzeW1saW5rIHRvIGEgbmV3IGxvY2F0aW9uIG9yIHRoZSB1c2VyXG4gIC8vIGlzIG5vdCB1c2luZyB0aGUgZGVmYXVsdCBpbnN0YWxsLiA5OS45OTklIGNoYW5jZSBpdCdzIHRoZSBsYXR0ZXIsIHNvIGlzc3VlIGEgd2FybmluZ1xuICAvLyBzaG91bGQgd2UgZXZlciBoaXQgdGhlIGVkZ2UgY2FzZS5cbiAgbGV0IG1zZyA9IGBDb3VsZCBub3QgZmluZCBwYXRoIHRvIFhjb2RlIGJ5IHN5bWxpbmtzIGxvY2F0ZWQgaW4gJHtzeW1saW5rUGF0aH0sIG9yICR7bGVnYWN5U3ltbGlua1BhdGh9YDtcbiAgbG9nLndhcm4obXNnKTtcbiAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFBhdGhGcm9tWGNvZGVTZWxlY3QgKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGxldCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ3hjb2RlLXNlbGVjdCcsIFsnLS1wcmludC1wYXRoJ10sIHt0aW1lb3V0fSk7XG5cbiAgLy8gdHJpbSBhbmQgcmVtb3ZlIHRyYWlsaW5nIHNsYXNoXG4gIGNvbnN0IHhjb2RlRm9sZGVyUGF0aCA9IHN0ZG91dC5yZXBsYWNlKC9cXC8kLywgJycpLnRyaW0oKTtcblxuICBpZiAoIXV0aWwuaGFzQ29udGVudCh4Y29kZUZvbGRlclBhdGgpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coJ3hjb2RlLXNlbGVjdCByZXR1cm5lZCBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlmIChhd2FpdCBmcy5leGlzdHMoeGNvZGVGb2xkZXJQYXRoKSkge1xuICAgIHJldHVybiB4Y29kZUZvbGRlclBhdGg7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbXNnID0gYHhjb2RlLXNlbGVjdCBjb3VsZCBub3QgZmluZCB4Y29kZS4gUGF0aCAnJHt4Y29kZUZvbGRlclBhdGh9JyBkb2VzIG5vdCBleGlzdC5gO1xuICAgIGxvZy5lcnJvckFuZFRocm93KG1zZyk7XG4gIH1cbn1cblxuY29uc3QgZ2V0UGF0aCA9IF8ubWVtb2l6ZShmdW5jdGlvbiBnZXRQYXRoICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAvLyBmaXJzdCB3ZSB0cnkgdXNpbmcgeGNvZGUtc2VsZWN0IHRvIGZpbmQgdGhlIHBhdGhcbiAgLy8gdGhlbiB3ZSB0cnkgdXNpbmcgdGhlIHN5bWxpbmtzIHRoYXQgQXBwbGUgaGFzIGJ5IGRlZmF1bHRcbiAgcmV0dXJuIGdldFBhdGhGcm9tWGNvZGVTZWxlY3QodGltZW91dCkuY2F0Y2goZ2V0UGF0aEZyb21TeW1saW5rKTtcbn0pO1xuXG5cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgeGNvZGVQYXRoID0gYXdhaXQgZ2V0UGF0aCh0aW1lb3V0KTtcblxuICAvLyB3ZSB3YW50IHRvIHJlYWQgdGhlIENGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIGZyb20gWGNvZGUncyBwbGlzdC5cbiAgLy8gSXQgc2hvdWxkIGJlIGluIC9bcm9vdF0vWENvZGUuYXBwL0NvbnRlbnRzL1xuICBjb25zdCBwbGlzdFBhdGggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCAnLi4nLCAnSW5mby5wbGlzdCcpO1xuXG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHBsaXN0UGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgWGNvZGUgdmVyc2lvbi4gJHtwbGlzdFBhdGh9IGRvZXMgbm90IGV4aXN0IG9uIGRpc2suYCk7XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocGxpc3RQYXRoKTtcbiAgcmV0dXJuIHNlbXZlci5jb2VyY2UodmVyc2lvbi5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyk7XG59XG5cbmNvbnN0IGdldFZlcnNpb25NZW1vaXplZCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0VmVyc2lvbk1lbW9pemVkIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFZlcnNpb24gKHBhcnNlID0gZmFsc2UsIHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbk1lbW9pemVkKHJldHJpZXMsIHRpbWVvdXQpO1xuICAvLyB4Y29kZSB2ZXJzaW9uIHN0cmluZ3MgYXJlIG5vdCBleGFjdGx5IHNlbXZlciBzdHJpbmc6IHBhdGNoIHZlcnNpb25zIG9mIDBcbiAgLy8gYXJlIHJlbW92ZWQgKGUuZy4sICcxMC4wLjAnID0+ICcxMC4wJylcbiAgY29uc3QgdmVyc2lvblN0cmluZyA9IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi52ZXJzaW9uIDogYCR7dmVyc2lvbi5tYWpvcn0uJHt2ZXJzaW9uLm1pbm9yfWA7XG4gIGlmICghcGFyc2UpIHtcbiAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvblN0cmluZyxcbiAgICB2ZXJzaW9uRmxvYXQ6IHBhcnNlRmxvYXQodmVyc2lvblN0cmluZyksXG4gICAgbWFqb3I6IHZlcnNpb24ubWFqb3IsXG4gICAgbWlub3I6IHZlcnNpb24ubWlub3IsXG4gICAgcGF0Y2g6IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi5wYXRjaCA6IHVuZGVmaW5lZCxcbiAgICB0b1N0cmluZyAoKSB7XG4gICAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiAoKSB7XG4gIC8vIHRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2F5cyB0aGF0IHRoZSBDTEkgdG9vbHMgdmVyc2lvbiBoYXMgYmVlblxuICAvLyByZXByZXNlbnRlZC4gVHJ5IHRoZW0gZnJvbSBtb3N0IHJlbGlhYmxlIHRvIGxlYXN0LCBmYWxsaW5nIGRvd24gdGhlIGNoYWluXG4gIGNvbnN0IGdldFZlcnNpb25GdW5jdGlvbnMgPSBbXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHBrZyA9IChhd2FpdCBleGVjKCdwa2d1dGlsJywgWyctLXBrZ3M9Y29tLmFwcGxlLnBrZy5EZXZTREtfLionXSkpLnN0ZG91dDtcbiAgICAgIHJldHVybiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz0ke3BrZy50cmltKCl9YF0pKS5zdGRvdXQ7XG4gICAgfSxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkNMVG9vbHNfRXhlY3V0YWJsZXNgXSkpLnN0ZG91dCxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkRldmVsb3BlclRvb2xzQ0xJYF0pKS5zdGRvdXQsXG4gIF07XG4gIGxldCBzdGRvdXQ7XG4gIGZvciAobGV0IGdldFZlcnNpb24gb2YgZ2V0VmVyc2lvbkZ1bmN0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICBzdGRvdXQgPSBhd2FpdCBnZXRWZXJzaW9uKCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIHN0ZG91dCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vIHN0ZG91dCBzaG91bGQgaGF2ZSBhIGxpbmUgbGlrZSBgdmVyc2lvbjogOC4wLjAuMC4xLjE0NzI0MzU4ODFgXG4gIGxldCBtYXRjaCA9IC9edmVyc2lvbjogKC4rKSQvbS5leGVjKHN0ZG91dCk7IC8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvSFYzeDRkLzFcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaHR0cHM6Ly90cmFjLm1hY3BvcnRzLm9yZy93aWtpL1hjb2RlVmVyc2lvbkluZm9cbiAqIHRvIHNlZSB0aGUgYWN0dWFsIG1hcHBpbmcgYmV0d2VlbiBjbGFuZyBhbmQgb3RoZXIgY29tcG9uZW50cy5cbiAqXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGFjdHVhbCBDbGFuZyB2ZXJzaW9uIGluIHgueC54Lnggb3IgeC54LnggZm9ybWF0LFxuICogd2hpY2ggaXMgc3VwcGxpZWQgd2l0aCBDb21tYW5kIExpbmUgVG9vbHMuIGBudWxsYCBpcyByZXR1cm5lZFxuICogaWYgQ0xUIGFyZSBub3QgaW5zdGFsbGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDbGFuZ1ZlcnNpb24gKCkge1xuICB0cnkge1xuICAgIGF3YWl0IGZzLndoaWNoKCdjbGFuZycpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmluZm8oJ0Nhbm5vdCBmaW5kIGNsYW5nIGV4ZWN1dGFibGUgb24gdGhlIGxvY2FsIHN5c3RlbS4gJyArXG4gICAgICAnQXJlIFhjb2RlIENvbW1hbmQgTGluZSBUb29scyBpbnN0YWxsZWQ/Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdjbGFuZycsIFsnLS12ZXJzaW9uJ10pO1xuICBjb25zdCBtYXRjaCA9IC9jbGFuZy0oWzAtOS5dKykvLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIGxvZy5pbmZvKGBDYW5ub3QgcGFyc2UgY2xhbmcgdmVyc2lvbiBmcm9tICR7c3Rkb3V0fWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBtYXRjaFsxXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB4Y29kZVBhdGggPSBhd2FpdCBnZXRQYXRoKHRpbWVvdXQpO1xuXG4gIC8vIGZvciBpb3MgOCBhbmQgdXAsIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgQXV0aW9tYXRpb25JbnN0cnVtZW50IGNoYW5nZWQuXG4gIC8vIHJhdGhlciB0aGFuIHdhc3RlIHRpbWUgZ2V0dGluZyB0aGUgaU9TU0RLVmVyc2lvbiwganVzdCBnZXQgYm90aCBwYXRocyBhbmQgc2VlIHdoaWNoIG9uZSBleGlzdHNcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsneHJwbHVnaW4nLCAnYnVuZGxlJ107XG4gIGNvbnN0IHBhdGhQcmVmaXggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCAnLi4vQXBwbGljYXRpb25zL0luc3RydW1lbnRzLmFwcC9Db250ZW50cy9QbHVnSW5zJyk7XG4gIGNvbnN0IHBhdGhTdWZmaXggPSAnQ29udGVudHMvUmVzb3VyY2VzL0F1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSc7XG4gIGxldCBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzID0gW1xuICAgIHBhdGgucmVzb2x2ZShwYXRoUHJlZml4LCBgQXV0b21hdGlvbkluc3RydW1lbnQuJHtleHRlbnNpb25zWzBdfWAsIHBhdGhTdWZmaXgpLFxuICAgIHBhdGgucmVzb2x2ZShwYXRoUHJlZml4LCBgQXV0b21hdGlvbkluc3RydW1lbnQuJHtleHRlbnNpb25zWzFdfWAsIHBhdGhTdWZmaXgpXG4gIF07XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzBdKSkge1xuICAgIHJldHVybiBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzBdO1xuICB9XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzFdKSkge1xuICAgIHJldHVybiBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzFdO1xuICB9XG5cbiAgY29uc3QgbXNnID0gJ0NvdWxkIG5vdCBmaW5kIEF1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZycgK1xuICAgICAgICAgICAgICBgbG9jYXRpb25zICR7YXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRocy50b1N0cmluZygpfWA7XG4gIGxvZy5lcnJvcihtc2cpO1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcblxufVxuXG5jb25zdCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGggPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCAocmV0cmllcyA9IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gICAgcmV0dXJuIHJldHJ5KHJldHJpZXMsIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldFZlcnNpb24oZmFsc2UsIERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQpO1xuICBpZiAodmVyc2lvblswXSA9PT0gJzQnKSB7XG4gICAgcmV0dXJuICc2LjEnO1xuICB9XG5cbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnaXBob25lc2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBjb25zdCBzZGtWZXJzaW9uID0gc3Rkb3V0LnRyaW0oKTtcbiAgY29uc3QgbWF0Y2ggPSAvXFxkLlxcZC8uZXhlYyhzdGRvdXQpO1xuXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHhjcnVuIHJldHVybmVkIGEgbm9uLW51bWVyaWMgaU9TIFNESyB2ZXJzaW9uOiAnJHtzZGtWZXJzaW9ufSdgKTtcbiAgfVxuXG4gIHJldHVybiBzZGtWZXJzaW9uO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRNYXhJT1NTREtGcm9tWGNvZGVWZXJzaW9uICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbih0cnVlLCBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0KTtcbiAgLy8gYXMgb2Ygbm93LCB0aGUgaU9TIHZlcnNpb24gYXNzb2NpYXRlZCB3aXRoIGFuIFhjb2RlIHZlcnNpb24gaXNcbiAgLy8ganVzdCB0aGUgWGNvZGUgdmVyc2lvbiArIDJcbiAgcmV0dXJuIGAke3ZlcnNpb24ubWFqb3IgKyAyfS4ke3ZlcnNpb24ubWlub3J9YDtcbn1cblxuY29uc3QgZ2V0TWF4SU9TU0RLID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiBnZXRNYXhJT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBVbmFibGUgdG8gcmV0cmlldmUgbWF4aW11bSBpT1MgdmVyc2lvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGxvZy53YXJuKCdHdWVzc2luZyBmcm9tIFhjb2RlIHZlcnNpb24nKTtcbiAgICAgIHJldHVybiBnZXRNYXhJT1NTREtGcm9tWGNvZGVWZXJzaW9uKHRpbWVvdXQpO1xuICAgIH1cbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnYXBwbGV0dnNpbXVsYXRvcicsICctLXNob3ctc2RrLXZlcnNpb24nXTtcbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBydW5YY3J1bkNvbW1hbmQoYXJncywgdGltZW91dCk7XG5cbiAgY29uc3Qgc2RrVmVyc2lvbiA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKGlzTmFOKHBhcnNlRmxvYXQoc2RrVmVyc2lvbikpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB4Y3J1biByZXR1cm5lZCBhIG5vbi1udW1lcmljIHR2T1MgU0RLIHZlcnNpb246ICcke3Nka1ZlcnNpb259J2ApO1xuICB9XG5cbiAgcmV0dXJuIHNka1ZlcnNpb247XG59XG5cbmNvbnN0IGdldE1heFRWT1NTREsgPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIGdldE1heFRWT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ubmVjdGVkRGV2aWNlcyAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgY21kID0gJy91c3Ivc2Jpbi9zeXN0ZW1fcHJvZmlsZXInO1xuICBjb25zdCBhcmdzID0gWycteG1sJywgJ1NQVVNCRGF0YVR5cGUnXTtcbiAgbGV0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyhjbWQsIGFyZ3MsIHt0aW1lb3V0fSk7XG4gIGxldCBwbGlzdENvbnRlbnQgPSBwYXJzZVBsaXN0RGF0YShzdGRvdXQpO1xuXG4gIGxldCBkZXZpY2VzRm91bmQgPSBbXTtcbiAgbGV0IGVudHJpZXNUb1NlYXJjaCA9IFtwbGlzdENvbnRlbnRbMF1dO1xuICB3aGlsZSAoZW50cmllc1RvU2VhcmNoLmxlbmd0aCA+IDApIHtcbiAgICBsZXQgY3VycmVudEVudHJ5ID0gZW50cmllc1RvU2VhcmNoLnBvcCgpO1xuICAgIGlmIChjdXJyZW50RW50cnkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgZW50cmllc1RvU2VhcmNoID0gZW50cmllc1RvU2VhcmNoLmNvbmNhdChjdXJyZW50RW50cnkpO1xuICAgIH0gZWxzZSBpZiAoKGN1cnJlbnRFbnRyeS5fbmFtZSAmJlxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5fbmFtZS5zdWJzdHJpbmcoMCwgNCkgPT09ICdpUGFkJykgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiZcbiAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkuX25hbWUuc3Vic3RyaW5nKDAsIDYpID09PSAnaVBob25lJykgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiYgXy5pbmNsdWRlcyhjdXJyZW50RW50cnkuX25hbWUsICdBcHBsZSBUVicpKSkge1xuICAgICAgbGV0IGRldmljZUluZm8gPSB7XG4gICAgICAgIG5hbWU6IGN1cnJlbnRFbnRyeS5fbmFtZSxcbiAgICAgICAgdWRpZDogY3VycmVudEVudHJ5LnNlcmlhbF9udW0sXG4gICAgICAgIHByb2R1Y3RJZDogY3VycmVudEVudHJ5LnByb2R1Y3RfaWQsXG4gICAgICAgIGRldmljZVZlcnNpb246IGN1cnJlbnRFbnRyeS5iY2RfZGV2aWNlXG4gICAgICB9O1xuICAgICAgZGV2aWNlc0ZvdW5kLnB1c2goZGV2aWNlSW5mbyk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50RW50cnkuX2l0ZW1zKSB7XG4gICAgICBlbnRyaWVzVG9TZWFyY2ggPSBlbnRyaWVzVG9TZWFyY2guY29uY2F0KGN1cnJlbnRFbnRyeS5faXRlbXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGV2aWNlc0ZvdW5kO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRJbnN0cnVtZW50c1BhdGhXaXRob3V0UmV0cnkgKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGNvbnN0IGFyZ3MgPSBbJy1maW5kJywgJ2luc3RydW1lbnRzJ107XG4gIGxldCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBpZiAoIXN0ZG91dCkge1xuICAgIHN0ZG91dCA9ICcnO1xuICB9XG5cbiAgbGV0IGluc3RydW1lbnRzUGF0aCA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKCFpbnN0cnVtZW50c1BhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHBhdGggdG8gaW5zdHJ1bWVudHMgYmluYXJ5IHVzaW5nICd4Y3J1biAke2FyZ3Muam9pbignICcpfSdgKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVtZW50c1BhdGg7XG59XG5cbmNvbnN0IGdldEluc3RydW1lbnRzUGF0aCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0SW5zdHJ1bWVudHNQYXRoIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0SW5zdHJ1bWVudHNQYXRoV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuZnVuY3Rpb24gY2xlYXJJbnRlcm5hbENhY2hlICgpIHtcblxuICAvLyBtZW1vaXplZCBmdW5jdGlvbnNcbiAgY29uc3QgbWVtb2l6ZWQgPSBbXG4gICAgZ2V0UGF0aCwgZ2V0VmVyc2lvbk1lbW9pemVkLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgICBnZXRNYXhUVk9TU0RLLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIF07XG5cbiAgbWVtb2l6ZWQuZm9yRWFjaCgoZikgPT4ge1xuICAgIGlmIChmLmNhY2hlKSB7XG4gICAgICBmLmNhY2hlID0gbmV3IF8ubWVtb2l6ZS5DYWNoZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCB7XG4gIGdldFBhdGgsIGdldFZlcnNpb24sIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCwgZ2V0TWF4SU9TU0RLLFxuICBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnksIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q29ubmVjdGVkRGV2aWNlcywgY2xlYXJJbnRlcm5hbENhY2hlLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIGdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uLCBnZXRNYXhUVk9TU0RLLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LFxuICBnZXRDbGFuZ1ZlcnNpb24sXG59O1xuIl0sImZpbGUiOiJsaWIveGNvZGUuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/index.js
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
// transpile:main
|
|
2
2
|
|
|
3
|
-
import xcode from './lib/xcode';
|
|
3
|
+
import * as xcode from './lib/xcode';
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
const {
|
|
7
|
+
getPath, getVersion, getAutomationTraceTemplatePath, getMaxIOSSDK,
|
|
8
|
+
getAutomationTraceTemplatePathWithoutRetry, getMaxIOSSDKWithoutRetry,
|
|
9
|
+
getConnectedDevices, clearInternalCache, getInstrumentsPath,
|
|
10
|
+
getCommandLineToolsVersion, getMaxTVOSSDK, getMaxTVOSSDKWithoutRetry,
|
|
11
|
+
getClangVersion,
|
|
12
|
+
} = xcode;
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
getPath, getVersion, getAutomationTraceTemplatePath, getMaxIOSSDK,
|
|
16
|
+
getAutomationTraceTemplatePathWithoutRetry, getMaxIOSSDKWithoutRetry,
|
|
17
|
+
getConnectedDevices, clearInternalCache, getInstrumentsPath,
|
|
18
|
+
getCommandLineToolsVersion, getMaxTVOSSDK, getMaxTVOSSDKWithoutRetry,
|
|
19
|
+
getClangVersion,
|
|
20
|
+
};
|
|
6
21
|
export default xcode;
|
package/lib/xcode.js
CHANGED
|
@@ -10,7 +10,7 @@ import semver from 'semver';
|
|
|
10
10
|
const env = process.env;
|
|
11
11
|
|
|
12
12
|
const XCRUN_TIMEOUT = 15000;
|
|
13
|
-
const XCODE_SUBDIR =
|
|
13
|
+
const XCODE_SUBDIR = '/Contents/Developer';
|
|
14
14
|
const DEFAULT_NUMBER_OF_RETRIES = 3;
|
|
15
15
|
|
|
16
16
|
const log = logger.getLogger('Xcode');
|
|
@@ -22,7 +22,11 @@ function hasExpectedSubDir (path) {
|
|
|
22
22
|
|
|
23
23
|
async function runXcrunCommand (args, timeout = XCRUN_TIMEOUT) {
|
|
24
24
|
try {
|
|
25
|
-
|
|
25
|
+
const res = await exec('xcrun', args, {timeout});
|
|
26
|
+
if (_.isUndefined(res)) {
|
|
27
|
+
throw new Error(`Nothing returned from trying to run 'xcrun ${args.join(' ')}'`);
|
|
28
|
+
}
|
|
29
|
+
return res;
|
|
26
30
|
} catch (err) {
|
|
27
31
|
// the true error can be hidden within the stderr
|
|
28
32
|
if (err.stderr) {
|
|
@@ -41,8 +45,8 @@ async function getPathFromSymlink (failMessage) {
|
|
|
41
45
|
// hardcoded paths, this approach will break the next time Apple changes the symlink location.
|
|
42
46
|
log.warn(`Finding XcodePath by symlink because ${failMessage}`);
|
|
43
47
|
|
|
44
|
-
const symlinkPath =
|
|
45
|
-
const legacySymlinkPath =
|
|
48
|
+
const symlinkPath = '/var/db/xcode_select_link';
|
|
49
|
+
const legacySymlinkPath = '/usr/share/xcode-select/xcode_dir_link'; // Xcode < 5.x
|
|
46
50
|
let xcodePath = null;
|
|
47
51
|
|
|
48
52
|
// xcode-select allows users to override its settings with the DEVELOPER_DIR env var,
|
|
@@ -68,7 +72,7 @@ async function getPathFromSymlink (failMessage) {
|
|
|
68
72
|
}
|
|
69
73
|
|
|
70
74
|
if (xcodePath) {
|
|
71
|
-
return xcodePath.replace(new RegExp(
|
|
75
|
+
return xcodePath.replace(new RegExp('/$'), '').trim();
|
|
72
76
|
}
|
|
73
77
|
|
|
74
78
|
// We should only get here is we failed to capture xcode-select's stdout and our
|
|
@@ -98,7 +102,7 @@ async function getPathFromXcodeSelect (timeout = XCRUN_TIMEOUT) {
|
|
|
98
102
|
}
|
|
99
103
|
}
|
|
100
104
|
|
|
101
|
-
const getPath = _.memoize(function (timeout = XCRUN_TIMEOUT) {
|
|
105
|
+
const getPath = _.memoize(function getPath (timeout = XCRUN_TIMEOUT) {
|
|
102
106
|
// first we try using xcode-select to find the path
|
|
103
107
|
// then we try using the symlinks that Apple has by default
|
|
104
108
|
return getPathFromXcodeSelect(timeout).catch(getPathFromSymlink);
|
|
@@ -111,7 +115,7 @@ async function getVersionWithoutRetry (timeout = XCRUN_TIMEOUT) {
|
|
|
111
115
|
|
|
112
116
|
// we want to read the CFBundleShortVersionString from Xcode's plist.
|
|
113
117
|
// It should be in /[root]/XCode.app/Contents/
|
|
114
|
-
const plistPath = path.resolve(xcodePath,
|
|
118
|
+
const plistPath = path.resolve(xcodePath, '..', 'Info.plist');
|
|
115
119
|
|
|
116
120
|
if (!await fs.exists(plistPath)) {
|
|
117
121
|
throw new Error(`Could not get Xcode version. ${plistPath} does not exist on disk.`);
|
|
@@ -122,7 +126,7 @@ async function getVersionWithoutRetry (timeout = XCRUN_TIMEOUT) {
|
|
|
122
126
|
}
|
|
123
127
|
|
|
124
128
|
const getVersionMemoized = _.memoize(
|
|
125
|
-
function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
129
|
+
function getVersionMemoized (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
126
130
|
return retry(retries, getVersionWithoutRetry, timeout);
|
|
127
131
|
}
|
|
128
132
|
);
|
|
@@ -141,7 +145,10 @@ async function getVersion (parse = false, retries = DEFAULT_NUMBER_OF_RETRIES, t
|
|
|
141
145
|
versionFloat: parseFloat(versionString),
|
|
142
146
|
major: version.major,
|
|
143
147
|
minor: version.minor,
|
|
144
|
-
patch: version.patch > 0 ? version.patch : undefined
|
|
148
|
+
patch: version.patch > 0 ? version.patch : undefined,
|
|
149
|
+
toString () {
|
|
150
|
+
return versionString;
|
|
151
|
+
},
|
|
145
152
|
};
|
|
146
153
|
}
|
|
147
154
|
|
|
@@ -171,14 +178,39 @@ async function getCommandLineToolsVersion () {
|
|
|
171
178
|
return match ? match[1] : undefined;
|
|
172
179
|
}
|
|
173
180
|
|
|
181
|
+
/**
|
|
182
|
+
* Check https://trac.macports.org/wiki/XcodeVersionInfo
|
|
183
|
+
* to see the actual mapping between clang and other components.
|
|
184
|
+
*
|
|
185
|
+
* @returns {?string} The actual Clang version in x.x.x.x or x.x.x format,
|
|
186
|
+
* which is supplied with Command Line Tools. `null` is returned
|
|
187
|
+
* if CLT are not installed.
|
|
188
|
+
*/
|
|
189
|
+
async function getClangVersion () {
|
|
190
|
+
try {
|
|
191
|
+
await fs.which('clang');
|
|
192
|
+
} catch (e) {
|
|
193
|
+
log.info('Cannot find clang executable on the local system. ' +
|
|
194
|
+
'Are Xcode Command Line Tools installed?');
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
const {stdout} = await exec('clang', ['--version']);
|
|
198
|
+
const match = /clang-([0-9.]+)/.exec(stdout);
|
|
199
|
+
if (!match) {
|
|
200
|
+
log.info(`Cannot parse clang version from ${stdout}`);
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
return match[1];
|
|
204
|
+
}
|
|
205
|
+
|
|
174
206
|
async function getAutomationTraceTemplatePathWithoutRetry (timeout = XCRUN_TIMEOUT) {
|
|
175
207
|
const xcodePath = await getPath(timeout);
|
|
176
208
|
|
|
177
209
|
// for ios 8 and up, the file extension for AutiomationInstrument changed.
|
|
178
210
|
// rather than waste time getting the iOSSDKVersion, just get both paths and see which one exists
|
|
179
211
|
const extensions = ['xrplugin', 'bundle'];
|
|
180
|
-
const pathPrefix = path.resolve(xcodePath,
|
|
181
|
-
const pathSuffix =
|
|
212
|
+
const pathPrefix = path.resolve(xcodePath, '../Applications/Instruments.app/Contents/PlugIns');
|
|
213
|
+
const pathSuffix = 'Contents/Resources/Automation.tracetemplate';
|
|
182
214
|
let automationTraceTemplatePaths = [
|
|
183
215
|
path.resolve(pathPrefix, `AutomationInstrument.${extensions[0]}`, pathSuffix),
|
|
184
216
|
path.resolve(pathPrefix, `AutomationInstrument.${extensions[1]}`, pathSuffix)
|
|
@@ -192,7 +224,7 @@ async function getAutomationTraceTemplatePathWithoutRetry (timeout = XCRUN_TIMEO
|
|
|
192
224
|
return automationTraceTemplatePaths[1];
|
|
193
225
|
}
|
|
194
226
|
|
|
195
|
-
const msg =
|
|
227
|
+
const msg = 'Could not find Automation.tracetemplate in any of the following' +
|
|
196
228
|
`locations ${automationTraceTemplatePaths.toString()}`;
|
|
197
229
|
log.error(msg);
|
|
198
230
|
throw new Error(msg);
|
|
@@ -200,7 +232,7 @@ async function getAutomationTraceTemplatePathWithoutRetry (timeout = XCRUN_TIMEO
|
|
|
200
232
|
}
|
|
201
233
|
|
|
202
234
|
const getAutomationTraceTemplatePath = _.memoize(
|
|
203
|
-
function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
235
|
+
function getAutomationTraceTemplatePath (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
204
236
|
return retry(retries, getAutomationTraceTemplatePathWithoutRetry, timeout);
|
|
205
237
|
}
|
|
206
238
|
);
|
|
@@ -224,9 +256,22 @@ async function getMaxIOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {
|
|
|
224
256
|
return sdkVersion;
|
|
225
257
|
}
|
|
226
258
|
|
|
259
|
+
async function getMaxIOSSDKFromXcodeVersion (timeout = XCRUN_TIMEOUT) {
|
|
260
|
+
const version = await getVersion(true, DEFAULT_NUMBER_OF_RETRIES, timeout);
|
|
261
|
+
// as of now, the iOS version associated with an Xcode version is
|
|
262
|
+
// just the Xcode version + 2
|
|
263
|
+
return `${version.major + 2}.${version.minor}`;
|
|
264
|
+
}
|
|
265
|
+
|
|
227
266
|
const getMaxIOSSDK = _.memoize(
|
|
228
|
-
function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
229
|
-
|
|
267
|
+
function getMaxIOSSDK (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
268
|
+
try {
|
|
269
|
+
return retry(retries, getMaxIOSSDKWithoutRetry, timeout);
|
|
270
|
+
} catch (err) {
|
|
271
|
+
log.warn(`Unable to retrieve maximum iOS version: ${err.message}`);
|
|
272
|
+
log.warn('Guessing from Xcode version');
|
|
273
|
+
return getMaxIOSSDKFromXcodeVersion(timeout);
|
|
274
|
+
}
|
|
230
275
|
}
|
|
231
276
|
);
|
|
232
277
|
|
|
@@ -244,7 +289,7 @@ async function getMaxTVOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {
|
|
|
244
289
|
}
|
|
245
290
|
|
|
246
291
|
const getMaxTVOSSDK = _.memoize(
|
|
247
|
-
function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
292
|
+
function getMaxTVOSSDK (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
248
293
|
return retry(retries, getMaxTVOSSDKWithoutRetry, timeout);
|
|
249
294
|
}
|
|
250
295
|
);
|
|
@@ -262,10 +307,10 @@ async function getConnectedDevices (timeout = XCRUN_TIMEOUT) {
|
|
|
262
307
|
if (currentEntry instanceof Array) {
|
|
263
308
|
entriesToSearch = entriesToSearch.concat(currentEntry);
|
|
264
309
|
} else if ((currentEntry._name &&
|
|
265
|
-
currentEntry._name.substring(0, 4) ===
|
|
310
|
+
currentEntry._name.substring(0, 4) === 'iPad') ||
|
|
266
311
|
(currentEntry._name &&
|
|
267
|
-
currentEntry._name.substring(0, 6) ===
|
|
268
|
-
(currentEntry._name && _.includes(currentEntry._name,
|
|
312
|
+
currentEntry._name.substring(0, 6) === 'iPhone') ||
|
|
313
|
+
(currentEntry._name && _.includes(currentEntry._name, 'Apple TV'))) {
|
|
269
314
|
let deviceInfo = {
|
|
270
315
|
name: currentEntry._name,
|
|
271
316
|
udid: currentEntry.serial_num,
|
|
@@ -285,7 +330,7 @@ async function getInstrumentsPathWithoutRetry (timeout = XCRUN_TIMEOUT) {
|
|
|
285
330
|
let {stdout} = await runXcrunCommand(args, timeout);
|
|
286
331
|
|
|
287
332
|
if (!stdout) {
|
|
288
|
-
stdout =
|
|
333
|
+
stdout = '';
|
|
289
334
|
}
|
|
290
335
|
|
|
291
336
|
let instrumentsPath = stdout.trim();
|
|
@@ -298,7 +343,7 @@ async function getInstrumentsPathWithoutRetry (timeout = XCRUN_TIMEOUT) {
|
|
|
298
343
|
}
|
|
299
344
|
|
|
300
345
|
const getInstrumentsPath = _.memoize(
|
|
301
|
-
function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
346
|
+
function getInstrumentsPath (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
302
347
|
return retry(retries, getInstrumentsPathWithoutRetry, timeout);
|
|
303
348
|
}
|
|
304
349
|
);
|
|
@@ -318,9 +363,10 @@ function clearInternalCache () {
|
|
|
318
363
|
});
|
|
319
364
|
}
|
|
320
365
|
|
|
321
|
-
export
|
|
366
|
+
export {
|
|
322
367
|
getPath, getVersion, getAutomationTraceTemplatePath, getMaxIOSSDK,
|
|
323
368
|
getAutomationTraceTemplatePathWithoutRetry, getMaxIOSSDKWithoutRetry,
|
|
324
369
|
getConnectedDevices, clearInternalCache, getInstrumentsPath,
|
|
325
370
|
getCommandLineToolsVersion, getMaxTVOSSDK, getMaxTVOSSDKWithoutRetry,
|
|
371
|
+
getClangVersion,
|
|
326
372
|
};
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"ios",
|
|
7
7
|
"xcode"
|
|
8
8
|
],
|
|
9
|
-
"version": "3.
|
|
9
|
+
"version": "3.10.0",
|
|
10
10
|
"author": "appium",
|
|
11
11
|
"license": "Apache-2.0",
|
|
12
12
|
"repository": {
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"asyncbox": "^2.3.0",
|
|
37
37
|
"lodash": "^4.17.4",
|
|
38
38
|
"plist": "^3.0.1",
|
|
39
|
-
"semver": "^
|
|
39
|
+
"semver": "^7.0.0",
|
|
40
40
|
"source-map-support": "^0.5.5",
|
|
41
41
|
"teen_process": "^1.3.0"
|
|
42
42
|
},
|
|
@@ -59,17 +59,12 @@
|
|
|
59
59
|
],
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"ajv": "^6.5.3",
|
|
62
|
-
"appium-gulp-plugins": "^
|
|
63
|
-
"babel-eslint": "^10.0.0",
|
|
62
|
+
"appium-gulp-plugins": "^5.0.0",
|
|
64
63
|
"chai": "^4.1.2",
|
|
65
64
|
"chai-as-promised": "^7.1.1",
|
|
66
|
-
"eslint": "^
|
|
67
|
-
"eslint-config-appium": "^3.1.0",
|
|
68
|
-
"eslint-plugin-import": "^2.2.0",
|
|
69
|
-
"eslint-plugin-mocha": "^5.0.0",
|
|
70
|
-
"eslint-plugin-promise": "^4.0.0",
|
|
65
|
+
"eslint-config-appium": "^4.2.0",
|
|
71
66
|
"gulp": "^4.0.0",
|
|
72
|
-
"mocha": "^
|
|
67
|
+
"mocha": "^7.0.1",
|
|
73
68
|
"pre-commit": "^1.1.3"
|
|
74
69
|
},
|
|
75
70
|
"greenkeeper": {
|