appium-android-driver 5.13.0 → 5.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/index.js +43 -40
  3. package/build/lib/android-helpers.d.ts +136 -0
  4. package/build/lib/android-helpers.d.ts.map +1 -0
  5. package/build/lib/android-helpers.js +760 -679
  6. package/build/lib/android-helpers.js.map +1 -1
  7. package/build/lib/bootstrap.d.ts +29 -0
  8. package/build/lib/bootstrap.d.ts.map +1 -0
  9. package/build/lib/bootstrap.js +192 -179
  10. package/build/lib/bootstrap.js.map +1 -1
  11. package/build/lib/commands/actions.d.ts +209 -0
  12. package/build/lib/commands/actions.d.ts.map +1 -0
  13. package/build/lib/commands/actions.js +327 -265
  14. package/build/lib/commands/actions.js.map +1 -1
  15. package/build/lib/commands/alert.d.ts +10 -0
  16. package/build/lib/commands/alert.d.ts.map +1 -0
  17. package/build/lib/commands/alert.js +12 -18
  18. package/build/lib/commands/alert.js.map +1 -1
  19. package/build/lib/commands/app-management.d.ts +314 -0
  20. package/build/lib/commands/app-management.d.ts.map +1 -0
  21. package/build/lib/commands/app-management.js +278 -110
  22. package/build/lib/commands/app-management.js.map +1 -1
  23. package/build/lib/commands/context.d.ts +94 -0
  24. package/build/lib/commands/context.d.ts.map +1 -0
  25. package/build/lib/commands/context.js +412 -260
  26. package/build/lib/commands/context.js.map +1 -1
  27. package/build/lib/commands/coverage.d.ts +5 -0
  28. package/build/lib/commands/coverage.d.ts.map +1 -0
  29. package/build/lib/commands/coverage.js +14 -17
  30. package/build/lib/commands/coverage.js.map +1 -1
  31. package/build/lib/commands/element.d.ts +36 -0
  32. package/build/lib/commands/element.d.ts.map +1 -0
  33. package/build/lib/commands/element.js +97 -127
  34. package/build/lib/commands/element.js.map +1 -1
  35. package/build/lib/commands/emu-console.d.ts +49 -0
  36. package/build/lib/commands/emu-console.d.ts.map +1 -0
  37. package/build/lib/commands/emu-console.js +36 -25
  38. package/build/lib/commands/emu-console.js.map +1 -1
  39. package/build/lib/commands/execute.d.ts +6 -0
  40. package/build/lib/commands/execute.d.ts.map +1 -0
  41. package/build/lib/commands/execute.js +68 -69
  42. package/build/lib/commands/execute.js.map +1 -1
  43. package/build/lib/commands/file-actions.d.ts +129 -0
  44. package/build/lib/commands/file-actions.d.ts.map +1 -0
  45. package/build/lib/commands/file-actions.js +321 -178
  46. package/build/lib/commands/file-actions.js.map +1 -1
  47. package/build/lib/commands/find.d.ts +13 -0
  48. package/build/lib/commands/find.d.ts.map +1 -0
  49. package/build/lib/commands/find.js +69 -51
  50. package/build/lib/commands/find.js.map +1 -1
  51. package/build/lib/commands/general.d.ts +133 -0
  52. package/build/lib/commands/general.d.ts.map +1 -0
  53. package/build/lib/commands/general.js +275 -216
  54. package/build/lib/commands/general.js.map +1 -1
  55. package/build/lib/commands/ime.d.ts +11 -0
  56. package/build/lib/commands/ime.d.ts.map +1 -0
  57. package/build/lib/commands/ime.js +27 -33
  58. package/build/lib/commands/ime.js.map +1 -1
  59. package/build/lib/commands/index.d.ts +3 -0
  60. package/build/lib/commands/index.d.ts.map +1 -0
  61. package/build/lib/commands/index.js +32 -35
  62. package/build/lib/commands/index.js.map +1 -1
  63. package/build/lib/commands/intent.d.ts +418 -0
  64. package/build/lib/commands/intent.d.ts.map +1 -0
  65. package/build/lib/commands/intent.js +281 -151
  66. package/build/lib/commands/intent.js.map +1 -1
  67. package/build/lib/commands/keyboard.d.ts +6 -0
  68. package/build/lib/commands/keyboard.d.ts.map +1 -0
  69. package/build/lib/commands/keyboard.js +6 -14
  70. package/build/lib/commands/keyboard.js.map +1 -1
  71. package/build/lib/commands/log.d.ts +45 -0
  72. package/build/lib/commands/log.d.ts.map +1 -0
  73. package/build/lib/commands/log.js +117 -103
  74. package/build/lib/commands/log.js.map +1 -1
  75. package/build/lib/commands/media-projection.d.ts +144 -0
  76. package/build/lib/commands/media-projection.d.ts.map +1 -0
  77. package/build/lib/commands/media-projection.js +228 -171
  78. package/build/lib/commands/media-projection.js.map +1 -1
  79. package/build/lib/commands/network.d.ts +139 -0
  80. package/build/lib/commands/network.d.ts.map +1 -0
  81. package/build/lib/commands/network.js +249 -181
  82. package/build/lib/commands/network.js.map +1 -1
  83. package/build/lib/commands/performance.d.ts +101 -0
  84. package/build/lib/commands/performance.d.ts.map +1 -0
  85. package/build/lib/commands/performance.js +390 -236
  86. package/build/lib/commands/performance.js.map +1 -1
  87. package/build/lib/commands/permissions.d.ts +93 -0
  88. package/build/lib/commands/permissions.d.ts.map +1 -0
  89. package/build/lib/commands/permissions.js +133 -93
  90. package/build/lib/commands/permissions.js.map +1 -1
  91. package/build/lib/commands/recordscreen.d.ts +194 -0
  92. package/build/lib/commands/recordscreen.d.ts.map +1 -0
  93. package/build/lib/commands/recordscreen.js +293 -224
  94. package/build/lib/commands/recordscreen.js.map +1 -1
  95. package/build/lib/commands/shell.d.ts +8 -0
  96. package/build/lib/commands/shell.d.ts.map +1 -0
  97. package/build/lib/commands/shell.js +38 -43
  98. package/build/lib/commands/shell.js.map +1 -1
  99. package/build/lib/commands/streamscreen.d.ts +104 -0
  100. package/build/lib/commands/streamscreen.d.ts.map +1 -0
  101. package/build/lib/commands/streamscreen.js +364 -305
  102. package/build/lib/commands/streamscreen.js.map +1 -1
  103. package/build/lib/commands/system-bars.d.ts +100 -0
  104. package/build/lib/commands/system-bars.d.ts.map +1 -0
  105. package/build/lib/commands/system-bars.js +148 -90
  106. package/build/lib/commands/system-bars.js.map +1 -1
  107. package/build/lib/commands/touch.d.ts +30 -0
  108. package/build/lib/commands/touch.d.ts.map +1 -0
  109. package/build/lib/commands/touch.js +311 -287
  110. package/build/lib/commands/touch.js.map +1 -1
  111. package/build/lib/desired-caps.d.ts +353 -0
  112. package/build/lib/desired-caps.d.ts.map +1 -0
  113. package/build/lib/desired-caps.js +291 -292
  114. package/build/lib/desired-caps.js.map +1 -1
  115. package/build/lib/driver.d.ts +430 -0
  116. package/build/lib/driver.d.ts.map +1 -0
  117. package/build/lib/driver.js +449 -384
  118. package/build/lib/driver.js.map +1 -1
  119. package/build/lib/logger.d.ts +3 -0
  120. package/build/lib/logger.d.ts.map +1 -0
  121. package/build/lib/logger.js +5 -11
  122. package/build/lib/logger.js.map +1 -1
  123. package/build/lib/method-map.d.ts +389 -0
  124. package/build/lib/method-map.d.ts.map +1 -0
  125. package/build/lib/method-map.js +220 -394
  126. package/build/lib/method-map.js.map +1 -1
  127. package/build/lib/stubs.d.ts +8 -0
  128. package/build/lib/stubs.d.ts.map +1 -0
  129. package/build/lib/stubs.js +5 -0
  130. package/build/lib/stubs.js.map +1 -0
  131. package/build/lib/uiautomator.d.ts +24 -0
  132. package/build/lib/uiautomator.d.ts.map +1 -0
  133. package/build/lib/uiautomator.js +86 -82
  134. package/build/lib/uiautomator.js.map +1 -1
  135. package/build/lib/unlock-helpers.d.ts +38 -0
  136. package/build/lib/unlock-helpers.d.ts.map +1 -0
  137. package/build/lib/unlock-helpers.js +228 -204
  138. package/build/lib/unlock-helpers.js.map +1 -1
  139. package/build/lib/utils.d.ts +11 -0
  140. package/build/lib/utils.d.ts.map +1 -0
  141. package/build/lib/utils.js +23 -18
  142. package/build/lib/utils.js.map +1 -1
  143. package/build/lib/webview-helpers.d.ts +223 -0
  144. package/build/lib/webview-helpers.d.ts.map +1 -0
  145. package/build/lib/webview-helpers.js +476 -298
  146. package/build/lib/webview-helpers.js.map +1 -1
  147. package/index.js +3 -1
  148. package/lib/android-helpers.js +2 -1
  149. package/lib/stubs.ts +8 -0
  150. package/lib/unlock-helpers.js +2 -2
  151. package/package.json +23 -14
