appium-android-driver 5.4.3 → 5.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.js +1 -9
- package/build/lib/android-helpers.js +10 -194
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.js +4 -45
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.js +3 -78
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.js +3 -10
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.js +4 -32
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.js +6 -78
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/coverage.js +1 -6
- package/build/lib/commands/coverage.js.map +1 -1
- package/build/lib/commands/element.js +4 -47
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/emu-console.js +2 -7
- package/build/lib/commands/emu-console.js.map +1 -1
- package/build/lib/commands/execute.js +1 -13
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.js +3 -44
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.js +3 -16
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +32 -91
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.js +3 -14
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.js +3 -27
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.js +1 -40
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/log.js +3 -35
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.js +2 -47
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.js +4 -40
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.js +5 -57
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/recordscreen.js +1 -59
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/shell.js +1 -15
- package/build/lib/commands/shell.js.map +1 -1
- package/build/lib/commands/streamscreen.js +7 -74
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/system-bars.js +1 -23
- package/build/lib/commands/system-bars.js.map +1 -1
- package/build/lib/commands/touch.js +13 -79
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/desired-caps.js +3 -4
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.js +8 -97
- package/build/lib/driver.js.map +1 -1
- package/build/lib/logger.js +1 -5
- package/build/lib/logger.js.map +1 -1
- package/build/lib/uiautomator.js +3 -24
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.js +1 -61
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.js +1 -7
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.js +1 -94
- package/build/lib/webview-helpers.js.map +1 -1
- package/lib/android-helpers.js +2 -1
- package/lib/commands/general.js +34 -15
- package/package.json +1 -1
package/build/lib/bootstrap.js
CHANGED
|
@@ -1,30 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = exports.COMMAND_TYPES = exports.AndroidBootstrap = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _uiautomator = _interopRequireDefault(require("./uiautomator"));
|
|
13
|
-
|
|
14
10
|
var _net = _interopRequireDefault(require("net"));
|
|
15
|
-
|
|
16
11
|
var _path = _interopRequireDefault(require("path"));
|
|
17
|
-
|
|
18
12
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
19
|
-
|
|
20
13
|
var _driver = require("appium/driver");
|
|
21
|
-
|
|
22
14
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
23
|
-
|
|
24
15
|
var _support = require("appium/support");
|
|
25
|
-
|
|
26
16
|
const log = _support.logger.getLogger('AndroidBootstrap');
|
|
27
|
-
|
|
28
17
|
const COMMAND_TYPES = {
|
|
29
18
|
ACTION: 'action',
|
|
30
19
|
SHUTDOWN: 'shutdown'
|
|
@@ -34,25 +23,19 @@ const SEND_COMMAND_TIMEOUT = 1 * 60 * 1000;
|
|
|
34
23
|
|
|
35
24
|
const getModuleRoot = _lodash.default.memoize(async function getModuleRoot() {
|
|
36
25
|
let currentDir = _path.default.dirname(_path.default.resolve(__filename));
|
|
37
|
-
|
|
38
26
|
let isAtFsRoot = false;
|
|
39
|
-
|
|
40
27
|
while (!isAtFsRoot) {
|
|
41
28
|
const manifestPath = _path.default.join(currentDir, 'package.json');
|
|
42
|
-
|
|
43
29
|
try {
|
|
44
30
|
if ((await _support.fs.exists(manifestPath)) && JSON.parse(await _support.fs.readFile(manifestPath, 'utf8')).name === 'appium-android-driver') {
|
|
45
31
|
return currentDir;
|
|
46
32
|
}
|
|
47
33
|
} catch (ign) {}
|
|
48
|
-
|
|
49
34
|
currentDir = _path.default.dirname(currentDir);
|
|
50
35
|
isAtFsRoot = currentDir.length <= _path.default.dirname(currentDir).length;
|
|
51
36
|
}
|
|
52
|
-
|
|
53
37
|
throw new Error('Cannot find the root folder of the appium-android-driver Node.js module');
|
|
54
38
|
});
|
|
55
|
-
|
|
56
39
|
class AndroidBootstrap {
|
|
57
40
|
constructor(adb, systemPort = 4724, webSocket = undefined) {
|
|
58
41
|
this.adb = adb;
|
|
@@ -60,7 +43,6 @@ class AndroidBootstrap {
|
|
|
60
43
|
this.webSocket = webSocket;
|
|
61
44
|
this.ignoreUnexpectedShutdown = false;
|
|
62
45
|
}
|
|
63
|
-
|
|
64
46
|
get onUnexpectedShutdown() {
|
|
65
47
|
if (!this._onUnexpectedShutdownPromise) {
|
|
66
48
|
let reject;
|
|
@@ -69,25 +51,20 @@ class AndroidBootstrap {
|
|
|
69
51
|
});
|
|
70
52
|
this._onUnexpectedShutdownPromise.cancel = reject;
|
|
71
53
|
}
|
|
72
|
-
|
|
73
54
|
return this._onUnexpectedShutdownPromise;
|
|
74
55
|
}
|
|
75
|
-
|
|
76
56
|
async start(appPackage, disableAndroidWatchers = false, acceptSslCerts = false) {
|
|
77
57
|
try {
|
|
78
58
|
const startDetector = s => /Appium Socket Server Ready/.test(s);
|
|
79
|
-
|
|
80
59
|
const bootstrapJar = _path.default.resolve(await getModuleRoot(), 'bootstrap', 'bin', 'AppiumBootstrap.jar');
|
|
81
|
-
|
|
82
60
|
await this.init();
|
|
83
61
|
await this.adb.forwardPort(this.systemPort, 4724);
|
|
84
62
|
this.process = await this.uiAutomator.start(bootstrapJar, 'io.appium.android.bootstrap.Bootstrap', startDetector, '-e', 'pkg', appPackage, '-e', 'disableAndroidWatchers', disableAndroidWatchers, '-e', 'acceptSslCerts', acceptSslCerts);
|
|
63
|
+
|
|
85
64
|
this.process.on('output', (stdout, stderr) => {
|
|
86
65
|
const alertRe = /Emitting system alert message/;
|
|
87
|
-
|
|
88
66
|
if (alertRe.test(stdout)) {
|
|
89
67
|
log.debug('Emitting alert message...');
|
|
90
|
-
|
|
91
68
|
if (this.webSocket) {
|
|
92
69
|
this.webSocket.sockets.emit('alert', {
|
|
93
70
|
message: stdout
|
|
@@ -97,32 +74,28 @@ class AndroidBootstrap {
|
|
|
97
74
|
|
|
98
75
|
let stdoutLines = (stdout || '').split('\n');
|
|
99
76
|
const uiautoLog = /\[APPIUM-UIAUTO\](.+)\[\/APPIUM-UIAUTO\]/;
|
|
100
|
-
|
|
101
77
|
for (let line of stdoutLines) {
|
|
102
78
|
if (line.trim()) {
|
|
103
79
|
if (uiautoLog.test(line)) {
|
|
104
80
|
let innerLine = uiautoLog.exec(line)[1].trim();
|
|
105
81
|
let logMethod = log.info.bind(log);
|
|
106
|
-
|
|
107
82
|
if (/\[debug\]/.test(innerLine)) {
|
|
108
83
|
logMethod = log.debug.bind(log);
|
|
109
84
|
}
|
|
110
|
-
|
|
111
85
|
logMethod(`[BOOTSTRAP LOG] ${innerLine}`);
|
|
112
86
|
} else {
|
|
113
87
|
log.debug(`[UIAUTO STDOUT] ${line}`);
|
|
114
88
|
}
|
|
115
89
|
}
|
|
116
90
|
}
|
|
117
|
-
|
|
118
91
|
let stderrLines = (stderr || '').split('\n');
|
|
119
|
-
|
|
120
92
|
for (let line of stderrLines) {
|
|
121
93
|
if (line.trim()) {
|
|
122
94
|
log.debug(`[UIAUTO STDERR] ${line}`);
|
|
123
95
|
}
|
|
124
96
|
}
|
|
125
97
|
});
|
|
98
|
+
|
|
126
99
|
return await new _bluebird.default((resolve, reject) => {
|
|
127
100
|
try {
|
|
128
101
|
this.socketClient = _net.default.connect(this.systemPort);
|
|
@@ -143,12 +116,10 @@ class AndroidBootstrap {
|
|
|
143
116
|
log.errorAndThrow(`Error occured while starting AndroidBootstrap. Original error: ${err}`);
|
|
144
117
|
}
|
|
145
118
|
}
|
|
146
|
-
|
|
147
119
|
async sendCommand(type, extra = {}) {
|
|
148
120
|
if (!this.socketClient) {
|
|
149
121
|
throw new Error('Socket connection closed unexpectedly');
|
|
150
122
|
}
|
|
151
|
-
|
|
152
123
|
return await new _bluebird.default((resolve, reject) => {
|
|
153
124
|
let cmd = Object.assign({
|
|
154
125
|
cmd: type
|
|
@@ -165,17 +136,13 @@ class AndroidBootstrap {
|
|
|
165
136
|
if (sendCommandTimeoutHandler) {
|
|
166
137
|
clearTimeout(sendCommandTimeoutHandler);
|
|
167
138
|
}
|
|
168
|
-
|
|
169
139
|
log.debug('Received command result from bootstrap');
|
|
170
|
-
|
|
171
140
|
try {
|
|
172
141
|
streamData = JSON.parse(streamData + data);
|
|
173
142
|
this.socketClient.removeAllListeners('data');
|
|
174
|
-
|
|
175
143
|
if (streamData.status === 0) {
|
|
176
144
|
return resolve(streamData.value);
|
|
177
145
|
}
|
|
178
|
-
|
|
179
146
|
reject((0, _driver.errorFromCode)(streamData.status, streamData.value));
|
|
180
147
|
} catch (err) {
|
|
181
148
|
if (!_lodash.default.isString(streamData)) {
|
|
@@ -183,7 +150,6 @@ class AndroidBootstrap {
|
|
|
183
150
|
log.error(err.stack);
|
|
184
151
|
return reject((0, _driver.errorFromCode)(13, err.message));
|
|
185
152
|
}
|
|
186
|
-
|
|
187
153
|
log.debug(`Stream still not complete, waiting up to ${SEND_COMMAND_TIMEOUT}ms for the data to arrive`);
|
|
188
154
|
streamData += data;
|
|
189
155
|
sendCommandTimeoutHandler = setTimeout(() => {
|
|
@@ -196,7 +162,6 @@ class AndroidBootstrap {
|
|
|
196
162
|
});
|
|
197
163
|
});
|
|
198
164
|
}
|
|
199
|
-
|
|
200
165
|
async sendAction(action, params = {}) {
|
|
201
166
|
let extra = {
|
|
202
167
|
action,
|
|
@@ -204,7 +169,6 @@ class AndroidBootstrap {
|
|
|
204
169
|
};
|
|
205
170
|
return await this.sendCommand(COMMAND_TYPES.ACTION, extra);
|
|
206
171
|
}
|
|
207
|
-
|
|
208
172
|
async shutdown() {
|
|
209
173
|
if (!this.uiAutomator) {
|
|
210
174
|
log.warn('Cannot shut down Android bootstrap; it has already shut down');
|
|
@@ -212,17 +176,16 @@ class AndroidBootstrap {
|
|
|
212
176
|
}
|
|
213
177
|
|
|
214
178
|
this.uiAutomator.removeAllListeners(_uiautomator.default.EVENT_CHANGED);
|
|
215
|
-
|
|
216
179
|
if (this.socketClient) {
|
|
217
180
|
await this.sendCommand(COMMAND_TYPES.SHUTDOWN);
|
|
218
181
|
}
|
|
219
|
-
|
|
220
182
|
await this.uiAutomator.shutdown();
|
|
221
183
|
this.uiAutomator = null;
|
|
222
184
|
}
|
|
223
185
|
|
|
224
186
|
async init() {
|
|
225
187
|
this.uiAutomator = new _uiautomator.default(this.adb);
|
|
188
|
+
|
|
226
189
|
this.uiAutomator.on(_uiautomator.default.EVENT_CHANGED, msg => {
|
|
227
190
|
if (msg.state === _uiautomator.default.STATE_STOPPED) {
|
|
228
191
|
this.uiAutomator = null;
|
|
@@ -230,19 +193,15 @@ class AndroidBootstrap {
|
|
|
230
193
|
}
|
|
231
194
|
});
|
|
232
195
|
}
|
|
233
|
-
|
|
234
196
|
set ignoreUnexpectedShutdown(ignore) {
|
|
235
197
|
log.debug(`${ignore ? 'Ignoring' : 'Watching for'} bootstrap disconnect`);
|
|
236
198
|
this._ignoreUnexpectedShutdown = ignore;
|
|
237
199
|
}
|
|
238
|
-
|
|
239
200
|
get ignoreUnexpectedShutdown() {
|
|
240
201
|
return this._ignoreUnexpectedShutdown;
|
|
241
202
|
}
|
|
242
|
-
|
|
243
203
|
}
|
|
244
|
-
|
|
245
204
|
exports.AndroidBootstrap = AndroidBootstrap;
|
|
246
205
|
var _default = AndroidBootstrap;
|
|
247
206
|
exports.default = _default;
|
|
248
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJDT01NQU5EX1RZUEVTIiwiQUNUSU9OIiwiU0hVVERPV04iLCJTRU5EX0NPTU1BTkRfVElNRU9VVCIsImdldE1vZHVsZVJvb3QiLCJfIiwibWVtb2l6ZSIsImN1cnJlbnREaXIiLCJwYXRoIiwiZGlybmFtZSIsInJlc29sdmUiLCJfX2ZpbGVuYW1lIiwiaXNBdEZzUm9vdCIsIm1hbmlmZXN0UGF0aCIsImpvaW4iLCJmcyIsImV4aXN0cyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlIiwibmFtZSIsImlnbiIsImxlbmd0aCIsIkVycm9yIiwiQW5kcm9pZEJvb3RzdHJhcCIsImNvbnN0cnVjdG9yIiwiYWRiIiwic3lzdGVtUG9ydCIsIndlYlNvY2tldCIsInVuZGVmaW5lZCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSIsInJlamVjdCIsIkIiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJjYW5jZWwiLCJzdGFydCIsImFwcFBhY2thZ2UiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwiYWNjZXB0U3NsQ2VydHMiLCJzdGFydERldGVjdG9yIiwicyIsInRlc3QiLCJib290c3RyYXBKYXIiLCJpbml0IiwiZm9yd2FyZFBvcnQiLCJwcm9jZXNzIiwidWlBdXRvbWF0b3IiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsImFsZXJ0UmUiLCJkZWJ1ZyIsInNvY2tldHMiLCJlbWl0IiwibWVzc2FnZSIsInN0ZG91dExpbmVzIiwic3BsaXQiLCJ1aWF1dG9Mb2ciLCJsaW5lIiwidHJpbSIsImlubmVyTGluZSIsImV4ZWMiLCJsb2dNZXRob2QiLCJpbmZvIiwiYmluZCIsInN0ZGVyckxpbmVzIiwic29ja2V0Q2xpZW50IiwibmV0IiwiY29ubmVjdCIsImVyciIsIm9uY2UiLCJlcnJvckFuZFRocm93Iiwic2VuZENvbW1hbmQiLCJ0eXBlIiwiZXh0cmEiLCJjbWQiLCJPYmplY3QiLCJhc3NpZ24iLCJjbWRKc29uIiwic3RyaW5naWZ5IiwidHJ1bmNhdGUiLCJ3cml0ZSIsInNldEVuY29kaW5nIiwic3RyZWFtRGF0YSIsInNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIiLCJkYXRhIiwiY2xlYXJUaW1lb3V0IiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RhdHVzIiwidmFsdWUiLCJlcnJvckZyb21Db2RlIiwiaXNTdHJpbmciLCJlcnJvciIsInN0YWNrIiwic2V0VGltZW91dCIsImVyck1zZyIsInNlbmRBY3Rpb24iLCJhY3Rpb24iLCJwYXJhbXMiLCJzaHV0ZG93biIsIndhcm4iLCJVaUF1dG9tYXRvciIsIkVWRU5UX0NIQU5HRUQiLCJtc2ciLCJzdGF0ZSIsIlNUQVRFX1NUT1BQRUQiLCJpZ25vcmUiLCJfaWdub3JlVW5leHBlY3RlZFNodXRkb3duIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVWlBdXRvbWF0b3IgZnJvbSAnLi91aWF1dG9tYXRvcic7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvckZyb21Db2RlIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBsb2dnZXIsIGZzIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuXG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0FuZHJvaWRCb290c3RyYXAnKTtcbmNvbnN0IENPTU1BTkRfVFlQRVMgPSB7XG4gIEFDVElPTjogJ2FjdGlvbicsXG4gIFNIVVRET1dOOiAnc2h1dGRvd24nXG59O1xuY29uc3QgU0VORF9DT01NQU5EX1RJTUVPVVQgPSAxICogNjAgKiAxMDAwO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHBhdGggdG8gdGhlIGN1cnJlbnQgbW9kdWxlJ3Mgcm9vdCBmb2xkZXJcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIG1vZHVsZSByb290XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGN1cnJlbnQgbW9kdWxlIHJvb3QgZm9sZGVyIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbmNvbnN0IGdldE1vZHVsZVJvb3QgPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0TW9kdWxlUm9vdCAoKSB7XG4gIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKHBhdGgucmVzb2x2ZShfX2ZpbGVuYW1lKSk7XG4gIGxldCBpc0F0RnNSb290ID0gZmFsc2U7XG4gIHdoaWxlICghaXNBdEZzUm9vdCkge1xuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhd2FpdCBmcy5leGlzdHMobWFuaWZlc3RQYXRoKSAmJlxuICAgICAgICAgIEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUobWFuaWZlc3RQYXRoLCAndXRmOCcpKS5uYW1lID09PSAnYXBwaXVtLWFuZHJvaWQtZHJpdmVyJykge1xuICAgICAgICByZXR1cm4gY3VycmVudERpcjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgY3VycmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKTtcbiAgICBpc0F0RnNSb290ID0gY3VycmVudERpci5sZW5ndGggPD0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpLmxlbmd0aDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIHRoZSByb290IGZvbGRlciBvZiB0aGUgYXBwaXVtLWFuZHJvaWQtZHJpdmVyIE5vZGUuanMgbW9kdWxlJyk7XG59KTtcblxuY2xhc3MgQW5kcm9pZEJvb3RzdHJhcCB7XG4gIGNvbnN0cnVjdG9yIChhZGIsIHN5c3RlbVBvcnQgPSA0NzI0LCB3ZWJTb2NrZXQgPSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmFkYiA9IGFkYjtcbiAgICB0aGlzLnN5c3RlbVBvcnQgPSBzeXN0ZW1Qb3J0O1xuICAgIHRoaXMud2ViU29ja2V0ID0gd2ViU29ja2V0O1xuICAgIHRoaXMuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gZmFsc2U7XG4gIH1cblxuICBnZXQgb25VbmV4cGVjdGVkU2h1dGRvd24gKCkge1xuICAgIGlmICghdGhpcy5fb25VbmV4cGVjdGVkU2h1dGRvd25Qcm9taXNlKSB7XG4gICAgICBsZXQgcmVqZWN0O1xuICAgICAgdGhpcy5fb25VbmV4cGVjdGVkU2h1dGRvd25Qcm9taXNlID0gbmV3IEIoZnVuY3Rpb24gX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSAoX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fb25VbmV4cGVjdGVkU2h1dGRvd25Qcm9taXNlLmNhbmNlbCA9IHJlamVjdDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0IChhcHBQYWNrYWdlLCBkaXNhYmxlQW5kcm9pZFdhdGNoZXJzID0gZmFsc2UsIGFjY2VwdFNzbENlcnRzID0gZmFsc2UpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnREZXRlY3RvciA9IChzKSA9PiAvQXBwaXVtIFNvY2tldCBTZXJ2ZXIgUmVhZHkvLnRlc3Qocyk7XG4gICAgICBjb25zdCBib290c3RyYXBKYXIgPSBwYXRoLnJlc29sdmUoYXdhaXQgZ2V0TW9kdWxlUm9vdCgpLCAnYm9vdHN0cmFwJywgJ2JpbicsICdBcHBpdW1Cb290c3RyYXAuamFyJyk7XG5cbiAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yd2FyZFBvcnQodGhpcy5zeXN0ZW1Qb3J0LCA0NzI0KTtcbiAgICAgIHRoaXMucHJvY2VzcyA9IGF3YWl0IHRoaXMudWlBdXRvbWF0b3Iuc3RhcnQoXG4gICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcEphciwgJ2lvLmFwcGl1bS5hbmRyb2lkLmJvb3RzdHJhcC5Cb290c3RyYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICBzdGFydERldGVjdG9yLCAnLWUnLCAncGtnJywgYXBwUGFja2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgJy1lJywgJ2Rpc2FibGVBbmRyb2lkV2F0Y2hlcnMnLCBkaXNhYmxlQW5kcm9pZFdhdGNoZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAnLWUnLCAnYWNjZXB0U3NsQ2VydHMnLCBhY2NlcHRTc2xDZXJ0cyk7XG5cbiAgICAgIC8vIHByb2Nlc3MgdGhlIG91dHB1dFxuICAgICAgdGhpcy5wcm9jZXNzLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgY29uc3QgYWxlcnRSZSA9IC9FbWl0dGluZyBzeXN0ZW0gYWxlcnQgbWVzc2FnZS87XG4gICAgICAgIGlmIChhbGVydFJlLnRlc3Qoc3Rkb3V0KSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZygnRW1pdHRpbmcgYWxlcnQgbWVzc2FnZS4uLicpO1xuICAgICAgICAgIGlmICh0aGlzLndlYlNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQuc29ja2V0cy5lbWl0KCdhbGVydCcsIHttZXNzYWdlOiBzdGRvdXR9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgYm9vdHN0cmFwIGxvZ2dlciB3cmFwcyBpdHMgb3duIGxvZyBsaW5lcyB3aXRoXG4gICAgICAgIC8vIFtBUFBJVU0tVUlBVVRPXSAuLi4gW0FQUElVTS1VSUFVVE9dXG4gICAgICAgIC8vIGFuZCBsZWF2ZXMgYWN0dWFsIFVpQXV0b21hdG9yIGxvZ3MgYXMgdGhleSBhcmVcbiAgICAgICAgbGV0IHN0ZG91dExpbmVzID0gKHN0ZG91dCB8fCAnJykuc3BsaXQoJ1xcbicpO1xuICAgICAgICBjb25zdCB1aWF1dG9Mb2cgPSAvXFxbQVBQSVVNLVVJQVVUT1xcXSguKylcXFtcXC9BUFBJVU0tVUlBVVRPXFxdLztcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiBzdGRvdXRMaW5lcykge1xuICAgICAgICAgIGlmIChsaW5lLnRyaW0oKSkge1xuICAgICAgICAgICAgaWYgKHVpYXV0b0xvZy50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgIGxldCBpbm5lckxpbmUgPSB1aWF1dG9Mb2cuZXhlYyhsaW5lKVsxXS50cmltKCk7XG4gICAgICAgICAgICAgIGxldCBsb2dNZXRob2QgPSBsb2cuaW5mby5iaW5kKGxvZyk7XG4gICAgICAgICAgICAgIC8vIGlmIHRoZSBib290c3RyYXAgbG9nIGNvbnNpZGVycyBzb21ldGhpbmcgZGVidWcsIGxvZyB0aGF0IGFzXG4gICAgICAgICAgICAgIC8vIGRlYnVnIGFuZCBub3QgaW5mb1xuICAgICAgICAgICAgICBpZiAoL1xcW2RlYnVnXFxdLy50ZXN0KGlubmVyTGluZSkpIHtcbiAgICAgICAgICAgICAgICBsb2dNZXRob2QgPSBsb2cuZGVidWcuYmluZChsb2cpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxvZ01ldGhvZChgW0JPT1RTVFJBUCBMT0ddICR7aW5uZXJMaW5lfWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9nLmRlYnVnKGBbVUlBVVRPIFNURE9VVF0gJHtsaW5lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdGRlcnJMaW5lcyA9IChzdGRlcnIgfHwgJycpLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiBzdGRlcnJMaW5lcykge1xuICAgICAgICAgIGlmIChsaW5lLnRyaW0oKSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKGBbVUlBVVRPIFNUREVSUl0gJHtsaW5lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIG9ubHkgcmV0dXJuIHdoZW4gdGhlIHNvY2tldCBjbGllbnQgaGFzIGNvbm5lY3RlZFxuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnNvY2tldENsaWVudCA9IG5ldC5jb25uZWN0KHRoaXMuc3lzdGVtUG9ydCk7XG4gICAgICAgICAgLy8gV2luZG93czogdGhlIHNvY2tldCBlcnJvcnMgb3V0IHdoZW4gQURCIHJlc3RhcnRzLiBMZXQncyBjYXRjaCBpdCB0byBhdm9pZCBjcmFzaGluZy5cbiAgICAgICAgICB0aGlzLnNvY2tldENsaWVudC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaWdub3JlVW5leHBlY3RlZFNodXRkb3duKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQW5kcm9pZCBib290c3RyYXAgc29ja2V0IGNyYXNoZWQ6ICR7ZXJyfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc29ja2V0Q2xpZW50Lm9uY2UoJ2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICAgICAgICBsb2cuaW5mbygnQW5kcm9pZCBib290c3RyYXAgc29ja2V0IGlzIG5vdyBjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmVycm9yQW5kVGhyb3coYEVycm9yIG9jY3VyZWQgd2hpbGUgc3RhcnRpbmcgQW5kcm9pZEJvb3RzdHJhcC4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNlbmRDb21tYW5kICh0eXBlLCBleHRyYSA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldENsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb2NrZXQgY29ubmVjdGlvbiBjbG9zZWQgdW5leHBlY3RlZGx5Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBjbWQgPSBPYmplY3QuYXNzaWduKHtjbWQ6IHR5cGV9LCBleHRyYSk7XG4gICAgICBsZXQgY21kSnNvbiA9IGAke0pTT04uc3RyaW5naWZ5KGNtZCl9IFxcbmA7XG4gICAgICBsb2cuZGVidWcoYFNlbmRpbmcgY29tbWFuZCB0byBhbmRyb2lkOiAke18udHJ1bmNhdGUoY21kSnNvbiwge2xlbmd0aDogMTAwMH0pLnRyaW0oKX1gKTtcbiAgICAgIHRoaXMuc29ja2V0Q2xpZW50LndyaXRlKGNtZEpzb24pO1xuICAgICAgdGhpcy5zb2NrZXRDbGllbnQuc2V0RW5jb2RpbmcoJ3V0ZjgnKTtcbiAgICAgIGxldCBzdHJlYW1EYXRhID0gJyc7XG4gICAgICBsZXQgc2VuZENvbW1hbmRUaW1lb3V0SGFuZGxlciA9IG51bGw7XG4gICAgICB0aGlzLnNvY2tldENsaWVudC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIGlmIChzZW5kQ29tbWFuZFRpbWVvdXRIYW5kbGVyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGxvZy5kZWJ1ZygnUmVjZWl2ZWQgY29tbWFuZCByZXN1bHQgZnJvbSBib290c3RyYXAnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzdHJlYW1EYXRhID0gSlNPTi5wYXJzZShzdHJlYW1EYXRhICsgZGF0YSk7XG4gICAgICAgICAgLy8gd2Ugc3VjY2Vzc2Z1bGx5IHBhcnNlZCBKU09OIHNvIHdlJ3ZlIGdvdCBhbGwgdGhlIGRhdGEsXG4gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBzb2NrZXQgbGlzdGVuZXIgYW5kIGV2YWx1YXRlXG4gICAgICAgICAgdGhpcy5zb2NrZXRDbGllbnQucmVtb3ZlQWxsTGlzdGVuZXJzKCdkYXRhJyk7XG4gICAgICAgICAgaWYgKHN0cmVhbURhdGEuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShzdHJlYW1EYXRhLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVqZWN0KGVycm9yRnJvbUNvZGUoc3RyZWFtRGF0YS5zdGF0dXMsIHN0cmVhbURhdGEudmFsdWUpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKCFfLmlzU3RyaW5nKHN0cmVhbURhdGEpKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ0dvdCBhbiB1bmV4cGVjdGVkIGVycm9yIGluc2lkZSBzb2NrZXQgbGlzdGVuZXInKTtcbiAgICAgICAgICAgIGxvZy5lcnJvcihlcnIuc3RhY2spO1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvckZyb21Db2RlKDEzLCBlcnIubWVzc2FnZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsb2cuZGVidWcoYFN0cmVhbSBzdGlsbCBub3QgY29tcGxldGUsIHdhaXRpbmcgdXAgdG8gJHtTRU5EX0NPTU1BTkRfVElNRU9VVH1tcyBmb3IgdGhlIGRhdGEgdG8gYXJyaXZlYCk7XG4gICAgICAgICAgc3RyZWFtRGF0YSArPSBkYXRhO1xuICAgICAgICAgIHNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGBTZXJ2ZXIgc29ja2V0IHN0b3BwZWQgcmVzcG9uZGluZy4gVGhlIHJlY2VudCByZXNwb25zZSB3YXMgJyR7c3RyZWFtRGF0YX0nYDtcbiAgICAgICAgICAgIGxvZy5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXRDbGllbnQucmVtb3ZlQWxsTGlzdGVuZXJzKCdkYXRhJyk7XG4gICAgICAgICAgICByZWplY3QoZXJyb3JGcm9tQ29kZSgxMywgZXJyTXNnKSk7XG4gICAgICAgICAgfSwgU0VORF9DT01NQU5EX1RJTUVPVVQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRBY3Rpb24gKGFjdGlvbiwgcGFyYW1zID0ge30pIHtcbiAgICBsZXQgZXh0cmEgPSB7YWN0aW9uLCBwYXJhbXN9O1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKENPTU1BTkRfVFlQRVMuQUNUSU9OLCBleHRyYSk7XG4gIH1cblxuICBhc3luYyBzaHV0ZG93biAoKSB7XG4gICAgaWYgKCF0aGlzLnVpQXV0b21hdG9yKSB7XG4gICAgICBsb2cud2FybignQ2Fubm90IHNodXQgZG93biBBbmRyb2lkIGJvb3RzdHJhcDsgaXQgaGFzIGFscmVhZHkgc2h1dCBkb3duJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGxpc3RuZXJzIHNvIHdlIGRvbid0IHRyaWdnZXIgdW5leHBlY3RlZCBzaHV0ZG93blxuICAgIHRoaXMudWlBdXRvbWF0b3IucmVtb3ZlQWxsTGlzdGVuZXJzKFVpQXV0b21hdG9yLkVWRU5UX0NIQU5HRUQpO1xuICAgIGlmICh0aGlzLnNvY2tldENsaWVudCkge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChDT01NQU5EX1RZUEVTLlNIVVRET1dOKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy51aUF1dG9tYXRvci5zaHV0ZG93bigpO1xuICAgIHRoaXMudWlBdXRvbWF0b3IgPSBudWxsO1xuICB9XG5cbiAgLy8gdGhpcyBoZWxwZXIgZnVuY3Rpb24gbWFrZXMgdW5pdCB0ZXN0aW5nIGVhc2llci5cbiAgYXN5bmMgaW5pdCAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICAgIHRoaXMudWlBdXRvbWF0b3IgPSBuZXcgVWlBdXRvbWF0b3IodGhpcy5hZGIpO1xuXG4gICAgLy8gSGFuZGxlIHVuZXhwZWN0ZWQgVWlBdXRvbWF0b3Igc2h1dGRvd25cbiAgICB0aGlzLnVpQXV0b21hdG9yLm9uKFVpQXV0b21hdG9yLkVWRU5UX0NIQU5HRUQsIChtc2cpID0+IHtcbiAgICAgIGlmIChtc2cuc3RhdGUgPT09IFVpQXV0b21hdG9yLlNUQVRFX1NUT1BQRUQpIHtcbiAgICAgICAgdGhpcy51aUF1dG9tYXRvciA9IG51bGw7XG4gICAgICAgIHRoaXMub25VbmV4cGVjdGVkU2h1dGRvd24uY2FuY2VsKG5ldyBFcnJvcignVWlBVXRvbWF0b3Igc2h1dCBkb3duIHVuZXhwZWN0ZWRseScpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldCBpZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24gKGlnbm9yZSkge1xuICAgIGxvZy5kZWJ1ZyhgJHtpZ25vcmUgPyAnSWdub3JpbmcnIDogJ1dhdGNoaW5nIGZvcid9IGJvb3RzdHJhcCBkaXNjb25uZWN0YCk7XG4gICAgdGhpcy5faWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gaWdub3JlO1xuICB9XG5cbiAgZ2V0IGlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93bjtcbiAgfVxufVxuXG5leHBvcnQgeyBBbmRyb2lkQm9vdHN0cmFwLCBDT01NQU5EX1RZUEVTIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkQm9vdHN0cmFwO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLEdBQUcsR0FBR0MsZUFBQSxDQUFPQyxTQUFQLENBQWlCLGtCQUFqQixDQUFaOztBQUNBLE1BQU1DLGFBQWEsR0FBRztFQUNwQkMsTUFBTSxFQUFFLFFBRFk7RUFFcEJDLFFBQVEsRUFB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
|
|
207
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJDT01NQU5EX1RZUEVTIiwiQUNUSU9OIiwiU0hVVERPV04iLCJTRU5EX0NPTU1BTkRfVElNRU9VVCIsImdldE1vZHVsZVJvb3QiLCJfIiwibWVtb2l6ZSIsImN1cnJlbnREaXIiLCJwYXRoIiwiZGlybmFtZSIsInJlc29sdmUiLCJfX2ZpbGVuYW1lIiwiaXNBdEZzUm9vdCIsIm1hbmlmZXN0UGF0aCIsImpvaW4iLCJmcyIsImV4aXN0cyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlIiwibmFtZSIsImlnbiIsImxlbmd0aCIsIkVycm9yIiwiQW5kcm9pZEJvb3RzdHJhcCIsImNvbnN0cnVjdG9yIiwiYWRiIiwic3lzdGVtUG9ydCIsIndlYlNvY2tldCIsInVuZGVmaW5lZCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSIsInJlamVjdCIsIkIiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJjYW5jZWwiLCJzdGFydCIsImFwcFBhY2thZ2UiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwiYWNjZXB0U3NsQ2VydHMiLCJzdGFydERldGVjdG9yIiwicyIsInRlc3QiLCJib290c3RyYXBKYXIiLCJpbml0IiwiZm9yd2FyZFBvcnQiLCJwcm9jZXNzIiwidWlBdXRvbWF0b3IiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsImFsZXJ0UmUiLCJkZWJ1ZyIsInNvY2tldHMiLCJlbWl0IiwibWVzc2FnZSIsInN0ZG91dExpbmVzIiwic3BsaXQiLCJ1aWF1dG9Mb2ciLCJsaW5lIiwidHJpbSIsImlubmVyTGluZSIsImV4ZWMiLCJsb2dNZXRob2QiLCJpbmZvIiwiYmluZCIsInN0ZGVyckxpbmVzIiwic29ja2V0Q2xpZW50IiwibmV0IiwiY29ubmVjdCIsImVyciIsIm9uY2UiLCJlcnJvckFuZFRocm93Iiwic2VuZENvbW1hbmQiLCJ0eXBlIiwiZXh0cmEiLCJjbWQiLCJPYmplY3QiLCJhc3NpZ24iLCJjbWRKc29uIiwic3RyaW5naWZ5IiwidHJ1bmNhdGUiLCJ3cml0ZSIsInNldEVuY29kaW5nIiwic3RyZWFtRGF0YSIsInNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIiLCJkYXRhIiwiY2xlYXJUaW1lb3V0IiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RhdHVzIiwidmFsdWUiLCJlcnJvckZyb21Db2RlIiwiaXNTdHJpbmciLCJlcnJvciIsInN0YWNrIiwic2V0VGltZW91dCIsImVyck1zZyIsInNlbmRBY3Rpb24iLCJhY3Rpb24iLCJwYXJhbXMiLCJzaHV0ZG93biIsIndhcm4iLCJVaUF1dG9tYXRvciIsIkVWRU5UX0NIQU5HRUQiLCJtc2ciLCJzdGF0ZSIsIlNUQVRFX1NUT1BQRUQiLCJpZ25vcmUiLCJfaWdub3JlVW5leHBlY3RlZFNodXRkb3duIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVWlBdXRvbWF0b3IgZnJvbSAnLi91aWF1dG9tYXRvcic7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvckZyb21Db2RlIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBsb2dnZXIsIGZzIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuXG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0FuZHJvaWRCb290c3RyYXAnKTtcbmNvbnN0IENPTU1BTkRfVFlQRVMgPSB7XG4gIEFDVElPTjogJ2FjdGlvbicsXG4gIFNIVVRET1dOOiAnc2h1dGRvd24nXG59O1xuY29uc3QgU0VORF9DT01NQU5EX1RJTUVPVVQgPSAxICogNjAgKiAxMDAwO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHBhdGggdG8gdGhlIGN1cnJlbnQgbW9kdWxlJ3Mgcm9vdCBmb2xkZXJcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIG1vZHVsZSByb290XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGN1cnJlbnQgbW9kdWxlIHJvb3QgZm9sZGVyIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbmNvbnN0IGdldE1vZHVsZVJvb3QgPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0TW9kdWxlUm9vdCAoKSB7XG4gIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKHBhdGgucmVzb2x2ZShfX2ZpbGVuYW1lKSk7XG4gIGxldCBpc0F0RnNSb290ID0gZmFsc2U7XG4gIHdoaWxlICghaXNBdEZzUm9vdCkge1xuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhd2FpdCBmcy5leGlzdHMobWFuaWZlc3RQYXRoKSAmJlxuICAgICAgICAgIEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUobWFuaWZlc3RQYXRoLCAndXRmOCcpKS5uYW1lID09PSAnYXBwaXVtLWFuZHJvaWQtZHJpdmVyJykge1xuICAgICAgICByZXR1cm4gY3VycmVudERpcjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgY3VycmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKTtcbiAgICBpc0F0RnNSb290ID0gY3VycmVudERpci5sZW5ndGggPD0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpLmxlbmd0aDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIHRoZSByb290IGZvbGRlciBvZiB0aGUgYXBwaXVtLWFuZHJvaWQtZHJpdmVyIE5vZGUuanMgbW9kdWxlJyk7XG59KTtcblxuY2xhc3MgQW5kcm9pZEJvb3RzdHJhcCB7XG4gIGNvbnN0cnVjdG9yIChhZGIsIHN5c3RlbVBvcnQgPSA0NzI0LCB3ZWJTb2NrZXQgPSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmFkYiA9IGFkYjtcbiAgICB0aGlzLnN5c3RlbVBvcnQgPSBzeXN0ZW1Qb3J0O1xuICAgIHRoaXMud2ViU29ja2V0ID0gd2ViU29ja2V0O1xuICAgIHRoaXMuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gZmFsc2U7XG4gIH1cblxuICBnZXQgb25VbmV4cGVjdGVkU2h1dGRvd24gKCkge1xuICAgIGlmICghdGhpcy5fb25VbmV4cGVjdGVkU2h1dGRvd25Qcm9taXNlKSB7XG4gICAgICBsZXQgcmVqZWN0O1xuICAgICAgdGhpcy5fb25VbmV4cGVjdGVkU2h1dGRvd25Qcm9taXNlID0gbmV3IEIoZnVuY3Rpb24gX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSAoX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fb25VbmV4cGVjdGVkU2h1dGRvd25Qcm9taXNlLmNhbmNlbCA9IHJlamVjdDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0IChhcHBQYWNrYWdlLCBkaXNhYmxlQW5kcm9pZFdhdGNoZXJzID0gZmFsc2UsIGFjY2VwdFNzbENlcnRzID0gZmFsc2UpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnREZXRlY3RvciA9IChzKSA9PiAvQXBwaXVtIFNvY2tldCBTZXJ2ZXIgUmVhZHkvLnRlc3Qocyk7XG4gICAgICBjb25zdCBib290c3RyYXBKYXIgPSBwYXRoLnJlc29sdmUoYXdhaXQgZ2V0TW9kdWxlUm9vdCgpLCAnYm9vdHN0cmFwJywgJ2JpbicsICdBcHBpdW1Cb290c3RyYXAuamFyJyk7XG5cbiAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yd2FyZFBvcnQodGhpcy5zeXN0ZW1Qb3J0LCA0NzI0KTtcbiAgICAgIHRoaXMucHJvY2VzcyA9IGF3YWl0IHRoaXMudWlBdXRvbWF0b3Iuc3RhcnQoXG4gICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcEphciwgJ2lvLmFwcGl1bS5hbmRyb2lkLmJvb3RzdHJhcC5Cb290c3RyYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICBzdGFydERldGVjdG9yLCAnLWUnLCAncGtnJywgYXBwUGFja2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgJy1lJywgJ2Rpc2FibGVBbmRyb2lkV2F0Y2hlcnMnLCBkaXNhYmxlQW5kcm9pZFdhdGNoZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAnLWUnLCAnYWNjZXB0U3NsQ2VydHMnLCBhY2NlcHRTc2xDZXJ0cyk7XG5cbiAgICAgIC8vIHByb2Nlc3MgdGhlIG91dHB1dFxuICAgICAgdGhpcy5wcm9jZXNzLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgY29uc3QgYWxlcnRSZSA9IC9FbWl0dGluZyBzeXN0ZW0gYWxlcnQgbWVzc2FnZS87XG4gICAgICAgIGlmIChhbGVydFJlLnRlc3Qoc3Rkb3V0KSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZygnRW1pdHRpbmcgYWxlcnQgbWVzc2FnZS4uLicpO1xuICAgICAgICAgIGlmICh0aGlzLndlYlNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQuc29ja2V0cy5lbWl0KCdhbGVydCcsIHttZXNzYWdlOiBzdGRvdXR9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgYm9vdHN0cmFwIGxvZ2dlciB3cmFwcyBpdHMgb3duIGxvZyBsaW5lcyB3aXRoXG4gICAgICAgIC8vIFtBUFBJVU0tVUlBVVRPXSAuLi4gW0FQUElVTS1VSUFVVE9dXG4gICAgICAgIC8vIGFuZCBsZWF2ZXMgYWN0dWFsIFVpQXV0b21hdG9yIGxvZ3MgYXMgdGhleSBhcmVcbiAgICAgICAgbGV0IHN0ZG91dExpbmVzID0gKHN0ZG91dCB8fCAnJykuc3BsaXQoJ1xcbicpO1xuICAgICAgICBjb25zdCB1aWF1dG9Mb2cgPSAvXFxbQVBQSVVNLVVJQVVUT1xcXSguKylcXFtcXC9BUFBJVU0tVUlBVVRPXFxdLztcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiBzdGRvdXRMaW5lcykge1xuICAgICAgICAgIGlmIChsaW5lLnRyaW0oKSkge1xuICAgICAgICAgICAgaWYgKHVpYXV0b0xvZy50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgIGxldCBpbm5lckxpbmUgPSB1aWF1dG9Mb2cuZXhlYyhsaW5lKVsxXS50cmltKCk7XG4gICAgICAgICAgICAgIGxldCBsb2dNZXRob2QgPSBsb2cuaW5mby5iaW5kKGxvZyk7XG4gICAgICAgICAgICAgIC8vIGlmIHRoZSBib290c3RyYXAgbG9nIGNvbnNpZGVycyBzb21ldGhpbmcgZGVidWcsIGxvZyB0aGF0IGFzXG4gICAgICAgICAgICAgIC8vIGRlYnVnIGFuZCBub3QgaW5mb1xuICAgICAgICAgICAgICBpZiAoL1xcW2RlYnVnXFxdLy50ZXN0KGlubmVyTGluZSkpIHtcbiAgICAgICAgICAgICAgICBsb2dNZXRob2QgPSBsb2cuZGVidWcuYmluZChsb2cpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxvZ01ldGhvZChgW0JPT1RTVFJBUCBMT0ddICR7aW5uZXJMaW5lfWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9nLmRlYnVnKGBbVUlBVVRPIFNURE9VVF0gJHtsaW5lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdGRlcnJMaW5lcyA9IChzdGRlcnIgfHwgJycpLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiBzdGRlcnJMaW5lcykge1xuICAgICAgICAgIGlmIChsaW5lLnRyaW0oKSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKGBbVUlBVVRPIFNUREVSUl0gJHtsaW5lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIG9ubHkgcmV0dXJuIHdoZW4gdGhlIHNvY2tldCBjbGllbnQgaGFzIGNvbm5lY3RlZFxuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnNvY2tldENsaWVudCA9IG5ldC5jb25uZWN0KHRoaXMuc3lzdGVtUG9ydCk7XG4gICAgICAgICAgLy8gV2luZG93czogdGhlIHNvY2tldCBlcnJvcnMgb3V0IHdoZW4gQURCIHJlc3RhcnRzLiBMZXQncyBjYXRjaCBpdCB0byBhdm9pZCBjcmFzaGluZy5cbiAgICAgICAgICB0aGlzLnNvY2tldENsaWVudC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaWdub3JlVW5leHBlY3RlZFNodXRkb3duKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQW5kcm9pZCBib290c3RyYXAgc29ja2V0IGNyYXNoZWQ6ICR7ZXJyfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc29ja2V0Q2xpZW50Lm9uY2UoJ2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICAgICAgICBsb2cuaW5mbygnQW5kcm9pZCBib290c3RyYXAgc29ja2V0IGlzIG5vdyBjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmVycm9yQW5kVGhyb3coYEVycm9yIG9jY3VyZWQgd2hpbGUgc3RhcnRpbmcgQW5kcm9pZEJvb3RzdHJhcC4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNlbmRDb21tYW5kICh0eXBlLCBleHRyYSA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldENsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb2NrZXQgY29ubmVjdGlvbiBjbG9zZWQgdW5leHBlY3RlZGx5Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBjbWQgPSBPYmplY3QuYXNzaWduKHtjbWQ6IHR5cGV9LCBleHRyYSk7XG4gICAgICBsZXQgY21kSnNvbiA9IGAke0pTT04uc3RyaW5naWZ5KGNtZCl9IFxcbmA7XG4gICAgICBsb2cuZGVidWcoYFNlbmRpbmcgY29tbWFuZCB0byBhbmRyb2lkOiAke18udHJ1bmNhdGUoY21kSnNvbiwge2xlbmd0aDogMTAwMH0pLnRyaW0oKX1gKTtcbiAgICAgIHRoaXMuc29ja2V0Q2xpZW50LndyaXRlKGNtZEpzb24pO1xuICAgICAgdGhpcy5zb2NrZXRDbGllbnQuc2V0RW5jb2RpbmcoJ3V0ZjgnKTtcbiAgICAgIGxldCBzdHJlYW1EYXRhID0gJyc7XG4gICAgICBsZXQgc2VuZENvbW1hbmRUaW1lb3V0SGFuZGxlciA9IG51bGw7XG4gICAgICB0aGlzLnNvY2tldENsaWVudC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIGlmIChzZW5kQ29tbWFuZFRpbWVvdXRIYW5kbGVyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGxvZy5kZWJ1ZygnUmVjZWl2ZWQgY29tbWFuZCByZXN1bHQgZnJvbSBib290c3RyYXAnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzdHJlYW1EYXRhID0gSlNPTi5wYXJzZShzdHJlYW1EYXRhICsgZGF0YSk7XG4gICAgICAgICAgLy8gd2Ugc3VjY2Vzc2Z1bGx5IHBhcnNlZCBKU09OIHNvIHdlJ3ZlIGdvdCBhbGwgdGhlIGRhdGEsXG4gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBzb2NrZXQgbGlzdGVuZXIgYW5kIGV2YWx1YXRlXG4gICAgICAgICAgdGhpcy5zb2NrZXRDbGllbnQucmVtb3ZlQWxsTGlzdGVuZXJzKCdkYXRhJyk7XG4gICAgICAgICAgaWYgKHN0cmVhbURhdGEuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShzdHJlYW1EYXRhLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVqZWN0KGVycm9yRnJvbUNvZGUoc3RyZWFtRGF0YS5zdGF0dXMsIHN0cmVhbURhdGEudmFsdWUpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKCFfLmlzU3RyaW5nKHN0cmVhbURhdGEpKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ0dvdCBhbiB1bmV4cGVjdGVkIGVycm9yIGluc2lkZSBzb2NrZXQgbGlzdGVuZXInKTtcbiAgICAgICAgICAgIGxvZy5lcnJvcihlcnIuc3RhY2spO1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvckZyb21Db2RlKDEzLCBlcnIubWVzc2FnZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsb2cuZGVidWcoYFN0cmVhbSBzdGlsbCBub3QgY29tcGxldGUsIHdhaXRpbmcgdXAgdG8gJHtTRU5EX0NPTU1BTkRfVElNRU9VVH1tcyBmb3IgdGhlIGRhdGEgdG8gYXJyaXZlYCk7XG4gICAgICAgICAgc3RyZWFtRGF0YSArPSBkYXRhO1xuICAgICAgICAgIHNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGBTZXJ2ZXIgc29ja2V0IHN0b3BwZWQgcmVzcG9uZGluZy4gVGhlIHJlY2VudCByZXNwb25zZSB3YXMgJyR7c3RyZWFtRGF0YX0nYDtcbiAgICAgICAgICAgIGxvZy5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXRDbGllbnQucmVtb3ZlQWxsTGlzdGVuZXJzKCdkYXRhJyk7XG4gICAgICAgICAgICByZWplY3QoZXJyb3JGcm9tQ29kZSgxMywgZXJyTXNnKSk7XG4gICAgICAgICAgfSwgU0VORF9DT01NQU5EX1RJTUVPVVQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRBY3Rpb24gKGFjdGlvbiwgcGFyYW1zID0ge30pIHtcbiAgICBsZXQgZXh0cmEgPSB7YWN0aW9uLCBwYXJhbXN9O1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKENPTU1BTkRfVFlQRVMuQUNUSU9OLCBleHRyYSk7XG4gIH1cblxuICBhc3luYyBzaHV0ZG93biAoKSB7XG4gICAgaWYgKCF0aGlzLnVpQXV0b21hdG9yKSB7XG4gICAgICBsb2cud2FybignQ2Fubm90IHNodXQgZG93biBBbmRyb2lkIGJvb3RzdHJhcDsgaXQgaGFzIGFscmVhZHkgc2h1dCBkb3duJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGxpc3RuZXJzIHNvIHdlIGRvbid0IHRyaWdnZXIgdW5leHBlY3RlZCBzaHV0ZG93blxuICAgIHRoaXMudWlBdXRvbWF0b3IucmVtb3ZlQWxsTGlzdGVuZXJzKFVpQXV0b21hdG9yLkVWRU5UX0NIQU5HRUQpO1xuICAgIGlmICh0aGlzLnNvY2tldENsaWVudCkge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChDT01NQU5EX1RZUEVTLlNIVVRET1dOKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy51aUF1dG9tYXRvci5zaHV0ZG93bigpO1xuICAgIHRoaXMudWlBdXRvbWF0b3IgPSBudWxsO1xuICB9XG5cbiAgLy8gdGhpcyBoZWxwZXIgZnVuY3Rpb24gbWFrZXMgdW5pdCB0ZXN0aW5nIGVhc2llci5cbiAgYXN5bmMgaW5pdCAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICAgIHRoaXMudWlBdXRvbWF0b3IgPSBuZXcgVWlBdXRvbWF0b3IodGhpcy5hZGIpO1xuXG4gICAgLy8gSGFuZGxlIHVuZXhwZWN0ZWQgVWlBdXRvbWF0b3Igc2h1dGRvd25cbiAgICB0aGlzLnVpQXV0b21hdG9yLm9uKFVpQXV0b21hdG9yLkVWRU5UX0NIQU5HRUQsIChtc2cpID0+IHtcbiAgICAgIGlmIChtc2cuc3RhdGUgPT09IFVpQXV0b21hdG9yLlNUQVRFX1NUT1BQRUQpIHtcbiAgICAgICAgdGhpcy51aUF1dG9tYXRvciA9IG51bGw7XG4gICAgICAgIHRoaXMub25VbmV4cGVjdGVkU2h1dGRvd24uY2FuY2VsKG5ldyBFcnJvcignVWlBVXRvbWF0b3Igc2h1dCBkb3duIHVuZXhwZWN0ZWRseScpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldCBpZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24gKGlnbm9yZSkge1xuICAgIGxvZy5kZWJ1ZyhgJHtpZ25vcmUgPyAnSWdub3JpbmcnIDogJ1dhdGNoaW5nIGZvcid9IGJvb3RzdHJhcCBkaXNjb25uZWN0YCk7XG4gICAgdGhpcy5faWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gaWdub3JlO1xuICB9XG5cbiAgZ2V0IGlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93bjtcbiAgfVxufVxuXG5leHBvcnQgeyBBbmRyb2lkQm9vdHN0cmFwLCBDT01NQU5EX1RZUEVTIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkQm9vdHN0cmFwO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0EsTUFBTUEsR0FBRyxHQUFHQyxlQUFNLENBQUNDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQztBQUNoRCxNQUFNQyxhQUFhLEdBQUc7RUFDcEJDLE1BQU0sRUFBRSxRQUFRO0VBQ2hCQyxRQUFRLEVBQUU7QUFDWixDQUFD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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","names":["log","logger","getLogger","COMMAND_TYPES","ACTION","SHUTDOWN","SEND_COMMAND_TIMEOUT","getModuleRoot","_","memoize","currentDir","path","dirname","resolve","__filename","isAtFsRoot","manifestPath","join","fs","exists","JSON","parse","readFile","name","ign","length","Error","AndroidBootstrap","constructor","adb","systemPort","webSocket","undefined","ignoreUnexpectedShutdown","onUnexpectedShutdown","_onUnexpectedShutdownPromise","reject","B","_resolve","_reject","cancel","start","appPackage","disableAndroidWatchers","acceptSslCerts","startDetector","s","test","bootstrapJar","init","forwardPort","process","uiAutomator","on","stdout","stderr","alertRe","debug","sockets","emit","message","stdoutLines","split","uiautoLog","line","trim","innerLine","exec","logMethod","info","bind","stderrLines","socketClient","net","connect","err","once","errorAndThrow","sendCommand","type","extra","cmd","Object","assign","cmdJson","stringify","truncate","write","setEncoding","streamData","sendCommandTimeoutHandler","data","clearTimeout","removeAllListeners","status","value","errorFromCode","isString","error","stack","setTimeout","errMsg","sendAction","action","params","shutdown","warn","UiAutomator","EVENT_CHANGED","msg","state","STATE_STOPPED","ignore","_ignoreUnexpectedShutdown"],"sources":["../../lib/bootstrap.js"],"sourcesContent":["import UiAutomator from './uiautomator';\nimport net from 'net';\nimport path from 'path';\nimport _ from 'lodash';\nimport { errorFromCode } from 'appium/driver';\nimport B from 'bluebird';\nimport { logger, fs } from 'appium/support';\n\n\nconst log = logger.getLogger('AndroidBootstrap');\nconst COMMAND_TYPES = {\n ACTION: 'action',\n SHUTDOWN: 'shutdown'\n};\nconst SEND_COMMAND_TIMEOUT = 1 * 60 * 1000;\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(async function getModuleRoot () {\n let currentDir = path.dirname(path.resolve(__filename));\n let isAtFsRoot = false;\n while (!isAtFsRoot) {\n const manifestPath = path.join(currentDir, 'package.json');\n try {\n if (await fs.exists(manifestPath) &&\n JSON.parse(await fs.readFile(manifestPath, 'utf8')).name === 'appium-android-driver') {\n return currentDir;\n }\n } catch (ign) {}\n currentDir = path.dirname(currentDir);\n isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;\n }\n throw new Error('Cannot find the root folder of the appium-android-driver Node.js module');\n});\n\nclass AndroidBootstrap {\n constructor (adb, systemPort = 4724, webSocket = undefined) {\n this.adb = adb;\n this.systemPort = systemPort;\n this.webSocket = webSocket;\n this.ignoreUnexpectedShutdown = false;\n }\n\n get onUnexpectedShutdown () {\n if (!this._onUnexpectedShutdownPromise) {\n let reject;\n this._onUnexpectedShutdownPromise = new B(function _onUnexpectedShutdownPromise (_resolve, _reject) {\n reject = _reject;\n });\n this._onUnexpectedShutdownPromise.cancel = reject;\n }\n return this._onUnexpectedShutdownPromise;\n }\n\n async start (appPackage, disableAndroidWatchers = false, acceptSslCerts = false) {\n try {\n const startDetector = (s) => /Appium Socket Server Ready/.test(s);\n const bootstrapJar = path.resolve(await getModuleRoot(), 'bootstrap', 'bin', 'AppiumBootstrap.jar');\n\n await this.init();\n await this.adb.forwardPort(this.systemPort, 4724);\n this.process = await this.uiAutomator.start(\n bootstrapJar, 'io.appium.android.bootstrap.Bootstrap',\n startDetector, '-e', 'pkg', appPackage,\n '-e', 'disableAndroidWatchers', disableAndroidWatchers,\n '-e', 'acceptSslCerts', acceptSslCerts);\n\n // process the output\n this.process.on('output', (stdout, stderr) => {\n const alertRe = /Emitting system alert message/;\n if (alertRe.test(stdout)) {\n log.debug('Emitting alert message...');\n if (this.webSocket) {\n this.webSocket.sockets.emit('alert', {message: stdout});\n }\n }\n\n // the bootstrap logger wraps its own log lines with\n // [APPIUM-UIAUTO] ... [APPIUM-UIAUTO]\n // and leaves actual UiAutomator logs as they are\n let stdoutLines = (stdout || '').split('\\n');\n const uiautoLog = /\\[APPIUM-UIAUTO\\](.+)\\[\\/APPIUM-UIAUTO\\]/;\n for (let line of stdoutLines) {\n if (line.trim()) {\n if (uiautoLog.test(line)) {\n let innerLine = uiautoLog.exec(line)[1].trim();\n let logMethod = log.info.bind(log);\n // if the bootstrap log considers something debug, log that as\n // debug and not info\n if (/\\[debug\\]/.test(innerLine)) {\n logMethod = log.debug.bind(log);\n }\n logMethod(`[BOOTSTRAP LOG] ${innerLine}`);\n } else {\n log.debug(`[UIAUTO STDOUT] ${line}`);\n }\n }\n }\n\n let stderrLines = (stderr || '').split('\\n');\n for (let line of stderrLines) {\n if (line.trim()) {\n log.debug(`[UIAUTO STDERR] ${line}`);\n }\n }\n });\n\n // only return when the socket client has connected\n return await new B((resolve, reject) => {\n try {\n this.socketClient = net.connect(this.systemPort);\n // Windows: the socket errors out when ADB restarts. Let's catch it to avoid crashing.\n this.socketClient.on('error', (err) => {\n if (!this.ignoreUnexpectedShutdown) {\n throw new Error(`Android bootstrap socket crashed: ${err}`);\n }\n });\n this.socketClient.once('connect', () => {\n log.info('Android bootstrap socket is now connected');\n resolve();\n });\n } catch (err) {\n reject(err);\n }\n });\n } catch (err) {\n log.errorAndThrow(`Error occured while starting AndroidBootstrap. Original error: ${err}`);\n }\n }\n\n async sendCommand (type, extra = {}) {\n if (!this.socketClient) {\n throw new Error('Socket connection closed unexpectedly');\n }\n\n return await new B((resolve, reject) => {\n let cmd = Object.assign({cmd: type}, extra);\n let cmdJson = `${JSON.stringify(cmd)} \\n`;\n log.debug(`Sending command to android: ${_.truncate(cmdJson, {length: 1000}).trim()}`);\n this.socketClient.write(cmdJson);\n this.socketClient.setEncoding('utf8');\n let streamData = '';\n let sendCommandTimeoutHandler = null;\n this.socketClient.on('data', (data) => {\n if (sendCommandTimeoutHandler) {\n clearTimeout(sendCommandTimeoutHandler);\n }\n log.debug('Received command result from bootstrap');\n try {\n streamData = JSON.parse(streamData + data);\n // we successfully parsed JSON so we've got all the data,\n // remove the socket listener and evaluate\n this.socketClient.removeAllListeners('data');\n if (streamData.status === 0) {\n return resolve(streamData.value);\n }\n reject(errorFromCode(streamData.status, streamData.value));\n } catch (err) {\n if (!_.isString(streamData)) {\n log.error('Got an unexpected error inside socket listener');\n log.error(err.stack);\n return reject(errorFromCode(13, err.message));\n }\n log.debug(`Stream still not complete, waiting up to ${SEND_COMMAND_TIMEOUT}ms for the data to arrive`);\n streamData += data;\n sendCommandTimeoutHandler = setTimeout(() => {\n const errMsg = `Server socket stopped responding. The recent response was '${streamData}'`;\n log.error(errMsg);\n this.socketClient.removeAllListeners('data');\n reject(errorFromCode(13, errMsg));\n }, SEND_COMMAND_TIMEOUT);\n }\n });\n });\n }\n\n async sendAction (action, params = {}) {\n let extra = {action, params};\n return await this.sendCommand(COMMAND_TYPES.ACTION, extra);\n }\n\n async shutdown () {\n if (!this.uiAutomator) {\n log.warn('Cannot shut down Android bootstrap; it has already shut down');\n return;\n }\n\n // remove listners so we don't trigger unexpected shutdown\n this.uiAutomator.removeAllListeners(UiAutomator.EVENT_CHANGED);\n if (this.socketClient) {\n await this.sendCommand(COMMAND_TYPES.SHUTDOWN);\n }\n await this.uiAutomator.shutdown();\n this.uiAutomator = null;\n }\n\n // this helper function makes unit testing easier.\n async init () { // eslint-disable-line require-await\n this.uiAutomator = new UiAutomator(this.adb);\n\n // Handle unexpected UiAutomator shutdown\n this.uiAutomator.on(UiAutomator.EVENT_CHANGED, (msg) => {\n if (msg.state === UiAutomator.STATE_STOPPED) {\n this.uiAutomator = null;\n this.onUnexpectedShutdown.cancel(new Error('UiAUtomator shut down unexpectedly'));\n }\n });\n }\n\n set ignoreUnexpectedShutdown (ignore) {\n log.debug(`${ignore ? 'Ignoring' : 'Watching for'} bootstrap disconnect`);\n this._ignoreUnexpectedShutdown = ignore;\n }\n\n get ignoreUnexpectedShutdown () {\n return this._ignoreUnexpectedShutdown;\n }\n}\n\nexport { AndroidBootstrap, COMMAND_TYPES };\nexport default AndroidBootstrap;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bootstrap.js","names":["log","logger","getLogger","COMMAND_TYPES","ACTION","SHUTDOWN","SEND_COMMAND_TIMEOUT","getModuleRoot","_","memoize","currentDir","path","dirname","resolve","__filename","isAtFsRoot","manifestPath","join","fs","exists","JSON","parse","readFile","name","ign","length","Error","AndroidBootstrap","constructor","adb","systemPort","webSocket","undefined","ignoreUnexpectedShutdown","onUnexpectedShutdown","_onUnexpectedShutdownPromise","reject","B","_resolve","_reject","cancel","start","appPackage","disableAndroidWatchers","acceptSslCerts","startDetector","s","test","bootstrapJar","init","forwardPort","process","uiAutomator","on","stdout","stderr","alertRe","debug","sockets","emit","message","stdoutLines","split","uiautoLog","line","trim","innerLine","exec","logMethod","info","bind","stderrLines","socketClient","net","connect","err","once","errorAndThrow","sendCommand","type","extra","cmd","Object","assign","cmdJson","stringify","truncate","write","setEncoding","streamData","sendCommandTimeoutHandler","data","clearTimeout","removeAllListeners","status","value","errorFromCode","isString","error","stack","setTimeout","errMsg","sendAction","action","params","shutdown","warn","UiAutomator","EVENT_CHANGED","msg","state","STATE_STOPPED","ignore","_ignoreUnexpectedShutdown"],"sources":["../../lib/bootstrap.js"],"sourcesContent":["import UiAutomator from './uiautomator';\nimport net from 'net';\nimport path from 'path';\nimport _ from 'lodash';\nimport { errorFromCode } from 'appium/driver';\nimport B from 'bluebird';\nimport { logger, fs } from 'appium/support';\n\n\nconst log = logger.getLogger('AndroidBootstrap');\nconst COMMAND_TYPES = {\n ACTION: 'action',\n SHUTDOWN: 'shutdown'\n};\nconst SEND_COMMAND_TIMEOUT = 1 * 60 * 1000;\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(async function getModuleRoot () {\n let currentDir = path.dirname(path.resolve(__filename));\n let isAtFsRoot = false;\n while (!isAtFsRoot) {\n const manifestPath = path.join(currentDir, 'package.json');\n try {\n if (await fs.exists(manifestPath) &&\n JSON.parse(await fs.readFile(manifestPath, 'utf8')).name === 'appium-android-driver') {\n return currentDir;\n }\n } catch (ign) {}\n currentDir = path.dirname(currentDir);\n isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;\n }\n throw new Error('Cannot find the root folder of the appium-android-driver Node.js module');\n});\n\nclass AndroidBootstrap {\n constructor (adb, systemPort = 4724, webSocket = undefined) {\n this.adb = adb;\n this.systemPort = systemPort;\n this.webSocket = webSocket;\n this.ignoreUnexpectedShutdown = false;\n }\n\n get onUnexpectedShutdown () {\n if (!this._onUnexpectedShutdownPromise) {\n let reject;\n this._onUnexpectedShutdownPromise = new B(function _onUnexpectedShutdownPromise (_resolve, _reject) {\n reject = _reject;\n });\n this._onUnexpectedShutdownPromise.cancel = reject;\n }\n return this._onUnexpectedShutdownPromise;\n }\n\n async start (appPackage, disableAndroidWatchers = false, acceptSslCerts = false) {\n try {\n const startDetector = (s) => /Appium Socket Server Ready/.test(s);\n const bootstrapJar = path.resolve(await getModuleRoot(), 'bootstrap', 'bin', 'AppiumBootstrap.jar');\n\n await this.init();\n await this.adb.forwardPort(this.systemPort, 4724);\n this.process = await this.uiAutomator.start(\n bootstrapJar, 'io.appium.android.bootstrap.Bootstrap',\n startDetector, '-e', 'pkg', appPackage,\n '-e', 'disableAndroidWatchers', disableAndroidWatchers,\n '-e', 'acceptSslCerts', acceptSslCerts);\n\n // process the output\n this.process.on('output', (stdout, stderr) => {\n const alertRe = /Emitting system alert message/;\n if (alertRe.test(stdout)) {\n log.debug('Emitting alert message...');\n if (this.webSocket) {\n this.webSocket.sockets.emit('alert', {message: stdout});\n }\n }\n\n // the bootstrap logger wraps its own log lines with\n // [APPIUM-UIAUTO] ... [APPIUM-UIAUTO]\n // and leaves actual UiAutomator logs as they are\n let stdoutLines = (stdout || '').split('\\n');\n const uiautoLog = /\\[APPIUM-UIAUTO\\](.+)\\[\\/APPIUM-UIAUTO\\]/;\n for (let line of stdoutLines) {\n if (line.trim()) {\n if (uiautoLog.test(line)) {\n let innerLine = uiautoLog.exec(line)[1].trim();\n let logMethod = log.info.bind(log);\n // if the bootstrap log considers something debug, log that as\n // debug and not info\n if (/\\[debug\\]/.test(innerLine)) {\n logMethod = log.debug.bind(log);\n }\n logMethod(`[BOOTSTRAP LOG] ${innerLine}`);\n } else {\n log.debug(`[UIAUTO STDOUT] ${line}`);\n }\n }\n }\n\n let stderrLines = (stderr || '').split('\\n');\n for (let line of stderrLines) {\n if (line.trim()) {\n log.debug(`[UIAUTO STDERR] ${line}`);\n }\n }\n });\n\n // only return when the socket client has connected\n return await new B((resolve, reject) => {\n try {\n this.socketClient = net.connect(this.systemPort);\n // Windows: the socket errors out when ADB restarts. Let's catch it to avoid crashing.\n this.socketClient.on('error', (err) => {\n if (!this.ignoreUnexpectedShutdown) {\n throw new Error(`Android bootstrap socket crashed: ${err}`);\n }\n });\n this.socketClient.once('connect', () => {\n log.info('Android bootstrap socket is now connected');\n resolve();\n });\n } catch (err) {\n reject(err);\n }\n });\n } catch (err) {\n log.errorAndThrow(`Error occured while starting AndroidBootstrap. Original error: ${err}`);\n }\n }\n\n async sendCommand (type, extra = {}) {\n if (!this.socketClient) {\n throw new Error('Socket connection closed unexpectedly');\n }\n\n return await new B((resolve, reject) => {\n let cmd = Object.assign({cmd: type}, extra);\n let cmdJson = `${JSON.stringify(cmd)} \\n`;\n log.debug(`Sending command to android: ${_.truncate(cmdJson, {length: 1000}).trim()}`);\n this.socketClient.write(cmdJson);\n this.socketClient.setEncoding('utf8');\n let streamData = '';\n let sendCommandTimeoutHandler = null;\n this.socketClient.on('data', (data) => {\n if (sendCommandTimeoutHandler) {\n clearTimeout(sendCommandTimeoutHandler);\n }\n log.debug('Received command result from bootstrap');\n try {\n streamData = JSON.parse(streamData + data);\n // we successfully parsed JSON so we've got all the data,\n // remove the socket listener and evaluate\n this.socketClient.removeAllListeners('data');\n if (streamData.status === 0) {\n return resolve(streamData.value);\n }\n reject(errorFromCode(streamData.status, streamData.value));\n } catch (err) {\n if (!_.isString(streamData)) {\n log.error('Got an unexpected error inside socket listener');\n log.error(err.stack);\n return reject(errorFromCode(13, err.message));\n }\n log.debug(`Stream still not complete, waiting up to ${SEND_COMMAND_TIMEOUT}ms for the data to arrive`);\n streamData += data;\n sendCommandTimeoutHandler = setTimeout(() => {\n const errMsg = `Server socket stopped responding. The recent response was '${streamData}'`;\n log.error(errMsg);\n this.socketClient.removeAllListeners('data');\n reject(errorFromCode(13, errMsg));\n }, SEND_COMMAND_TIMEOUT);\n }\n });\n });\n }\n\n async sendAction (action, params = {}) {\n let extra = {action, params};\n return await this.sendCommand(COMMAND_TYPES.ACTION, extra);\n }\n\n async shutdown () {\n if (!this.uiAutomator) {\n log.warn('Cannot shut down Android bootstrap; it has already shut down');\n return;\n }\n\n // remove listners so we don't trigger unexpected shutdown\n this.uiAutomator.removeAllListeners(UiAutomator.EVENT_CHANGED);\n if (this.socketClient) {\n await this.sendCommand(COMMAND_TYPES.SHUTDOWN);\n }\n await this.uiAutomator.shutdown();\n this.uiAutomator = null;\n }\n\n // this helper function makes unit testing easier.\n async init () { // eslint-disable-line require-await\n this.uiAutomator = new UiAutomator(this.adb);\n\n // Handle unexpected UiAutomator shutdown\n this.uiAutomator.on(UiAutomator.EVENT_CHANGED, (msg) => {\n if (msg.state === UiAutomator.STATE_STOPPED) {\n this.uiAutomator = null;\n this.onUnexpectedShutdown.cancel(new Error('UiAUtomator shut down unexpectedly'));\n }\n });\n }\n\n set ignoreUnexpectedShutdown (ignore) {\n log.debug(`${ignore ? 'Ignoring' : 'Watching for'} bootstrap disconnect`);\n this._ignoreUnexpectedShutdown = ignore;\n }\n\n get ignoreUnexpectedShutdown () {\n return this._ignoreUnexpectedShutdown;\n }\n}\n\nexport { AndroidBootstrap, COMMAND_TYPES };\nexport default AndroidBootstrap;\n"],"mappings":"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"}
|