appium-android-driver 5.12.0 → 5.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [5.12.2](https://github.com/appium/appium-android-driver/compare/v5.12.1...v5.12.2) (2023-05-18)
2
+
3
+
4
+ ### Miscellaneous Chores
5
+
6
+ * **deps-dev:** bump @appium/support from 3.1.11 to 4.0.0 ([#811](https://github.com/appium/appium-android-driver/issues/811)) ([527c6a5](https://github.com/appium/appium-android-driver/commit/527c6a502024ebed157ffd8a416bfd726eb3034a))
7
+
8
+ ## [5.12.1](https://github.com/appium/appium-android-driver/compare/v5.12.0...v5.12.1) (2023-05-16)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * Select proper service names in mobileGetConnectivity API ([e8f1a27](https://github.com/appium/appium-android-driver/commit/e8f1a27dc6cf906c821753206dd97f7b8fbf5dcb))
14
+
1
15
  ## [5.12.0](https://github.com/appium/appium-android-driver/compare/v5.11.2...v5.12.0) (2023-05-05)
2
16
 
3
17
 
@@ -8,6 +8,7 @@ exports.helpers = exports.default = exports.commands = void 0;
8
8
  require("source-map-support/register");
9
9
  var _lodash = _interopRequireDefault(require("lodash"));
10
10
  var _driver = require("appium/driver");
11
+ var _support = require("appium/support");
11
12
  var _bluebird = _interopRequireDefault(require("bluebird"));
12
13
  let commands = {},
13
14
  helpers = {},
@@ -21,6 +22,7 @@ const GEO_EPSILON = Number.MIN_VALUE;
21
22
  const WIFI_KEY_NAME = 'wifi';
22
23
  const DATA_KEY_NAME = 'data';
23
24
  const AIRPLANE_MODE_KEY_NAME = 'airplaneMode';
25
+ const SUPPORTED_SERVICE_NAMES = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME];
24
26
  commands.getNetworkConnection = async function getNetworkConnection() {
25
27
  this.log.info('Getting network connection');
26
28
  let airplaneModeOn = await this.adb.isAirplaneModeOn();
@@ -43,7 +45,7 @@ commands.mobileSetConnectivity = async function mobileSetConnectivity(opts = {})
43
45
  airplaneMode
44
46
  } = opts;
45
47
  if (_lodash.default.every([wifi, data, airplaneMode], _lodash.default.isUndefined)) {
46
- throw new _driver.errors.InvalidArgumentError(`Either one of ['${WIFI_KEY_NAME}', '${DATA_KEY_NAME}', '${AIRPLANE_MODE_KEY_NAME}'] options must be provided`);
48
+ throw new _driver.errors.InvalidArgumentError(`Either one of ${JSON.stringify(SUPPORTED_SERVICE_NAMES)} options must be provided`);
47
49
  }
48
50
  const currentState = await this.mobileGetConnectivity({
49
51
  services: [...(_lodash.default.isUndefined(wifi) ? [] : [WIFI_KEY_NAME]), ...(_lodash.default.isUndefined(data) ? [] : [DATA_KEY_NAME]), ...(_lodash.default.isUndefined(airplaneMode) ? [] : [AIRPLANE_MODE_KEY_NAME])]
@@ -69,15 +71,19 @@ commands.mobileSetConnectivity = async function mobileSetConnectivity(opts = {})
69
71
  };
70
72
  commands.mobileGetConnectivity = async function mobileGetConnectivity(opts = {}) {
71
73
  let {
72
- services = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME]
74
+ services = SUPPORTED_SERVICE_NAMES
73
75
  } = opts;
74
76
  if (!_lodash.default.isArray(services)) {
75
77
  services = [services];
76
78
  }
79
+ const unsupportedServices = _lodash.default.difference(services, SUPPORTED_SERVICE_NAMES);
80
+ if (!_lodash.default.isEmpty(unsupportedServices)) {
81
+ throw new _driver.errors.InvalidArgumentError(`${_support.util.pluralize('Service name', unsupportedServices.length, false)} ${unsupportedServices} ` + `${unsupportedServices.length === 1 ? 'is' : 'are'} not known. Only the following services are ` + `suported: ${SUPPORTED_SERVICE_NAMES}`);
82
+ }
77
83
  const statePromises = {
78
- wifi: _bluebird.default.resolve(services.includes(WIFI_KEY_NAME) ? undefined : this.adb.isWifiOn()),
79
- data: _bluebird.default.resolve(services.includes(DATA_KEY_NAME) ? undefined : this.adb.isDataOn()),
80
- airplaneMode: _bluebird.default.resolve(services.includes(AIRPLANE_MODE_KEY_NAME) ? undefined : this.adb.isAirplaneModeOn())
84
+ wifi: _bluebird.default.resolve(services.includes(WIFI_KEY_NAME) ? this.adb.isWifiOn() : undefined),
85
+ data: _bluebird.default.resolve(services.includes(DATA_KEY_NAME) ? this.adb.isDataOn() : undefined),
86
+ airplaneMode: _bluebird.default.resolve(services.includes(AIRPLANE_MODE_KEY_NAME) ? this.adb.isAirplaneModeOn() : undefined)
81
87
  };
82
88
  await _bluebird.default.all(_lodash.default.values(statePromises));
83
89
  return _lodash.default.fromPairs(services.map(k => [k, statePromises[k].value()]));
@@ -216,4 +222,4 @@ helpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect(wrapped
216
222
  Object.assign(extensions, commands, helpers);
217
223
  var _default = extensions;
218
224
  exports.default = _default;
219
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX2JsdWViaXJkIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJBSVJQTEFORV9NT0RFX01BU0siLCJXSUZJX01BU0siLCJEQVRBX01BU0siLCJHRU9fRVBTSUxPTiIsIk51bWJlciIsIk1JTl9WQUxVRSIsIldJRklfS0VZX05BTUUiLCJEQVRBX0tFWV9OQU1FIiwiQUlSUExBTkVfTU9ERV9LRVlfTkFNRSIsImdldE5ldHdvcmtDb25uZWN0aW9uIiwibG9nIiwiaW5mbyIsImFpcnBsYW5lTW9kZU9uIiwiYWRiIiwiaXNBaXJwbGFuZU1vZGVPbiIsImNvbm5lY3Rpb24iLCJ3aWZpT24iLCJpc1dpZmlPbiIsImRhdGFPbiIsImlzRGF0YU9uIiwibW9iaWxlU2V0Q29ubmVjdGl2aXR5Iiwib3B0cyIsIndpZmkiLCJkYXRhIiwiYWlycGxhbmVNb2RlIiwiXyIsImV2ZXJ5IiwiaXNVbmRlZmluZWQiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsImN1cnJlbnRTdGF0ZSIsIm1vYmlsZUdldENvbm5lY3Rpdml0eSIsInNlcnZpY2VzIiwic2V0dGVycyIsIkJvb2xlYW4iLCJwdXNoIiwic2V0V2lmaVN0YXRlIiwiaXNFbXVsYXRvciIsInNldERhdGFTdGF0ZSIsInNldEFpcnBsYW5lTW9kZSIsImdldEFwaUxldmVsIiwiYnJvYWRjYXN0QWlycGxhbmVNb2RlIiwiaXNFbXB0eSIsIkIiLCJhbGwiLCJpc0FycmF5Iiwic3RhdGVQcm9taXNlcyIsInJlc29sdmUiLCJpbmNsdWRlcyIsInVuZGVmaW5lZCIsInZhbHVlcyIsImZyb21QYWlycyIsIm1hcCIsImsiLCJ2YWx1ZSIsInNldE5ldHdvcmtDb25uZWN0aW9uIiwidHlwZSIsInNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSIsInNob3VsZEVuYWJsZVdpZmkiLCJzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiIsImlzQWlycGxhbmVNb2RlRW5hYmxlZCIsImlzV2lGaUVuYWJsZWQiLCJpc0RhdGFFbmFibGVkIiwid3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QiLCJ0b2dnbGVEYXRhIiwic2V0V2lmaUFuZERhdGEiLCJ0b2dnbGVXaUZpIiwidG9nZ2xlRmxpZ2h0TW9kZSIsImZsaWdodE1vZGUiLCJzZXRHZW9Mb2NhdGlvbiIsImxvY2F0aW9uIiwiZ2V0R2VvTG9jYXRpb24iLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImFsdGl0dWRlIiwibW9iaWxlUmVmcmVzaEdwc0NhY2hlIiwidGltZW91dE1zIiwicmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUiLCJwYXJzZUZsb2F0IiwiaXNMb2NhdGlvblNlcnZpY2VzRW5hYmxlZCIsImlMb2NhdGlvblNlcnZpY2VzRW5hYmxlZCIsImdldExvY2F0aW9uUHJvdmlkZXJzIiwidG9nZ2xlTG9jYXRpb25TZXJ2aWNlcyIsImlzR3BzRW5hYmxlZCIsImRlYnVnIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsIndyYXBwZWQiLCJib290c3RyYXAiLCJpZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24iLCJyZXN0YXJ0Iiwic3RhcnQiLCJhcHBQYWNrYWdlIiwiZGlzYWJsZUFuZHJvaWRXYXRjaGVycyIsImFjY2VwdFNzbENlcnRzIiwiT2JqZWN0IiwiYXNzaWduIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL25ldHdvcmsuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IEFJUlBMQU5FX01PREVfTUFTSyA9IDBiMDAxO1xuY29uc3QgV0lGSV9NQVNLID0gMGIwMTA7XG5jb25zdCBEQVRBX01BU0sgPSAwYjEwMDtcbi8vIFRoZSB2YWx1ZSBjbG9zZSB0byB6ZXJvLCBidXQgbm90IHplcm8sIGlzIG5lZWRlZFxuLy8gdG8gdHJpY2sgSlNPTiBnZW5lcmF0aW9uIGFuZCBzZW5kIGEgZmxvYXQgdmFsdWUgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLFxuLy8gVGhpcyBhbGxvd3Mgc3RyaWN0bHktdHlwZWQgY2xpZW50cywgbGlrZSBKYXZhLCB0byBwcm9wZXJseVxuLy8gcGFyc2UgaXQuIE90aGVyd2lzZSBmbG9hdCAwLjAgaXMgYWx3YXlzIHJlcHJlc2VudGVkIGFzIGludGVnZXIgMCBpbiBKUy5cbi8vIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gREJMX0VQU0lMT04gKGh0dHBzOi8vb3BlbnNvdXJjZS5hcHBsZS5jb20vc291cmNlL0xpYmMvTGliYy00OTgvaW5jbHVkZS9mbG9hdC5oKVxuY29uc3QgR0VPX0VQU0lMT04gPSBOdW1iZXIuTUlOX1ZBTFVFO1xuY29uc3QgV0lGSV9LRVlfTkFNRSA9ICd3aWZpJztcbmNvbnN0IERBVEFfS0VZX05BTUUgPSAnZGF0YSc7XG5jb25zdCBBSVJQTEFORV9NT0RFX0tFWV9OQU1FID0gJ2FpcnBsYW5lTW9kZSc7XG5cbmNvbW1hbmRzLmdldE5ldHdvcmtDb25uZWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmV0d29ya0Nvbm5lY3Rpb24gKCkge1xuICB0aGlzLmxvZy5pbmZvKCdHZXR0aW5nIG5ldHdvcmsgY29ubmVjdGlvbicpO1xuICBsZXQgYWlycGxhbmVNb2RlT24gPSBhd2FpdCB0aGlzLmFkYi5pc0FpcnBsYW5lTW9kZU9uKCk7XG4gIGxldCBjb25uZWN0aW9uID0gYWlycGxhbmVNb2RlT24gPyBBSVJQTEFORV9NT0RFX01BU0sgOiAwO1xuXG4gIC8vIG5vIG5lZWQgdG8gY2hlY2sgYW55dGhpbmcgZWxzZSBpZiB3ZSBhcmUgaW4gYWlycGxhbmUgbW9kZVxuICBpZiAoIWFpcnBsYW5lTW9kZU9uKSB7XG4gICAgbGV0IHdpZmlPbiA9IGF3YWl0IHRoaXMuaXNXaWZpT24oKTtcbiAgICBjb25uZWN0aW9uIHw9ICh3aWZpT24gPyBXSUZJX01BU0sgOiAwKTtcbiAgICBsZXQgZGF0YU9uID0gYXdhaXQgdGhpcy5hZGIuaXNEYXRhT24oKTtcbiAgICBjb25uZWN0aW9uIHw9IChkYXRhT24gPyBEQVRBX01BU0sgOiAwKTtcbiAgfVxuXG4gIHJldHVybiBjb25uZWN0aW9uO1xufTtcblxuLyoqXG4gKiBkZWNvdXBsaW5nIHRvIG92ZXJyaWRlIHRoZSBiZWhhdmlvdXIgaW4gb3RoZXIgZHJpdmVycyBsaWtlIFVpQXV0b21hdG9yMi5cbiAqL1xuY29tbWFuZHMuaXNXaWZpT24gPSBhc3luYyBmdW5jdGlvbiBpc1dpZmlPbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5pc1dpZmlPbigpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTZXRDb25uZWN0aXZpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4/fSB3aWZpIEVpdGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSBXaS1GaS5cbiAqIEFuIHVuc2V0IHZhbHVlIG1lYW5zIHRvIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gc2VydmljZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbj99IGRhdGEgRWl0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIG1vYmlsZSBkYXRhIGNvbm5lY3Rpb24uXG4gKiBBbiB1bnNldCB2YWx1ZSBtZWFucyB0byBub3QgY2hhbmdlIHRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIHNlcnZpY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4/fSBhaXJwbGFuZU1vZGUgRWl0aGVyIHRvIGVuYWJsZSB0byBkaXNhYmxlIHRoZSBBaXJwbGFuZSBNb2RlXG4gKiBBbiB1bnNldCB2YWx1ZSBtZWFucyB0byBub3QgY2hhbmdlIHRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIHNlcnZpY2UuXG4gKi9cblxuLyoqXG4gKiBTZXQgdGhlIGNvbm5lY3Rpdml0eSBzdGF0ZSBmb3IgZGlmZmVyZW50IHNlcnZpY2VzXG4gKlxuICogQHBhcmFtIHtTZXRDb25uZWN0aXZpdHlPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbm9uZSBvZiBrbm93biBwcm9wZXJ0aWVzIHdlcmUgcHJvdmlkZWQgb3IgdGhlcmUgd2FzIGFuIGVycm9yXG4gKiB3aGlsZSBjaGFuZ2luZyBjb25uZWN0aXZpdHkgc3RhdGVzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVNldENvbm5lY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNldENvbm5lY3Rpdml0eSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB3aWZpLFxuICAgIGRhdGEsXG4gICAgYWlycGxhbmVNb2RlLFxuICB9ID0gb3B0cztcblxuICBpZiAoXy5ldmVyeShbd2lmaSwgZGF0YSwgYWlycGxhbmVNb2RlXSwgXy5pc1VuZGVmaW5lZCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYEVpdGhlciBvbmUgb2YgWycke1dJRklfS0VZX05BTUV9JywgJyR7REFUQV9LRVlfTkFNRX0nLCAnJHtBSVJQTEFORV9NT0RFX0tFWV9OQU1FfSddIG9wdGlvbnMgbXVzdCBiZSBwcm92aWRlZGBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY3VycmVudFN0YXRlID0gYXdhaXQgdGhpcy5tb2JpbGVHZXRDb25uZWN0aXZpdHkoe1xuICAgIHNlcnZpY2VzOiBbXG4gICAgICAuLi4oXy5pc1VuZGVmaW5lZCh3aWZpKSA/IFtdIDogW1dJRklfS0VZX05BTUVdKSxcbiAgICAgIC4uLihfLmlzVW5kZWZpbmVkKGRhdGEpID8gW10gOiBbREFUQV9LRVlfTkFNRV0pLFxuICAgICAgLi4uKF8uaXNVbmRlZmluZWQoYWlycGxhbmVNb2RlKSA/IFtdIDogW0FJUlBMQU5FX01PREVfS0VZX05BTUVdKSxcbiAgICBdXG4gIH0pO1xuICBjb25zdCBzZXR0ZXJzID0gW107XG4gIGlmICghXy5pc1VuZGVmaW5lZCh3aWZpKSAmJiBjdXJyZW50U3RhdGUud2lmaSAhPT0gQm9vbGVhbih3aWZpKSkge1xuICAgIHNldHRlcnMucHVzaCh0aGlzLmFkYi5zZXRXaWZpU3RhdGUod2lmaSwgdGhpcy5pc0VtdWxhdG9yKCkpKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQoZGF0YSkgJiYgY3VycmVudFN0YXRlLmRhdGEgIT09IEJvb2xlYW4oZGF0YSkpIHtcbiAgICBzZXR0ZXJzLnB1c2godGhpcy5hZGIuc2V0RGF0YVN0YXRlKGRhdGEsIHRoaXMuaXNFbXVsYXRvcigpKSk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKGFpcnBsYW5lTW9kZSkgJiYgY3VycmVudFN0YXRlLmFpcnBsYW5lTW9kZSAhPT0gQm9vbGVhbihhaXJwbGFuZU1vZGUpKSB7XG4gICAgc2V0dGVycy5wdXNoKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFpcnBsYW5lTW9kZShhaXJwbGFuZU1vZGUpO1xuICAgICAgaWYgKHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAzMCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RBaXJwbGFuZU1vZGUoYWlycGxhbmVNb2RlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eShzZXR0ZXJzKSkge1xuICAgIGF3YWl0IEIuYWxsKHNldHRlcnMpO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldENvbm5lY3Rpdml0eVJlc3VsdFxuICogQHByb3BlcnR5IHtib29sZWFufSB3aWZpIFRydWUgaWYgd2lmaSBpcyBlbmFibGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGRhdGEgVHJ1ZSBpZiBtb2JpbGUgZGF0YSBjb25uZWN0aW9uIGlzIGVuYWJsZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWlycGxhbmVNb2RlIFRydWUgaWYgQWlycGxhbmUgTW9kZSBpcyBlbmFibGVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXRDb25uZWN0aXZpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfHN0cmluZz99IHNlcnZpY2VzIG9uZSBvciBtb3JlIHNlcnZpY2VzIHRvIGdldCB0aGUgY29ubmVjdGl2aXR5IGZvci5cbiAqIFN1cHBvcnRlZCBzZXJ2aWNlIG5hbWVzIGFyZTogd2lmaSwgZGF0YSwgYWlycGxhbmVNb2RlLlxuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBjb25uZWN0aXZpdHkgcHJvcGVydGllcyBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEBwYXJhbSB7R2V0Q29ubmVjdGl2aXR5T3B0aW9ucz99IG9wdHMgSWYgbm8gc2VydmljZSBuYW1lcyBhcmUgcHJvdmlkZWQgdGhlbiB0aGVcbiAqIGNvbm5lY3Rpdml0eSBzdGF0ZSBpcyByZXR1cm5lZCBmb3IgYWxsIG9mIHRoZW0uXG4gKiBAcmV0dXJucyB7R2V0Q29ubmVjdGl2aXR5UmVzdWx0fVxuICovXG5jb21tYW5kcy5tb2JpbGVHZXRDb25uZWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRDb25uZWN0aXZpdHkgKG9wdHMgPSB7fSkge1xuICBsZXQge1xuICAgIHNlcnZpY2VzID0gW1dJRklfS0VZX05BTUUsIERBVEFfS0VZX05BTUUsIEFJUlBMQU5FX01PREVfS0VZX05BTUVdLFxuICB9ID0gb3B0cztcbiAgaWYgKCFfLmlzQXJyYXkoc2VydmljZXMpKSB7XG4gICAgc2VydmljZXMgPSBbc2VydmljZXNdO1xuICB9XG5cbiAgY29uc3Qgc3RhdGVQcm9taXNlcyA9IHtcbiAgICB3aWZpOiBCLnJlc29sdmUoc2VydmljZXMuaW5jbHVkZXMoV0lGSV9LRVlfTkFNRSkgPyB1bmRlZmluZWQgOiB0aGlzLmFkYi5pc1dpZmlPbigpKSxcbiAgICBkYXRhOiBCLnJlc29sdmUoc2VydmljZXMuaW5jbHVkZXMoREFUQV9LRVlfTkFNRSkgPyB1bmRlZmluZWQgOiB0aGlzLmFkYi5pc0RhdGFPbigpKSxcbiAgICBhaXJwbGFuZU1vZGU6IEIucmVzb2x2ZShcbiAgICAgIHNlcnZpY2VzLmluY2x1ZGVzKEFJUlBMQU5FX01PREVfS0VZX05BTUUpID8gdW5kZWZpbmVkIDogdGhpcy5hZGIuaXNBaXJwbGFuZU1vZGVPbigpXG4gICAgKSxcbiAgfTtcbiAgYXdhaXQgQi5hbGwoXy52YWx1ZXMoc3RhdGVQcm9taXNlcykpO1xuICByZXR1cm4gXy5mcm9tUGFpcnMoc2VydmljZXMubWFwKChrKSA9PiBbaywgc3RhdGVQcm9taXNlc1trXS52YWx1ZSgpXSkpO1xufTtcblxuY29tbWFuZHMuc2V0TmV0d29ya0Nvbm5lY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBzZXROZXR3b3JrQ29ubmVjdGlvbiAodHlwZSkge1xuICB0aGlzLmxvZy5pbmZvKCdTZXR0aW5nIG5ldHdvcmsgY29ubmVjdGlvbicpO1xuICAvLyBkZWNvZGUgdGhlIGlucHV0XG4gIGNvbnN0IHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSA9ICh0eXBlICYgQUlSUExBTkVfTU9ERV9NQVNLKSAhPT0gMDtcbiAgY29uc3Qgc2hvdWxkRW5hYmxlV2lmaSA9ICh0eXBlICYgV0lGSV9NQVNLKSAhPT0gMDtcbiAgY29uc3Qgc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPSAodHlwZSAmIERBVEFfTUFTSykgIT09IDA7XG5cbiAgY29uc3QgY3VycmVudFN0YXRlID0gYXdhaXQgdGhpcy5nZXROZXR3b3JrQ29ubmVjdGlvbigpO1xuICBjb25zdCBpc0FpcnBsYW5lTW9kZUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgQUlSUExBTkVfTU9ERV9NQVNLKSAhPT0gMDtcbiAgY29uc3QgaXNXaUZpRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBXSUZJX01BU0spICE9PSAwO1xuICBjb25zdCBpc0RhdGFFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIERBVEFfTUFTSykgIT09IDA7XG5cbiAgaWYgKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSAhPT0gaXNBaXJwbGFuZU1vZGVFbmFibGVkKSB7XG4gICAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBaXJwbGFuZU1vZGUoc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlKTtcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgMzApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBOb3QgY2hhbmdpbmcgYWlycGxhbmUgbW9kZSwgc2luY2UgaXQgaXMgYWxyZWFkeSAke3Nob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YFxuICAgICk7XG4gIH1cblxuICBpZiAoc2hvdWxkRW5hYmxlV2lmaSA9PT0gaXNXaUZpRW5hYmxlZCAmJiBzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA9PT0gaXNEYXRhRW5hYmxlZCkge1xuICAgIHRoaXMubG9nLmluZm8oJ05vdCBjaGFuZ2luZyBkYXRhIGNvbm5lY3Rpb24vV2ktRmkgc3RhdGVzLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5IHNldCB0byBleHBlY3RlZCB2YWx1ZXMnKTtcbiAgICBpZiAoYXdhaXQgdGhpcy5hZGIuaXNBaXJwbGFuZU1vZGVPbigpKSB7XG4gICAgICByZXR1cm4gQUlSUExBTkVfTU9ERV9NQVNLIHwgY3VycmVudFN0YXRlO1xuICAgIH1cbiAgICByZXR1cm4gfkFJUlBMQU5FX01PREVfTUFTSyAmIGN1cnJlbnRTdGF0ZTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChzaG91bGRFbmFibGVXaWZpICE9PSBpc1dpRmlFbmFibGVkKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldFdpZmlTdGF0ZShzaG91bGRFbmFibGVXaWZpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgTm90IGNoYW5naW5nIFdpLUZpIHN0YXRlLCBzaW5jZSBpdCBpcyBhbHJlYWR5IGAgK1xuICAgICAgICBgJHtzaG91bGRFbmFibGVXaWZpID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uIHN0YXRlLCBiZWNhdXNlIGFpcnBsYW5lIG1vZGUgaXMgZW5hYmxlZCcpO1xuICAgIH0gZWxzZSBpZiAoc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPT09IGlzRGF0YUVuYWJsZWQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYE5vdCBjaGFuZ2luZyBkYXRhIGNvbm5lY3Rpb24gc3RhdGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgYCArXG4gICAgICAgIGAke3Nob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0RGF0YVN0YXRlKHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uLCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYXdhaXQgdGhpcy5nZXROZXR3b3JrQ29ubmVjdGlvbigpO1xufTtcblxuLyoqXG4gKiBkZWNvdXBsaW5nIHRvIG92ZXJyaWRlIGJlaGF2aW91ciBpbiBvdGhlciBkcml2ZXJzIGxpa2UgVWlBdXRvbWF0b3IyLlxuICovXG5jb21tYW5kcy5zZXRXaWZpU3RhdGUgPSBhc3luYyBmdW5jdGlvbiBzZXRXaWZpU3RhdGUgKHdpZmkpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaVN0YXRlKHdpZmksIHRoaXMuaXNFbXVsYXRvcigpKTtcbn07XG5cbmNvbW1hbmRzLnRvZ2dsZURhdGEgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVEYXRhICgpIHtcbiAgbGV0IGRhdGEgPSAhKGF3YWl0IHRoaXMuYWRiLmlzRGF0YU9uKCkpO1xuICB0aGlzLmxvZy5pbmZvKGBUdXJuaW5nIG5ldHdvcmsgZGF0YSAke2RhdGEgPyAnb24nIDogJ29mZid9YCk7XG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlBbmREYXRhKHtkYXRhfSwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICB9KTtcbn07XG5cbmNvbW1hbmRzLnRvZ2dsZVdpRmkgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVXaUZpICgpIHtcbiAgbGV0IHdpZmkgPSAhKGF3YWl0IHRoaXMuYWRiLmlzV2lmaU9uKCkpO1xuICB0aGlzLmxvZy5pbmZvKGBUdXJuaW5nIFdpRmkgJHt3aWZpID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpQW5kRGF0YSh7d2lmaX0sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgfSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVGbGlnaHRNb2RlID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlRmxpZ2h0TW9kZSAoKSB7XG4gIC8qXG4gICAqIFRPRE86IEltcGxlbWVudCBpc1JlYWxEZXZpY2UoKS4gVGhpcyBtZXRob2QgZmFpbHMgb25cbiAgICogcmVhbCBkZXZpY2VzLCBpdCBzaG91bGQgdGhyb3cgYSBOb3RZZXRJbXBsZW1lbnRlZEVycm9yXG4gICAqL1xuICBsZXQgZmxpZ2h0TW9kZSA9ICEoYXdhaXQgdGhpcy5hZGIuaXNBaXJwbGFuZU1vZGVPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBmbGlnaHQgbW9kZSAke2ZsaWdodE1vZGUgPyAnb24nIDogJ29mZid9YCk7XG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuYWRiLnNldEFpcnBsYW5lTW9kZShmbGlnaHRNb2RlKTtcbiAgfSk7XG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgMzApIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmJyb2FkY2FzdEFpcnBsYW5lTW9kZShmbGlnaHRNb2RlKTtcbiAgICB9XG4gIH0pO1xufTtcblxuY29tbWFuZHMuc2V0R2VvTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBzZXRHZW9Mb2NhdGlvbiAobG9jYXRpb24pIHtcbiAgYXdhaXQgdGhpcy5hZGIuc2V0R2VvTG9jYXRpb24obG9jYXRpb24sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRHZW9Mb2NhdGlvbigpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhpcy5sb2cud2FybihgQ291bGQgbm90IGdldCB0aGUgY3VycmVudCBnZW9sb2NhdGlvbiBpbmZvOiAke2UubWVzc2FnZX1gKTtcbiAgICB0aGlzLmxvZy53YXJuKGBSZXR1cm5pbmcgdGhlIGRlZmF1bHQgemVybydlZCB2YWx1ZXNgKTtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0aXR1ZGU6IEdFT19FUFNJTE9OLFxuICAgICAgbG9uZ2l0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGFsdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICB9O1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdwc0NhY2hlUmVmcmVzaE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0TXMgWzIwMDAwXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXG4gKiB0byBibG9jayB1bnRpbCBHUFMgY2FjaGUgaXMgcmVmcmVzaGVkLiBQcm92aWRpbmcgemVybyBvciBhIG5lZ2F0aXZlXG4gKiB2YWx1ZSB0byBpdCBza2lwcyB3YWl0aW5nIGNvbXBsZXRlbHkuXG4gKi9cblxuLyoqXG4gKiBTZW5kcyBhbiBhc3luYyByZXF1ZXN0IHRvIHJlZnJlc2ggdGhlIEdQUyBjYWNoZS5cbiAqIFRoaXMgZmVhdHVyZSBvbmx5IHdvcmtzIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBoYXNcbiAqIEdvb2dsZSBQbGF5IFNlcnZpY2VzIGluc3RhbGxlZC4gSW4gY2FzZSB0aGUgdmFuaWxsYVxuICogTG9jYXRpb25NYW5hZ2VyIGlzIHVzZWQgdGhlIGRldmljZSBBUEkgbGV2ZWwgbXVzdCBiZSBhdFxuICogdmVyc2lvbiAzMCAoQW5kcm9pZCBSKSBvciBoaWdoZXIuXG4gKlxuICogQHBhcmFtIHtHcHNDYWNoZVJlZnJlc2hPcHRpb25zfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVJlZnJlc2hHcHNDYWNoZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVJlZnJlc2hHcHNDYWNoZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgdGltZW91dE1zIH0gPSBvcHRzO1xuICBhd2FpdCB0aGlzLmFkYi5yZWZyZXNoR2VvTG9jYXRpb25DYWNoZSh0aW1lb3V0TXMpO1xufTtcblxuY29tbWFuZHMuZ2V0R2VvTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRHZW9Mb2NhdGlvbiAoKSB7XG4gIGNvbnN0IHtsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhbHRpdHVkZX0gPSBhd2FpdCB0aGlzLmFkYi5nZXRHZW9Mb2NhdGlvbigpO1xuICByZXR1cm4ge1xuICAgIGxhdGl0dWRlOiBwYXJzZUZsb2F0KGxhdGl0dWRlKSB8fCBHRU9fRVBTSUxPTixcbiAgICBsb25naXR1ZGU6IHBhcnNlRmxvYXQobG9uZ2l0dWRlKSB8fCBHRU9fRVBTSUxPTixcbiAgICBhbHRpdHVkZTogcGFyc2VGbG9hdChhbHRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gIH07XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBHUFMgaXMgZW5hYmxlZFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJvb2xlYW4+fSBUcnVlIGlmIHllc1xuICovXG5jb21tYW5kcy5pc0xvY2F0aW9uU2VydmljZXNFbmFibGVkID0gYXN5bmMgZnVuY3Rpb24gaUxvY2F0aW9uU2VydmljZXNFbmFibGVkICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRMb2NhdGlvblByb3ZpZGVycygpKS5pbmNsdWRlcygnZ3BzJyk7XG59O1xuXG4vKipcbiAqIFRvZ2dsZXMgR1BTIHN0YXRlXG4gKi9cbmNvbW1hbmRzLnRvZ2dsZUxvY2F0aW9uU2VydmljZXMgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVMb2NhdGlvblNlcnZpY2VzICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnVG9nZ2xpbmcgbG9jYXRpb24gc2VydmljZXMnKTtcbiAgY29uc3QgaXNHcHNFbmFibGVkID0gYXdhaXQgdGhpcy5pc0xvY2F0aW9uU2VydmljZXNFbmFibGVkKCk7XG4gIHRoaXMubG9nLmRlYnVnKFxuICAgIGBDdXJyZW50IEdQUyBzdGF0ZTogJHtpc0dwc0VuYWJsZWR9LiBgICtcbiAgICBgVGhlIHNlcnZpY2UgaXMgZ29pbmcgdG8gYmUgJHtpc0dwc0VuYWJsZWQgPyAnZGlzYWJsZWQnIDogJ2VuYWJsZWQnfWBcbiAgKTtcbiAgYXdhaXQgdGhpcy5hZGIudG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlcighaXNHcHNFbmFibGVkKTtcbn07XG5cbmhlbHBlcnMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QgPSBhc3luYyBmdW5jdGlvbiB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICBpZiAoIXRoaXMuYm9vdHN0cmFwKSB7XG4gICAgcmV0dXJuIGF3YWl0IHdyYXBwZWQoKTtcbiAgfVxuXG4gIHRoaXMuYm9vdHN0cmFwLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zdGFydCh0aGlzLm9wdHMuYXBwUGFja2FnZSwgdGhpcy5vcHRzLmRpc2FibGVBbmRyb2lkV2F0Y2hlcnMsIHRoaXMub3B0cy5hY2NlcHRTc2xDZXJ0cyk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gZmFsc2U7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBSUcsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFBQ0MsT0FBQSxDQUFBRixPQUFBLEdBQUFBLE9BQUE7QUFBQUUsT0FBQSxDQUFBSCxRQUFBLEdBQUFBLFFBQUE7QUFFakQsTUFBTUksa0JBQWtCLEdBQUcsS0FBSztBQUNoQyxNQUFNQyxTQUFTLEdBQUcsS0FBSztBQUN2QixNQUFNQyxTQUFTLEdBQUcsS0FBSztBQU12QixNQUFNQyxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsU0FBUztBQUNw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
225
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX3N1cHBvcnQiLCJfYmx1ZWJpcmQiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZXhwb3J0cyIsIkFJUlBMQU5FX01PREVfTUFTSyIsIldJRklfTUFTSyIsIkRBVEFfTUFTSyIsIkdFT19FUFNJTE9OIiwiTnVtYmVyIiwiTUlOX1ZBTFVFIiwiV0lGSV9LRVlfTkFNRSIsIkRBVEFfS0VZX05BTUUiLCJBSVJQTEFORV9NT0RFX0tFWV9OQU1FIiwiU1VQUE9SVEVEX1NFUlZJQ0VfTkFNRVMiLCJnZXROZXR3b3JrQ29ubmVjdGlvbiIsImxvZyIsImluZm8iLCJhaXJwbGFuZU1vZGVPbiIsImFkYiIsImlzQWlycGxhbmVNb2RlT24iLCJjb25uZWN0aW9uIiwid2lmaU9uIiwiaXNXaWZpT24iLCJkYXRhT24iLCJpc0RhdGFPbiIsIm1vYmlsZVNldENvbm5lY3Rpdml0eSIsIm9wdHMiLCJ3aWZpIiwiZGF0YSIsImFpcnBsYW5lTW9kZSIsIl8iLCJldmVyeSIsImlzVW5kZWZpbmVkIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiY3VycmVudFN0YXRlIiwibW9iaWxlR2V0Q29ubmVjdGl2aXR5Iiwic2VydmljZXMiLCJzZXR0ZXJzIiwiQm9vbGVhbiIsInB1c2giLCJzZXRXaWZpU3RhdGUiLCJpc0VtdWxhdG9yIiwic2V0RGF0YVN0YXRlIiwic2V0QWlycGxhbmVNb2RlIiwiZ2V0QXBpTGV2ZWwiLCJicm9hZGNhc3RBaXJwbGFuZU1vZGUiLCJpc0VtcHR5IiwiQiIsImFsbCIsImlzQXJyYXkiLCJ1bnN1cHBvcnRlZFNlcnZpY2VzIiwiZGlmZmVyZW5jZSIsInV0aWwiLCJwbHVyYWxpemUiLCJsZW5ndGgiLCJzdGF0ZVByb21pc2VzIiwicmVzb2x2ZSIsImluY2x1ZGVzIiwidW5kZWZpbmVkIiwidmFsdWVzIiwiZnJvbVBhaXJzIiwibWFwIiwiayIsInZhbHVlIiwic2V0TmV0d29ya0Nvbm5lY3Rpb24iLCJ0eXBlIiwic2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlIiwic2hvdWxkRW5hYmxlV2lmaSIsInNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uIiwiaXNBaXJwbGFuZU1vZGVFbmFibGVkIiwiaXNXaUZpRW5hYmxlZCIsImlzRGF0YUVuYWJsZWQiLCJ3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCIsInRvZ2dsZURhdGEiLCJzZXRXaWZpQW5kRGF0YSIsInRvZ2dsZVdpRmkiLCJ0b2dnbGVGbGlnaHRNb2RlIiwiZmxpZ2h0TW9kZSIsInNldEdlb0xvY2F0aW9uIiwibG9jYXRpb24iLCJnZXRHZW9Mb2NhdGlvbiIsImUiLCJ3YXJuIiwibWVzc2FnZSIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiYWx0aXR1ZGUiLCJtb2JpbGVSZWZyZXNoR3BzQ2FjaGUiLCJ0aW1lb3V0TXMiLCJyZWZyZXNoR2VvTG9jYXRpb25DYWNoZSIsInBhcnNlRmxvYXQiLCJpc0xvY2F0aW9uU2VydmljZXNFbmFibGVkIiwiaUxvY2F0aW9uU2VydmljZXNFbmFibGVkIiwiZ2V0TG9jYXRpb25Qcm92aWRlcnMiLCJ0b2dnbGVMb2NhdGlvblNlcnZpY2VzIiwiaXNHcHNFbmFibGVkIiwiZGVidWciLCJ0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIiwid3JhcHBlZCIsImJvb3RzdHJhcCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsInJlc3RhcnQiLCJzdGFydCIsImFwcFBhY2thZ2UiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwiYWNjZXB0U3NsQ2VydHMiLCJPYmplY3QiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvbmV0d29yay5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IEFJUlBMQU5FX01PREVfTUFTSyA9IDBiMDAxO1xuY29uc3QgV0lGSV9NQVNLID0gMGIwMTA7XG5jb25zdCBEQVRBX01BU0sgPSAwYjEwMDtcbi8vIFRoZSB2YWx1ZSBjbG9zZSB0byB6ZXJvLCBidXQgbm90IHplcm8sIGlzIG5lZWRlZFxuLy8gdG8gdHJpY2sgSlNPTiBnZW5lcmF0aW9uIGFuZCBzZW5kIGEgZmxvYXQgdmFsdWUgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLFxuLy8gVGhpcyBhbGxvd3Mgc3RyaWN0bHktdHlwZWQgY2xpZW50cywgbGlrZSBKYXZhLCB0byBwcm9wZXJseVxuLy8gcGFyc2UgaXQuIE90aGVyd2lzZSBmbG9hdCAwLjAgaXMgYWx3YXlzIHJlcHJlc2VudGVkIGFzIGludGVnZXIgMCBpbiBKUy5cbi8vIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gREJMX0VQU0lMT04gKGh0dHBzOi8vb3BlbnNvdXJjZS5hcHBsZS5jb20vc291cmNlL0xpYmMvTGliYy00OTgvaW5jbHVkZS9mbG9hdC5oKVxuY29uc3QgR0VPX0VQU0lMT04gPSBOdW1iZXIuTUlOX1ZBTFVFO1xuY29uc3QgV0lGSV9LRVlfTkFNRSA9ICd3aWZpJztcbmNvbnN0IERBVEFfS0VZX05BTUUgPSAnZGF0YSc7XG5jb25zdCBBSVJQTEFORV9NT0RFX0tFWV9OQU1FID0gJ2FpcnBsYW5lTW9kZSc7XG5jb25zdCBTVVBQT1JURURfU0VSVklDRV9OQU1FUyA9IFtXSUZJX0tFWV9OQU1FLCBEQVRBX0tFWV9OQU1FLCBBSVJQTEFORV9NT0RFX0tFWV9OQU1FXTtcblxuY29tbWFuZHMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBnZXROZXR3b3JrQ29ubmVjdGlvbiAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ0dldHRpbmcgbmV0d29yayBjb25uZWN0aW9uJyk7XG4gIGxldCBhaXJwbGFuZU1vZGVPbiA9IGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKTtcbiAgbGV0IGNvbm5lY3Rpb24gPSBhaXJwbGFuZU1vZGVPbiA/IEFJUlBMQU5FX01PREVfTUFTSyA6IDA7XG5cbiAgLy8gbm8gbmVlZCB0byBjaGVjayBhbnl0aGluZyBlbHNlIGlmIHdlIGFyZSBpbiBhaXJwbGFuZSBtb2RlXG4gIGlmICghYWlycGxhbmVNb2RlT24pIHtcbiAgICBsZXQgd2lmaU9uID0gYXdhaXQgdGhpcy5pc1dpZmlPbigpO1xuICAgIGNvbm5lY3Rpb24gfD0gKHdpZmlPbiA/IFdJRklfTUFTSyA6IDApO1xuICAgIGxldCBkYXRhT24gPSBhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpO1xuICAgIGNvbm5lY3Rpb24gfD0gKGRhdGFPbiA/IERBVEFfTUFTSyA6IDApO1xuICB9XG5cbiAgcmV0dXJuIGNvbm5lY3Rpb247XG59O1xuXG4vKipcbiAqIGRlY291cGxpbmcgdG8gb3ZlcnJpZGUgdGhlIGJlaGF2aW91ciBpbiBvdGhlciBkcml2ZXJzIGxpa2UgVWlBdXRvbWF0b3IyLlxuICovXG5jb21tYW5kcy5pc1dpZmlPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzV2lmaU9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzV2lmaU9uKCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNldENvbm5lY3Rpdml0eU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbj99IHdpZmkgRWl0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIFdpLUZpLlxuICogQW4gdW5zZXQgdmFsdWUgbWVhbnMgdG8gbm90IGNoYW5nZSB0aGUgc3RhdGUgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlLlxuICogQHByb3BlcnR5IHtib29sZWFuP30gZGF0YSBFaXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgbW9iaWxlIGRhdGEgY29ubmVjdGlvbi5cbiAqIEFuIHVuc2V0IHZhbHVlIG1lYW5zIHRvIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gc2VydmljZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbj99IGFpcnBsYW5lTW9kZSBFaXRoZXIgdG8gZW5hYmxlIHRvIGRpc2FibGUgdGhlIEFpcnBsYW5lIE1vZGVcbiAqIEFuIHVuc2V0IHZhbHVlIG1lYW5zIHRvIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gc2VydmljZS5cbiAqL1xuXG4vKipcbiAqIFNldCB0aGUgY29ubmVjdGl2aXR5IHN0YXRlIGZvciBkaWZmZXJlbnQgc2VydmljZXNcbiAqXG4gKiBAcGFyYW0ge1NldENvbm5lY3Rpdml0eU9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBub25lIG9mIGtub3duIHByb3BlcnRpZXMgd2VyZSBwcm92aWRlZCBvciB0aGVyZSB3YXMgYW4gZXJyb3JcbiAqIHdoaWxlIGNoYW5naW5nIGNvbm5lY3Rpdml0eSBzdGF0ZXNcbiAqL1xuY29tbWFuZHMubW9iaWxlU2V0Q29ubmVjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2V0Q29ubmVjdGl2aXR5IChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHdpZmksXG4gICAgZGF0YSxcbiAgICBhaXJwbGFuZU1vZGUsXG4gIH0gPSBvcHRzO1xuXG4gIGlmIChfLmV2ZXJ5KFt3aWZpLCBkYXRhLCBhaXJwbGFuZU1vZGVdLCBfLmlzVW5kZWZpbmVkKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICBgRWl0aGVyIG9uZSBvZiAke0pTT04uc3RyaW5naWZ5KFNVUFBPUlRFRF9TRVJWSUNFX05BTUVTKX0gb3B0aW9ucyBtdXN0IGJlIHByb3ZpZGVkYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBjdXJyZW50U3RhdGUgPSBhd2FpdCB0aGlzLm1vYmlsZUdldENvbm5lY3Rpdml0eSh7XG4gICAgc2VydmljZXM6IFtcbiAgICAgIC4uLihfLmlzVW5kZWZpbmVkKHdpZmkpID8gW10gOiBbV0lGSV9LRVlfTkFNRV0pLFxuICAgICAgLi4uKF8uaXNVbmRlZmluZWQoZGF0YSkgPyBbXSA6IFtEQVRBX0tFWV9OQU1FXSksXG4gICAgICAuLi4oXy5pc1VuZGVmaW5lZChhaXJwbGFuZU1vZGUpID8gW10gOiBbQUlSUExBTkVfTU9ERV9LRVlfTkFNRV0pLFxuICAgIF1cbiAgfSk7XG4gIGNvbnN0IHNldHRlcnMgPSBbXTtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHdpZmkpICYmIGN1cnJlbnRTdGF0ZS53aWZpICE9PSBCb29sZWFuKHdpZmkpKSB7XG4gICAgc2V0dGVycy5wdXNoKHRoaXMuYWRiLnNldFdpZmlTdGF0ZSh3aWZpLCB0aGlzLmlzRW11bGF0b3IoKSkpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChkYXRhKSAmJiBjdXJyZW50U3RhdGUuZGF0YSAhPT0gQm9vbGVhbihkYXRhKSkge1xuICAgIHNldHRlcnMucHVzaCh0aGlzLmFkYi5zZXREYXRhU3RhdGUoZGF0YSwgdGhpcy5pc0VtdWxhdG9yKCkpKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQoYWlycGxhbmVNb2RlKSAmJiBjdXJyZW50U3RhdGUuYWlycGxhbmVNb2RlICE9PSBCb29sZWFuKGFpcnBsYW5lTW9kZSkpIHtcbiAgICBzZXR0ZXJzLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKGFpcnBsYW5lTW9kZSk7XG4gICAgICBpZiAodGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDMwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmJyb2FkY2FzdEFpcnBsYW5lTW9kZShhaXJwbGFuZU1vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KHNldHRlcnMpKSB7XG4gICAgYXdhaXQgQi5hbGwoc2V0dGVycyk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2V0Q29ubmVjdGl2aXR5UmVzdWx0XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpZmkgVHJ1ZSBpZiB3aWZpIGlzIGVuYWJsZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZGF0YSBUcnVlIGlmIG1vYmlsZSBkYXRhIGNvbm5lY3Rpb24gaXMgZW5hYmxlZFxuICogQHByb3BlcnR5IHtib29sZWFufSBhaXJwbGFuZU1vZGUgVHJ1ZSBpZiBBaXJwbGFuZSBNb2RlIGlzIGVuYWJsZWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldENvbm5lY3Rpdml0eU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW118c3RyaW5nP30gc2VydmljZXMgb25lIG9yIG1vcmUgc2VydmljZXMgdG8gZ2V0IHRoZSBjb25uZWN0aXZpdHkgZm9yLlxuICogU3VwcG9ydGVkIHNlcnZpY2UgbmFtZXMgYXJlOiB3aWZpLCBkYXRhLCBhaXJwbGFuZU1vZGUuXG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGNvbm5lY3Rpdml0eSBwcm9wZXJ0aWVzIGZyb20gdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHBhcmFtIHtHZXRDb25uZWN0aXZpdHlPcHRpb25zP30gb3B0cyBJZiBubyBzZXJ2aWNlIG5hbWVzIGFyZSBwcm92aWRlZCB0aGVuIHRoZVxuICogY29ubmVjdGl2aXR5IHN0YXRlIGlzIHJldHVybmVkIGZvciBhbGwgb2YgdGhlbS5cbiAqIEByZXR1cm5zIHtHZXRDb25uZWN0aXZpdHlSZXN1bHR9XG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldENvbm5lY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdldENvbm5lY3Rpdml0eSAob3B0cyA9IHt9KSB7XG4gIGxldCB7XG4gICAgc2VydmljZXMgPSBTVVBQT1JURURfU0VSVklDRV9OQU1FUyxcbiAgfSA9IG9wdHM7XG4gIGlmICghXy5pc0FycmF5KHNlcnZpY2VzKSkge1xuICAgIHNlcnZpY2VzID0gW3NlcnZpY2VzXTtcbiAgfVxuICBjb25zdCB1bnN1cHBvcnRlZFNlcnZpY2VzID0gXy5kaWZmZXJlbmNlKHNlcnZpY2VzLCBTVVBQT1JURURfU0VSVklDRV9OQU1FUyk7XG4gIGlmICghXy5pc0VtcHR5KHVuc3VwcG9ydGVkU2VydmljZXMpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGAke3V0aWwucGx1cmFsaXplKCdTZXJ2aWNlIG5hbWUnLCB1bnN1cHBvcnRlZFNlcnZpY2VzLmxlbmd0aCwgZmFsc2UpfSAke3Vuc3VwcG9ydGVkU2VydmljZXN9IGAgK1xuICAgICAgYCR7dW5zdXBwb3J0ZWRTZXJ2aWNlcy5sZW5ndGggPT09IDEgPyAnaXMnIDogJ2FyZSd9IG5vdCBrbm93bi4gT25seSB0aGUgZm9sbG93aW5nIHNlcnZpY2VzIGFyZSBgICtcbiAgICAgIGBzdXBvcnRlZDogJHtTVVBQT1JURURfU0VSVklDRV9OQU1FU31gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHN0YXRlUHJvbWlzZXMgPSB7XG4gICAgd2lmaTogQi5yZXNvbHZlKHNlcnZpY2VzLmluY2x1ZGVzKFdJRklfS0VZX05BTUUpID8gdGhpcy5hZGIuaXNXaWZpT24oKSA6IHVuZGVmaW5lZCksXG4gICAgZGF0YTogQi5yZXNvbHZlKHNlcnZpY2VzLmluY2x1ZGVzKERBVEFfS0VZX05BTUUpID8gdGhpcy5hZGIuaXNEYXRhT24oKSA6IHVuZGVmaW5lZCksXG4gICAgYWlycGxhbmVNb2RlOiBCLnJlc29sdmUoXG4gICAgICBzZXJ2aWNlcy5pbmNsdWRlcyhBSVJQTEFORV9NT0RFX0tFWV9OQU1FKSA/IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSA6IHVuZGVmaW5lZFxuICAgICksXG4gIH07XG4gIGF3YWl0IEIuYWxsKF8udmFsdWVzKHN0YXRlUHJvbWlzZXMpKTtcbiAgcmV0dXJuIF8uZnJvbVBhaXJzKHNlcnZpY2VzLm1hcCgoaykgPT4gW2ssIHN0YXRlUHJvbWlzZXNba10udmFsdWUoKV0pKTtcbn07XG5cbmNvbW1hbmRzLnNldE5ldHdvcmtDb25uZWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0TmV0d29ya0Nvbm5lY3Rpb24gKHR5cGUpIHtcbiAgdGhpcy5sb2cuaW5mbygnU2V0dGluZyBuZXR3b3JrIGNvbm5lY3Rpb24nKTtcbiAgLy8gZGVjb2RlIHRoZSBpbnB1dFxuICBjb25zdCBzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPSAodHlwZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZVdpZmkgPSAodHlwZSAmIFdJRklfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID0gKHR5cGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbiAgY29uc3QgaXNBaXJwbGFuZU1vZGVFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IGlzV2lGaUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgV0lGSV9NQVNLKSAhPT0gMDtcbiAgY29uc3QgaXNEYXRhRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGlmIChzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgIT09IGlzQWlycGxhbmVNb2RlRW5hYmxlZCkge1xuICAgIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDMwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmJyb2FkY2FzdEFpcnBsYW5lTW9kZShzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubG9nLmluZm8oXG4gICAgICBgTm90IGNoYW5naW5nIGFpcnBsYW5lIG1vZGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgJHtzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKHNob3VsZEVuYWJsZVdpZmkgPT09IGlzV2lGaUVuYWJsZWQgJiYgc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPT09IGlzRGF0YUVuYWJsZWQpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uL1dpLUZpIHN0YXRlcywgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBzZXQgdG8gZXhwZWN0ZWQgdmFsdWVzJyk7XG4gICAgaWYgKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSkge1xuICAgICAgcmV0dXJuIEFJUlBMQU5FX01PREVfTUFTSyB8IGN1cnJlbnRTdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIH5BSVJQTEFORV9NT0RFX01BU0sgJiBjdXJyZW50U3RhdGU7XG4gIH1cblxuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBpZiAoc2hvdWxkRW5hYmxlV2lmaSAhPT0gaXNXaUZpRW5hYmxlZCkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUoc2hvdWxkRW5hYmxlV2lmaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYE5vdCBjaGFuZ2luZyBXaS1GaSBzdGF0ZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgYCR7c2hvdWxkRW5hYmxlV2lmaSA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbiBzdGF0ZSwgYmVjYXVzZSBhaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQnKTtcbiAgICB9IGVsc2UgaWYgKHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID09PSBpc0RhdGFFbmFibGVkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uIHN0YXRlLCBzaW5jZSBpdCBpcyBhbHJlYWR5IGAgK1xuICAgICAgICBgJHtzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldERhdGFTdGF0ZShzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbn07XG5cbi8qKlxuICogZGVjb3VwbGluZyB0byBvdmVycmlkZSBiZWhhdmlvdXIgaW4gb3RoZXIgZHJpdmVycyBsaWtlIFVpQXV0b21hdG9yMi5cbiAqL1xuY29tbWFuZHMuc2V0V2lmaVN0YXRlID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaVN0YXRlICh3aWZpKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlTdGF0ZSh3aWZpLCB0aGlzLmlzRW11bGF0b3IoKSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVEYXRhID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlRGF0YSAoKSB7XG4gIGxldCBkYXRhID0gIShhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBuZXR3b3JrIGRhdGEgJHtkYXRhID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpQW5kRGF0YSh7ZGF0YX0sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgfSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVXaUZpID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlV2lGaSAoKSB7XG4gIGxldCB3aWZpID0gIShhd2FpdCB0aGlzLmFkYi5pc1dpZmlPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBXaUZpICR7d2lmaSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaUFuZERhdGEoe3dpZml9LCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMudG9nZ2xlRmxpZ2h0TW9kZSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUZsaWdodE1vZGUgKCkge1xuICAvKlxuICAgKiBUT0RPOiBJbXBsZW1lbnQgaXNSZWFsRGV2aWNlKCkuIFRoaXMgbWV0aG9kIGZhaWxzIG9uXG4gICAqIHJlYWwgZGV2aWNlcywgaXQgc2hvdWxkIHRocm93IGEgTm90WWV0SW1wbGVtZW50ZWRFcnJvclxuICAgKi9cbiAgbGV0IGZsaWdodE1vZGUgPSAhKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgZmxpZ2h0IG1vZGUgJHtmbGlnaHRNb2RlID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gIH0pO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDMwKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbW1hbmRzLnNldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0R2VvTG9jYXRpb24gKGxvY2F0aW9uKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldEdlb0xvY2F0aW9uKGxvY2F0aW9uLCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0R2VvTG9jYXRpb24oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMubG9nLndhcm4oYENvdWxkIG5vdCBnZXQgdGhlIGN1cnJlbnQgZ2VvbG9jYXRpb24gaW5mbzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgdGhpcy5sb2cud2FybihgUmV0dXJuaW5nIHRoZSBkZWZhdWx0IHplcm8nZWQgdmFsdWVzYCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGxvbmdpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgICBhbHRpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgfTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHcHNDYWNoZVJlZnJlc2hPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dE1zIFsyMDAwMF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICogdG8gYmxvY2sgdW50aWwgR1BTIGNhY2hlIGlzIHJlZnJlc2hlZC4gUHJvdmlkaW5nIHplcm8gb3IgYSBuZWdhdGl2ZVxuICogdmFsdWUgdG8gaXQgc2tpcHMgd2FpdGluZyBjb21wbGV0ZWx5LlxuICovXG5cbi8qKlxuICogU2VuZHMgYW4gYXN5bmMgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBHUFMgY2FjaGUuXG4gKiBUaGlzIGZlYXR1cmUgb25seSB3b3JrcyBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaGFzXG4gKiBHb29nbGUgUGxheSBTZXJ2aWNlcyBpbnN0YWxsZWQuIEluIGNhc2UgdGhlIHZhbmlsbGFcbiAqIExvY2F0aW9uTWFuYWdlciBpcyB1c2VkIHRoZSBkZXZpY2UgQVBJIGxldmVsIG11c3QgYmUgYXRcbiAqIHZlcnNpb24gMzAgKEFuZHJvaWQgUikgb3IgaGlnaGVyLlxuICpcbiAqIEBwYXJhbSB7R3BzQ2FjaGVSZWZyZXNoT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVSZWZyZXNoR3BzQ2FjaGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSZWZyZXNoR3BzQ2FjaGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgdGhpcy5hZGIucmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUodGltZW91dE1zKTtcbn07XG5cbmNvbW1hbmRzLmdldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0R2VvTG9jYXRpb24gKCkge1xuICBjb25zdCB7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWx0aXR1ZGV9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0R2VvTG9jYXRpb24oKTtcbiAgcmV0dXJuIHtcbiAgICBsYXRpdHVkZTogcGFyc2VGbG9hdChsYXRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgbG9uZ2l0dWRlOiBwYXJzZUZsb2F0KGxvbmdpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgYWx0aXR1ZGU6IHBhcnNlRmxvYXQoYWx0aXR1ZGUpIHx8IEdFT19FUFNJTE9OLFxuICB9O1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgR1BTIGlzIGVuYWJsZWRcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gVHJ1ZSBpZiB5ZXNcbiAqL1xuY29tbWFuZHMuaXNMb2NhdGlvblNlcnZpY2VzRW5hYmxlZCA9IGFzeW5jIGZ1bmN0aW9uIGlMb2NhdGlvblNlcnZpY2VzRW5hYmxlZCAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0TG9jYXRpb25Qcm92aWRlcnMoKSkuaW5jbHVkZXMoJ2dwcycpO1xufTtcblxuLyoqXG4gKiBUb2dnbGVzIEdQUyBzdGF0ZVxuICovXG5jb21tYW5kcy50b2dnbGVMb2NhdGlvblNlcnZpY2VzID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlTG9jYXRpb25TZXJ2aWNlcyAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ1RvZ2dsaW5nIGxvY2F0aW9uIHNlcnZpY2VzJyk7XG4gIGNvbnN0IGlzR3BzRW5hYmxlZCA9IGF3YWl0IHRoaXMuaXNMb2NhdGlvblNlcnZpY2VzRW5hYmxlZCgpO1xuICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICBgQ3VycmVudCBHUFMgc3RhdGU6ICR7aXNHcHNFbmFibGVkfS4gYCArXG4gICAgYFRoZSBzZXJ2aWNlIGlzIGdvaW5nIHRvIGJlICR7aXNHcHNFbmFibGVkID8gJ2Rpc2FibGVkJyA6ICdlbmFibGVkJ31gXG4gICk7XG4gIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIoIWlzR3BzRW5hYmxlZCk7XG59O1xuXG5oZWxwZXJzLndyYXBCb290c3RyYXBEaXNjb25uZWN0ID0gYXN5bmMgZnVuY3Rpb24gd3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QgKHdyYXBwZWQpIHtcbiAgaWYgKCF0aGlzLmJvb3RzdHJhcCkge1xuICAgIHJldHVybiBhd2FpdCB3cmFwcGVkKCk7XG4gIH1cblxuICB0aGlzLmJvb3RzdHJhcC5pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24gPSB0cnVlO1xuICB0cnkge1xuICAgIGF3YWl0IHdyYXBwZWQoKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5yZXN0YXJ0KCk7XG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc3RhcnQodGhpcy5vcHRzLmFwcFBhY2thZ2UsIHRoaXMub3B0cy5kaXNhYmxlQW5kcm9pZFdhdGNoZXJzLCB0aGlzLm9wdHMuYWNjZXB0U3NsQ2VydHMpO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMuYm9vdHN0cmFwLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IGZhbHNlO1xuICB9XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFNBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUlJLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUNDLE9BQUEsQ0FBQUYsT0FBQSxHQUFBQSxPQUFBO0FBQUFFLE9BQUEsQ0FBQUgsUUFBQSxHQUFBQSxRQUFBO0FBRWpELE1BQU1JLGtCQUFrQixHQUFHLEtBQUs7QUFDaEMsTUFBTUMsU0FBUyxHQUFHLEtBQUs7QUFDdkIsTUFBTUMsU0FBUyxHQUFHLEtBQUs7QUFNdkIsTUFBTUMsV0FBVyxHQUFHQyxNQUFNLENBQUNDLFNBQVM7QUFDcEMsTUFBTUMsYUFBYSxHQUFHLE1BQU07QUFDNUIsTUFBTUMsYUFBYSxHQUFHLE1BQU07QUFDNUIsTUFBTUMsc0JBQXNCLEdBQUcsY0FBYztBQUM3QyxNQUFNQyx1QkFBdUIsR0FBRyxDQUFDSCxhQUFhLEVBQUVDLGFBQWEsRUFBRUMsc0JBQXNCLENBQUM7QUFFdEZaLFFBQVEsQ0FBQ2Msb0JBQW9CLEdBQUcsZUFBZUEsb0JBQW9CQSxDQUFBLEVBQUk7RUFDckUsSUFBSSxDQUFDQyxHQUFHLENBQUNDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztF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
@@ -1 +1 @@
1
- {"version":3,"file":"network.js","names":["_lodash","_interopRequireDefault","require","_driver","_bluebird","commands","helpers","extensions","exports","AIRPLANE_MODE_MASK","WIFI_MASK","DATA_MASK","GEO_EPSILON","Number","MIN_VALUE","WIFI_KEY_NAME","DATA_KEY_NAME","AIRPLANE_MODE_KEY_NAME","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","mobileSetConnectivity","opts","wifi","data","airplaneMode","_","every","isUndefined","errors","InvalidArgumentError","currentState","mobileGetConnectivity","services","setters","Boolean","push","setWifiState","isEmulator","setDataState","setAirplaneMode","getApiLevel","broadcastAirplaneMode","isEmpty","B","all","isArray","statePromises","resolve","includes","undefined","values","fromPairs","map","k","value","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","toggleData","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","timeoutMs","refreshGeoLocationCache","parseFloat","isLocationServicesEnabled","iLocationServicesEnabled","getLocationProviders","toggleLocationServices","isGpsEnabled","debug","toggleGPSLocationProvider","wrapped","bootstrap","ignoreUnexpectedShutdown","restart","start","appPackage","disableAndroidWatchers","acceptSslCerts","Object","assign","_default","default"],"sources":["../../../lib/commands/network.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport B from 'bluebird';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst AIRPLANE_MODE_MASK = 0b001;\nconst WIFI_MASK = 0b010;\nconst DATA_MASK = 0b100;\n// The value close to zero, but not zero, is needed\n// to trick JSON generation and send a float value instead of an integer,\n// This allows strictly-typed clients, like Java, to properly\n// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.\n// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)\nconst GEO_EPSILON = Number.MIN_VALUE;\nconst WIFI_KEY_NAME = 'wifi';\nconst DATA_KEY_NAME = 'data';\nconst AIRPLANE_MODE_KEY_NAME = 'airplaneMode';\n\ncommands.getNetworkConnection = async function getNetworkConnection () {\n this.log.info('Getting network connection');\n let airplaneModeOn = await this.adb.isAirplaneModeOn();\n let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;\n\n // no need to check anything else if we are in airplane mode\n if (!airplaneModeOn) {\n let wifiOn = await this.isWifiOn();\n connection |= (wifiOn ? WIFI_MASK : 0);\n let dataOn = await this.adb.isDataOn();\n connection |= (dataOn ? DATA_MASK : 0);\n }\n\n return connection;\n};\n\n/**\n * decoupling to override the behaviour in other drivers like UiAutomator2.\n */\ncommands.isWifiOn = async function isWifiOn () {\n return await this.adb.isWifiOn();\n};\n\n/**\n * @typedef {Object} SetConnectivityOptions\n * @property {boolean?} wifi Either to enable or disable Wi-Fi.\n * An unset value means to not change the state for the given service.\n * @property {boolean?} data Either to enable or disable mobile data connection.\n * An unset value means to not change the state for the given service.\n * @property {boolean?} airplaneMode Either to enable to disable the Airplane Mode\n * An unset value means to not change the state for the given service.\n */\n\n/**\n * Set the connectivity state for different services\n *\n * @param {SetConnectivityOptions} opts\n * @throws {Error} If none of known properties were provided or there was an error\n * while changing connectivity states\n */\ncommands.mobileSetConnectivity = async function mobileSetConnectivity (opts = {}) {\n const {\n wifi,\n data,\n airplaneMode,\n } = opts;\n\n if (_.every([wifi, data, airplaneMode], _.isUndefined)) {\n throw new errors.InvalidArgumentError(\n `Either one of ['${WIFI_KEY_NAME}', '${DATA_KEY_NAME}', '${AIRPLANE_MODE_KEY_NAME}'] options must be provided`\n );\n }\n\n const currentState = await this.mobileGetConnectivity({\n services: [\n ...(_.isUndefined(wifi) ? [] : [WIFI_KEY_NAME]),\n ...(_.isUndefined(data) ? [] : [DATA_KEY_NAME]),\n ...(_.isUndefined(airplaneMode) ? [] : [AIRPLANE_MODE_KEY_NAME]),\n ]\n });\n const setters = [];\n if (!_.isUndefined(wifi) && currentState.wifi !== Boolean(wifi)) {\n setters.push(this.adb.setWifiState(wifi, this.isEmulator()));\n }\n if (!_.isUndefined(data) && currentState.data !== Boolean(data)) {\n setters.push(this.adb.setDataState(data, this.isEmulator()));\n }\n if (!_.isUndefined(airplaneMode) && currentState.airplaneMode !== Boolean(airplaneMode)) {\n setters.push(async () => {\n await this.adb.setAirplaneMode(airplaneMode);\n if (this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(airplaneMode);\n }\n });\n }\n if (!_.isEmpty(setters)) {\n await B.all(setters);\n }\n};\n\n/**\n * @typedef {Object} GetConnectivityResult\n * @property {boolean} wifi True if wifi is enabled\n * @property {boolean} data True if mobile data connection is enabled\n * @property {boolean} airplaneMode True if Airplane Mode is enabled\n */\n\n/**\n * @typedef {Object} GetConnectivityOptions\n * @property {string[]|string?} services one or more services to get the connectivity for.\n * Supported service names are: wifi, data, airplaneMode.\n */\n\n/**\n * Retrieves the connectivity properties from the device under test\n *\n * @param {GetConnectivityOptions?} opts If no service names are provided then the\n * connectivity state is returned for all of them.\n * @returns {GetConnectivityResult}\n */\ncommands.mobileGetConnectivity = async function mobileGetConnectivity (opts = {}) {\n let {\n services = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME],\n } = opts;\n if (!_.isArray(services)) {\n services = [services];\n }\n\n const statePromises = {\n wifi: B.resolve(services.includes(WIFI_KEY_NAME) ? undefined : this.adb.isWifiOn()),\n data: B.resolve(services.includes(DATA_KEY_NAME) ? undefined : this.adb.isDataOn()),\n airplaneMode: B.resolve(\n services.includes(AIRPLANE_MODE_KEY_NAME) ? undefined : this.adb.isAirplaneModeOn()\n ),\n };\n await B.all(_.values(statePromises));\n return _.fromPairs(services.map((k) => [k, statePromises[k].value()]));\n};\n\ncommands.setNetworkConnection = async function setNetworkConnection (type) {\n this.log.info('Setting network connection');\n // decode the input\n const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;\n const shouldEnableWifi = (type & WIFI_MASK) !== 0;\n const shouldEnableDataConnection = (type & DATA_MASK) !== 0;\n\n const currentState = await this.getNetworkConnection();\n const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;\n const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;\n const isDataEnabled = (currentState & DATA_MASK) !== 0;\n\n if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(shouldEnableAirplaneMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n if (await this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n }\n });\n } else {\n this.log.info(\n `Not changing airplane mode, since it is already ${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`\n );\n }\n\n if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {\n this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');\n if (await this.adb.isAirplaneModeOn()) {\n return AIRPLANE_MODE_MASK | currentState;\n }\n return ~AIRPLANE_MODE_MASK & currentState;\n }\n\n await this.wrapBootstrapDisconnect(async () => {\n if (shouldEnableWifi !== isWiFiEnabled) {\n await this.setWifiState(shouldEnableWifi);\n } else {\n this.log.info(`Not changing Wi-Fi state, since it is already ` +\n `${shouldEnableWifi ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableAirplaneMode) {\n this.log.info('Not changing data connection state, because airplane mode is enabled');\n } else if (shouldEnableDataConnection === isDataEnabled) {\n this.log.info(`Not changing data connection state, since it is already ` +\n `${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);\n } else {\n await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());\n }\n });\n\n return await this.getNetworkConnection();\n};\n\n/**\n * decoupling to override behaviour in other drivers like UiAutomator2.\n */\ncommands.setWifiState = async function setWifiState (wifi) {\n await this.adb.setWifiState(wifi, this.isEmulator());\n};\n\ncommands.toggleData = async function toggleData () {\n let data = !(await this.adb.isDataOn());\n this.log.info(`Turning network data ${data ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({data}, this.isEmulator());\n });\n};\n\ncommands.toggleWiFi = async function toggleWiFi () {\n let wifi = !(await this.adb.isWifiOn());\n this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({wifi}, this.isEmulator());\n });\n};\n\ncommands.toggleFlightMode = async function toggleFlightMode () {\n /*\n * TODO: Implement isRealDevice(). This method fails on\n * real devices, it should throw a NotYetImplementedError\n */\n let flightMode = !(await this.adb.isAirplaneModeOn());\n this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(flightMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n if (await this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(flightMode);\n }\n });\n};\n\ncommands.setGeoLocation = async function setGeoLocation (location) {\n await this.adb.setGeoLocation(location, this.isEmulator());\n try {\n return await this.getGeoLocation();\n } catch (e) {\n this.log.warn(`Could not get the current geolocation info: ${e.message}`);\n this.log.warn(`Returning the default zero'ed values`);\n return {\n latitude: GEO_EPSILON,\n longitude: GEO_EPSILON,\n altitude: GEO_EPSILON,\n };\n }\n};\n\n/**\n * @typedef {Object} GpsCacheRefreshOptions\n * @property {number} timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n */\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param {GpsCacheRefreshOptions} opts\n */\ncommands.mobileRefreshGpsCache = async function mobileRefreshGpsCache (opts = {}) {\n const { timeoutMs } = opts;\n await this.adb.refreshGeoLocationCache(timeoutMs);\n};\n\ncommands.getGeoLocation = async function getGeoLocation () {\n const {latitude, longitude, altitude} = await this.adb.getGeoLocation();\n return {\n latitude: parseFloat(latitude) || GEO_EPSILON,\n longitude: parseFloat(longitude) || GEO_EPSILON,\n altitude: parseFloat(altitude) || GEO_EPSILON,\n };\n};\n\n/**\n * Checks if GPS is enabled\n *\n * @returns {Promise<Boolean>} True if yes\n */\ncommands.isLocationServicesEnabled = async function iLocationServicesEnabled () {\n return (await this.adb.getLocationProviders()).includes('gps');\n};\n\n/**\n * Toggles GPS state\n */\ncommands.toggleLocationServices = async function toggleLocationServices () {\n this.log.info('Toggling location services');\n const isGpsEnabled = await this.isLocationServicesEnabled();\n this.log.debug(\n `Current GPS state: ${isGpsEnabled}. ` +\n `The service is going to be ${isGpsEnabled ? 'disabled' : 'enabled'}`\n );\n await this.adb.toggleGPSLocationProvider(!isGpsEnabled);\n};\n\nhelpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect (wrapped) {\n if (!this.bootstrap) {\n return await wrapped();\n }\n\n this.bootstrap.ignoreUnexpectedShutdown = true;\n try {\n await wrapped();\n await this.adb.restart();\n await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);\n } finally {\n this.bootstrap.ignoreUnexpectedShutdown = false;\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
1
+ {"version":3,"file":"network.js","names":["_lodash","_interopRequireDefault","require","_driver","_support","_bluebird","commands","helpers","extensions","exports","AIRPLANE_MODE_MASK","WIFI_MASK","DATA_MASK","GEO_EPSILON","Number","MIN_VALUE","WIFI_KEY_NAME","DATA_KEY_NAME","AIRPLANE_MODE_KEY_NAME","SUPPORTED_SERVICE_NAMES","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","mobileSetConnectivity","opts","wifi","data","airplaneMode","_","every","isUndefined","errors","InvalidArgumentError","JSON","stringify","currentState","mobileGetConnectivity","services","setters","Boolean","push","setWifiState","isEmulator","setDataState","setAirplaneMode","getApiLevel","broadcastAirplaneMode","isEmpty","B","all","isArray","unsupportedServices","difference","util","pluralize","length","statePromises","resolve","includes","undefined","values","fromPairs","map","k","value","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","toggleData","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","timeoutMs","refreshGeoLocationCache","parseFloat","isLocationServicesEnabled","iLocationServicesEnabled","getLocationProviders","toggleLocationServices","isGpsEnabled","debug","toggleGPSLocationProvider","wrapped","bootstrap","ignoreUnexpectedShutdown","restart","start","appPackage","disableAndroidWatchers","acceptSslCerts","Object","assign","_default","default"],"sources":["../../../lib/commands/network.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport { util } from 'appium/support';\nimport B from 'bluebird';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst AIRPLANE_MODE_MASK = 0b001;\nconst WIFI_MASK = 0b010;\nconst DATA_MASK = 0b100;\n// The value close to zero, but not zero, is needed\n// to trick JSON generation and send a float value instead of an integer,\n// This allows strictly-typed clients, like Java, to properly\n// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.\n// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)\nconst GEO_EPSILON = Number.MIN_VALUE;\nconst WIFI_KEY_NAME = 'wifi';\nconst DATA_KEY_NAME = 'data';\nconst AIRPLANE_MODE_KEY_NAME = 'airplaneMode';\nconst SUPPORTED_SERVICE_NAMES = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME];\n\ncommands.getNetworkConnection = async function getNetworkConnection () {\n this.log.info('Getting network connection');\n let airplaneModeOn = await this.adb.isAirplaneModeOn();\n let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;\n\n // no need to check anything else if we are in airplane mode\n if (!airplaneModeOn) {\n let wifiOn = await this.isWifiOn();\n connection |= (wifiOn ? WIFI_MASK : 0);\n let dataOn = await this.adb.isDataOn();\n connection |= (dataOn ? DATA_MASK : 0);\n }\n\n return connection;\n};\n\n/**\n * decoupling to override the behaviour in other drivers like UiAutomator2.\n */\ncommands.isWifiOn = async function isWifiOn () {\n return await this.adb.isWifiOn();\n};\n\n/**\n * @typedef {Object} SetConnectivityOptions\n * @property {boolean?} wifi Either to enable or disable Wi-Fi.\n * An unset value means to not change the state for the given service.\n * @property {boolean?} data Either to enable or disable mobile data connection.\n * An unset value means to not change the state for the given service.\n * @property {boolean?} airplaneMode Either to enable to disable the Airplane Mode\n * An unset value means to not change the state for the given service.\n */\n\n/**\n * Set the connectivity state for different services\n *\n * @param {SetConnectivityOptions} opts\n * @throws {Error} If none of known properties were provided or there was an error\n * while changing connectivity states\n */\ncommands.mobileSetConnectivity = async function mobileSetConnectivity (opts = {}) {\n const {\n wifi,\n data,\n airplaneMode,\n } = opts;\n\n if (_.every([wifi, data, airplaneMode], _.isUndefined)) {\n throw new errors.InvalidArgumentError(\n `Either one of ${JSON.stringify(SUPPORTED_SERVICE_NAMES)} options must be provided`\n );\n }\n\n const currentState = await this.mobileGetConnectivity({\n services: [\n ...(_.isUndefined(wifi) ? [] : [WIFI_KEY_NAME]),\n ...(_.isUndefined(data) ? [] : [DATA_KEY_NAME]),\n ...(_.isUndefined(airplaneMode) ? [] : [AIRPLANE_MODE_KEY_NAME]),\n ]\n });\n const setters = [];\n if (!_.isUndefined(wifi) && currentState.wifi !== Boolean(wifi)) {\n setters.push(this.adb.setWifiState(wifi, this.isEmulator()));\n }\n if (!_.isUndefined(data) && currentState.data !== Boolean(data)) {\n setters.push(this.adb.setDataState(data, this.isEmulator()));\n }\n if (!_.isUndefined(airplaneMode) && currentState.airplaneMode !== Boolean(airplaneMode)) {\n setters.push(async () => {\n await this.adb.setAirplaneMode(airplaneMode);\n if (this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(airplaneMode);\n }\n });\n }\n if (!_.isEmpty(setters)) {\n await B.all(setters);\n }\n};\n\n/**\n * @typedef {Object} GetConnectivityResult\n * @property {boolean} wifi True if wifi is enabled\n * @property {boolean} data True if mobile data connection is enabled\n * @property {boolean} airplaneMode True if Airplane Mode is enabled\n */\n\n/**\n * @typedef {Object} GetConnectivityOptions\n * @property {string[]|string?} services one or more services to get the connectivity for.\n * Supported service names are: wifi, data, airplaneMode.\n */\n\n/**\n * Retrieves the connectivity properties from the device under test\n *\n * @param {GetConnectivityOptions?} opts If no service names are provided then the\n * connectivity state is returned for all of them.\n * @returns {GetConnectivityResult}\n */\ncommands.mobileGetConnectivity = async function mobileGetConnectivity (opts = {}) {\n let {\n services = SUPPORTED_SERVICE_NAMES,\n } = opts;\n if (!_.isArray(services)) {\n services = [services];\n }\n const unsupportedServices = _.difference(services, SUPPORTED_SERVICE_NAMES);\n if (!_.isEmpty(unsupportedServices)) {\n throw new errors.InvalidArgumentError(\n `${util.pluralize('Service name', unsupportedServices.length, false)} ${unsupportedServices} ` +\n `${unsupportedServices.length === 1 ? 'is' : 'are'} not known. Only the following services are ` +\n `suported: ${SUPPORTED_SERVICE_NAMES}`\n );\n }\n\n const statePromises = {\n wifi: B.resolve(services.includes(WIFI_KEY_NAME) ? this.adb.isWifiOn() : undefined),\n data: B.resolve(services.includes(DATA_KEY_NAME) ? this.adb.isDataOn() : undefined),\n airplaneMode: B.resolve(\n services.includes(AIRPLANE_MODE_KEY_NAME) ? this.adb.isAirplaneModeOn() : undefined\n ),\n };\n await B.all(_.values(statePromises));\n return _.fromPairs(services.map((k) => [k, statePromises[k].value()]));\n};\n\ncommands.setNetworkConnection = async function setNetworkConnection (type) {\n this.log.info('Setting network connection');\n // decode the input\n const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;\n const shouldEnableWifi = (type & WIFI_MASK) !== 0;\n const shouldEnableDataConnection = (type & DATA_MASK) !== 0;\n\n const currentState = await this.getNetworkConnection();\n const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;\n const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;\n const isDataEnabled = (currentState & DATA_MASK) !== 0;\n\n if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(shouldEnableAirplaneMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n if (await this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n }\n });\n } else {\n this.log.info(\n `Not changing airplane mode, since it is already ${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`\n );\n }\n\n if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {\n this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');\n if (await this.adb.isAirplaneModeOn()) {\n return AIRPLANE_MODE_MASK | currentState;\n }\n return ~AIRPLANE_MODE_MASK & currentState;\n }\n\n await this.wrapBootstrapDisconnect(async () => {\n if (shouldEnableWifi !== isWiFiEnabled) {\n await this.setWifiState(shouldEnableWifi);\n } else {\n this.log.info(`Not changing Wi-Fi state, since it is already ` +\n `${shouldEnableWifi ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableAirplaneMode) {\n this.log.info('Not changing data connection state, because airplane mode is enabled');\n } else if (shouldEnableDataConnection === isDataEnabled) {\n this.log.info(`Not changing data connection state, since it is already ` +\n `${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);\n } else {\n await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());\n }\n });\n\n return await this.getNetworkConnection();\n};\n\n/**\n * decoupling to override behaviour in other drivers like UiAutomator2.\n */\ncommands.setWifiState = async function setWifiState (wifi) {\n await this.adb.setWifiState(wifi, this.isEmulator());\n};\n\ncommands.toggleData = async function toggleData () {\n let data = !(await this.adb.isDataOn());\n this.log.info(`Turning network data ${data ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({data}, this.isEmulator());\n });\n};\n\ncommands.toggleWiFi = async function toggleWiFi () {\n let wifi = !(await this.adb.isWifiOn());\n this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({wifi}, this.isEmulator());\n });\n};\n\ncommands.toggleFlightMode = async function toggleFlightMode () {\n /*\n * TODO: Implement isRealDevice(). This method fails on\n * real devices, it should throw a NotYetImplementedError\n */\n let flightMode = !(await this.adb.isAirplaneModeOn());\n this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(flightMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n if (await this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(flightMode);\n }\n });\n};\n\ncommands.setGeoLocation = async function setGeoLocation (location) {\n await this.adb.setGeoLocation(location, this.isEmulator());\n try {\n return await this.getGeoLocation();\n } catch (e) {\n this.log.warn(`Could not get the current geolocation info: ${e.message}`);\n this.log.warn(`Returning the default zero'ed values`);\n return {\n latitude: GEO_EPSILON,\n longitude: GEO_EPSILON,\n altitude: GEO_EPSILON,\n };\n }\n};\n\n/**\n * @typedef {Object} GpsCacheRefreshOptions\n * @property {number} timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n */\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param {GpsCacheRefreshOptions} opts\n */\ncommands.mobileRefreshGpsCache = async function mobileRefreshGpsCache (opts = {}) {\n const { timeoutMs } = opts;\n await this.adb.refreshGeoLocationCache(timeoutMs);\n};\n\ncommands.getGeoLocation = async function getGeoLocation () {\n const {latitude, longitude, altitude} = await this.adb.getGeoLocation();\n return {\n latitude: parseFloat(latitude) || GEO_EPSILON,\n longitude: parseFloat(longitude) || GEO_EPSILON,\n altitude: parseFloat(altitude) || GEO_EPSILON,\n };\n};\n\n/**\n * Checks if GPS is enabled\n *\n * @returns {Promise<Boolean>} True if yes\n */\ncommands.isLocationServicesEnabled = async function iLocationServicesEnabled () {\n return (await this.adb.getLocationProviders()).includes('gps');\n};\n\n/**\n * Toggles GPS state\n */\ncommands.toggleLocationServices = async function toggleLocationServices () {\n this.log.info('Toggling location services');\n const isGpsEnabled = await this.isLocationServicesEnabled();\n this.log.debug(\n `Current GPS state: ${isGpsEnabled}. ` +\n `The service is going to be ${isGpsEnabled ? 'disabled' : 'enabled'}`\n );\n await this.adb.toggleGPSLocationProvider(!isGpsEnabled);\n};\n\nhelpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect (wrapped) {\n if (!this.bootstrap) {\n return await wrapped();\n }\n\n this.bootstrap.ignoreUnexpectedShutdown = true;\n try {\n await wrapped();\n await this.adb.restart();\n await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);\n } finally {\n this.bootstrap.ignoreUnexpectedShutdown = false;\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import _ from 'lodash';
2
2
  import { errors } from 'appium/driver';
3
+ import { util } from 'appium/support';
3
4
  import B from 'bluebird';
4
5
 
5
6
  let commands = {}, helpers = {}, extensions = {};
@@ -16,6 +17,7 @@ const GEO_EPSILON = Number.MIN_VALUE;
16
17
  const WIFI_KEY_NAME = 'wifi';
17
18
  const DATA_KEY_NAME = 'data';
18
19
  const AIRPLANE_MODE_KEY_NAME = 'airplaneMode';
20
+ const SUPPORTED_SERVICE_NAMES = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME];
19
21
 
20
22
  commands.getNetworkConnection = async function getNetworkConnection () {
21
23
  this.log.info('Getting network connection');
@@ -66,7 +68,7 @@ commands.mobileSetConnectivity = async function mobileSetConnectivity (opts = {}
66
68
 
67
69
  if (_.every([wifi, data, airplaneMode], _.isUndefined)) {
68
70
  throw new errors.InvalidArgumentError(
69
- `Either one of ['${WIFI_KEY_NAME}', '${DATA_KEY_NAME}', '${AIRPLANE_MODE_KEY_NAME}'] options must be provided`
71
+ `Either one of ${JSON.stringify(SUPPORTED_SERVICE_NAMES)} options must be provided`
70
72
  );
71
73
  }
72
74
 
@@ -119,17 +121,25 @@ commands.mobileSetConnectivity = async function mobileSetConnectivity (opts = {}
119
121
  */
120
122
  commands.mobileGetConnectivity = async function mobileGetConnectivity (opts = {}) {
121
123
  let {
122
- services = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME],
124
+ services = SUPPORTED_SERVICE_NAMES,
123
125
  } = opts;
124
126
  if (!_.isArray(services)) {
125
127
  services = [services];
126
128
  }
129
+ const unsupportedServices = _.difference(services, SUPPORTED_SERVICE_NAMES);
130
+ if (!_.isEmpty(unsupportedServices)) {
131
+ throw new errors.InvalidArgumentError(
132
+ `${util.pluralize('Service name', unsupportedServices.length, false)} ${unsupportedServices} ` +
133
+ `${unsupportedServices.length === 1 ? 'is' : 'are'} not known. Only the following services are ` +
134
+ `suported: ${SUPPORTED_SERVICE_NAMES}`
135
+ );
136
+ }
127
137
 
128
138
  const statePromises = {
129
- wifi: B.resolve(services.includes(WIFI_KEY_NAME) ? undefined : this.adb.isWifiOn()),
130
- data: B.resolve(services.includes(DATA_KEY_NAME) ? undefined : this.adb.isDataOn()),
139
+ wifi: B.resolve(services.includes(WIFI_KEY_NAME) ? this.adb.isWifiOn() : undefined),
140
+ data: B.resolve(services.includes(DATA_KEY_NAME) ? this.adb.isDataOn() : undefined),
131
141
  airplaneMode: B.resolve(
132
- services.includes(AIRPLANE_MODE_KEY_NAME) ? undefined : this.adb.isAirplaneModeOn()
142
+ services.includes(AIRPLANE_MODE_KEY_NAME) ? this.adb.isAirplaneModeOn() : undefined
133
143
  ),
134
144
  };
135
145
  await B.all(_.values(statePromises));
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "mobile",
10
10
  "mobile testing"
11
11
  ],
12
- "version": "5.12.0",
12
+ "version": "5.12.2",
13
13
  "author": "Appium Contributors",
14
14
  "license": "Apache-2.0",
15
15
  "repository": {
@@ -86,7 +86,7 @@
86
86
  "appium": "^2.0.0-beta.40"
87
87
  },
88
88
  "devDependencies": {
89
- "@appium/support": "^3.0.0",
89
+ "@appium/support": "^4.0.0",
90
90
  "@appium/eslint-config-appium": "^6.0.0",
91
91
  "@appium/test-support": "^3.0.0",
92
92
  "@babel/cli": "^7.18.10",