appium-xcode 3.7.2 → 3.11.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/README.md +0 -2
- package/build/index.js +20 -14
- package/build/lib/xcode.js +217 -259
- package/index.js +2 -0
- package/lib/xcode.js +67 -21
- package/package.json +6 -15
package/README.md
CHANGED
|
@@ -6,8 +6,6 @@ appium-xcode
|
|
|
6
6
|
[](https://david-dm.org/appium/appium-xcode#info=devDependencies)
|
|
7
7
|
|
|
8
8
|
[](https://travis-ci.org/appium/appium-xcode)
|
|
9
|
-
[](https://coveralls.io/r/appium/appium-xcode)
|
|
10
|
-
[](https://greenkeeper.io/)
|
|
11
9
|
|
|
12
10
|
ES7 module for interacting with Xcode and Xcode-related functions.
|
|
13
11
|
Used by [Appium](github.com/appium/appium)
|
package/build/index.js
CHANGED
|
@@ -5,22 +5,28 @@ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWild
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.default = 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;
|
|
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");
|
|
9
11
|
|
|
10
12
|
var xcode = _interopRequireWildcard(require("./lib/xcode"));
|
|
11
13
|
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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;
|
|
24
30
|
exports.getMaxTVOSSDKWithoutRetry = getMaxTVOSSDKWithoutRetry;
|
|
25
31
|
exports.getMaxTVOSSDK = getMaxTVOSSDK;
|
|
26
32
|
exports.getCommandLineToolsVersion = getCommandLineToolsVersion;
|
|
@@ -37,4 +43,4 @@ var _default = xcode;
|
|
|
37
43
|
exports.default = _default;require('source-map-support').install();
|
|
38
44
|
|
|
39
45
|
|
|
40
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
46
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImdldFBhdGgiLCJnZXRWZXJzaW9uIiwiZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoIiwiZ2V0TWF4SU9TU0RLIiwiZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5IiwiZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5IiwiZ2V0Q29ubmVjdGVkRGV2aWNlcyIsImNsZWFySW50ZXJuYWxDYWNoZSIsImdldEluc3RydW1lbnRzUGF0aCIsImdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uIiwiZ2V0TWF4VFZPU1NESyIsImdldE1heFRWT1NTREtXaXRob3V0UmV0cnkiLCJnZXRDbGFuZ1ZlcnNpb24iLCJ4Y29kZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7QUFHQSxNQUFNO0FBQ0pBLEVBQUFBLE9BREk7QUFDS0MsRUFBQUEsVUFETDtBQUNpQkMsRUFBQUEsOEJBRGpCO0FBQ2lEQyxFQUFBQSxZQURqRDtBQUVKQyxFQUFBQSwwQ0FGSTtBQUV3Q0MsRUFBQUEsd0JBRnhDO0FBR0pDLEVBQUFBLG1CQUhJO0FBR2lCQyxFQUFBQSxrQkFIakI7QUFHcUNDLEVBQUFBLGtCQUhyQztBQUlKQyxFQUFBQSwwQkFKSTtBQUl3QkMsRUFBQUEsYUFKeEI7QUFJdUNDLEVBQUFBLHlCQUp2QztBQUtKQyxFQUFBQTtBQUxJLElBTUZDLEtBTko7Ozs7Ozs7Ozs7Ozs7O2VBZWVBLEsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgKiBhcyB4Y29kZSBmcm9tICcuL2xpYi94Y29kZSc7XG5cblxuY29uc3Qge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufSA9IHhjb2RlO1xuXG5leHBvcnQge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufTtcbmV4cG9ydCBkZWZhdWx0IHhjb2RlO1xuIl0sImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZVJvb3QiOiIuLiJ9
|
package/build/lib/xcode.js
CHANGED
|
@@ -12,9 +12,10 @@ exports.getConnectedDevices = getConnectedDevices;
|
|
|
12
12
|
exports.clearInternalCache = clearInternalCache;
|
|
13
13
|
exports.getCommandLineToolsVersion = getCommandLineToolsVersion;
|
|
14
14
|
exports.getMaxTVOSSDKWithoutRetry = getMaxTVOSSDKWithoutRetry;
|
|
15
|
+
exports.getClangVersion = getClangVersion;
|
|
15
16
|
exports.getMaxTVOSSDK = exports.getInstrumentsPath = exports.getMaxIOSSDK = exports.getAutomationTraceTemplatePath = exports.getPath = void 0;
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
require("source-map-support/register");
|
|
18
19
|
|
|
19
20
|
var _appiumSupport = require("appium-support");
|
|
20
21
|
|
|
@@ -32,7 +33,7 @@ var _semver = _interopRequireDefault(require("semver"));
|
|
|
32
33
|
|
|
33
34
|
const env = process.env;
|
|
34
35
|
const XCRUN_TIMEOUT = 15000;
|
|
35
|
-
const XCODE_SUBDIR =
|
|
36
|
+
const XCODE_SUBDIR = '/Contents/Developer';
|
|
36
37
|
const DEFAULT_NUMBER_OF_RETRIES = 3;
|
|
37
38
|
|
|
38
39
|
const log = _appiumSupport.logger.getLogger('Xcode');
|
|
@@ -41,345 +42,302 @@ function hasExpectedSubDir(path) {
|
|
|
41
42
|
return path.substring(path.length - XCODE_SUBDIR.length) === XCODE_SUBDIR;
|
|
42
43
|
}
|
|
43
44
|
|
|
44
|
-
function runXcrunCommand(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
_runXcrunCommand = (0, _asyncToGenerator2.default)(function* (args, timeout = XCRUN_TIMEOUT) {
|
|
50
|
-
try {
|
|
51
|
-
return yield (0, _teen_process.exec)('xcrun', args, {
|
|
52
|
-
timeout
|
|
53
|
-
});
|
|
54
|
-
} catch (err) {
|
|
55
|
-
if (err.stderr) {
|
|
56
|
-
err.message = `${err.message}: ${err.stderr}`;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
throw err;
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
return _runXcrunCommand.apply(this, arguments);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function getPathFromSymlink(_x2) {
|
|
66
|
-
return _getPathFromSymlink.apply(this, arguments);
|
|
67
|
-
}
|
|
45
|
+
async function runXcrunCommand(args, timeout = XCRUN_TIMEOUT) {
|
|
46
|
+
try {
|
|
47
|
+
const res = await (0, _teen_process.exec)('xcrun', args, {
|
|
48
|
+
timeout
|
|
49
|
+
});
|
|
68
50
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
log.warn(`Finding XcodePath by symlink because ${failMessage}`);
|
|
72
|
-
const symlinkPath = "/var/db/xcode_select_link";
|
|
73
|
-
const legacySymlinkPath = "/usr/share/xcode-select/xcode_dir_link";
|
|
74
|
-
let xcodePath = null;
|
|
75
|
-
|
|
76
|
-
if (_appiumSupport.util.hasContent(env.DEVELOPER_DIR)) {
|
|
77
|
-
const customPath = hasExpectedSubDir(env.DEVELOPER_DIR) ? env.DEVELOPER_DIR : env.DEVELOPER_DIR + XCODE_SUBDIR;
|
|
78
|
-
|
|
79
|
-
if (yield _appiumSupport.fs.exists(customPath)) {
|
|
80
|
-
xcodePath = customPath;
|
|
81
|
-
} else {
|
|
82
|
-
let mesg = `Could not find path to Xcode, environment variable ` + `DEVELOPER_DIR set to: ${env.DEVELOPER_DIR} ` + `but no Xcode found`;
|
|
83
|
-
log.warn(mesg);
|
|
84
|
-
throw new Error(mesg);
|
|
85
|
-
}
|
|
86
|
-
} else if (yield _appiumSupport.fs.exists(symlinkPath)) {
|
|
87
|
-
xcodePath = yield _appiumSupport.fs.readlink(symlinkPath);
|
|
88
|
-
} else if (yield _appiumSupport.fs.exists(legacySymlinkPath)) {
|
|
89
|
-
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(' ')}'`);
|
|
90
53
|
}
|
|
91
54
|
|
|
92
|
-
|
|
93
|
-
|
|
55
|
+
return res;
|
|
56
|
+
} catch (err) {
|
|
57
|
+
if (err.stderr) {
|
|
58
|
+
err.message = `${err.message}: ${err.stderr}`;
|
|
94
59
|
}
|
|
95
60
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
throw new Error(msg);
|
|
99
|
-
});
|
|
100
|
-
return _getPathFromSymlink.apply(this, arguments);
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
101
63
|
}
|
|
102
64
|
|
|
103
|
-
function
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
_getPathFromXcodeSelect = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
|
|
109
|
-
let _ref = yield (0, _teen_process.exec)('xcode-select', ['--print-path'], {
|
|
110
|
-
timeout
|
|
111
|
-
}),
|
|
112
|
-
stdout = _ref.stdout;
|
|
113
|
-
|
|
114
|
-
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;
|
|
115
70
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
71
|
+
if (_appiumSupport.util.hasContent(env.DEVELOPER_DIR)) {
|
|
72
|
+
const customPath = hasExpectedSubDir(env.DEVELOPER_DIR) ? env.DEVELOPER_DIR : env.DEVELOPER_DIR + XCODE_SUBDIR;
|
|
119
73
|
|
|
120
|
-
if (
|
|
121
|
-
|
|
74
|
+
if (await _appiumSupport.fs.exists(customPath)) {
|
|
75
|
+
xcodePath = customPath;
|
|
122
76
|
} else {
|
|
123
|
-
|
|
124
|
-
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);
|
|
125
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
|
|
126
101
|
});
|
|
127
|
-
|
|
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
|
+
}
|
|
128
114
|
}
|
|
129
115
|
|
|
130
|
-
const getPath = _lodash.default.memoize(function (timeout = XCRUN_TIMEOUT) {
|
|
116
|
+
const getPath = _lodash.default.memoize(function getPath(timeout = XCRUN_TIMEOUT) {
|
|
131
117
|
return getPathFromXcodeSelect(timeout).catch(getPathFromSymlink);
|
|
132
118
|
});
|
|
133
119
|
|
|
134
120
|
exports.getPath = getPath;
|
|
135
121
|
|
|
136
|
-
function getVersionWithoutRetry() {
|
|
137
|
-
|
|
138
|
-
}
|
|
122
|
+
async function getVersionWithoutRetry(timeout = XCRUN_TIMEOUT) {
|
|
123
|
+
const xcodePath = await getPath(timeout);
|
|
139
124
|
|
|
140
|
-
|
|
141
|
-
_getVersionWithoutRetry = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
|
|
142
|
-
const xcodePath = yield getPath(timeout);
|
|
125
|
+
const plistPath = _path.default.resolve(xcodePath, '..', 'Info.plist');
|
|
143
126
|
|
|
144
|
-
|
|
127
|
+
if (!(await _appiumSupport.fs.exists(plistPath))) {
|
|
128
|
+
throw new Error(`Could not get Xcode version. ${plistPath} does not exist on disk.`);
|
|
129
|
+
}
|
|
145
130
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
const version = yield _appiumSupport.plist.parsePlistFile(plistPath);
|
|
151
|
-
return _semver.default.coerce(version.CFBundleShortVersionString);
|
|
152
|
-
});
|
|
153
|
-
return _getVersionWithoutRetry.apply(this, arguments);
|
|
131
|
+
const version = await _appiumSupport.plist.parsePlistFile(plistPath);
|
|
132
|
+
return _semver.default.coerce(version.CFBundleShortVersionString);
|
|
154
133
|
}
|
|
155
134
|
|
|
156
|
-
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) {
|
|
157
136
|
return (0, _asyncbox.retry)(retries, getVersionWithoutRetry, timeout);
|
|
158
137
|
});
|
|
159
138
|
|
|
160
|
-
function getVersion() {
|
|
161
|
-
|
|
162
|
-
}
|
|
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
|
+
}
|
|
163
146
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
147
|
+
return {
|
|
148
|
+
versionString,
|
|
149
|
+
versionFloat: parseFloat(versionString),
|
|
150
|
+
major: version.major,
|
|
151
|
+
minor: version.minor,
|
|
152
|
+
patch: version.patch > 0 ? version.patch : undefined,
|
|
168
153
|
|
|
169
|
-
|
|
154
|
+
toString() {
|
|
170
155
|
return versionString;
|
|
171
156
|
}
|
|
172
157
|
|
|
173
|
-
|
|
174
|
-
versionString,
|
|
175
|
-
versionFloat: parseFloat(versionString),
|
|
176
|
-
major: version.major,
|
|
177
|
-
minor: version.minor,
|
|
178
|
-
patch: version.patch > 0 ? version.patch : undefined
|
|
179
|
-
};
|
|
180
|
-
});
|
|
181
|
-
return _getVersion.apply(this, arguments);
|
|
158
|
+
};
|
|
182
159
|
}
|
|
183
160
|
|
|
184
|
-
function getCommandLineToolsVersion() {
|
|
185
|
-
|
|
186
|
-
|
|
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;
|
|
187
167
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
return (yield (0, _teen_process.exec)('pkgutil', [`--pkg-info=com.apple.pkg.CLTools_Executables`])).stdout;
|
|
195
|
-
}), (0, _asyncToGenerator2.default)(function* () {
|
|
196
|
-
return (yield (0, _teen_process.exec)('pkgutil', [`--pkg-info=com.apple.pkg.DeveloperToolsCLI`])).stdout;
|
|
197
|
-
})];
|
|
198
|
-
let stdout;
|
|
199
|
-
|
|
200
|
-
for (var _i = 0; _i < getVersionFunctions.length; _i++) {
|
|
201
|
-
let getVersion = getVersionFunctions[_i];
|
|
202
|
-
|
|
203
|
-
try {
|
|
204
|
-
stdout = yield getVersion();
|
|
205
|
-
break;
|
|
206
|
-
} catch (ign) {
|
|
207
|
-
stdout = '';
|
|
208
|
-
}
|
|
168
|
+
for (let getVersion of getVersionFunctions) {
|
|
169
|
+
try {
|
|
170
|
+
stdout = await getVersion();
|
|
171
|
+
break;
|
|
172
|
+
} catch (ign) {
|
|
173
|
+
stdout = '';
|
|
209
174
|
}
|
|
175
|
+
}
|
|
210
176
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
});
|
|
214
|
-
return _getCommandLineToolsVersion.apply(this, arguments);
|
|
177
|
+
let match = /^version: (.+)$/m.exec(stdout);
|
|
178
|
+
return match ? match[1] : undefined;
|
|
215
179
|
}
|
|
216
180
|
|
|
217
|
-
function
|
|
218
|
-
|
|
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];
|
|
219
200
|
}
|
|
220
201
|
|
|
221
|
-
function
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
const extensions = ['xrplugin', 'bundle'];
|
|
202
|
+
async function getAutomationTraceTemplatePathWithoutRetry(timeout = XCRUN_TIMEOUT) {
|
|
203
|
+
const xcodePath = await getPath(timeout);
|
|
204
|
+
const extensions = ['xrplugin', 'bundle'];
|
|
225
205
|
|
|
226
|
-
|
|
206
|
+
const pathPrefix = _path.default.resolve(xcodePath, '../Applications/Instruments.app/Contents/PlugIns');
|
|
227
207
|
|
|
228
|
-
|
|
229
|
-
|
|
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)];
|
|
230
210
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
211
|
+
if (await _appiumSupport.fs.exists(automationTraceTemplatePaths[0])) {
|
|
212
|
+
return automationTraceTemplatePaths[0];
|
|
213
|
+
}
|
|
234
214
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
215
|
+
if (await _appiumSupport.fs.exists(automationTraceTemplatePaths[1])) {
|
|
216
|
+
return automationTraceTemplatePaths[1];
|
|
217
|
+
}
|
|
238
218
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
});
|
|
243
|
-
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);
|
|
244
222
|
}
|
|
245
223
|
|
|
246
|
-
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) {
|
|
247
225
|
return (0, _asyncbox.retry)(retries, getAutomationTraceTemplatePathWithoutRetry, timeout);
|
|
248
226
|
});
|
|
249
227
|
|
|
250
228
|
exports.getAutomationTraceTemplatePath = getAutomationTraceTemplatePath;
|
|
251
229
|
|
|
252
|
-
function getMaxIOSSDKWithoutRetry() {
|
|
253
|
-
|
|
254
|
-
}
|
|
230
|
+
async function getMaxIOSSDKWithoutRetry(timeout = XCRUN_TIMEOUT) {
|
|
231
|
+
const version = await getVersion(false, DEFAULT_NUMBER_OF_RETRIES, timeout);
|
|
255
232
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
233
|
+
if (version[0] === '4') {
|
|
234
|
+
return '6.1';
|
|
235
|
+
}
|
|
259
236
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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);
|
|
263
243
|
|
|
264
|
-
|
|
244
|
+
if (!match) {
|
|
245
|
+
throw new Error(`xcrun returned a non-numeric iOS SDK version: '${sdkVersion}'`);
|
|
246
|
+
}
|
|
265
247
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
const sdkVersion = stdout.trim();
|
|
270
|
-
const match = /\d.\d/.exec(stdout);
|
|
271
|
-
|
|
272
|
-
if (!match) {
|
|
273
|
-
throw new Error(`xcrun returned a non-numeric iOS SDK version: '${sdkVersion}'`);
|
|
274
|
-
}
|
|
248
|
+
return sdkVersion;
|
|
249
|
+
}
|
|
275
250
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
return
|
|
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}`;
|
|
279
254
|
}
|
|
280
255
|
|
|
281
|
-
const getMaxIOSSDK = _lodash.default.memoize(function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
282
|
-
|
|
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
|
+
}
|
|
283
264
|
});
|
|
284
265
|
|
|
285
266
|
exports.getMaxIOSSDK = getMaxIOSSDK;
|
|
286
267
|
|
|
287
|
-
function getMaxTVOSSDKWithoutRetry() {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
const args = ['--sdk', 'appletvsimulator', '--show-sdk-version'];
|
|
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();
|
|
294
274
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
const sdkVersion = stdout.trim();
|
|
299
|
-
|
|
300
|
-
if (isNaN(parseFloat(sdkVersion))) {
|
|
301
|
-
throw new Error(`xcrun returned a non-numeric tvOS SDK version: '${sdkVersion}'`);
|
|
302
|
-
}
|
|
275
|
+
if (isNaN(parseFloat(sdkVersion))) {
|
|
276
|
+
throw new Error(`xcrun returned a non-numeric tvOS SDK version: '${sdkVersion}'`);
|
|
277
|
+
}
|
|
303
278
|
|
|
304
|
-
|
|
305
|
-
});
|
|
306
|
-
return _getMaxTVOSSDKWithoutRetry.apply(this, arguments);
|
|
279
|
+
return sdkVersion;
|
|
307
280
|
}
|
|
308
281
|
|
|
309
|
-
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) {
|
|
310
283
|
return (0, _asyncbox.retry)(retries, getMaxTVOSSDKWithoutRetry, timeout);
|
|
311
284
|
});
|
|
312
285
|
|
|
313
286
|
exports.getMaxTVOSSDK = getMaxTVOSSDK;
|
|
314
287
|
|
|
315
|
-
function getConnectedDevices() {
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
const args = ['-xml', 'SPUSBDataType'];
|
|
323
|
-
|
|
324
|
-
let _ref7 = yield (0, _teen_process.exec)(cmd, args, {
|
|
325
|
-
timeout
|
|
326
|
-
}),
|
|
327
|
-
stdout = _ref7.stdout;
|
|
328
|
-
|
|
329
|
-
let plistContent = (0, _plist.parse)(stdout);
|
|
330
|
-
let devicesFound = [];
|
|
331
|
-
let entriesToSearch = [plistContent[0]];
|
|
332
|
-
|
|
333
|
-
while (entriesToSearch.length > 0) {
|
|
334
|
-
let currentEntry = entriesToSearch.pop();
|
|
335
|
-
|
|
336
|
-
if (currentEntry instanceof Array) {
|
|
337
|
-
entriesToSearch = entriesToSearch.concat(currentEntry);
|
|
338
|
-
} 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")) {
|
|
339
|
-
let deviceInfo = {
|
|
340
|
-
name: currentEntry._name,
|
|
341
|
-
udid: currentEntry.serial_num,
|
|
342
|
-
productId: currentEntry.product_id,
|
|
343
|
-
deviceVersion: currentEntry.bcd_device
|
|
344
|
-
};
|
|
345
|
-
devicesFound.push(deviceInfo);
|
|
346
|
-
} else if (currentEntry._items) {
|
|
347
|
-
entriesToSearch = entriesToSearch.concat(currentEntry._items);
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
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
|
|
352
295
|
});
|
|
353
|
-
|
|
354
|
-
|
|
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
|
+
}
|
|
355
317
|
|
|
356
|
-
|
|
357
|
-
return _getInstrumentsPathWithoutRetry.apply(this, arguments);
|
|
318
|
+
return devicesFound;
|
|
358
319
|
}
|
|
359
320
|
|
|
360
|
-
function
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
stdout = _ref8.stdout;
|
|
321
|
+
async function getInstrumentsPathWithoutRetry(timeout = XCRUN_TIMEOUT) {
|
|
322
|
+
const args = ['-find', 'instruments'];
|
|
323
|
+
let {
|
|
324
|
+
stdout
|
|
325
|
+
} = await runXcrunCommand(args, timeout);
|
|
366
326
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
327
|
+
if (!stdout) {
|
|
328
|
+
stdout = '';
|
|
329
|
+
}
|
|
370
330
|
|
|
371
|
-
|
|
331
|
+
let instrumentsPath = stdout.trim();
|
|
372
332
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
333
|
+
if (!instrumentsPath) {
|
|
334
|
+
throw new Error(`Could not find path to instruments binary using 'xcrun ${args.join(' ')}'`);
|
|
335
|
+
}
|
|
376
336
|
|
|
377
|
-
|
|
378
|
-
});
|
|
379
|
-
return _getInstrumentsPathWithoutRetry.apply(this, arguments);
|
|
337
|
+
return instrumentsPath;
|
|
380
338
|
}
|
|
381
339
|
|
|
382
|
-
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) {
|
|
383
341
|
return (0, _asyncbox.retry)(retries, getInstrumentsPathWithoutRetry, timeout);
|
|
384
342
|
});
|
|
385
343
|
|
|
@@ -395,4 +353,4 @@ function clearInternalCache() {
|
|
|
395
353
|
}require('source-map-support').install();
|
|
396
354
|
|
|
397
355
|
|
|
398
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi94Y29kZS5qcyJdLCJuYW1lcyI6WyJlbnYiLCJwcm9jZXNzIiwiWENSVU5fVElNRU9VVCIsIlhDT0RFX1NVQkRJUiIsIkRFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJoYXNFeHBlY3RlZFN1YkRpciIsInBhdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJydW5YY3J1bkNvbW1hbmQiLCJhcmdzIiwidGltZW91dCIsImVyciIsInN0ZGVyciIsIm1lc3NhZ2UiLCJnZXRQYXRoRnJvbVN5bWxpbmsiLCJmYWlsTWVzc2FnZSIsIndhcm4iLCJzeW1saW5rUGF0aCIsImxlZ2FjeVN5bWxpbmtQYXRoIiwieGNvZGVQYXRoIiwidXRpbCIsImhhc0NvbnRlbnQiLCJERVZFTE9QRVJfRElSIiwiY3VzdG9tUGF0aCIsImZzIiwiZXhpc3RzIiwibWVzZyIsIkVycm9yIiwicmVhZGxpbmsiLCJyZXBsYWNlIiwiUmVnRXhwIiwidHJpbSIsIm1zZyIsImdldFBhdGhGcm9tWGNvZGVTZWxlY3QiLCJzdGRvdXQiLCJ4Y29kZUZvbGRlclBhdGgiLCJlcnJvckFuZFRocm93IiwiZ2V0UGF0aCIsIl8iLCJtZW1vaXplIiwiY2F0Y2giLCJnZXRWZXJzaW9uV2l0aG91dFJldHJ5IiwicGxpc3RQYXRoIiwicmVzb2x2ZSIsInZlcnNpb24iLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIiwic2VtdmVyIiwiY29lcmNlIiwiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciLCJnZXRWZXJzaW9uTWVtb2l6ZWQiLCJyZXRyaWVzIiwiZ2V0VmVyc2lvbiIsInBhcnNlIiwidmVyc2lvblN0cmluZyIsInBhdGNoIiwibWFqb3IiLCJtaW5vciIsInZlcnNpb25GbG9hdCIsInBhcnNlRmxvYXQiLCJ1bmRlZmluZWQiLCJnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiIsImdldFZlcnNpb25GdW5jdGlvbnMiLCJwa2ciLCJpZ24iLCJtYXRjaCIsImV4ZWMiLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnkiLCJleHRlbnNpb25zIiwicGF0aFByZWZpeCIsInBhdGhTdWZmaXgiLCJhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzIiwidG9TdHJpbmciLCJlcnJvciIsImdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCIsImdldE1heElPU1NES1dpdGhvdXRSZXRyeSIsInNka1ZlcnNpb24iLCJnZXRNYXhJT1NTREsiLCJnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5IiwiaXNOYU4iLCJnZXRNYXhUVk9TU0RLIiwiZ2V0Q29ubmVjdGVkRGV2aWNlcyIsImNtZCIsInBsaXN0Q29udGVudCIsImRldmljZXNGb3VuZCIsImVudHJpZXNUb1NlYXJjaCIsImN1cnJlbnRFbnRyeSIsInBvcCIsIkFycmF5IiwiY29uY2F0IiwiX25hbWUiLCJpbmNsdWRlcyIsImRldmljZUluZm8iLCJuYW1lIiwidWRpZCIsInNlcmlhbF9udW0iLCJwcm9kdWN0SWQiLCJwcm9kdWN0X2lkIiwiZGV2aWNlVmVyc2lvbiIsImJjZF9kZXZpY2UiLCJwdXNoIiwiX2l0ZW1zIiwiZ2V0SW5zdHJ1bWVudHNQYXRoV2l0aG91dFJldHJ5IiwiaW5zdHJ1bWVudHNQYXRoIiwiam9pbiIsImdldEluc3RydW1lbnRzUGF0aCIsImNsZWFySW50ZXJuYWxDYWNoZSIsIm1lbW9pemVkIiwiZm9yRWFjaCIsImYiLCJjYWNoZSIsIkNhY2hlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxHQUFHLEdBQUdDLE9BQU8sQ0FBQ0QsR0FBcEI7QUFFQSxNQUFNRSxhQUFhLEdBQUcsS0FBdEI7QUFDQSxNQUFNQyxZQUFZLEdBQUcscUJBQXJCO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsQ0FBbEM7O0FBRUEsTUFBTUMsR0FBRyxHQUFHQyxzQkFBT0MsU0FBUCxDQUFp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QUFGLENBQ3pCLFVBQVVZLE9BQU8sR0FBR25ELHlCQUFwQixFQUErQ1UsT0FBTyxHQUFHWixhQUF6RCxFQUF3RTtBQUN0RSxTQUFPLHFCQUFNcUQsT0FBTixFQUFlbUQsOEJBQWYsRUFBK0M1RixPQUEvQyxDQUFQO0FBQ0QsQ0FId0IsQ0FBM0I7Ozs7QUFNQSxTQUFTZ0csa0JBQVQsR0FBK0I7QUFHN0IsUUFBTUMsUUFBUSxHQUFHLENBQ2Z0RSxPQURlLEVBQ05hLGtCQURNLEVBQ2N3Qiw4QkFEZCxFQUM4Q0csWUFEOUMsRUFFZkcsYUFGZSxFQUVBeUIsa0JBRkEsQ0FBakI7QUFLQUUsRUFBQUEsUUFBUSxDQUFDQyxPQUFULENBQWtCQyxDQUFELElBQU87QUFDdEIsUUFBSUEsQ0FBQyxDQUFDQyxLQUFOLEVBQWE7QUFDWEQsTUFBQUEsQ0FBQyxDQUFDQyxLQUFGLEdBQVUsSUFBSXhFLGdCQUFFQyxPQUFGLENBQVV3RSxLQUFkLEVBQVY7QUFDRDtBQUNGLEdBSkQ7QUFLRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV0aWwsIGZzLCBwbGlzdCwgbG9nZ2VyIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByZXRyeSB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVBsaXN0RGF0YSB9IGZyb20gJ3BsaXN0JztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5cbmNvbnN0IGVudiA9IHByb2Nlc3MuZW52O1xuXG5jb25zdCBYQ1JVTl9USU1FT1VUID0gMTUwMDA7XG5jb25zdCBYQ09ERV9TVUJESVIgPSBcIi9Db250ZW50cy9EZXZlbG9wZXJcIjtcbmNvbnN0IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMgPSAzO1xuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdYY29kZScpO1xuXG5cbmZ1bmN0aW9uIGhhc0V4cGVjdGVkU3ViRGlyIChwYXRoKSB7XG4gIHJldHVybiBwYXRoLnN1YnN0cmluZyhwYXRoLmxlbmd0aCAtIFhDT0RFX1NVQkRJUi5sZW5ndGgpID09PSBYQ09ERV9TVUJESVI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blhjcnVuQ29tbWFuZCAoYXJncywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZXhlYygneGNydW4nLCBhcmdzLCB7dGltZW91dH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyB0aGUgdHJ1ZSBlcnJvciBjYW4gYmUgaGlkZGVuIHdpdGhpbiB0aGUgc3RkZXJyXG4gICAgaWYgKGVyci5zdGRlcnIpIHtcbiAgICAgIGVyci5tZXNzYWdlID0gYCR7ZXJyLm1lc3NhZ2V9OiAke2Vyci5zdGRlcnJ9YDtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UGF0aEZyb21TeW1saW5rIChmYWlsTWVzc2FnZSkge1xuICAvLyBOb2RlJ3MgaW52b2NhdGlvbiBvZiB4Y29kZS1zZWxlY3Qgc29tZXRpbWVzIGZsYWtlcyBhbmQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gIC8vIE5vdCBjbGVhciB3aHkuIEFzIGEgd29ya2Fyb3VuZCwgQXBwaXVtIGNhbiByZWxpYWJseSBkZWR1Y2UgdGhlIHZlcnNpb24gaW4gdXNlIGJ5IGNoZWNraW5nXG4gIC8vIHRoZSBsb2NhdGlvbnMgeGNvZGUtc2VsZWN0IHVzZXMgdG8gc3RvcmUgdGhlIHNlbGVjdGVkIHZlcnNpb24ncyBwYXRoLiBUaGlzIHNob3VsZCBiZSAxMDAlXG4gIC8vIHJlbGlhYmxlIHNvIGxvbmcgYXMgdGhlIGxpbmsgbG9jYXRpb25zIHJlbWFpbiB0aGUgc2FtZS4gSG93ZXZlciwgc2luY2Ugd2UncmUgcmVseWluZyBvblxuICAvLyBoYXJkY29kZWQgcGF0aHMsIHRoaXMgYXBwcm9hY2ggd2lsbCBicmVhayB0aGUgbmV4dCB0aW1lIEFwcGxlIGNoYW5nZXMgdGhlIHN5bWxpbmsgbG9jYXRpb24uXG4gIGxvZy53YXJuKGBGaW5kaW5nIFhjb2RlUGF0aCBieSBzeW1saW5rIGJlY2F1c2UgJHtmYWlsTWVzc2FnZX1gKTtcblxuICBjb25zdCBzeW1saW5rUGF0aCA9IFwiL3Zhci9kYi94Y29kZV9zZWxlY3RfbGlua1wiO1xuICBjb25zdCBsZWdhY3lTeW1saW5rUGF0aCA9IFwiL3Vzci9zaGFyZS94Y29kZS1zZWxlY3QveGNvZGVfZGlyX2xpbmtcIjsgLy8gIFhjb2RlIDwgNS54XG4gIGxldCB4Y29kZVBhdGggPSBudWxsO1xuXG4gIC8vIHhjb2RlLXNlbGVjdCBhbGxvd3MgdXNlcnMgdG8gb3ZlcnJpZGUgaXRzIHNldHRpbmdzIHdpdGggdGhlIERFVkVMT1BFUl9ESVIgZW52IHZhcixcbiAgLy8gc28gY2hlY2sgdGhhdCBmaXJzdFxuICBpZiAodXRpbC5oYXNDb250ZW50KGVudi5ERVZFTE9QRVJfRElSKSkge1xuICAgIGNvbnN0IGN1c3RvbVBhdGggPSBoYXNFeHBlY3RlZFN1YkRpcihlbnYuREVWRUxPUEVSX0RJUilcbiAgICAgID8gZW52LkRFVkVMT1BFUl9ESVJcbiAgICAgIDogZW52LkRFVkVMT1BFUl9ESVIgKyBYQ09ERV9TVUJESVI7XG5cbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGN1c3RvbVBhdGgpKSB7XG4gICAgICB4Y29kZVBhdGggPSBjdXN0b21QYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbWVzZyA9IGBDb3VsZCBub3QgZmluZCBwYXRoIHRvIFhjb2RlLCBlbnZpcm9ubWVudCB2YXJpYWJsZSBgICtcbiAgICAgICAgICAgICAgICAgYERFVkVMT1BFUl9ESVIgc2V0IHRvOiAke2Vudi5ERVZFTE9QRVJfRElSfSBgICtcbiAgICAgICAgICAgICAgICAgYGJ1dCBubyBYY29kZSBmb3VuZGA7XG4gICAgICBsb2cud2FybihtZXNnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXdhaXQgZnMuZXhpc3RzKHN5bWxpbmtQYXRoKSkge1xuICAgIHhjb2RlUGF0aCA9IGF3YWl0IGZzLnJlYWRsaW5rKHN5bWxpbmtQYXRoKTtcbiAgfSBlbHNlIGlmIChhd2FpdCBmcy5leGlzdHMobGVnYWN5U3ltbGlua1BhdGgpKSB7XG4gICAgeGNvZGVQYXRoID0gYXdhaXQgZnMucmVhZGxpbmsobGVnYWN5U3ltbGlua1BhdGgpO1xuICB9XG5cbiAgaWYgKHhjb2RlUGF0aCkge1xuICAgIHJldHVybiB4Y29kZVBhdGgucmVwbGFjZShuZXcgUmVnRXhwKFwiLyRcIiksIFwiXCIpLnRyaW0oKTtcbiAgfVxuXG4gIC8vIFdlIHNob3VsZCBvbmx5IGdldCBoZXJlIGlzIHdlIGZhaWxlZCB0byBjYXB0dXJlIHhjb2RlLXNlbGVjdCdzIHN0ZG91dCBhbmQgb3VyXG4gIC8vIG90aGVyIGNoZWNrcyBmYWlsZWQuIEVpdGhlciBBcHBsZSBoYXMgbW92ZWQgdGhlIHN5bWxpbmsgdG8gYSBuZXcgbG9jYXRpb24gb3IgdGhlIHVzZXJcbiAgLy8gaXMgbm90IHVzaW5nIHRoZSBkZWZhdWx0IGluc3RhbGwuIDk5Ljk5OSUgY2hhbmNlIGl0J3MgdGhlIGxhdHRlciwgc28gaXNzdWUgYSB3YXJuaW5nXG4gIC8vIHNob3VsZCB3ZSBldmVyIGhpdCB0aGUgZWRnZSBjYXNlLlxuICBsZXQgbXNnID0gYENvdWxkIG5vdCBmaW5kIHBhdGggdG8gWGNvZGUgYnkgc3ltbGlua3MgbG9jYXRlZCBpbiAke3N5bWxpbmtQYXRofSwgb3IgJHtsZWdhY3lTeW1saW5rUGF0aH1gO1xuICBsb2cud2Fybihtc2cpO1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UGF0aEZyb21YY29kZVNlbGVjdCAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgbGV0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygneGNvZGUtc2VsZWN0JywgWyctLXByaW50LXBhdGgnXSwge3RpbWVvdXR9KTtcblxuICAvLyB0cmltIGFuZCByZW1vdmUgdHJhaWxpbmcgc2xhc2hcbiAgY29uc3QgeGNvZGVGb2xkZXJQYXRoID0gc3Rkb3V0LnJlcGxhY2UoL1xcLyQvLCAnJykudHJpbSgpO1xuXG4gIGlmICghdXRpbC5oYXNDb250ZW50KHhjb2RlRm9sZGVyUGF0aCkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdygneGNvZGUtc2VsZWN0IHJldHVybmVkIGFuIGVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyh4Y29kZUZvbGRlclBhdGgpKSB7XG4gICAgcmV0dXJuIHhjb2RlRm9sZGVyUGF0aDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtc2cgPSBgeGNvZGUtc2VsZWN0IGNvdWxkIG5vdCBmaW5kIHhjb2RlLiBQYXRoICcke3hjb2RlRm9sZGVyUGF0aH0nIGRvZXMgbm90IGV4aXN0LmA7XG4gICAgbG9nLmVycm9yQW5kVGhyb3cobXNnKTtcbiAgfVxufVxuXG5jb25zdCBnZXRQYXRoID0gXy5tZW1vaXplKGZ1bmN0aW9uICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAvLyBmaXJzdCB3ZSB0cnkgdXNpbmcgeGNvZGUtc2VsZWN0IHRvIGZpbmQgdGhlIHBhdGhcbiAgLy8gdGhlbiB3ZSB0cnkgdXNpbmcgdGhlIHN5bWxpbmtzIHRoYXQgQXBwbGUgaGFzIGJ5IGRlZmF1bHRcbiAgcmV0dXJuIGdldFBhdGhGcm9tWGNvZGVTZWxlY3QodGltZW91dCkuY2F0Y2goZ2V0UGF0aEZyb21TeW1saW5rKTtcbn0pO1xuXG5cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgeGNvZGVQYXRoID0gYXdhaXQgZ2V0UGF0aCh0aW1lb3V0KTtcblxuICAvLyB3ZSB3YW50IHRvIHJlYWQgdGhlIENGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIGZyb20gWGNvZGUncyBwbGlzdC5cbiAgLy8gSXQgc2hvdWxkIGJlIGluIC9bcm9vdF0vWENvZGUuYXBwL0NvbnRlbnRzL1xuICBjb25zdCBwbGlzdFBhdGggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCBcIi4uXCIsIFwiSW5mby5wbGlzdFwiKTtcblxuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhwbGlzdFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IFhjb2RlIHZlcnNpb24uICR7cGxpc3RQYXRofSBkb2VzIG5vdCBleGlzdCBvbiBkaXNrLmApO1xuICB9XG5cbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IHBsaXN0LnBhcnNlUGxpc3RGaWxlKHBsaXN0UGF0aCk7XG4gIHJldHVybiBzZW12ZXIuY29lcmNlKHZlcnNpb24uQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmcpO1xufVxuXG5jb25zdCBnZXRWZXJzaW9uTWVtb2l6ZWQgPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFZlcnNpb24gKHBhcnNlID0gZmFsc2UsIHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbk1lbW9pemVkKHJldHJpZXMsIHRpbWVvdXQpO1xuICAvLyB4Y29kZSB2ZXJzaW9uIHN0cmluZ3MgYXJlIG5vdCBleGFjdGx5IHNlbXZlciBzdHJpbmc6IHBhdGNoIHZlcnNpb25zIG9mIDBcbiAgLy8gYXJlIHJlbW92ZWQgKGUuZy4sICcxMC4wLjAnID0+ICcxMC4wJylcbiAgY29uc3QgdmVyc2lvblN0cmluZyA9IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi52ZXJzaW9uIDogYCR7dmVyc2lvbi5tYWpvcn0uJHt2ZXJzaW9uLm1pbm9yfWA7XG4gIGlmICghcGFyc2UpIHtcbiAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvblN0cmluZyxcbiAgICB2ZXJzaW9uRmxvYXQ6IHBhcnNlRmxvYXQodmVyc2lvblN0cmluZyksXG4gICAgbWFqb3I6IHZlcnNpb24ubWFqb3IsXG4gICAgbWlub3I6IHZlcnNpb24ubWlub3IsXG4gICAgcGF0Y2g6IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi5wYXRjaCA6IHVuZGVmaW5lZFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiAoKSB7XG4gIC8vIHRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2F5cyB0aGF0IHRoZSBDTEkgdG9vbHMgdmVyc2lvbiBoYXMgYmVlblxuICAvLyByZXByZXNlbnRlZC4gVHJ5IHRoZW0gZnJvbSBtb3N0IHJlbGlhYmxlIHRvIGxlYXN0LCBmYWxsaW5nIGRvd24gdGhlIGNoYWluXG4gIGNvbnN0IGdldFZlcnNpb25GdW5jdGlvbnMgPSBbXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHBrZyA9IChhd2FpdCBleGVjKCdwa2d1dGlsJywgWyctLXBrZ3M9Y29tLmFwcGxlLnBrZy5EZXZTREtfLionXSkpLnN0ZG91dDtcbiAgICAgIHJldHVybiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz0ke3BrZy50cmltKCl9YF0pKS5zdGRvdXQ7XG4gICAgfSxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkNMVG9vbHNfRXhlY3V0YWJsZXNgXSkpLnN0ZG91dCxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkRldmVsb3BlclRvb2xzQ0xJYF0pKS5zdGRvdXQsXG4gIF07XG4gIGxldCBzdGRvdXQ7XG4gIGZvciAobGV0IGdldFZlcnNpb24gb2YgZ2V0VmVyc2lvbkZ1bmN0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICBzdGRvdXQgPSBhd2FpdCBnZXRWZXJzaW9uKCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIHN0ZG91dCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vIHN0ZG91dCBzaG91bGQgaGF2ZSBhIGxpbmUgbGlrZSBgdmVyc2lvbjogOC4wLjAuMC4xLjE0NzI0MzU4ODFgXG4gIGxldCBtYXRjaCA9IC9edmVyc2lvbjogKC4rKSQvbS5leGVjKHN0ZG91dCk7IC8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvSFYzeDRkLzFcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgeGNvZGVQYXRoID0gYXdhaXQgZ2V0UGF0aCh0aW1lb3V0KTtcblxuICAvLyBmb3IgaW9zIDggYW5kIHVwLCB0aGUgZmlsZSBleHRlbnNpb24gZm9yIEF1dGlvbWF0aW9uSW5zdHJ1bWVudCBjaGFuZ2VkLlxuICAvLyByYXRoZXIgdGhhbiB3YXN0ZSB0aW1lIGdldHRpbmcgdGhlIGlPU1NES1ZlcnNpb24sIGp1c3QgZ2V0IGJvdGggcGF0aHMgYW5kIHNlZSB3aGljaCBvbmUgZXhpc3RzXG4gIGNvbnN0IGV4dGVuc2lvbnMgPSBbJ3hycGx1Z2luJywgJ2J1bmRsZSddO1xuICBjb25zdCBwYXRoUHJlZml4ID0gcGF0aC5yZXNvbHZlKHhjb2RlUGF0aCwgXCIuLi9BcHBsaWNhdGlvbnMvSW5zdHJ1bWVudHMuYXBwL0NvbnRlbnRzL1BsdWdJbnNcIik7XG4gIGNvbnN0IHBhdGhTdWZmaXggPSBcIkNvbnRlbnRzL1Jlc291cmNlcy9BdXRvbWF0aW9uLnRyYWNldGVtcGxhdGVcIjtcbiAgbGV0IGF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aHMgPSBbXG4gICAgcGF0aC5yZXNvbHZlKHBhdGhQcmVmaXgsIGBBdXRvbWF0aW9uSW5zdHJ1bWVudC4ke2V4dGVuc2lvbnNbMF19YCwgcGF0aFN1ZmZpeCksXG4gICAgcGF0aC5yZXNvbHZlKHBhdGhQcmVmaXgsIGBBdXRvbWF0aW9uSW5zdHJ1bWVudC4ke2V4dGVuc2lvbnNbMV19YCwgcGF0aFN1ZmZpeClcbiAgXTtcblxuICBpZiAoYXdhaXQgZnMuZXhpc3RzKGF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aHNbMF0pKSB7XG4gICAgcmV0dXJuIGF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aHNbMF07XG4gIH1cblxuICBpZiAoYXdhaXQgZnMuZXhpc3RzKGF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aHNbMV0pKSB7XG4gICAgcmV0dXJuIGF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aHNbMV07XG4gIH1cblxuICBjb25zdCBtc2cgPSBcIkNvdWxkIG5vdCBmaW5kIEF1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZ1wiICtcbiAgICAgICAgICAgICAgYGxvY2F0aW9ucyAke2F1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aHMudG9TdHJpbmcoKX1gO1xuICBsb2cuZXJyb3IobXNnKTtcbiAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG5cbn1cblxuY29uc3QgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiAocmV0cmllcyA9IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gICAgcmV0dXJuIHJldHJ5KHJldHJpZXMsIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldFZlcnNpb24oZmFsc2UsIERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQpO1xuICBpZiAodmVyc2lvblswXSA9PT0gJzQnKSB7XG4gICAgcmV0dXJuICc2LjEnO1xuICB9XG5cbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnaXBob25lc2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBjb25zdCBzZGtWZXJzaW9uID0gc3Rkb3V0LnRyaW0oKTtcbiAgY29uc3QgbWF0Y2ggPSAvXFxkLlxcZC8uZXhlYyhzdGRvdXQpO1xuXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHhjcnVuIHJldHVybmVkIGEgbm9uLW51bWVyaWMgaU9TIFNESyB2ZXJzaW9uOiAnJHtzZGtWZXJzaW9ufSdgKTtcbiAgfVxuXG4gIHJldHVybiBzZGtWZXJzaW9uO1xufVxuXG5jb25zdCBnZXRNYXhJT1NTREsgPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnYXBwbGV0dnNpbXVsYXRvcicsICctLXNob3ctc2RrLXZlcnNpb24nXTtcbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBydW5YY3J1bkNvbW1hbmQoYXJncywgdGltZW91dCk7XG5cbiAgY29uc3Qgc2RrVmVyc2lvbiA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKGlzTmFOKHBhcnNlRmxvYXQoc2RrVmVyc2lvbikpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB4Y3J1biByZXR1cm5lZCBhIG5vbi1udW1lcmljIHR2T1MgU0RLIHZlcnNpb246ICcke3Nka1ZlcnNpb259J2ApO1xuICB9XG5cbiAgcmV0dXJuIHNka1ZlcnNpb247XG59XG5cbmNvbnN0IGdldE1heFRWT1NTREsgPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENvbm5lY3RlZERldmljZXMgKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGNvbnN0IGNtZCA9ICcvdXNyL3NiaW4vc3lzdGVtX3Byb2ZpbGVyJztcbiAgY29uc3QgYXJncyA9IFsnLXhtbCcsICdTUFVTQkRhdGFUeXBlJ107XG4gIGxldCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoY21kLCBhcmdzLCB7dGltZW91dH0pO1xuICBsZXQgcGxpc3RDb250ZW50ID0gcGFyc2VQbGlzdERhdGEoc3Rkb3V0KTtcblxuICBsZXQgZGV2aWNlc0ZvdW5kID0gW107XG4gIGxldCBlbnRyaWVzVG9TZWFyY2ggPSBbcGxpc3RDb250ZW50WzBdXTtcbiAgd2hpbGUgKGVudHJpZXNUb1NlYXJjaC5sZW5ndGggPiAwKSB7XG4gICAgbGV0IGN1cnJlbnRFbnRyeSA9IGVudHJpZXNUb1NlYXJjaC5wb3AoKTtcbiAgICBpZiAoY3VycmVudEVudHJ5IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGVudHJpZXNUb1NlYXJjaCA9IGVudHJpZXNUb1NlYXJjaC5jb25jYXQoY3VycmVudEVudHJ5KTtcbiAgICB9IGVsc2UgaWYgKChjdXJyZW50RW50cnkuX25hbWUgJiZcbiAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkuX25hbWUuc3Vic3RyaW5nKDAsIDQpID09PSBcImlQYWRcIikgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiZcbiAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkuX25hbWUuc3Vic3RyaW5nKDAsIDYpID09PSBcImlQaG9uZVwiKSB8fFxuICAgICAgICAgICAgICAgKGN1cnJlbnRFbnRyeS5fbmFtZSAmJiBfLmluY2x1ZGVzKGN1cnJlbnRFbnRyeS5fbmFtZSwgXCJBcHBsZSBUVlwiKSkpIHtcbiAgICAgIGxldCBkZXZpY2VJbmZvID0ge1xuICAgICAgICBuYW1lOiBjdXJyZW50RW50cnkuX25hbWUsXG4gICAgICAgIHVkaWQ6IGN1cnJlbnRFbnRyeS5zZXJpYWxfbnVtLFxuICAgICAgICBwcm9kdWN0SWQ6IGN1cnJlbnRFbnRyeS5wcm9kdWN0X2lkLFxuICAgICAgICBkZXZpY2VWZXJzaW9uOiBjdXJyZW50RW50cnkuYmNkX2RldmljZVxuICAgICAgfTtcbiAgICAgIGRldmljZXNGb3VuZC5wdXNoKGRldmljZUluZm8pO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudEVudHJ5Ll9pdGVtcykge1xuICAgICAgZW50cmllc1RvU2VhcmNoID0gZW50cmllc1RvU2VhcmNoLmNvbmNhdChjdXJyZW50RW50cnkuX2l0ZW1zKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRldmljZXNGb3VuZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0SW5zdHJ1bWVudHNQYXRoV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCBhcmdzID0gWyctZmluZCcsICdpbnN0cnVtZW50cyddO1xuICBsZXQge3N0ZG91dH0gPSBhd2FpdCBydW5YY3J1bkNvbW1hbmQoYXJncywgdGltZW91dCk7XG5cbiAgaWYgKCFzdGRvdXQpIHtcbiAgICBzdGRvdXQgPSBcIlwiO1xuICB9XG5cbiAgbGV0IGluc3RydW1lbnRzUGF0aCA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKCFpbnN0cnVtZW50c1BhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHBhdGggdG8gaW5zdHJ1bWVudHMgYmluYXJ5IHVzaW5nICd4Y3J1biAke2FyZ3Muam9pbignICcpfSdgKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVtZW50c1BhdGg7XG59XG5cbmNvbnN0IGdldEluc3RydW1lbnRzUGF0aCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRJbnN0cnVtZW50c1BhdGhXaXRob3V0UmV0cnksIHRpbWVvdXQpO1xuICB9XG4pO1xuXG5mdW5jdGlvbiBjbGVhckludGVybmFsQ2FjaGUgKCkge1xuXG4gIC8vIG1lbW9pemVkIGZ1bmN0aW9uc1xuICBjb25zdCBtZW1vaXplZCA9IFtcbiAgICBnZXRQYXRoLCBnZXRWZXJzaW9uTWVtb2l6ZWQsIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCwgZ2V0TWF4SU9TU0RLLFxuICAgIGdldE1heFRWT1NTREssIGdldEluc3RydW1lbnRzUGF0aCxcbiAgXTtcblxuICBtZW1vaXplZC5mb3JFYWNoKChmKSA9PiB7XG4gICAgaWYgKGYuY2FjaGUpIHtcbiAgICAgIGYuY2FjaGUgPSBuZXcgXy5tZW1vaXplLkNhY2hlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IHtcbiAgZ2V0UGF0aCwgZ2V0VmVyc2lvbiwgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoLCBnZXRNYXhJT1NTREssXG4gIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSwgZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5LFxuICBnZXRDb25uZWN0ZWREZXZpY2VzLCBjbGVhckludGVybmFsQ2FjaGUsIGdldEluc3RydW1lbnRzUGF0aCxcbiAgZ2V0Q29tbWFuZExpbmVUb29sc1ZlcnNpb24sIGdldE1heFRWT1NTREssIGdldE1heFRWT1NTREtXaXRob3V0UmV0cnksXG59O1xuIl0sImZpbGUiOiJsaWIveGNvZGUuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
356
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi94Y29kZS5qcyJdLCJuYW1lcyI6WyJlbnYiLCJwcm9jZXNzIiwiWENSVU5fVElNRU9VVCIsIlhDT0RFX1NVQkRJUiIsIkRFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJoYXNFeHBlY3RlZFN1YkRpciIsInBhdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJydW5YY3J1bkNvbW1hbmQiLCJhcmdzIiwidGltZW91dCIsInJlcyIsIl8iLCJpc1VuZGVmaW5lZCIsIkVycm9yIiwiam9pbiIsImVyciIsInN0ZGVyciIsIm1lc3NhZ2UiLCJnZXRQYXRoRnJvbVN5bWxpbmsiLCJmYWlsTWVzc2FnZSIsIndhcm4iLCJzeW1saW5rUGF0aCIsImxlZ2FjeVN5bWxpbmtQYXRoIiwieGNvZGVQYXRoIiwidXRpbCIsImhhc0NvbnRlbnQiLCJERVZFTE9QRVJfRElSIiwiY3VzdG9tUGF0aCIsImZzIiwiZXhpc3RzIiwibWVzZyIsInJlYWRsaW5rIiwicmVwbGFjZSIsIlJlZ0V4cCIsInRyaW0iLCJtc2ciLCJnZXRQYXRoRnJvbVhjb2RlU2VsZWN0Iiwic3Rkb3V0IiwieGNvZGVGb2xkZXJQYXRoIiwiZXJyb3JBbmRUaHJvdyIsImdldFBhdGgiLCJtZW1vaXplIiwiY2F0Y2giLCJnZXRWZXJzaW9uV2l0aG91dFJldHJ5IiwicGxpc3RQYXRoIiwicmVzb2x2ZSIsInZlcnNpb24iLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIiwic2VtdmVyIiwiY29lcmNlIiwiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciLCJnZXRWZXJzaW9uTWVtb2l6ZWQiLCJyZXRyaWVzIiwiZ2V0VmVyc2lvbiIsInBhcnNlIiwidmVyc2lvblN0cmluZyIsInBhdGNoIiwibWFqb3IiLCJtaW5vciIsInZlcnNpb25GbG9hdCIsInBhcnNlRmxvYXQiLCJ1bmRlZmluZWQiLCJ0b1N0cmluZyIsImdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uIiwiZ2V0VmVyc2lvbkZ1bmN0aW9ucyIsInBrZyIsImlnbiIsIm1hdGNoIiwiZXhlYyIsImdldENsYW5nVmVyc2lvbiIsIndoaWNoIiwiZSIsImluZm8iLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnkiLCJleHRlbnNpb25zIiwicGF0aFByZWZpeCIsInBhdGhTdWZmaXgiLCJhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzIiwiZXJyb3IiLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgiLCJnZXRNYXhJT1NTREtXaXRob3V0UmV0cnkiLCJzZGtWZXJzaW9uIiwiZ2V0TWF4SU9TU0RLRnJvbVhjb2RlVmVyc2lvbiIsImdldE1heElPU1NESyIsImdldE1heFRWT1NTREtXaXRob3V0UmV0cnkiLCJpc05hTiIsImdldE1heFRWT1NTREsiLCJnZXRDb25uZWN0ZWREZXZpY2VzIiwiY21kIiwicGxpc3RDb250ZW50IiwiZGV2aWNlc0ZvdW5kIiwiZW50cmllc1RvU2VhcmNoIiwiY3VycmVudEVudHJ5IiwicG9wIiwiQXJyYXkiLCJjb25jYXQiLCJfbmFtZSIsImluY2x1ZGVzIiwiZGV2aWNlSW5mbyIsIm5hbWUiLCJ1ZGlkIiwic2VyaWFsX251bSIsInByb2R1Y3RJZCIsInByb2R1Y3RfaWQiLCJkZXZpY2VWZXJzaW9uIiwiYmNkX2RldmljZSIsInB1c2giLCJfaXRlbXMiLCJnZXRJbnN0cnVtZW50c1BhdGhXaXRob3V0UmV0cnkiLCJpbnN0cnVtZW50c1BhdGgiLCJnZXRJbnN0cnVtZW50c1BhdGgiLCJjbGVhckludGVybmFsQ2FjaGUiLCJtZW1vaXplZCIsImZvckVhY2giLCJmIiwiY2FjaGUiLCJDYWNoZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLEdBQUcsR0FBR0MsT0FBTyxDQUFDRCxHQUFwQjtBQUVBLE1BQU1FLGFBQWEsR0FBRyxLQUF0QjtBQUNBLE1B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RUFBYTtBQUNYQSxJQUFBQSxNQUFNLEdBQUcsRUFBVDtBQUNEOztBQUVELE1BQUl5RSxlQUFlLEdBQUd6RSxNQUFNLENBQUNILElBQVAsRUFBdEI7O0FBRUEsTUFBSSxDQUFDNEUsZUFBTCxFQUFzQjtBQUNwQixVQUFNLElBQUlqRyxLQUFKLENBQVcsMERBQXlETCxJQUFJLENBQUNNLElBQUwsQ0FBVSxHQUFWLENBQWUsR0FBbkYsQ0FBTjtBQUNEOztBQUVELFNBQU9nRyxlQUFQO0FBQ0Q7O0FBRUQsTUFBTUMsa0JBQWtCLEdBQUdwRyxnQkFBRThCLE9BQUYsQ0FDekIsU0FBU3NFLGtCQUFULENBQTZCMUQsT0FBTyxHQUFHdEQseUJBQXZDLEVBQWtFVSxPQUFPLEdBQUdaLGFBQTVFLEVBQTJGO0FBQ3pGLFNBQU8scUJBQU13RCxPQUFOLEVBQWV3RCw4QkFBZixFQUErQ3BHLE9BQS9DLENBQVA7QUFDRCxDQUh3QixDQUEzQjs7OztBQU1BLFNBQVN1RyxrQkFBVCxHQUErQjtBQUc3QixRQUFNQyxRQUFRLEdBQUcsQ0FDZnpFLE9BRGUsRUFDTlksa0JBRE0sRUFDYzRCLDhCQURkLEVBQzhDSSxZQUQ5QyxFQUVmRyxhQUZlLEVBRUF3QixrQkFGQSxDQUFqQjtBQUtBRSxFQUFBQSxRQUFRLENBQUNDLE9BQVQsQ0FBa0JDLENBQUQsSUFBTztBQUN0QixRQUFJQSxDQUFDLENBQUNDLEtBQU4sRUFBYTtBQUNYRCxNQUFBQSxDQUFDLENBQUNDLEtBQUYsR0FBVSxJQUFJekcsZ0JBQUU4QixPQUFGLENBQVU0RSxLQUFkLEVBQVY7QUFDRDtBQUNGLEdBSkQ7QUFLRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV0aWwsIGZzLCBwbGlzdCwgbG9nZ2VyIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByZXRyeSB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVBsaXN0RGF0YSB9IGZyb20gJ3BsaXN0JztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5cbmNvbnN0IGVudiA9IHByb2Nlc3MuZW52O1xuXG5jb25zdCBYQ1JVTl9USU1FT1VUID0gMTUwMDA7XG5jb25zdCBYQ09ERV9TVUJESVIgPSAnL0NvbnRlbnRzL0RldmVsb3Blcic7XG5jb25zdCBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTID0gMztcblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignWGNvZGUnKTtcblxuXG5mdW5jdGlvbiBoYXNFeHBlY3RlZFN1YkRpciAocGF0aCkge1xuICByZXR1cm4gcGF0aC5zdWJzdHJpbmcocGF0aC5sZW5ndGggLSBYQ09ERV9TVUJESVIubGVuZ3RoKSA9PT0gWENPREVfU1VCRElSO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5YY3J1bkNvbW1hbmQgKGFyZ3MsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZXhlYygneGNydW4nLCBhcmdzLCB7dGltZW91dH0pO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHJlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm90aGluZyByZXR1cm5lZCBmcm9tIHRyeWluZyB0byBydW4gJ3hjcnVuICR7YXJncy5qb2luKCcgJyl9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyB0aGUgdHJ1ZSBlcnJvciBjYW4gYmUgaGlkZGVuIHdpdGhpbiB0aGUgc3RkZXJyXG4gICAgaWYgKGVyci5zdGRlcnIpIHtcbiAgICAgIGVyci5tZXNzYWdlID0gYCR7ZXJyLm1lc3NhZ2V9OiAke2Vyci5zdGRlcnJ9YDtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UGF0aEZyb21TeW1saW5rIChmYWlsTWVzc2FnZSkge1xuICAvLyBOb2RlJ3MgaW52b2NhdGlvbiBvZiB4Y29kZS1zZWxlY3Qgc29tZXRpbWVzIGZsYWtlcyBhbmQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gIC8vIE5vdCBjbGVhciB3aHkuIEFzIGEgd29ya2Fyb3VuZCwgQXBwaXVtIGNhbiByZWxpYWJseSBkZWR1Y2UgdGhlIHZlcnNpb24gaW4gdXNlIGJ5IGNoZWNraW5nXG4gIC8vIHRoZSBsb2NhdGlvbnMgeGNvZGUtc2VsZWN0IHVzZXMgdG8gc3RvcmUgdGhlIHNlbGVjdGVkIHZlcnNpb24ncyBwYXRoLiBUaGlzIHNob3VsZCBiZSAxMDAlXG4gIC8vIHJlbGlhYmxlIHNvIGxvbmcgYXMgdGhlIGxpbmsgbG9jYXRpb25zIHJlbWFpbiB0aGUgc2FtZS4gSG93ZXZlciwgc2luY2Ugd2UncmUgcmVseWluZyBvblxuICAvLyBoYXJkY29kZWQgcGF0aHMsIHRoaXMgYXBwcm9hY2ggd2lsbCBicmVhayB0aGUgbmV4dCB0aW1lIEFwcGxlIGNoYW5nZXMgdGhlIHN5bWxpbmsgbG9jYXRpb24uXG4gIGxvZy53YXJuKGBGaW5kaW5nIFhjb2RlUGF0aCBieSBzeW1saW5rIGJlY2F1c2UgJHtmYWlsTWVzc2FnZX1gKTtcblxuICBjb25zdCBzeW1saW5rUGF0aCA9ICcvdmFyL2RiL3hjb2RlX3NlbGVjdF9saW5rJztcbiAgY29uc3QgbGVnYWN5U3ltbGlua1BhdGggPSAnL3Vzci9zaGFyZS94Y29kZS1zZWxlY3QveGNvZGVfZGlyX2xpbmsnOyAvLyAgWGNvZGUgPCA1LnhcbiAgbGV0IHhjb2RlUGF0aCA9IG51bGw7XG5cbiAgLy8geGNvZGUtc2VsZWN0IGFsbG93cyB1c2VycyB0byBvdmVycmlkZSBpdHMgc2V0dGluZ3Mgd2l0aCB0aGUgREVWRUxPUEVSX0RJUiBlbnYgdmFyLFxuICAvLyBzbyBjaGVjayB0aGF0IGZpcnN0XG4gIGlmICh1dGlsLmhhc0NvbnRlbnQoZW52LkRFVkVMT1BFUl9ESVIpKSB7XG4gICAgY29uc3QgY3VzdG9tUGF0aCA9IGhhc0V4cGVjdGVkU3ViRGlyKGVudi5ERVZFTE9QRVJfRElSKVxuICAgICAgPyBlbnYuREVWRUxPUEVSX0RJUlxuICAgICAgOiBlbnYuREVWRUxPUEVSX0RJUiArIFhDT0RFX1NVQkRJUjtcblxuICAgIGlmIChhd2FpdCBmcy5leGlzdHMoY3VzdG9tUGF0aCkpIHtcbiAgICAgIHhjb2RlUGF0aCA9IGN1c3RvbVBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBtZXNnID0gYENvdWxkIG5vdCBmaW5kIHBhdGggdG8gWGNvZGUsIGVudmlyb25tZW50IHZhcmlhYmxlIGAgK1xuICAgICAgICAgICAgICAgICBgREVWRUxPUEVSX0RJUiBzZXQgdG86ICR7ZW52LkRFVkVMT1BFUl9ESVJ9IGAgK1xuICAgICAgICAgICAgICAgICBgYnV0IG5vIFhjb2RlIGZvdW5kYDtcbiAgICAgIGxvZy53YXJuKG1lc2cpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc2cpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChhd2FpdCBmcy5leGlzdHMoc3ltbGlua1BhdGgpKSB7XG4gICAgeGNvZGVQYXRoID0gYXdhaXQgZnMucmVhZGxpbmsoc3ltbGlua1BhdGgpO1xuICB9IGVsc2UgaWYgKGF3YWl0IGZzLmV4aXN0cyhsZWdhY3lTeW1saW5rUGF0aCkpIHtcbiAgICB4Y29kZVBhdGggPSBhd2FpdCBmcy5yZWFkbGluayhsZWdhY3lTeW1saW5rUGF0aCk7XG4gIH1cblxuICBpZiAoeGNvZGVQYXRoKSB7XG4gICAgcmV0dXJuIHhjb2RlUGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoJy8kJyksICcnKS50cmltKCk7XG4gIH1cblxuICAvLyBXZSBzaG91bGQgb25seSBnZXQgaGVyZSBpcyB3ZSBmYWlsZWQgdG8gY2FwdHVyZSB4Y29kZS1zZWxlY3QncyBzdGRvdXQgYW5kIG91clxuICAvLyBvdGhlciBjaGVja3MgZmFpbGVkLiBFaXRoZXIgQXBwbGUgaGFzIG1vdmVkIHRoZSBzeW1saW5rIHRvIGEgbmV3IGxvY2F0aW9uIG9yIHRoZSB1c2VyXG4gIC8vIGlzIG5vdCB1c2luZyB0aGUgZGVmYXVsdCBpbnN0YWxsLiA5OS45OTklIGNoYW5jZSBpdCdzIHRoZSBsYXR0ZXIsIHNvIGlzc3VlIGEgd2FybmluZ1xuICAvLyBzaG91bGQgd2UgZXZlciBoaXQgdGhlIGVkZ2UgY2FzZS5cbiAgbGV0IG1zZyA9IGBDb3VsZCBub3QgZmluZCBwYXRoIHRvIFhjb2RlIGJ5IHN5bWxpbmtzIGxvY2F0ZWQgaW4gJHtzeW1saW5rUGF0aH0sIG9yICR7bGVnYWN5U3ltbGlua1BhdGh9YDtcbiAgbG9nLndhcm4obXNnKTtcbiAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFBhdGhGcm9tWGNvZGVTZWxlY3QgKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGxldCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ3hjb2RlLXNlbGVjdCcsIFsnLS1wcmludC1wYXRoJ10sIHt0aW1lb3V0fSk7XG5cbiAgLy8gdHJpbSBhbmQgcmVtb3ZlIHRyYWlsaW5nIHNsYXNoXG4gIGNvbnN0IHhjb2RlRm9sZGVyUGF0aCA9IHN0ZG91dC5yZXBsYWNlKC9cXC8kLywgJycpLnRyaW0oKTtcblxuICBpZiAoIXV0aWwuaGFzQ29udGVudCh4Y29kZUZvbGRlclBhdGgpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coJ3hjb2RlLXNlbGVjdCByZXR1cm5lZCBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlmIChhd2FpdCBmcy5leGlzdHMoeGNvZGVGb2xkZXJQYXRoKSkge1xuICAgIHJldHVybiB4Y29kZUZvbGRlclBhdGg7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbXNnID0gYHhjb2RlLXNlbGVjdCBjb3VsZCBub3QgZmluZCB4Y29kZS4gUGF0aCAnJHt4Y29kZUZvbGRlclBhdGh9JyBkb2VzIG5vdCBleGlzdC5gO1xuICAgIGxvZy5lcnJvckFuZFRocm93KG1zZyk7XG4gIH1cbn1cblxuY29uc3QgZ2V0UGF0aCA9IF8ubWVtb2l6ZShmdW5jdGlvbiBnZXRQYXRoICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAvLyBmaXJzdCB3ZSB0cnkgdXNpbmcgeGNvZGUtc2VsZWN0IHRvIGZpbmQgdGhlIHBhdGhcbiAgLy8gdGhlbiB3ZSB0cnkgdXNpbmcgdGhlIHN5bWxpbmtzIHRoYXQgQXBwbGUgaGFzIGJ5IGRlZmF1bHRcbiAgcmV0dXJuIGdldFBhdGhGcm9tWGNvZGVTZWxlY3QodGltZW91dCkuY2F0Y2goZ2V0UGF0aEZyb21TeW1saW5rKTtcbn0pO1xuXG5cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgeGNvZGVQYXRoID0gYXdhaXQgZ2V0UGF0aCh0aW1lb3V0KTtcblxuICAvLyB3ZSB3YW50IHRvIHJlYWQgdGhlIENGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIGZyb20gWGNvZGUncyBwbGlzdC5cbiAgLy8gSXQgc2hvdWxkIGJlIGluIC9bcm9vdF0vWENvZGUuYXBwL0NvbnRlbnRzL1xuICBjb25zdCBwbGlzdFBhdGggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCAnLi4nLCAnSW5mby5wbGlzdCcpO1xuXG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHBsaXN0UGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgWGNvZGUgdmVyc2lvbi4gJHtwbGlzdFBhdGh9IGRvZXMgbm90IGV4aXN0IG9uIGRpc2suYCk7XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocGxpc3RQYXRoKTtcbiAgcmV0dXJuIHNlbXZlci5jb2VyY2UodmVyc2lvbi5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyk7XG59XG5cbmNvbnN0IGdldFZlcnNpb25NZW1vaXplZCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0VmVyc2lvbk1lbW9pemVkIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFZlcnNpb24gKHBhcnNlID0gZmFsc2UsIHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbk1lbW9pemVkKHJldHJpZXMsIHRpbWVvdXQpO1xuICAvLyB4Y29kZSB2ZXJzaW9uIHN0cmluZ3MgYXJlIG5vdCBleGFjdGx5IHNlbXZlciBzdHJpbmc6IHBhdGNoIHZlcnNpb25zIG9mIDBcbiAgLy8gYXJlIHJlbW92ZWQgKGUuZy4sICcxMC4wLjAnID0+ICcxMC4wJylcbiAgY29uc3QgdmVyc2lvblN0cmluZyA9IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi52ZXJzaW9uIDogYCR7dmVyc2lvbi5tYWpvcn0uJHt2ZXJzaW9uLm1pbm9yfWA7XG4gIGlmICghcGFyc2UpIHtcbiAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvblN0cmluZyxcbiAgICB2ZXJzaW9uRmxvYXQ6IHBhcnNlRmxvYXQodmVyc2lvblN0cmluZyksXG4gICAgbWFqb3I6IHZlcnNpb24ubWFqb3IsXG4gICAgbWlub3I6IHZlcnNpb24ubWlub3IsXG4gICAgcGF0Y2g6IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi5wYXRjaCA6IHVuZGVmaW5lZCxcbiAgICB0b1N0cmluZyAoKSB7XG4gICAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiAoKSB7XG4gIC8vIHRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2F5cyB0aGF0IHRoZSBDTEkgdG9vbHMgdmVyc2lvbiBoYXMgYmVlblxuICAvLyByZXByZXNlbnRlZC4gVHJ5IHRoZW0gZnJvbSBtb3N0IHJlbGlhYmxlIHRvIGxlYXN0LCBmYWxsaW5nIGRvd24gdGhlIGNoYWluXG4gIGNvbnN0IGdldFZlcnNpb25GdW5jdGlvbnMgPSBbXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHBrZyA9IChhd2FpdCBleGVjKCdwa2d1dGlsJywgWyctLXBrZ3M9Y29tLmFwcGxlLnBrZy5EZXZTREtfLionXSkpLnN0ZG91dDtcbiAgICAgIHJldHVybiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz0ke3BrZy50cmltKCl9YF0pKS5zdGRvdXQ7XG4gICAgfSxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkNMVG9vbHNfRXhlY3V0YWJsZXNgXSkpLnN0ZG91dCxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkRldmVsb3BlclRvb2xzQ0xJYF0pKS5zdGRvdXQsXG4gIF07XG4gIGxldCBzdGRvdXQ7XG4gIGZvciAobGV0IGdldFZlcnNpb24gb2YgZ2V0VmVyc2lvbkZ1bmN0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICBzdGRvdXQgPSBhd2FpdCBnZXRWZXJzaW9uKCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIHN0ZG91dCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vIHN0ZG91dCBzaG91bGQgaGF2ZSBhIGxpbmUgbGlrZSBgdmVyc2lvbjogOC4wLjAuMC4xLjE0NzI0MzU4ODFgXG4gIGxldCBtYXRjaCA9IC9edmVyc2lvbjogKC4rKSQvbS5leGVjKHN0ZG91dCk7IC8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvSFYzeDRkLzFcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaHR0cHM6Ly90cmFjLm1hY3BvcnRzLm9yZy93aWtpL1hjb2RlVmVyc2lvbkluZm9cbiAqIHRvIHNlZSB0aGUgYWN0dWFsIG1hcHBpbmcgYmV0d2VlbiBjbGFuZyBhbmQgb3RoZXIgY29tcG9uZW50cy5cbiAqXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGFjdHVhbCBDbGFuZyB2ZXJzaW9uIGluIHgueC54Lnggb3IgeC54LnggZm9ybWF0LFxuICogd2hpY2ggaXMgc3VwcGxpZWQgd2l0aCBDb21tYW5kIExpbmUgVG9vbHMuIGBudWxsYCBpcyByZXR1cm5lZFxuICogaWYgQ0xUIGFyZSBub3QgaW5zdGFsbGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDbGFuZ1ZlcnNpb24gKCkge1xuICB0cnkge1xuICAgIGF3YWl0IGZzLndoaWNoKCdjbGFuZycpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmluZm8oJ0Nhbm5vdCBmaW5kIGNsYW5nIGV4ZWN1dGFibGUgb24gdGhlIGxvY2FsIHN5c3RlbS4gJyArXG4gICAgICAnQXJlIFhjb2RlIENvbW1hbmQgTGluZSBUb29scyBpbnN0YWxsZWQ/Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdjbGFuZycsIFsnLS12ZXJzaW9uJ10pO1xuICBjb25zdCBtYXRjaCA9IC9jbGFuZy0oWzAtOS5dKykvLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIGxvZy5pbmZvKGBDYW5ub3QgcGFyc2UgY2xhbmcgdmVyc2lvbiBmcm9tICR7c3Rkb3V0fWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBtYXRjaFsxXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB4Y29kZVBhdGggPSBhd2FpdCBnZXRQYXRoKHRpbWVvdXQpO1xuXG4gIC8vIGZvciBpb3MgOCBhbmQgdXAsIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgQXV0aW9tYXRpb25JbnN0cnVtZW50IGNoYW5nZWQuXG4gIC8vIHJhdGhlciB0aGFuIHdhc3RlIHRpbWUgZ2V0dGluZyB0aGUgaU9TU0RLVmVyc2lvbiwganVzdCBnZXQgYm90aCBwYXRocyBhbmQgc2VlIHdoaWNoIG9uZSBleGlzdHNcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsneHJwbHVnaW4nLCAnYnVuZGxlJ107XG4gIGNvbnN0IHBhdGhQcmVmaXggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCAnLi4vQXBwbGljYXRpb25zL0luc3RydW1lbnRzLmFwcC9Db250ZW50cy9QbHVnSW5zJyk7XG4gIGNvbnN0IHBhdGhTdWZmaXggPSAnQ29udGVudHMvUmVzb3VyY2VzL0F1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSc7XG4gIGxldCBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzID0gW1xuICAgIHBhdGgucmVzb2x2ZShwYXRoUHJlZml4LCBgQXV0b21hdGlvbkluc3RydW1lbnQuJHtleHRlbnNpb25zWzBdfWAsIHBhdGhTdWZmaXgpLFxuICAgIHBhdGgucmVzb2x2ZShwYXRoUHJlZml4LCBgQXV0b21hdGlvbkluc3RydW1lbnQuJHtleHRlbnNpb25zWzFdfWAsIHBhdGhTdWZmaXgpXG4gIF07XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzBdKSkge1xuICAgIHJldHVybiBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzBdO1xuICB9XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzFdKSkge1xuICAgIHJldHVybiBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzFdO1xuICB9XG5cbiAgY29uc3QgbXNnID0gJ0NvdWxkIG5vdCBmaW5kIEF1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZycgK1xuICAgICAgICAgICAgICBgbG9jYXRpb25zICR7YXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRocy50b1N0cmluZygpfWA7XG4gIGxvZy5lcnJvcihtc2cpO1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcblxufVxuXG5jb25zdCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGggPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCAocmV0cmllcyA9IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gICAgcmV0dXJuIHJldHJ5KHJldHJpZXMsIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldFZlcnNpb24oZmFsc2UsIERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQpO1xuICBpZiAodmVyc2lvblswXSA9PT0gJzQnKSB7XG4gICAgcmV0dXJuICc2LjEnO1xuICB9XG5cbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnaXBob25lc2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBjb25zdCBzZGtWZXJzaW9uID0gc3Rkb3V0LnRyaW0oKTtcbiAgY29uc3QgbWF0Y2ggPSAvXFxkLlxcZC8uZXhlYyhzdGRvdXQpO1xuXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHhjcnVuIHJldHVybmVkIGEgbm9uLW51bWVyaWMgaU9TIFNESyB2ZXJzaW9uOiAnJHtzZGtWZXJzaW9ufSdgKTtcbiAgfVxuXG4gIHJldHVybiBzZGtWZXJzaW9uO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRNYXhJT1NTREtGcm9tWGNvZGVWZXJzaW9uICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbih0cnVlLCBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0KTtcbiAgLy8gYXMgb2Ygbm93LCB0aGUgaU9TIHZlcnNpb24gYXNzb2NpYXRlZCB3aXRoIGFuIFhjb2RlIHZlcnNpb24gaXNcbiAgLy8ganVzdCB0aGUgWGNvZGUgdmVyc2lvbiArIDJcbiAgcmV0dXJuIGAke3ZlcnNpb24ubWFqb3IgKyAyfS4ke3ZlcnNpb24ubWlub3J9YDtcbn1cblxuY29uc3QgZ2V0TWF4SU9TU0RLID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiBnZXRNYXhJT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBVbmFibGUgdG8gcmV0cmlldmUgbWF4aW11bSBpT1MgdmVyc2lvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGxvZy53YXJuKCdHdWVzc2luZyBmcm9tIFhjb2RlIHZlcnNpb24nKTtcbiAgICAgIHJldHVybiBnZXRNYXhJT1NTREtGcm9tWGNvZGVWZXJzaW9uKHRpbWVvdXQpO1xuICAgIH1cbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnYXBwbGV0dnNpbXVsYXRvcicsICctLXNob3ctc2RrLXZlcnNpb24nXTtcbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBydW5YY3J1bkNvbW1hbmQoYXJncywgdGltZW91dCk7XG5cbiAgY29uc3Qgc2RrVmVyc2lvbiA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKGlzTmFOKHBhcnNlRmxvYXQoc2RrVmVyc2lvbikpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB4Y3J1biByZXR1cm5lZCBhIG5vbi1udW1lcmljIHR2T1MgU0RLIHZlcnNpb246ICcke3Nka1ZlcnNpb259J2ApO1xuICB9XG5cbiAgcmV0dXJuIHNka1ZlcnNpb247XG59XG5cbmNvbnN0IGdldE1heFRWT1NTREsgPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIGdldE1heFRWT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ubmVjdGVkRGV2aWNlcyAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgY21kID0gJy91c3Ivc2Jpbi9zeXN0ZW1fcHJvZmlsZXInO1xuICBjb25zdCBhcmdzID0gWycteG1sJywgJ1NQVVNCRGF0YVR5cGUnXTtcbiAgbGV0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyhjbWQsIGFyZ3MsIHt0aW1lb3V0fSk7XG4gIGxldCBwbGlzdENvbnRlbnQgPSBwYXJzZVBsaXN0RGF0YShzdGRvdXQpO1xuXG4gIGxldCBkZXZpY2VzRm91bmQgPSBbXTtcbiAgbGV0IGVudHJpZXNUb1NlYXJjaCA9IFtwbGlzdENvbnRlbnRbMF1dO1xuICB3aGlsZSAoZW50cmllc1RvU2VhcmNoLmxlbmd0aCA+IDApIHtcbiAgICBsZXQgY3VycmVudEVudHJ5ID0gZW50cmllc1RvU2VhcmNoLnBvcCgpO1xuICAgIGlmIChjdXJyZW50RW50cnkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgZW50cmllc1RvU2VhcmNoID0gZW50cmllc1RvU2VhcmNoLmNvbmNhdChjdXJyZW50RW50cnkpO1xuICAgIH0gZWxzZSBpZiAoKGN1cnJlbnRFbnRyeS5fbmFtZSAmJlxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5fbmFtZS5zdWJzdHJpbmcoMCwgNCkgPT09ICdpUGFkJykgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiZcbiAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkuX25hbWUuc3Vic3RyaW5nKDAsIDYpID09PSAnaVBob25lJykgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiYgXy5pbmNsdWRlcyhjdXJyZW50RW50cnkuX25hbWUsICdBcHBsZSBUVicpKSkge1xuICAgICAgbGV0IGRldmljZUluZm8gPSB7XG4gICAgICAgIG5hbWU6IGN1cnJlbnRFbnRyeS5fbmFtZSxcbiAgICAgICAgdWRpZDogY3VycmVudEVudHJ5LnNlcmlhbF9udW0sXG4gICAgICAgIHByb2R1Y3RJZDogY3VycmVudEVudHJ5LnByb2R1Y3RfaWQsXG4gICAgICAgIGRldmljZVZlcnNpb246IGN1cnJlbnRFbnRyeS5iY2RfZGV2aWNlXG4gICAgICB9O1xuICAgICAgZGV2aWNlc0ZvdW5kLnB1c2goZGV2aWNlSW5mbyk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50RW50cnkuX2l0ZW1zKSB7XG4gICAgICBlbnRyaWVzVG9TZWFyY2ggPSBlbnRyaWVzVG9TZWFyY2guY29uY2F0KGN1cnJlbnRFbnRyeS5faXRlbXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGV2aWNlc0ZvdW5kO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRJbnN0cnVtZW50c1BhdGhXaXRob3V0UmV0cnkgKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGNvbnN0IGFyZ3MgPSBbJy1maW5kJywgJ2luc3RydW1lbnRzJ107XG4gIGxldCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBpZiAoIXN0ZG91dCkge1xuICAgIHN0ZG91dCA9ICcnO1xuICB9XG5cbiAgbGV0IGluc3RydW1lbnRzUGF0aCA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKCFpbnN0cnVtZW50c1BhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHBhdGggdG8gaW5zdHJ1bWVudHMgYmluYXJ5IHVzaW5nICd4Y3J1biAke2FyZ3Muam9pbignICcpfSdgKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVtZW50c1BhdGg7XG59XG5cbmNvbnN0IGdldEluc3RydW1lbnRzUGF0aCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0SW5zdHJ1bWVudHNQYXRoIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0SW5zdHJ1bWVudHNQYXRoV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuZnVuY3Rpb24gY2xlYXJJbnRlcm5hbENhY2hlICgpIHtcblxuICAvLyBtZW1vaXplZCBmdW5jdGlvbnNcbiAgY29uc3QgbWVtb2l6ZWQgPSBbXG4gICAgZ2V0UGF0aCwgZ2V0VmVyc2lvbk1lbW9pemVkLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgICBnZXRNYXhUVk9TU0RLLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIF07XG5cbiAgbWVtb2l6ZWQuZm9yRWFjaCgoZikgPT4ge1xuICAgIGlmIChmLmNhY2hlKSB7XG4gICAgICBmLmNhY2hlID0gbmV3IF8ubWVtb2l6ZS5DYWNoZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCB7XG4gIGdldFBhdGgsIGdldFZlcnNpb24sIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCwgZ2V0TWF4SU9TU0RLLFxuICBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnksIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q29ubmVjdGVkRGV2aWNlcywgY2xlYXJJbnRlcm5hbENhY2hlLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIGdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uLCBnZXRNYXhUVk9TU0RLLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LFxuICBnZXRDbGFuZ1ZlcnNpb24sXG59O1xuIl0sImZpbGUiOiJsaWIveGNvZGUuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/index.js
CHANGED
|
@@ -8,6 +8,7 @@ const {
|
|
|
8
8
|
getAutomationTraceTemplatePathWithoutRetry, getMaxIOSSDKWithoutRetry,
|
|
9
9
|
getConnectedDevices, clearInternalCache, getInstrumentsPath,
|
|
10
10
|
getCommandLineToolsVersion, getMaxTVOSSDK, getMaxTVOSSDKWithoutRetry,
|
|
11
|
+
getClangVersion,
|
|
11
12
|
} = xcode;
|
|
12
13
|
|
|
13
14
|
export {
|
|
@@ -15,5 +16,6 @@ export {
|
|
|
15
16
|
getAutomationTraceTemplatePathWithoutRetry, getMaxIOSSDKWithoutRetry,
|
|
16
17
|
getConnectedDevices, clearInternalCache, getInstrumentsPath,
|
|
17
18
|
getCommandLineToolsVersion, getMaxTVOSSDK, getMaxTVOSSDKWithoutRetry,
|
|
19
|
+
getClangVersion,
|
|
18
20
|
};
|
|
19
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
|
);
|
|
@@ -323,4 +368,5 @@ export {
|
|
|
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.11.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
|
},
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"e2e-test": "gulp e2e-test",
|
|
51
51
|
"coverage": "gulp coveralls",
|
|
52
52
|
"precommit-msg": "echo 'Pre-commit checks...' && exit 0",
|
|
53
|
-
"lint": "gulp
|
|
53
|
+
"lint": "gulp lint",
|
|
54
54
|
"lint:fix": "gulp eslint --fix"
|
|
55
55
|
},
|
|
56
56
|
"pre-commit": [
|
|
@@ -58,21 +58,12 @@
|
|
|
58
58
|
"test"
|
|
59
59
|
],
|
|
60
60
|
"devDependencies": {
|
|
61
|
-
"
|
|
62
|
-
"appium-gulp-plugins": "^3.1.0",
|
|
63
|
-
"babel-eslint": "^10.0.0",
|
|
61
|
+
"appium-gulp-plugins": "^5.4.0",
|
|
64
62
|
"chai": "^4.1.2",
|
|
65
63
|
"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",
|
|
64
|
+
"eslint-config-appium": "^4.2.0",
|
|
71
65
|
"gulp": "^4.0.0",
|
|
72
|
-
"mocha": "^
|
|
66
|
+
"mocha": "^9.0.0",
|
|
73
67
|
"pre-commit": "^1.1.3"
|
|
74
|
-
},
|
|
75
|
-
"greenkeeper": {
|
|
76
|
-
"ignore": []
|
|
77
68
|
}
|
|
78
69
|
}
|