appium-android-driver 5.10.4 → 5.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/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [5.11.0](https://github.com/appium/appium-android-driver/compare/v5.10.4...v5.11.0) (2023-04-28)
2
+
3
+
4
+ ### Features
5
+
6
+ * Add mobile wrapper for emulator helper functions ([#805](https://github.com/appium/appium-android-driver/issues/805)) ([59197f9](https://github.com/appium/appium-android-driver/commit/59197f93e3b46e756a379159e97735f103613a8f))
7
+
1
8
  ## [5.10.4](https://github.com/appium/appium-android-driver/compare/v5.10.3...v5.10.4) (2023-04-20)
2
9
 
3
10
 
@@ -12,6 +12,7 @@ var _path = _interopRequireDefault(require("path"));
12
12
  var _bluebird = _interopRequireDefault(require("bluebird"));
13
13
  var _jimp = _interopRequireDefault(require("jimp"));
14
14
  var _teen_process = require("teen_process");
15
+ var _utils = require("../utils");
15
16
  const swipeStepsPerSec = 28;
16
17
  const dragStepsPerSec = 40;
17
18
  let commands = {},
@@ -165,48 +166,98 @@ commands.fingerprint = async function fingerprint(fingerprintId) {
165
166
  }
166
167
  await this.adb.fingerprint(fingerprintId);
167
168
  };
169
+ commands.mobileFingerprint = async function mobileFingerprint(opts = {}) {
170
+ const {
171
+ fingerprintId
172
+ } = (0, _utils.requireArgs)('fingerprintId', opts);
173
+ await this.fingerprint(fingerprintId);
174
+ };
168
175
  commands.sendSMS = async function sendSMS(phoneNumber, message) {
169
176
  if (!this.isEmulator()) {
170
177
  this.log.errorAndThrow('sendSMS method is only available for emulators');
171
178
  }
172
179
  await this.adb.sendSMS(phoneNumber, message);
173
180
  };
181
+ commands.mobileSendSms = async function mobileSendSms(opts = {}) {
182
+ const {
183
+ phoneNumber,
184
+ message
185
+ } = (0, _utils.requireArgs)(['phoneNumber', 'message'], opts);
186
+ await this.sendSMS(phoneNumber, message);
187
+ };
174
188
  commands.gsmCall = async function gsmCall(phoneNumber, action) {
175
189
  if (!this.isEmulator()) {
176
190
  this.log.errorAndThrow('gsmCall method is only available for emulators');
177
191
  }
178
192
  await this.adb.gsmCall(phoneNumber, action);
179
193
  };
194
+ commands.mobileGsmCall = async function mobileGsmCall(opts = {}) {
195
+ const {
196
+ phoneNumber,
197
+ action
198
+ } = (0, _utils.requireArgs)(['phoneNumber', 'action'], opts);
199
+ await this.gsmCall(phoneNumber, action);
200
+ };
180
201
  commands.gsmSignal = async function gsmSignal(signalStrengh) {
181
202
  if (!this.isEmulator()) {
182
203
  this.log.errorAndThrow('gsmSignal method is only available for emulators');
183
204
  }
184
205
  await this.adb.gsmSignal(signalStrengh);
185
206
  };
207
+ commands.mobileGsmSignal = async function mobileGsmSignal(opts = {}) {
208
+ const {
209
+ strength
210
+ } = (0, _utils.requireArgs)('strength', opts);
211
+ await this.gsmSignal(strength);
212
+ };
186
213
  commands.gsmVoice = async function gsmVoice(state) {
187
214
  if (!this.isEmulator()) {
188
215
  this.log.errorAndThrow('gsmVoice method is only available for emulators');
189
216
  }
190
217
  await this.adb.gsmVoice(state);
191
218
  };
219
+ commands.mobileGsmVoice = async function mobileGsmVoice(opts = {}) {
220
+ const {
221
+ state
222
+ } = (0, _utils.requireArgs)('state', opts);
223
+ await this.gsmVoice(state);
224
+ };
192
225
  commands.powerAC = async function powerAC(state) {
193
226
  if (!this.isEmulator()) {
194
227
  this.log.errorAndThrow('powerAC method is only available for emulators');
195
228
  }
196
229
  await this.adb.powerAC(state);
197
230
  };
231
+ commands.mobilePowerAc = async function mobilePowerAc(opts = {}) {
232
+ const {
233
+ state
234
+ } = (0, _utils.requireArgs)('state', opts);
235
+ await this.powerAC(state);
236
+ };
198
237
  commands.powerCapacity = async function powerCapacity(batteryPercent) {
199
238
  if (!this.isEmulator()) {
200
239
  this.log.errorAndThrow('powerCapacity method is only available for emulators');
201
240
  }
202
241
  await this.adb.powerCapacity(batteryPercent);
203
242
  };
243
+ commands.mobilePowerCapacity = async function mobilePowerCapacity(opts = {}) {
244
+ const {
245
+ percent
246
+ } = (0, _utils.requireArgs)('percent', opts);
247
+ await this.powerCapacity(percent);
248
+ };
204
249
  commands.networkSpeed = async function networkSpeed(networkSpeed) {
205
250
  if (!this.isEmulator()) {
206
251
  this.log.errorAndThrow('networkSpeed method is only available for emulators');
207
252
  }
208
253
  await this.adb.networkSpeed(networkSpeed);
209
254
  };
255
+ commands.mobileNetworkSpeed = async function mobileNetworkSpeed(opts = {}) {
256
+ const {
257
+ speed
258
+ } = (0, _utils.requireArgs)('speed', opts);
259
+ await this.networkSpeed(speed);
260
+ };
210
261
  commands.sensorSet = async function sensorSet(sensor = {}) {
211
262
  const {
212
263
  sensorType,
@@ -299,4 +350,4 @@ commands.getScreenshot = async function getScreenshot() {
299
350
  Object.assign(extensions, commands, helpers);
300
351
  var _default = extensions;
301
352
  exports.default = _default;
302
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYW5kcm9pZEhlbHBlcnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zdXBwb3J0IiwiX3BhdGgiLCJfYmx1ZWJpcmQiLCJfamltcCIsIl90ZWVuX3Byb2Nlc3MiLCJzd2lwZVN0ZXBzUGVyU2VjIiwiZHJhZ1N0ZXBzUGVyU2VjIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJ3YXJuIiwicHJlc3NLZXlDb2RlIiwiYm9vdHN0cmFwIiwic2VuZEFjdGlvbiIsImxvbmdQcmVzc0tleUNvZGUiLCJnZXRPcmllbnRhdGlvbiIsInBhcmFtcyIsIm5hdHVyYWxPcmllbnRhdGlvbiIsIm9wdHMiLCJhbmRyb2lkTmF0dXJhbE9yaWVudGF0aW9uIiwib3JpZW50YXRpb24iLCJ0b1VwcGVyQ2FzZSIsInNldE9yaWVudGF0aW9uIiwiZmFrZUZsaWNrIiwieFNwZWVkIiwieVNwZWVkIiwiZmFrZUZsaWNrRWxlbWVudCIsImVsZW1lbnRJZCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwic3BlZWQiLCJzd2lwZSIsInN0YXJ0WCIsInN0YXJ0WSIsImVuZFgiLCJlbmRZIiwiZHVyYXRpb24iLCJ0b3VjaENvdW50IiwiZWxJZCIsInN3aXBlT3B0cyIsInN0ZXBzIiwiTWF0aCIsInJvdW5kIiwidXRpbCIsImhhc1ZhbHVlIiwiZG9Td2lwZSIsInBpbmNoQ2xvc2UiLCJwZXJjZW50IiwicGluY2hPcHRzIiwiZGlyZWN0aW9uIiwicGluY2hPcGVuIiwiZmxpY2siLCJlbGVtZW50IiwieE9mZnNldCIsInlPZmZzZXQiLCJkcmFnIiwiZGVzdEVsSWQiLCJkcmFnT3B0cyIsImRvRHJhZyIsImxvY2siLCJzZWNvbmRzIiwiYWRiIiwiaXNOYU4iLCJmbG9hdFNlY29uZHMiLCJwYXJzZUZsb2F0IiwiQiIsImRlbGF5IiwidW5sb2NrIiwiaXNMb2NrZWQiLCJpc1NjcmVlbkxvY2tlZCIsImFuZHJvaWRIZWxwZXJzIiwiY2FwcyIsIm9wZW5Ob3RpZmljYXRpb25zIiwic2V0TG9jYXRpb24iLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsInNlbmRUZWxuZXRDb21tYW5kIiwiZmluZ2VycHJpbnQiLCJmaW5nZXJwcmludElkIiwiaXNFbXVsYXRvciIsImVycm9yQW5kVGhyb3ciLCJzZW5kU01TIiwicGhvbmVOdW1iZXIiLCJtZXNzYWdlIiwiZ3NtQ2FsbCIsImFjdGlvbiIsImdzbVNpZ25hbCIsInNpZ25hbFN0cmVuZ2giLCJnc21Wb2ljZSIsInN0YXRlIiwicG93ZXJBQyIsInBvd2VyQ2FwYWNpdHkiLCJiYXR0ZXJ5UGVyY2VudCIsIm5ldHdvcmtTcGVlZCIsInNlbnNvclNldCIsInNlbnNvciIsInNlbnNvclR5cGUiLCJ2YWx1ZSIsImdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsIiwibG9jYWxGaWxlIiwidGVtcERpciIsInBhdGgiLCJwcmVmaXgiLCJzdWZmaXgiLCJmcyIsImV4aXN0cyIsInVubGluayIsInBuZ0RpciIsImFuZHJvaWRTY3JlZW5zaG90UGF0aCIsInBuZyIsInBvc2l4IiwicmVzb2x2ZSIsImNtZCIsInNoZWxsIiwiZmlsZVNpemUiLCJFcnJvciIsInB1bGwiLCJqaW1wIiwicmVhZCIsImdldFNjcmVlbnNob3REYXRhV2l0aEFkYkV4ZWNPdXQiLCJzdGRvdXQiLCJzdGRlcnIiLCJjb2RlIiwiZXhlYyIsImV4ZWN1dGFibGUiLCJkZWZhdWx0QXJncyIsImNvbmNhdCIsImVuY29kaW5nIiwiaXNCdWZmZXIiLCJsZW5ndGgiLCJ0b1N0cmluZyIsImdldFNjcmVlbnNob3QiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiaW1hZ2UiLCJlIiwiaW5mbyIsImVyciIsInNjcmVlbk9yaWVudGF0aW9uIiwiZ2V0U2NyZWVuT3JpZW50YXRpb24iLCJyb3RhdGUiLCJnZXRCdWZmZXIiLCJwcm9taXNpZnkiLCJjb250ZXh0IiwiaW1nQnVmZmVyIiwiTUlNRV9QTkciLCJPYmplY3QiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYW5kcm9pZEhlbHBlcnMgZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IGZzLCB1dGlsLCB0ZW1wRGlyfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgamltcCBmcm9tICdqaW1wJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuXG5jb25zdCBzd2lwZVN0ZXBzUGVyU2VjID0gMjg7XG5jb25zdCBkcmFnU3RlcHNQZXJTZWMgPSA0MDtcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb21tYW5kcy5rZXlldmVudCA9IGFzeW5jIGZ1bmN0aW9uIGtleWV2ZW50IChrZXljb2RlLCBtZXRhc3RhdGUgPSBudWxsKSB7XG4gIC8vIFRPRE8gZGVwcmVjYXRlIGtleWV2ZW50OyBjdXJyZW50bHkgd2Qgb25seSBpbXBsZW1lbnRzIGtleWV2ZW50XG4gIHRoaXMubG9nLndhcm4oJ2tleWV2ZW50IHdpbGwgYmUgZGVwcmVjYXRlZCB1c2UgcHJlc3NLZXlDb2RlJyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnByZXNzS2V5Q29kZShrZXljb2RlLCBtZXRhc3RhdGUpO1xufTtcblxuY29tbWFuZHMucHJlc3NLZXlDb2RlID0gYXN5bmMgZnVuY3Rpb24gcHJlc3NLZXlDb2RlIChrZXljb2RlLCBtZXRhc3RhdGUgPSBudWxsKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdwcmVzc0tleUNvZGUnLCB7a2V5Y29kZSwgbWV0YXN0YXRlfSk7XG59O1xuXG5jb21tYW5kcy5sb25nUHJlc3NLZXlDb2RlID0gYXN5bmMgZnVuY3Rpb24gbG9uZ1ByZXNzS2V5Q29kZSAoa2V5Y29kZSwgbWV0YXN0YXRlID0gbnVsbCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignbG9uZ1ByZXNzS2V5Q29kZScsIHtrZXljb2RlLCBtZXRhc3RhdGV9KTtcbn07XG5cbmNvbW1hbmRzLmdldE9yaWVudGF0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0T3JpZW50YXRpb24gKCkge1xuICBsZXQgcGFyYW1zID0ge1xuICAgIG5hdHVyYWxPcmllbnRhdGlvbjogISF0aGlzLm9wdHMuYW5kcm9pZE5hdHVyYWxPcmllbnRhdGlvbixcbiAgfTtcbiAgbGV0IG9yaWVudGF0aW9uID0gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignb3JpZW50YXRpb24nLCBwYXJhbXMpO1xuICByZXR1cm4gb3JpZW50YXRpb24udG9VcHBlckNhc2UoKTtcbn07XG5cbmNvbW1hbmRzLnNldE9yaWVudGF0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0T3JpZW50YXRpb24gKG9yaWVudGF0aW9uKSB7XG4gIG9yaWVudGF0aW9uID0gb3JpZW50YXRpb24udG9VcHBlckNhc2UoKTtcbiAgbGV0IHBhcmFtcyA9IHtcbiAgICBvcmllbnRhdGlvbixcbiAgICBuYXR1cmFsT3JpZW50YXRpb246ICEhdGhpcy5vcHRzLmFuZHJvaWROYXR1cmFsT3JpZW50YXRpb24sXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdvcmllbnRhdGlvbicsIHBhcmFtcyk7XG59O1xuXG5jb21tYW5kcy5mYWtlRmxpY2sgPSBhc3luYyBmdW5jdGlvbiBmYWtlRmxpY2sgKHhTcGVlZCwgeVNwZWVkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdmbGljaycsIHt4U3BlZWQsIHlTcGVlZH0pO1xufTtcblxuY29tbWFuZHMuZmFrZUZsaWNrRWxlbWVudCA9IGFzeW5jIGZ1bmN0aW9uIGZha2VGbGlja0VsZW1lbnQgKGVsZW1lbnRJZCwgeG9mZnNldCwgeW9mZnNldCwgc3BlZWQpIHtcbiAgbGV0IHBhcmFtcyA9IHt4b2Zmc2V0LCB5b2Zmc2V0LCBzcGVlZCwgZWxlbWVudElkfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6ZmxpY2snLCBwYXJhbXMpO1xufTtcblxuY29tbWFuZHMuc3dpcGUgPSBhc3luYyBmdW5jdGlvbiBzd2lwZSAoc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCB0b3VjaENvdW50LCBlbElkKSB7XG4gIGlmIChzdGFydFggPT09ICdudWxsJykge1xuICAgIHN0YXJ0WCA9IDAuNTtcbiAgfVxuICBpZiAoc3RhcnRZID09PSAnbnVsbCcpIHtcbiAgICBzdGFydFkgPSAwLjU7XG4gIH1cbiAgbGV0IHN3aXBlT3B0cyA9IHtzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSxcbiAgICAgICAgICAgICAgICAgICBzdGVwczogTWF0aC5yb3VuZChkdXJhdGlvbiAqIHN3aXBlU3RlcHNQZXJTZWMpfTtcbiAgLy8gZ29pbmcgdGhlIGxvbmcgd2F5IGFuZCBjaGVja2luZyBmb3IgdW5kZWZpbmVkIGFuZCBudWxsIHNpbmNlXG4gIC8vIHdlIGNhbid0IGJlIGFzc3VyZWQgYGVsSWRgIGlzIGEgc3RyaW5nIGFuZCBub3QgYW4gaW50XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGVsSWQpKSB7XG4gICAgc3dpcGVPcHRzLmVsZW1lbnRJZCA9IGVsSWQ7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZG9Td2lwZShzd2lwZU9wdHMpO1xufTtcblxuY29tbWFuZHMuZG9Td2lwZSA9IGFzeW5jIGZ1bmN0aW9uIGRvU3dpcGUgKHN3aXBlT3B0cykge1xuICBpZiAodXRpbC5oYXNWYWx1ZShzd2lwZU9wdHMuZWxlbWVudElkKSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnN3aXBlJywgc3dpcGVPcHRzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc3dpcGUnLCBzd2lwZU9wdHMpO1xuICB9XG59O1xuXG5jb21tYW5kcy5waW5jaENsb3NlID0gYXN5bmMgZnVuY3Rpb24gcGluY2hDbG9zZSAoc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCBwZXJjZW50LCBzdGVwcywgZWxJZCkge1xuICBsZXQgcGluY2hPcHRzID0ge1xuICAgIGRpcmVjdGlvbjogJ2luJyxcbiAgICBlbGVtZW50SWQ6IGVsSWQsXG4gICAgcGVyY2VudCxcbiAgICBzdGVwc1xuICB9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpwaW5jaCcsIHBpbmNoT3B0cyk7XG59O1xuXG5jb21tYW5kcy5waW5jaE9wZW4gPSBhc3luYyBmdW5jdGlvbiBwaW5jaE9wZW4gKHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBkdXJhdGlvbiwgcGVyY2VudCwgc3RlcHMsIGVsSWQpIHtcbiAgbGV0IHBpbmNoT3B0cyA9IHtkaXJlY3Rpb246ICdvdXQnLCBlbGVtZW50SWQ6IGVsSWQsIHBlcmNlbnQsIHN0ZXBzfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6cGluY2gnLCBwaW5jaE9wdHMpO1xufTtcblxuY29tbWFuZHMuZmxpY2sgPSBhc3luYyBmdW5jdGlvbiBmbGljayAoZWxlbWVudCwgeFNwZWVkLCB5U3BlZWQsIHhPZmZzZXQsIHlPZmZzZXQsIHNwZWVkKSB7XG4gIGlmIChlbGVtZW50KSB7XG4gICAgYXdhaXQgdGhpcy5mYWtlRmxpY2tFbGVtZW50KGVsZW1lbnQsIHhPZmZzZXQsIHlPZmZzZXQsIHNwZWVkKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCB0aGlzLmZha2VGbGljayh4U3BlZWQsIHlTcGVlZCk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmRyYWcgPSBhc3luYyBmdW5jdGlvbiBkcmFnIChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIHRvdWNoQ291bnQsIGVsZW1lbnRJZCwgZGVzdEVsSWQpIHtcbiAgbGV0IGRyYWdPcHRzID0ge1xuICAgIGVsZW1lbnRJZCwgZGVzdEVsSWQsIHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLFxuICAgIHN0ZXBzOiBNYXRoLnJvdW5kKGR1cmF0aW9uICogZHJhZ1N0ZXBzUGVyU2VjKVxuICB9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5kb0RyYWcoZHJhZ09wdHMpO1xuXG59O1xuXG5jb21tYW5kcy5kb0RyYWcgPSBhc3luYyBmdW5jdGlvbiBkb0RyYWcgKGRyYWdPcHRzKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGRyYWdPcHRzLmVsZW1lbnRJZCkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpkcmFnJywgZHJhZ09wdHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdkcmFnJywgZHJhZ09wdHMpO1xuICB9XG59O1xuXG5jb21tYW5kcy5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbG9jayAoc2Vjb25kcykge1xuICBhd2FpdCB0aGlzLmFkYi5sb2NrKCk7XG4gIGlmIChpc05hTihzZWNvbmRzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZsb2F0U2Vjb25kcyA9IHBhcnNlRmxvYXQoc2Vjb25kcyk7XG4gIGlmIChmbG9hdFNlY29uZHMgPD0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBCLmRlbGF5KDEwMDAgKiBmbG9hdFNlY29uZHMpO1xuICBhd2FpdCB0aGlzLnVubG9jaygpO1xufTtcblxuY29tbWFuZHMuaXNMb2NrZWQgPSBhc3luYyBmdW5jdGlvbiBpc0xvY2tlZCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5pc1NjcmVlbkxvY2tlZCgpO1xufTtcblxuY29tbWFuZHMudW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gdW5sb2NrICgpIHtcbiAgcmV0dXJuIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwgdGhpcy5jYXBzKTtcbn07XG5cbmNvbW1hbmRzLm9wZW5Ob3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gb3Blbk5vdGlmaWNhdGlvbnMgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignb3Blbk5vdGlmaWNhdGlvbicpO1xufTtcblxuY29tbWFuZHMuc2V0TG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBzZXRMb2NhdGlvbiAobGF0aXR1ZGUsIGxvbmdpdHVkZSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc2VuZFRlbG5ldENvbW1hbmQoYGdlbyBmaXggJHtsb25naXR1ZGV9ICR7bGF0aXR1ZGV9YCk7XG59O1xuXG5jb21tYW5kcy5maW5nZXJwcmludCA9IGFzeW5jIGZ1bmN0aW9uIGZpbmdlcnByaW50IChmaW5nZXJwcmludElkKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdmaW5nZXJwcmludCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmZpbmdlcnByaW50KGZpbmdlcnByaW50SWQpO1xufTtcblxuY29tbWFuZHMuc2VuZFNNUyA9IGFzeW5jIGZ1bmN0aW9uIHNlbmRTTVMgKHBob25lTnVtYmVyLCBtZXNzYWdlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdzZW5kU01TIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuc2VuZFNNUyhwaG9uZU51bWJlciwgbWVzc2FnZSk7XG59O1xuXG5jb21tYW5kcy5nc21DYWxsID0gYXN5bmMgZnVuY3Rpb24gZ3NtQ2FsbCAocGhvbmVOdW1iZXIsIGFjdGlvbikge1xuICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnZ3NtQ2FsbCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbUNhbGwocGhvbmVOdW1iZXIsIGFjdGlvbik7XG59O1xuXG5jb21tYW5kcy5nc21TaWduYWwgPSBhc3luYyBmdW5jdGlvbiBnc21TaWduYWwgKHNpZ25hbFN0cmVuZ2gpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2dzbVNpZ25hbCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVNpZ25hbChzaWduYWxTdHJlbmdoKTtcbn07XG5cbmNvbW1hbmRzLmdzbVZvaWNlID0gYXN5bmMgZnVuY3Rpb24gZ3NtVm9pY2UgKHN0YXRlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdnc21Wb2ljZSBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVZvaWNlKHN0YXRlKTtcbn07XG5cbmNvbW1hbmRzLnBvd2VyQUMgPSBhc3luYyBmdW5jdGlvbiBwb3dlckFDIChzdGF0ZSkge1xuICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygncG93ZXJBQyBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLnBvd2VyQUMoc3RhdGUpO1xufTtcblxuY29tbWFuZHMucG93ZXJDYXBhY2l0eSA9IGFzeW5jIGZ1bmN0aW9uIHBvd2VyQ2FwYWNpdHkgKGJhdHRlcnlQZXJjZW50KSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdwb3dlckNhcGFjaXR5IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIucG93ZXJDYXBhY2l0eShiYXR0ZXJ5UGVyY2VudCk7XG59O1xuXG5jb21tYW5kcy5uZXR3b3JrU3BlZWQgPSBhc3luYyBmdW5jdGlvbiBuZXR3b3JrU3BlZWQgKG5ldHdvcmtTcGVlZCkge1xuICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnbmV0d29ya1NwZWVkIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIubmV0d29ya1NwZWVkKG5ldHdvcmtTcGVlZCk7XG59O1xuXG4vKipcbiAqIEVtdWxhdGUgc2Vuc29ycyB2YWx1ZXMgb24gdGhlIGNvbm5lY3RlZCBlbXVsYXRvci5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTZW5zb3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZW5zb3JUeXBlIC0gc2Vuc29yIHR5cGUgZGVjbGFyZWQgaW4gYWRiLlNFTlNPUlNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2YWx1ZSAtIHZhbHVlIHRvIHNldCB0byB0aGUgc2Vuc29yXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFNlbnNvclxuICogQHRocm93cyB7RXJyb3J9IC0gSWYgc2Vuc29yVHlwZSBpcyBub3QgZGVmaW5lZFxuICogQHRocm93cyB7RXJyb3J9IC0gSWYgdmFsdWUgZm9yIHRoZSBzZSBzb3IgaXMgbm90IGRlZmluZWRcbiAqIEB0aHJvd3Mge0Vycm9yfSAtIElmIGRldmljZVR5cGUgaXMgbm90IGFuIGVtdWxhdG9yXG4gKi9cbmNvbW1hbmRzLnNlbnNvclNldCA9IGFzeW5jIGZ1bmN0aW9uIHNlbnNvclNldCAoc2Vuc29yID0ge30pIHtcbiAgY29uc3Qge3NlbnNvclR5cGUsIHZhbHVlfSA9IHNlbnNvcjtcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKHNlbnNvclR5cGUpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgJ3NlbnNvclR5cGUnIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKHZhbHVlKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYCd2YWx1ZScgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnc2Vuc29yU2V0IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuc2Vuc29yU2V0KHNlbnNvclR5cGUsIHZhbHVlKTtcbn07XG5cbmhlbHBlcnMuZ2V0U2NyZWVuc2hvdERhdGFXaXRoQWRiU2hlbGwgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJTaGVsbCAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IGxvY2FsRmlsZSA9IGF3YWl0IHRlbXBEaXIucGF0aCh7cHJlZml4OiAnYXBwaXVtJywgc3VmZml4OiAnLnBuZyd9KTtcbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhsb2NhbEZpbGUpKSB7XG4gICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBwbmdEaXIgPSBvcHRzLmFuZHJvaWRTY3JlZW5zaG90UGF0aCB8fCAnL2RhdGEvbG9jYWwvdG1wLyc7XG4gICAgY29uc3QgcG5nID0gcGF0aC5wb3NpeC5yZXNvbHZlKHBuZ0RpciwgJ3NjcmVlbnNob3QucG5nJyk7XG4gICAgY29uc3QgY21kID0gWycvc3lzdGVtL2Jpbi9ybScsIGAke3BuZ307YCwgJy9zeXN0ZW0vYmluL3NjcmVlbmNhcCcsICctcCcsIHBuZ107XG4gICAgYXdhaXQgYWRiLnNoZWxsKGNtZCk7XG4gICAgaWYgKCFhd2FpdCBhZGIuZmlsZVNpemUocG5nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc2l6ZSBvZiB0aGUgdGFrZW4gc2NyZWVuc2hvdCBlcXVhbHMgdG8gemVyby4nKTtcbiAgICB9XG4gICAgYXdhaXQgYWRiLnB1bGwocG5nLCBsb2NhbEZpbGUpO1xuICAgIHJldHVybiBhd2FpdCBqaW1wLnJlYWQobG9jYWxGaWxlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsRmlsZSkpIHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhsb2NhbEZpbGUpO1xuICAgIH1cbiAgfVxufTtcblxuaGVscGVycy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuc2hvdERhdGFXaXRoQWRiRXhlY091dCAoYWRiKSB7XG4gIGxldCB7c3Rkb3V0LCBzdGRlcnIsIGNvZGV9ID0gYXdhaXQgZXhlYyhhZGIuZXhlY3V0YWJsZS5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChbJ2V4ZWMtb3V0JywgJy9zeXN0ZW0vYmluL3NjcmVlbmNhcCcsICctcCddKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlbmNvZGluZzogJ2JpbmFyeScsIGlzQnVmZmVyOiB0cnVlfSk7XG4gIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB0aHJvd1xuICBpZiAoY29kZSB8fCBzdGRlcnIubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTY3JlZW5zaG90IHJldHVybmVkIGVycm9yLCBjb2RlOiAnJHtjb2RlfScsIHN0ZGVycjogJyR7c3RkZXJyLnRvU3RyaW5nKCl9J2ApO1xuICB9XG4gIC8vIGlmIHdlIGRvbid0IGdldCBhbnl0aGluZyBhdCBhbGwsIHRocm93XG4gIGlmICghc3Rkb3V0Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2NyZWVuc2hvdCByZXR1cm5lZCBubyBkYXRhJyk7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgamltcC5yZWFkKHN0ZG91dCk7XG59O1xuXG5jb21tYW5kcy5nZXRTY3JlZW5zaG90ID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuc2hvdCAoKSB7XG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgbGV0IGltYWdlID0gbnVsbDtcbiAgaWYgKGFwaUxldmVsID4gMjApIHtcbiAgICB0cnkge1xuICAgICAgLy8gVGhpcyBzY3JlZW5zaG90aW5nIGFwcHJvYWNoIGlzIHdheSBmYXN0ZXIsIHNpbmNlIGl0IHJlcXVpcmVzIGxlc3MgZXh0ZXJuYWwgY29tbWFuZHNcbiAgICAgIC8vIHRvIGJlIGV4ZWN1dGVkLiBVbmZvcnR1bmF0ZWx5LCBleGVjLW91dCBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgYnkgbmV3ZXIgQW5kcm9pZC9TREsgdmVyc2lvbnMgKDUuMCBhbmQgbGF0ZXIpXG4gICAgICBpbWFnZSA9IGF3YWl0IHRoaXMuZ2V0U2NyZWVuc2hvdERhdGFXaXRoQWRiRXhlY091dCh0aGlzLmFkYik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgQ2Fubm90IGdldCBzY3JlZW5zaG90IGRhdGEgd2l0aCAnYWRiIGV4ZWMtb3V0JyBiZWNhdXNlIG9mICcke2UubWVzc2FnZX0nLiBgICtcbiAgICAgICAgYERlZmF1bHRpbmcgdG8gJ2FkYiBzaGVsbCcgY2FsbGApO1xuICAgIH1cbiAgfVxuICBpZiAoIWltYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGltYWdlID0gYXdhaXQgdGhpcy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJTaGVsbCh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBlcnIgPSBgQ2Fubm90IGdldCBzY3JlZW5zaG90IGRhdGEgYmVjYXVzZSBvZiAnJHtlLm1lc3NhZ2V9Jy4gYCArXG4gICAgICAgIGBNYWtlIHN1cmUgdGhlICdMYXlvdXRQYXJhbXMuRkxBR19TRUNVUkUnIGlzIG5vdCBzZXQgZm9yIGAgK1xuICAgICAgICBgdGhlIGN1cnJlbnQgdmlld2A7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGVycik7XG4gICAgfVxuICB9XG4gIGlmIChhcGlMZXZlbCA8IDIzKSB7XG4gICAgLy8gQW5kcm9pZCBidWcgODQzMzc0MiAtIHJvdGF0ZSBzY3JlZW5zaG90IGlmIHNjcmVlbiBpcyByb3RhdGVkXG4gICAgbGV0IHNjcmVlbk9yaWVudGF0aW9uID0gYXdhaXQgdGhpcy5hZGIuZ2V0U2NyZWVuT3JpZW50YXRpb24oKTtcbiAgICB0cnkge1xuICAgICAgaW1hZ2UgPSBhd2FpdCBpbWFnZS5yb3RhdGUoLTkwICogc2NyZWVuT3JpZW50YXRpb24pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybihgQ291bGQgbm90IHJvdGF0ZSBzY3JlZW5zaG90IGR1ZSB0byBlcnJvcjogJHtlcnJ9YCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGdldEJ1ZmZlciA9IEIucHJvbWlzaWZ5KGltYWdlLmdldEJ1ZmZlciwge2NvbnRleHQ6IGltYWdlfSk7XG4gIGNvbnN0IGltZ0J1ZmZlciA9IGF3YWl0IGdldEJ1ZmZlcihqaW1wLk1JTUVfUE5HKTtcbiAgcmV0dXJuIGltZ0J1ZmZlci50b1N0cmluZygnYmFzZTY0Jyk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07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
353
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYW5kcm9pZEhlbHBlcnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zdXBwb3J0IiwiX3BhdGgiLCJfYmx1ZWJpcmQiLCJfamltcCIsIl90ZWVuX3Byb2Nlc3MiLCJfdXRpbHMiLCJzd2lwZVN0ZXBzUGVyU2VjIiwiZHJhZ1N0ZXBzUGVyU2VjIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJ3YXJuIiwicHJlc3NLZXlDb2RlIiwiYm9vdHN0cmFwIiwic2VuZEFjdGlvbiIsImxvbmdQcmVzc0tleUNvZGUiLCJnZXRPcmllbnRhdGlvbiIsInBhcmFtcyIsIm5hdHVyYWxPcmllbnRhdGlvbiIsIm9wdHMiLCJhbmRyb2lkTmF0dXJhbE9yaWVudGF0aW9uIiwib3JpZW50YXRpb24iLCJ0b1VwcGVyQ2FzZSIsInNldE9yaWVudGF0aW9uIiwiZmFrZUZsaWNrIiwieFNwZWVkIiwieVNwZWVkIiwiZmFrZUZsaWNrRWxlbWVudCIsImVsZW1lbnRJZCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwic3BlZWQiLCJzd2lwZSIsInN0YXJ0WCIsInN0YXJ0WSIsImVuZFgiLCJlbmRZIiwiZHVyYXRpb24iLCJ0b3VjaENvdW50IiwiZWxJZCIsInN3aXBlT3B0cyIsInN0ZXBzIiwiTWF0aCIsInJvdW5kIiwidXRpbCIsImhhc1ZhbHVlIiwiZG9Td2lwZSIsInBpbmNoQ2xvc2UiLCJwZXJjZW50IiwicGluY2hPcHRzIiwiZGlyZWN0aW9uIiwicGluY2hPcGVuIiwiZmxpY2siLCJlbGVtZW50IiwieE9mZnNldCIsInlPZmZzZXQiLCJkcmFnIiwiZGVzdEVsSWQiLCJkcmFnT3B0cyIsImRvRHJhZyIsImxvY2siLCJzZWNvbmRzIiwiYWRiIiwiaXNOYU4iLCJmbG9hdFNlY29uZHMiLCJwYXJzZUZsb2F0IiwiQiIsImRlbGF5IiwidW5sb2NrIiwiaXNMb2NrZWQiLCJpc1NjcmVlbkxvY2tlZCIsImFuZHJvaWRIZWxwZXJzIiwiY2FwcyIsIm9wZW5Ob3RpZmljYXRpb25zIiwic2V0TG9jYXRpb24iLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsInNlbmRUZWxuZXRDb21tYW5kIiwiZmluZ2VycHJpbnQiLCJmaW5nZXJwcmludElkIiwiaXNFbXVsYXRvciIsImVycm9yQW5kVGhyb3ciLCJtb2JpbGVGaW5nZXJwcmludCIsInJlcXVpcmVBcmdzIiwic2VuZFNNUyIsInBob25lTnVtYmVyIiwibWVzc2FnZSIsIm1vYmlsZVNlbmRTbXMiLCJnc21DYWxsIiwiYWN0aW9uIiwibW9iaWxlR3NtQ2FsbCIsImdzbVNpZ25hbCIsInNpZ25hbFN0cmVuZ2giLCJtb2JpbGVHc21TaWduYWwiLCJzdHJlbmd0aCIsImdzbVZvaWNlIiwic3RhdGUiLCJtb2JpbGVHc21Wb2ljZSIsInBvd2VyQUMiLCJtb2JpbGVQb3dlckFjIiwicG93ZXJDYXBhY2l0eSIsImJhdHRlcnlQZXJjZW50IiwibW9iaWxlUG93ZXJDYXBhY2l0eSIsIm5ldHdvcmtTcGVlZCIsIm1vYmlsZU5ldHdvcmtTcGVlZCIsInNlbnNvclNldCIsInNlbnNvciIsInNlbnNvclR5cGUiLCJ2YWx1ZSIsImdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsIiwibG9jYWxGaWxlIiwidGVtcERpciIsInBhdGgiLCJwcmVmaXgiLCJzdWZmaXgiLCJmcyIsImV4aXN0cyIsInVubGluayIsInBuZ0RpciIsImFuZHJvaWRTY3JlZW5zaG90UGF0aCIsInBuZyIsInBvc2l4IiwicmVzb2x2ZSIsImNtZCIsInNoZWxsIiwiZmlsZVNpemUiLCJFcnJvciIsInB1bGwiLCJqaW1wIiwicmVhZCIsImdldFNjcmVlbnNob3REYXRhV2l0aEFkYkV4ZWNPdXQiLCJzdGRvdXQiLCJzdGRlcnIiLCJjb2RlIiwiZXhlYyIsImV4ZWN1dGFibGUiLCJkZWZhdWx0QXJncyIsImNvbmNhdCIsImVuY29kaW5nIiwiaXNCdWZmZXIiLCJsZW5ndGgiLCJ0b1N0cmluZyIsImdldFNjcmVlbnNob3QiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiaW1hZ2UiLCJlIiwiaW5mbyIsImVyciIsInNjcmVlbk9yaWVudGF0aW9uIiwiZ2V0U2NyZWVuT3JpZW50YXRpb24iLCJyb3RhdGUiLCJnZXRCdWZmZXIiLCJwcm9taXNpZnkiLCJjb250ZXh0IiwiaW1nQnVmZmVyIiwiTUlNRV9QTkciLCJPYmplY3QiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYW5kcm9pZEhlbHBlcnMgZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IGZzLCB1dGlsLCB0ZW1wRGlyfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgamltcCBmcm9tICdqaW1wJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcmVxdWlyZUFyZ3MgfSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IHN3aXBlU3RlcHNQZXJTZWMgPSAyODtcbmNvbnN0IGRyYWdTdGVwc1BlclNlYyA9IDQwO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbW1hbmRzLmtleWV2ZW50ID0gYXN5bmMgZnVuY3Rpb24ga2V5ZXZlbnQgKGtleWNvZGUsIG1ldGFzdGF0ZSA9IG51bGwpIHtcbiAgLy8gVE9ETyBkZXByZWNhdGUga2V5ZXZlbnQ7IGN1cnJlbnRseSB3ZCBvbmx5IGltcGxlbWVudHMga2V5ZXZlbnRcbiAgdGhpcy5sb2cud2Fybigna2V5ZXZlbnQgd2lsbCBiZSBkZXByZWNhdGVkIHVzZSBwcmVzc0tleUNvZGUnKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJlc3NLZXlDb2RlKGtleWNvZGUsIG1ldGFzdGF0ZSk7XG59O1xuXG5jb21tYW5kcy5wcmVzc0tleUNvZGUgPSBhc3luYyBmdW5jdGlvbiBwcmVzc0tleUNvZGUgKGtleWNvZGUsIG1ldGFzdGF0ZSA9IG51bGwpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3ByZXNzS2V5Q29kZScsIHtrZXljb2RlLCBtZXRhc3RhdGV9KTtcbn07XG5cbmNvbW1hbmRzLmxvbmdQcmVzc0tleUNvZGUgPSBhc3luYyBmdW5jdGlvbiBsb25nUHJlc3NLZXlDb2RlIChrZXljb2RlLCBtZXRhc3RhdGUgPSBudWxsKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdsb25nUHJlc3NLZXlDb2RlJywge2tleWNvZGUsIG1ldGFzdGF0ZX0pO1xufTtcblxuY29tbWFuZHMuZ2V0T3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRPcmllbnRhdGlvbiAoKSB7XG4gIGxldCBwYXJhbXMgPSB7XG4gICAgbmF0dXJhbE9yaWVudGF0aW9uOiAhIXRoaXMub3B0cy5hbmRyb2lkTmF0dXJhbE9yaWVudGF0aW9uLFxuICB9O1xuICBsZXQgb3JpZW50YXRpb24gPSBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdvcmllbnRhdGlvbicsIHBhcmFtcyk7XG4gIHJldHVybiBvcmllbnRhdGlvbi50b1VwcGVyQ2FzZSgpO1xufTtcblxuY29tbWFuZHMuc2V0T3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBzZXRPcmllbnRhdGlvbiAob3JpZW50YXRpb24pIHtcbiAgb3JpZW50YXRpb24gPSBvcmllbnRhdGlvbi50b1VwcGVyQ2FzZSgpO1xuICBsZXQgcGFyYW1zID0ge1xuICAgIG9yaWVudGF0aW9uLFxuICAgIG5hdHVyYWxPcmllbnRhdGlvbjogISF0aGlzLm9wdHMuYW5kcm9pZE5hdHVyYWxPcmllbnRhdGlvbixcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ29yaWVudGF0aW9uJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLmZha2VGbGljayA9IGFzeW5jIGZ1bmN0aW9uIGZha2VGbGljayAoeFNwZWVkLCB5U3BlZWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2ZsaWNrJywge3hTcGVlZCwgeVNwZWVkfSk7XG59O1xuXG5jb21tYW5kcy5mYWtlRmxpY2tFbGVtZW50ID0gYXN5bmMgZnVuY3Rpb24gZmFrZUZsaWNrRWxlbWVudCAoZWxlbWVudElkLCB4b2Zmc2V0LCB5b2Zmc2V0LCBzcGVlZCkge1xuICBsZXQgcGFyYW1zID0ge3hvZmZzZXQsIHlvZmZzZXQsIHNwZWVkLCBlbGVtZW50SWR9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpmbGljaycsIHBhcmFtcyk7XG59O1xuXG5jb21tYW5kcy5zd2lwZSA9IGFzeW5jIGZ1bmN0aW9uIHN3aXBlIChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIHRvdWNoQ291bnQsIGVsSWQpIHtcbiAgaWYgKHN0YXJ0WCA9PT0gJ251bGwnKSB7XG4gICAgc3RhcnRYID0gMC41O1xuICB9XG4gIGlmIChzdGFydFkgPT09ICdudWxsJykge1xuICAgIHN0YXJ0WSA9IDAuNTtcbiAgfVxuICBsZXQgc3dpcGVPcHRzID0ge3N0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLFxuICAgICAgICAgICAgICAgICAgIHN0ZXBzOiBNYXRoLnJvdW5kKGR1cmF0aW9uICogc3dpcGVTdGVwc1BlclNlYyl9O1xuICAvLyBnb2luZyB0aGUgbG9uZyB3YXkgYW5kIGNoZWNraW5nIGZvciB1bmRlZmluZWQgYW5kIG51bGwgc2luY2VcbiAgLy8gd2UgY2FuJ3QgYmUgYXNzdXJlZCBgZWxJZGAgaXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBpbnRcbiAgaWYgKHV0aWwuaGFzVmFsdWUoZWxJZCkpIHtcbiAgICBzd2lwZU9wdHMuZWxlbWVudElkID0gZWxJZDtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5kb1N3aXBlKHN3aXBlT3B0cyk7XG59O1xuXG5jb21tYW5kcy5kb1N3aXBlID0gYXN5bmMgZnVuY3Rpb24gZG9Td2lwZSAoc3dpcGVPcHRzKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHN3aXBlT3B0cy5lbGVtZW50SWQpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6c3dpcGUnLCBzd2lwZU9wdHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdzd2lwZScsIHN3aXBlT3B0cyk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLnBpbmNoQ2xvc2UgPSBhc3luYyBmdW5jdGlvbiBwaW5jaENsb3NlIChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIHBlcmNlbnQsIHN0ZXBzLCBlbElkKSB7XG4gIGxldCBwaW5jaE9wdHMgPSB7XG4gICAgZGlyZWN0aW9uOiAnaW4nLFxuICAgIGVsZW1lbnRJZDogZWxJZCxcbiAgICBwZXJjZW50LFxuICAgIHN0ZXBzXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnBpbmNoJywgcGluY2hPcHRzKTtcbn07XG5cbmNvbW1hbmRzLnBpbmNoT3BlbiA9IGFzeW5jIGZ1bmN0aW9uIHBpbmNoT3BlbiAoc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCBwZXJjZW50LCBzdGVwcywgZWxJZCkge1xuICBsZXQgcGluY2hPcHRzID0ge2RpcmVjdGlvbjogJ291dCcsIGVsZW1lbnRJZDogZWxJZCwgcGVyY2VudCwgc3RlcHN9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpwaW5jaCcsIHBpbmNoT3B0cyk7XG59O1xuXG5jb21tYW5kcy5mbGljayA9IGFzeW5jIGZ1bmN0aW9uIGZsaWNrIChlbGVtZW50LCB4U3BlZWQsIHlTcGVlZCwgeE9mZnNldCwgeU9mZnNldCwgc3BlZWQpIHtcbiAgaWYgKGVsZW1lbnQpIHtcbiAgICBhd2FpdCB0aGlzLmZha2VGbGlja0VsZW1lbnQoZWxlbWVudCwgeE9mZnNldCwgeU9mZnNldCwgc3BlZWQpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuZmFrZUZsaWNrKHhTcGVlZCwgeVNwZWVkKTtcbiAgfVxufTtcblxuY29tbWFuZHMuZHJhZyA9IGFzeW5jIGZ1bmN0aW9uIGRyYWcgKHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBkdXJhdGlvbiwgdG91Y2hDb3VudCwgZWxlbWVudElkLCBkZXN0RWxJZCkge1xuICBsZXQgZHJhZ09wdHMgPSB7XG4gICAgZWxlbWVudElkLCBkZXN0RWxJZCwgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksXG4gICAgc3RlcHM6IE1hdGgucm91bmQoZHVyYXRpb24gKiBkcmFnU3RlcHNQZXJTZWMpXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmRvRHJhZyhkcmFnT3B0cyk7XG5cbn07XG5cbmNvbW1hbmRzLmRvRHJhZyA9IGFzeW5jIGZ1bmN0aW9uIGRvRHJhZyAoZHJhZ09wdHMpIHtcbiAgaWYgKHV0aWwuaGFzVmFsdWUoZHJhZ09wdHMuZWxlbWVudElkKSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OmRyYWcnLCBkcmFnT3B0cyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2RyYWcnLCBkcmFnT3B0cyk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmxvY2sgPSBhc3luYyBmdW5jdGlvbiBsb2NrIChzZWNvbmRzKSB7XG4gIGF3YWl0IHRoaXMuYWRiLmxvY2soKTtcbiAgaWYgKGlzTmFOKHNlY29uZHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmxvYXRTZWNvbmRzID0gcGFyc2VGbG9hdChzZWNvbmRzKTtcbiAgaWYgKGZsb2F0U2Vjb25kcyA8PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IEIuZGVsYXkoMTAwMCAqIGZsb2F0U2Vjb25kcyk7XG4gIGF3YWl0IHRoaXMudW5sb2NrKCk7XG59O1xuXG5jb21tYW5kcy5pc0xvY2tlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzTG9ja2VkICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzU2NyZWVuTG9ja2VkKCk7XG59O1xuXG5jb21tYW5kcy51bmxvY2sgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2sgKCkge1xuICByZXR1cm4gYXdhaXQgYW5kcm9pZEhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xufTtcblxuY29tbWFuZHMub3Blbk5vdGlmaWNhdGlvbnMgPSBhc3luYyBmdW5jdGlvbiBvcGVuTm90aWZpY2F0aW9ucyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdvcGVuTm90aWZpY2F0aW9uJyk7XG59O1xuXG5jb21tYW5kcy5zZXRMb2NhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHNldExvY2F0aW9uIChsYXRpdHVkZSwgbG9uZ2l0dWRlKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5zZW5kVGVsbmV0Q29tbWFuZChgZ2VvIGZpeCAke2xvbmdpdHVkZX0gJHtsYXRpdHVkZX1gKTtcbn07XG5cbmNvbW1hbmRzLmZpbmdlcnByaW50ID0gYXN5bmMgZnVuY3Rpb24gZmluZ2VycHJpbnQgKGZpbmdlcnByaW50SWQpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2ZpbmdlcnByaW50IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuZmluZ2VycHJpbnQoZmluZ2VycHJpbnRJZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEZpbmdlcnByaW50T3B0c1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBmaW5nZXJwcmludElkIFRoZSB2YWx1ZSBpcyB0aGUgZmluZ2VyX2lkIGZvciB0aGUgZmluZ2VyIHRoYXRcbiAqIHdhcyBcInNjYW5uZWRcIi4gSXQgaXMgYSB1bmlxdWUgaW50ZWdlciB0aGF0IHlvdSBhc3NpZ24gZm9yIGVhY2ggdmlydHVhbCBmaW5nZXJwcmludC5cbiAqIFdoZW4gdGhlIGFwcCBpcyBydW5uaW5nIHlvdSBjYW4gcnVuIHRoaXMgc2FtZSBjb21tYW5kIGVhY2ggdGltZSB0aGVcbiAqIGVtdWxhdG9yIHByb21wdHMgeW91IGZvciBhIGZpbmdlcnByaW50LCB5b3UgY2FuIHJ1biB0aGUgYWRiIGNvbW1hbmQgYW5kIHBhc3MgaXRcbiAqIHRoZSBmaW5nZXJfaWQgdG8gc2ltdWxhdGUgdGhlIGZpbmdlcnByaW50IHNjYW4uXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGZpbmdlcnByaW50IG9uIEFuZHJvaWQgRW11bGF0b3IuXG4gKiBPbmx5IHdvcmtzIG9uIEFQSSAyMytcbiAqXG4gKiBAcGFyYW0ge0ZpbmdlcnByaW50T3B0c30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVGaW5nZXJwcmludCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUZpbmdlcnByaW50KG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZmluZ2VycHJpbnRJZH0gPSByZXF1aXJlQXJncygnZmluZ2VycHJpbnRJZCcsIG9wdHMpO1xuICBhd2FpdCB0aGlzLmZpbmdlcnByaW50KGZpbmdlcnByaW50SWQpO1xufTtcblxuY29tbWFuZHMuc2VuZFNNUyA9IGFzeW5jIGZ1bmN0aW9uIHNlbmRTTVMgKHBob25lTnVtYmVyLCBtZXNzYWdlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdzZW5kU01TIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuc2VuZFNNUyhwaG9uZU51bWJlciwgbWVzc2FnZSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNlbmRTbXNPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGhvbmVOdW1iZXIgVGhlIHBob25lIG51bWJlciB0byBzZW5kIFNNUyB0b1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgcGF5bG9hZFxuICovXG5cbi8qKlxuICogRW11bGF0ZSBzZW5kaW5nIGFuIFNNUyB0byB0aGUgZ2l2ZW4gcGhvbmUgbnVtYmVyLlxuICogT25seSB3b3JrcyBvbiBlbXVsYXRvcnMuXG4gKlxuICogQHBhcmFtIHtTZW5kU21zT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVTZW5kU21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2VuZFNtcyhvcHRzID0ge30pIHtcbiAgY29uc3Qge3Bob25lTnVtYmVyLCBtZXNzYWdlfSA9IHJlcXVpcmVBcmdzKFsncGhvbmVOdW1iZXInLCAnbWVzc2FnZSddLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5zZW5kU01TKHBob25lTnVtYmVyLCBtZXNzYWdlKTtcbn07XG5cbmNvbW1hbmRzLmdzbUNhbGwgPSBhc3luYyBmdW5jdGlvbiBnc21DYWxsIChwaG9uZU51bWJlciwgYWN0aW9uKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdnc21DYWxsIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuZ3NtQ2FsbChwaG9uZU51bWJlciwgYWN0aW9uKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtQ2FsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwaG9uZU51bWJlciBUaGUgcGhvbmUgbnVtYmVyIHRvIGNhbGwgdG9cbiAqIEBwcm9wZXJ0eSB7Y2FsbHxhY2NlcHR8Y2FuY2VsfGhvbGR9IGFjdGlvbiBPbmUgb2YgcG9zc2libGUgYWN0aW9ucyB0byB0YWtlXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGEgR1NNIGNhbGwgdG8gdGhlIGdpdmVuIHBob25lIG51bWJlci5cbiAqIE9ubHkgd29ya3Mgb24gZW11bGF0b3JzLlxuICpcbiAqIEBwYXJhbSB7R3NtQ2FsbE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR3NtQ2FsbCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdzbUNhbGwob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtwaG9uZU51bWJlciwgYWN0aW9ufSA9IHJlcXVpcmVBcmdzKFsncGhvbmVOdW1iZXInLCAnYWN0aW9uJ10sIG9wdHMpO1xuICBhd2FpdCB0aGlzLmdzbUNhbGwocGhvbmVOdW1iZXIsIGFjdGlvbik7XG59O1xuXG5jb21tYW5kcy5nc21TaWduYWwgPSBhc3luYyBmdW5jdGlvbiBnc21TaWduYWwgKHNpZ25hbFN0cmVuZ2gpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2dzbVNpZ25hbCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVNpZ25hbChzaWduYWxTdHJlbmdoKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtU2lnbmFsT3B0aW9uc1xuICogQHByb3BlcnR5IHswfDF8MnwzfDR9IHN0cmVuZ3RoIE9uZSBvZiBwb3NzaWJsZSBzaWduYWwgc3RyZW5ndGggdmFsdWVzLCB3aGVyZSA0IGlzIHRoZSBiZXN0IHNpZ25hbC5cbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgR1NNIHNpZ25hbCBzdHJlbmd0aCBjaGFuZ2UgZXZlbnQuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge0dzbVNpZ25hbE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR3NtU2lnbmFsID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR3NtU2lnbmFsKG9wdHMgPSB7fSkge1xuICBjb25zdCB7c3RyZW5ndGh9ID0gcmVxdWlyZUFyZ3MoJ3N0cmVuZ3RoJywgb3B0cyk7XG4gIGF3YWl0IHRoaXMuZ3NtU2lnbmFsKHN0cmVuZ3RoKTtcbn07XG5cbmNvbW1hbmRzLmdzbVZvaWNlID0gYXN5bmMgZnVuY3Rpb24gZ3NtVm9pY2UgKHN0YXRlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdnc21Wb2ljZSBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVZvaWNlKHN0YXRlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtVm9pY2VPcHRpb25zXG4gKiBAcHJvcGVydHkge29ufG9mZn0gc3RhdGVcbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgR1NNIHZvaWNlIHN0YXRlIGNoYW5nZSBldmVudC5cbiAqIE9ubHkgd29ya3Mgb24gZW11bGF0b3JzLlxuICpcbiAqIEBwYXJhbSB7R3NtVm9pY2VPcHRpb25zfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdzbVZvaWNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR3NtVm9pY2Uob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtzdGF0ZX0gPSByZXF1aXJlQXJncygnc3RhdGUnLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5nc21Wb2ljZShzdGF0ZSk7XG59O1xuXG5jb21tYW5kcy5wb3dlckFDID0gYXN5bmMgZnVuY3Rpb24gcG93ZXJBQyAoc3RhdGUpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ3Bvd2VyQUMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5wb3dlckFDKHN0YXRlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUG93ZXJBY09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7b258b2ZmfSBzdGF0ZVxuICovXG5cbi8qKlxuICogRW11bGF0ZSBBQyBwb3dlciBzdGF0ZSBjaGFuZ2UuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge0dzbVZvaWNlT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVQb3dlckFjID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUG93ZXJBYyhvcHRzID0ge30pIHtcbiAgY29uc3Qge3N0YXRlfSA9IHJlcXVpcmVBcmdzKCdzdGF0ZScsIG9wdHMpO1xuICBhd2FpdCB0aGlzLnBvd2VyQUMoc3RhdGUpO1xufTtcblxuY29tbWFuZHMucG93ZXJDYXBhY2l0eSA9IGFzeW5jIGZ1bmN0aW9uIHBvd2VyQ2FwYWNpdHkgKGJhdHRlcnlQZXJjZW50KSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdwb3dlckNhcGFjaXR5IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIucG93ZXJDYXBhY2l0eShiYXR0ZXJ5UGVyY2VudCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvd2VyQ2FwYWNpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGVyY2VudCAtIFBlcmNlbnRhZ2UgdmFsdWUgaW4gcmFuZ2UgWzAsIDEwMF1cbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgcG93ZXIgY2FwYWNpdHkgY2hhbmdlLlxuICogT25seSB3b3JrcyBvbiBlbXVsYXRvcnMuXG4gKlxuICogQHBhcmFtIHtQb3dlckNhcGFjaXR5T3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVQb3dlckNhcGFjaXR5ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUG93ZXJDYXBhY2l0eShvcHRzID0ge30pIHtcbiAgY29uc3Qge3BlcmNlbnR9ID0gcmVxdWlyZUFyZ3MoJ3BlcmNlbnQnLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5wb3dlckNhcGFjaXR5KHBlcmNlbnQpO1xufTtcblxuY29tbWFuZHMubmV0d29ya1NwZWVkID0gYXN5bmMgZnVuY3Rpb24gbmV0d29ya1NwZWVkIChuZXR3b3JrU3BlZWQpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ25ldHdvcmtTcGVlZCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLm5ldHdvcmtTcGVlZChuZXR3b3JrU3BlZWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBOZXR3b3JrU3BlZWRPcHRpb25zXG4gKiBAcHJvcGVydHkge2dzbXxzY3NkfGdwcnN8ZWRnZXx1bXRzfGhzZHBhfGx0ZXxldmRvfGZ1bGx9IHNwZWVkXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGRpZmZlcmVudCBuZXR3b3JrIGNvbm5lY3Rpb24gc3BlZWQgbW9kZXMuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge05ldHdvcmtTcGVlZE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlTmV0d29ya1NwZWVkID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTmV0d29ya1NwZWVkKG9wdHMgPSB7fSkge1xuICBjb25zdCB7c3BlZWR9ID0gcmVxdWlyZUFyZ3MoJ3NwZWVkJywgb3B0cyk7XG4gIGF3YWl0IHRoaXMubmV0d29ya1NwZWVkKHNwZWVkKTtcbn07XG5cbi8qKlxuICogRW11bGF0ZSBzZW5zb3JzIHZhbHVlcyBvbiB0aGUgY29ubmVjdGVkIGVtdWxhdG9yLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNlbnNvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbnNvclR5cGUgLSBzZW5zb3IgdHlwZSBkZWNsYXJlZCBpbiBhZGIuU0VOU09SU1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gdmFsdWUgdG8gc2V0IHRvIHRoZSBzZW5zb3JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gU2Vuc29yXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiBzZW5zb3JUeXBlIGlzIG5vdCBkZWZpbmVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiB2YWx1ZSBmb3IgdGhlIHNlIHNvciBpcyBub3QgZGVmaW5lZFxuICogQHRocm93cyB7RXJyb3J9IC0gSWYgZGV2aWNlVHlwZSBpcyBub3QgYW4gZW11bGF0b3JcbiAqL1xuY29tbWFuZHMuc2Vuc29yU2V0ID0gYXN5bmMgZnVuY3Rpb24gc2Vuc29yU2V0IChzZW5zb3IgPSB7fSkge1xuICBjb25zdCB7c2Vuc29yVHlwZSwgdmFsdWV9ID0gc2Vuc29yO1xuICBpZiAoIXV0aWwuaGFzVmFsdWUoc2Vuc29yVHlwZSkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGAnc2Vuc29yVHlwZScgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuICBpZiAoIXV0aWwuaGFzVmFsdWUodmFsdWUpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgJ3ZhbHVlJyBhcmd1bWVudCBpcyByZXF1aXJlZGApO1xuICB9XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdzZW5zb3JTZXQgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5zZW5zb3JTZXQoc2Vuc29yVHlwZSwgdmFsdWUpO1xufTtcblxuaGVscGVycy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJTaGVsbCA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsIChhZGIsIG9wdHMpIHtcbiAgY29uc3QgbG9jYWxGaWxlID0gYXdhaXQgdGVtcERpci5wYXRoKHtwcmVmaXg6ICdhcHBpdW0nLCBzdWZmaXg6ICcucG5nJ30pO1xuICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsRmlsZSkpIHtcbiAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxGaWxlKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHBuZ0RpciA9IG9wdHMuYW5kcm9pZFNjcmVlbnNob3RQYXRoIHx8ICcvZGF0YS9sb2NhbC90bXAvJztcbiAgICBjb25zdCBwbmcgPSBwYXRoLnBvc2l4LnJlc29sdmUocG5nRGlyLCAnc2NyZWVuc2hvdC5wbmcnKTtcbiAgICBjb25zdCBjbWQgPSBbJy9zeXN0ZW0vYmluL3JtJywgYCR7cG5nfTtgLCAnL3N5c3RlbS9iaW4vc2NyZWVuY2FwJywgJy1wJywgcG5nXTtcbiAgICBhd2FpdCBhZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWF3YWl0IGFkYi5maWxlU2l6ZShwbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzaXplIG9mIHRoZSB0YWtlbiBzY3JlZW5zaG90IGVxdWFscyB0byB6ZXJvLicpO1xuICAgIH1cbiAgICBhd2FpdCBhZGIucHVsbChwbmcsIGxvY2FsRmlsZSk7XG4gICAgcmV0dXJuIGF3YWl0IGppbXAucmVhZChsb2NhbEZpbGUpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxGaWxlKSkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gICAgfVxuICB9XG59O1xuXG5oZWxwZXJzLmdldFNjcmVlbnNob3REYXRhV2l0aEFkYkV4ZWNPdXQgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0IChhZGIpIHtcbiAgbGV0IHtzdGRvdXQsIHN0ZGVyciwgY29kZX0gPSBhd2FpdCBleGVjKGFkYi5leGVjdXRhYmxlLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KFsnZXhlYy1vdXQnLCAnL3N5c3RlbS9iaW4vc2NyZWVuY2FwJywgJy1wJ10pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2VuY29kaW5nOiAnYmluYXJ5JywgaXNCdWZmZXI6IHRydWV9KTtcbiAgLy8gaWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRocm93XG4gIGlmIChjb2RlIHx8IHN0ZGVyci5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNjcmVlbnNob3QgcmV0dXJuZWQgZXJyb3IsIGNvZGU6ICcke2NvZGV9Jywgc3RkZXJyOiAnJHtzdGRlcnIudG9TdHJpbmcoKX0nYCk7XG4gIH1cbiAgLy8gaWYgd2UgZG9uJ3QgZ2V0IGFueXRoaW5nIGF0IGFsbCwgdGhyb3dcbiAgaWYgKCFzdGRvdXQubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTY3JlZW5zaG90IHJldHVybmVkIG5vIGRhdGEnKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCBqaW1wLnJlYWQoc3Rkb3V0KTtcbn07XG5cbmNvbW1hbmRzLmdldFNjcmVlbnNob3QgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5zaG90ICgpIHtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuICBsZXQgaW1hZ2UgPSBudWxsO1xuICBpZiAoYXBpTGV2ZWwgPiAyMCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBUaGlzIHNjcmVlbnNob3RpbmcgYXBwcm9hY2ggaXMgd2F5IGZhc3Rlciwgc2luY2UgaXQgcmVxdWlyZXMgbGVzcyBleHRlcm5hbCBjb21tYW5kc1xuICAgICAgLy8gdG8gYmUgZXhlY3V0ZWQuIFVuZm9ydHVuYXRlbHksIGV4ZWMtb3V0IG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBieSBuZXdlciBBbmRyb2lkL1NESyB2ZXJzaW9ucyAoNS4wIGFuZCBsYXRlcilcbiAgICAgIGltYWdlID0gYXdhaXQgdGhpcy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0KHRoaXMuYWRiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBDYW5ub3QgZ2V0IHNjcmVlbnNob3QgZGF0YSB3aXRoICdhZGIgZXhlYy1vdXQnIGJlY2F1c2Ugb2YgJyR7ZS5tZXNzYWdlfScuIGAgK1xuICAgICAgICBgRGVmYXVsdGluZyB0byAnYWRiIHNoZWxsJyBjYWxsYCk7XG4gICAgfVxuICB9XG4gIGlmICghaW1hZ2UpIHtcbiAgICB0cnkge1xuICAgICAgaW1hZ2UgPSBhd2FpdCB0aGlzLmdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IGVyciA9IGBDYW5ub3QgZ2V0IHNjcmVlbnNob3QgZGF0YSBiZWNhdXNlIG9mICcke2UubWVzc2FnZX0nLiBgICtcbiAgICAgICAgYE1ha2Ugc3VyZSB0aGUgJ0xheW91dFBhcmFtcy5GTEFHX1NFQ1VSRScgaXMgbm90IHNldCBmb3IgYCArXG4gICAgICAgIGB0aGUgY3VycmVudCB2aWV3YDtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coZXJyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFwaUxldmVsIDwgMjMpIHtcbiAgICAvLyBBbmRyb2lkIGJ1ZyA4NDMzNzQyIC0gcm90YXRlIHNjcmVlbnNob3QgaWYgc2NyZWVuIGlzIHJvdGF0ZWRcbiAgICBsZXQgc2NyZWVuT3JpZW50YXRpb24gPSBhd2FpdCB0aGlzLmFkYi5nZXRTY3JlZW5PcmllbnRhdGlvbigpO1xuICAgIHRyeSB7XG4gICAgICBpbWFnZSA9IGF3YWl0IGltYWdlLnJvdGF0ZSgtOTAgKiBzY3JlZW5PcmllbnRhdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBDb3VsZCBub3Qgcm90YXRlIHNjcmVlbnNob3QgZHVlIHRvIGVycm9yOiAke2Vycn1gKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZ2V0QnVmZmVyID0gQi5wcm9taXNpZnkoaW1hZ2UuZ2V0QnVmZmVyLCB7Y29udGV4dDogaW1hZ2V9KTtcbiAgY29uc3QgaW1nQnVmZmVyID0gYXdhaXQgZ2V0QnVmZmVyKGppbXAuTUlNRV9QTkcpO1xuICByZXR1cm4gaW1nQnVmZmVyLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsZUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsS0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsU0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksS0FBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssYUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBRUEsTUFBTU8sZ0JBQWdCLEdBQUcsRUFBRTtBQUMzQixNQUFNQyxlQUFlLEdBQUcsRUFBRTtBQUUxQixJQUFJQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUFDQyxPQUFBLENBQUFGLE9BQUEsR0FBQUEsT0FBQTtBQUFBRSxPQUFBLENBQUFILFFBQUEsR0FBQUEsUUFBQTtBQUVqREEsUUFBUSxDQUFDSSxRQUFRLEdBQUcsZUFBZUEsUUFBUUEsQ0FBRUMsT0FBTyxFQUFFQyxT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
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","names":["_androidHelpers","_interopRequireDefault","require","_support","_path","_bluebird","_jimp","_teen_process","swipeStepsPerSec","dragStepsPerSec","commands","helpers","extensions","exports","keyevent","keycode","metastate","log","warn","pressKeyCode","bootstrap","sendAction","longPressKeyCode","getOrientation","params","naturalOrientation","opts","androidNaturalOrientation","orientation","toUpperCase","setOrientation","fakeFlick","xSpeed","ySpeed","fakeFlickElement","elementId","xoffset","yoffset","speed","swipe","startX","startY","endX","endY","duration","touchCount","elId","swipeOpts","steps","Math","round","util","hasValue","doSwipe","pinchClose","percent","pinchOpts","direction","pinchOpen","flick","element","xOffset","yOffset","drag","destElId","dragOpts","doDrag","lock","seconds","adb","isNaN","floatSeconds","parseFloat","B","delay","unlock","isLocked","isScreenLocked","androidHelpers","caps","openNotifications","setLocation","latitude","longitude","sendTelnetCommand","fingerprint","fingerprintId","isEmulator","errorAndThrow","sendSMS","phoneNumber","message","gsmCall","action","gsmSignal","signalStrengh","gsmVoice","state","powerAC","powerCapacity","batteryPercent","networkSpeed","sensorSet","sensor","sensorType","value","getScreenshotDataWithAdbShell","localFile","tempDir","path","prefix","suffix","fs","exists","unlink","pngDir","androidScreenshotPath","png","posix","resolve","cmd","shell","fileSize","Error","pull","jimp","read","getScreenshotDataWithAdbExecOut","stdout","stderr","code","exec","executable","defaultArgs","concat","encoding","isBuffer","length","toString","getScreenshot","apiLevel","getApiLevel","image","e","info","err","screenOrientation","getScreenOrientation","rotate","getBuffer","promisify","context","imgBuffer","MIME_PNG","Object","assign","_default","default"],"sources":["../../../lib/commands/actions.js"],"sourcesContent":["import androidHelpers from '../android-helpers';\nimport { fs, util, tempDir} from '@appium/support';\nimport path from 'path';\nimport B from 'bluebird';\nimport jimp from 'jimp';\nimport { exec } from 'teen_process';\n\nconst swipeStepsPerSec = 28;\nconst dragStepsPerSec = 40;\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.keyevent = async function keyevent (keycode, metastate = null) {\n // TODO deprecate keyevent; currently wd only implements keyevent\n this.log.warn('keyevent will be deprecated use pressKeyCode');\n return await this.pressKeyCode(keycode, metastate);\n};\n\ncommands.pressKeyCode = async function pressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('pressKeyCode', {keycode, metastate});\n};\n\ncommands.longPressKeyCode = async function longPressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('longPressKeyCode', {keycode, metastate});\n};\n\ncommands.getOrientation = async function getOrientation () {\n let params = {\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n let orientation = await this.bootstrap.sendAction('orientation', params);\n return orientation.toUpperCase();\n};\n\ncommands.setOrientation = async function setOrientation (orientation) {\n orientation = orientation.toUpperCase();\n let params = {\n orientation,\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n return await this.bootstrap.sendAction('orientation', params);\n};\n\ncommands.fakeFlick = async function fakeFlick (xSpeed, ySpeed) {\n return await this.bootstrap.sendAction('flick', {xSpeed, ySpeed});\n};\n\ncommands.fakeFlickElement = async function fakeFlickElement (elementId, xoffset, yoffset, speed) {\n let params = {xoffset, yoffset, speed, elementId};\n return await this.bootstrap.sendAction('element:flick', params);\n};\n\ncommands.swipe = async function swipe (startX, startY, endX, endY, duration, touchCount, elId) {\n if (startX === 'null') {\n startX = 0.5;\n }\n if (startY === 'null') {\n startY = 0.5;\n }\n let swipeOpts = {startX, startY, endX, endY,\n steps: Math.round(duration * swipeStepsPerSec)};\n // going the long way and checking for undefined and null since\n // we can't be assured `elId` is a string and not an int\n if (util.hasValue(elId)) {\n swipeOpts.elementId = elId;\n }\n return await this.doSwipe(swipeOpts);\n};\n\ncommands.doSwipe = async function doSwipe (swipeOpts) {\n if (util.hasValue(swipeOpts.elementId)) {\n return await this.bootstrap.sendAction('element:swipe', swipeOpts);\n } else {\n return await this.bootstrap.sendAction('swipe', swipeOpts);\n }\n};\n\ncommands.pinchClose = async function pinchClose (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {\n direction: 'in',\n elementId: elId,\n percent,\n steps\n };\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.pinchOpen = async function pinchOpen (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {direction: 'out', elementId: elId, percent, steps};\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.flick = async function flick (element, xSpeed, ySpeed, xOffset, yOffset, speed) {\n if (element) {\n await this.fakeFlickElement(element, xOffset, yOffset, speed);\n } else {\n await this.fakeFlick(xSpeed, ySpeed);\n }\n};\n\ncommands.drag = async function drag (startX, startY, endX, endY, duration, touchCount, elementId, destElId) {\n let dragOpts = {\n elementId, destElId, startX, startY, endX, endY,\n steps: Math.round(duration * dragStepsPerSec)\n };\n return await this.doDrag(dragOpts);\n\n};\n\ncommands.doDrag = async function doDrag (dragOpts) {\n if (util.hasValue(dragOpts.elementId)) {\n return await this.bootstrap.sendAction('element:drag', dragOpts);\n } else {\n return await this.bootstrap.sendAction('drag', dragOpts);\n }\n};\n\ncommands.lock = async function lock (seconds) {\n await this.adb.lock();\n if (isNaN(seconds)) {\n return;\n }\n\n const floatSeconds = parseFloat(seconds);\n if (floatSeconds <= 0) {\n return;\n }\n await B.delay(1000 * floatSeconds);\n await this.unlock();\n};\n\ncommands.isLocked = async function isLocked () {\n return await this.adb.isScreenLocked();\n};\n\ncommands.unlock = async function unlock () {\n return await androidHelpers.unlock(this, this.adb, this.caps);\n};\n\ncommands.openNotifications = async function openNotifications () {\n return await this.bootstrap.sendAction('openNotification');\n};\n\ncommands.setLocation = async function setLocation (latitude, longitude) {\n return await this.adb.sendTelnetCommand(`geo fix ${longitude} ${latitude}`);\n};\n\ncommands.fingerprint = async function fingerprint (fingerprintId) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('fingerprint method is only available for emulators');\n }\n await this.adb.fingerprint(fingerprintId);\n};\n\ncommands.sendSMS = async function sendSMS (phoneNumber, message) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sendSMS method is only available for emulators');\n }\n await this.adb.sendSMS(phoneNumber, message);\n};\n\ncommands.gsmCall = async function gsmCall (phoneNumber, action) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmCall method is only available for emulators');\n }\n await this.adb.gsmCall(phoneNumber, action);\n};\n\ncommands.gsmSignal = async function gsmSignal (signalStrengh) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmSignal method is only available for emulators');\n }\n await this.adb.gsmSignal(signalStrengh);\n};\n\ncommands.gsmVoice = async function gsmVoice (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmVoice method is only available for emulators');\n }\n await this.adb.gsmVoice(state);\n};\n\ncommands.powerAC = async function powerAC (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerAC method is only available for emulators');\n }\n await this.adb.powerAC(state);\n};\n\ncommands.powerCapacity = async function powerCapacity (batteryPercent) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerCapacity method is only available for emulators');\n }\n await this.adb.powerCapacity(batteryPercent);\n};\n\ncommands.networkSpeed = async function networkSpeed (networkSpeed) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('networkSpeed method is only available for emulators');\n }\n await this.adb.networkSpeed(networkSpeed);\n};\n\n/**\n * Emulate sensors values on the connected emulator.\n *\n * @typedef {Object} Sensor\n * @property {string} sensorType - sensor type declared in adb.SENSORS\n * @property {string} value - value to set to the sensor\n *\n * @param {Object} Sensor\n * @throws {Error} - If sensorType is not defined\n * @throws {Error} - If value for the se sor is not defined\n * @throws {Error} - If deviceType is not an emulator\n */\ncommands.sensorSet = async function sensorSet (sensor = {}) {\n const {sensorType, value} = sensor;\n if (!util.hasValue(sensorType)) {\n this.log.errorAndThrow(`'sensorType' argument is required`);\n }\n if (!util.hasValue(value)) {\n this.log.errorAndThrow(`'value' argument is required`);\n }\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sensorSet method is only available for emulators');\n }\n await this.adb.sensorSet(sensorType, value);\n};\n\nhelpers.getScreenshotDataWithAdbShell = async function getScreenshotDataWithAdbShell (adb, opts) {\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.png'});\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n try {\n const pngDir = opts.androidScreenshotPath || '/data/local/tmp/';\n const png = path.posix.resolve(pngDir, 'screenshot.png');\n const cmd = ['/system/bin/rm', `${png};`, '/system/bin/screencap', '-p', png];\n await adb.shell(cmd);\n if (!await adb.fileSize(png)) {\n throw new Error('The size of the taken screenshot equals to zero.');\n }\n await adb.pull(png, localFile);\n return await jimp.read(localFile);\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n }\n};\n\nhelpers.getScreenshotDataWithAdbExecOut = async function getScreenshotDataWithAdbExecOut (adb) {\n let {stdout, stderr, code} = await exec(adb.executable.path,\n adb.executable.defaultArgs\n .concat(['exec-out', '/system/bin/screencap', '-p']),\n {encoding: 'binary', isBuffer: true});\n // if there is an error, throw\n if (code || stderr.length) {\n throw new Error(`Screenshot returned error, code: '${code}', stderr: '${stderr.toString()}'`);\n }\n // if we don't get anything at all, throw\n if (!stdout.length) {\n throw new Error('Screenshot returned no data');\n }\n\n return await jimp.read(stdout);\n};\n\ncommands.getScreenshot = async function getScreenshot () {\n const apiLevel = await this.adb.getApiLevel();\n let image = null;\n if (apiLevel > 20) {\n try {\n // This screenshoting approach is way faster, since it requires less external commands\n // to be executed. Unfortunately, exec-out option is only supported by newer Android/SDK versions (5.0 and later)\n image = await this.getScreenshotDataWithAdbExecOut(this.adb);\n } catch (e) {\n this.log.info(`Cannot get screenshot data with 'adb exec-out' because of '${e.message}'. ` +\n `Defaulting to 'adb shell' call`);\n }\n }\n if (!image) {\n try {\n image = await this.getScreenshotDataWithAdbShell(this.adb, this.opts);\n } catch (e) {\n const err = `Cannot get screenshot data because of '${e.message}'. ` +\n `Make sure the 'LayoutParams.FLAG_SECURE' is not set for ` +\n `the current view`;\n this.log.errorAndThrow(err);\n }\n }\n if (apiLevel < 23) {\n // Android bug 8433742 - rotate screenshot if screen is rotated\n let screenOrientation = await this.adb.getScreenOrientation();\n try {\n image = await image.rotate(-90 * screenOrientation);\n } catch (err) {\n this.log.warn(`Could not rotate screenshot due to error: ${err}`);\n }\n }\n const getBuffer = B.promisify(image.getBuffer, {context: image});\n const imgBuffer = await getBuffer(jimp.MIME_PNG);\n return imgBuffer.toString('base64');\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
1
+ {"version":3,"file":"actions.js","names":["_androidHelpers","_interopRequireDefault","require","_support","_path","_bluebird","_jimp","_teen_process","_utils","swipeStepsPerSec","dragStepsPerSec","commands","helpers","extensions","exports","keyevent","keycode","metastate","log","warn","pressKeyCode","bootstrap","sendAction","longPressKeyCode","getOrientation","params","naturalOrientation","opts","androidNaturalOrientation","orientation","toUpperCase","setOrientation","fakeFlick","xSpeed","ySpeed","fakeFlickElement","elementId","xoffset","yoffset","speed","swipe","startX","startY","endX","endY","duration","touchCount","elId","swipeOpts","steps","Math","round","util","hasValue","doSwipe","pinchClose","percent","pinchOpts","direction","pinchOpen","flick","element","xOffset","yOffset","drag","destElId","dragOpts","doDrag","lock","seconds","adb","isNaN","floatSeconds","parseFloat","B","delay","unlock","isLocked","isScreenLocked","androidHelpers","caps","openNotifications","setLocation","latitude","longitude","sendTelnetCommand","fingerprint","fingerprintId","isEmulator","errorAndThrow","mobileFingerprint","requireArgs","sendSMS","phoneNumber","message","mobileSendSms","gsmCall","action","mobileGsmCall","gsmSignal","signalStrengh","mobileGsmSignal","strength","gsmVoice","state","mobileGsmVoice","powerAC","mobilePowerAc","powerCapacity","batteryPercent","mobilePowerCapacity","networkSpeed","mobileNetworkSpeed","sensorSet","sensor","sensorType","value","getScreenshotDataWithAdbShell","localFile","tempDir","path","prefix","suffix","fs","exists","unlink","pngDir","androidScreenshotPath","png","posix","resolve","cmd","shell","fileSize","Error","pull","jimp","read","getScreenshotDataWithAdbExecOut","stdout","stderr","code","exec","executable","defaultArgs","concat","encoding","isBuffer","length","toString","getScreenshot","apiLevel","getApiLevel","image","e","info","err","screenOrientation","getScreenOrientation","rotate","getBuffer","promisify","context","imgBuffer","MIME_PNG","Object","assign","_default","default"],"sources":["../../../lib/commands/actions.js"],"sourcesContent":["import androidHelpers from '../android-helpers';\nimport { fs, util, tempDir} from '@appium/support';\nimport path from 'path';\nimport B from 'bluebird';\nimport jimp from 'jimp';\nimport { exec } from 'teen_process';\nimport { requireArgs } from '../utils';\n\nconst swipeStepsPerSec = 28;\nconst dragStepsPerSec = 40;\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.keyevent = async function keyevent (keycode, metastate = null) {\n // TODO deprecate keyevent; currently wd only implements keyevent\n this.log.warn('keyevent will be deprecated use pressKeyCode');\n return await this.pressKeyCode(keycode, metastate);\n};\n\ncommands.pressKeyCode = async function pressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('pressKeyCode', {keycode, metastate});\n};\n\ncommands.longPressKeyCode = async function longPressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('longPressKeyCode', {keycode, metastate});\n};\n\ncommands.getOrientation = async function getOrientation () {\n let params = {\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n let orientation = await this.bootstrap.sendAction('orientation', params);\n return orientation.toUpperCase();\n};\n\ncommands.setOrientation = async function setOrientation (orientation) {\n orientation = orientation.toUpperCase();\n let params = {\n orientation,\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n return await this.bootstrap.sendAction('orientation', params);\n};\n\ncommands.fakeFlick = async function fakeFlick (xSpeed, ySpeed) {\n return await this.bootstrap.sendAction('flick', {xSpeed, ySpeed});\n};\n\ncommands.fakeFlickElement = async function fakeFlickElement (elementId, xoffset, yoffset, speed) {\n let params = {xoffset, yoffset, speed, elementId};\n return await this.bootstrap.sendAction('element:flick', params);\n};\n\ncommands.swipe = async function swipe (startX, startY, endX, endY, duration, touchCount, elId) {\n if (startX === 'null') {\n startX = 0.5;\n }\n if (startY === 'null') {\n startY = 0.5;\n }\n let swipeOpts = {startX, startY, endX, endY,\n steps: Math.round(duration * swipeStepsPerSec)};\n // going the long way and checking for undefined and null since\n // we can't be assured `elId` is a string and not an int\n if (util.hasValue(elId)) {\n swipeOpts.elementId = elId;\n }\n return await this.doSwipe(swipeOpts);\n};\n\ncommands.doSwipe = async function doSwipe (swipeOpts) {\n if (util.hasValue(swipeOpts.elementId)) {\n return await this.bootstrap.sendAction('element:swipe', swipeOpts);\n } else {\n return await this.bootstrap.sendAction('swipe', swipeOpts);\n }\n};\n\ncommands.pinchClose = async function pinchClose (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {\n direction: 'in',\n elementId: elId,\n percent,\n steps\n };\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.pinchOpen = async function pinchOpen (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {direction: 'out', elementId: elId, percent, steps};\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.flick = async function flick (element, xSpeed, ySpeed, xOffset, yOffset, speed) {\n if (element) {\n await this.fakeFlickElement(element, xOffset, yOffset, speed);\n } else {\n await this.fakeFlick(xSpeed, ySpeed);\n }\n};\n\ncommands.drag = async function drag (startX, startY, endX, endY, duration, touchCount, elementId, destElId) {\n let dragOpts = {\n elementId, destElId, startX, startY, endX, endY,\n steps: Math.round(duration * dragStepsPerSec)\n };\n return await this.doDrag(dragOpts);\n\n};\n\ncommands.doDrag = async function doDrag (dragOpts) {\n if (util.hasValue(dragOpts.elementId)) {\n return await this.bootstrap.sendAction('element:drag', dragOpts);\n } else {\n return await this.bootstrap.sendAction('drag', dragOpts);\n }\n};\n\ncommands.lock = async function lock (seconds) {\n await this.adb.lock();\n if (isNaN(seconds)) {\n return;\n }\n\n const floatSeconds = parseFloat(seconds);\n if (floatSeconds <= 0) {\n return;\n }\n await B.delay(1000 * floatSeconds);\n await this.unlock();\n};\n\ncommands.isLocked = async function isLocked () {\n return await this.adb.isScreenLocked();\n};\n\ncommands.unlock = async function unlock () {\n return await androidHelpers.unlock(this, this.adb, this.caps);\n};\n\ncommands.openNotifications = async function openNotifications () {\n return await this.bootstrap.sendAction('openNotification');\n};\n\ncommands.setLocation = async function setLocation (latitude, longitude) {\n return await this.adb.sendTelnetCommand(`geo fix ${longitude} ${latitude}`);\n};\n\ncommands.fingerprint = async function fingerprint (fingerprintId) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('fingerprint method is only available for emulators');\n }\n await this.adb.fingerprint(fingerprintId);\n};\n\n/**\n * @typedef {Object} FingerprintOpts\n * @param {string|number} fingerprintId The value is the finger_id for the finger that\n * was \"scanned\". It is a unique integer that you assign for each virtual fingerprint.\n * When the app is running you can run this same command each time the\n * emulator prompts you for a fingerprint, you can run the adb command and pass it\n * the finger_id to simulate the fingerprint scan.\n */\n\n/**\n * Emulate fingerprint on Android Emulator.\n * Only works on API 23+\n *\n * @param {FingerprintOpts} opts\n */\ncommands.mobileFingerprint = async function mobileFingerprint(opts = {}) {\n const {fingerprintId} = requireArgs('fingerprintId', opts);\n await this.fingerprint(fingerprintId);\n};\n\ncommands.sendSMS = async function sendSMS (phoneNumber, message) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sendSMS method is only available for emulators');\n }\n await this.adb.sendSMS(phoneNumber, message);\n};\n\n/**\n * @typedef {Object} SendSmsOptions\n * @property {string} phoneNumber The phone number to send SMS to\n * @property {string} message The message payload\n */\n\n/**\n * Emulate sending an SMS to the given phone number.\n * Only works on emulators.\n *\n * @param {SendSmsOptions} opts\n */\ncommands.mobileSendSms = async function mobileSendSms(opts = {}) {\n const {phoneNumber, message} = requireArgs(['phoneNumber', 'message'], opts);\n await this.sendSMS(phoneNumber, message);\n};\n\ncommands.gsmCall = async function gsmCall (phoneNumber, action) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmCall method is only available for emulators');\n }\n await this.adb.gsmCall(phoneNumber, action);\n};\n\n/**\n * @typedef {Object} GsmCallOptions\n * @property {string} phoneNumber The phone number to call to\n * @property {call|accept|cancel|hold} action One of possible actions to take\n */\n\n/**\n * Emulate a GSM call to the given phone number.\n * Only works on emulators.\n *\n * @param {GsmCallOptions} opts\n */\ncommands.mobileGsmCall = async function mobileGsmCall(opts = {}) {\n const {phoneNumber, action} = requireArgs(['phoneNumber', 'action'], opts);\n await this.gsmCall(phoneNumber, action);\n};\n\ncommands.gsmSignal = async function gsmSignal (signalStrengh) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmSignal method is only available for emulators');\n }\n await this.adb.gsmSignal(signalStrengh);\n};\n\n/**\n * @typedef {Object} GsmSignalOptions\n * @property {0|1|2|3|4} strength One of possible signal strength values, where 4 is the best signal.\n */\n\n/**\n * Emulate GSM signal strength change event.\n * Only works on emulators.\n *\n * @param {GsmSignalOptions} opts\n */\ncommands.mobileGsmSignal = async function mobileGsmSignal(opts = {}) {\n const {strength} = requireArgs('strength', opts);\n await this.gsmSignal(strength);\n};\n\ncommands.gsmVoice = async function gsmVoice (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmVoice method is only available for emulators');\n }\n await this.adb.gsmVoice(state);\n};\n\n/**\n * @typedef {Object} GsmVoiceOptions\n * @property {on|off} state\n */\n\n/**\n * Emulate GSM voice state change event.\n * Only works on emulators.\n *\n * @param {GsmVoiceOptions} opts\n */\ncommands.mobileGsmVoice = async function mobileGsmVoice(opts = {}) {\n const {state} = requireArgs('state', opts);\n await this.gsmVoice(state);\n};\n\ncommands.powerAC = async function powerAC (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerAC method is only available for emulators');\n }\n await this.adb.powerAC(state);\n};\n\n/**\n * @typedef {Object} PowerAcOptions\n * @property {on|off} state\n */\n\n/**\n * Emulate AC power state change.\n * Only works on emulators.\n *\n * @param {GsmVoiceOptions} opts\n */\ncommands.mobilePowerAc = async function mobilePowerAc(opts = {}) {\n const {state} = requireArgs('state', opts);\n await this.powerAC(state);\n};\n\ncommands.powerCapacity = async function powerCapacity (batteryPercent) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerCapacity method is only available for emulators');\n }\n await this.adb.powerCapacity(batteryPercent);\n};\n\n/**\n * @typedef {Object} PowerCapacityOptions\n * @property {number} percent - Percentage value in range [0, 100]\n */\n\n/**\n * Emulate power capacity change.\n * Only works on emulators.\n *\n * @param {PowerCapacityOptions} opts\n */\ncommands.mobilePowerCapacity = async function mobilePowerCapacity(opts = {}) {\n const {percent} = requireArgs('percent', opts);\n await this.powerCapacity(percent);\n};\n\ncommands.networkSpeed = async function networkSpeed (networkSpeed) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('networkSpeed method is only available for emulators');\n }\n await this.adb.networkSpeed(networkSpeed);\n};\n\n/**\n * @typedef {Object} NetworkSpeedOptions\n * @property {gsm|scsd|gprs|edge|umts|hsdpa|lte|evdo|full} speed\n */\n\n/**\n * Emulate different network connection speed modes.\n * Only works on emulators.\n *\n * @param {NetworkSpeedOptions} opts\n */\ncommands.mobileNetworkSpeed = async function mobileNetworkSpeed(opts = {}) {\n const {speed} = requireArgs('speed', opts);\n await this.networkSpeed(speed);\n};\n\n/**\n * Emulate sensors values on the connected emulator.\n *\n * @typedef {Object} Sensor\n * @property {string} sensorType - sensor type declared in adb.SENSORS\n * @property {string} value - value to set to the sensor\n *\n * @param {Object} Sensor\n * @throws {Error} - If sensorType is not defined\n * @throws {Error} - If value for the se sor is not defined\n * @throws {Error} - If deviceType is not an emulator\n */\ncommands.sensorSet = async function sensorSet (sensor = {}) {\n const {sensorType, value} = sensor;\n if (!util.hasValue(sensorType)) {\n this.log.errorAndThrow(`'sensorType' argument is required`);\n }\n if (!util.hasValue(value)) {\n this.log.errorAndThrow(`'value' argument is required`);\n }\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sensorSet method is only available for emulators');\n }\n await this.adb.sensorSet(sensorType, value);\n};\n\nhelpers.getScreenshotDataWithAdbShell = async function getScreenshotDataWithAdbShell (adb, opts) {\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.png'});\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n try {\n const pngDir = opts.androidScreenshotPath || '/data/local/tmp/';\n const png = path.posix.resolve(pngDir, 'screenshot.png');\n const cmd = ['/system/bin/rm', `${png};`, '/system/bin/screencap', '-p', png];\n await adb.shell(cmd);\n if (!await adb.fileSize(png)) {\n throw new Error('The size of the taken screenshot equals to zero.');\n }\n await adb.pull(png, localFile);\n return await jimp.read(localFile);\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n }\n};\n\nhelpers.getScreenshotDataWithAdbExecOut = async function getScreenshotDataWithAdbExecOut (adb) {\n let {stdout, stderr, code} = await exec(adb.executable.path,\n adb.executable.defaultArgs\n .concat(['exec-out', '/system/bin/screencap', '-p']),\n {encoding: 'binary', isBuffer: true});\n // if there is an error, throw\n if (code || stderr.length) {\n throw new Error(`Screenshot returned error, code: '${code}', stderr: '${stderr.toString()}'`);\n }\n // if we don't get anything at all, throw\n if (!stdout.length) {\n throw new Error('Screenshot returned no data');\n }\n\n return await jimp.read(stdout);\n};\n\ncommands.getScreenshot = async function getScreenshot () {\n const apiLevel = await this.adb.getApiLevel();\n let image = null;\n if (apiLevel > 20) {\n try {\n // This screenshoting approach is way faster, since it requires less external commands\n // to be executed. Unfortunately, exec-out option is only supported by newer Android/SDK versions (5.0 and later)\n image = await this.getScreenshotDataWithAdbExecOut(this.adb);\n } catch (e) {\n this.log.info(`Cannot get screenshot data with 'adb exec-out' because of '${e.message}'. ` +\n `Defaulting to 'adb shell' call`);\n }\n }\n if (!image) {\n try {\n image = await this.getScreenshotDataWithAdbShell(this.adb, this.opts);\n } catch (e) {\n const err = `Cannot get screenshot data because of '${e.message}'. ` +\n `Make sure the 'LayoutParams.FLAG_SECURE' is not set for ` +\n `the current view`;\n this.log.errorAndThrow(err);\n }\n }\n if (apiLevel < 23) {\n // Android bug 8433742 - rotate screenshot if screen is rotated\n let screenOrientation = await this.adb.getScreenOrientation();\n try {\n image = await image.rotate(-90 * screenOrientation);\n } catch (err) {\n this.log.warn(`Could not rotate screenshot due to error: ${err}`);\n }\n }\n const getBuffer = B.promisify(image.getBuffer, {context: image});\n const imgBuffer = await getBuffer(jimp.MIME_PNG);\n return imgBuffer.toString('base64');\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
@@ -19,4 +19,4 @@ function requireArgs(argNames, opts = {}) {
19
19
  }
20
20
  return opts;
21
21
  }
22
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiQURCX1NIRUxMX0ZFQVRVUkUiLCJleHBvcnRzIiwicmVxdWlyZUFyZ3MiLCJhcmdOYW1lcyIsIm9wdHMiLCJhcmdOYW1lIiwiXyIsImlzQXJyYXkiLCJoYXMiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmV4cG9ydCBjb25zdCBBREJfU0hFTExfRkVBVFVSRSA9ICdhZGJfc2hlbGwnO1xuXG4vKipcbiAqIEFzc2VydCB0aGUgcHJlc2VuY2Ugb2YgcGFydGljdWxhciBrZXlzIGluIHRoZSBnaXZlbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSBhcmdOYW1lcyBvbmUgb3IgbW9yZSBrZXkgbmFtZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIHRoZSBvYmplY3QgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtPYmplY3R9IHRoZSBzYW1lIGdpdmVuIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUFyZ3MgKGFyZ05hbWVzLCBvcHRzID0ge30pIHtcbiAgZm9yIChjb25zdCBhcmdOYW1lIG9mIChfLmlzQXJyYXkoYXJnTmFtZXMpID8gYXJnTmFtZXMgOiBbYXJnTmFtZXNdKSkge1xuICAgIGlmICghXy5oYXMob3B0cywgYXJnTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCcke2FyZ05hbWV9JyBhcmd1bWVudCBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvcHRzO1xufSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRU8sTUFBTUUsaUJBQWlCLEdBQUcsV0FBVztBQUFDQyxPQUFBLENBQUFELGlCQUFBLEdBQUFBLGlCQUFBO0FBU3RDLFNBQVNFLFdBQVdBLENBQUVDLFFBQVEsRUFBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ2hELEtBQUssTUFBTUMsT0FBTyxJQUFLQyxlQUFDLENBQUNDLE9BQU8sQ0FBQ0osUUFBUSxDQUFDLEdBQUdBLFFBQVEsR0FBRyxDQUFDQSxRQUFRLENBQUMsRUFBRztJQUNuRSxJQUFJLENBQUNHLGVBQUMsQ0FBQ0UsR0FBRyxDQUFDSixJQUFJLEVBQUVDLE9BQU8sQ0FBQyxFQUFFO01BQ3pCLE1BQU0sSUFBSUksY0FBTSxDQUFDQyxvQkFBb0IsQ0FBRSxJQUFHTCxPQUFRLDZCQUE0QixDQUFDO0lBQ2pGO0VBQ0Y7RUFDQSxPQUFPRCxJQUFJO0FBQ2IifQ==
22
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiQURCX1NIRUxMX0ZFQVRVUkUiLCJleHBvcnRzIiwicmVxdWlyZUFyZ3MiLCJhcmdOYW1lcyIsIm9wdHMiLCJhcmdOYW1lIiwiXyIsImlzQXJyYXkiLCJoYXMiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmV4cG9ydCBjb25zdCBBREJfU0hFTExfRkVBVFVSRSA9ICdhZGJfc2hlbGwnO1xuXG4vKipcbiAqIEFzc2VydCB0aGUgcHJlc2VuY2Ugb2YgcGFydGljdWxhciBrZXlzIGluIHRoZSBnaXZlbiBvYmplY3RcbiAqXG4gKiBAdGVtcGxhdGUge09iamVjdH0gVFxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IGFyZ05hbWVzIG9uZSBvciBtb3JlIGtleSBuYW1lc1xuICogQHBhcmFtIHtUfSBvcHRzIHRoZSBvYmplY3QgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtUfSB0aGUgc2FtZSBnaXZlbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBcmdzIChhcmdOYW1lcywgb3B0cyA9IHt9KSB7XG4gIGZvciAoY29uc3QgYXJnTmFtZSBvZiAoXy5pc0FycmF5KGFyZ05hbWVzKSA/IGFyZ05hbWVzIDogW2FyZ05hbWVzXSkpIHtcbiAgICBpZiAoIV8uaGFzKG9wdHMsIGFyZ05hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAnJHthcmdOYW1lfScgYXJndW1lbnQgbXVzdCBiZSBwcm92aWRlZGApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0cztcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVPLE1BQU1FLGlCQUFpQixHQUFHLFdBQVc7QUFBQ0MsT0FBQSxDQUFBRCxpQkFBQSxHQUFBQSxpQkFBQTtBQVV0QyxTQUFTRSxXQUFXQSxDQUFFQyxRQUFRLEVBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUNoRCxLQUFLLE1BQU1DLE9BQU8sSUFBS0MsZUFBQyxDQUFDQyxPQUFPLENBQUNKLFFBQVEsQ0FBQyxHQUFHQSxRQUFRLEdBQUcsQ0FBQ0EsUUFBUSxDQUFDLEVBQUc7SUFDbkUsSUFBSSxDQUFDRyxlQUFDLENBQUNFLEdBQUcsQ0FBQ0osSUFBSSxFQUFFQyxPQUFPLENBQUMsRUFBRTtNQUN6QixNQUFNLElBQUlJLGNBQU0sQ0FBQ0Msb0JBQW9CLENBQUUsSUFBR0wsT0FBUSw2QkFBNEIsQ0FBQztJQUNqRjtFQUNGO0VBQ0EsT0FBT0QsSUFBSTtBQUNiIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["_lodash","_interopRequireDefault","require","_driver","ADB_SHELL_FEATURE","exports","requireArgs","argNames","opts","argName","_","isArray","has","errors","InvalidArgumentError"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nexport const ADB_SHELL_FEATURE = 'adb_shell';\n\n/**\n * Assert the presence of particular keys in the given object\n *\n * @param {string|Array<string>} argNames one or more key names\n * @param {Object} opts the object to check\n * @returns {Object} the same given object\n */\nexport function requireArgs (argNames, opts = {}) {\n for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {\n if (!_.has(opts, argName)) {\n throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);\n }\n }\n return opts;\n}"],"mappings":";;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEO,MAAME,iBAAiB,GAAG,WAAW;AAACC,OAAA,CAAAD,iBAAA,GAAAA,iBAAA;AAStC,SAASE,WAAWA,CAAEC,QAAQ,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAChD,KAAK,MAAMC,OAAO,IAAKC,eAAC,CAACC,OAAO,CAACJ,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC,EAAG;IACnE,IAAI,CAACG,eAAC,CAACE,GAAG,CAACJ,IAAI,EAAEC,OAAO,CAAC,EAAE;MACzB,MAAM,IAAII,cAAM,CAACC,oBAAoB,CAAE,IAAGL,OAAQ,6BAA4B,CAAC;IACjF;EACF;EACA,OAAOD,IAAI;AACb"}
1
+ {"version":3,"file":"utils.js","names":["_lodash","_interopRequireDefault","require","_driver","ADB_SHELL_FEATURE","exports","requireArgs","argNames","opts","argName","_","isArray","has","errors","InvalidArgumentError"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nexport const ADB_SHELL_FEATURE = 'adb_shell';\n\n/**\n * Assert the presence of particular keys in the given object\n *\n * @template {Object} T\n * @param {string|string[]} argNames one or more key names\n * @param {T} opts the object to check\n * @returns {T} the same given object\n */\nexport function requireArgs (argNames, opts = {}) {\n for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {\n if (!_.has(opts, argName)) {\n throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);\n }\n }\n return opts;\n}"],"mappings":";;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEO,MAAME,iBAAiB,GAAG,WAAW;AAACC,OAAA,CAAAD,iBAAA,GAAAA,iBAAA;AAUtC,SAASE,WAAWA,CAAEC,QAAQ,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAChD,KAAK,MAAMC,OAAO,IAAKC,eAAC,CAACC,OAAO,CAACJ,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC,EAAG;IACnE,IAAI,CAACG,eAAC,CAACE,GAAG,CAACJ,IAAI,EAAEC,OAAO,CAAC,EAAE;MACzB,MAAM,IAAII,cAAM,CAACC,oBAAoB,CAAE,IAAGL,OAAQ,6BAA4B,CAAC;IACjF;EACF;EACA,OAAOD,IAAI;AACb"}
@@ -4,6 +4,7 @@ import path from 'path';
4
4
  import B from 'bluebird';
5
5
  import jimp from 'jimp';
6
6
  import { exec } from 'teen_process';
7
+ import { requireArgs } from '../utils';
7
8
 
8
9
  const swipeStepsPerSec = 28;
9
10
  const dragStepsPerSec = 40;
@@ -152,6 +153,26 @@ commands.fingerprint = async function fingerprint (fingerprintId) {
152
153
  await this.adb.fingerprint(fingerprintId);
153
154
  };
154
155
 
156
+ /**
157
+ * @typedef {Object} FingerprintOpts
158
+ * @param {string|number} fingerprintId The value is the finger_id for the finger that
159
+ * was "scanned". It is a unique integer that you assign for each virtual fingerprint.
160
+ * When the app is running you can run this same command each time the
161
+ * emulator prompts you for a fingerprint, you can run the adb command and pass it
162
+ * the finger_id to simulate the fingerprint scan.
163
+ */
164
+
165
+ /**
166
+ * Emulate fingerprint on Android Emulator.
167
+ * Only works on API 23+
168
+ *
169
+ * @param {FingerprintOpts} opts
170
+ */
171
+ commands.mobileFingerprint = async function mobileFingerprint(opts = {}) {
172
+ const {fingerprintId} = requireArgs('fingerprintId', opts);
173
+ await this.fingerprint(fingerprintId);
174
+ };
175
+
155
176
  commands.sendSMS = async function sendSMS (phoneNumber, message) {
156
177
  if (!this.isEmulator()) {
157
178
  this.log.errorAndThrow('sendSMS method is only available for emulators');
@@ -159,6 +180,23 @@ commands.sendSMS = async function sendSMS (phoneNumber, message) {
159
180
  await this.adb.sendSMS(phoneNumber, message);
160
181
  };
161
182
 
183
+ /**
184
+ * @typedef {Object} SendSmsOptions
185
+ * @property {string} phoneNumber The phone number to send SMS to
186
+ * @property {string} message The message payload
187
+ */
188
+
189
+ /**
190
+ * Emulate sending an SMS to the given phone number.
191
+ * Only works on emulators.
192
+ *
193
+ * @param {SendSmsOptions} opts
194
+ */
195
+ commands.mobileSendSms = async function mobileSendSms(opts = {}) {
196
+ const {phoneNumber, message} = requireArgs(['phoneNumber', 'message'], opts);
197
+ await this.sendSMS(phoneNumber, message);
198
+ };
199
+
162
200
  commands.gsmCall = async function gsmCall (phoneNumber, action) {
163
201
  if (!this.isEmulator()) {
164
202
  this.log.errorAndThrow('gsmCall method is only available for emulators');
@@ -166,6 +204,23 @@ commands.gsmCall = async function gsmCall (phoneNumber, action) {
166
204
  await this.adb.gsmCall(phoneNumber, action);
167
205
  };
168
206
 
207
+ /**
208
+ * @typedef {Object} GsmCallOptions
209
+ * @property {string} phoneNumber The phone number to call to
210
+ * @property {call|accept|cancel|hold} action One of possible actions to take
211
+ */
212
+
213
+ /**
214
+ * Emulate a GSM call to the given phone number.
215
+ * Only works on emulators.
216
+ *
217
+ * @param {GsmCallOptions} opts
218
+ */
219
+ commands.mobileGsmCall = async function mobileGsmCall(opts = {}) {
220
+ const {phoneNumber, action} = requireArgs(['phoneNumber', 'action'], opts);
221
+ await this.gsmCall(phoneNumber, action);
222
+ };
223
+
169
224
  commands.gsmSignal = async function gsmSignal (signalStrengh) {
170
225
  if (!this.isEmulator()) {
171
226
  this.log.errorAndThrow('gsmSignal method is only available for emulators');
@@ -173,6 +228,22 @@ commands.gsmSignal = async function gsmSignal (signalStrengh) {
173
228
  await this.adb.gsmSignal(signalStrengh);
174
229
  };
175
230
 
231
+ /**
232
+ * @typedef {Object} GsmSignalOptions
233
+ * @property {0|1|2|3|4} strength One of possible signal strength values, where 4 is the best signal.
234
+ */
235
+
236
+ /**
237
+ * Emulate GSM signal strength change event.
238
+ * Only works on emulators.
239
+ *
240
+ * @param {GsmSignalOptions} opts
241
+ */
242
+ commands.mobileGsmSignal = async function mobileGsmSignal(opts = {}) {
243
+ const {strength} = requireArgs('strength', opts);
244
+ await this.gsmSignal(strength);
245
+ };
246
+
176
247
  commands.gsmVoice = async function gsmVoice (state) {
177
248
  if (!this.isEmulator()) {
178
249
  this.log.errorAndThrow('gsmVoice method is only available for emulators');
@@ -180,6 +251,22 @@ commands.gsmVoice = async function gsmVoice (state) {
180
251
  await this.adb.gsmVoice(state);
181
252
  };
182
253
 
254
+ /**
255
+ * @typedef {Object} GsmVoiceOptions
256
+ * @property {on|off} state
257
+ */
258
+
259
+ /**
260
+ * Emulate GSM voice state change event.
261
+ * Only works on emulators.
262
+ *
263
+ * @param {GsmVoiceOptions} opts
264
+ */
265
+ commands.mobileGsmVoice = async function mobileGsmVoice(opts = {}) {
266
+ const {state} = requireArgs('state', opts);
267
+ await this.gsmVoice(state);
268
+ };
269
+
183
270
  commands.powerAC = async function powerAC (state) {
184
271
  if (!this.isEmulator()) {
185
272
  this.log.errorAndThrow('powerAC method is only available for emulators');
@@ -187,6 +274,22 @@ commands.powerAC = async function powerAC (state) {
187
274
  await this.adb.powerAC(state);
188
275
  };
189
276
 
277
+ /**
278
+ * @typedef {Object} PowerAcOptions
279
+ * @property {on|off} state
280
+ */
281
+
282
+ /**
283
+ * Emulate AC power state change.
284
+ * Only works on emulators.
285
+ *
286
+ * @param {GsmVoiceOptions} opts
287
+ */
288
+ commands.mobilePowerAc = async function mobilePowerAc(opts = {}) {
289
+ const {state} = requireArgs('state', opts);
290
+ await this.powerAC(state);
291
+ };
292
+
190
293
  commands.powerCapacity = async function powerCapacity (batteryPercent) {
191
294
  if (!this.isEmulator()) {
192
295
  this.log.errorAndThrow('powerCapacity method is only available for emulators');
@@ -194,6 +297,22 @@ commands.powerCapacity = async function powerCapacity (batteryPercent) {
194
297
  await this.adb.powerCapacity(batteryPercent);
195
298
  };
196
299
 
300
+ /**
301
+ * @typedef {Object} PowerCapacityOptions
302
+ * @property {number} percent - Percentage value in range [0, 100]
303
+ */
304
+
305
+ /**
306
+ * Emulate power capacity change.
307
+ * Only works on emulators.
308
+ *
309
+ * @param {PowerCapacityOptions} opts
310
+ */
311
+ commands.mobilePowerCapacity = async function mobilePowerCapacity(opts = {}) {
312
+ const {percent} = requireArgs('percent', opts);
313
+ await this.powerCapacity(percent);
314
+ };
315
+
197
316
  commands.networkSpeed = async function networkSpeed (networkSpeed) {
198
317
  if (!this.isEmulator()) {
199
318
  this.log.errorAndThrow('networkSpeed method is only available for emulators');
@@ -201,6 +320,22 @@ commands.networkSpeed = async function networkSpeed (networkSpeed) {
201
320
  await this.adb.networkSpeed(networkSpeed);
202
321
  };
203
322
 
323
+ /**
324
+ * @typedef {Object} NetworkSpeedOptions
325
+ * @property {gsm|scsd|gprs|edge|umts|hsdpa|lte|evdo|full} speed
326
+ */
327
+
328
+ /**
329
+ * Emulate different network connection speed modes.
330
+ * Only works on emulators.
331
+ *
332
+ * @param {NetworkSpeedOptions} opts
333
+ */
334
+ commands.mobileNetworkSpeed = async function mobileNetworkSpeed(opts = {}) {
335
+ const {speed} = requireArgs('speed', opts);
336
+ await this.networkSpeed(speed);
337
+ };
338
+
204
339
  /**
205
340
  * Emulate sensors values on the connected emulator.
206
341
  *
package/lib/utils.js CHANGED
@@ -6,9 +6,10 @@ export const ADB_SHELL_FEATURE = 'adb_shell';
6
6
  /**
7
7
  * Assert the presence of particular keys in the given object
8
8
  *
9
- * @param {string|Array<string>} argNames one or more key names
10
- * @param {Object} opts the object to check
11
- * @returns {Object} the same given object
9
+ * @template {Object} T
10
+ * @param {string|string[]} argNames one or more key names
11
+ * @param {T} opts the object to check
12
+ * @returns {T} the same given object
12
13
  */
13
14
  export function requireArgs (argNames, opts = {}) {
14
15
  for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "mobile",
10
10
  "mobile testing"
11
11
  ],
12
- "version": "5.10.4",
12
+ "version": "5.11.0",
13
13
  "author": "Appium Contributors",
14
14
  "license": "Apache-2.0",
15
15
  "repository": {