@@ -1,18 +1,16 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.helpers = exports.default = exports.commands = void 0;
8
- require("source-map-support/register");
9
- var _androidHelpers = _interopRequireDefault(require("../android-helpers"));
10
- var _support = require("@appium/support");
11
- var _path = _interopRequireDefault(require("path"));
12
- var _bluebird = _interopRequireDefault(require("bluebird"));
13
- var _sharp = _interopRequireDefault(require("sharp"));
14
- var _teen_process = require("teen_process");
15
- var _utils = require("../utils");
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.helpers = exports.commands = void 0;
7
+ const android_helpers_1 = __importDefault(require("../android-helpers"));
8
+ const support_1 = require("@appium/support");
9
+ const path_1 = __importDefault(require("path"));
10
+ const bluebird_1 = __importDefault(require("bluebird"));
11
+ const sharp_1 = __importDefault(require("sharp"));
12
+ const teen_process_1 = require("teen_process");
13
+ const utils_1 = require("../utils");
16
14
  const swipeStepsPerSec = 28;
17
15
  const dragStepsPerSec = 40;
18
16
  const commands = {};
@@ -21,328 +19,392 @@ const helpers = {};
21
19
  exports.helpers = helpers;
22
20
  const extensions = {};
23
21
  commands.keyevent = async function keyevent(keycode, metastate = null) {
24
- this.log.warn('keyevent will be deprecated use pressKeyCode');
25
- return await this.pressKeyCode(keycode, metastate);
22
+ // TODO deprecate keyevent; currently wd only implements keyevent
23
+ this.log.warn('keyevent will be deprecated use pressKeyCode');
24
+ return await this.pressKeyCode(keycode, metastate);
26
25
  };
27
26
  commands.pressKeyCode = async function pressKeyCode(keycode, metastate = null) {
28
- return await this.bootstrap.sendAction('pressKeyCode', {
29
- keycode,
30
- metastate
31
- });
27
+ return await this.bootstrap.sendAction('pressKeyCode', { keycode, metastate });
32
28
  };
33
29
  commands.longPressKeyCode = async function longPressKeyCode(keycode, metastate = null) {
34
- return await this.bootstrap.sendAction('longPressKeyCode', {
35
- keycode,
36
- metastate
37
- });
30
+ return await this.bootstrap.sendAction('longPressKeyCode', { keycode, metastate });
38
31
  };
39
32
  commands.getOrientation = async function getOrientation() {
40
- let params = {
41
- naturalOrientation: !!this.opts.androidNaturalOrientation
42
- };
43
- let orientation = await this.bootstrap.sendAction('orientation', params);
44
- return orientation.toUpperCase();
33
+ let params = {
34
+ naturalOrientation: !!this.opts.androidNaturalOrientation,
35
+ };
36
+ let orientation = await this.bootstrap.sendAction('orientation', params);
37
+ return orientation.toUpperCase();
45
38
  };
46
39
  commands.setOrientation = async function setOrientation(orientation) {
47
- orientation = orientation.toUpperCase();
48
- let params = {
49
- orientation,
50
- naturalOrientation: !!this.opts.androidNaturalOrientation
51
- };
52
- return await this.bootstrap.sendAction('orientation', params);
40
+ orientation = orientation.toUpperCase();
41
+ let params = {
42
+ orientation,
43
+ naturalOrientation: !!this.opts.androidNaturalOrientation,
44
+ };
45
+ return await this.bootstrap.sendAction('orientation', params);
53
46
  };
54
47
  commands.fakeFlick = async function fakeFlick(xSpeed, ySpeed) {
55
- return await this.bootstrap.sendAction('flick', {
56
- xSpeed,
57
- ySpeed
58
- });
48
+ return await this.bootstrap.sendAction('flick', { xSpeed, ySpeed });
59
49
  };
60
50
  commands.fakeFlickElement = async function fakeFlickElement(elementId, xoffset, yoffset, speed) {
61
- let params = {
62
- xoffset,
63
- yoffset,
64
- speed,
65
- elementId
66
- };
67
- return await this.bootstrap.sendAction('element:flick', params);
51
+ let params = { xoffset, yoffset, speed, elementId };
52
+ return await this.bootstrap.sendAction('element:flick', params);
68
53
  };
69
54
  commands.swipe = async function swipe(startX, startY, endX, endY, duration, touchCount, elId) {
70
- if (startX === 'null') {
71
- startX = 0.5;
72
- }
73
- if (startY === 'null') {
74
- startY = 0.5;
75
- }
76
- let swipeOpts = {
77
- startX,
78
- startY,
79
- endX,
80
- endY,
81
- steps: Math.round(duration * swipeStepsPerSec)
82
- };
83
- if (_support.util.hasValue(elId)) {
84
- swipeOpts.elementId = elId;
85
- }
86
- return await this.doSwipe(swipeOpts);
55
+ if (startX === 'null') {
56
+ startX = 0.5;
57
+ }
58
+ if (startY === 'null') {
59
+ startY = 0.5;
60
+ }
61
+ let swipeOpts = { startX, startY, endX, endY,
62
+ steps: Math.round(duration * swipeStepsPerSec) };
63
+ // going the long way and checking for undefined and null since
64
+ // we can't be assured `elId` is a string and not an int
65
+ if (support_1.util.hasValue(elId)) {
66
+ swipeOpts.elementId = elId;
67
+ }
68
+ return await this.doSwipe(swipeOpts);
87
69
  };
88
70
  commands.doSwipe = async function doSwipe(swipeOpts) {
89
- if (_support.util.hasValue(swipeOpts.elementId)) {
90
- return await this.bootstrap.sendAction('element:swipe', swipeOpts);
91
- } else {
92
- return await this.bootstrap.sendAction('swipe', swipeOpts);
93
- }
71
+ if (support_1.util.hasValue(swipeOpts.elementId)) {
72
+ return await this.bootstrap.sendAction('element:swipe', swipeOpts);
73
+ }
74
+ else {
75
+ return await this.bootstrap.sendAction('swipe', swipeOpts);
76
+ }
94
77
  };
95
78
  commands.pinchClose = async function pinchClose(startX, startY, endX, endY, duration, percent, steps, elId) {
96
- let pinchOpts = {
97
- direction: 'in',
98
- elementId: elId,
99
- percent,
100
- steps
101
- };
102
- return await this.bootstrap.sendAction('element:pinch', pinchOpts);
79
+ let pinchOpts = {
80
+ direction: 'in',
81
+ elementId: elId,
82
+ percent,
83
+ steps
84
+ };
85
+ return await this.bootstrap.sendAction('element:pinch', pinchOpts);
103
86
  };
104
87
  commands.pinchOpen = async function pinchOpen(startX, startY, endX, endY, duration, percent, steps, elId) {
105
- let pinchOpts = {
106
- direction: 'out',
107
- elementId: elId,
108
- percent,
109
- steps
110
- };
111
- return await this.bootstrap.sendAction('element:pinch', pinchOpts);
88
+ let pinchOpts = { direction: 'out', elementId: elId, percent, steps };
89
+ return await this.bootstrap.sendAction('element:pinch', pinchOpts);
112
90
  };
113
91
  commands.flick = async function flick(element, xSpeed, ySpeed, xOffset, yOffset, speed) {
114
- if (element) {
115
- await this.fakeFlickElement(element, xOffset, yOffset, speed);
116
- } else {
117
- await this.fakeFlick(xSpeed, ySpeed);
118
- }
92
+ if (element) {
93
+ await this.fakeFlickElement(element, xOffset, yOffset, speed);
94
+ }
95
+ else {
96
+ await this.fakeFlick(xSpeed, ySpeed);
97
+ }
119
98
  };
120
99
  commands.drag = async function drag(startX, startY, endX, endY, duration, touchCount, elementId, destElId) {
121
- let dragOpts = {
122
- elementId,
123
- destElId,
124
- startX,
125
- startY,
126
- endX,
127
- endY,
128
- steps: Math.round(duration * dragStepsPerSec)
129
- };
130
- return await this.doDrag(dragOpts);
100
+ let dragOpts = {
101
+ elementId, destElId, startX, startY, endX, endY,
102
+ steps: Math.round(duration * dragStepsPerSec)
103
+ };
104
+ return await this.doDrag(dragOpts);
131
105
  };
132
106
  commands.doDrag = async function doDrag(dragOpts) {
133
- if (_support.util.hasValue(dragOpts.elementId)) {
134
- return await this.bootstrap.sendAction('element:drag', dragOpts);
135
- } else {
136
- return await this.bootstrap.sendAction('drag', dragOpts);
137
- }
107
+ if (support_1.util.hasValue(dragOpts.elementId)) {
108
+ return await this.bootstrap.sendAction('element:drag', dragOpts);
109
+ }
110
+ else {
111
+ return await this.bootstrap.sendAction('drag', dragOpts);
112
+ }
138
113
  };
