appium-android-driver 5.4.3 → 5.4.4

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.
Files changed (67) hide show
  1. package/build/index.js +1 -9
  2. package/build/lib/android-helpers.js +10 -194
  3. package/build/lib/android-helpers.js.map +1 -1
  4. package/build/lib/bootstrap.js +4 -45
  5. package/build/lib/bootstrap.js.map +1 -1
  6. package/build/lib/commands/actions.js +3 -78
  7. package/build/lib/commands/actions.js.map +1 -1
  8. package/build/lib/commands/alert.js +3 -10
  9. package/build/lib/commands/alert.js.map +1 -1
  10. package/build/lib/commands/app-management.js +4 -32
  11. package/build/lib/commands/app-management.js.map +1 -1
  12. package/build/lib/commands/context.js +6 -78
  13. package/build/lib/commands/context.js.map +1 -1
  14. package/build/lib/commands/coverage.js +1 -6
  15. package/build/lib/commands/coverage.js.map +1 -1
  16. package/build/lib/commands/element.js +4 -47
  17. package/build/lib/commands/element.js.map +1 -1
  18. package/build/lib/commands/emu-console.js +2 -7
  19. package/build/lib/commands/emu-console.js.map +1 -1
  20. package/build/lib/commands/execute.js +1 -13
  21. package/build/lib/commands/execute.js.map +1 -1
  22. package/build/lib/commands/file-actions.js +3 -44
  23. package/build/lib/commands/file-actions.js.map +1 -1
  24. package/build/lib/commands/find.js +3 -16
  25. package/build/lib/commands/find.js.map +1 -1
  26. package/build/lib/commands/general.js +4 -78
  27. package/build/lib/commands/general.js.map +1 -1
  28. package/build/lib/commands/ime.js +3 -14
  29. package/build/lib/commands/ime.js.map +1 -1
  30. package/build/lib/commands/index.js +3 -27
  31. package/build/lib/commands/index.js.map +1 -1
  32. package/build/lib/commands/intent.js +1 -40
  33. package/build/lib/commands/intent.js.map +1 -1
  34. package/build/lib/commands/log.js +3 -35
  35. package/build/lib/commands/log.js.map +1 -1
  36. package/build/lib/commands/media-projection.js +2 -47
  37. package/build/lib/commands/media-projection.js.map +1 -1
  38. package/build/lib/commands/network.js +4 -40
  39. package/build/lib/commands/network.js.map +1 -1
  40. package/build/lib/commands/performance.js +5 -57
  41. package/build/lib/commands/performance.js.map +1 -1
  42. package/build/lib/commands/recordscreen.js +1 -59
  43. package/build/lib/commands/recordscreen.js.map +1 -1
  44. package/build/lib/commands/shell.js +1 -15
  45. package/build/lib/commands/shell.js.map +1 -1
  46. package/build/lib/commands/streamscreen.js +7 -74
  47. package/build/lib/commands/streamscreen.js.map +1 -1
  48. package/build/lib/commands/system-bars.js +1 -23
  49. package/build/lib/commands/system-bars.js.map +1 -1
  50. package/build/lib/commands/touch.js +13 -79
  51. package/build/lib/commands/touch.js.map +1 -1
  52. package/build/lib/desired-caps.js +3 -4
  53. package/build/lib/desired-caps.js.map +1 -1
  54. package/build/lib/driver.js +8 -97
  55. package/build/lib/driver.js.map +1 -1
  56. package/build/lib/logger.js +1 -5
  57. package/build/lib/logger.js.map +1 -1
  58. package/build/lib/uiautomator.js +3 -24
  59. package/build/lib/uiautomator.js.map +1 -1
  60. package/build/lib/unlock-helpers.js +1 -61
  61. package/build/lib/unlock-helpers.js.map +1 -1
  62. package/build/lib/utils.js +1 -7
  63. package/build/lib/utils.js.map +1 -1
  64. package/build/lib/webview-helpers.js +1 -94
  65. package/build/lib/webview-helpers.js.map +1 -1
  66. package/lib/android-helpers.js +2 -1
  67. package/package.json +1 -1
@@ -1,50 +1,35 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.helpers = exports.default = exports.commands = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _lodash = _interopRequireDefault(require("lodash"));
13
-
14
10
  var _androidHelpers = _interopRequireDefault(require("../android-helpers"));
15
-
16
11
  var _bluebird = _interopRequireDefault(require("bluebird"));
17
-
18
12
  var _driver = require("appium/driver");
19
-
20
13
  var _asyncbox = require("asyncbox");
21
-
22
14
  var _support = require("appium/support");
23
-
24
15
  let commands = {},
25
- helpers = {},
26
- extensions = {};
16
+ helpers = {},
17
+ extensions = {};
27
18
  exports.helpers = helpers;
28
19
  exports.commands = commands;
29
-
30
20
  function getCoordDefault(val) {
31
21
  return _support.util.hasValue(val) ? val : 0.5;
32
22
  }
33
-
34
23
  function getSwipeTouchDuration(waitGesture) {
35
24
  let duration = 0.8;
36
-
37
25
  if (typeof waitGesture.options.ms !== 'undefined' && waitGesture.options.ms) {
38
26
  duration = waitGesture.options.ms / 1000;
39
-
40
27
  if (duration === 0) {
41
28
  duration = 0.1;
42
29
  }
43
30
  }
44
-
45
31
  return duration;
46
32
  }
