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.
- package/CHANGELOG.md +14 -0
- package/build/index.js +43 -40
- package/build/lib/android-helpers.d.ts +136 -0
- package/build/lib/android-helpers.d.ts.map +1 -0
- package/build/lib/android-helpers.js +760 -679
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.d.ts +29 -0
- package/build/lib/bootstrap.d.ts.map +1 -0
- package/build/lib/bootstrap.js +192 -179
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.d.ts +209 -0
- package/build/lib/commands/actions.d.ts.map +1 -0
- package/build/lib/commands/actions.js +327 -265
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.d.ts +10 -0
- package/build/lib/commands/alert.d.ts.map +1 -0
- package/build/lib/commands/alert.js +12 -18
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.d.ts +314 -0
- package/build/lib/commands/app-management.d.ts.map +1 -0
- package/build/lib/commands/app-management.js +278 -110
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.d.ts +94 -0
- package/build/lib/commands/context.d.ts.map +1 -0
- package/build/lib/commands/context.js +412 -260
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/coverage.d.ts +5 -0
- package/build/lib/commands/coverage.d.ts.map +1 -0
- package/build/lib/commands/coverage.js +14 -17
- package/build/lib/commands/coverage.js.map +1 -1
- package/build/lib/commands/element.d.ts +36 -0
- package/build/lib/commands/element.d.ts.map +1 -0
- package/build/lib/commands/element.js +97 -127
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/emu-console.d.ts +49 -0
- package/build/lib/commands/emu-console.d.ts.map +1 -0
- package/build/lib/commands/emu-console.js +36 -25
- package/build/lib/commands/emu-console.js.map +1 -1
- package/build/lib/commands/execute.d.ts +6 -0
- package/build/lib/commands/execute.d.ts.map +1 -0
- package/build/lib/commands/execute.js +68 -69
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.d.ts +129 -0
- package/build/lib/commands/file-actions.d.ts.map +1 -0
- package/build/lib/commands/file-actions.js +321 -178
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.d.ts +13 -0
- package/build/lib/commands/find.d.ts.map +1 -0
- package/build/lib/commands/find.js +69 -51
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.d.ts +133 -0
- package/build/lib/commands/general.d.ts.map +1 -0
- package/build/lib/commands/general.js +275 -216
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.d.ts +11 -0
- package/build/lib/commands/ime.d.ts.map +1 -0
- package/build/lib/commands/ime.js +27 -33
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.d.ts +3 -0
- package/build/lib/commands/index.d.ts.map +1 -0
- package/build/lib/commands/index.js +32 -35
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.d.ts +418 -0
- package/build/lib/commands/intent.d.ts.map +1 -0
- package/build/lib/commands/intent.js +281 -151
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/keyboard.d.ts +6 -0
- package/build/lib/commands/keyboard.d.ts.map +1 -0
- package/build/lib/commands/keyboard.js +6 -14
- package/build/lib/commands/keyboard.js.map +1 -1
- package/build/lib/commands/log.d.ts +45 -0
- package/build/lib/commands/log.d.ts.map +1 -0
- package/build/lib/commands/log.js +117 -103
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.d.ts +144 -0
- package/build/lib/commands/media-projection.d.ts.map +1 -0
- package/build/lib/commands/media-projection.js +228 -171
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.d.ts +139 -0
- package/build/lib/commands/network.d.ts.map +1 -0
- package/build/lib/commands/network.js +249 -181
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.d.ts +101 -0
- package/build/lib/commands/performance.d.ts.map +1 -0
- package/build/lib/commands/performance.js +390 -236
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/permissions.d.ts +93 -0
- package/build/lib/commands/permissions.d.ts.map +1 -0
- package/build/lib/commands/permissions.js +133 -93
- package/build/lib/commands/permissions.js.map +1 -1
- package/build/lib/commands/recordscreen.d.ts +194 -0
- package/build/lib/commands/recordscreen.d.ts.map +1 -0
- package/build/lib/commands/recordscreen.js +293 -224
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/shell.d.ts +8 -0
- package/build/lib/commands/shell.d.ts.map +1 -0
- package/build/lib/commands/shell.js +38 -43
- package/build/lib/commands/shell.js.map +1 -1
- package/build/lib/commands/streamscreen.d.ts +104 -0
- package/build/lib/commands/streamscreen.d.ts.map +1 -0
- package/build/lib/commands/streamscreen.js +364 -305
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/system-bars.d.ts +100 -0
- package/build/lib/commands/system-bars.d.ts.map +1 -0
- package/build/lib/commands/system-bars.js +148 -90
- package/build/lib/commands/system-bars.js.map +1 -1
- package/build/lib/commands/touch.d.ts +30 -0
- package/build/lib/commands/touch.d.ts.map +1 -0
- package/build/lib/commands/touch.js +311 -287
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/desired-caps.d.ts +353 -0
- package/build/lib/desired-caps.d.ts.map +1 -0
- package/build/lib/desired-caps.js +291 -292
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.d.ts +430 -0
- package/build/lib/driver.d.ts.map +1 -0
- package/build/lib/driver.js +449 -384
- package/build/lib/driver.js.map +1 -1
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +5 -11
- package/build/lib/logger.js.map +1 -1
- package/build/lib/method-map.d.ts +389 -0
- package/build/lib/method-map.d.ts.map +1 -0
- package/build/lib/method-map.js +220 -394
- package/build/lib/method-map.js.map +1 -1
- package/build/lib/stubs.d.ts +8 -0
- package/build/lib/stubs.d.ts.map +1 -0
- package/build/lib/stubs.js +5 -0
- package/build/lib/stubs.js.map +1 -0
- package/build/lib/uiautomator.d.ts +24 -0
- package/build/lib/uiautomator.d.ts.map +1 -0
- package/build/lib/uiautomator.js +86 -82
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.d.ts +38 -0
- package/build/lib/unlock-helpers.d.ts.map +1 -0
- package/build/lib/unlock-helpers.js +228 -204
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.d.ts +11 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js +23 -18
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.d.ts +223 -0
- package/build/lib/webview-helpers.d.ts.map +1 -0
- package/build/lib/webview-helpers.js +476 -298
- package/build/lib/webview-helpers.js.map +1 -1
- package/index.js +3 -1
- package/lib/android-helpers.js +2 -1
- package/lib/stubs.ts +8 -0
- package/lib/unlock-helpers.js +2 -2
- package/package.json +23 -14
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
require("
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|
-
|
|
35
|
-
keycode,
|
|
36
|
-
metastate
|
|
37
|
-
});
|
|
30
|
+
return await this.bootstrap.sendAction('longPressKeyCode', { keycode, metastate });
|
|
38
31
|
};
|
|
39
32
|
commands.getOrientation = async function getOrientation() {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
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
|
-
|
|
62
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
106
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
127
|
+
return await this.adb.isScreenLocked();
|
|
153
128
|
};
|
|
154
129
|
commands.unlock = async function unlock() {
|
|
155
|
-
|
|
130
|
+
return await android_helpers_1.default.unlock(this, this.adb, this.caps);
|
|
156
131
|
};
|
|
157
132
|
commands.openNotifications = async function openNotifications() {
|
|
158
|
-
|
|
133
|
+
return await this.bootstrap.sendAction('openNotification');
|
|
159
134
|
};
|
|
160
135
|
commands.setLocation = async function setLocation(latitude, longitude) {
|
|
161
|
-
|
|
136
|
+
return await this.adb.sendTelnetCommand(`geo fix ${longitude} ${latitude}`);
|
|
162
137
|
};
|
|
163
138
|
commands.fingerprint = async function fingerprint(fingerprintId) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
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
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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
|
-
|
|
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
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
|
|
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
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
|
|
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
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
-
|
|
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
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
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
|
-
|
|
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
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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
|
-
|
|
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
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
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
|
-
|
|
257
|
-
speed
|
|
258
|
-
|
|
259
|
-
|
|
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
|
-
|
|
263
|
-
sensorType
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
-
|
|
279
|
-
|
|
280
|
-
|
|
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
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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
|
-
|
|
302
|
-
|
|
303
|
-
stderr
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
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
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
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
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
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
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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
|
-
|
|
347
|
-
|
|
348
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYW5kcm9pZEhlbHBlcnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zdXBwb3J0IiwiX3BhdGgiLCJfYmx1ZWJpcmQiLCJfc2hhcnAiLCJfdGVlbl9wcm9jZXNzIiwiX3V0aWxzIiwic3dpcGVTdGVwc1BlclNlYyIsImRyYWdTdGVwc1BlclNlYyIsImNvbW1hbmRzIiwiZXhwb3J0cyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwia2V5ZXZlbnQiLCJrZXljb2RlIiwibWV0YXN0YXRlIiwibG9nIiwid2FybiIsInByZXNzS2V5Q29kZSIsImJvb3RzdHJhcCIsInNlbmRBY3Rpb24iLCJsb25nUHJlc3NLZXlDb2RlIiwiZ2V0T3JpZW50YXRpb24iLCJwYXJhbXMiLCJuYXR1cmFsT3JpZW50YXRpb24iLCJvcHRzIiwiYW5kcm9pZE5hdHVyYWxPcmllbnRhdGlvbiIsIm9yaWVudGF0aW9uIiwidG9VcHBlckNhc2UiLCJzZXRPcmllbnRhdGlvbiIsImZha2VGbGljayIsInhTcGVlZCIsInlTcGVlZCIsImZha2VGbGlja0VsZW1lbnQiLCJlbGVtZW50SWQiLCJ4b2Zmc2V0IiwieW9mZnNldCIsInNwZWVkIiwic3dpcGUiLCJzdGFydFgiLCJzdGFydFkiLCJlbmRYIiwiZW5kWSIsImR1cmF0aW9uIiwidG91Y2hDb3VudCIsImVsSWQiLCJzd2lwZU9wdHMiLCJzdGVwcyIsIk1hdGgiLCJyb3VuZCIsInV0aWwiLCJoYXNWYWx1ZSIsImRvU3dpcGUiLCJwaW5jaENsb3NlIiwicGVyY2VudCIsInBpbmNoT3B0cyIsImRpcmVjdGlvbiIsInBpbmNoT3BlbiIsImZsaWNrIiwiZWxlbWVudCIsInhPZmZzZXQiLCJ5T2Zmc2V0IiwiZHJhZyIsImRlc3RFbElkIiwiZHJhZ09wdHMiLCJkb0RyYWciLCJsb2NrIiwic2Vjb25kcyIsImFkYiIsImlzTmFOIiwiZmxvYXRTZWNvbmRzIiwicGFyc2VGbG9hdCIsIkIiLCJkZWxheSIsInVubG9jayIsImlzTG9ja2VkIiwiaXNTY3JlZW5Mb2NrZWQiLCJhbmRyb2lkSGVscGVycyIsImNhcHMiLCJvcGVuTm90aWZpY2F0aW9ucyIsInNldExvY2F0aW9uIiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJzZW5kVGVsbmV0Q29tbWFuZCIsImZpbmdlcnByaW50IiwiZmluZ2VycHJpbnRJZCIsImlzRW11bGF0b3IiLCJlcnJvckFuZFRocm93IiwibW9iaWxlRmluZ2VycHJpbnQiLCJyZXF1aXJlQXJncyIsInNlbmRTTVMiLCJwaG9uZU51bWJlciIsIm1lc3NhZ2UiLCJtb2JpbGVTZW5kU21zIiwiZ3NtQ2FsbCIsImFjdGlvbiIsIm1vYmlsZUdzbUNhbGwiLCJnc21TaWduYWwiLCJzaWduYWxTdHJlbmdoIiwibW9iaWxlR3NtU2lnbmFsIiwic3RyZW5ndGgiLCJnc21Wb2ljZSIsInN0YXRlIiwibW9iaWxlR3NtVm9pY2UiLCJwb3dlckFDIiwibW9iaWxlUG93ZXJBYyIsInBvd2VyQ2FwYWNpdHkiLCJiYXR0ZXJ5UGVyY2VudCIsIm1vYmlsZVBvd2VyQ2FwYWNpdHkiLCJuZXR3b3JrU3BlZWQiLCJtb2JpbGVOZXR3b3JrU3BlZWQiLCJzZW5zb3JTZXQiLCJzZW5zb3IiLCJzZW5zb3JUeXBlIiwidmFsdWUiLCJnZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJTaGVsbCIsImxvY2FsRmlsZSIsInRlbXBEaXIiLCJwYXRoIiwicHJlZml4Iiwic3VmZml4IiwiZnMiLCJleGlzdHMiLCJ1bmxpbmsiLCJwbmdEaXIiLCJhbmRyb2lkU2NyZWVuc2hvdFBhdGgiLCJwbmciLCJwb3NpeCIsInJlc29sdmUiLCJzaGVsbCIsImZpbGVTaXplIiwiRXJyb3IiLCJwdWxsIiwic2hhcnAiLCJnZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0Iiwic3Rkb3V0Iiwic3RkZXJyIiwiY29kZSIsImV4ZWMiLCJleGVjdXRhYmxlIiwiZGVmYXVsdEFyZ3MiLCJlbmNvZGluZyIsImlzQnVmZmVyIiwibGVuZ3RoIiwidG9TdHJpbmciLCJnZXRTY3JlZW5zaG90IiwiYXBpTGV2ZWwiLCJnZXRBcGlMZXZlbCIsImltYWdlIiwiZSIsImluZm8iLCJlcnIiLCJzY3JlZW5PcmllbnRhdGlvbiIsImdldFNjcmVlbk9yaWVudGF0aW9uIiwicm90YXRlIiwidG9CdWZmZXIiLCJPYmplY3QiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYW5kcm9pZEhlbHBlcnMgZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IGZzLCB1dGlsLCB0ZW1wRGlyfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgc2hhcnAgZnJvbSAnc2hhcnAnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyByZXF1aXJlQXJncyB9IGZyb20gJy4uL3V0aWxzJztcblxuY29uc3Qgc3dpcGVTdGVwc1BlclNlYyA9IDI4O1xuY29uc3QgZHJhZ1N0ZXBzUGVyU2VjID0gNDA7XG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5jb25zdCBoZWxwZXJzID0ge307XG5jb25zdCBleHRlbnNpb25zID0ge307XG5cbmNvbW1hbmRzLmtleWV2ZW50ID0gYXN5bmMgZnVuY3Rpb24ga2V5ZXZlbnQgKGtleWNvZGUsIG1ldGFzdGF0ZSA9IG51bGwpIHtcbiAgLy8gVE9ETyBkZXByZWNhdGUga2V5ZXZlbnQ7IGN1cnJlbnRseSB3ZCBvbmx5IGltcGxlbWVudHMga2V5ZXZlbnRcbiAgdGhpcy5sb2cud2Fybigna2V5ZXZlbnQgd2lsbCBiZSBkZXByZWNhdGVkIHVzZSBwcmVzc0tleUNvZGUnKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJlc3NLZXlDb2RlKGtleWNvZGUsIG1ldGFzdGF0ZSk7XG59O1xuXG5jb21tYW5kcy5wcmVzc0tleUNvZGUgPSBhc3luYyBmdW5jdGlvbiBwcmVzc0tleUNvZGUgKGtleWNvZGUsIG1ldGFzdGF0ZSA9IG51bGwpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3ByZXNzS2V5Q29kZScsIHtrZXljb2RlLCBtZXRhc3RhdGV9KTtcbn07XG5cbmNvbW1hbmRzLmxvbmdQcmVzc0tleUNvZGUgPSBhc3luYyBmdW5jdGlvbiBsb25nUHJlc3NLZXlDb2RlIChrZXljb2RlLCBtZXRhc3RhdGUgPSBudWxsKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdsb25nUHJlc3NLZXlDb2RlJywge2tleWNvZGUsIG1ldGFzdGF0ZX0pO1xufTtcblxuY29tbWFuZHMuZ2V0T3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRPcmllbnRhdGlvbiAoKSB7XG4gIGxldCBwYXJhbXMgPSB7XG4gICAgbmF0dXJhbE9yaWVudGF0aW9uOiAhIXRoaXMub3B0cy5hbmRyb2lkTmF0dXJhbE9yaWVudGF0aW9uLFxuICB9O1xuICBsZXQgb3JpZW50YXRpb24gPSBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdvcmllbnRhdGlvbicsIHBhcmFtcyk7XG4gIHJldHVybiBvcmllbnRhdGlvbi50b1VwcGVyQ2FzZSgpO1xufTtcblxuY29tbWFuZHMuc2V0T3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBzZXRPcmllbnRhdGlvbiAob3JpZW50YXRpb24pIHtcbiAgb3JpZW50YXRpb24gPSBvcmllbnRhdGlvbi50b1VwcGVyQ2FzZSgpO1xuICBsZXQgcGFyYW1zID0ge1xuICAgIG9yaWVudGF0aW9uLFxuICAgIG5hdHVyYWxPcmllbnRhdGlvbjogISF0aGlzLm9wdHMuYW5kcm9pZE5hdHVyYWxPcmllbnRhdGlvbixcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ29yaWVudGF0aW9uJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLmZha2VGbGljayA9IGFzeW5jIGZ1bmN0aW9uIGZha2VGbGljayAoeFNwZWVkLCB5U3BlZWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2ZsaWNrJywge3hTcGVlZCwgeVNwZWVkfSk7XG59O1xuXG5jb21tYW5kcy5mYWtlRmxpY2tFbGVtZW50ID0gYXN5bmMgZnVuY3Rpb24gZmFrZUZsaWNrRWxlbWVudCAoZWxlbWVudElkLCB4b2Zmc2V0LCB5b2Zmc2V0LCBzcGVlZCkge1xuICBsZXQgcGFyYW1zID0ge3hvZmZzZXQsIHlvZmZzZXQsIHNwZWVkLCBlbGVtZW50SWR9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpmbGljaycsIHBhcmFtcyk7XG59O1xuXG5jb21tYW5kcy5zd2lwZSA9IGFzeW5jIGZ1bmN0aW9uIHN3aXBlIChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIHRvdWNoQ291bnQsIGVsSWQpIHtcbiAgaWYgKHN0YXJ0WCA9PT0gJ251bGwnKSB7XG4gICAgc3RhcnRYID0gMC41O1xuICB9XG4gIGlmIChzdGFydFkgPT09ICdudWxsJykge1xuICAgIHN0YXJ0WSA9IDAuNTtcbiAgfVxuICBsZXQgc3dpcGVPcHRzID0ge3N0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLFxuICAgICAgICAgICAgICAgICAgIHN0ZXBzOiBNYXRoLnJvdW5kKGR1cmF0aW9uICogc3dpcGVTdGVwc1BlclNlYyl9O1xuICAvLyBnb2luZyB0aGUgbG9uZyB3YXkgYW5kIGNoZWNraW5nIGZvciB1bmRlZmluZWQgYW5kIG51bGwgc2luY2VcbiAgLy8gd2UgY2FuJ3QgYmUgYXNzdXJlZCBgZWxJZGAgaXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBpbnRcbiAgaWYgKHV0aWwuaGFzVmFsdWUoZWxJZCkpIHtcbiAgICBzd2lwZU9wdHMuZWxlbWVudElkID0gZWxJZDtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5kb1N3aXBlKHN3aXBlT3B0cyk7XG59O1xuXG5jb21tYW5kcy5kb1N3aXBlID0gYXN5bmMgZnVuY3Rpb24gZG9Td2lwZSAoc3dpcGVPcHRzKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHN3aXBlT3B0cy5lbGVtZW50SWQpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6c3dpcGUnLCBzd2lwZU9wdHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdzd2lwZScsIHN3aXBlT3B0cyk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLnBpbmNoQ2xvc2UgPSBhc3luYyBmdW5jdGlvbiBwaW5jaENsb3NlIChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIHBlcmNlbnQsIHN0ZXBzLCBlbElkKSB7XG4gIGxldCBwaW5jaE9wdHMgPSB7XG4gICAgZGlyZWN0aW9uOiAnaW4nLFxuICAgIGVsZW1lbnRJZDogZWxJZCxcbiAgICBwZXJjZW50LFxuICAgIHN0ZXBzXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnBpbmNoJywgcGluY2hPcHRzKTtcbn07XG5cbmNvbW1hbmRzLnBpbmNoT3BlbiA9IGFzeW5jIGZ1bmN0aW9uIHBpbmNoT3BlbiAoc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCBwZXJjZW50LCBzdGVwcywgZWxJZCkge1xuICBsZXQgcGluY2hPcHRzID0ge2RpcmVjdGlvbjogJ291dCcsIGVsZW1lbnRJZDogZWxJZCwgcGVyY2VudCwgc3RlcHN9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpwaW5jaCcsIHBpbmNoT3B0cyk7XG59O1xuXG5jb21tYW5kcy5mbGljayA9IGFzeW5jIGZ1bmN0aW9uIGZsaWNrIChlbGVtZW50LCB4U3BlZWQsIHlTcGVlZCwgeE9mZnNldCwgeU9mZnNldCwgc3BlZWQpIHtcbiAgaWYgKGVsZW1lbnQpIHtcbiAgICBhd2FpdCB0aGlzLmZha2VGbGlja0VsZW1lbnQoZWxlbWVudCwgeE9mZnNldCwgeU9mZnNldCwgc3BlZWQpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuZmFrZUZsaWNrKHhTcGVlZCwgeVNwZWVkKTtcbiAgfVxufTtcblxuY29tbWFuZHMuZHJhZyA9IGFzeW5jIGZ1bmN0aW9uIGRyYWcgKHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBkdXJhdGlvbiwgdG91Y2hDb3VudCwgZWxlbWVudElkLCBkZXN0RWxJZCkge1xuICBsZXQgZHJhZ09wdHMgPSB7XG4gICAgZWxlbWVudElkLCBkZXN0RWxJZCwgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksXG4gICAgc3RlcHM6IE1hdGgucm91bmQoZHVyYXRpb24gKiBkcmFnU3RlcHNQZXJTZWMpXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmRvRHJhZyhkcmFnT3B0cyk7XG5cbn07XG5cbmNvbW1hbmRzLmRvRHJhZyA9IGFzeW5jIGZ1bmN0aW9uIGRvRHJhZyAoZHJhZ09wdHMpIHtcbiAgaWYgKHV0aWwuaGFzVmFsdWUoZHJhZ09wdHMuZWxlbWVudElkKSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OmRyYWcnLCBkcmFnT3B0cyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2RyYWcnLCBkcmFnT3B0cyk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmxvY2sgPSBhc3luYyBmdW5jdGlvbiBsb2NrIChzZWNvbmRzKSB7XG4gIGF3YWl0IHRoaXMuYWRiLmxvY2soKTtcbiAgaWYgKGlzTmFOKHNlY29uZHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmxvYXRTZWNvbmRzID0gcGFyc2VGbG9hdChzZWNvbmRzKTtcbiAgaWYgKGZsb2F0U2Vjb25kcyA8PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IEIuZGVsYXkoMTAwMCAqIGZsb2F0U2Vjb25kcyk7XG4gIGF3YWl0IHRoaXMudW5sb2NrKCk7XG59O1xuXG5jb21tYW5kcy5pc0xvY2tlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzTG9ja2VkICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzU2NyZWVuTG9ja2VkKCk7XG59O1xuXG5jb21tYW5kcy51bmxvY2sgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2sgKCkge1xuICByZXR1cm4gYXdhaXQgYW5kcm9pZEhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xufTtcblxuY29tbWFuZHMub3Blbk5vdGlmaWNhdGlvbnMgPSBhc3luYyBmdW5jdGlvbiBvcGVuTm90aWZpY2F0aW9ucyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdvcGVuTm90aWZpY2F0aW9uJyk7XG59O1xuXG5jb21tYW5kcy5zZXRMb2NhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHNldExvY2F0aW9uIChsYXRpdHVkZSwgbG9uZ2l0dWRlKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5zZW5kVGVsbmV0Q29tbWFuZChgZ2VvIGZpeCAke2xvbmdpdHVkZX0gJHtsYXRpdHVkZX1gKTtcbn07XG5cbmNvbW1hbmRzLmZpbmdlcnByaW50ID0gYXN5bmMgZnVuY3Rpb24gZmluZ2VycHJpbnQgKGZpbmdlcnByaW50SWQpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2ZpbmdlcnByaW50IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuZmluZ2VycHJpbnQoZmluZ2VycHJpbnRJZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEZpbmdlcnByaW50T3B0c1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBmaW5nZXJwcmludElkIFRoZSB2YWx1ZSBpcyB0aGUgZmluZ2VyX2lkIGZvciB0aGUgZmluZ2VyIHRoYXRcbiAqIHdhcyBcInNjYW5uZWRcIi4gSXQgaXMgYSB1bmlxdWUgaW50ZWdlciB0aGF0IHlvdSBhc3NpZ24gZm9yIGVhY2ggdmlydHVhbCBmaW5nZXJwcmludC5cbiAqIFdoZW4gdGhlIGFwcCBpcyBydW5uaW5nIHlvdSBjYW4gcnVuIHRoaXMgc2FtZSBjb21tYW5kIGVhY2ggdGltZSB0aGVcbiAqIGVtdWxhdG9yIHByb21wdHMgeW91IGZvciBhIGZpbmdlcnByaW50LCB5b3UgY2FuIHJ1biB0aGUgYWRiIGNvbW1hbmQgYW5kIHBhc3MgaXRcbiAqIHRoZSBmaW5nZXJfaWQgdG8gc2ltdWxhdGUgdGhlIGZpbmdlcnByaW50IHNjYW4uXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGZpbmdlcnByaW50IG9uIEFuZHJvaWQgRW11bGF0b3IuXG4gKiBPbmx5IHdvcmtzIG9uIEFQSSAyMytcbiAqXG4gKiBAcGFyYW0ge0ZpbmdlcnByaW50T3B0c30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVGaW5nZXJwcmludCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUZpbmdlcnByaW50KG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZmluZ2VycHJpbnRJZH0gPSByZXF1aXJlQXJncygnZmluZ2VycHJpbnRJZCcsIG9wdHMpO1xuICBhd2FpdCB0aGlzLmZpbmdlcnByaW50KGZpbmdlcnByaW50SWQpO1xufTtcblxuY29tbWFuZHMuc2VuZFNNUyA9IGFzeW5jIGZ1bmN0aW9uIHNlbmRTTVMgKHBob25lTnVtYmVyLCBtZXNzYWdlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdzZW5kU01TIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuc2VuZFNNUyhwaG9uZU51bWJlciwgbWVzc2FnZSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNlbmRTbXNPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGhvbmVOdW1iZXIgVGhlIHBob25lIG51bWJlciB0byBzZW5kIFNNUyB0b1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgcGF5bG9hZFxuICovXG5cbi8qKlxuICogRW11bGF0ZSBzZW5kaW5nIGFuIFNNUyB0byB0aGUgZ2l2ZW4gcGhvbmUgbnVtYmVyLlxuICogT25seSB3b3JrcyBvbiBlbXVsYXRvcnMuXG4gKlxuICogQHBhcmFtIHtTZW5kU21zT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVTZW5kU21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2VuZFNtcyhvcHRzID0ge30pIHtcbiAgY29uc3Qge3Bob25lTnVtYmVyLCBtZXNzYWdlfSA9IHJlcXVpcmVBcmdzKFsncGhvbmVOdW1iZXInLCAnbWVzc2FnZSddLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5zZW5kU01TKHBob25lTnVtYmVyLCBtZXNzYWdlKTtcbn07XG5cbmNvbW1hbmRzLmdzbUNhbGwgPSBhc3luYyBmdW5jdGlvbiBnc21DYWxsIChwaG9uZU51bWJlciwgYWN0aW9uKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdnc21DYWxsIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuZ3NtQ2FsbChwaG9uZU51bWJlciwgYWN0aW9uKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtQ2FsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwaG9uZU51bWJlciBUaGUgcGhvbmUgbnVtYmVyIHRvIGNhbGwgdG9cbiAqIEBwcm9wZXJ0eSB7Y2FsbHxhY2NlcHR8Y2FuY2VsfGhvbGR9IGFjdGlvbiBPbmUgb2YgcG9zc2libGUgYWN0aW9ucyB0byB0YWtlXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGEgR1NNIGNhbGwgdG8gdGhlIGdpdmVuIHBob25lIG51bWJlci5cbiAqIE9ubHkgd29ya3Mgb24gZW11bGF0b3JzLlxuICpcbiAqIEBwYXJhbSB7R3NtQ2FsbE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR3NtQ2FsbCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdzbUNhbGwob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtwaG9uZU51bWJlciwgYWN0aW9ufSA9IHJlcXVpcmVBcmdzKFsncGhvbmVOdW1iZXInLCAnYWN0aW9uJ10sIG9wdHMpO1xuICBhd2FpdCB0aGlzLmdzbUNhbGwocGhvbmVOdW1iZXIsIGFjdGlvbik7XG59O1xuXG5jb21tYW5kcy5nc21TaWduYWwgPSBhc3luYyBmdW5jdGlvbiBnc21TaWduYWwgKHNpZ25hbFN0cmVuZ2gpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2dzbVNpZ25hbCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVNpZ25hbChzaWduYWxTdHJlbmdoKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtU2lnbmFsT3B0aW9uc1xuICogQHByb3BlcnR5IHswfDF8MnwzfDR9IHN0cmVuZ3RoIE9uZSBvZiBwb3NzaWJsZSBzaWduYWwgc3RyZW5ndGggdmFsdWVzLCB3aGVyZSA0IGlzIHRoZSBiZXN0IHNpZ25hbC5cbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgR1NNIHNpZ25hbCBzdHJlbmd0aCBjaGFuZ2UgZXZlbnQuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge0dzbVNpZ25hbE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR3NtU2lnbmFsID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR3NtU2lnbmFsKG9wdHMgPSB7fSkge1xuICBjb25zdCB7c3RyZW5ndGh9ID0gcmVxdWlyZUFyZ3MoJ3N0cmVuZ3RoJywgb3B0cyk7XG4gIGF3YWl0IHRoaXMuZ3NtU2lnbmFsKHN0cmVuZ3RoKTtcbn07XG5cbmNvbW1hbmRzLmdzbVZvaWNlID0gYXN5bmMgZnVuY3Rpb24gZ3NtVm9pY2UgKHN0YXRlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdnc21Wb2ljZSBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVZvaWNlKHN0YXRlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtVm9pY2VPcHRpb25zXG4gKiBAcHJvcGVydHkge29ufG9mZn0gc3RhdGVcbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgR1NNIHZvaWNlIHN0YXRlIGNoYW5nZSBldmVudC5cbiAqIE9ubHkgd29ya3Mgb24gZW11bGF0b3JzLlxuICpcbiAqIEBwYXJhbSB7R3NtVm9pY2VPcHRpb25zfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdzbVZvaWNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR3NtVm9pY2Uob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtzdGF0ZX0gPSByZXF1aXJlQXJncygnc3RhdGUnLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5nc21Wb2ljZShzdGF0ZSk7XG59O1xuXG5jb21tYW5kcy5wb3dlckFDID0gYXN5bmMgZnVuY3Rpb24gcG93ZXJBQyAoc3RhdGUpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ3Bvd2VyQUMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5wb3dlckFDKHN0YXRlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUG93ZXJBY09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7b258b2ZmfSBzdGF0ZVxuICovXG5cbi8qKlxuICogRW11bGF0ZSBBQyBwb3dlciBzdGF0ZSBjaGFuZ2UuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge0dzbVZvaWNlT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVQb3dlckFjID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUG93ZXJBYyhvcHRzID0ge30pIHtcbiAgY29uc3Qge3N0YXRlfSA9IHJlcXVpcmVBcmdzKCdzdGF0ZScsIG9wdHMpO1xuICBhd2FpdCB0aGlzLnBvd2VyQUMoc3RhdGUpO1xufTtcblxuY29tbWFuZHMucG93ZXJDYXBhY2l0eSA9IGFzeW5jIGZ1bmN0aW9uIHBvd2VyQ2FwYWNpdHkgKGJhdHRlcnlQZXJjZW50KSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdwb3dlckNhcGFjaXR5IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIucG93ZXJDYXBhY2l0eShiYXR0ZXJ5UGVyY2VudCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvd2VyQ2FwYWNpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGVyY2VudCAtIFBlcmNlbnRhZ2UgdmFsdWUgaW4gcmFuZ2UgWzAsIDEwMF1cbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgcG93ZXIgY2FwYWNpdHkgY2hhbmdlLlxuICogT25seSB3b3JrcyBvbiBlbXVsYXRvcnMuXG4gKlxuICogQHBhcmFtIHtQb3dlckNhcGFjaXR5T3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVQb3dlckNhcGFjaXR5ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUG93ZXJDYXBhY2l0eShvcHRzID0ge30pIHtcbiAgY29uc3Qge3BlcmNlbnR9ID0gcmVxdWlyZUFyZ3MoJ3BlcmNlbnQnLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5wb3dlckNhcGFjaXR5KHBlcmNlbnQpO1xufTtcblxuY29tbWFuZHMubmV0d29ya1NwZWVkID0gYXN5bmMgZnVuY3Rpb24gbmV0d29ya1NwZWVkIChuZXR3b3JrU3BlZWQpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ25ldHdvcmtTcGVlZCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLm5ldHdvcmtTcGVlZChuZXR3b3JrU3BlZWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBOZXR3b3JrU3BlZWRPcHRpb25zXG4gKiBAcHJvcGVydHkge2dzbXxzY3NkfGdwcnN8ZWRnZXx1bXRzfGhzZHBhfGx0ZXxldmRvfGZ1bGx9IHNwZWVkXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGRpZmZlcmVudCBuZXR3b3JrIGNvbm5lY3Rpb24gc3BlZWQgbW9kZXMuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge05ldHdvcmtTcGVlZE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlTmV0d29ya1NwZWVkID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTmV0d29ya1NwZWVkKG9wdHMgPSB7fSkge1xuICBjb25zdCB7c3BlZWR9ID0gcmVxdWlyZUFyZ3MoJ3NwZWVkJywgb3B0cyk7XG4gIGF3YWl0IHRoaXMubmV0d29ya1NwZWVkKHNwZWVkKTtcbn07XG5cbi8qKlxuICogRW11bGF0ZSBzZW5zb3JzIHZhbHVlcyBvbiB0aGUgY29ubmVjdGVkIGVtdWxhdG9yLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNlbnNvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbnNvclR5cGUgLSBzZW5zb3IgdHlwZSBkZWNsYXJlZCBpbiBhZGIuU0VOU09SU1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gdmFsdWUgdG8gc2V0IHRvIHRoZSBzZW5zb3JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gU2Vuc29yXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiBzZW5zb3JUeXBlIGlzIG5vdCBkZWZpbmVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiB2YWx1ZSBmb3IgdGhlIHNlIHNvciBpcyBub3QgZGVmaW5lZFxuICogQHRocm93cyB7RXJyb3J9IC0gSWYgZGV2aWNlVHlwZSBpcyBub3QgYW4gZW11bGF0b3JcbiAqL1xuY29tbWFuZHMuc2Vuc29yU2V0ID0gYXN5bmMgZnVuY3Rpb24gc2Vuc29yU2V0IChzZW5zb3IgPSB7fSkge1xuICBjb25zdCB7c2Vuc29yVHlwZSwgdmFsdWV9ID0gc2Vuc29yO1xuICBpZiAoIXV0aWwuaGFzVmFsdWUoc2Vuc29yVHlwZSkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGAnc2Vuc29yVHlwZScgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuICBpZiAoIXV0aWwuaGFzVmFsdWUodmFsdWUpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgJ3ZhbHVlJyBhcmd1bWVudCBpcyByZXF1aXJlZGApO1xuICB9XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdzZW5zb3JTZXQgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5zZW5zb3JTZXQoc2Vuc29yVHlwZSwgdmFsdWUpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0FEQn0gYWRiXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICogQHJldHVybnMge1Byb21pc2U8c2hhcnA+fVxuICovXG5oZWxwZXJzLmdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuc2hvdERhdGFXaXRoQWRiU2hlbGwgKGFkYiwgb3B0cykge1xuICBjb25zdCBsb2NhbEZpbGUgPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe3ByZWZpeDogJ2FwcGl1bScsIHN1ZmZpeDogJy5wbmcnfSk7XG4gIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxGaWxlKSkge1xuICAgIGF3YWl0IGZzLnVubGluayhsb2NhbEZpbGUpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcG5nRGlyID0gb3B0cy5hbmRyb2lkU2NyZWVuc2hvdFBhdGggfHwgJy9kYXRhL2xvY2FsL3RtcC8nO1xuICAgIGNvbnN0IHBuZyA9IHBhdGgucG9zaXgucmVzb2x2ZShwbmdEaXIsICdzY3JlZW5zaG90LnBuZycpO1xuICAgIGF3YWl0IGFkYi5zaGVsbChbJy9zeXN0ZW0vYmluL3JtJywgYCR7cG5nfTtgLCAnL3N5c3RlbS9iaW4vc2NyZWVuY2FwJywgJy1wJywgcG5nXSk7XG4gICAgaWYgKCFhd2FpdCBhZGIuZmlsZVNpemUocG5nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc2l6ZSBvZiB0aGUgdGFrZW4gc2NyZWVuc2hvdCBlcXVhbHMgdG8gemVyby4nKTtcbiAgICB9XG4gICAgYXdhaXQgYWRiLnB1bGwocG5nLCBsb2NhbEZpbGUpO1xuICAgIHJldHVybiBzaGFycChsb2NhbEZpbGUpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxGaWxlKSkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QURCfSBhZGJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHNoYXJwPn1cbiAqL1xuaGVscGVycy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuc2hvdERhdGFXaXRoQWRiRXhlY091dCAoYWRiKSB7XG4gIGNvbnN0IHtzdGRvdXQsIHN0ZGVyciwgY29kZX0gPSBhd2FpdCBleGVjKFxuICAgIGFkYi5leGVjdXRhYmxlLnBhdGgsXG4gICAgWy4uLmFkYi5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLCAnZXhlYy1vdXQnLCAnL3N5c3RlbS9iaW4vc2NyZWVuY2FwJywgJy1wJ10sXG4gICAge2VuY29kaW5nOiAnYmluYXJ5JywgaXNCdWZmZXI6IHRydWV9XG4gICk7XG4gIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB0aHJvd1xuICBpZiAoY29kZSB8fCBzdGRlcnIubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTY3JlZW5zaG90IHJldHVybmVkIGVycm9yLCBjb2RlOiAnJHtjb2RlfScsIHN0ZGVycjogJyR7c3RkZXJyLnRvU3RyaW5nKCl9J2ApO1xuICB9XG4gIC8vIGlmIHdlIGRvbid0IGdldCBhbnl0aGluZyBhdCBhbGwsIHRocm93XG4gIGlmICghc3Rkb3V0Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2NyZWVuc2hvdCByZXR1cm5lZCBubyBkYXRhJyk7XG4gIH1cblxuICByZXR1cm4gc2hhcnAoc3Rkb3V0KTtcbn07XG5cbmNvbW1hbmRzLmdldFNjcmVlbnNob3QgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5zaG90ICgpIHtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuICBsZXQgaW1hZ2UgPSBudWxsO1xuICBpZiAoYXBpTGV2ZWwgPiAyMCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBUaGlzIHNjcmVlbnNob3RpbmcgYXBwcm9hY2ggaXMgd2F5IGZhc3Rlciwgc2luY2UgaXQgcmVxdWlyZXMgbGVzcyBleHRlcm5hbCBjb21tYW5kc1xuICAgICAgLy8gdG8gYmUgZXhlY3V0ZWQuIFVuZm9ydHVuYXRlbHksIGV4ZWMtb3V0IG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBieSBuZXdlciBBbmRyb2lkL1NESyB2ZXJzaW9ucyAoNS4wIGFuZCBsYXRlcilcbiAgICAgIGltYWdlID0gYXdhaXQgdGhpcy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0KHRoaXMuYWRiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBDYW5ub3QgZ2V0IHNjcmVlbnNob3QgZGF0YSB3aXRoICdhZGIgZXhlYy1vdXQnIGJlY2F1c2Ugb2YgJyR7ZS5tZXNzYWdlfScuIGAgK1xuICAgICAgICBgRGVmYXVsdGluZyB0byAnYWRiIHNoZWxsJyBjYWxsYCk7XG4gICAgfVxuICB9XG4gIGlmICghaW1hZ2UpIHtcbiAgICB0cnkge1xuICAgICAgaW1hZ2UgPSBhd2FpdCB0aGlzLmdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IGVyciA9IGBDYW5ub3QgZ2V0IHNjcmVlbnNob3QgZGF0YSBiZWNhdXNlIG9mICcke2UubWVzc2FnZX0nLiBgICtcbiAgICAgICAgYE1ha2Ugc3VyZSB0aGUgJ0xheW91dFBhcmFtcy5GTEFHX1NFQ1VSRScgaXMgbm90IHNldCBmb3IgYCArXG4gICAgICAgIGB0aGUgY3VycmVudCB2aWV3YDtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coZXJyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFwaUxldmVsIDwgMjMpIHtcbiAgICAvLyBBbmRyb2lkIGJ1ZyA4NDMzNzQyIC0gcm90YXRlIHNjcmVlbnNob3QgaWYgc2NyZWVuIGlzIHJvdGF0ZWRcbiAgICBsZXQgc2NyZWVuT3JpZW50YXRpb24gPSBhd2FpdCB0aGlzLmFkYi5nZXRTY3JlZW5PcmllbnRhdGlvbigpO1xuICAgIHRyeSB7XG4gICAgICBpbWFnZSA9IGltYWdlLnJvdGF0ZSgtOTAgKiBzY3JlZW5PcmllbnRhdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBDb3VsZCBub3Qgcm90YXRlIHNjcmVlbnNob3QgZHVlIHRvIGVycm9yOiAke2Vycn1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChhd2FpdCBpbWFnZS50b0J1ZmZlcigpKS50b1N0cmluZygnYmFzZTY0Jyk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLGVBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLEtBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFNBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLGFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE1BQUEsR0FBQU4sT0FBQTtBQUVBLE1BQU1PLGdCQUFnQixHQUFHLEVBQUU7QUFDM0IsTUFBTUMsZUFBZSxHQUFHLEVBQUU7QUFFMUIsTUFBTUMsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUFDQyxPQUFBLENBQUFELFFBQUEsR0FBQUEsUUFBQTtBQUNwQixNQUFNRSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQUNELE9BQUEsQ0FBQUMsT0FBQSxHQUFBQSxPQUFBO0FBQ25CLE1BQU1DLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFckJILFFBQVEsQ0FBQ0ksUUFBUSxHQUFHLGVBQWVBLFFBQVFBLENBQUVDLE9BQU8sRUFBRUMsU0FBUyxHQUFHLElBQUksRUFBRTtFQUV0RSxJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDLDhDQUE4QyxDQUFDO0VBQzdELE9BQU8sTUFBTSxJQUFJLENBQUNDLFlBQVksQ0FBQ0osT0FBTyxFQUFFQyxTQUFTLENBQUM7QUFDcEQsQ0FBQztB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
|
|
409
|
+
exports.default = extensions;
|
|
410
|
+
//# sourceMappingURL=actions.js.map
|