139
114
  commands.lock = async function lock(seconds) {
140
- await this.adb.lock();
141
- if (isNaN(seconds)) {
142
- return;
143
- }
144
- const floatSeconds = parseFloat(seconds);
145
- if (floatSeconds <= 0) {
146
- return;
147
- }
148
- await _bluebird.default.delay(1000 * floatSeconds);
149
- await this.unlock();
115
+ await this.adb.lock();
116
+ if (isNaN(seconds)) {
117
+ return;
118
+ }
119
+ const floatSeconds = parseFloat(seconds);
120
+ if (floatSeconds <= 0) {
121
+ return;
122
+ }
123
+ await bluebird_1.default.delay(1000 * floatSeconds);
124
+ await this.unlock();
150
125
  };
151
126
  commands.isLocked = async function isLocked() {
152
- return await this.adb.isScreenLocked();
127
+ return await this.adb.isScreenLocked();
153
128
  };
154
129
  commands.unlock = async function unlock() {
155
- return await _androidHelpers.default.unlock(this, this.adb, this.caps);
130
+ return await android_helpers_1.default.unlock(this, this.adb, this.caps);
156
131
  };
157
132
  commands.openNotifications = async function openNotifications() {
158
- return await this.bootstrap.sendAction('openNotification');
133
+ return await this.bootstrap.sendAction('openNotification');
159
134
  };
160
135
  commands.setLocation = async function setLocation(latitude, longitude) {
161
- return await this.adb.sendTelnetCommand(`geo fix ${longitude} ${latitude}`);
136
+ return await this.adb.sendTelnetCommand(`geo fix ${longitude} ${latitude}`);
162
137
  };
163
138
  commands.fingerprint = async function fingerprint(fingerprintId) {
164
- if (!this.isEmulator()) {
165
- this.log.errorAndThrow('fingerprint method is only available for emulators');
166
- }
167
- await this.adb.fingerprint(fingerprintId);
168
- };
139
+ if (!this.isEmulator()) {
140
+ this.log.errorAndThrow('fingerprint method is only available for emulators');
141
+ }
142
+ await this.adb.fingerprint(fingerprintId);
143
+ };
144
+ /**
145
+ * @typedef {Object} FingerprintOpts
146
+ * @param {string|number} fingerprintId The value is the finger_id for the finger that
147
+ * was "scanned". It is a unique integer that you assign for each virtual fingerprint.
148
+ * When the app is running you can run this same command each time the
149
+ * emulator prompts you for a fingerprint, you can run the adb command and pass it
150
+ * the finger_id to simulate the fingerprint scan.
151
+ */
152
+ /**
153
+ * Emulate fingerprint on Android Emulator.
154
+ * Only works on API 23+
155
+ *
156
+ * @param {FingerprintOpts} opts
157
+ */
169
158
  commands.mobileFingerprint = async function mobileFingerprint(opts = {}) {
170
- const {
171
- fingerprintId
172
- } = (0, _utils.requireArgs)('fingerprintId', opts);
173
- await this.fingerprint(fingerprintId);
159
+ const { fingerprintId } = (0, utils_1.requireArgs)('fingerprintId', opts);
160
+ await this.fingerprint(fingerprintId);
174
161
  };
175
162
  commands.sendSMS = async function sendSMS(phoneNumber, message) {
176
- if (!this.isEmulator()) {
177
- this.log.errorAndThrow('sendSMS method is only available for emulators');
178
- }
179
- await this.adb.sendSMS(phoneNumber, message);
180
- };
163
+ if (!this.isEmulator()) {
164
+ this.log.errorAndThrow('sendSMS method is only available for emulators');
165
+ }
166
+ await this.adb.sendSMS(phoneNumber, message);
167
+ };
168
+ /**
169
+ * @typedef {Object} SendSmsOptions
170
+ * @property {string} phoneNumber The phone number to send SMS to
171
+ * @property {string} message The message payload
172
+ */
173
+ /**
174
+ * Emulate sending an SMS to the given phone number.
175
+ * Only works on emulators.
176
+ *
177
+ * @param {SendSmsOptions} opts
178
+ */
181
179
  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);
180
+ const { phoneNumber, message } = (0, utils_1.requireArgs)(['phoneNumber', 'message'], opts);
181
+ await this.sendSMS(phoneNumber, message);
187
182
  };
188
183
  commands.gsmCall = async function gsmCall(phoneNumber, action) {
189
- if (!this.isEmulator()) {
190
- this.log.errorAndThrow('gsmCall method is only available for emulators');
191
- }
192
- await this.adb.gsmCall(phoneNumber, action);
193
- };
184
+ if (!this.isEmulator()) {
185
+ this.log.errorAndThrow('gsmCall method is only available for emulators');
186
+ }
187
+ await this.adb.gsmCall(phoneNumber, action);
188
+ };
189
+ /**
190
+ * @typedef {Object} GsmCallOptions
191
+ * @property {string} phoneNumber The phone number to call to
192
+ * @property {call|accept|cancel|hold} action One of possible actions to take
193
+ */
194
+ /**
195
+ * Emulate a GSM call to the given phone number.
196
+ * Only works on emulators.
197
+ *
198
+ * @param {GsmCallOptions} opts
199
+ */
194
200
  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);
201
+ const { phoneNumber, action } = (0, utils_1.requireArgs)(['phoneNumber', 'action'], opts);
202
+ await this.gsmCall(phoneNumber, action);
200
203
  };
201
204
  commands.gsmSignal = async function gsmSignal(signalStrengh) {
202
- if (!this.isEmulator()) {
203
- this.log.errorAndThrow('gsmSignal method is only available for emulators');
204
- }
205
- await this.adb.gsmSignal(signalStrengh);
206
- };
205
+ if (!this.isEmulator()) {
206
+ this.log.errorAndThrow('gsmSignal method is only available for emulators');
207
+ }
208
+ await this.adb.gsmSignal(signalStrengh);
209
+ };
210
+ /**
211
+ * @typedef {Object} GsmSignalOptions
212
+ * @property {0|1|2|3|4} strength One of possible signal strength values, where 4 is the best signal.
213
+ */
214
+ /**
215
+ * Emulate GSM signal strength change event.
216
+ * Only works on emulators.
217
+ *
218
+ * @param {GsmSignalOptions} opts
219
+ */
207
220
  commands.mobileGsmSignal = async function mobileGsmSignal(opts = {}) {
208
- const {
209
- strength
210
- } = (0, _utils.requireArgs)('strength', opts);
211
- await this.gsmSignal(strength);
221
+ const { strength } = (0, utils_1.requireArgs)('strength', opts);
222
+ await this.gsmSignal(strength);
212
223
  };
213
224
  commands.gsmVoice = async function gsmVoice(state) {
214
- if (!this.isEmulator()) {
215
- this.log.errorAndThrow('gsmVoice method is only available for emulators');
216
- }
217
- await this.adb.gsmVoice(state);
218
- };
225
+ if (!this.isEmulator()) {
226
+ this.log.errorAndThrow('gsmVoice method is only available for emulators');
227
+ }
228
+ await this.adb.gsmVoice(state);
229
+ };
230
+ /**
231
+ * @typedef {Object} GsmVoiceOptions
232
+ * @property {on|off} state
233
+ */
234
+ /**
235
+ * Emulate GSM voice state change event.
236
+ * Only works on emulators.
237
+ *
238
+ * @param {GsmVoiceOptions} opts
239
+ */
219
240
  commands.mobileGsmVoice = async function mobileGsmVoice(opts = {}) {
220
- const {
221
- state
222
- } = (0, _utils.requireArgs)('state', opts);
223
- await this.gsmVoice(state);
241
+ const { state } = (0, utils_1.requireArgs)('state', opts);
242
+ await this.gsmVoice(state);
224
243
  };
225
244
  commands.powerAC = async function powerAC(state) {
226
- if (!this.isEmulator()) {
227
- this.log.errorAndThrow('powerAC method is only available for emulators');
228
- }
229
- await this.adb.powerAC(state);
230
- };
245
+ if (!this.isEmulator()) {
246
+ this.log.errorAndThrow('powerAC method is only available for emulators');
247
+ }
248
+ await this.adb.powerAC(state);
249
+ };
250
+ /**
251
+ * @typedef {Object} PowerAcOptions
252
+ * @property {on|off} state
253
+ */
254
+ /**
255
+ * Emulate AC power state change.
256
+ * Only works on emulators.
257
+ *
258
+ * @param {GsmVoiceOptions} opts
259
+ */
231
260
  commands.mobilePowerAc = async function mobilePowerAc(opts = {}) {
232
- const {
233
- state
234
- } = (0, _utils.requireArgs)('state', opts);
235
- await this.powerAC(state);
261
+ const { state } = (0, utils_1.requireArgs)('state', opts);
262
+ await this.powerAC(state);
236
263
  };