47
-
48
33
  commands.doTouchAction = async function doTouchAction(action, opts = {}) {
49
34
  const {
50
35
  element,
@@ -54,30 +39,22 @@ commands.doTouchAction = async function doTouchAction(action, opts = {}) {
54
39
  ms,
55
40
  duration
56
41
  } = opts;
57
-
58
42
  switch (action) {
59
43
  case 'tap':
60
44
  return await this.tap(null, x, y, count);
61
-
62
45
  case 'press':
63
46
  return await this.touchDown(null, x, y);
64
-
65
47
  case 'release':
66
48
  return await this.touchUp(element, x, y);
67
-
68
49
  case 'moveTo':
69
50
  return await this.touchMove(null, x, y);
70
-
71
51
  case 'wait':
72
52
  return await _bluebird.default.delay(ms);
73
-
74
53
  case 'longPress':
75
54
  return await this.touchLongClick(null, x, y, duration || 1000);
76
-
77
55
  case 'cancel':
78
56
  this.log.warn('Cancel action currently has no effect');
79
57
  break;
80
-
81
58
  default:
82
59
  this.log.errorAndThrow(`unknown action ${action}`);
83
60
  }
@@ -87,10 +64,9 @@ helpers.doTouchDrag = async function doTouchDrag(gestures) {
87
64
  let longPress = gestures[0];
88
65
  let moveTo = gestures[1];
89
66
  let startX = longPress.options.x || 0,
90
- startY = longPress.options.y || 0,
91
- endX = moveTo.options.x || 0,
92
- endY = moveTo.options.y || 0;
93
-
67
+ startY = longPress.options.y || 0,
68
+ endX = moveTo.options.x || 0,
69
+ endY = moveTo.options.y || 0;
94
70
  if (longPress.options.element) {
95
71
  let {
96
72
  x,
@@ -99,7 +75,6 @@ helpers.doTouchDrag = async function doTouchDrag(gestures) {
99
75
  startX += x || 0;
100
76
  startY += y || 0;
101
77
  }
102
-
103
78
  if (moveTo.options.element) {
104
79
  let {
105
80
  x,
@@ -108,10 +83,8 @@ helpers.doTouchDrag = async function doTouchDrag(gestures) {
108
83
  endX += x || 0;
109
84
  endY += y || 0;
110
85
  }
111
-
112
86
  let apiLevel = await this.adb.getApiLevel();
113
87
  let duration = apiLevel >= 5 ? 2 : 1;
114
-
115
88
  if (longPress.options && longPress.options.duration) {
116
89
  duration = Math.max(longPress.options.duration / 1000, duration);
117
90
  }
@@ -121,31 +94,23 @@ helpers.doTouchDrag = async function doTouchDrag(gestures) {
121
94
 
122
95
  helpers.fixRelease = async function fixRelease(gestures) {
123
96
  let release = _lodash.default.last(gestures);
124
-
125
97
  release.options = release.options || {};
126
-
127
98
  if (release.options.element || release.options.x && release.options.y) {
128
99
  return;
129
100
  }
130
-
131
101
  gestures = _lodash.default.clone(gestures);
132
102
  let ref = null;
133
-
134
103
  for (let gesture of gestures.reverse()) {
135
104
  let opts = gesture.options;
136
-
137
105
  if (opts.element || opts.x && opts.y) {
138
106
  ref = gesture;
139
107
  break;
140
108
  }
141
109
  }
142
-
143
110
  if (ref) {
144
111
  let opts = ref.options;
145
-
146
112
  if (opts.element) {
147
113
  let loc = await this.getLocationInView(opts.element);
148
-
149
114
  if (opts.x && opts.y) {
150
115
  release.options = {
151
116
  x: loc.x + opts.x,
@@ -162,7 +127,6 @@ helpers.fixRelease = async function fixRelease(gestures) {
162
127
  release.options = _lodash.default.pick(opts, 'x', 'y');
163
128
  }
164
129
  }
165
-
166
130
  return release;
167
131
  };
168
132
 
@@ -175,19 +139,17 @@ helpers.performGesture = async function performGesture(gesture) {
175
139
  this.log.debug(`retrying release without element opts: ${gesture.options}.`);
176
140
  return await this.doTouchAction(gesture.action, gesture.options || {});
177
141
  }
178
-
179
142
  throw e;
180
143
  }
181
144
  };
182
-
183
145
  commands.getSwipeOptions = async function getSwipeOptions(gestures, touchCount = 1) {
184
146
  let startX = getCoordDefault(gestures[0].options.x),
185
- startY = getCoordDefault(gestures[0].options.y),
186
- endX = getCoordDefault(gestures[2].options.x),
187
- endY = getCoordDefault(gestures[2].options.y),
188
- duration = getSwipeTouchDuration(gestures[1]),
189
- element = gestures[0].options.element,
190
- destElement = gestures[2].options.element || gestures[0].options.element;
147
+ startY = getCoordDefault(gestures[0].options.y),
148
+ endX = getCoordDefault(gestures[2].options.x),
149
+ endY = getCoordDefault(gestures[2].options.y),
150
+ duration = getSwipeTouchDuration(gestures[1]),
151
+ element = gestures[0].options.element,
152
+ destElement = gestures[2].options.element || gestures[0].options.element;
191
153
 
192
154
  if (_support.util.hasValue(destElement)) {
193
155
  let locResult = await this.getLocationInView(destElement);
@@ -196,14 +158,12 @@ commands.getSwipeOptions = async function getSwipeOptions(gestures, touchCount =
196
158
  let offsetY = Math.abs(endY) < 1 && Math.abs(endY) > 0 ? sizeResult.height * endY : endY;
197
159
  endX = locResult.x + offsetX;
198
160
  endY = locResult.y + offsetY;
199
-
200
161
  if (_support.util.hasValue(element)) {
201
162
  let firstElLocation = await this.getLocationInView(element);
202
163
  endX -= firstElLocation.x;
203
164
  endY -= firstElLocation.y;
204
165
  }
205
166
  }
206
-
207
167
  return {
208
168
  startX,
209
169
  startY,
@@ -214,15 +174,12 @@ commands.getSwipeOptions = async function getSwipeOptions(gestures, touchCount =
214
174
  element
215
175
  };
216
176
  };
217
-
218
177
  commands.performTouch = async function performTouch(gestures) {
219
178
  if (gestures.length === 4 && gestures[0].action === 'press' && gestures[1].action === 'wait' && gestures[2].action === 'moveTo' && gestures[3].action === 'release') {
220
179
  let swipeOpts = await this.getSwipeOptions(gestures);
221
180
  return await this.swipe(swipeOpts.startX, swipeOpts.startY, swipeOpts.endX, swipeOpts.endY, swipeOpts.duration, swipeOpts.touchCount, swipeOpts.element);
222
181
  }
223
-
224
182
  let actions = _lodash.default.map(gestures, 'action');
225
-
226
183
  if (actions[0] === 'longPress' && actions[1] === 'moveTo' && actions[2] === 'release') {
227
184
  return await this.doTouchDrag(gestures);
228
185
  } else {
@@ -251,34 +208,26 @@ commands.performTouch = async function performTouch(gestures) {
251
208
  gestures = [press, wait, ...gestures];
252
209
  }
253
210
  }
254
-
255
211
  let fixedGestures = await this.parseTouch(gestures, false);
256
-
257
212
  if (actions[actions.length - 1] === 'release') {
258
213
  actions[actions.length - 1] = await this.fixRelease(gestures);
259
214
  }
260
-
261
215
  for (let g of fixedGestures) {
262
216
  await this.performGesture(g);
263
217
  }
264
218
  }
265
219
  };
266
-
267
220
  helpers.parseTouch = async function parseTouch(gestures, multi) {
268
221
  if (multi && _lodash.default.last(gestures).action === 'release') {
269
222
  gestures.pop();
270
223
  }
271
-
272
224
  let touchStateObjects = await (0, _asyncbox.asyncmap)(gestures, async gesture => {
273
225
  let options = gesture.options || {};
274
-
275
226
  if (_lodash.default.includes(['press', 'moveTo', 'tap', 'longPress'], gesture.action)) {
276
227
  options.offset = false;
277
228
  let elementId = gesture.options.element;
278
-
279
229
  if (elementId) {
280
230
  let pos = await this.getLocationInView(elementId);
281
-
282
231
  if (gesture.options.x || gesture.options.y) {
283
232
  options.x = pos.x + (gesture.options.x || 0);
284
233
  options.y = pos.y + (gesture.options.y || 0);
@@ -290,7 +239,6 @@ helpers.parseTouch = async function parseTouch(gestures, multi) {
290
239
  options.x = pos.x + width / 2;
291
240
  options.y = pos.y + height / 2;
292
241
  }
293
-
294
242
  let touchStateObject = {
295
243
  action: gesture.action,
296
244
  options,
@@ -309,12 +257,10 @@ helpers.parseTouch = async function parseTouch(gestures, multi) {
309
257
  }
310
258
  } else {
311
259
  let offset = 0.005;
312
-
313
260
  if (gesture.action === 'wait') {
314
261
  options = gesture.options;
315
262
  offset = parseInt(gesture.options.ms, 10) / 1000;
316
263
  }
317
-
318
264
  let touchStateObject = {
319
265
  action: gesture.action,
320
266
  options,
@@ -324,25 +270,20 @@ helpers.parseTouch = async function parseTouch(gestures, multi) {
324
270
  }
325
271
  }, false);
326
272
  let prevPos = null,
327
- time = 0;
328
-
273
+ time = 0;
329
274
  for (let state of touchStateObjects) {
330
275
  if (_lodash.default.isUndefined(state.options.x) && _lodash.default.isUndefined(state.options.y) && prevPos !== null) {
331
276
  state.options.x = prevPos.x;
332
277
  state.options.y = prevPos.y;
333
278
  }
334
-
335
279
  if (state.options.offset && prevPos) {
336
280
  state.options.x += prevPos.x;
337
281
  state.options.y += prevPos.y;
338
282
  }
339
-
340
283
  delete state.options.offset;
341
-
342
284
  if (!_lodash.default.isUndefined(state.options.x) && !_lodash.default.isUndefined(state.options.y)) {
343
285
  prevPos = state.options;
344
286
  }
345
-
346
287
  if (multi) {
347
288
  let timeOffset = state.timeOffset;
348
289
  time += timeOffset;
@@ -354,28 +295,22 @@ helpers.parseTouch = async function parseTouch(gestures, multi) {
354
295
  y: state.options.y
355
296
  };
356
297
  }
357
-
358
298
  delete state.options;
359
299
  }
360
-
361
300
  delete state.timeOffset;
362
301
  }
363
-
364
302
  return touchStateObjects;
365
303
  };
366
-
367
304
  commands.performMultiAction = async function performMultiAction(actions, elementId) {
368
305
  if (actions.length === 1) {
369
306
  throw new Error('Multi Pointer Gestures need at least two actions. ' + 'Use Touch Actions for a single action.');
370
307
  }
371
-
372
308
  const states = await (0, _asyncbox.asyncmap)(actions, async action => await this.parseTouch(action, true), false);
373
309
  return await this.doPerformMultiAction(elementId, states);
374
310
  };
375
311
 
376
312
  commands.doPerformMultiAction = async function doPerformMultiAction(elementId, states) {
377
313
  let opts;
378
-
379
314
  if (elementId) {
380
315
  opts = {
381
316
  elementId,
@@ -389,8 +324,7 @@ commands.doPerformMultiAction = async function doPerformMultiAction(elementId, s
389
324
  return await this.bootstrap.sendAction('performMultiPointerGesture', opts);
390
325
  }
391
326
  };
392
-
393
327
  Object.assign(extensions, commands, helpers);
394
328
  var _default = extensions;
395
329
  exports.default = _default;
396
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZ2V0Q29vcmREZWZhdWx0IiwidmFsIiwidXRpbCIsImhhc1ZhbHVlIiwiZ2V0U3dpcGVUb3VjaER1cmF0aW9uIiwid2FpdEdlc3R1cmUiLCJkdXJhdGlvbiIsIm9wdGlvbnMiLCJtcyIsImRvVG91Y2hBY3Rpb24iLCJhY3Rpb24iLCJvcHRzIiwiZWxlbWVudCIsIngiLCJ5IiwiY291bnQiLCJ0YXAiLCJ0b3VjaERvd24iLCJ0b3VjaFVwIiwidG91Y2hNb3ZlIiwiQiIsImRlbGF5IiwidG91Y2hMb25nQ2xpY2siLCJsb2ciLCJ3YXJuIiwiZXJyb3JBbmRUaHJvdyIsImRvVG91Y2hEcmFnIiwiZ2VzdHVyZXMiLCJsb25nUHJlc3MiLCJtb3ZlVG8iLCJzdGFydFgiLCJzdGFydFkiLCJlbmRYIiwiZW5kWSIsImdldExvY2F0aW9uSW5WaWV3IiwiYXBpTGV2ZWwiLCJhZGIiLCJnZXRBcGlMZXZlbCIsIk1hdGgiLCJtYXgiLCJkcmFnIiwiZml4UmVsZWFzZSIsInJlbGVhc2UiLCJfIiwibGFzdCIsImNsb25lIiwicmVmIiwiZ2VzdHVyZSIsInJldmVyc2UiLCJsb2MiLCJzaXplIiwiZ2V0U2l6ZSIsIndpZHRoIiwiaGVpZ2h0IiwicGljayIsInBlcmZvcm1HZXN0dXJlIiwiZSIsImlzRXJyb3JUeXBlIiwiZXJyb3JzIiwiTm9TdWNoRWxlbWVudEVycm9yIiwiZGVidWciLCJnZXRTd2lwZU9wdGlvbnMiLCJ0b3VjaENvdW50IiwiZGVzdEVsZW1lbnQiLCJsb2NSZXN1bHQiLCJzaXplUmVzdWx0Iiwib2Zmc2V0WCIsImFicyIsIm9mZnNldFkiLCJmaXJzdEVsTG9jYXRpb24iLCJwZXJmb3JtVG91Y2giLCJsZW5ndGgiLCJzd2lwZU9wdHMiLCJzd2lwZSIsImFjdGlvbnMiLCJtYXAiLCJoZWFkIiwicG9wIiwic2xpY2UiLCJwcmVzcyIsInNoaWZ0Iiwid2FpdCIsImZpeGVkR2VzdHVyZXMiLCJwYXJzZVRvdWNoIiwiZyIsIm11bHRpIiwidG91Y2hTdGF0ZU9iamVjdHMiLCJhc3luY21hcCIsImluY2x1ZGVzIiwib2Zmc2V0IiwiZWxlbWVudElkIiwicG9zIiwidG91Y2hTdGF0ZU9iamVjdCIsInRpbWVPZmZzZXQiLCJwYXJzZUludCIsInByZXZQb3MiLCJ0aW1lIiwic3RhdGUiLCJpc1VuZGVmaW5lZCIsImFuZHJvaWRIZWxwZXJzIiwidHJ1bmNhdGVEZWNpbWFscyIsInRvdWNoIiwicGVyZm9ybU11bHRpQWN0aW9uIiwiRXJyb3IiLCJzdGF0ZXMiLCJkb1BlcmZvcm1NdWx0aUFjdGlvbiIsImJvb3RzdHJhcCIsInNlbmRBY3Rpb24iLCJPYmplY3QiLCJhc3NpZ24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvdG91Y2guanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhbmRyb2lkSGVscGVycyBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgZXJyb3JzLCBpc0Vycm9yVHlwZSB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHsgYXN5bmNtYXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmZ1bmN0aW9uIGdldENvb3JkRGVmYXVsdCAodmFsKSB7XG4gIC8vIGdvaW5nIHRoZSBsb25nIHdheSBhbmQgY2hlY2tpbmcgZm9yIHVuZGVmaW5lZCBhbmQgbnVsbCBzaW5jZVxuICAvLyB3ZSBjYW4ndCBiZSBhc3N1cmVkIGBlbElkYCBpcyBhIHN0cmluZyBhbmQgbm90IGFuIGludC4gU2FtZVxuICAvLyB0aGluZyB3aXRoIGRlc3RFbGVtZW50IGJlbG93LlxuICByZXR1cm4gdXRpbC5oYXNWYWx1ZSh2YWwpID8gdmFsIDogMC41O1xufVxuXG5mdW5jdGlvbiBnZXRTd2lwZVRvdWNoRHVyYXRpb24gKHdhaXRHZXN0dXJlKSB7XG4gIC8vIHRoZSB0b3VjaCBhY3Rpb24gYXBpIHVzZXMgbXMsIHdlIHdhbnQgc2Vjb25kc1xuICAvLyAwLjggaXMgdGhlIGRlZmF1bHQgdGltZSBmb3IgdGhlIG9wZXJhdGlvblxuICBsZXQgZHVyYXRpb24gPSAwLjg7XG4gIGlmICh0eXBlb2Ygd2FpdEdlc3R1cmUub3B0aW9ucy5tcyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2FpdEdlc3R1cmUub3B0aW9ucy5tcykge1xuICAgIGR1cmF0aW9uID0gd2FpdEdlc3R1cmUub3B0aW9ucy5tcyAvIDEwMDA7XG4gICAgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgICAvLyBzZXQgdG8gYSB2ZXJ5IGxvdyBudW1iZXIsIHNpbmNlIHRoZXkgd2FudGVkIGl0IGZhc3RcbiAgICAgIC8vIGJ1dCBiZWxvdyAwLjEgYmVjb21lcyAwIHN0ZXBzLCB3aGljaCBjYXVzZXMgZXJyb3JzXG4gICAgICBkdXJhdGlvbiA9IDAuMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGR1cmF0aW9uO1xufVxuXG5jb21tYW5kcy5kb1RvdWNoQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gZG9Ub3VjaEFjdGlvbiAoYWN0aW9uLCBvcHRzID0ge30pIHtcbiAgY29uc3QgeyBlbGVtZW50LCB4LCB5LCBjb3VudCwgbXMsIGR1cmF0aW9uIH0gPSBvcHRzO1xuICAvLyBwYXJzZVRvdWNoIHByZWNhbGN1bGF0ZXMgYWJzb2x1dGUgZWxlbWVudCBwb3NpdGlvbnNcbiAgLy8gc28gdGhlcmUgaXMgbm8gbmVlZCB0byBwYXNzIGBlbGVtZW50YCB0byB0aGUgYWZmZWN0ZWQgZ2VzdHVyZXNcbiAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICBjYXNlICd0YXAnOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudGFwKG51bGwsIHgsIHksIGNvdW50KTtcbiAgICBjYXNlICdwcmVzcyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50b3VjaERvd24obnVsbCwgeCwgeSk7XG4gICAgY2FzZSAncmVsZWFzZSc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50b3VjaFVwKGVsZW1lbnQsIHgsIHkpO1xuICAgIGNhc2UgJ21vdmVUbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50b3VjaE1vdmUobnVsbCwgeCwgeSk7XG4gICAgY2FzZSAnd2FpdCc6XG4gICAgICByZXR1cm4gYXdhaXQgQi5kZWxheShtcyk7XG4gICAgY2FzZSAnbG9uZ1ByZXNzJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRvdWNoTG9uZ0NsaWNrKG51bGwsIHgsIHksIGR1cmF0aW9uIHx8IDEwMDApO1xuICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgICAvLyBUT0RPOiBjbGFyaWZ5IGJlaGF2aW9yIG9mICdjYW5jZWwnIGFjdGlvbiBhbmQgZml4IHRoaXNcbiAgICAgIHRoaXMubG9nLndhcm4oJ0NhbmNlbCBhY3Rpb24gY3VycmVudGx5IGhhcyBubyBlZmZlY3QnKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGB1bmtub3duIGFjdGlvbiAke2FjdGlvbn1gKTtcbiAgfVxufTtcblxuLy8gZHJhZyBpcyAqbm90KiBwcmVzcy1tb3ZlLXJlbGVhc2UsIHNvIHdlIG5lZWQgdG8gdHJhbnNsYXRlXG4vLyBkcmFnIHdvcmtzIGZpbmUgZm9yIHNjcm9sbCwgYXMgd2VsbFxuaGVscGVycy5kb1RvdWNoRHJhZyA9IGFzeW5jIGZ1bmN0aW9uIGRvVG91Y2hEcmFnIChnZXN0dXJlcykge1xuICBsZXQgbG9uZ1ByZXNzID0gZ2VzdHVyZXNbMF07XG4gIGxldCBtb3ZlVG8gPSBnZXN0dXJlc1sxXTtcbiAgbGV0IHN0YXJ0WCA9IGxvbmdQcmVzcy5vcHRpb25zLnggfHwgMCxcbiAgICAgIHN0YXJ0WSA9IGxvbmdQcmVzcy5vcHRpb25zLnkgfHwgMCxcbiAgICAgIGVuZFggPSBtb3ZlVG8ub3B0aW9ucy54IHx8IDAsXG4gICAgICBlbmRZID0gbW92ZVRvLm9wdGlvbnMueSB8fCAwO1xuICBpZiAobG9uZ1ByZXNzLm9wdGlvbnMuZWxlbWVudCkge1xuICAgIGxldCB7eCwgeX0gPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uSW5WaWV3KGxvbmdQcmVzcy5vcHRpb25zLmVsZW1lbnQpO1xuICAgIHN0YXJ0WCArPSB4IHx8IDA7XG4gICAgc3RhcnRZICs9IHkgfHwgMDtcbiAgfVxuICBpZiAobW92ZVRvLm9wdGlvbnMuZWxlbWVudCkge1xuICAgIGxldCB7eCwgeX0gPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uSW5WaWV3KG1vdmVUby5vcHRpb25zLmVsZW1lbnQpO1xuICAgIGVuZFggKz0geCB8fCAwO1xuICAgIGVuZFkgKz0geSB8fCAwO1xuICB9XG5cbiAgbGV0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgLy8gbG9sbGlwb3AgdGFrZXMgYSBsaXR0bGUgbG9uZ2VyIHRvIGdldCB0aGluZ3Mgcm9sbGluZ1xuICBsZXQgZHVyYXRpb24gPSBhcGlMZXZlbCA+PSA1ID8gMiA6IDE7XG4gIC8vIG1ha2Ugc3VyZSB0aGF0IGlmIHRoZSBsb25nIHByZXNzIGhhcyBhIGR1cmF0aW9uLCB3ZSB1c2UgaXQuXG4gIGlmIChsb25nUHJlc3Mub3B0aW9ucyAmJiBsb25nUHJlc3Mub3B0aW9ucy5kdXJhdGlvbikge1xuICAgIGR1cmF0aW9uID0gTWF0aC5tYXgobG9uZ1ByZXNzLm9wdGlvbnMuZHVyYXRpb24gLyAxMDAwLCBkdXJhdGlvbik7XG4gIH1cblxuICAvLyBgZHJhZ2Agd2lsbCB0YWtlIGNhcmUgb2Ygd2hldGhlciB0aGVyZSBpcyBhbiBlbGVtZW50IG9yIG5vdCBhdCB0aGF0IGxldmVsXG4gIHJldHVybiBhd2FpdCB0aGlzLmRyYWcoc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCAxLCBsb25nUHJlc3Mub3B0aW9ucy5lbGVtZW50LCBtb3ZlVG8ub3B0aW9ucy5lbGVtZW50KTtcbn07XG5cbi8vIFJlbGVhc2UgZ2VzdHVyZSBuZWVkcyBlbGVtZW50IG9yIGNvLW9yZGluYXRlcyB0byByZWxlYXNlIGl0IGZyb20gdGhhdCBwb3NpdGlvblxuLy8gb3IgZWxzZSByZWxlYXNlIGdlc3R1cmUgaXMgcGVyZm9ybWVkIGZyb20gY2VudGVyIG9mIHRoZSBzY3JlZW4sIHNvIHRvIGZpeCBpdFxuLy8gVGhpcyBtZXRob2Qgc2V0cyBjby1vcmRpbmF0ZXMvZWxlbWVudCB0byByZWxlYXNlIGdlc3R1cmUgaWYgaXQgaGFzIG5vIG9wdGlvbnMgc2V0IGFscmVhZHkuXG5oZWxwZXJzLmZpeFJlbGVhc2UgPSBhc3luYyBmdW5jdGlvbiBmaXhSZWxlYXNlIChnZXN0dXJlcykge1xuICBsZXQgcmVsZWFzZSA9IF8ubGFzdChnZXN0dXJlcyk7XG4gIC8vIHNvbWV0aW1lcyB0aGVyZSBhcmUgbm8gb3B0aW9uc1xuICByZWxlYXNlLm9wdGlvbnMgPSByZWxlYXNlLm9wdGlvbnMgfHwge307XG4gIC8vIG5vdGhpbmcgdG8gZG8gaWYgcmVsZWFzZSBvcHRpb25zIGFyZSBhbHJlYWR5IHNldFxuICBpZiAocmVsZWFzZS5vcHRpb25zLmVsZW1lbnQgfHwgKHJlbGVhc2Uub3B0aW9ucy54ICYmIHJlbGVhc2Uub3B0aW9ucy55KSkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyB3aXRob3V0IGNvb3JkaW5hdGVzLCBgcmVsZWFzZWAgdXNlcyB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4sIHdoaWNoLFxuICAvLyBnZW5lcmFsbHkgc3BlYWtpbmcsIGlzIG5vdCB3aGF0IHdlIHdhbnRcbiAgLy8gdGhlcmVmb3JlOiBsb29wIGJhY2t3YXJkcyBhbmQgdXNlIHRoZSBsYXN0IGNvbW1hbmQgd2l0aCBhbiBlbGVtZW50IGFuZC9vclxuICAvLyBvZmZzZXQgY29vcmRpbmF0ZXNcbiAgZ2VzdHVyZXMgPSBfLmNsb25lKGdlc3R1cmVzKTtcbiAgbGV0IHJlZiA9IG51bGw7XG4gIGZvciAobGV0IGdlc3R1cmUgb2YgZ2VzdHVyZXMucmV2ZXJzZSgpKSB7XG4gICAgbGV0IG9wdHMgPSBnZXN0dXJlLm9wdGlvbnM7XG4gICAgaWYgKG9wdHMuZWxlbWVudCB8fCAob3B0cy54ICYmIG9wdHMueSkpIHtcbiAgICAgIHJlZiA9IGdlc3R1cmU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHJlZikge1xuICAgIGxldCBvcHRzID0gcmVmLm9wdGlvbnM7XG4gICAgaWYgKG9wdHMuZWxlbWVudCkge1xuICAgICAgbGV0IGxvYyA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcob3B0cy5lbGVtZW50KTtcbiAgICAgIGlmIChvcHRzLnggJiYgb3B0cy55KSB7XG4gICAgICAgIC8vIHRoaXMgaXMgYW4gb2Zmc2V0IGZyb20gdGhlIGVsZW1lbnRcbiAgICAgICAgcmVsZWFzZS5vcHRpb25zID0ge1xuICAgICAgICAgIHg6IGxvYy54ICsgb3B0cy54LFxuICAgICAgICAgIHk6IGxvYy55ICsgb3B0cy55XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSBjZW50ZXIgb2YgdGhlIGVsZW1lbnRcbiAgICAgICAgbGV0IHNpemUgPSBhd2FpdCB0aGlzLmdldFNpemUob3B0cy5lbGVtZW50KTtcbiAgICAgICAgcmVsZWFzZS5vcHRpb25zID0ge1xuICAgICAgICAgIHg6IGxvYy54ICsgc2l6ZS53aWR0aCAvIDIsXG4gICAgICAgICAgeTogbG9jLnkgKyBzaXplLmhlaWdodCAvIDJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVsZWFzZS5vcHRpb25zID0gXy5waWNrKG9wdHMsICd4JywgJ3knKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlbGVhc2U7XG59O1xuXG4vLyBQZXJmb3JtIG9uZSBnZXN0dXJlXG5oZWxwZXJzLnBlcmZvcm1HZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gcGVyZm9ybUdlc3R1cmUgKGdlc3R1cmUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5kb1RvdWNoQWN0aW9uKGdlc3R1cmUuYWN0aW9uLCBnZXN0dXJlLm9wdGlvbnMgfHwge30pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gc29tZXRpbWUgdGhlIGVsZW1lbnQgaXMgbm90IGF2YWlsYWJsZSB3aGVuIHJlbGVhc2luZywgcmV0cnkgd2l0aG91dCBpdFxuICAgIGlmIChpc0Vycm9yVHlwZShlLCBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKSAmJiBnZXN0dXJlLmFjdGlvbiA9PT0gJ3JlbGVhc2UnICYmXG4gICAgICAgIGdlc3R1cmUub3B0aW9ucy5lbGVtZW50KSB7XG4gICAgICBkZWxldGUgZ2VzdHVyZS5vcHRpb25zLmVsZW1lbnQ7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgcmV0cnlpbmcgcmVsZWFzZSB3aXRob3V0IGVsZW1lbnQgb3B0czogJHtnZXN0dXJlLm9wdGlvbnN9LmApO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZG9Ub3VjaEFjdGlvbihnZXN0dXJlLmFjdGlvbiwgZ2VzdHVyZS5vcHRpb25zIHx8IHt9KTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcblxuY29tbWFuZHMuZ2V0U3dpcGVPcHRpb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0U3dpcGVPcHRpb25zIChnZXN0dXJlcywgdG91Y2hDb3VudCA9IDEpIHtcbiAgbGV0IHN0YXJ0WCA9IGdldENvb3JkRGVmYXVsdChnZXN0dXJlc1swXS5vcHRpb25zLngpLFxuICAgICAgc3RhcnRZID0gZ2V0Q29vcmREZWZhdWx0KGdlc3R1cmVzWzBdLm9wdGlvbnMueSksXG4gICAgICBlbmRYID0gZ2V0Q29vcmREZWZhdWx0KGdlc3R1cmVzWzJdLm9wdGlvbnMueCksXG4gICAgICBlbmRZID0gZ2V0Q29vcmREZWZhdWx0KGdlc3R1cmVzWzJdLm9wdGlvbnMueSksXG4gICAgICBkdXJhdGlvbiA9IGdldFN3aXBlVG91Y2hEdXJhdGlvbihnZXN0dXJlc1sxXSksXG4gICAgICBlbGVtZW50ID0gZ2VzdHVyZXNbMF0ub3B0aW9ucy5lbGVtZW50LFxuICAgICAgZGVzdEVsZW1lbnQgPSBnZXN0dXJlc1syXS5vcHRpb25zLmVsZW1lbnQgfHwgZ2VzdHVyZXNbMF0ub3B0aW9ucy5lbGVtZW50O1xuXG4gIC8vIHRoZXJlJ3Mgbm8gZGVzdGluYXRpb24gZWxlbWVudCBoYW5kbGluZyBpbiBib290c3RyYXAgYW5kIHNpbmNlIGl0IGFwcGxpZXMgdG8gYWxsIHBsYXRmb3Jtcywgd2UgaGFuZGxlIGl0IGhlcmVcbiAgaWYgKHV0aWwuaGFzVmFsdWUoZGVzdEVsZW1lbnQpKSB7XG4gICAgbGV0IGxvY1Jlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcoZGVzdEVsZW1lbnQpO1xuICAgIGxldCBzaXplUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTaXplKGRlc3RFbGVtZW50KTtcbiAgICBsZXQgb2Zmc2V0WCA9IChNYXRoLmFicyhlbmRYKSA8IDEgJiYgTWF0aC5hYnMoZW5kWCkgPiAwKSA/IHNpemVSZXN1bHQud2lkdGggKiBlbmRYIDogZW5kWDtcbiAgICBsZXQgb2Zmc2V0WSA9IChNYXRoLmFicyhlbmRZKSA8IDEgJiYgTWF0aC5hYnMoZW5kWSkgPiAwKSA/IHNpemVSZXN1bHQuaGVpZ2h0ICogZW5kWSA6IGVuZFk7XG4gICAgZW5kWCA9IGxvY1Jlc3VsdC54ICsgb2Zmc2V0WDtcbiAgICBlbmRZID0gbG9jUmVzdWx0LnkgKyBvZmZzZXRZO1xuICAgIC8vIGlmIHRoZSB0YXJnZXQgZWxlbWVudCB3YXMgcHJvdmlkZWQsIHRoZSBjb29yZGluYXRlcyBmb3IgdGhlIGRlc3RpbmF0aW9uIG5lZWQgdG8gYmUgcmVsYXRpdmUgdG8gaXQuXG4gICAgaWYgKHV0aWwuaGFzVmFsdWUoZWxlbWVudCkpIHtcbiAgICAgIGxldCBmaXJzdEVsTG9jYXRpb24gPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uSW5WaWV3KGVsZW1lbnQpO1xuICAgICAgZW5kWCAtPSBmaXJzdEVsTG9jYXRpb24ueDtcbiAgICAgIGVuZFkgLT0gZmlyc3RFbExvY2F0aW9uLnk7XG4gICAgfVxuICB9XG4gIC8vIGNsaWVudHMgYXJlIHJlc3BvbnNpYmxlIHRvIHVzZSB0aGVzZSBvcHRpb25zIGNvcnJlY3RseVxuICByZXR1cm4ge3N0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBkdXJhdGlvbiwgdG91Y2hDb3VudCwgZWxlbWVudH07XG59O1xuXG5jb21tYW5kcy5wZXJmb3JtVG91Y2ggPSBhc3luYyBmdW5jdGlvbiBwZXJmb3JtVG91Y2ggKGdlc3R1cmVzKSB7XG4gIC8vIHByZXNzLXdhaXQtbW92ZVRvLXJlbGVhc2UgaXMgYHN3aXBlYCwgc28gdXNlIG5hdGl2ZSBtZXRob2RcbiAgaWYgKGdlc3R1cmVzLmxlbmd0aCA9PT0gNCAmJlxuICAgICAgZ2VzdHVyZXNbMF0uYWN0aW9uID09PSAncHJlc3MnICYmXG4gICAgICBnZXN0dXJlc1sxXS5hY3Rpb24gPT09ICd3YWl0JyAmJlxuICAgICAgZ2VzdHVyZXNbMl0uYWN0aW9uID09PSAnbW92ZVRvJyAmJlxuICAgICAgZ2VzdHVyZXNbM10uYWN0aW9uID09PSAncmVsZWFzZScpIHtcblxuICAgIGxldCBzd2lwZU9wdHMgPSBhd2FpdCB0aGlzLmdldFN3aXBlT3B0aW9ucyhnZXN0dXJlcyk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3dpcGUoc3dpcGVPcHRzLnN0YXJ0WCwgc3dpcGVPcHRzLnN0YXJ0WSwgc3dpcGVPcHRzLmVuZFgsXG4gICAgICAgIHN3aXBlT3B0cy5lbmRZLCBzd2lwZU9wdHMuZHVyYXRpb24sIHN3aXBlT3B0cy50b3VjaENvdW50LFxuICAgICAgICBzd2lwZU9wdHMuZWxlbWVudCk7XG4gIH1cbiAgbGV0IGFjdGlvbnMgPSBfLm1hcChnZXN0dXJlcywgJ2FjdGlvbicpO1xuXG4gIGlmIChhY3Rpb25zWzBdID09PSAnbG9uZ1ByZXNzJyAmJiBhY3Rpb25zWzFdID09PSAnbW92ZVRvJyAmJiBhY3Rpb25zWzJdID09PSAncmVsZWFzZScpIHtcbiAgICAvLyBzb21lIHRoaW5ncyBhcmUgc3BlY2lhbFxuICAgIHJldHVybiBhd2FpdCB0aGlzLmRvVG91Y2hEcmFnKGdlc3R1cmVzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoYWN0aW9ucy5sZW5ndGggPT09IDIpIHtcbiAgICAgIC8vIGBwcmVzc2Agd2l0aG91dCBhIHdhaXQgaXMgdG9vIHNsb3cgYW5kIGdldHMgaW50ZXJwcmV0dGVkIGFzIGEgYGxvbmdQcmVzc2BcbiAgICAgIGlmIChfLmhlYWQoYWN0aW9ucykgPT09ICdwcmVzcycgJiYgXy5sYXN0KGFjdGlvbnMpID09PSAncmVsZWFzZScpIHtcbiAgICAgICAgYWN0aW9uc1swXSA9ICd0YXAnO1xuICAgICAgICBnZXN0dXJlc1swXS5hY3Rpb24gPSAndGFwJztcbiAgICAgIH1cblxuICAgICAgLy8gdGhlIGBsb25nUHJlc3NgIGFuZCBgdGFwYCBtZXRob2RzIHJlbGVhc2Ugb24gdGhlaXIgb3duXG4gICAgICBpZiAoKF8uaGVhZChhY3Rpb25zKSA9PT0gJ3RhcCcgfHwgXy5oZWFkKGFjdGlvbnMpID09PSAnbG9uZ1ByZXNzJykgJiYgXy5sYXN0KGFjdGlvbnMpID09PSAncmVsZWFzZScpIHtcbiAgICAgICAgZ2VzdHVyZXMucG9wKCk7XG4gICAgICAgIGFjdGlvbnMucG9wKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGxvbmdwcmVzcyBmb2xsb3dlZCBieSBhbnl0aGluZyBvdGhlciB0aGFuIHJlbGVhc2Ugc2hvdWxkIGJlY29tZSBhIHByZXNzIGFuZCB3YWl0XG4gICAgICBpZiAoYWN0aW9uc1swXSA9PT0gJ2xvbmdQcmVzcycpIHtcbiAgICAgICAgYWN0aW9ucyA9IFsncHJlc3MnLCAnd2FpdCcsIC4uLmFjdGlvbnMuc2xpY2UoMSldO1xuXG4gICAgICAgIGxldCBwcmVzcyA9IGdlc3R1cmVzLnNoaWZ0KCk7XG4gICAgICAgIHByZXNzLmFjdGlvbiA9ICdwcmVzcyc7XG4gICAgICAgIGxldCB3YWl0ID0ge1xuICAgICAgICAgIGFjdGlvbjogJ3dhaXQnLFxuICAgICAgICAgIG9wdGlvbnM6IHttczogcHJlc3Mub3B0aW9ucy5kdXJhdGlvbiB8fCAxMDAwfVxuICAgICAgICB9O1xuICAgICAgICBkZWxldGUgcHJlc3Mub3B0aW9ucy5kdXJhdGlvbjtcbiAgICAgICAgZ2VzdHVyZXMgPSBbcHJlc3MsIHdhaXQsIC4uLmdlc3R1cmVzXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZml4ZWRHZXN0dXJlcyA9IGF3YWl0IHRoaXMucGFyc2VUb3VjaChnZXN0dXJlcywgZmFsc2UpO1xuICAgIC8vIGZpeCByZWxlYXNlIGFjdGlvbiB0aGVuIHBlcmZvcm0gYWxsIGFjdGlvbnNcbiAgICBpZiAoYWN0aW9uc1thY3Rpb25zLmxlbmd0aCAtIDFdID09PSAncmVsZWFzZScpIHtcbiAgICAgIGFjdGlvbnNbYWN0aW9ucy5sZW5ndGggLSAxXSA9IGF3YWl0IHRoaXMuZml4UmVsZWFzZShnZXN0dXJlcyk7XG4gICAgfVxuICAgIGZvciAobGV0IGcgb2YgZml4ZWRHZXN0dXJlcykge1xuICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtR2VzdHVyZShnKTtcbiAgICB9XG4gIH1cbn07XG5cbmhlbHBlcnMucGFyc2VUb3VjaCA9IGFzeW5jIGZ1bmN0aW9uIHBhcnNlVG91Y2ggKGdlc3R1cmVzLCBtdWx0aSkge1xuICAvLyBiZWNhdXNlIG11bHRpLXRvdWNoIHJlbGVhc2VzIGF0IHRoZSBlbmQgYnkgZGVmYXVsdFxuICBpZiAobXVsdGkgJiYgXy5sYXN0KGdlc3R1cmVzKS5hY3Rpb24gPT09ICdyZWxlYXNlJykge1xuICAgIGdlc3R1cmVzLnBvcCgpO1xuICB9XG5cbiAgbGV0IHRvdWNoU3RhdGVPYmplY3RzID0gYXdhaXQgYXN5bmNtYXAoZ2VzdHVyZXMsIGFzeW5jIChnZXN0dXJlKSA9PiB7XG4gICAgbGV0IG9wdGlvbnMgPSBnZXN0dXJlLm9wdGlvbnMgfHwge307XG4gICAgaWYgKF8uaW5jbHVkZXMoWydwcmVzcycsICdtb3ZlVG8nLCAndGFwJywgJ2xvbmdQcmVzcyddLCBnZXN0dXJlLmFjdGlvbikpIHtcbiAgICAgIG9wdGlvbnMub2Zmc2V0ID0gZmFsc2U7XG4gICAgICBsZXQgZWxlbWVudElkID0gZ2VzdHVyZS5vcHRpb25zLmVsZW1lbnQ7XG4gICAgICBpZiAoZWxlbWVudElkKSB7XG4gICAgICAgIGxldCBwb3MgPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uSW5WaWV3KGVsZW1lbnRJZCk7XG4gICAgICAgIGlmIChnZXN0dXJlLm9wdGlvbnMueCB8fCBnZXN0dXJlLm9wdGlvbnMueSkge1xuICAgICAgICAgIG9wdGlvbnMueCA9IHBvcy54ICsgKGdlc3R1cmUub3B0aW9ucy54IHx8IDApO1xuICAgICAgICAgIG9wdGlvbnMueSA9IHBvcy55ICsgKGdlc3R1cmUub3B0aW9ucy55IHx8IDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZ2V0U2l6ZShlbGVtZW50SWQpO1xuICAgICAgICAgIG9wdGlvbnMueCA9IHBvcy54ICsgKHdpZHRoIC8gMik7XG4gICAgICAgICAgb3B0aW9ucy55ID0gcG9zLnkgKyAoaGVpZ2h0IC8gMik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRvdWNoU3RhdGVPYmplY3QgPSB7XG4gICAgICAgICAgYWN0aW9uOiBnZXN0dXJlLmFjdGlvbixcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHRpbWVPZmZzZXQ6IDAuMDA1LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdG91Y2hTdGF0ZU9iamVjdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMueCA9IChnZXN0dXJlLm9wdGlvbnMueCB8fCAwKTtcbiAgICAgICAgb3B0aW9ucy55ID0gKGdlc3R1cmUub3B0aW9ucy55IHx8IDApO1xuXG4gICAgICAgIGxldCB0b3VjaFN0YXRlT2JqZWN0ID0ge1xuICAgICAgICAgIGFjdGlvbjogZ2VzdHVyZS5hY3Rpb24sXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICB0aW1lT2Zmc2V0OiAwLjAwNSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRvdWNoU3RhdGVPYmplY3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBvZmZzZXQgPSAwLjAwNTtcbiAgICAgIGlmIChnZXN0dXJlLmFjdGlvbiA9PT0gJ3dhaXQnKSB7XG4gICAgICAgIG9wdGlvbnMgPSBnZXN0dXJlLm9wdGlvbnM7XG4gICAgICAgIG9mZnNldCA9IChwYXJzZUludChnZXN0dXJlLm9wdGlvbnMubXMsIDEwKSAvIDEwMDApO1xuICAgICAgfVxuICAgICAgbGV0IHRvdWNoU3RhdGVPYmplY3QgPSB7XG4gICAgICAgIGFjdGlvbjogZ2VzdHVyZS5hY3Rpb24sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHRpbWVPZmZzZXQ6IG9mZnNldCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gdG91Y2hTdGF0ZU9iamVjdDtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbiAgLy8gd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHRpbWUgKHdoaWNoIGlzIG5vdyBhbiBvZmZzZXQpXG4gIC8vIGFuZCB0aGUgcG9zaXRpb24gKHdoaWNoIG1heSBiZSBhbiBvZmZzZXQpXG4gIGxldCBwcmV2UG9zID0gbnVsbCxcbiAgICAgIHRpbWUgPSAwO1xuICBmb3IgKGxldCBzdGF0ZSBvZiB0b3VjaFN0YXRlT2JqZWN0cykge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHN0YXRlLm9wdGlvbnMueCkgJiYgXy5pc1VuZGVmaW5lZChzdGF0ZS5vcHRpb25zLnkpICYmIHByZXZQb3MgIT09IG51bGwpIHtcbiAgICAgIC8vIHRoaXMgaGFwcGVucyB3aXRoIHdhaXRcbiAgICAgIHN0YXRlLm9wdGlvbnMueCA9IHByZXZQb3MueDtcbiAgICAgIHN0YXRlLm9wdGlvbnMueSA9IHByZXZQb3MueTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLm9wdGlvbnMub2Zmc2V0ICYmIHByZXZQb3MpIHtcbiAgICAgIC8vIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGFuIG9mZnNldFxuICAgICAgc3RhdGUub3B0aW9ucy54ICs9IHByZXZQb3MueDtcbiAgICAgIHN0YXRlLm9wdGlvbnMueSArPSBwcmV2UG9zLnk7XG4gICAgfVxuICAgIGRlbGV0ZSBzdGF0ZS5vcHRpb25zLm9mZnNldDtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoc3RhdGUub3B0aW9ucy54KSAmJiAhXy5pc1VuZGVmaW5lZChzdGF0ZS5vcHRpb25zLnkpKSB7XG4gICAgICBwcmV2UG9zID0gc3RhdGUub3B0aW9ucztcbiAgICB9XG5cbiAgICBpZiAobXVsdGkpIHtcbiAgICAgIGxldCB0aW1lT2Zmc2V0ID0gc3RhdGUudGltZU9mZnNldDtcbiAgICAgIHRpbWUgKz0gdGltZU9mZnNldDtcbiAgICAgIHN0YXRlLnRpbWUgPSBhbmRyb2lkSGVscGVycy50cnVuY2F0ZURlY2ltYWxzKHRpbWUsIDMpO1xuXG4gICAgICAvLyBtdWx0aSBnZXN0dXJlcyByZXF1aXJlICd0b3VjaCcgcmF0aGVyIHRoYW4gJ29wdGlvbnMnXG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQoc3RhdGUub3B0aW9ucy54KSAmJiAhXy5pc1VuZGVmaW5lZChzdGF0ZS5vcHRpb25zLnkpKSB7XG4gICAgICAgIHN0YXRlLnRvdWNoID0ge1xuICAgICAgICAgIHg6IHN0YXRlLm9wdGlvbnMueCxcbiAgICAgICAgICB5OiBzdGF0ZS5vcHRpb25zLnlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBzdGF0ZS5vcHRpb25zO1xuICAgIH1cbiAgICBkZWxldGUgc3RhdGUudGltZU9mZnNldDtcbiAgfVxuICByZXR1cm4gdG91Y2hTdGF0ZU9iamVjdHM7XG59O1xuXG5cbmNvbW1hbmRzLnBlcmZvcm1NdWx0aUFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1NdWx0aUFjdGlvbiAoYWN0aW9ucywgZWxlbWVudElkKSB7XG4gIC8vIEFuZHJvaWQgbmVlZHMgYXQgbGVhc3QgdHdvIGFjdGlvbnMgdG8gYmUgYWJsZSB0byBwZXJmb3JtIGEgbXVsdGkgcG9pbnRlciBnZXN0dXJlXG4gIGlmIChhY3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTXVsdGkgUG9pbnRlciBHZXN0dXJlcyBuZWVkIGF0IGxlYXN0IHR3byBhY3Rpb25zLiAnICtcbiAgICAgICAgJ1VzZSBUb3VjaCBBY3Rpb25zIGZvciBhIHNpbmdsZSBhY3Rpb24uJyk7XG4gIH1cblxuICBjb25zdCBzdGF0ZXMgPSBhd2FpdCBhc3luY21hcChhY3Rpb25zLCBhc3luYyAoYWN0aW9uKSA9PiBhd2FpdCB0aGlzLnBhcnNlVG91Y2goYWN0aW9uLCB0cnVlKSwgZmFsc2UpO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLmRvUGVyZm9ybU11bHRpQWN0aW9uKGVsZW1lbnRJZCwgc3RhdGVzKTtcbn07XG5cbi8qKlxuICogUmVhc29uIGZvciBpc29sYXRpbmcgZG9QZXJmb3JtTXVsdGlBY3Rpb24gZnJvbSBwZXJmb3JtTXVsdGlBY3Rpb24gaXMgZm9yIHJldXNpbmcgcGVyZm9ybU11bHRpQWN0aW9uXG4gKiBhY3Jvc3MgYW5kcm9pZC1kcml2ZXJzIChsaWtlIGFwcGl1bS11aWF1dG9tYXRvcjItZHJpdmVyKSBhbmQgdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbi5cbiAqIE90aGVyIGFuZHJvaWQtZHJpdmVycyAobGlrZSBhcHBpdW0tdWlhdXRvbWF0b3IyLWRyaXZlcikgbmVlZCB0byBvdmVycmlkZSBkb1BlcmZvcm1NdWx0aUFjdGlvblxuICogdG8gZmFjaWxpdGF0ZSBwZXJmb3JtTXVsdGlBY3Rpb24uXG4gKi9cbmNvbW1hbmRzLmRvUGVyZm9ybU11bHRpQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gZG9QZXJmb3JtTXVsdGlBY3Rpb24gKGVsZW1lbnRJZCwgc3RhdGVzKSB7XG4gIGxldCBvcHRzO1xuICBpZiAoZWxlbWVudElkKSB7XG4gICAgb3B0cyA9IHtcbiAgICAgIGVsZW1lbnRJZCxcbiAgICAgIGFjdGlvbnM6IHN0YXRlc1xuICAgIH07XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6cGVyZm9ybU11bHRpUG9pbnRlckdlc3R1cmUnLCBvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICBvcHRzID0ge1xuICAgICAgYWN0aW9uczogc3RhdGVzXG4gICAgfTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbigncGVyZm9ybU11bHRpUG9pbnRlckdlc3R1cmUnLCBvcHRzKTtcbiAgfVxufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQgeyBjb21tYW5kcywgaGVscGVycyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxJQUFJQSxRQUFRLEdBQUcsRUFBZjtBQUFBLElBQW1CQyxPQUFPLEdBQUcsRUFBN0I7QUFBQSxJQUFpQ0MsVUFBVSxHQUFHLEVBQTlDOzs7O0FBRUEsU0FBU0MsZUFBVCxDQUEwQkMsR0FBMUIsRUFBK0I7RUFJN0IsT0FBT0MsYUFBQSxDQUFLQyxRQUFMLENBQWNGLEdBQWQsSUFBcUJBLEdBQXJCLEdBQTJCLEdBQWxDO0FBQ0Q7O0FBRUQsU0FBU0cscUJBQVQsQ0FBZ0NDLFdBQWhDLEVBQTZDO0VBRzNDLElBQUlDLFFBQVEsR0FBRyxHQUFmOztFQUNBLElBQUksT0FBT0QsV0FBVyxDQUFDRSxPQUFaLENBQW9CQyxFQUEzQixLQUFrQyxXQUFsQyxJQUFpREgsV0FBVyxDQUFDRSxPQUFaLENBQW9CQyxFQUF6RSxFQUE2RTtJQUMzRUYsUUFBUSxHQUFHRCxXQUFXLENBQUNFLE9BQVosQ0FBb0JDLEVBQXBCLEdBQXlCLElBQXBDOztJQUNBLElBQUlGLFFBQVEsS0FBSyxDQUFqQixFQUFv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
330
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZ2V0Q29vcmREZWZhdWx0IiwidmFsIiwidXRpbCIsImhhc1ZhbHVlIiwiZ2V0U3dpcGVUb3VjaER1cmF0aW9uIiwid2FpdEdlc3R1cmUiLCJkdXJhdGlvbiIsIm9wdGlvbnMiLCJtcyIsImRvVG91Y2hBY3Rpb24iLCJhY3Rpb24iLCJvcHRzIiwiZWxlbWVudCIsIngiLCJ5IiwiY291bnQiLCJ0YXAiLCJ0b3VjaERvd24iLCJ0b3VjaFVwIiwidG91Y2hNb3ZlIiwiQiIsImRlbGF5IiwidG91Y2hMb25nQ2xpY2siLCJsb2ciLCJ3YXJuIiwiZXJyb3JBbmRUaHJvdyIsImRvVG91Y2hEcmFnIiwiZ2VzdHVyZXMiLCJsb25nUHJlc3MiLCJtb3ZlVG8iLCJzdGFydFgiLCJzdGFydFkiLCJlbmRYIiwiZW5kWSIsImdldExvY2F0aW9uSW5WaWV3IiwiYXBpTGV2ZWwiLCJhZGIiLCJnZXRBcGlMZXZlbCIsIk1hdGgiLCJtYXgiLCJkcmFnIiwiZml4UmVsZWFzZSIsInJlbGVhc2UiLCJfIiwibGFzdCIsImNsb25lIiwicmVmIiwiZ2VzdHVyZSIsInJldmVyc2UiLCJsb2MiLCJzaXplIiwiZ2V0U2l6ZSIsIndpZHRoIiwiaGVpZ2h0IiwicGljayIsInBlcmZvcm1HZXN0dXJlIiwiZSIsImlzRXJyb3JUeXBlIiwiZXJyb3JzIiwiTm9TdWNoRWxlbWVudEVycm9yIiwiZGVidWciLCJnZXRTd2lwZU9wdGlvbnMiLCJ0b3VjaENvdW50IiwiZGVzdEVsZW1lbnQiLCJsb2NSZXN1bHQiLCJzaXplUmVzdWx0Iiwib2Zmc2V0WCIsImFicyIsIm9mZnNldFkiLCJmaXJzdEVsTG9jYXRpb24iLCJwZXJmb3JtVG91Y2giLCJsZW5ndGgiLCJzd2lwZU9wdHMiLCJzd2lwZSIsImFjdGlvbnMiLCJtYXAiLCJoZWFkIiwicG9wIiwic2xpY2UiLCJwcmVzcyIsInNoaWZ0Iiwid2FpdCIsImZpeGVkR2VzdHVyZXMiLCJwYXJzZVRvdWNoIiwiZyIsIm11bHRpIiwidG91Y2hTdGF0ZU9iamVjdHMiLCJhc3luY21hcCIsImluY2x1ZGVzIiwib2Zmc2V0IiwiZWxlbWVudElkIiwicG9zIiwidG91Y2hTdGF0ZU9iamVjdCIsInRpbWVPZmZzZXQiLCJwYXJzZUludCIsInByZXZQb3MiLCJ0aW1lIiwic3RhdGUiLCJpc1VuZGVmaW5lZCIsImFuZHJvaWRIZWxwZXJzIiwidHJ1bmNhdGVEZWNpbWFscyIsInRvdWNoIiwicGVyZm9ybU11bHRpQWN0aW9uIiwiRXJyb3IiLCJzdGF0ZXMiLCJkb1BlcmZvcm1NdWx0aUFjdGlvbiIsImJvb3RzdHJhcCIsInNlbmRBY3Rpb24iLCJPYmplY3QiLCJhc3NpZ24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvdG91Y2guanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhbmRyb2lkSGVscGVycyBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgZXJyb3JzLCBpc0Vycm9yVHlwZSB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHsgYXN5bmNtYXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmZ1bmN0aW9uIGdldENvb3JkRGVmYXVsdCAodmFsKSB7XG4gIC8vIGdvaW5nIHRoZSBsb25nIHdheSBhbmQgY2hlY2tpbmcgZm9yIHVuZGVmaW5lZCBhbmQgbnVsbCBzaW5jZVxuICAvLyB3ZSBjYW4ndCBiZSBhc3N1cmVkIGBlbElkYCBpcyBhIHN0cmluZyBhbmQgbm90IGFuIGludC4gU2FtZVxuICAvLyB0aGluZyB3aXRoIGRlc3RFbGVtZW50IGJlbG93LlxuICByZXR1cm4gdXRpbC5oYXNWYWx1ZSh2YWwpID8gdmFsIDogMC41O1xufVxuXG5mdW5jdGlvbiBnZXRTd2lwZVRvdWNoRHVyYXRpb24gKHdhaXRHZXN0dXJlKSB7XG4gIC8vIHRoZSB0b3VjaCBhY3Rpb24gYXBpIHVzZXMgbXMsIHdlIHdhbnQgc2Vjb25kc1xuICAvLyAwLjggaXMgdGhlIGRlZmF1bHQgdGltZSBmb3IgdGhlIG9wZXJhdGlvblxuICBsZXQgZHVyYXRpb24gPSAwLjg7XG4gIGlmICh0eXBlb2Ygd2FpdEdlc3R1cmUub3B0aW9ucy5tcyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2FpdEdlc3R1cmUub3B0aW9ucy5tcykge1xuICAgIGR1cmF0aW9uID0gd2FpdEdlc3R1cmUub3B0aW9ucy5tcyAvIDEwMDA7XG4gICAgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgICAvLyBzZXQgdG8gYSB2ZXJ5IGxvdyBudW1iZXIsIHNpbmNlIHRoZXkgd2FudGVkIGl0IGZhc3RcbiAgICAgIC8vIGJ1dCBiZWxvdyAwLjEgYmVjb21lcyAwIHN0ZXBzLCB3aGljaCBjYXVzZXMgZXJyb3JzXG4gICAgICBkdXJhdGlvbiA9IDAuMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGR1cmF0aW9uO1xufVxuXG5jb21tYW5kcy5kb1RvdWNoQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gZG9Ub3VjaEFjdGlvbiAoYWN0aW9uLCBvcHRzID0ge30pIHtcbiAgY29uc3QgeyBlbGVtZW50LCB4LCB5LCBjb3VudCwgbXMsIGR1cmF0aW9uIH0gPSBvcHRzO1xuICAvLyBwYXJzZVRvdWNoIHByZWNhbGN1bGF0ZXMgYWJzb2x1dGUgZWxlbWVudCBwb3NpdGlvbnNcbiAgLy8gc28gdGhlcmUgaXMgbm8gbmVlZCB0byBwYXNzIGBlbGVtZW50YCB0byB0aGUgYWZmZWN0ZWQgZ2VzdHVyZXNcbiAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICBjYXNlICd0YXAnOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudGFwKG51bGwsIHgsIHksIGNvdW50KTtcbiAgICBjYXNlICdwcmVzcyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50b3VjaERvd24obnVsbCwgeCwgeSk7XG4gICAgY2FzZSAncmVsZWFzZSc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50b3VjaFVwKGVsZW1lbnQsIHgsIHkpO1xuICAgIGNhc2UgJ21vdmVUbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50b3VjaE1vdmUobnVsbCwgeCwgeSk7XG4gICAgY2FzZSAnd2FpdCc6XG4gICAgICByZXR1cm4gYXdhaXQgQi5kZWxheShtcyk7XG4gICAgY2FzZSAnbG9uZ1ByZXNzJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRvdWNoTG9uZ0NsaWNrKG51bGwsIHgsIHksIGR1cmF0aW9uIHx8IDEwMDApO1xuICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgICAvLyBUT0RPOiBjbGFyaWZ5IGJlaGF2aW9yIG9mICdjYW5jZWwnIGFjdGlvbiBhbmQgZml4IHRoaXNcbiAgICAgIHRoaXMubG9nLndhcm4oJ0NhbmNlbCBhY3Rpb24gY3VycmVudGx5IGhhcyBubyBlZmZlY3QnKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGB1bmtub3duIGFjdGlvbiAke2FjdGlvbn1gKTtcbiAgfVxufTtcblxuLy8gZHJhZyBpcyAqbm90KiBwcmVzcy1tb3ZlLXJlbGVhc2UsIHNvIHdlIG5lZWQgdG8gdHJhbnNsYXRlXG4vLyBkcmFnIHdvcmtzIGZpbmUgZm9yIHNjcm9sbCwgYXMgd2VsbFxuaGVscGVycy5kb1RvdWNoRHJhZyA9IGFzeW5jIGZ1bmN0aW9uIGRvVG91Y2hEcmFnIChnZXN0dXJlcykge1xuICBsZXQgbG9uZ1ByZXNzID0gZ2VzdHVyZXNbMF07XG4gIGxldCBtb3ZlVG8gPSBnZXN0dXJlc1sxXTtcbiAgbGV0IHN0YXJ0WCA9IGxvbmdQcmVzcy5vcHRpb25zLnggfHwgMCxcbiAgICAgIHN0YXJ0WSA9IGxvbmdQcmVzcy5vcHRpb25zLnkgfHwgMCxcbiAgICAgIGVuZFggPSBtb3ZlVG8ub3B0aW9ucy54IHx8IDAsXG4gICAgICBlbmRZID0gbW92ZVRvLm9wdGlvbnMueSB8fCAwO1xuICBpZiAobG9uZ1ByZXNzLm9wdGlvbnMuZWxlbWVudCkge1xuICAgIGxldCB7eCwgeX0gPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uSW5WaWV3KGxvbmdQcmVzcy5vcHRpb25zLmVsZW1lbnQpO1xuICAgIHN0YXJ0WCArPSB4IHx8IDA7XG4gICAgc3RhcnRZICs9IHkgfHwgMDtcbiAgfVxuICBpZiAobW92ZVRvLm9wdGlvbnMuZWxlbWVudCkge1xuICAgIGxldCB7eCwgeX0gPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uSW5WaWV3KG1vdmVUby5vcHRpb25zLmVsZW1lbnQpO1xuICAgIGVuZFggKz0geCB8fCAwO1xuICAgIGVuZFkgKz0geSB8fCAwO1xuICB9XG5cbiAgbGV0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgLy8gbG9sbGlwb3AgdGFrZXMgYSBsaXR0bGUgbG9uZ2VyIHRvIGdldCB0aGluZ3Mgcm9sbGluZ1xuICBsZXQgZHVyYXRpb24gPSBhcGlMZXZlbCA+PSA1ID8gMiA6IDE7XG4gIC8vIG1ha2Ugc3VyZSB0aGF0IGlmIHRoZSBsb25nIHByZXNzIGhhcyBhIGR1cmF0aW9uLCB3ZSB1c2UgaXQuXG4gIGlmIChsb25nUHJlc3Mub3B0aW9ucyAmJiBsb25nUHJlc3Mub3B0aW9ucy5kdXJhdGlvbikge1xuICAgIGR1cmF0aW9uID0gTWF0aC5tYXgobG9uZ1ByZXNzLm9wdGlvbnMuZHVyYXRpb24gLyAxMDAwLCBkdXJhdGlvbik7XG4gIH1cblxuICAvLyBgZHJhZ2Agd2lsbCB0YWtlIGNhcmUgb2Ygd2hldGhlciB0aGVyZSBpcyBhbiBlbGVtZW50IG9yIG5vdCBhdCB0aGF0IGxldmVsXG4gIHJldHVybiBhd2FpdCB0aGlzLmRyYWcoc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCAxLCBsb25nUHJlc3Mub3B0aW9ucy5lbGVtZW50LCBtb3ZlVG8ub3B0aW9ucy5lbGVtZW50KTtcbn07XG5cbi8vIFJlbGVhc2UgZ2VzdHVyZSBuZWVkcyBlbGVtZW50IG9yIGNvLW9yZGluYXRlcyB0byByZWxlYXNlIGl0IGZyb20gdGhhdCBwb3NpdGlvblxuLy8gb3IgZWxzZSByZWxlYXNlIGdlc3R1cmUgaXMgcGVyZm9ybWVkIGZyb20gY2VudGVyIG9mIHRoZSBzY3JlZW4sIHNvIHRvIGZpeCBpdFxuLy8gVGhpcyBtZXRob2Qgc2V0cyBjby1vcmRpbmF0ZXMvZWxlbWVudCB0byByZWxlYXNlIGdlc3R1cmUgaWYgaXQgaGFzIG5vIG9wdGlvbnMgc2V0IGFscmVhZHkuXG5oZWxwZXJzLmZpeFJlbGVhc2UgPSBhc3luYyBmdW5jdGlvbiBmaXhSZWxlYXNlIChnZXN0dXJlcykge1xuICBsZXQgcmVsZWFzZSA9IF8ubGFzdChnZXN0dXJlcyk7XG4gIC8vIHNvbWV0aW1lcyB0aGVyZSBhcmUgbm8gb3B0aW9uc1xuICByZWxlYXNlLm9wdGlvbnMgPSByZWxlYXNlLm9wdGlvbnMgfHwge307XG4gIC8vIG5vdGhpbmcgdG8gZG8gaWYgcmVsZWFzZSBvcHRpb25zIGFyZSBhbHJlYWR5IHNldFxuICBpZiAocmVsZWFzZS5vcHRpb25zLmVsZW1lbnQgfHwgKHJlbGVhc2Uub3B0aW9ucy54ICYmIHJlbGVhc2Uub3B0aW9ucy55KSkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyB3aXRob3V0IGNvb3JkaW5hdGVzLCBgcmVsZWFzZWAgdXNlcyB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4sIHdoaWNoLFxuICAvLyBnZW5lcmFsbHkgc3BlYWtpbmcsIGlzIG5vdCB3aGF0IHdlIHdhbnRcbiAgLy8gdGhlcmVmb3JlOiBsb29wIGJhY2t3YXJkcyBhbmQgdXNlIHRoZSBsYXN0IGNvbW1hbmQgd2l0aCBhbiBlbGVtZW50IGFuZC9vclxuICAvLyBvZmZzZXQgY29vcmRpbmF0ZXNcbiAgZ2VzdHVyZXMgPSBfLmNsb25lKGdlc3R1cmVzKTtcbiAgbGV0IHJlZiA9IG51bGw7XG4gIGZvciAobGV0IGdlc3R1cmUgb2YgZ2VzdHVyZXMucmV2ZXJzZSgpKSB7XG4gICAgbGV0IG9wdHMgPSBnZXN0dXJlLm9wdGlvbnM7XG4gICAgaWYgKG9wdHMuZWxlbWVudCB8fCAob3B0cy54ICYmIG9wdHMueSkpIHtcbiAgICAgIHJlZiA9IGdlc3R1cmU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHJlZikge1xuICAgIGxldCBvcHRzID0gcmVmLm9wdGlvbnM7XG4gICAgaWYgKG9wdHMuZWxlbWVudCkge1xuICAgICAgbGV0IGxvYyA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcob3B0cy5lbGVtZW50KTtcbiAgICAgIGlmIChvcHRzLnggJiYgb3B0cy55KSB7XG4gICAgICAgIC8vIHRoaXMgaXMgYW4gb2Zmc2V0IGZyb20gdGhlIGVsZW1lbnRcbiAgICAgICAgcmVsZWFzZS5vcHRpb25zID0ge1xuICAgICAgICAgIHg6IGxvYy54ICsgb3B0cy54LFxuICAgICAgICAgIHk6IGxvYy55ICsgb3B0cy55XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSBjZW50ZXIgb2YgdGhlIGVsZW1lbnRcbiAgICAgICAgbGV0IHNpemUgPSBhd2FpdCB0aGlzLmdldFNpemUob3B0cy5lbGVtZW50KTtcbiAgICAgICAgcmVsZWFzZS5vcHRpb25zID0ge1xuICAgICAgICAgIHg6IGxvYy54ICsgc2l6ZS53aWR0aCAvIDIsXG4gICAgICAgICAgeTogbG9jLnkgKyBzaXplLmhlaWdodCAvIDJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVsZWFzZS5vcHRpb25zID0gXy5waWNrKG9wdHMsICd4JywgJ3knKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlbGVhc2U7XG59O1xuXG4vLyBQZXJmb3JtIG9uZSBnZXN0dXJlXG5oZWxwZXJzLnBlcmZvcm1HZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gcGVyZm9ybUdlc3R1cmUgKGdlc3R1cmUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5kb1RvdWNoQWN0aW9uKGdlc3R1cmUuYWN0aW9uLCBnZXN0dXJlLm9wdGlvbnMgfHwge30pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gc29tZXRpbWUgdGhlIGVsZW1lbnQgaXMgbm90IGF2YWlsYWJsZSB3aGVuIHJlbGVhc2luZywgcmV0cnkgd2l0aG91dCBpdFxuICAgIGlmIChpc0Vycm9yVHlwZShlLCBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKSAmJiBnZXN0dXJlLmFjdGlvbiA9PT0gJ3JlbGVhc2UnICYmXG4gICAgICAgIGdlc3R1cmUub3B0aW9ucy5lbGVtZW50KSB7XG4gICAgICBkZWxldGUgZ2VzdHVyZS5vcHRpb25zLmVsZW1lbnQ7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgcmV0cnlpbmcgcmVsZWFzZSB3aXRob3V0IGVsZW1lbnQgb3B0czogJHtnZXN0dXJlLm9wdGlvbnN9LmApO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZG9Ub3VjaEFjdGlvbihnZXN0dXJlLmFjdGlvbiwgZ2VzdHVyZS5vcHRpb25zIHx8IHt9KTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcblxuY29tbWFuZHMuZ2V0U3dpcGVPcHRpb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0U3dpcGVPcHRpb25zIChnZXN0dXJlcywgdG91Y2hDb3VudCA9IDEpIHtcbiAgbGV0IHN0YXJ0WCA9IGdldENvb3JkRGVmYXVsdChnZXN0dXJlc1swXS5vcHRpb25zLngpLFxuICAgICAgc3RhcnRZID0gZ2V0Q29vcmREZWZhdWx0KGdlc3R1cmVzWzBdLm9wdGlvbnMueSksXG4gICAgICBlbmRYID0gZ2V0Q29vcmREZWZhdWx0KGdlc3R1cmVzWzJdLm9wdGlvbnMueCksXG4gICAgICBlbmRZID0gZ2V0Q29vcmREZWZhdWx0KGdlc3R1cmVzWzJdLm9wdGlvbnMueSksXG4gICAgICBkdXJhdGlvbiA9IGdldFN3aXBlVG91Y2hEdXJhdGlvbihnZXN0dXJlc1sxXSksXG4gICAgICBlbGVtZW50ID0gZ2VzdHVyZXNbMF0ub3B0aW9ucy5lbGVtZW50LFxuICAgICAgZGVzdEVsZW1lbnQgPSBnZXN0dXJlc1syXS5vcHRpb25zLmVsZW1lbnQgfHwgZ2VzdHVyZXNbMF0ub3B0aW9ucy5lbGVtZW50O1xuXG4gIC8vIHRoZXJlJ3Mgbm8gZGVzdGluYXRpb24gZWxlbWVudCBoYW5kbGluZyBpbiBib290c3RyYXAgYW5kIHNpbmNlIGl0IGFwcGxpZXMgdG8gYWxsIHBsYXRmb3Jtcywgd2UgaGFuZGxlIGl0IGhlcmVcbiAgaWYgKHV0aWwuaGFzVmFsdWUoZGVzdEVsZW1lbnQpKSB7XG4gICAgbGV0IGxvY1Jlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcoZGVzdEVsZW1lbnQpO1xuICAgIGxldCBzaXplUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTaXplKGRlc3RFbGVtZW50KTtcbiAgICBsZXQgb2Zmc2V0WCA9IChNYXRoLmFicyhlbmRYKSA8IDEgJiYgTWF0aC5hYnMoZW5kWCkgPiAwKSA/IHNpemVSZXN1bHQud2lkdGggKiBlbmRYIDogZW5kWDtcbiAgICBsZXQgb2Zmc2V0WSA9IChNYXRoLmFicyhlbmRZKSA8IDEgJiYgTWF0aC5hYnMoZW5kWSkgPiAwKSA/IHNpemVSZXN1bHQuaGVpZ2h0ICogZW5kWSA6IGVuZFk7XG4gICAgZW5kWCA9IGxvY1Jlc3VsdC54ICsgb2Zmc2V0WDtcbiAgICBlbmRZID0gbG9jUmVzdWx0LnkgKyBvZmZzZXRZO1xuICAgIC8vIGlmIHRoZSB0YXJnZXQgZWxlbWVudCB3YXMgcHJvdmlkZWQsIHRoZSBjb29yZGluYXRlcyBmb3IgdGhlIGRlc3RpbmF0aW9uIG5lZWQgdG8gYmUgcmVsYXRpdmUgdG8gaXQuXG4gICAgaWYgKHV0aWwuaGFzVmFsdWUoZWxlbWVudCkpIHtcbiAgICAgIGxldCBmaXJzdEVsTG9jYXRpb24gPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uSW5WaWV3KGVsZW1lbnQpO1xuICAgICAgZW5kWCAtPSBmaXJzdEVsTG9jYXRpb24ueDtcbiAgICAgIGVuZFkgLT0gZmlyc3RFbExvY2F0aW9uLnk7XG4gICAgfVxuICB9XG4gIC8vIGNsaWVudHMgYXJlIHJlc3BvbnNpYmxlIHRvIHVzZSB0aGVzZSBvcHRpb25zIGNvcnJlY3RseVxuICByZXR1cm4ge3N0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBkdXJhdGlvbiwgdG91Y2hDb3VudCwgZWxlbWVudH07XG59O1xuXG5jb21tYW5kcy5wZXJmb3JtVG91Y2ggPSBhc3luYyBmdW5jdGlvbiBwZXJmb3JtVG91Y2ggKGdlc3R1cmVzKSB7XG4gIC8vIHByZXNzLXdhaXQtbW92ZVRvLXJlbGVhc2UgaXMgYHN3aXBlYCwgc28gdXNlIG5hdGl2ZSBtZXRob2RcbiAgaWYgKGdlc3R1cmVzLmxlbmd0aCA9PT0gNCAmJlxuICAgICAgZ2VzdHVyZXNbMF0uYWN0aW9uID09PSAncHJlc3MnICYmXG4gICAgICBnZXN0dXJlc1sxXS5hY3Rpb24gPT09ICd3YWl0JyAmJlxuICAgICAgZ2VzdHVyZXNbMl0uYWN0aW9uID09PSAnbW92ZVRvJyAmJlxuICAgICAgZ2VzdHVyZXNbM10uYWN0aW9uID09PSAncmVsZWFzZScpIHtcblxuICAgIGxldCBzd2lwZU9wdHMgPSBhd2FpdCB0aGlzLmdldFN3aXBlT3B0aW9ucyhnZXN0dXJlcyk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3dpcGUoc3dpcGVPcHRzLnN0YXJ0WCwgc3dpcGVPcHRzLnN0YXJ0WSwgc3dpcGVPcHRzLmVuZFgsXG4gICAgICAgIHN3aXBlT3B0cy5lbmRZLCBzd2lwZU9wdHMuZHVyYXRpb24sIHN3aXBlT3B0cy50b3VjaENvdW50LFxuICAgICAgICBzd2lwZU9wdHMuZWxlbWVudCk7XG4gIH1cbiAgbGV0IGFjdGlvbnMgPSBfLm1hcChnZXN0dXJlcywgJ2FjdGlvbicpO1xuXG4gIGlmIChhY3Rpb25zWzBdID09PSAnbG9uZ1ByZXNzJyAmJiBhY3Rpb25zWzFdID09PSAnbW92ZVRvJyAmJiBhY3Rpb25zWzJdID09PSAncmVsZWFzZScpIHtcbiAgICAvLyBzb21lIHRoaW5ncyBhcmUgc3BlY2lhbFxuICAgIHJldHVybiBhd2FpdCB0aGlzLmRvVG91Y2hEcmFnKGdlc3R1cmVzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoYWN0aW9ucy5sZW5ndGggPT09IDIpIHtcbiAgICAgIC8vIGBwcmVzc2Agd2l0aG91dCBhIHdhaXQgaXMgdG9vIHNsb3cgYW5kIGdldHMgaW50ZXJwcmV0dGVkIGFzIGEgYGxvbmdQcmVzc2BcbiAgICAgIGlmIChfLmhlYWQoYWN0aW9ucykgPT09ICdwcmVzcycgJiYgXy5sYXN0KGFjdGlvbnMpID09PSAncmVsZWFzZScpIHtcbiAgICAgICAgYWN0aW9uc1swXSA9ICd0YXAnO1xuICAgICAgICBnZXN0dXJlc1swXS5hY3Rpb24gPSAndGFwJztcbiAgICAgIH1cblxuICAgICAgLy8gdGhlIGBsb25nUHJlc3NgIGFuZCBgdGFwYCBtZXRob2RzIHJlbGVhc2Ugb24gdGhlaXIgb3duXG4gICAgICBpZiAoKF8uaGVhZChhY3Rpb25zKSA9PT0gJ3RhcCcgfHwgXy5oZWFkKGFjdGlvbnMpID09PSAnbG9uZ1ByZXNzJykgJiYgXy5sYXN0KGFjdGlvbnMpID09PSAncmVsZWFzZScpIHtcbiAgICAgICAgZ2VzdHVyZXMucG9wKCk7XG4gICAgICAgIGFjdGlvbnMucG9wKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGxvbmdwcmVzcyBmb2xsb3dlZCBieSBhbnl0aGluZyBvdGhlciB0aGFuIHJlbGVhc2Ugc2hvdWxkIGJlY29tZSBhIHByZXNzIGFuZCB3YWl0XG4gICAgICBpZiAoYWN0aW9uc1swXSA9PT0gJ2xvbmdQcmVzcycpIHtcbiAgICAgICAgYWN0aW9ucyA9IFsncHJlc3MnLCAnd2FpdCcsIC4uLmFjdGlvbnMuc2xpY2UoMSldO1xuXG4gICAgICAgIGxldCBwcmVzcyA9IGdlc3R1cmVzLnNoaWZ0KCk7XG4gICAgICAgIHByZXNzLmFjdGlvbiA9ICdwcmVzcyc7XG4gICAgICAgIGxldCB3YWl0ID0ge1xuICAgICAgICAgIGFjdGlvbjogJ3dhaXQnLFxuICAgICAgICAgIG9wdGlvbnM6IHttczogcHJlc3Mub3B0aW9ucy5kdXJhdGlvbiB8fCAxMDAwfVxuICAgICAgICB9O1xuICAgICAgICBkZWxldGUgcHJlc3Mub3B0aW9ucy5kdXJhdGlvbjtcbiAgICAgICAgZ2VzdHVyZXMgPSBbcHJlc3MsIHdhaXQsIC4uLmdlc3R1cmVzXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZml4ZWRHZXN0dXJlcyA9IGF3YWl0IHRoaXMucGFyc2VUb3VjaChnZXN0dXJlcywgZmFsc2UpO1xuICAgIC8vIGZpeCByZWxlYXNlIGFjdGlvbiB0aGVuIHBlcmZvcm0gYWxsIGFjdGlvbnNcbiAgICBpZiAoYWN0aW9uc1thY3Rpb25zLmxlbmd0aCAtIDFdID09PSAncmVsZWFzZScpIHtcbiAgICAgIGFjdGlvbnNbYWN0aW9ucy5sZW5ndGggLSAxXSA9IGF3YWl0IHRoaXMuZml4UmVsZWFzZShnZXN0dXJlcyk7XG4gICAgfVxuICAgIGZvciAobGV0IGcgb2YgZml4ZWRHZXN0dXJlcykge1xuICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtR2VzdHVyZShnKTtcbiAgICB9XG4gIH1cbn07XG5cbmhlbHBlcnMucGFyc2VUb3VjaCA9IGFzeW5jIGZ1bmN0aW9uIHBhcnNlVG91Y2ggKGdlc3R1cmVzLCBtdWx0aSkge1xuICAvLyBiZWNhdXNlIG11bHRpLXRvdWNoIHJlbGVhc2VzIGF0IHRoZSBlbmQgYnkgZGVmYXVsdFxuICBpZiAobXVsdGkgJiYgXy5sYXN0KGdlc3R1cmVzKS5hY3Rpb24gPT09ICdyZWxlYXNlJykge1xuICAgIGdlc3R1cmVzLnBvcCgpO1xuICB9XG5cbiAgbGV0IHRvdWNoU3RhdGVPYmplY3RzID0gYXdhaXQgYXN5bmNtYXAoZ2VzdHVyZXMsIGFzeW5jIChnZXN0dXJlKSA9PiB7XG4gICAgbGV0IG9wdGlvbnMgPSBnZXN0dXJlLm9wdGlvbnMgfHwge307XG4gICAgaWYgKF8uaW5jbHVkZXMoWydwcmVzcycsICdtb3ZlVG8nLCAndGFwJywgJ2xvbmdQcmVzcyddLCBnZXN0dXJlLmFjdGlvbikpIHtcbiAgICAgIG9wdGlvbnMub2Zmc2V0ID0gZmFsc2U7XG4gICAgICBsZXQgZWxlbWVudElkID0gZ2VzdHVyZS5vcHRpb25zLmVsZW1lbnQ7XG4gICAgICBpZiAoZWxlbWVudElkKSB7XG4gICAgICAgIGxldCBwb3MgPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uSW5WaWV3KGVsZW1lbnRJZCk7XG4gICAgICAgIGlmIChnZXN0dXJlLm9wdGlvbnMueCB8fCBnZXN0dXJlLm9wdGlvbnMueSkge1xuICAgICAgICAgIG9wdGlvbnMueCA9IHBvcy54ICsgKGdlc3R1cmUub3B0aW9ucy54IHx8IDApO1xuICAgICAgICAgIG9wdGlvbnMueSA9IHBvcy55ICsgKGdlc3R1cmUub3B0aW9ucy55IHx8IDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZ2V0U2l6ZShlbGVtZW50SWQpO1xuICAgICAgICAgIG9wdGlvbnMueCA9IHBvcy54ICsgKHdpZHRoIC8gMik7XG4gICAgICAgICAgb3B0aW9ucy55ID0gcG9zLnkgKyAoaGVpZ2h0IC8gMik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRvdWNoU3RhdGVPYmplY3QgPSB7XG4gICAgICAgICAgYWN0aW9uOiBnZXN0dXJlLmFjdGlvbixcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHRpbWVPZmZzZXQ6IDAuMDA1LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdG91Y2hTdGF0ZU9iamVjdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMueCA9IChnZXN0dXJlLm9wdGlvbnMueCB8fCAwKTtcbiAgICAgICAgb3B0aW9ucy55ID0gKGdlc3R1cmUub3B0aW9ucy55IHx8IDApO1xuXG4gICAgICAgIGxldCB0b3VjaFN0YXRlT2JqZWN0ID0ge1xuICAgICAgICAgIGFjdGlvbjogZ2VzdHVyZS5hY3Rpb24sXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICB0aW1lT2Zmc2V0OiAwLjAwNSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRvdWNoU3RhdGVPYmplY3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBvZmZzZXQgPSAwLjAwNTtcbiAgICAgIGlmIChnZXN0dXJlLmFjdGlvbiA9PT0gJ3dhaXQnKSB7XG4gICAgICAgIG9wdGlvbnMgPSBnZXN0dXJlLm9wdGlvbnM7XG4gICAgICAgIG9mZnNldCA9IChwYXJzZUludChnZXN0dXJlLm9wdGlvbnMubXMsIDEwKSAvIDEwMDApO1xuICAgICAgfVxuICAgICAgbGV0IHRvdWNoU3RhdGVPYmplY3QgPSB7XG4gICAgICAgIGFjdGlvbjogZ2VzdHVyZS5hY3Rpb24sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHRpbWVPZmZzZXQ6IG9mZnNldCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gdG91Y2hTdGF0ZU9iamVjdDtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbiAgLy8gd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHRpbWUgKHdoaWNoIGlzIG5vdyBhbiBvZmZzZXQpXG4gIC8vIGFuZCB0aGUgcG9zaXRpb24gKHdoaWNoIG1heSBiZSBhbiBvZmZzZXQpXG4gIGxldCBwcmV2UG9zID0gbnVsbCxcbiAgICAgIHRpbWUgPSAwO1xuICBmb3IgKGxldCBzdGF0ZSBvZiB0b3VjaFN0YXRlT2JqZWN0cykge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHN0YXRlLm9wdGlvbnMueCkgJiYgXy5pc1VuZGVmaW5lZChzdGF0ZS5vcHRpb25zLnkpICYmIHByZXZQb3MgIT09IG51bGwpIHtcbiAgICAgIC8vIHRoaXMgaGFwcGVucyB3aXRoIHdhaXRcbiAgICAgIHN0YXRlLm9wdGlvbnMueCA9IHByZXZQb3MueDtcbiAgICAgIHN0YXRlLm9wdGlvbnMueSA9IHByZXZQb3MueTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLm9wdGlvbnMub2Zmc2V0ICYmIHByZXZQb3MpIHtcbiAgICAgIC8vIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGFuIG9mZnNldFxuICAgICAgc3RhdGUub3B0aW9ucy54ICs9IHByZXZQb3MueDtcbiAgICAgIHN0YXRlLm9wdGlvbnMueSArPSBwcmV2UG9zLnk7XG4gICAgfVxuICAgIGRlbGV0ZSBzdGF0ZS5vcHRpb25zLm9mZnNldDtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoc3RhdGUub3B0aW9ucy54KSAmJiAhXy5pc1VuZGVmaW5lZChzdGF0ZS5vcHRpb25zLnkpKSB7XG4gICAgICBwcmV2UG9zID0gc3RhdGUub3B0aW9ucztcbiAgICB9XG5cbiAgICBpZiAobXVsdGkpIHtcbiAgICAgIGxldCB0aW1lT2Zmc2V0ID0gc3RhdGUudGltZU9mZnNldDtcbiAgICAgIHRpbWUgKz0gdGltZU9mZnNldDtcbiAgICAgIHN0YXRlLnRpbWUgPSBhbmRyb2lkSGVscGVycy50cnVuY2F0ZURlY2ltYWxzKHRpbWUsIDMpO1xuXG4gICAgICAvLyBtdWx0aSBnZXN0dXJlcyByZXF1aXJlICd0b3VjaCcgcmF0aGVyIHRoYW4gJ29wdGlvbnMnXG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQoc3RhdGUub3B0aW9ucy54KSAmJiAhXy5pc1VuZGVmaW5lZChzdGF0ZS5vcHRpb25zLnkpKSB7XG4gICAgICAgIHN0YXRlLnRvdWNoID0ge1xuICAgICAgICAgIHg6IHN0YXRlLm9wdGlvbnMueCxcbiAgICAgICAgICB5OiBzdGF0ZS5vcHRpb25zLnlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBzdGF0ZS5vcHRpb25zO1xuICAgIH1cbiAgICBkZWxldGUgc3RhdGUudGltZU9mZnNldDtcbiAgfVxuICByZXR1cm4gdG91Y2hTdGF0ZU9iamVjdHM7XG59O1xuXG5cbmNvbW1hbmRzLnBlcmZvcm1NdWx0aUFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1NdWx0aUFjdGlvbiAoYWN0aW9ucywgZWxlbWVudElkKSB7XG4gIC8vIEFuZHJvaWQgbmVlZHMgYXQgbGVhc3QgdHdvIGFjdGlvbnMgdG8gYmUgYWJsZSB0byBwZXJmb3JtIGEgbXVsdGkgcG9pbnRlciBnZXN0dXJlXG4gIGlmIChhY3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTXVsdGkgUG9pbnRlciBHZXN0dXJlcyBuZWVkIGF0IGxlYXN0IHR3byBhY3Rpb25zLiAnICtcbiAgICAgICAgJ1VzZSBUb3VjaCBBY3Rpb25zIGZvciBhIHNpbmdsZSBhY3Rpb24uJyk7XG4gIH1cblxuICBjb25zdCBzdGF0ZXMgPSBhd2FpdCBhc3luY21hcChhY3Rpb25zLCBhc3luYyAoYWN0aW9uKSA9PiBhd2FpdCB0aGlzLnBhcnNlVG91Y2goYWN0aW9uLCB0cnVlKSwgZmFsc2UpO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLmRvUGVyZm9ybU11bHRpQWN0aW9uKGVsZW1lbnRJZCwgc3RhdGVzKTtcbn07XG5cbi8qKlxuICogUmVhc29uIGZvciBpc29sYXRpbmcgZG9QZXJmb3JtTXVsdGlBY3Rpb24gZnJvbSBwZXJmb3JtTXVsdGlBY3Rpb24gaXMgZm9yIHJldXNpbmcgcGVyZm9ybU11bHRpQWN0aW9uXG4gKiBhY3Jvc3MgYW5kcm9pZC1kcml2ZXJzIChsaWtlIGFwcGl1bS11aWF1dG9tYXRvcjItZHJpdmVyKSBhbmQgdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbi5cbiAqIE90aGVyIGFuZHJvaWQtZHJpdmVycyAobGlrZSBhcHBpdW0tdWlhdXRvbWF0b3IyLWRyaXZlcikgbmVlZCB0byBvdmVycmlkZSBkb1BlcmZvcm1NdWx0aUFjdGlvblxuICogdG8gZmFjaWxpdGF0ZSBwZXJmb3JtTXVsdGlBY3Rpb24uXG4gKi9cbmNvbW1hbmRzLmRvUGVyZm9ybU11bHRpQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gZG9QZXJmb3JtTXVsdGlBY3Rpb24gKGVsZW1lbnRJZCwgc3RhdGVzKSB7XG4gIGxldCBvcHRzO1xuICBpZiAoZWxlbWVudElkKSB7XG4gICAgb3B0cyA9IHtcbiAgICAgIGVsZW1lbnRJZCxcbiAgICAgIGFjdGlvbnM6IHN0YXRlc1xuICAgIH07XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6cGVyZm9ybU11bHRpUG9pbnRlckdlc3R1cmUnLCBvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICBvcHRzID0ge1xuICAgICAgYWN0aW9uczogc3RhdGVzXG4gICAgfTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbigncGVyZm9ybU11bHRpUG9pbnRlckdlc3R1cmUnLCBvcHRzKTtcbiAgfVxufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQgeyBjb21tYW5kcywgaGVscGVycyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFJQSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUFDO0FBQUE7QUFFakQsU0FBU0MsZUFBZSxDQUFFQyxHQUFHLEVBQUU7RUFJN0IsT0FBT0MsYUFBSSxDQUFDQyxRQUFRLENBQUNGLEdBQUcsQ0FBQyxHQUFHQSxHQUFHLEdBQUcsR0FBRztBQUN2QztBQUVBLFNBQVNHLHFCQUFxQixDQUFFQyxXQUFXLEVBQUU7RUFHM0MsSUFBSUMsUUFBUSxHQUFHLEdBQUc7RUFDbEIsSUFBSSxPQUFPRCxXQUFXLENBQUNFLE9BQU8sQ0FBQ0MsRUFBRSxLQUFLLFdBQVcsSUFBSUgsV0FBVyxDQUFDRSxPQUFPLENBQUNDLEVBQUUsRUFBRTtJQUMzRUYsUUFBUSxHQUFHRCxXQUFXLENBQUNFLE9BQU8sQ0FBQ0MsRUFBRSxHQUFHLElBQUk7SUFDeEMsSUFBSUYsUUFBUSxLQUFLLENBQUMsRUFBRTtNQUdsQkEsUUFBUSxHQUFH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
@@ -1 +1 @@
1
- {"version":3,"file":"touch.js","names":["commands","helpers","extensions","getCoordDefault","val","util","hasValue","getSwipeTouchDuration","waitGesture","duration","options","ms","doTouchAction","action","opts","element","x","y","count","tap","touchDown","touchUp","touchMove","B","delay","touchLongClick","log","warn","errorAndThrow","doTouchDrag","gestures","longPress","moveTo","startX","startY","endX","endY","getLocationInView","apiLevel","adb","getApiLevel","Math","max","drag","fixRelease","release","_","last","clone","ref","gesture","reverse","loc","size","getSize","width","height","pick","performGesture","e","isErrorType","errors","NoSuchElementError","debug","getSwipeOptions","touchCount","destElement","locResult","sizeResult","offsetX","abs","offsetY","firstElLocation","performTouch","length","swipeOpts","swipe","actions","map","head","pop","slice","press","shift","wait","fixedGestures","parseTouch","g","multi","touchStateObjects","asyncmap","includes","offset","elementId","pos","touchStateObject","timeOffset","parseInt","prevPos","time","state","isUndefined","androidHelpers","truncateDecimals","touch","performMultiAction","Error","states","doPerformMultiAction","bootstrap","sendAction","Object","assign"],"sources":["../../../lib/commands/touch.js"],"sourcesContent":["import _ from 'lodash';\nimport androidHelpers from '../android-helpers';\nimport B from 'bluebird';\nimport { errors, isErrorType } from 'appium/driver';\nimport { asyncmap } from 'asyncbox';\nimport { util } from 'appium/support';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nfunction getCoordDefault (val) {\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. Same\n // thing with destElement below.\n return util.hasValue(val) ? val : 0.5;\n}\n\nfunction getSwipeTouchDuration (waitGesture) {\n // the touch action api uses ms, we want seconds\n // 0.8 is the default time for the operation\n let duration = 0.8;\n if (typeof waitGesture.options.ms !== 'undefined' && waitGesture.options.ms) {\n duration = waitGesture.options.ms / 1000;\n if (duration === 0) {\n // set to a very low number, since they wanted it fast\n // but below 0.1 becomes 0 steps, which causes errors\n duration = 0.1;\n }\n }\n return duration;\n}\n\ncommands.doTouchAction = async function doTouchAction (action, opts = {}) {\n const { element, x, y, count, ms, duration } = opts;\n // parseTouch precalculates absolute element positions\n // so there is no need to pass `element` to the affected gestures\n switch (action) {\n case 'tap':\n return await this.tap(null, x, y, count);\n case 'press':\n return await this.touchDown(null, x, y);\n case 'release':\n return await this.touchUp(element, x, y);\n case 'moveTo':\n return await this.touchMove(null, x, y);\n case 'wait':\n return await B.delay(ms);\n case 'longPress':\n return await this.touchLongClick(null, x, y, duration || 1000);\n case 'cancel':\n // TODO: clarify behavior of 'cancel' action and fix this\n this.log.warn('Cancel action currently has no effect');\n break;\n default:\n this.log.errorAndThrow(`unknown action ${action}`);\n }\n};\n\n// drag is *not* press-move-release, so we need to translate\n// drag works fine for scroll, as well\nhelpers.doTouchDrag = async function doTouchDrag (gestures) {\n let longPress = gestures[0];\n let moveTo = gestures[1];\n let startX = longPress.options.x || 0,\n startY = longPress.options.y || 0,\n endX = moveTo.options.x || 0,\n endY = moveTo.options.y || 0;\n if (longPress.options.element) {\n let {x, y} = await this.getLocationInView(longPress.options.element);\n startX += x || 0;\n startY += y || 0;\n }\n if (moveTo.options.element) {\n let {x, y} = await this.getLocationInView(moveTo.options.element);\n endX += x || 0;\n endY += y || 0;\n }\n\n let apiLevel = await this.adb.getApiLevel();\n // lollipop takes a little longer to get things rolling\n let duration = apiLevel >= 5 ? 2 : 1;\n // make sure that if the long press has a duration, we use it.\n if (longPress.options && longPress.options.duration) {\n duration = Math.max(longPress.options.duration / 1000, duration);\n }\n\n // `drag` will take care of whether there is an element or not at that level\n return await this.drag(startX, startY, endX, endY, duration, 1, longPress.options.element, moveTo.options.element);\n};\n\n// Release gesture needs element or co-ordinates to release it from that position\n// or else release gesture is performed from center of the screen, so to fix it\n// This method sets co-ordinates/element to release gesture if it has no options set already.\nhelpers.fixRelease = async function fixRelease (gestures) {\n let release = _.last(gestures);\n // sometimes there are no options\n release.options = release.options || {};\n // nothing to do if release options are already set\n if (release.options.element || (release.options.x && release.options.y)) {\n return;\n }\n // without coordinates, `release` uses the center of the screen, which,\n // generally speaking, is not what we want\n // therefore: loop backwards and use the last command with an element and/or\n // offset coordinates\n gestures = _.clone(gestures);\n let ref = null;\n for (let gesture of gestures.reverse()) {\n let opts = gesture.options;\n if (opts.element || (opts.x && opts.y)) {\n ref = gesture;\n break;\n }\n }\n if (ref) {\n let opts = ref.options;\n if (opts.element) {\n let loc = await this.getLocationInView(opts.element);\n if (opts.x && opts.y) {\n // this is an offset from the element\n release.options = {\n x: loc.x + opts.x,\n y: loc.y + opts.y\n };\n } else {\n // this is the center of the element\n let size = await this.getSize(opts.element);\n release.options = {\n x: loc.x + size.width / 2,\n y: loc.y + size.height / 2\n };\n }\n } else {\n release.options = _.pick(opts, 'x', 'y');\n }\n }\n return release;\n};\n\n// Perform one gesture\nhelpers.performGesture = async function performGesture (gesture) {\n try {\n return await this.doTouchAction(gesture.action, gesture.options || {});\n } catch (e) {\n // sometime the element is not available when releasing, retry without it\n if (isErrorType(e, errors.NoSuchElementError) && gesture.action === 'release' &&\n gesture.options.element) {\n delete gesture.options.element;\n this.log.debug(`retrying release without element opts: ${gesture.options}.`);\n return await this.doTouchAction(gesture.action, gesture.options || {});\n }\n throw e;\n }\n};\n\ncommands.getSwipeOptions = async function getSwipeOptions (gestures, touchCount = 1) {\n let startX = getCoordDefault(gestures[0].options.x),\n startY = getCoordDefault(gestures[0].options.y),\n endX = getCoordDefault(gestures[2].options.x),\n endY = getCoordDefault(gestures[2].options.y),\n duration = getSwipeTouchDuration(gestures[1]),\n element = gestures[0].options.element,\n destElement = gestures[2].options.element || gestures[0].options.element;\n\n // there's no destination element handling in bootstrap and since it applies to all platforms, we handle it here\n if (util.hasValue(destElement)) {\n let locResult = await this.getLocationInView(destElement);\n let sizeResult = await this.getSize(destElement);\n let offsetX = (Math.abs(endX) < 1 && Math.abs(endX) > 0) ? sizeResult.width * endX : endX;\n let offsetY = (Math.abs(endY) < 1 && Math.abs(endY) > 0) ? sizeResult.height * endY : endY;\n endX = locResult.x + offsetX;\n endY = locResult.y + offsetY;\n // if the target element was provided, the coordinates for the destination need to be relative to it.\n if (util.hasValue(element)) {\n let firstElLocation = await this.getLocationInView(element);\n endX -= firstElLocation.x;\n endY -= firstElLocation.y;\n }\n }\n // clients are responsible to use these options correctly\n return {startX, startY, endX, endY, duration, touchCount, element};\n};\n\ncommands.performTouch = async function performTouch (gestures) {\n // press-wait-moveTo-release is `swipe`, so use native method\n if (gestures.length === 4 &&\n gestures[0].action === 'press' &&\n gestures[1].action === 'wait' &&\n gestures[2].action === 'moveTo' &&\n gestures[3].action === 'release') {\n\n let swipeOpts = await this.getSwipeOptions(gestures);\n return await this.swipe(swipeOpts.startX, swipeOpts.startY, swipeOpts.endX,\n swipeOpts.endY, swipeOpts.duration, swipeOpts.touchCount,\n swipeOpts.element);\n }\n let actions = _.map(gestures, 'action');\n\n if (actions[0] === 'longPress' && actions[1] === 'moveTo' && actions[2] === 'release') {\n // some things are special\n return await this.doTouchDrag(gestures);\n } else {\n if (actions.length === 2) {\n // `press` without a wait is too slow and gets interpretted as a `longPress`\n if (_.head(actions) === 'press' && _.last(actions) === 'release') {\n actions[0] = 'tap';\n gestures[0].action = 'tap';\n }\n\n // the `longPress` and `tap` methods release on their own\n if ((_.head(actions) === 'tap' || _.head(actions) === 'longPress') && _.last(actions) === 'release') {\n gestures.pop();\n actions.pop();\n }\n } else {\n // longpress followed by anything other than release should become a press and wait\n if (actions[0] === 'longPress') {\n actions = ['press', 'wait', ...actions.slice(1)];\n\n let press = gestures.shift();\n press.action = 'press';\n let wait = {\n action: 'wait',\n options: {ms: press.options.duration || 1000}\n };\n delete press.options.duration;\n gestures = [press, wait, ...gestures];\n }\n }\n\n let fixedGestures = await this.parseTouch(gestures, false);\n // fix release action then perform all actions\n if (actions[actions.length - 1] === 'release') {\n actions[actions.length - 1] = await this.fixRelease(gestures);\n }\n for (let g of fixedGestures) {\n await this.performGesture(g);\n }\n }\n};\n\nhelpers.parseTouch = async function parseTouch (gestures, multi) {\n // because multi-touch releases at the end by default\n if (multi && _.last(gestures).action === 'release') {\n gestures.pop();\n }\n\n let touchStateObjects = await asyncmap(gestures, async (gesture) => {\n let options = gesture.options || {};\n if (_.includes(['press', 'moveTo', 'tap', 'longPress'], gesture.action)) {\n options.offset = false;\n let elementId = gesture.options.element;\n if (elementId) {\n let pos = await this.getLocationInView(elementId);\n if (gesture.options.x || gesture.options.y) {\n options.x = pos.x + (gesture.options.x || 0);\n options.y = pos.y + (gesture.options.y || 0);\n } else {\n const {width, height} = await this.getSize(elementId);\n options.x = pos.x + (width / 2);\n options.y = pos.y + (height / 2);\n }\n let touchStateObject = {\n action: gesture.action,\n options,\n timeOffset: 0.005,\n };\n return touchStateObject;\n } else {\n options.x = (gesture.options.x || 0);\n options.y = (gesture.options.y || 0);\n\n let touchStateObject = {\n action: gesture.action,\n options,\n timeOffset: 0.005,\n };\n return touchStateObject;\n }\n } else {\n let offset = 0.005;\n if (gesture.action === 'wait') {\n options = gesture.options;\n offset = (parseInt(gesture.options.ms, 10) / 1000);\n }\n let touchStateObject = {\n action: gesture.action,\n options,\n timeOffset: offset,\n };\n return touchStateObject;\n }\n }, false);\n // we need to change the time (which is now an offset)\n // and the position (which may be an offset)\n let prevPos = null,\n time = 0;\n for (let state of touchStateObjects) {\n if (_.isUndefined(state.options.x) && _.isUndefined(state.options.y) && prevPos !== null) {\n // this happens with wait\n state.options.x = prevPos.x;\n state.options.y = prevPos.y;\n }\n if (state.options.offset && prevPos) {\n // the current position is an offset\n state.options.x += prevPos.x;\n state.options.y += prevPos.y;\n }\n delete state.options.offset;\n if (!_.isUndefined(state.options.x) && !_.isUndefined(state.options.y)) {\n prevPos = state.options;\n }\n\n if (multi) {\n let timeOffset = state.timeOffset;\n time += timeOffset;\n state.time = androidHelpers.truncateDecimals(time, 3);\n\n // multi gestures require 'touch' rather than 'options'\n if (!_.isUndefined(state.options.x) && !_.isUndefined(state.options.y)) {\n state.touch = {\n x: state.options.x,\n y: state.options.y\n };\n }\n delete state.options;\n }\n delete state.timeOffset;\n }\n return touchStateObjects;\n};\n\n\ncommands.performMultiAction = async function performMultiAction (actions, elementId) {\n // Android needs at least two actions to be able to perform a multi pointer gesture\n if (actions.length === 1) {\n throw new Error('Multi Pointer Gestures need at least two actions. ' +\n 'Use Touch Actions for a single action.');\n }\n\n const states = await asyncmap(actions, async (action) => await this.parseTouch(action, true), false);\n\n return await this.doPerformMultiAction(elementId, states);\n};\n\n/**\n * Reason for isolating doPerformMultiAction from performMultiAction is for reusing performMultiAction\n * across android-drivers (like appium-uiautomator2-driver) and to avoid code duplication.\n * Other android-drivers (like appium-uiautomator2-driver) need to override doPerformMultiAction\n * to facilitate performMultiAction.\n */\ncommands.doPerformMultiAction = async function doPerformMultiAction (elementId, states) {\n let opts;\n if (elementId) {\n opts = {\n elementId,\n actions: states\n };\n return await this.bootstrap.sendAction('element:performMultiPointerGesture', opts);\n } else {\n opts = {\n actions: states\n };\n return await this.bootstrap.sendAction('performMultiPointerGesture', opts);\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
1
+ {"version":3,"file":"touch.js","names":["commands","helpers","extensions","getCoordDefault","val","util","hasValue","getSwipeTouchDuration","waitGesture","duration","options","ms","doTouchAction","action","opts","element","x","y","count","tap","touchDown","touchUp","touchMove","B","delay","touchLongClick","log","warn","errorAndThrow","doTouchDrag","gestures","longPress","moveTo","startX","startY","endX","endY","getLocationInView","apiLevel","adb","getApiLevel","Math","max","drag","fixRelease","release","_","last","clone","ref","gesture","reverse","loc","size","getSize","width","height","pick","performGesture","e","isErrorType","errors","NoSuchElementError","debug","getSwipeOptions","touchCount","destElement","locResult","sizeResult","offsetX","abs","offsetY","firstElLocation","performTouch","length","swipeOpts","swipe","actions","map","head","pop","slice","press","shift","wait","fixedGestures","parseTouch","g","multi","touchStateObjects","asyncmap","includes","offset","elementId","pos","touchStateObject","timeOffset","parseInt","prevPos","time","state","isUndefined","androidHelpers","truncateDecimals","touch","performMultiAction","Error","states","doPerformMultiAction","bootstrap","sendAction","Object","assign"],"sources":["../../../lib/commands/touch.js"],"sourcesContent":["import _ from 'lodash';\nimport androidHelpers from '../android-helpers';\nimport B from 'bluebird';\nimport { errors, isErrorType } from 'appium/driver';\nimport { asyncmap } from 'asyncbox';\nimport { util } from 'appium/support';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nfunction getCoordDefault (val) {\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. Same\n // thing with destElement below.\n return util.hasValue(val) ? val : 0.5;\n}\n\nfunction getSwipeTouchDuration (waitGesture) {\n // the touch action api uses ms, we want seconds\n // 0.8 is the default time for the operation\n let duration = 0.8;\n if (typeof waitGesture.options.ms !== 'undefined' && waitGesture.options.ms) {\n duration = waitGesture.options.ms / 1000;\n if (duration === 0) {\n // set to a very low number, since they wanted it fast\n // but below 0.1 becomes 0 steps, which causes errors\n duration = 0.1;\n }\n }\n return duration;\n}\n\ncommands.doTouchAction = async function doTouchAction (action, opts = {}) {\n const { element, x, y, count, ms, duration } = opts;\n // parseTouch precalculates absolute element positions\n // so there is no need to pass `element` to the affected gestures\n switch (action) {\n case 'tap':\n return await this.tap(null, x, y, count);\n case 'press':\n return await this.touchDown(null, x, y);\n case 'release':\n return await this.touchUp(element, x, y);\n case 'moveTo':\n return await this.touchMove(null, x, y);\n case 'wait':\n return await B.delay(ms);\n case 'longPress':\n return await this.touchLongClick(null, x, y, duration || 1000);\n case 'cancel':\n // TODO: clarify behavior of 'cancel' action and fix this\n this.log.warn('Cancel action currently has no effect');\n break;\n default:\n this.log.errorAndThrow(`unknown action ${action}`);\n }\n};\n\n// drag is *not* press-move-release, so we need to translate\n// drag works fine for scroll, as well\nhelpers.doTouchDrag = async function doTouchDrag (gestures) {\n let longPress = gestures[0];\n let moveTo = gestures[1];\n let startX = longPress.options.x || 0,\n startY = longPress.options.y || 0,\n endX = moveTo.options.x || 0,\n endY = moveTo.options.y || 0;\n if (longPress.options.element) {\n let {x, y} = await this.getLocationInView(longPress.options.element);\n startX += x || 0;\n startY += y || 0;\n }\n if (moveTo.options.element) {\n let {x, y} = await this.getLocationInView(moveTo.options.element);\n endX += x || 0;\n endY += y || 0;\n }\n\n let apiLevel = await this.adb.getApiLevel();\n // lollipop takes a little longer to get things rolling\n let duration = apiLevel >= 5 ? 2 : 1;\n // make sure that if the long press has a duration, we use it.\n if (longPress.options && longPress.options.duration) {\n duration = Math.max(longPress.options.duration / 1000, duration);\n }\n\n // `drag` will take care of whether there is an element or not at that level\n return await this.drag(startX, startY, endX, endY, duration, 1, longPress.options.element, moveTo.options.element);\n};\n\n// Release gesture needs element or co-ordinates to release it from that position\n// or else release gesture is performed from center of the screen, so to fix it\n// This method sets co-ordinates/element to release gesture if it has no options set already.\nhelpers.fixRelease = async function fixRelease (gestures) {\n let release = _.last(gestures);\n // sometimes there are no options\n release.options = release.options || {};\n // nothing to do if release options are already set\n if (release.options.element || (release.options.x && release.options.y)) {\n return;\n }\n // without coordinates, `release` uses the center of the screen, which,\n // generally speaking, is not what we want\n // therefore: loop backwards and use the last command with an element and/or\n // offset coordinates\n gestures = _.clone(gestures);\n let ref = null;\n for (let gesture of gestures.reverse()) {\n let opts = gesture.options;\n if (opts.element || (opts.x && opts.y)) {\n ref = gesture;\n break;\n }\n }\n if (ref) {\n let opts = ref.options;\n if (opts.element) {\n let loc = await this.getLocationInView(opts.element);\n if (opts.x && opts.y) {\n // this is an offset from the element\n release.options = {\n x: loc.x + opts.x,\n y: loc.y + opts.y\n };\n } else {\n // this is the center of the element\n let size = await this.getSize(opts.element);\n release.options = {\n x: loc.x + size.width / 2,\n y: loc.y + size.height / 2\n };\n }\n } else {\n release.options = _.pick(opts, 'x', 'y');\n }\n }\n return release;\n};\n\n// Perform one gesture\nhelpers.performGesture = async function performGesture (gesture) {\n try {\n return await this.doTouchAction(gesture.action, gesture.options || {});\n } catch (e) {\n // sometime the element is not available when releasing, retry without it\n if (isErrorType(e, errors.NoSuchElementError) && gesture.action === 'release' &&\n gesture.options.element) {\n delete gesture.options.element;\n this.log.debug(`retrying release without element opts: ${gesture.options}.`);\n return await this.doTouchAction(gesture.action, gesture.options || {});\n }\n throw e;\n }\n};\n\ncommands.getSwipeOptions = async function getSwipeOptions (gestures, touchCount = 1) {\n let startX = getCoordDefault(gestures[0].options.x),\n startY = getCoordDefault(gestures[0].options.y),\n endX = getCoordDefault(gestures[2].options.x),\n endY = getCoordDefault(gestures[2].options.y),\n duration = getSwipeTouchDuration(gestures[1]),\n element = gestures[0].options.element,\n destElement = gestures[2].options.element || gestures[0].options.element;\n\n // there's no destination element handling in bootstrap and since it applies to all platforms, we handle it here\n if (util.hasValue(destElement)) {\n let locResult = await this.getLocationInView(destElement);\n let sizeResult = await this.getSize(destElement);\n let offsetX = (Math.abs(endX) < 1 && Math.abs(endX) > 0) ? sizeResult.width * endX : endX;\n let offsetY = (Math.abs(endY) < 1 && Math.abs(endY) > 0) ? sizeResult.height * endY : endY;\n endX = locResult.x + offsetX;\n endY = locResult.y + offsetY;\n // if the target element was provided, the coordinates for the destination need to be relative to it.\n if (util.hasValue(element)) {\n let firstElLocation = await this.getLocationInView(element);\n endX -= firstElLocation.x;\n endY -= firstElLocation.y;\n }\n }\n // clients are responsible to use these options correctly\n return {startX, startY, endX, endY, duration, touchCount, element};\n};\n\ncommands.performTouch = async function performTouch (gestures) {\n // press-wait-moveTo-release is `swipe`, so use native method\n if (gestures.length === 4 &&\n gestures[0].action === 'press' &&\n gestures[1].action === 'wait' &&\n gestures[2].action === 'moveTo' &&\n gestures[3].action === 'release') {\n\n let swipeOpts = await this.getSwipeOptions(gestures);\n return await this.swipe(swipeOpts.startX, swipeOpts.startY, swipeOpts.endX,\n swipeOpts.endY, swipeOpts.duration, swipeOpts.touchCount,\n swipeOpts.element);\n }\n let actions = _.map(gestures, 'action');\n\n if (actions[0] === 'longPress' && actions[1] === 'moveTo' && actions[2] === 'release') {\n // some things are special\n return await this.doTouchDrag(gestures);\n } else {\n if (actions.length === 2) {\n // `press` without a wait is too slow and gets interpretted as a `longPress`\n if (_.head(actions) === 'press' && _.last(actions) === 'release') {\n actions[0] = 'tap';\n gestures[0].action = 'tap';\n }\n\n // the `longPress` and `tap` methods release on their own\n if ((_.head(actions) === 'tap' || _.head(actions) === 'longPress') && _.last(actions) === 'release') {\n gestures.pop();\n actions.pop();\n }\n } else {\n // longpress followed by anything other than release should become a press and wait\n if (actions[0] === 'longPress') {\n actions = ['press', 'wait', ...actions.slice(1)];\n\n let press = gestures.shift();\n press.action = 'press';\n let wait = {\n action: 'wait',\n options: {ms: press.options.duration || 1000}\n };\n delete press.options.duration;\n gestures = [press, wait, ...gestures];\n }\n }\n\n let fixedGestures = await this.parseTouch(gestures, false);\n // fix release action then perform all actions\n if (actions[actions.length - 1] === 'release') {\n actions[actions.length - 1] = await this.fixRelease(gestures);\n }\n for (let g of fixedGestures) {\n await this.performGesture(g);\n }\n }\n};\n\nhelpers.parseTouch = async function parseTouch (gestures, multi) {\n // because multi-touch releases at the end by default\n if (multi && _.last(gestures).action === 'release') {\n gestures.pop();\n }\n\n let touchStateObjects = await asyncmap(gestures, async (gesture) => {\n let options = gesture.options || {};\n if (_.includes(['press', 'moveTo', 'tap', 'longPress'], gesture.action)) {\n options.offset = false;\n let elementId = gesture.options.element;\n if (elementId) {\n let pos = await this.getLocationInView(elementId);\n if (gesture.options.x || gesture.options.y) {\n options.x = pos.x + (gesture.options.x || 0);\n options.y = pos.y + (gesture.options.y || 0);\n } else {\n const {width, height} = await this.getSize(elementId);\n options.x = pos.x + (width / 2);\n options.y = pos.y + (height / 2);\n }\n let touchStateObject = {\n action: gesture.action,\n options,\n timeOffset: 0.005,\n };\n return touchStateObject;\n } else {\n options.x = (gesture.options.x || 0);\n options.y = (gesture.options.y || 0);\n\n let touchStateObject = {\n action: gesture.action,\n options,\n timeOffset: 0.005,\n };\n return touchStateObject;\n }\n } else {\n let offset = 0.005;\n if (gesture.action === 'wait') {\n options = gesture.options;\n offset = (parseInt(gesture.options.ms, 10) / 1000);\n }\n let touchStateObject = {\n action: gesture.action,\n options,\n timeOffset: offset,\n };\n return touchStateObject;\n }\n }, false);\n // we need to change the time (which is now an offset)\n // and the position (which may be an offset)\n let prevPos = null,\n time = 0;\n for (let state of touchStateObjects) {\n if (_.isUndefined(state.options.x) && _.isUndefined(state.options.y) && prevPos !== null) {\n // this happens with wait\n state.options.x = prevPos.x;\n state.options.y = prevPos.y;\n }\n if (state.options.offset && prevPos) {\n // the current position is an offset\n state.options.x += prevPos.x;\n state.options.y += prevPos.y;\n }\n delete state.options.offset;\n if (!_.isUndefined(state.options.x) && !_.isUndefined(state.options.y)) {\n prevPos = state.options;\n }\n\n if (multi) {\n let timeOffset = state.timeOffset;\n time += timeOffset;\n state.time = androidHelpers.truncateDecimals(time, 3);\n\n // multi gestures require 'touch' rather than 'options'\n if (!_.isUndefined(state.options.x) && !_.isUndefined(state.options.y)) {\n state.touch = {\n x: state.options.x,\n y: state.options.y\n };\n }\n delete state.options;\n }\n delete state.timeOffset;\n }\n return touchStateObjects;\n};\n\n\ncommands.performMultiAction = async function performMultiAction (actions, elementId) {\n // Android needs at least two actions to be able to perform a multi pointer gesture\n if (actions.length === 1) {\n throw new Error('Multi Pointer Gestures need at least two actions. ' +\n 'Use Touch Actions for a single action.');\n }\n\n const states = await asyncmap(actions, async (action) => await this.parseTouch(action, true), false);\n\n return await this.doPerformMultiAction(elementId, states);\n};\n\n/**\n * Reason for isolating doPerformMultiAction from performMultiAction is for reusing performMultiAction\n * across android-drivers (like appium-uiautomator2-driver) and to avoid code duplication.\n * Other android-drivers (like appium-uiautomator2-driver) need to override doPerformMultiAction\n * to facilitate performMultiAction.\n */\ncommands.doPerformMultiAction = async function doPerformMultiAction (elementId, states) {\n let opts;\n if (elementId) {\n opts = {\n elementId,\n actions: states\n };\n return await this.bootstrap.sendAction('element:performMultiPointerGesture', opts);\n } else {\n opts = {\n actions: states\n };\n return await this.bootstrap.sendAction('performMultiPointerGesture', opts);\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}