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 CHANGED
@@ -6,8 +6,6 @@ appium-xcode
6
6
  [![devDependency Status](https://david-dm.org/appium/appium-xcode/dev-status.svg)](https://david-dm.org/appium/appium-xcode#info=devDependencies)
7
7
 
8
8
  [![Build Status](https://travis-ci.org/appium/appium-xcode.svg?branch=master)](https://travis-ci.org/appium/appium-xcode)
9
- [![Coverage Status](https://coveralls.io/repos/appium/appium-xcode/badge.svg)](https://coveralls.io/r/appium/appium-xcode)
10
- [![Greenkeeper badge](https://badges.greenkeeper.io/appium/appium-xcode.svg)](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 getPath = xcode.getPath,
13
- getVersion = xcode.getVersion,
14
- getAutomationTraceTemplatePath = xcode.getAutomationTraceTemplatePath,
15
- getMaxIOSSDK = xcode.getMaxIOSSDK,
16
- getAutomationTraceTemplatePathWithoutRetry = xcode.getAutomationTraceTemplatePathWithoutRetry,
17
- getMaxIOSSDKWithoutRetry = xcode.getMaxIOSSDKWithoutRetry,
18
- getConnectedDevices = xcode.getConnectedDevices,
19
- clearInternalCache = xcode.clearInternalCache,
20
- getInstrumentsPath = xcode.getInstrumentsPath,
21
- getCommandLineToolsVersion = xcode.getCommandLineToolsVersion,
22
- getMaxTVOSSDK = xcode.getMaxTVOSSDK,
23
- getMaxTVOSSDKWithoutRetry = xcode.getMaxTVOSSDKWithoutRetry;
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImdldFBhdGgiLCJ4Y29kZSIsImdldFZlcnNpb24iLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgiLCJnZXRNYXhJT1NTREsiLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnkiLCJnZXRNYXhJT1NTREtXaXRob3V0UmV0cnkiLCJnZXRDb25uZWN0ZWREZXZpY2VzIiwiY2xlYXJJbnRlcm5hbENhY2hlIiwiZ2V0SW5zdHJ1bWVudHNQYXRoIiwiZ2V0Q29tbWFuZExpbmVUb29sc1ZlcnNpb24iLCJnZXRNYXhUVk9TU0RLIiwiZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBRUE7O01BSUVBLE8sR0FJRUMsSyxDQUpGRCxPO01BQVNFLFUsR0FJUEQsSyxDQUpPQyxVO01BQVlDLDhCLEdBSW5CRixLLENBSm1CRSw4QjtNQUFnQ0MsWSxHQUluREgsSyxDQUptREcsWTtNQUNyREMsMEMsR0FHRUosSyxDQUhGSSwwQztNQUE0Q0Msd0IsR0FHMUNMLEssQ0FIMENLLHdCO01BQzVDQyxtQixHQUVFTixLLENBRkZNLG1CO01BQXFCQyxrQixHQUVuQlAsSyxDQUZtQk8sa0I7TUFBb0JDLGtCLEdBRXZDUixLLENBRnVDUSxrQjtNQUN6Q0MsMEIsR0FDRVQsSyxDQURGUywwQjtNQUE0QkMsYSxHQUMxQlYsSyxDQUQwQlUsYTtNQUFlQyx5QixHQUN6Q1gsSyxDQUR5Q1cseUI7Ozs7Ozs7Ozs7Ozs7ZUFTOUJYLEsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgKiBhcyB4Y29kZSBmcm9tICcuL2xpYi94Y29kZSc7XG5cblxuY29uc3Qge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbn0gPSB4Y29kZTtcblxuZXhwb3J0IHtcbiAgZ2V0UGF0aCwgZ2V0VmVyc2lvbiwgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoLCBnZXRNYXhJT1NTREssXG4gIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSwgZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5LFxuICBnZXRDb25uZWN0ZWREZXZpY2VzLCBjbGVhckludGVybmFsQ2FjaGUsIGdldEluc3RydW1lbnRzUGF0aCxcbiAgZ2V0Q29tbWFuZExpbmVUb29sc1ZlcnNpb24sIGdldE1heFRWT1NTREssIGdldE1heFRWT1NTREtXaXRob3V0UmV0cnksXG59O1xuZXhwb3J0IGRlZmF1bHQgeGNvZGU7XG4iXSwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlUm9vdCI6Ii4uIn0=
46
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImdldFBhdGgiLCJnZXRWZXJzaW9uIiwiZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoIiwiZ2V0TWF4SU9TU0RLIiwiZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5IiwiZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5IiwiZ2V0Q29ubmVjdGVkRGV2aWNlcyIsImNsZWFySW50ZXJuYWxDYWNoZSIsImdldEluc3RydW1lbnRzUGF0aCIsImdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uIiwiZ2V0TWF4VFZPU1NESyIsImdldE1heFRWT1NTREtXaXRob3V0UmV0cnkiLCJnZXRDbGFuZ1ZlcnNpb24iLCJ4Y29kZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7QUFHQSxNQUFNO0FBQ0pBLEVBQUFBLE9BREk7QUFDS0MsRUFBQUEsVUFETDtBQUNpQkMsRUFBQUEsOEJBRGpCO0FBQ2lEQyxFQUFBQSxZQURqRDtBQUVKQyxFQUFBQSwwQ0FGSTtBQUV3Q0MsRUFBQUEsd0JBRnhDO0FBR0pDLEVBQUFBLG1CQUhJO0FBR2lCQyxFQUFBQSxrQkFIakI7QUFHcUNDLEVBQUFBLGtCQUhyQztBQUlKQyxFQUFBQSwwQkFKSTtBQUl3QkMsRUFBQUEsYUFKeEI7QUFJdUNDLEVBQUFBLHlCQUp2QztBQUtKQyxFQUFBQTtBQUxJLElBTUZDLEtBTko7Ozs7Ozs7Ozs7Ozs7O2VBZWVBLEsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgKiBhcyB4Y29kZSBmcm9tICcuL2xpYi94Y29kZSc7XG5cblxuY29uc3Qge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufSA9IHhjb2RlO1xuXG5leHBvcnQge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufTtcbmV4cG9ydCBkZWZhdWx0IHhjb2RlO1xuIl0sImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZVJvb3QiOiIuLiJ9
@@ -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
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
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 = "/Contents/Developer";
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(_x) {
45
- return _runXcrunCommand.apply(this, arguments);
46
- }
47
-
48
- function _runXcrunCommand() {
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
- function _getPathFromSymlink() {
70
- _getPathFromSymlink = (0, _asyncToGenerator2.default)(function* (failMessage) {
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
- if (xcodePath) {
93
- return xcodePath.replace(new RegExp("/$"), "").trim();
55
+ return res;
56
+ } catch (err) {
57
+ if (err.stderr) {
58
+ err.message = `${err.message}: ${err.stderr}`;
94
59
  }
95
60
 
96
- let msg = `Could not find path to Xcode by symlinks located in ${symlinkPath}, or ${legacySymlinkPath}`;
97
- log.warn(msg);
98
- throw new Error(msg);
99
- });
100
- return _getPathFromSymlink.apply(this, arguments);
61
+ throw err;
62
+ }
101
63
  }
102
64
 
103
- function getPathFromXcodeSelect() {
104
- return _getPathFromXcodeSelect.apply(this, arguments);
105
- }
106
-
107
- function _getPathFromXcodeSelect() {
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
- if (!_appiumSupport.util.hasContent(xcodeFolderPath)) {
117
- log.errorAndThrow('xcode-select returned an empty string');
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 (yield _appiumSupport.fs.exists(xcodeFolderPath)) {
121
- return xcodeFolderPath;
74
+ if (await _appiumSupport.fs.exists(customPath)) {
75
+ xcodePath = customPath;
122
76
  } else {
123
- const msg = `xcode-select could not find xcode. Path '${xcodeFolderPath}' does not exist.`;
124
- log.errorAndThrow(msg);
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
- return _getPathFromXcodeSelect.apply(this, arguments);
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
- return _getVersionWithoutRetry.apply(this, arguments);
138
- }
122
+ async function getVersionWithoutRetry(timeout = XCRUN_TIMEOUT) {
123
+ const xcodePath = await getPath(timeout);
139
124
 
140
- function _getVersionWithoutRetry() {
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
- const plistPath = _path.default.resolve(xcodePath, "..", "Info.plist");
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
- if (!(yield _appiumSupport.fs.exists(plistPath))) {
147
- throw new Error(`Could not get Xcode version. ${plistPath} does not exist on disk.`);
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
- return _getVersion.apply(this, arguments);
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
- function _getVersion() {
165
- _getVersion = (0, _asyncToGenerator2.default)(function* (parse = false, retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
166
- const version = yield getVersionMemoized(retries, timeout);
167
- const versionString = version.patch > 0 ? version.version : `${version.major}.${version.minor}`;
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
- if (!parse) {
154
+ toString() {
170
155
  return versionString;
171
156
  }
172
157
 
173
- return {
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
- return _getCommandLineToolsVersion.apply(this, arguments);
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
- function _getCommandLineToolsVersion() {
189
- _getCommandLineToolsVersion = (0, _asyncToGenerator2.default)(function* () {
190
- const getVersionFunctions = [(0, _asyncToGenerator2.default)(function* () {
191
- let pkg = (yield (0, _teen_process.exec)('pkgutil', ['--pkgs=com.apple.pkg.DevSDK_.*'])).stdout;
192
- return (yield (0, _teen_process.exec)('pkgutil', [`--pkg-info=${pkg.trim()}`])).stdout;
193
- }), (0, _asyncToGenerator2.default)(function* () {
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
- let match = /^version: (.+)$/m.exec(stdout);
212
- return match ? match[1] : undefined;
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 getAutomationTraceTemplatePathWithoutRetry() {
218
- return _getAutomationTraceTemplatePathWithoutRetry.apply(this, arguments);
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 _getAutomationTraceTemplatePathWithoutRetry() {
222
- _getAutomationTraceTemplatePathWithoutRetry = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
223
- const xcodePath = yield getPath(timeout);
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
- const pathPrefix = _path.default.resolve(xcodePath, "../Applications/Instruments.app/Contents/PlugIns");
206
+ const pathPrefix = _path.default.resolve(xcodePath, '../Applications/Instruments.app/Contents/PlugIns');
227
207
 
228
- const pathSuffix = "Contents/Resources/Automation.tracetemplate";
229
- let automationTraceTemplatePaths = [_path.default.resolve(pathPrefix, `AutomationInstrument.${extensions[0]}`, pathSuffix), _path.default.resolve(pathPrefix, `AutomationInstrument.${extensions[1]}`, pathSuffix)];
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
- if (yield _appiumSupport.fs.exists(automationTraceTemplatePaths[0])) {
232
- return automationTraceTemplatePaths[0];
233
- }
211
+ if (await _appiumSupport.fs.exists(automationTraceTemplatePaths[0])) {
212
+ return automationTraceTemplatePaths[0];
213
+ }
234
214
 
235
- if (yield _appiumSupport.fs.exists(automationTraceTemplatePaths[1])) {
236
- return automationTraceTemplatePaths[1];
237
- }
215
+ if (await _appiumSupport.fs.exists(automationTraceTemplatePaths[1])) {
216
+ return automationTraceTemplatePaths[1];
217
+ }
238
218
 
239
- const msg = "Could not find Automation.tracetemplate in any of the following" + `locations ${automationTraceTemplatePaths.toString()}`;
240
- log.error(msg);
241
- throw new Error(msg);
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
- return _getMaxIOSSDKWithoutRetry.apply(this, arguments);
254
- }
230
+ async function getMaxIOSSDKWithoutRetry(timeout = XCRUN_TIMEOUT) {
231
+ const version = await getVersion(false, DEFAULT_NUMBER_OF_RETRIES, timeout);
255
232
 
256
- function _getMaxIOSSDKWithoutRetry() {
257
- _getMaxIOSSDKWithoutRetry = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
258
- const version = yield getVersion(false, DEFAULT_NUMBER_OF_RETRIES, timeout);
233
+ if (version[0] === '4') {
234
+ return '6.1';
235
+ }
259
236
 
260
- if (version[0] === '4') {
261
- return '6.1';
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
- const args = ['--sdk', 'iphonesimulator', '--show-sdk-version'];
244
+ if (!match) {
245
+ throw new Error(`xcrun returned a non-numeric iOS SDK version: '${sdkVersion}'`);
246
+ }
265
247
 
266
- const _ref5 = yield runXcrunCommand(args, timeout),
267
- stdout = _ref5.stdout;
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
- return sdkVersion;
277
- });
278
- return _getMaxIOSSDKWithoutRetry.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}`;
279
254
  }
280
255
 
281
- const getMaxIOSSDK = _lodash.default.memoize(function (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
282
- return (0, _asyncbox.retry)(retries, getMaxIOSSDKWithoutRetry, timeout);
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
- return _getMaxTVOSSDKWithoutRetry.apply(this, arguments);
289
- }
290
-
291
- function _getMaxTVOSSDKWithoutRetry() {
292
- _getMaxTVOSSDKWithoutRetry = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
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
- const _ref6 = yield runXcrunCommand(args, timeout),
296
- stdout = _ref6.stdout;
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
- return sdkVersion;
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
- return _getConnectedDevices.apply(this, arguments);
317
- }
318
-
319
- function _getConnectedDevices() {
320
- _getConnectedDevices = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
321
- const cmd = '/usr/sbin/system_profiler';
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
- return _getConnectedDevices.apply(this, arguments);
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
- function getInstrumentsPathWithoutRetry() {
357
- return _getInstrumentsPathWithoutRetry.apply(this, arguments);
318
+ return devicesFound;
358
319
  }
359
320
 
360
- function _getInstrumentsPathWithoutRetry() {
361
- _getInstrumentsPathWithoutRetry = (0, _asyncToGenerator2.default)(function* (timeout = XCRUN_TIMEOUT) {
362
- const args = ['-find', 'instruments'];
363
-
364
- let _ref8 = yield runXcrunCommand(args, timeout),
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
- if (!stdout) {
368
- stdout = "";
369
- }
327
+ if (!stdout) {
328
+ stdout = '';
329
+ }
370
330
 
371
- let instrumentsPath = stdout.trim();
331
+ let instrumentsPath = stdout.trim();
372
332
 
373
- if (!instrumentsPath) {
374
- throw new Error(`Could not find path to instruments binary using 'xcrun ${args.join(' ')}'`);
375
- }
333
+ if (!instrumentsPath) {
334
+ throw new Error(`Could not find path to instruments binary using 'xcrun ${args.join(' ')}'`);
335
+ }
376
336
 
377
- return instrumentsPath;
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 = "/Contents/Developer";
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
- return await exec('xcrun', args, {timeout});
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 = "/var/db/xcode_select_link";
45
- const legacySymlinkPath = "/usr/share/xcode-select/xcode_dir_link"; // Xcode < 5.x
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("/$"), "").trim();
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, "..", "Info.plist");
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, "../Applications/Instruments.app/Contents/PlugIns");
181
- const pathSuffix = "Contents/Resources/Automation.tracetemplate";
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 = "Could not find Automation.tracetemplate in any of the following" +
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
- return retry(retries, getMaxIOSSDKWithoutRetry, timeout);
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) === "iPad") ||
310
+ currentEntry._name.substring(0, 4) === 'iPad') ||
266
311
  (currentEntry._name &&
267
- currentEntry._name.substring(0, 6) === "iPhone") ||
268
- (currentEntry._name && _.includes(currentEntry._name, "Apple TV"))) {
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.7.2",
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": "^5.5.0",
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 eslint",
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
- "ajv": "^6.5.3",
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": "^5.2.0",
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": "^5.1.1",
66
+ "mocha": "^9.0.0",
73
67
  "pre-commit": "^1.1.3"
74
- },
75
- "greenkeeper": {
76
- "ignore": []
77
68
  }
78
69
  }