237
264
  commands.powerCapacity = async function powerCapacity(batteryPercent) {
238
- if (!this.isEmulator()) {
239
- this.log.errorAndThrow('powerCapacity method is only available for emulators');
240
- }
241
- await this.adb.powerCapacity(batteryPercent);
242
- };
265
+ if (!this.isEmulator()) {
266
+ this.log.errorAndThrow('powerCapacity method is only available for emulators');
267
+ }
268
+ await this.adb.powerCapacity(batteryPercent);
269
+ };
270
+ /**
271
+ * @typedef {Object} PowerCapacityOptions
272
+ * @property {number} percent - Percentage value in range [0, 100]
273
+ */
274
+ /**
275
+ * Emulate power capacity change.
276
+ * Only works on emulators.
277
+ *
278
+ * @param {PowerCapacityOptions} opts
279
+ */
243
280
  commands.mobilePowerCapacity = async function mobilePowerCapacity(opts = {}) {
244
- const {
245
- percent
246
- } = (0, _utils.requireArgs)('percent', opts);
247
- await this.powerCapacity(percent);
281
+ const { percent } = (0, utils_1.requireArgs)('percent', opts);
282
+ await this.powerCapacity(percent);
248
283
  };
249
284
  commands.networkSpeed = async function networkSpeed(networkSpeed) {
250
- if (!this.isEmulator()) {
251
- this.log.errorAndThrow('networkSpeed method is only available for emulators');
252
- }
253
- await this.adb.networkSpeed(networkSpeed);
254
- };
285
+ if (!this.isEmulator()) {
286
+ this.log.errorAndThrow('networkSpeed method is only available for emulators');
287
+ }
288
+ await this.adb.networkSpeed(networkSpeed);
289
+ };
290
+ /**
291
+ * @typedef {Object} NetworkSpeedOptions
292
+ * @property {gsm|scsd|gprs|edge|umts|hsdpa|lte|evdo|full} speed
293
+ */
294
+ /**
295
+ * Emulate different network connection speed modes.
296
+ * Only works on emulators.
297
+ *
298
+ * @param {NetworkSpeedOptions} opts
299
+ */
255
300
  commands.mobileNetworkSpeed = async function mobileNetworkSpeed(opts = {}) {
256
- const {
257
- speed
258
- } = (0, _utils.requireArgs)('speed', opts);
259
- await this.networkSpeed(speed);
260
- };
301
+ const { speed } = (0, utils_1.requireArgs)('speed', opts);
302
+ await this.networkSpeed(speed);
303
+ };
304
+ /**
305
+ * Emulate sensors values on the connected emulator.
306
+ *
307
+ * @typedef {Object} Sensor
308
+ * @property {string} sensorType - sensor type declared in adb.SENSORS
309
+ * @property {string} value - value to set to the sensor
310
+ *
311
+ * @param {Object} Sensor
312
+ * @throws {Error} - If sensorType is not defined
313
+ * @throws {Error} - If value for the se sor is not defined
314
+ * @throws {Error} - If deviceType is not an emulator
315
+ */
261
316
  commands.sensorSet = async function sensorSet(sensor = {}) {
262
- const {
263
- sensorType,
264
- value
265
- } = sensor;
266
- if (!_support.util.hasValue(sensorType)) {
267
- this.log.errorAndThrow(`'sensorType' argument is required`);
268
- }
269
- if (!_support.util.hasValue(value)) {
270
- this.log.errorAndThrow(`'value' argument is required`);
271
- }
272
- if (!this.isEmulator()) {
273
- this.log.errorAndThrow('sensorSet method is only available for emulators');
274
- }
275
- await this.adb.sensorSet(sensorType, value);
317
+ const { sensorType, value } = sensor;
318
+ if (!support_1.util.hasValue(sensorType)) {
319
+ this.log.errorAndThrow(`'sensorType' argument is required`);
320
+ }
321
+ if (!support_1.util.hasValue(value)) {
322
+ this.log.errorAndThrow(`'value' argument is required`);
323
+ }
324
+ if (!this.isEmulator()) {
325
+ this.log.errorAndThrow('sensorSet method is only available for emulators');
326
+ }
327
+ await this.adb.sensorSet(sensorType, value);
276
328
  };
329
+ /**
330
+ * @param {ADB} adb
331
+ * @param {Object} opts
332
+ * @returns {Promise<sharp>}
333
+ */
277
334
  helpers.getScreenshotDataWithAdbShell = async function getScreenshotDataWithAdbShell(adb, opts) {
278
- const localFile = await _support.tempDir.path({
279
- prefix: 'appium',
280
- suffix: '.png'
281
- });
282
- if (await _support.fs.exists(localFile)) {
283
- await _support.fs.unlink(localFile);
284
- }
285
- try {
286
- const pngDir = opts.androidScreenshotPath || '/data/local/tmp/';
287
- const png = _path.default.posix.resolve(pngDir, 'screenshot.png');
288
- await adb.shell(['/system/bin/rm', `${png};`, '/system/bin/screencap', '-p', png]);
289
- if (!(await adb.fileSize(png))) {
290
- throw new Error('The size of the taken screenshot equals to zero.');
335
+ const localFile = await support_1.tempDir.path({ prefix: 'appium', suffix: '.png' });
336
+ if (await support_1.fs.exists(localFile)) {
337
+ await support_1.fs.unlink(localFile);
291
338
  }
292
- await adb.pull(png, localFile);
293
- return (0, _sharp.default)(localFile);
294
- } finally {
295
- if (await _support.fs.exists(localFile)) {
296
- await _support.fs.unlink(localFile);
339
+ try {
340
+ const pngDir = opts.androidScreenshotPath || '/data/local/tmp/';
341
+ const png = path_1.default.posix.resolve(pngDir, 'screenshot.png');
342
+ await adb.shell(['/system/bin/rm', `${png};`, '/system/bin/screencap', '-p', png]);
343
+ if (!await adb.fileSize(png)) {
344
+ throw new Error('The size of the taken screenshot equals to zero.');
345
+ }
346
+ await adb.pull(png, localFile);
347
+ return (0, sharp_1.default)(localFile);
348
+ }
349
+ finally {
350
+ if (await support_1.fs.exists(localFile)) {
351
+ await support_1.fs.unlink(localFile);
352
+ }
297
353
  }
298
- }
299
354
  };
355
+ /**
356
+ * @param {ADB} adb
357
+ * @returns {Promise<sharp>}
358
+ */
300
359
  helpers.getScreenshotDataWithAdbExecOut = async function getScreenshotDataWithAdbExecOut(adb) {
301
- const {
302
- stdout,
303
- stderr,
304
- code
305
- } = await (0, _teen_process.exec)(adb.executable.path, [...adb.executable.defaultArgs, 'exec-out', '/system/bin/screencap', '-p'], {
306
- encoding: 'binary',
307
- isBuffer: true
308
- });
309
- if (code || stderr.length) {
310
- throw new Error(`Screenshot returned error, code: '${code}', stderr: '${stderr.toString()}'`);
311
- }
312
- if (!stdout.length) {
313
- throw new Error('Screenshot returned no data');
314
- }
315
- return (0, _sharp.default)(stdout);
360
+ const { stdout, stderr, code } = await (0, teen_process_1.exec)(adb.executable.path, [...adb.executable.defaultArgs, 'exec-out', '/system/bin/screencap', '-p'], { encoding: 'binary', isBuffer: true });
361
+ // if there is an error, throw
362
+ if (code || stderr.length) {
363
+ throw new Error(`Screenshot returned error, code: '${code}', stderr: '${stderr.toString()}'`);
364
+ }
365
+ // if we don't get anything at all, throw
366
+ if (!stdout.length) {
367
+ throw new Error('Screenshot returned no data');
368
+ }
369
+ return (0, sharp_1.default)(stdout);
316
370
  };
317
371
  commands.getScreenshot = async function getScreenshot() {
318
- const apiLevel = await this.adb.getApiLevel();
319
- let image = null;
320
- if (apiLevel > 20) {
321
- try {
322
- image = await this.getScreenshotDataWithAdbExecOut(this.adb);
323
- } catch (e) {
324
- this.log.info(`Cannot get screenshot data with 'adb exec-out' because of '${e.message}'. ` + `Defaulting to 'adb shell' call`);
372
+ const apiLevel = await this.adb.getApiLevel();
373
+ let image = null;
374
+ if (apiLevel > 20) {
375
+ try {
376
+ // This screenshoting approach is way faster, since it requires less external commands
377
+ // to be executed. Unfortunately, exec-out option is only supported by newer Android/SDK versions (5.0 and later)
378
+ image = await this.getScreenshotDataWithAdbExecOut(this.adb);
379
+ }
380
+ catch (e) {
381
+ this.log.info(`Cannot get screenshot data with 'adb exec-out' because of '${e.message}'. ` +
382
+ `Defaulting to 'adb shell' call`);
383
+ }
325
384
  }
326
- }
327
- if (!image) {
328
- try {
329
- image = await this.getScreenshotDataWithAdbShell(this.adb, this.opts);
330
- } catch (e) {
331
- const err = `Cannot get screenshot data because of '${e.message}'. ` + `Make sure the 'LayoutParams.FLAG_SECURE' is not set for ` + `the current view`;
332
- this.log.errorAndThrow(err);
385
+ if (!image) {
386
+ try {
387
+ image = await this.getScreenshotDataWithAdbShell(this.adb, this.opts);
388
+ }
389
+ catch (e) {
390
+ const err = `Cannot get screenshot data because of '${e.message}'. ` +
391
+ `Make sure the 'LayoutParams.FLAG_SECURE' is not set for ` +
392
+ `the current view`;
393
+ this.log.errorAndThrow(err);
394
+ }
333
395
  }
334
- }
335
- if (apiLevel < 23) {
336
- let screenOrientation = await this.adb.getScreenOrientation();
337
- try {
338
- image = image.rotate(-90 * screenOrientation);
339
- } catch (err) {
340
- this.log.warn(`Could not rotate screenshot due to error: ${err}`);
396
+ if (apiLevel < 23) {
397
+ // Android bug 8433742 - rotate screenshot if screen is rotated
398
+ let screenOrientation = await this.adb.getScreenOrientation();
399
+ try {
400
+ image = image.rotate(-90 * screenOrientation);
401
+ }
402
+ catch (err) {
403
+ this.log.warn(`Could not rotate screenshot due to error: ${err}`);
404
+ }
341
405
  }
342
- }
343
- return (await image.toBuffer()).toString('base64');
406
+ return (await image.toBuffer()).toString('base64');
344
407
  };
345
408
  Object.assign(extensions, commands, helpers);
346
- var _default = extensions;
347
- exports.default = _default;
348
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYW5kcm9pZEhlbHBlcnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zdXBwb3J0IiwiX3BhdGgiLCJfYmx1ZWJpcmQiLCJfc2hhcnAiLCJfdGVlbl9wcm9jZXNzIiwiX3V0aWxzIiwic3dpcGVTdGVwc1BlclNlYyIsImRyYWdTdGVwc1BlclNlYyIsImNvbW1hbmRzIiwiZXhwb3J0cyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwia2V5ZXZlbnQiLCJrZXljb2RlIiwibWV0YXN0YXRlIiwibG9nIiwid2FybiIsInByZXNzS2V5Q29kZSIsImJvb3RzdHJhcCIsInNlbmRBY3Rpb24iLCJsb25nUHJlc3NLZXlDb2RlIiwiZ2V0T3JpZW50YXRpb24iLCJwYXJhbXMiLCJuYXR1cmFsT3JpZW50YXRpb24iLCJvcHRzIiwiYW5kcm9pZE5hdHVyYWxPcmllbnRhdGlvbiIsIm9yaWVudGF0aW9uIiwidG9VcHBlckNhc2UiLCJzZXRPcmllbnRhdGlvbiIsImZha2VGbGljayIsInhTcGVlZCIsInlTcGVlZCIsImZha2VGbGlja0VsZW1lbnQiLCJlbGVtZW50SWQiLCJ4b2Zmc2V0IiwieW9mZnNldCIsInNwZWVkIiwic3dpcGUiLCJzdGFydFgiLCJzdGFydFkiLCJlbmRYIiwiZW5kWSIsImR1cmF0aW9uIiwidG91Y2hDb3VudCIsImVsSWQiLCJzd2lwZU9wdHMiLCJzdGVwcyIsIk1hdGgiLCJyb3VuZCIsInV0aWwiLCJoYXNWYWx1ZSIsImRvU3dpcGUiLCJwaW5jaENsb3NlIiwicGVyY2VudCIsInBpbmNoT3B0cyIsImRpcmVjdGlvbiIsInBpbmNoT3BlbiIsImZsaWNrIiwiZWxlbWVudCIsInhPZmZzZXQiLCJ5T2Zmc2V0IiwiZHJhZyIsImRlc3RFbElkIiwiZHJhZ09wdHMiLCJkb0RyYWciLCJsb2NrIiwic2Vjb25kcyIsImFkYiIsImlzTmFOIiwiZmxvYXRTZWNvbmRzIiwicGFyc2VGbG9hdCIsIkIiLCJkZWxheSIsInVubG9jayIsImlzTG9ja2VkIiwiaXNTY3JlZW5Mb2NrZWQiLCJhbmRyb2lkSGVscGVycyIsImNhcHMiLCJvcGVuTm90aWZpY2F0aW9ucyIsInNldExvY2F0aW9uIiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJzZW5kVGVsbmV0Q29tbWFuZCIsImZpbmdlcnByaW50IiwiZmluZ2VycHJpbnRJZCIsImlzRW11bGF0b3IiLCJlcnJvckFuZFRocm93IiwibW9iaWxlRmluZ2VycHJpbnQiLCJyZXF1aXJlQXJncyIsInNlbmRTTVMiLCJwaG9uZU51bWJlciIsIm1lc3NhZ2UiLCJtb2JpbGVTZW5kU21zIiwiZ3NtQ2FsbCIsImFjdGlvbiIsIm1vYmlsZUdzbUNhbGwiLCJnc21TaWduYWwiLCJzaWduYWxTdHJlbmdoIiwibW9iaWxlR3NtU2lnbmFsIiwic3RyZW5ndGgiLCJnc21Wb2ljZSIsInN0YXRlIiwibW9iaWxlR3NtVm9pY2UiLCJwb3dlckFDIiwibW9iaWxlUG93ZXJBYyIsInBvd2VyQ2FwYWNpdHkiLCJiYXR0ZXJ5UGVyY2VudCIsIm1vYmlsZVBvd2VyQ2FwYWNpdHkiLCJuZXR3b3JrU3BlZWQiLCJtb2JpbGVOZXR3b3JrU3BlZWQiLCJzZW5zb3JTZXQiLCJzZW5zb3IiLCJzZW5zb3JUeXBlIiwidmFsdWUiLCJnZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJTaGVsbCIsImxvY2FsRmlsZSIsInRlbXBEaXIiLCJwYXRoIiwicHJlZml4Iiwic3VmZml4IiwiZnMiLCJleGlzdHMiLCJ1bmxpbmsiLCJwbmdEaXIiLCJhbmRyb2lkU2NyZWVuc2hvdFBhdGgiLCJwbmciLCJwb3NpeCIsInJlc29sdmUiLCJzaGVsbCIsImZpbGVTaXplIiwiRXJyb3IiLCJwdWxsIiwic2hhcnAiLCJnZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0Iiwic3Rkb3V0Iiwic3RkZXJyIiwiY29kZSIsImV4ZWMiLCJleGVjdXRhYmxlIiwiZGVmYXVsdEFyZ3MiLCJlbmNvZGluZyIsImlzQnVmZmVyIiwibGVuZ3RoIiwidG9TdHJpbmciLCJnZXRTY3JlZW5zaG90IiwiYXBpTGV2ZWwiLCJnZXRBcGlMZXZlbCIsImltYWdlIiwiZSIsImluZm8iLCJlcnIiLCJzY3JlZW5PcmllbnRhdGlvbiIsImdldFNjcmVlbk9yaWVudGF0aW9uIiwicm90YXRlIiwidG9CdWZmZXIiLCJPYmplY3QiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYW5kcm9pZEhlbHBlcnMgZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IGZzLCB1dGlsLCB0ZW1wRGlyfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgc2hhcnAgZnJvbSAnc2hhcnAnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyByZXF1aXJlQXJncyB9IGZyb20gJy4uL3V0aWxzJztcblxuY29uc3Qgc3dpcGVTdGVwc1BlclNlYyA9IDI4O1xuY29uc3QgZHJhZ1N0ZXBzUGVyU2VjID0gNDA7XG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5jb25zdCBoZWxwZXJzID0ge307XG5jb25zdCBleHRlbnNpb25zID0ge307XG5cbmNvbW1hbmRzLmtleWV2ZW50ID0gYXN5bmMgZnVuY3Rpb24ga2V5ZXZlbnQgKGtleWNvZGUsIG1ldGFzdGF0ZSA9IG51bGwpIHtcbiAgLy8gVE9ETyBkZXByZWNhdGUga2V5ZXZlbnQ7IGN1cnJlbnRseSB3ZCBvbmx5IGltcGxlbWVudHMga2V5ZXZlbnRcbiAgdGhpcy5sb2cud2Fybigna2V5ZXZlbnQgd2lsbCBiZSBkZXByZWNhdGVkIHVzZSBwcmVzc0tleUNvZGUnKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJlc3NLZXlDb2RlKGtleWNvZGUsIG1ldGFzdGF0ZSk7XG59O1xuXG5jb21tYW5kcy5wcmVzc0tleUNvZGUgPSBhc3luYyBmdW5jdGlvbiBwcmVzc0tleUNvZGUgKGtleWNvZGUsIG1ldGFzdGF0ZSA9IG51bGwpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3ByZXNzS2V5Q29kZScsIHtrZXljb2RlLCBtZXRhc3RhdGV9KTtcbn07XG5cbmNvbW1hbmRzLmxvbmdQcmVzc0tleUNvZGUgPSBhc3luYyBmdW5jdGlvbiBsb25nUHJlc3NLZXlDb2RlIChrZXljb2RlLCBtZXRhc3RhdGUgPSBudWxsKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdsb25nUHJlc3NLZXlDb2RlJywge2tleWNvZGUsIG1ldGFzdGF0ZX0pO1xufTtcblxuY29tbWFuZHMuZ2V0T3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRPcmllbnRhdGlvbiAoKSB7XG4gIGxldCBwYXJhbXMgPSB7XG4gICAgbmF0dXJhbE9yaWVudGF0aW9uOiAhIXRoaXMub3B0cy5hbmRyb2lkTmF0dXJhbE9yaWVudGF0aW9uLFxuICB9O1xuICBsZXQgb3JpZW50YXRpb24gPSBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdvcmllbnRhdGlvbicsIHBhcmFtcyk7XG4gIHJldHVybiBvcmllbnRhdGlvbi50b1VwcGVyQ2FzZSgpO1xufTtcblxuY29tbWFuZHMuc2V0T3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBzZXRPcmllbnRhdGlvbiAob3JpZW50YXRpb24pIHtcbiAgb3JpZW50YXRpb24gPSBvcmllbnRhdGlvbi50b1VwcGVyQ2FzZSgpO1xuICBsZXQgcGFyYW1zID0ge1xuICAgIG9yaWVudGF0aW9uLFxuICAgIG5hdHVyYWxPcmllbnRhdGlvbjogISF0aGlzLm9wdHMuYW5kcm9pZE5hdHVyYWxPcmllbnRhdGlvbixcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ29yaWVudGF0aW9uJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLmZha2VGbGljayA9IGFzeW5jIGZ1bmN0aW9uIGZha2VGbGljayAoeFNwZWVkLCB5U3BlZWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2ZsaWNrJywge3hTcGVlZCwgeVNwZWVkfSk7XG59O1xuXG5jb21tYW5kcy5mYWtlRmxpY2tFbGVtZW50ID0gYXN5bmMgZnVuY3Rpb24gZmFrZUZsaWNrRWxlbWVudCAoZWxlbWVudElkLCB4b2Zmc2V0LCB5b2Zmc2V0LCBzcGVlZCkge1xuICBsZXQgcGFyYW1zID0ge3hvZmZzZXQsIHlvZmZzZXQsIHNwZWVkLCBlbGVtZW50SWR9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpmbGljaycsIHBhcmFtcyk7XG59O1xuXG5jb21tYW5kcy5zd2lwZSA9IGFzeW5jIGZ1bmN0aW9uIHN3aXBlIChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIHRvdWNoQ291bnQsIGVsSWQpIHtcbiAgaWYgKHN0YXJ0WCA9PT0gJ251bGwnKSB7XG4gICAgc3RhcnRYID0gMC41O1xuICB9XG4gIGlmIChzdGFydFkgPT09ICdudWxsJykge1xuICAgIHN0YXJ0WSA9IDAuNTtcbiAgfVxuICBsZXQgc3dpcGVPcHRzID0ge3N0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLFxuICAgICAgICAgICAgICAgICAgIHN0ZXBzOiBNYXRoLnJvdW5kKGR1cmF0aW9uICogc3dpcGVTdGVwc1BlclNlYyl9O1xuICAvLyBnb2luZyB0aGUgbG9uZyB3YXkgYW5kIGNoZWNraW5nIGZvciB1bmRlZmluZWQgYW5kIG51bGwgc2luY2VcbiAgLy8gd2UgY2FuJ3QgYmUgYXNzdXJlZCBgZWxJZGAgaXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBpbnRcbiAgaWYgKHV0aWwuaGFzVmFsdWUoZWxJZCkpIHtcbiAgICBzd2lwZU9wdHMuZWxlbWVudElkID0gZWxJZDtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5kb1N3aXBlKHN3aXBlT3B0cyk7XG59O1xuXG5jb21tYW5kcy5kb1N3aXBlID0gYXN5bmMgZnVuY3Rpb24gZG9Td2lwZSAoc3dpcGVPcHRzKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHN3aXBlT3B0cy5lbGVtZW50SWQpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6c3dpcGUnLCBzd2lwZU9wdHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdzd2lwZScsIHN3aXBlT3B0cyk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLnBpbmNoQ2xvc2UgPSBhc3luYyBmdW5jdGlvbiBwaW5jaENsb3NlIChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIHBlcmNlbnQsIHN0ZXBzLCBlbElkKSB7XG4gIGxldCBwaW5jaE9wdHMgPSB7XG4gICAgZGlyZWN0aW9uOiAnaW4nLFxuICAgIGVsZW1lbnRJZDogZWxJZCxcbiAgICBwZXJjZW50LFxuICAgIHN0ZXBzXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnBpbmNoJywgcGluY2hPcHRzKTtcbn07XG5cbmNvbW1hbmRzLnBpbmNoT3BlbiA9IGFzeW5jIGZ1bmN0aW9uIHBpbmNoT3BlbiAoc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCBwZXJjZW50LCBzdGVwcywgZWxJZCkge1xuICBsZXQgcGluY2hPcHRzID0ge2RpcmVjdGlvbjogJ291dCcsIGVsZW1lbnRJZDogZWxJZCwgcGVyY2VudCwgc3RlcHN9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpwaW5jaCcsIHBpbmNoT3B0cyk7XG59O1xuXG5jb21tYW5kcy5mbGljayA9IGFzeW5jIGZ1bmN0aW9uIGZsaWNrIChlbGVtZW50LCB4U3BlZWQsIHlTcGVlZCwgeE9mZnNldCwgeU9mZnNldCwgc3BlZWQpIHtcbiAgaWYgKGVsZW1lbnQpIHtcbiAgICBhd2FpdCB0aGlzLmZha2VGbGlja0VsZW1lbnQoZWxlbWVudCwgeE9mZnNldCwgeU9mZnNldCwgc3BlZWQpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuZmFrZUZsaWNrKHhTcGVlZCwgeVNwZWVkKTtcbiAgfVxufTtcblxuY29tbWFuZHMuZHJhZyA9IGFzeW5jIGZ1bmN0aW9uIGRyYWcgKHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBkdXJhdGlvbiwgdG91Y2hDb3VudCwgZWxlbWVudElkLCBkZXN0RWxJZCkge1xuICBsZXQgZHJhZ09wdHMgPSB7XG4gICAgZWxlbWVudElkLCBkZXN0RWxJZCwgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksXG4gICAgc3RlcHM6IE1hdGgucm91bmQoZHVyYXRpb24gKiBkcmFnU3RlcHNQZXJTZWMpXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmRvRHJhZyhkcmFnT3B0cyk7XG5cbn07XG5cbmNvbW1hbmRzLmRvRHJhZyA9IGFzeW5jIGZ1bmN0aW9uIGRvRHJhZyAoZHJhZ09wdHMpIHtcbiAgaWYgKHV0aWwuaGFzVmFsdWUoZHJhZ09wdHMuZWxlbWVudElkKSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OmRyYWcnLCBkcmFnT3B0cyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2RyYWcnLCBkcmFnT3B0cyk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmxvY2sgPSBhc3luYyBmdW5jdGlvbiBsb2NrIChzZWNvbmRzKSB7XG4gIGF3YWl0IHRoaXMuYWRiLmxvY2soKTtcbiAgaWYgKGlzTmFOKHNlY29uZHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmxvYXRTZWNvbmRzID0gcGFyc2VGbG9hdChzZWNvbmRzKTtcbiAgaWYgKGZsb2F0U2Vjb25kcyA8PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IEIuZGVsYXkoMTAwMCAqIGZsb2F0U2Vjb25kcyk7XG4gIGF3YWl0IHRoaXMudW5sb2NrKCk7XG59O1xuXG5jb21tYW5kcy5pc0xvY2tlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzTG9ja2VkICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzU2NyZWVuTG9ja2VkKCk7XG59O1xuXG5jb21tYW5kcy51bmxvY2sgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2sgKCkge1xuICByZXR1cm4gYXdhaXQgYW5kcm9pZEhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xufTtcblxuY29tbWFuZHMub3Blbk5vdGlmaWNhdGlvbnMgPSBhc3luYyBmdW5jdGlvbiBvcGVuTm90aWZpY2F0aW9ucyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdvcGVuTm90aWZpY2F0aW9uJyk7XG59O1xuXG5jb21tYW5kcy5zZXRMb2NhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHNldExvY2F0aW9uIChsYXRpdHVkZSwgbG9uZ2l0dWRlKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5zZW5kVGVsbmV0Q29tbWFuZChgZ2VvIGZpeCAke2xvbmdpdHVkZX0gJHtsYXRpdHVkZX1gKTtcbn07XG5cbmNvbW1hbmRzLmZpbmdlcnByaW50ID0gYXN5bmMgZnVuY3Rpb24gZmluZ2VycHJpbnQgKGZpbmdlcnByaW50SWQpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2ZpbmdlcnByaW50IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuZmluZ2VycHJpbnQoZmluZ2VycHJpbnRJZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEZpbmdlcnByaW50T3B0c1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBmaW5nZXJwcmludElkIFRoZSB2YWx1ZSBpcyB0aGUgZmluZ2VyX2lkIGZvciB0aGUgZmluZ2VyIHRoYXRcbiAqIHdhcyBcInNjYW5uZWRcIi4gSXQgaXMgYSB1bmlxdWUgaW50ZWdlciB0aGF0IHlvdSBhc3NpZ24gZm9yIGVhY2ggdmlydHVhbCBmaW5nZXJwcmludC5cbiAqIFdoZW4gdGhlIGFwcCBpcyBydW5uaW5nIHlvdSBjYW4gcnVuIHRoaXMgc2FtZSBjb21tYW5kIGVhY2ggdGltZSB0aGVcbiAqIGVtdWxhdG9yIHByb21wdHMgeW91IGZvciBhIGZpbmdlcnByaW50LCB5b3UgY2FuIHJ1biB0aGUgYWRiIGNvbW1hbmQgYW5kIHBhc3MgaXRcbiAqIHRoZSBmaW5nZXJfaWQgdG8gc2ltdWxhdGUgdGhlIGZpbmdlcnByaW50IHNjYW4uXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGZpbmdlcnByaW50IG9uIEFuZHJvaWQgRW11bGF0b3IuXG4gKiBPbmx5IHdvcmtzIG9uIEFQSSAyMytcbiAqXG4gKiBAcGFyYW0ge0ZpbmdlcnByaW50T3B0c30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVGaW5nZXJwcmludCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUZpbmdlcnByaW50KG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZmluZ2VycHJpbnRJZH0gPSByZXF1aXJlQXJncygnZmluZ2VycHJpbnRJZCcsIG9wdHMpO1xuICBhd2FpdCB0aGlzLmZpbmdlcnByaW50KGZpbmdlcnByaW50SWQpO1xufTtcblxuY29tbWFuZHMuc2VuZFNNUyA9IGFzeW5jIGZ1bmN0aW9uIHNlbmRTTVMgKHBob25lTnVtYmVyLCBtZXNzYWdlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdzZW5kU01TIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuc2VuZFNNUyhwaG9uZU51bWJlciwgbWVzc2FnZSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNlbmRTbXNPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGhvbmVOdW1iZXIgVGhlIHBob25lIG51bWJlciB0byBzZW5kIFNNUyB0b1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgcGF5bG9hZFxuICovXG5cbi8qKlxuICogRW11bGF0ZSBzZW5kaW5nIGFuIFNNUyB0byB0aGUgZ2l2ZW4gcGhvbmUgbnVtYmVyLlxuICogT25seSB3b3JrcyBvbiBlbXVsYXRvcnMuXG4gKlxuICogQHBhcmFtIHtTZW5kU21zT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVTZW5kU21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2VuZFNtcyhvcHRzID0ge30pIHtcbiAgY29uc3Qge3Bob25lTnVtYmVyLCBtZXNzYWdlfSA9IHJlcXVpcmVBcmdzKFsncGhvbmVOdW1iZXInLCAnbWVzc2FnZSddLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5zZW5kU01TKHBob25lTnVtYmVyLCBtZXNzYWdlKTtcbn07XG5cbmNvbW1hbmRzLmdzbUNhbGwgPSBhc3luYyBmdW5jdGlvbiBnc21DYWxsIChwaG9uZU51bWJlciwgYWN0aW9uKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdnc21DYWxsIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuZ3NtQ2FsbChwaG9uZU51bWJlciwgYWN0aW9uKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtQ2FsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwaG9uZU51bWJlciBUaGUgcGhvbmUgbnVtYmVyIHRvIGNhbGwgdG9cbiAqIEBwcm9wZXJ0eSB7Y2FsbHxhY2NlcHR8Y2FuY2VsfGhvbGR9IGFjdGlvbiBPbmUgb2YgcG9zc2libGUgYWN0aW9ucyB0byB0YWtlXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGEgR1NNIGNhbGwgdG8gdGhlIGdpdmVuIHBob25lIG51bWJlci5cbiAqIE9ubHkgd29ya3Mgb24gZW11bGF0b3JzLlxuICpcbiAqIEBwYXJhbSB7R3NtQ2FsbE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR3NtQ2FsbCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdzbUNhbGwob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtwaG9uZU51bWJlciwgYWN0aW9ufSA9IHJlcXVpcmVBcmdzKFsncGhvbmVOdW1iZXInLCAnYWN0aW9uJ10sIG9wdHMpO1xuICBhd2FpdCB0aGlzLmdzbUNhbGwocGhvbmVOdW1iZXIsIGFjdGlvbik7XG59O1xuXG5jb21tYW5kcy5nc21TaWduYWwgPSBhc3luYyBmdW5jdGlvbiBnc21TaWduYWwgKHNpZ25hbFN0cmVuZ2gpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2dzbVNpZ25hbCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVNpZ25hbChzaWduYWxTdHJlbmdoKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtU2lnbmFsT3B0aW9uc1xuICogQHByb3BlcnR5IHswfDF8MnwzfDR9IHN0cmVuZ3RoIE9uZSBvZiBwb3NzaWJsZSBzaWduYWwgc3RyZW5ndGggdmFsdWVzLCB3aGVyZSA0IGlzIHRoZSBiZXN0IHNpZ25hbC5cbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgR1NNIHNpZ25hbCBzdHJlbmd0aCBjaGFuZ2UgZXZlbnQuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge0dzbVNpZ25hbE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR3NtU2lnbmFsID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR3NtU2lnbmFsKG9wdHMgPSB7fSkge1xuICBjb25zdCB7c3RyZW5ndGh9ID0gcmVxdWlyZUFyZ3MoJ3N0cmVuZ3RoJywgb3B0cyk7XG4gIGF3YWl0IHRoaXMuZ3NtU2lnbmFsKHN0cmVuZ3RoKTtcbn07XG5cbmNvbW1hbmRzLmdzbVZvaWNlID0gYXN5bmMgZnVuY3Rpb24gZ3NtVm9pY2UgKHN0YXRlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdnc21Wb2ljZSBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVZvaWNlKHN0YXRlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtVm9pY2VPcHRpb25zXG4gKiBAcHJvcGVydHkge29ufG9mZn0gc3RhdGVcbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgR1NNIHZvaWNlIHN0YXRlIGNoYW5nZSBldmVudC5cbiAqIE9ubHkgd29ya3Mgb24gZW11bGF0b3JzLlxuICpcbiAqIEBwYXJhbSB7R3NtVm9pY2VPcHRpb25zfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdzbVZvaWNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR3NtVm9pY2Uob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtzdGF0ZX0gPSByZXF1aXJlQXJncygnc3RhdGUnLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5nc21Wb2ljZShzdGF0ZSk7XG59O1xuXG5jb21tYW5kcy5wb3dlckFDID0gYXN5bmMgZnVuY3Rpb24gcG93ZXJBQyAoc3RhdGUpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ3Bvd2VyQUMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5wb3dlckFDKHN0YXRlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUG93ZXJBY09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7b258b2ZmfSBzdGF0ZVxuICovXG5cbi8qKlxuICogRW11bGF0ZSBBQyBwb3dlciBzdGF0ZSBjaGFuZ2UuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge0dzbVZvaWNlT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVQb3dlckFjID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUG93ZXJBYyhvcHRzID0ge30pIHtcbiAgY29uc3Qge3N0YXRlfSA9IHJlcXVpcmVBcmdzKCdzdGF0ZScsIG9wdHMpO1xuICBhd2FpdCB0aGlzLnBvd2VyQUMoc3RhdGUpO1xufTtcblxuY29tbWFuZHMucG93ZXJDYXBhY2l0eSA9IGFzeW5jIGZ1bmN0aW9uIHBvd2VyQ2FwYWNpdHkgKGJhdHRlcnlQZXJjZW50KSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdwb3dlckNhcGFjaXR5IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIucG93ZXJDYXBhY2l0eShiYXR0ZXJ5UGVyY2VudCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvd2VyQ2FwYWNpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGVyY2VudCAtIFBlcmNlbnRhZ2UgdmFsdWUgaW4gcmFuZ2UgWzAsIDEwMF1cbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgcG93ZXIgY2FwYWNpdHkgY2hhbmdlLlxuICogT25seSB3b3JrcyBvbiBlbXVsYXRvcnMuXG4gKlxuICogQHBhcmFtIHtQb3dlckNhcGFjaXR5T3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVQb3dlckNhcGFjaXR5ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUG93ZXJDYXBhY2l0eShvcHRzID0ge30pIHtcbiAgY29uc3Qge3BlcmNlbnR9ID0gcmVxdWlyZUFyZ3MoJ3BlcmNlbnQnLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5wb3dlckNhcGFjaXR5KHBlcmNlbnQpO1xufTtcblxuY29tbWFuZHMubmV0d29ya1NwZWVkID0gYXN5bmMgZnVuY3Rpb24gbmV0d29ya1NwZWVkIChuZXR3b3JrU3BlZWQpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ25ldHdvcmtTcGVlZCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLm5ldHdvcmtTcGVlZChuZXR3b3JrU3BlZWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBOZXR3b3JrU3BlZWRPcHRpb25zXG4gKiBAcHJvcGVydHkge2dzbXxzY3NkfGdwcnN8ZWRnZXx1bXRzfGhzZHBhfGx0ZXxldmRvfGZ1bGx9IHNwZWVkXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGRpZmZlcmVudCBuZXR3b3JrIGNvbm5lY3Rpb24gc3BlZWQgbW9kZXMuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge05ldHdvcmtTcGVlZE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlTmV0d29ya1NwZWVkID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTmV0d29ya1NwZWVkKG9wdHMgPSB7fSkge1xuICBjb25zdCB7c3BlZWR9ID0gcmVxdWlyZUFyZ3MoJ3NwZWVkJywgb3B0cyk7XG4gIGF3YWl0IHRoaXMubmV0d29ya1NwZWVkKHNwZWVkKTtcbn07XG5cbi8qKlxuICogRW11bGF0ZSBzZW5zb3JzIHZhbHVlcyBvbiB0aGUgY29ubmVjdGVkIGVtdWxhdG9yLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNlbnNvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbnNvclR5cGUgLSBzZW5zb3IgdHlwZSBkZWNsYXJlZCBpbiBhZGIuU0VOU09SU1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gdmFsdWUgdG8gc2V0IHRvIHRoZSBzZW5zb3JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gU2Vuc29yXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiBzZW5zb3JUeXBlIGlzIG5vdCBkZWZpbmVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiB2YWx1ZSBmb3IgdGhlIHNlIHNvciBpcyBub3QgZGVmaW5lZFxuICogQHRocm93cyB7RXJyb3J9IC0gSWYgZGV2aWNlVHlwZSBpcyBub3QgYW4gZW11bGF0b3JcbiAqL1xuY29tbWFuZHMuc2Vuc29yU2V0ID0gYXN5bmMgZnVuY3Rpb24gc2Vuc29yU2V0IChzZW5zb3IgPSB7fSkge1xuICBjb25zdCB7c2Vuc29yVHlwZSwgdmFsdWV9ID0gc2Vuc29yO1xuICBpZiAoIXV0aWwuaGFzVmFsdWUoc2Vuc29yVHlwZSkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGAnc2Vuc29yVHlwZScgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuICBpZiAoIXV0aWwuaGFzVmFsdWUodmFsdWUpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgJ3ZhbHVlJyBhcmd1bWVudCBpcyByZXF1aXJlZGApO1xuICB9XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdzZW5zb3JTZXQgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5zZW5zb3JTZXQoc2Vuc29yVHlwZSwgdmFsdWUpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0FEQn0gYWRiXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICogQHJldHVybnMge1Byb21pc2U8c2hhcnA+fVxuICovXG5oZWxwZXJzLmdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuc2hvdERhdGFXaXRoQWRiU2hlbGwgKGFkYiwgb3B0cykge1xuICBjb25zdCBsb2NhbEZpbGUgPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe3ByZWZpeDogJ2FwcGl1bScsIHN1ZmZpeDogJy5wbmcnfSk7XG4gIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxGaWxlKSkge1xuICAgIGF3YWl0IGZzLnVubGluayhsb2NhbEZpbGUpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcG5nRGlyID0gb3B0cy5hbmRyb2lkU2NyZWVuc2hvdFBhdGggfHwgJy9kYXRhL2xvY2FsL3RtcC8nO1xuICAgIGNvbnN0IHBuZyA9IHBhdGgucG9zaXgucmVzb2x2ZShwbmdEaXIsICdzY3JlZW5zaG90LnBuZycpO1xuICAgIGF3YWl0IGFkYi5zaGVsbChbJy9zeXN0ZW0vYmluL3JtJywgYCR7cG5nfTtgLCAnL3N5c3RlbS9iaW4vc2NyZWVuY2FwJywgJy1wJywgcG5nXSk7XG4gICAgaWYgKCFhd2FpdCBhZGIuZmlsZVNpemUocG5nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc2l6ZSBvZiB0aGUgdGFrZW4gc2NyZWVuc2hvdCBlcXVhbHMgdG8gemVyby4nKTtcbiAgICB9XG4gICAgYXdhaXQgYWRiLnB1bGwocG5nLCBsb2NhbEZpbGUpO1xuICAgIHJldHVybiBzaGFycChsb2NhbEZpbGUpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxGaWxlKSkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QURCfSBhZGJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHNoYXJwPn1cbiAqL1xuaGVscGVycy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuc2hvdERhdGFXaXRoQWRiRXhlY091dCAoYWRiKSB7XG4gIGNvbnN0IHtzdGRvdXQsIHN0ZGVyciwgY29kZX0gPSBhd2FpdCBleGVjKFxuICAgIGFkYi5leGVjdXRhYmxlLnBhdGgsXG4gICAgWy4uLmFkYi5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLCAnZXhlYy1vdXQnLCAnL3N5c3RlbS9iaW4vc2NyZWVuY2FwJywgJy1wJ10sXG4gICAge2VuY29kaW5nOiAnYmluYXJ5JywgaXNCdWZmZXI6IHRydWV9XG4gICk7XG4gIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB0aHJvd1xuICBpZiAoY29kZSB8fCBzdGRlcnIubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTY3JlZW5zaG90IHJldHVybmVkIGVycm9yLCBjb2RlOiAnJHtjb2RlfScsIHN0ZGVycjogJyR7c3RkZXJyLnRvU3RyaW5nKCl9J2ApO1xuICB9XG4gIC8vIGlmIHdlIGRvbid0IGdldCBhbnl0aGluZyBhdCBhbGwsIHRocm93XG4gIGlmICghc3Rkb3V0Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2NyZWVuc2hvdCByZXR1cm5lZCBubyBkYXRhJyk7XG4gIH1cblxuICByZXR1cm4gc2hhcnAoc3Rkb3V0KTtcbn07XG5cbmNvbW1hbmRzLmdldFNjcmVlbnNob3QgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5zaG90ICgpIHtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuICBsZXQgaW1hZ2UgPSBudWxsO1xuICBpZiAoYXBpTGV2ZWwgPiAyMCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBUaGlzIHNjcmVlbnNob3RpbmcgYXBwcm9hY2ggaXMgd2F5IGZhc3Rlciwgc2luY2UgaXQgcmVxdWlyZXMgbGVzcyBleHRlcm5hbCBjb21tYW5kc1xuICAgICAgLy8gdG8gYmUgZXhlY3V0ZWQuIFVuZm9ydHVuYXRlbHksIGV4ZWMtb3V0IG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBieSBuZXdlciBBbmRyb2lkL1NESyB2ZXJzaW9ucyAoNS4wIGFuZCBsYXRlcilcbiAgICAgIGltYWdlID0gYXdhaXQgdGhpcy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0KHRoaXMuYWRiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBDYW5ub3QgZ2V0IHNjcmVlbnNob3QgZGF0YSB3aXRoICdhZGIgZXhlYy1vdXQnIGJlY2F1c2Ugb2YgJyR7ZS5tZXNzYWdlfScuIGAgK1xuICAgICAgICBgRGVmYXVsdGluZyB0byAnYWRiIHNoZWxsJyBjYWxsYCk7XG4gICAgfVxuICB9XG4gIGlmICghaW1hZ2UpIHtcbiAgICB0cnkge1xuICAgICAgaW1hZ2UgPSBhd2FpdCB0aGlzLmdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IGVyciA9IGBDYW5ub3QgZ2V0IHNjcmVlbnNob3QgZGF0YSBiZWNhdXNlIG9mICcke2UubWVzc2FnZX0nLiBgICtcbiAgICAgICAgYE1ha2Ugc3VyZSB0aGUgJ0xheW91dFBhcmFtcy5GTEFHX1NFQ1VSRScgaXMgbm90IHNldCBmb3IgYCArXG4gICAgICAgIGB0aGUgY3VycmVudCB2aWV3YDtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coZXJyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFwaUxldmVsIDwgMjMpIHtcbiAgICAvLyBBbmRyb2lkIGJ1ZyA4NDMzNzQyIC0gcm90YXRlIHNjcmVlbnNob3QgaWYgc2NyZWVuIGlzIHJvdGF0ZWRcbiAgICBsZXQgc2NyZWVuT3JpZW50YXRpb24gPSBhd2FpdCB0aGlzLmFkYi5nZXRTY3JlZW5PcmllbnRhdGlvbigpO1xuICAgIHRyeSB7XG4gICAgICBpbWFnZSA9IGltYWdlLnJvdGF0ZSgtOTAgKiBzY3JlZW5PcmllbnRhdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBDb3VsZCBub3Qgcm90YXRlIHNjcmVlbnNob3QgZHVlIHRvIGVycm9yOiAke2Vycn1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChhd2FpdCBpbWFnZS50b0J1ZmZlcigpKS50b1N0cmluZygnYmFzZTY0Jyk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLGVBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLEtBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFNBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLGFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE1BQUEsR0FBQU4sT0FBQTtBQUVBLE1BQU1PLGdCQUFnQixHQUFHLEVBQUU7QUFDM0IsTUFBTUMsZUFBZSxHQUFHLEVBQUU7QUFFMUIsTUFBTUMsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUFDQyxPQUFBLENBQUFELFFBQUEsR0FBQUEsUUFBQTtBQUNwQixNQUFNRSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQUNELE9BQUEsQ0FBQUMsT0FBQSxHQUFBQSxPQUFBO0FBQ25CLE1BQU1DLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFckJILFFBQVEsQ0FBQ0ksUUFBUSxHQUFHLGVBQWVBLFFBQVFBLENBQUVDLE9BQU8sRUFBRUMsU0FBUyxHQUFHLElBQUksRUFBRTtFQUV0RSxJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLDhDQUE4QyxDQUFDO0VBQzdELE9BQU8sTUFBTSxJQUFJLENBQUNDLFlBQVksQ0FBQ0osT0FBTyxFQUFFQyxTQUFTLENBQUM7QUFDcEQsQ0FBQztB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
409
+ exports.default = extensions;
410
+ //# sourceMappingURL=actions.js.map