appium-android-driver 5.3.0 → 5.4.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/lib/commands/app-management.js +9 -17
- package/build/lib/commands/execute.js +4 -1
- package/build/lib/commands/file-actions.js +35 -8
- package/build/lib/utils.js +25 -0
- package/lib/commands/app-management.js +1 -16
- package/lib/commands/execute.js +3 -0
- package/lib/commands/file-actions.js +68 -6
- package/lib/utils.js +19 -0
- package/package.json +1 -1
|
@@ -19,21 +19,13 @@ var _androidHelpers = require("../android-helpers");
|
|
|
19
19
|
|
|
20
20
|
var _driver = require("appium/driver");
|
|
21
21
|
|
|
22
|
+
var _utils = require("../utils");
|
|
23
|
+
|
|
22
24
|
const APP_EXTENSIONS = ['.apk', '.apks'];
|
|
23
25
|
const RESOLVER_ACTIVITY_NAME = 'android/com.android.internal.app.ResolverActivity';
|
|
24
26
|
const commands = {};
|
|
25
27
|
exports.commands = commands;
|
|
26
28
|
|
|
27
|
-
function requireArgs(argNames, opts = {}) {
|
|
28
|
-
for (const argName of _lodash.default.isArray(argNames) ? argNames : [argNames]) {
|
|
29
|
-
if (!_lodash.default.has(opts, argName)) {
|
|
30
|
-
throw new _driver.errors.InvalidArgumentError(`'${argName}' argument must be provided`);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return opts;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
29
|
commands.isAppInstalled = async function isAppInstalled(appId) {
|
|
38
30
|
return await this.adb.isAppInstalled(appId);
|
|
39
31
|
};
|
|
@@ -41,7 +33,7 @@ commands.isAppInstalled = async function isAppInstalled(appId) {
|
|
|
41
33
|
commands.mobileIsAppInstalled = async function mobileIsAppInstalled(opts = {}) {
|
|
42
34
|
const {
|
|
43
35
|
appId
|
|
44
|
-
} = requireArgs('appId', opts);
|
|
36
|
+
} = (0, _utils.requireArgs)('appId', opts);
|
|
45
37
|
return await this.isAppInstalled(appId);
|
|
46
38
|
};
|
|
47
39
|
|
|
@@ -70,7 +62,7 @@ commands.queryAppState = async function queryAppState(appId) {
|
|
|
70
62
|
commands.mobileQueryAppState = async function mobileQueryAppState(opts = {}) {
|
|
71
63
|
const {
|
|
72
64
|
appId
|
|
73
|
-
} = requireArgs('appId', opts);
|
|
65
|
+
} = (0, _utils.requireArgs)('appId', opts);
|
|
74
66
|
return await this.queryAppState(appId);
|
|
75
67
|
};
|
|
76
68
|
|
|
@@ -116,7 +108,7 @@ commands.activateApp = async function activateApp(appId) {
|
|
|
116
108
|
commands.mobileActivateApp = async function mobileActivateApp(opts = {}) {
|
|
117
109
|
const {
|
|
118
110
|
appId
|
|
119
|
-
} = requireArgs('appId', opts);
|
|
111
|
+
} = (0, _utils.requireArgs)('appId', opts);
|
|
120
112
|
return await this.activateApp(appId);
|
|
121
113
|
};
|
|
122
114
|
|
|
@@ -127,7 +119,7 @@ commands.removeApp = async function removeApp(appId, options = {}) {
|
|
|
127
119
|
commands.mobileRemoveApp = async function mobileRemoveApp(opts = {}) {
|
|
128
120
|
const {
|
|
129
121
|
appId
|
|
130
|
-
} = requireArgs('appId', opts);
|
|
122
|
+
} = (0, _utils.requireArgs)('appId', opts);
|
|
131
123
|
return await this.removeApp(appId, opts);
|
|
132
124
|
};
|
|
133
125
|
|
|
@@ -158,7 +150,7 @@ commands.terminateApp = async function terminateApp(appId, options = {}) {
|
|
|
158
150
|
commands.mobileTerminateApp = async function mobileTerminateApp(opts = {}) {
|
|
159
151
|
const {
|
|
160
152
|
appId
|
|
161
|
-
} = requireArgs('appId', opts);
|
|
153
|
+
} = (0, _utils.requireArgs)('appId', opts);
|
|
162
154
|
return await this.terminateApp(appId, opts);
|
|
163
155
|
};
|
|
164
156
|
|
|
@@ -170,7 +162,7 @@ commands.installApp = async function installApp(appPath, options = {}) {
|
|
|
170
162
|
commands.mobileInstallApp = async function mobileInstallApp(opts = {}) {
|
|
171
163
|
const {
|
|
172
164
|
appPath
|
|
173
|
-
} = requireArgs('appPath', opts);
|
|
165
|
+
} = (0, _utils.requireArgs)('appPath', opts);
|
|
174
166
|
return await this.installApp(appPath, opts);
|
|
175
167
|
};
|
|
176
168
|
|
|
@@ -188,4 +180,4 @@ commands.mobileClearApp = async function mobileClearApp(opts = {}) {
|
|
|
188
180
|
|
|
189
181
|
var _default = commands;
|
|
190
182
|
exports.default = _default;
|
|
191
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUFBfRVhURU5TSU9OUyIsIlJFU09MVkVSX0FDVElWSVRZX05BTUUiLCJjb21tYW5kcyIsInJlcXVpcmVBcmdzIiwiYXJnTmFtZXMiLCJvcHRzIiwiYXJnTmFtZSIsIl8iLCJpc0FycmF5IiwiaGFzIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJpc0FwcEluc3RhbGxlZCIsImFwcElkIiwiYWRiIiwibW9iaWxlSXNBcHBJbnN0YWxsZWQiLCJxdWVyeUFwcFN0YXRlIiwibG9nIiwiaW5mbyIsIkFQUF9TVEFURSIsIk5PVF9JTlNUQUxMRUQiLCJwcm9jZXNzRXhpc3RzIiwiTk9UX1JVTk5JTkciLCJhcHBJZFJlIiwiUmVnRXhwIiwiZXNjYXBlUmVnRXhwIiwibGluZSIsImR1bXBXaW5kb3dzIiwic3BsaXQiLCJ0ZXN0Iiwic29tZSIsIngiLCJpbmNsdWRlcyIsIlJVTk5JTkdfSU5fRk9SRUdST1VORCIsIlJVTk5JTkdfSU5fQkFDS0dST1VORCIsIm1vYmlsZVF1ZXJ5QXBwU3RhdGUiLCJhY3RpdmF0ZUFwcCIsImRlYnVnIiwiYXBpTGV2ZWwiLCJnZXRBcGlMZXZlbCIsImNtZCIsIm91dHB1dCIsInNoZWxsIiwiZSIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwiYWN0aXZpdHlOYW1lIiwicmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eSIsInByZWZlckNtZCIsInN0ZG91dCIsIkVycm9yIiwibW9iaWxlQWN0aXZhdGVBcHAiLCJyZW1vdmVBcHAiLCJvcHRpb25zIiwidW5pbnN0YWxsQXBrIiwibW9iaWxlUmVtb3ZlQXBwIiwidGVybWluYXRlQXBwIiwiZm9yY2VTdG9wIiwidGltZW91dCIsInV0aWwiLCJoYXNWYWx1ZSIsImlzTmFOIiwicGFyc2VJbnQiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsIm1vYmlsZVRlcm1pbmF0ZUFwcCIsImluc3RhbGxBcHAiLCJhcHBQYXRoIiwibG9jYWxQYXRoIiwiaGVscGVycyIsImNvbmZpZ3VyZUFwcCIsImluc3RhbGwiLCJtb2JpbGVJbnN0YWxsQXBwIiwibW9iaWxlQ2xlYXJBcHAiLCJjbGVhciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9hcHAtbWFuYWdlbWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBBUFBfU1RBVEUgfSBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IEFQUF9FWFRFTlNJT05TID0gWycuYXBrJywgJy5hcGtzJ107XG5jb25zdCBSRVNPTFZFUl9BQ1RJVklUWV9OQU1FID0gJ2FuZHJvaWQvY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLlJlc29sdmVyQWN0aXZpdHknO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG4vKipcbiAqIEFzc2VydCB0aGUgcHJlc2VuY2Ugb2YgcGFydGljdWxhciBrZXlzIGluIHRoZSBnaXZlbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSBhcmdOYW1lcyBvbmUgb3IgbW9yZSBrZXkgbmFtZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIHRoZSBvYmplY3QgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtPYmplY3R9IHRoZSBzYW1lIGdpdmVuIG9iamVjdFxuICovXG5mdW5jdGlvbiByZXF1aXJlQXJncyAoYXJnTmFtZXMsIG9wdHMgPSB7fSkge1xuICBmb3IgKGNvbnN0IGFyZ05hbWUgb2YgKF8uaXNBcnJheShhcmdOYW1lcykgPyBhcmdOYW1lcyA6IFthcmdOYW1lc10pKSB7XG4gICAgaWYgKCFfLmhhcyhvcHRzLCBhcmdOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJyR7YXJnTmFtZX0nIGFyZ3VtZW50IG11c3QgYmUgcHJvdmlkZWRgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9wdHM7XG59XG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgYW4gYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkIG9yIG5vdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGFwcCBpcyBpbnN0YWxsZWRcbiAqL1xuY29tbWFuZHMuaXNBcHBJbnN0YWxsZWQgPSBhc3luYyBmdW5jdGlvbiBpc0FwcEluc3RhbGxlZCAoYXBwSWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKGFwcElkKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTW9iaWxlQXBwSW5zdGFsbGVkT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyLiBNdXN0IGJlIGFsd2F5cyBwcm92aWRlZC5cbiAqL1xuXG4vKipcbiAqIFZlcmlmeSB3aGV0aGVyIGFuIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZCBvciBub3RcbiAqXG4gKiBAcGFyYW0ge01vYmlsZUFwcEluc3RhbGxlZE9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtib29sZWFufSBTYW1lIGFzIGluIGBpc0FwcEluc3RhbGxlZGBcbiAqL1xuY29tbWFuZHMubW9iaWxlSXNBcHBJbnN0YWxsZWQgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVJc0FwcEluc3RhbGxlZCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgYXBwSWQgfSA9IHJlcXVpcmVBcmdzKCdhcHBJZCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5pc0FwcEluc3RhbGxlZChhcHBJZCk7XG59O1xuXG4vKipcbiAqIFF1ZXJpZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBjb3JyZXNwb25kaW5nIGNvbnN0YW50LCB3aGljaCBkZXNjcmliZXNcbiAqICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIHN0YXRlOlxuICogMCAtIGlzIHRoZSBhcHAgaXMgbm90IGluc3RhbGxlZFxuICogMSAtIGlmIHRoZSBhcHAgaXMgaW5zdGFsbGVkLCBidXQgaXMgbm90IHJ1bm5pbmdcbiAqIDMgLSBpZiB0aGUgYXBwIGlzIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmRcbiAqIDQgLSBpZiB0aGUgYXBwIGlzIHJ1bm5pbmcgaW4gdGhlIGZvcmVncm91bmRcbiAqL1xuY29tbWFuZHMucXVlcnlBcHBTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5QXBwU3RhdGUgKGFwcElkKSB7XG4gIHRoaXMubG9nLmluZm8oYFF1ZXJ5aW5nIHRoZSBzdGF0ZSBvZiAnJHthcHBJZH0nYCk7XG4gIGlmICghYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQoYXBwSWQpKSB7XG4gICAgcmV0dXJuIEFQUF9TVEFURS5OT1RfSU5TVEFMTEVEO1xuICB9XG4gIGlmICghYXdhaXQgdGhpcy5hZGIucHJvY2Vzc0V4aXN0cyhhcHBJZCkpIHtcbiAgICByZXR1cm4gQVBQX1NUQVRFLk5PVF9SVU5OSU5HO1xuICB9XG4gIGNvbnN0IGFwcElkUmUgPSBuZXcgUmVnRXhwKGBcXFxcYiR7Xy5lc2NhcGVSZWdFeHAoYXBwSWQpfS9gKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIChhd2FpdCB0aGlzLmFkYi5kdW1wV2luZG93cygpKS5zcGxpdCgnXFxuJykpIHtcbiAgICBpZiAoYXBwSWRSZS50ZXN0KGxpbmUpICYmIFsnbUN1cnJlbnRGb2N1cycsICdtRm9jdXNlZEFwcCddLnNvbWUoKHgpID0+IGxpbmUuaW5jbHVkZXMoeCkpKSB7XG4gICAgICByZXR1cm4gQVBQX1NUQVRFLlJVTk5JTkdfSU5fRk9SRUdST1VORDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFQUF9TVEFURS5SVU5OSU5HX0lOX0JBQ0tHUk9VTkQ7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1vYmlsZVF1ZXJ5QXBwU3RhdGVPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXIuIE11c3QgYmUgYWx3YXlzIHByb3ZpZGVkLlxuICovXG5cbi8qKlxuICogUXVlcmllcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwLlxuICpcbiAqIEBwYXJhbSB7TW9iaWxlUXVlcnlBcHBTdGF0ZU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFNhbWUgYXMgaW4gYHF1ZXJ5QXBwU3RhdGVgXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVF1ZXJ5QXBwU3RhdGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVRdWVyeUFwcFN0YXRlIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBhcHBJZCB9ID0gcmVxdWlyZUFyZ3MoJ2FwcElkJywgb3B0cyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnF1ZXJ5QXBwU3RhdGUoYXBwSWQpO1xufTtcblxuLyoqXG4gKiBBY3RpdmF0ZXMgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIG9yIGxhdW5jaGVzIGl0IGlmIG5lY2Vzc2FyeS5cbiAqIFRoZSBhY3Rpb24gbGl0ZXJhbGx5IHNpbXVsYXRlc1xuICogY2xpY2tpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gaWNvbiBvbiB0aGUgZGFzaGJvYXJkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBhcHAgY2Fubm90IGJlIGFjdGl2YXRlZFxuICovXG5jb21tYW5kcy5hY3RpdmF0ZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlQXBwIChhcHBJZCkge1xuICB0aGlzLmxvZy5kZWJ1ZyhgQWN0aXZhdGluZyAnJHthcHBJZH0nYCk7XG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgLy8gRmFsbGJhY2sgdG8gTW9ua2V5IGluIG9sZGVyIEFQSXNcbiAgaWYgKGFwaUxldmVsIDwgMjQpIHtcbiAgICAvLyBUaGUgbW9ua2V5IGNvbW1hbmQgY291bGQgcmFpc2UgYW4gaXNzdWUgYXMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDQ4NjA0NzUvaG93LXRvLXVzZS10aGUtbW9ua2V5LWNvbW1hbmQtd2l0aC1hbi1hbmRyb2lkLXN5c3RlbS10aGF0LWRvZXNudC1oYXZlLXBoeXNpY2FsXG4gICAgLy8gYnV0ICctLXBjdC1zeXNrZXlzIDAnIGNvdWxkIGNhdXNlIGFub3RoZXIgYmFja2dyb3VuZCBwcm9jZXNzIGlzc3VlLiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTY5NDEjaXNzdWVjb21tZW50LTExMjk4MzcyODVcbiAgICBjb25zdCBjbWQgPSBbJ21vbmtleScsXG4gICAgICAnLXAnLCBhcHBJZCxcbiAgICAgICctYycsICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICAnMSddO1xuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICB0cnkge1xuICAgICAgb3V0cHV0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBDb21tYW5kIHN0ZG91dDogJHtvdXRwdXR9YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGFjdGl2YXRlICcke2FwcElkfScuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5pbmNsdWRlcygnbW9ua2V5IGFib3J0ZWQnKSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGFjdGl2YXRlICcke2FwcElkfScuIEFyZSB5b3Ugc3VyZSBpdCBpcyBpbnN0YWxsZWQ/YCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBhY3Rpdml0eU5hbWUgPSBhd2FpdCB0aGlzLmFkYi5yZXNvbHZlTGF1bmNoYWJsZUFjdGl2aXR5KGFwcElkKTtcbiAgaWYgKGFjdGl2aXR5TmFtZSA9PT0gUkVTT0xWRVJfQUNUSVZJVFlfTkFNRSkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNzEyOFxuICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgYFRoZSBsYXVuY2hhYmxlIGFjdGl2aXR5IG5hbWUgb2YgJyR7YXBwSWR9JyB3YXMgcmVzb2x2ZWQgdG8gJyR7YWN0aXZpdHlOYW1lfScuIGAgK1xuICAgICAgYFN3aXRjaGluZyB0aGUgcmVzb2x2ZXIgdG8gbm90IHVzZSBjbWRgXG4gICAgKTtcbiAgICBhY3Rpdml0eU5hbWUgPSBhd2FpdCB0aGlzLmFkYi5yZXNvbHZlTGF1bmNoYWJsZUFjdGl2aXR5KGFwcElkLCB7cHJlZmVyQ21kOiBmYWxzZX0pO1xuICB9XG5cbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoW1xuICAgICdhbScsIChhcGlMZXZlbCA8IDI2KSA/ICdzdGFydCcgOiAnc3RhcnQtYWN0aXZpdHknLFxuICAgICctYScsICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTicsXG4gICAgJy1jJywgJ2FuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSJyxcbiAgICAvLyBGTEFHX0FDVElWSVRZX05FV19UQVNLIHwgRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50I0ZMQUdfQUNUSVZJVFlfTkVXX1RBU0tcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9jb250ZW50L0ludGVudCNGTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEXG4gICAgJy1mJywgJzB4MTAyMDAwMDAnLFxuICAgICctbicsIGFjdGl2aXR5TmFtZSxcbiAgXSk7XG4gIHRoaXMubG9nLmRlYnVnKHN0ZG91dCk7XG4gIGlmICgvXmVycm9yOi9taS50ZXN0KHN0ZG91dCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBhY3RpdmF0ZSAnJHthcHBJZH0nLiBPcmlnaW5hbCBlcnJvcjogJHtzdGRvdXR9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTW9iaWxlQWN0aXZhdGVBcHBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXIuIE11c3QgYmUgYWx3YXlzIHByb3ZpZGVkLlxuICovXG5cbi8qKlxuICogQWN0aXZhdGVzIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBvciBsYXVuY2hlcyBpdCBpZiBuZWNlc3NhcnkuXG4gKiBUaGUgYWN0aW9uIGxpdGVyYWxseSBzaW11bGF0ZXNcbiAqIGNsaWNraW5nIHRoZSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uIGljb24gb24gdGhlIGRhc2hib2FyZC5cbiAqXG4gKiBAcGFyYW0ge01vYmlsZUFjdGl2YXRlQXBwT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBhcHAgY2Fubm90IGJlIGFjdGl2YXRlZFxuICovXG5jb21tYW5kcy5tb2JpbGVBY3RpdmF0ZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUFjdGl2YXRlQXBwIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBhcHBJZCB9ID0gcmVxdWlyZUFyZ3MoJ2FwcElkJywgb3B0cyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFjdGl2YXRlQXBwKGFwcElkKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVW5pbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXQgWzIwMDAwXSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgdW5pbnN0YWxsZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGtlZXBEYXRhIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBrZWVwIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZGF0YSBhbmQgY2FjaGUgZm9sZGVycyBhZnRlciB1bmluc3RhbGwuXG4gKi9cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gaWYgaXMgaW5zdGFsbGVkLlxuICogVGhlIGNhbGwgaXMgaWdub3JlZCBpZiB0aGUgYXBwIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAcGFyYW0gez9Vbmluc3RhbGxPcHRpb25zfSBvcHRpb25zIC0gVGhlIHNldCBvZiByZW1vdmFsIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBwYWNrYWdlIHdhcyBmb3VuZCBvbiB0aGUgZGV2aWNlIGFuZFxuICogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZC5cbiAqL1xuY29tbWFuZHMucmVtb3ZlQXBwID0gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlQXBwIChhcHBJZCwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsoYXBwSWQsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNb2JpbGVSZW1vdmVBcHBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXIuIE11c3QgYmUgYWx3YXlzIHByb3ZpZGVkLlxuICovXG5cbi8qKlxuICogUmVtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uIGlmIGlzIGluc3RhbGxlZC5cbiAqIFRoZSBjYWxsIGlzIGlnbm9yZWQgaWYgdGhlIGFwcCBpcyBub3QgaW5zdGFsbGVkLlxuICpcbiAqIEBwYXJhbSB7TW9iaWxlUmVtb3ZlQXBwT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge2Jvb2xlYW59IFNhbWUgYXMgaW4gYHJlbW92ZUFwcGBcbiAqL1xuY29tbWFuZHMubW9iaWxlUmVtb3ZlQXBwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUmVtb3ZlQXBwIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBhcHBJZCB9ID0gcmVxdWlyZUFyZ3MoJ2FwcElkJywgb3B0cyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnJlbW92ZUFwcChhcHBJZCwgb3B0cyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRlcm1pbmF0ZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfHN0cmluZ30gdGltZW91dCBbNTAwXSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyB0ZXJtaW5hdGVkLlxuICovXG5cbi8qKlxuICogVGVybWluYXRlcyB0aGUgYXBwIGlmIGl0IGlzIHJ1bm5pbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAcGFyYW0gez9UZXJtaW5hdGVPcHRpb25zfSBvcHRpb25zIC0gVGhlIHNldCBvZiBhcHBsaWNhdGlvbiB0ZXJtaW5hdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXBwIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB0ZXJtaW5hdGVkLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBhcHAgaGFzIG5vdCBiZWVuIHRlcm1pbmF0ZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0LlxuICovXG5jb21tYW5kcy50ZXJtaW5hdGVBcHAgPSBhc3luYyBmdW5jdGlvbiB0ZXJtaW5hdGVBcHAgKGFwcElkLCBvcHRpb25zID0ge30pIHtcbiAgdGhpcy5sb2cuaW5mbyhgVGVybWluYXRpbmcgJyR7YXBwSWR9J2ApO1xuICBpZiAoIShhd2FpdCB0aGlzLmFkYi5wcm9jZXNzRXhpc3RzKGFwcElkKSkpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBUaGUgYXBwICcke2FwcElkfScgaXMgbm90IHJ1bm5pbmdgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKGFwcElkKTtcbiAgY29uc3QgdGltZW91dCA9IHV0aWwuaGFzVmFsdWUob3B0aW9ucy50aW1lb3V0KSAmJiAhaXNOYU4ob3B0aW9ucy50aW1lb3V0KSA/IHBhcnNlSW50KG9wdGlvbnMudGltZW91dCwgMTApIDogNTAwO1xuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5xdWVyeUFwcFN0YXRlKGFwcElkKSA8PSBBUFBfU1RBVEUuTk9UX1JVTk5JTkcsXG4gICAgICB7d2FpdE1zOiB0aW1lb3V0LCBpbnRlcnZhbE1zOiAxMDB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYCcke2FwcElkfScgaXMgc3RpbGwgcnVubmluZyBhZnRlciAke3RpbWVvdXR9bXMgdGltZW91dGApO1xuICB9XG4gIHRoaXMubG9nLmluZm8oYCcke2FwcElkfScgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZWRgKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1vYmlsZVRlcm1pbmF0ZUFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllci4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkge251bWJlcnxzdHJpbmd9IHRpbWVvdXQgWzUwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgdGVybWluYXRlZC5cbiAqL1xuXG4vKipcbiAqIFRlcm1pbmF0ZXMgdGhlIGFwcCBpZiBpdCBpcyBydW5uaW5nLlxuICpcbiAqIEBwYXJhbSB7TW9iaWxlVGVybWluYXRlQXBwT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge2Jvb2xlYW59IFNhbWUgYXMgaW4gYHRlcm1pbmF0ZUFwcGBcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgYXBwIGhhcyBub3QgYmVlbiB0ZXJtaW5hdGVkIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZW91dC5cbiAqL1xuY29tbWFuZHMubW9iaWxlVGVybWluYXRlQXBwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVGVybWluYXRlQXBwIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBhcHBJZCB9ID0gcmVxdWlyZUFyZ3MoJ2FwcElkJywgb3B0cyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnRlcm1pbmF0ZUFwcChhcHBJZCwgb3B0cyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbNjAwMDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyBpbnN0YWxsZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqL1xuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBsb2NhbCBhcGsgcGF0aCBvciBhIHJlbW90ZSB1cmxcbiAqIEBwYXJhbSB7P0luc3RhbGxPcHRpb25zfSBvcHRpb25zIC0gVGhlIHNldCBvZiBpbnN0YWxsYXRpb24gb3B0aW9uc1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBnaXZlbiBhcGsgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHJlYWNoYWJsZVxuICovXG5jb21tYW5kcy5pbnN0YWxsQXBwID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFwcCAoYXBwUGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGxvY2FsUGF0aCA9IGF3YWl0IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAoYXBwUGF0aCwgQVBQX0VYVEVOU0lPTlMpO1xuICBhd2FpdCB0aGlzLmFkYi5pbnN0YWxsKGxvY2FsUGF0aCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1vYmlsZUluc3RhbGxBcHBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBsb2NhbCBhcGsgcGF0aCBvciBhIHJlbW90ZSB1cmwuIE11c3QgYmUgYWx3YXlzIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXQgWzYwMDAwXSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgaW5zdGFsbGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd1Rlc3RQYWNrYWdlcyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gYWxsb3cgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgaW5zdGFsbGF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VTZGNhcmQgW2ZhbHNlXSAtIFNldCB0byB0cnVlIHRvIGluc3RhbGwgdGhlIGFwcCBvbiBzZGNhcmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBkZXZpY2UgbWVtb3J5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBncmFudFBlcm1pc3Npb25zIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBncmFudCBhbGwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcGxhY2UgW3RydWVdIC0gU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHVwZ3JhZGVkL3JlaW5zdGFsbGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBkZXZpY2UuXG4gKi9cblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHBhcmFtIHtNb2JpbGVJbnN0YWxsQXBwT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBnaXZlbiBhcGsgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHJlYWNoYWJsZVxuICovXG5jb21tYW5kcy5tb2JpbGVJbnN0YWxsQXBwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlSW5zdGFsbEFwcCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgYXBwUGF0aCB9ID0gcmVxdWlyZUFyZ3MoJ2FwcFBhdGgnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuaW5zdGFsbEFwcChhcHBQYXRoLCBvcHRzKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2xlYXJBcHBPcHRpb25zXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IGFwcElkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIHRvIGJlIGNsZWFyZWRcbiAqL1xuXG4vKipcbiAqIERlbGV0ZXMgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge0NsZWFyQXBwT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IElmIGNsZWFuaW5nIG9mIHRoZSBhcHAgZGF0YSBmYWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVDbGVhckFwcCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUNsZWFyQXBwIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2FwcElkfSA9IG9wdHM7XG4gIGlmICghYXBwSWQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBUaGUgJ2FwcElkJyBhcmd1bWVudCBpcyByZXF1aXJlZGApO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmNsZWFyKGFwcElkKTtcbn07XG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxjQUFjLEdBQUcsQ0FBQyxNQUFELEVBQVMsT0FBVCxDQUF2QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLG1EQUEvQjtBQUVBLE1BQU1DLFFBQVEsR0FBRyxFQUFqQjs7O0FBU0EsU0FBU0MsV0FBVCxDQUFzQkMsUUFBdEIsRUFBZ0NDLElBQUksR0FBRyxFQUF2QyxFQUEyQztFQUN6QyxLQUFLLE1BQU1DLE9BQVgsSUFBdUJDLGVBQUEsQ0FBRUMsT0FBRixDQUFVSixRQUFWLElBQXNCQSxRQUF0QixHQUFpQyxDQUFDQSxRQUFELENBQXhELEVBQXFFO0lBQ25FLElBQUksQ0FBQ0csZUFBQSxDQUFFRSxHQUFGLENBQU1KLElBQU4sRUFBWUMsT0FBWixDQUFMLEVBQTJCO01BQ3pCLE1BQU0sSUFBSUksY0FBQSxDQUFPQyxvQkFBWCxDQUFpQyxJQUFHTCxPQUFRLDZCQUE1QyxDQUFOO0lBQ0Q7RUFDRjs7RUFDRCxPQUFPRCxJQUFQO0FBQ0Q7O0FBUURILFFBQVEsQ0FBQ1UsY0FBVCxHQUEwQixlQUFlQSxjQUFmLENBQStCQyxLQUEvQixFQUFzQztFQUM5RCxPQUFPLE1BQU0sS0FBS0MsR0FBTCxDQUFTRixjQUFULENBQXdCQyxLQUF4QixDQUFiO0FBQ0QsQ0FGRDs7QUFlQVgsUUFBUSxDQUFDYSxvQkFBVCxHQUFnQyxlQUFlQSxvQkFBZixDQUFxQ1YsSUFBSSxHQUFHLEVBQTVDLEVBQWdEO0VBQzlFLE1BQU07SUFBRVE7RUFBRixJQUFZVixXQUFXLENBQUMsT0FBRCxFQUFVRSxJQUFWLENBQTdCO0VBQ0EsT0FBTyxNQUFNLEtBQUtPLGNBQUwsQ0FBb0JDLEtBQXBCLENBQWI7QUFDRCxDQUhEOztBQWdCQVgsUUFBUSxDQUFDYyxhQUFULEdBQXlCLGVBQWVBLGFBQWYsQ0FBOEJILEtB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
|
|
183
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUFBfRVhURU5TSU9OUyIsIlJFU09MVkVSX0FDVElWSVRZX05BTUUiLCJjb21tYW5kcyIsImlzQXBwSW5zdGFsbGVkIiwiYXBwSWQiLCJhZGIiLCJtb2JpbGVJc0FwcEluc3RhbGxlZCIsIm9wdHMiLCJyZXF1aXJlQXJncyIsInF1ZXJ5QXBwU3RhdGUiLCJsb2ciLCJpbmZvIiwiQVBQX1NUQVRFIiwiTk9UX0lOU1RBTExFRCIsInByb2Nlc3NFeGlzdHMiLCJOT1RfUlVOTklORyIsImFwcElkUmUiLCJSZWdFeHAiLCJfIiwiZXNjYXBlUmVnRXhwIiwibGluZSIsImR1bXBXaW5kb3dzIiwic3BsaXQiLCJ0ZXN0Iiwic29tZSIsIngiLCJpbmNsdWRlcyIsIlJVTk5JTkdfSU5fRk9SRUdST1VORCIsIlJVTk5JTkdfSU5fQkFDS0dST1VORCIsIm1vYmlsZVF1ZXJ5QXBwU3RhdGUiLCJhY3RpdmF0ZUFwcCIsImRlYnVnIiwiYXBpTGV2ZWwiLCJnZXRBcGlMZXZlbCIsImNtZCIsIm91dHB1dCIsInNoZWxsIiwiZSIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwiYWN0aXZpdHlOYW1lIiwicmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eSIsInByZWZlckNtZCIsInN0ZG91dCIsIkVycm9yIiwibW9iaWxlQWN0aXZhdGVBcHAiLCJyZW1vdmVBcHAiLCJvcHRpb25zIiwidW5pbnN0YWxsQXBrIiwibW9iaWxlUmVtb3ZlQXBwIiwidGVybWluYXRlQXBwIiwiZm9yY2VTdG9wIiwidGltZW91dCIsInV0aWwiLCJoYXNWYWx1ZSIsImlzTmFOIiwicGFyc2VJbnQiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsIm1vYmlsZVRlcm1pbmF0ZUFwcCIsImluc3RhbGxBcHAiLCJhcHBQYXRoIiwibG9jYWxQYXRoIiwiaGVscGVycyIsImNvbmZpZ3VyZUFwcCIsImluc3RhbGwiLCJtb2JpbGVJbnN0YWxsQXBwIiwibW9iaWxlQ2xlYXJBcHAiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsImNsZWFyIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2FwcC1tYW5hZ2VtZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IEFQUF9TVEFURSB9IGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7IHJlcXVpcmVBcmdzIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBBUFBfRVhURU5TSU9OUyA9IFsnLmFwaycsICcuYXBrcyddO1xuY29uc3QgUkVTT0xWRVJfQUNUSVZJVFlfTkFNRSA9ICdhbmRyb2lkL2NvbS5hbmRyb2lkLmludGVybmFsLmFwcC5SZXNvbHZlckFjdGl2aXR5JztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciBhbiBhcHBsaWNhdGlvbiBpcyBpbnN0YWxsZWQgb3Igbm90XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgYXBwIGlzIGluc3RhbGxlZFxuICovXG5jb21tYW5kcy5pc0FwcEluc3RhbGxlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzQXBwSW5zdGFsbGVkIChhcHBJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQoYXBwSWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNb2JpbGVBcHBJbnN0YWxsZWRPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXIuIE11c3QgYmUgYWx3YXlzIHByb3ZpZGVkLlxuICovXG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgYW4gYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkIG9yIG5vdFxuICpcbiAqIEBwYXJhbSB7TW9iaWxlQXBwSW5zdGFsbGVkT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge2Jvb2xlYW59IFNhbWUgYXMgaW4gYGlzQXBwSW5zdGFsbGVkYFxuICovXG5jb21tYW5kcy5tb2JpbGVJc0FwcEluc3RhbGxlZCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUlzQXBwSW5zdGFsbGVkIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBhcHBJZCB9ID0gcmVxdWlyZUFyZ3MoJ2FwcElkJywgb3B0cyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmlzQXBwSW5zdGFsbGVkKGFwcElkKTtcbn07XG5cbi8qKlxuICogUXVlcmllcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICogQHJldHVybnMge251bWJlcn0gVGhlIGNvcnJlc3BvbmRpbmcgY29uc3RhbnQsIHdoaWNoIGRlc2NyaWJlc1xuICogICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gc3RhdGU6XG4gKiAwIC0gaXMgdGhlIGFwcCBpcyBub3QgaW5zdGFsbGVkXG4gKiAxIC0gaWYgdGhlIGFwcCBpcyBpbnN0YWxsZWQsIGJ1dCBpcyBub3QgcnVubmluZ1xuICogMyAtIGlmIHRoZSBhcHAgaXMgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZFxuICogNCAtIGlmIHRoZSBhcHAgaXMgcnVubmluZyBpbiB0aGUgZm9yZWdyb3VuZFxuICovXG5jb21tYW5kcy5xdWVyeUFwcFN0YXRlID0gYXN5bmMgZnVuY3Rpb24gcXVlcnlBcHBTdGF0ZSAoYXBwSWQpIHtcbiAgdGhpcy5sb2cuaW5mbyhgUXVlcnlpbmcgdGhlIHN0YXRlIG9mICcke2FwcElkfSdgKTtcbiAgaWYgKCFhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZChhcHBJZCkpIHtcbiAgICByZXR1cm4gQVBQX1NUQVRFLk5PVF9JTlNUQUxMRUQ7XG4gIH1cbiAgaWYgKCFhd2FpdCB0aGlzLmFkYi5wcm9jZXNzRXhpc3RzKGFwcElkKSkge1xuICAgIHJldHVybiBBUFBfU1RBVEUuTk9UX1JVTk5JTkc7XG4gIH1cbiAgY29uc3QgYXBwSWRSZSA9IG5ldyBSZWdFeHAoYFxcXFxiJHtfLmVzY2FwZVJlZ0V4cChhcHBJZCl9L2ApO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgKGF3YWl0IHRoaXMuYWRiLmR1bXBXaW5kb3dzKCkpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChhcHBJZFJlLnRlc3QobGluZSkgJiYgWydtQ3VycmVudEZvY3VzJywgJ21Gb2N1c2VkQXBwJ10uc29tZSgoeCkgPT4gbGluZS5pbmNsdWRlcyh4KSkpIHtcbiAgICAgIHJldHVybiBBUFBfU1RBVEUuUlVOTklOR19JTl9GT1JFR1JPVU5EO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQVBQX1NUQVRFLlJVTk5JTkdfSU5fQkFDS0dST1VORDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTW9iaWxlUXVlcnlBcHBTdGF0ZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllci4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKi9cblxuLyoqXG4gKiBRdWVyaWVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHAuXG4gKlxuICogQHBhcmFtIHtNb2JpbGVRdWVyeUFwcFN0YXRlT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge251bWJlcn0gU2FtZSBhcyBpbiBgcXVlcnlBcHBTdGF0ZWBcbiAqL1xuY29tbWFuZHMubW9iaWxlUXVlcnlBcHBTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVF1ZXJ5QXBwU3RhdGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGFwcElkIH0gPSByZXF1aXJlQXJncygnYXBwSWQnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnlBcHBTdGF0ZShhcHBJZCk7XG59O1xuXG4vKipcbiAqIEFjdGl2YXRlcyB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gb3IgbGF1bmNoZXMgaXQgaWYgbmVjZXNzYXJ5LlxuICogVGhlIGFjdGlvbiBsaXRlcmFsbHkgc2ltdWxhdGVzXG4gKiBjbGlja2luZyB0aGUgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBpY29uIG9uIHRoZSBkYXNoYm9hcmQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGFwcCBjYW5ub3QgYmUgYWN0aXZhdGVkXG4gKi9cbmNvbW1hbmRzLmFjdGl2YXRlQXBwID0gYXN5bmMgZnVuY3Rpb24gYWN0aXZhdGVBcHAgKGFwcElkKSB7XG4gIHRoaXMubG9nLmRlYnVnKGBBY3RpdmF0aW5nICcke2FwcElkfSdgKTtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuICAvLyBGYWxsYmFjayB0byBNb25rZXkgaW4gb2xkZXIgQVBJc1xuICBpZiAoYXBpTGV2ZWwgPCAyNCkge1xuICAgIC8vIFRoZSBtb25rZXkgY29tbWFuZCBjb3VsZCByYWlzZSBhbiBpc3N1ZSBhcyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80NDg2MDQ3NS9ob3ctdG8tdXNlLXRoZS1tb25rZXktY29tbWFuZC13aXRoLWFuLWFuZHJvaWQtc3lzdGVtLXRoYXQtZG9lc250LWhhdmUtcGh5c2ljYWxcbiAgICAvLyBidXQgJy0tcGN0LXN5c2tleXMgMCcgY291bGQgY2F1c2UgYW5vdGhlciBiYWNrZ3JvdW5kIHByb2Nlc3MgaXNzdWUuIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNjk0MSNpc3N1ZWNvbW1lbnQtMTEyOTgzNzI4NVxuICAgIGNvbnN0IGNtZCA9IFsnbW9ua2V5JyxcbiAgICAgICctcCcsIGFwcElkLFxuICAgICAgJy1jJywgJ2FuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSJyxcbiAgICAgICcxJ107XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChjbWQpO1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENvbW1hbmQgc3Rkb3V0OiAke291dHB1dH1gKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgYWN0aXZhdGUgJyR7YXBwSWR9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAob3V0cHV0LmluY2x1ZGVzKCdtb25rZXkgYWJvcnRlZCcpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgYWN0aXZhdGUgJyR7YXBwSWR9Jy4gQXJlIHlvdSBzdXJlIGl0IGlzIGluc3RhbGxlZD9gKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGFjdGl2aXR5TmFtZSA9IGF3YWl0IHRoaXMuYWRiLnJlc29sdmVMYXVuY2hhYmxlQWN0aXZpdHkoYXBwSWQpO1xuICBpZiAoYWN0aXZpdHlOYW1lID09PSBSRVNPTFZFUl9BQ1RJVklUWV9OQU1FKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE3MTI4XG4gICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICBgVGhlIGxhdW5jaGFibGUgYWN0aXZpdHkgbmFtZSBvZiAnJHthcHBJZH0nIHdhcyByZXNvbHZlZCB0byAnJHthY3Rpdml0eU5hbWV9Jy4gYCArXG4gICAgICBgU3dpdGNoaW5nIHRoZSByZXNvbHZlciB0byBub3QgdXNlIGNtZGBcbiAgICApO1xuICAgIGFjdGl2aXR5TmFtZSA9IGF3YWl0IHRoaXMuYWRiLnJlc29sdmVMYXVuY2hhYmxlQWN0aXZpdHkoYXBwSWQsIHtwcmVmZXJDbWQ6IGZhbHNlfSk7XG4gIH1cblxuICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbXG4gICAgJ2FtJywgKGFwaUxldmVsIDwgMjYpID8gJ3N0YXJ0JyA6ICdzdGFydC1hY3Rpdml0eScsXG4gICAgJy1hJywgJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJyxcbiAgICAnLWMnLCAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgIC8vIEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBGTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9JbnRlbnQjRkxBR19BQ1RJVklUWV9ORVdfVEFTS1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50I0ZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERURcbiAgICAnLWYnLCAnMHgxMDIwMDAwMCcsXG4gICAgJy1uJywgYWN0aXZpdHlOYW1lLFxuICBdKTtcbiAgdGhpcy5sb2cuZGVidWcoc3Rkb3V0KTtcbiAgaWYgKC9eZXJyb3I6L21pLnRlc3Qoc3Rkb3V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGFjdGl2YXRlICcke2FwcElkfScuIE9yaWdpbmFsIGVycm9yOiAke3N0ZG91dH1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNb2JpbGVBY3RpdmF0ZUFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllci4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKi9cblxuLyoqXG4gKiBBY3RpdmF0ZXMgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIG9yIGxhdW5jaGVzIGl0IGlmIG5lY2Vzc2FyeS5cbiAqIFRoZSBhY3Rpb24gbGl0ZXJhbGx5IHNpbXVsYXRlc1xuICogY2xpY2tpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gaWNvbiBvbiB0aGUgZGFzaGJvYXJkLlxuICpcbiAqIEBwYXJhbSB7TW9iaWxlQWN0aXZhdGVBcHBPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGFwcCBjYW5ub3QgYmUgYWN0aXZhdGVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUFjdGl2YXRlQXBwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQWN0aXZhdGVBcHAgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGFwcElkIH0gPSByZXF1aXJlQXJncygnYXBwSWQnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWN0aXZhdGVBcHAoYXBwSWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmluc3RhbGxPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbMjAwMDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyB1bmluc3RhbGxlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0ga2VlcERhdGEgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGtlZXAgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBkYXRhIGFuZCBjYWNoZSBmb2xkZXJzIGFmdGVyIHVuaW5zdGFsbC5cbiAqL1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBpZiBpcyBpbnN0YWxsZWQuXG4gKiBUaGUgY2FsbCBpcyBpZ25vcmVkIGlmIHRoZSBhcHAgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7P1VuaW5zdGFsbE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIHJlbW92YWwgb3B0aW9uc1xuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBhY2thZ2Ugd2FzIGZvdW5kIG9uIHRoZSBkZXZpY2UgYW5kXG4gKiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IHVuaW5zdGFsbGVkLlxuICovXG5jb21tYW5kcy5yZW1vdmVBcHAgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVBcHAgKGFwcElkLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayhhcHBJZCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1vYmlsZVJlbW92ZUFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllci4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKi9cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gaWYgaXMgaW5zdGFsbGVkLlxuICogVGhlIGNhbGwgaXMgaWdub3JlZCBpZiB0aGUgYXBwIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHBhcmFtIHtNb2JpbGVSZW1vdmVBcHBPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gU2FtZSBhcyBpbiBgcmVtb3ZlQXBwYFxuICovXG5jb21tYW5kcy5tb2JpbGVSZW1vdmVBcHAgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSZW1vdmVBcHAgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGFwcElkIH0gPSByZXF1aXJlQXJncygnYXBwSWQnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucmVtb3ZlQXBwKGFwcElkLCBvcHRzKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVGVybWluYXRlT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ8c3RyaW5nfSB0aW1lb3V0IFs1MDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIHRlcm1pbmF0ZWQuXG4gKi9cblxuLyoqXG4gKiBUZXJtaW5hdGVzIHRoZSBhcHAgaWYgaXQgaXMgcnVubmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7P1Rlcm1pbmF0ZU9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIGFwcGxpY2F0aW9uIHRlcm1pbmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBhcHAgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGFwcCBoYXMgbm90IGJlZW4gdGVybWluYXRlZCB3aXRoaW4gdGhlIGdpdmVuIHRpbWVvdXQuXG4gKi9cbmNvbW1hbmRzLnRlcm1pbmF0ZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUFwcCAoYXBwSWQsIG9wdGlvbnMgPSB7fSkge1xuICB0aGlzLmxvZy5pbmZvKGBUZXJtaW5hdGluZyAnJHthcHBJZH0nYCk7XG4gIGlmICghKGF3YWl0IHRoaXMuYWRiLnByb2Nlc3NFeGlzdHMoYXBwSWQpKSkge1xuICAgIHRoaXMubG9nLmluZm8oYFRoZSBhcHAgJyR7YXBwSWR9JyBpcyBub3QgcnVubmluZ2ApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AoYXBwSWQpO1xuICBjb25zdCB0aW1lb3V0ID0gdXRpbC5oYXNWYWx1ZShvcHRpb25zLnRpbWVvdXQpICYmICFpc05hTihvcHRpb25zLnRpbWVvdXQpID8gcGFyc2VJbnQob3B0aW9ucy50aW1lb3V0LCAxMCkgOiA1MDA7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnF1ZXJ5QXBwU3RhdGUoYXBwSWQpIDw9IEFQUF9TVEFURS5OT1RfUlVOTklORyxcbiAgICAgIHt3YWl0TXM6IHRpbWVvdXQsIGludGVydmFsTXM6IDEwMH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgJyR7YXBwSWR9JyBpcyBzdGlsbCBydW5uaW5nIGFmdGVyICR7dGltZW91dH1tcyB0aW1lb3V0YCk7XG4gIH1cbiAgdGhpcy5sb2cuaW5mbyhgJyR7YXBwSWR9JyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdGVybWluYXRlZGApO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTW9iaWxlVGVybWluYXRlQXBwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyLiBNdXN0IGJlIGFsd2F5cyBwcm92aWRlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfHN0cmluZ30gdGltZW91dCBbNTAwXSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyB0ZXJtaW5hdGVkLlxuICovXG5cbi8qKlxuICogVGVybWluYXRlcyB0aGUgYXBwIGlmIGl0IGlzIHJ1bm5pbmcuXG4gKlxuICogQHBhcmFtIHtNb2JpbGVUZXJtaW5hdGVBcHBPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gU2FtZSBhcyBpbiBgdGVybWluYXRlQXBwYFxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBhcHAgaGFzIG5vdCBiZWVuIHRlcm1pbmF0ZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0LlxuICovXG5jb21tYW5kcy5tb2JpbGVUZXJtaW5hdGVBcHAgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVUZXJtaW5hdGVBcHAgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGFwcElkIH0gPSByZXF1aXJlQXJncygnYXBwSWQnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudGVybWluYXRlQXBwKGFwcElkLCBvcHRzKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFs2MDAwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIGluc3RhbGxlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlU2RjYXJkIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSB0byBpbnN0YWxsIHRoZSBhcHAgb24gc2RjYXJkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhZnRlciB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlciBBbmRyb2lkIDYrLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZXBsYWNlIFt0cnVlXSAtIFNldCBpdCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB0byBiZSB1cGdyYWRlZC9yZWluc3RhbGxlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudCBvbiB0aGUgZGV2aWNlLlxuICovXG5cbi8qKlxuICogSW5zdGFsbHMgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIC0gVGhlIGxvY2FsIGFwayBwYXRoIG9yIGEgcmVtb3RlIHVybFxuICogQHBhcmFtIHs/SW5zdGFsbE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIGluc3RhbGxhdGlvbiBvcHRpb25zXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGdpdmVuIGFwayBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgcmVhY2hhYmxlXG4gKi9cbmNvbW1hbmRzLmluc3RhbGxBcHAgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQXBwIChhcHBQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgbG9jYWxQYXRoID0gYXdhaXQgdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcChhcHBQYXRoLCBBUFBfRVhURU5TSU9OUyk7XG4gIGF3YWl0IHRoaXMuYWRiLmluc3RhbGwobG9jYWxQYXRoLCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTW9iaWxlSW5zdGFsbEFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBQYXRoIC0gVGhlIGxvY2FsIGFwayBwYXRoIG9yIGEgcmVtb3RlIHVybC4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbNjAwMDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyBpbnN0YWxsZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqL1xuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqXG4gKiBAcGFyYW0ge01vYmlsZUluc3RhbGxBcHBPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGdpdmVuIGFwayBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgcmVhY2hhYmxlXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUluc3RhbGxBcHAgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVJbnN0YWxsQXBwIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBhcHBQYXRoIH0gPSByZXF1aXJlQXJncygnYXBwUGF0aCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5pbnN0YWxsQXBwKGFwcFBhdGgsIG9wdHMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDbGVhckFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gYXBwSWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgdG8gYmUgY2xlYXJlZFxuICovXG5cbi8qKlxuICogRGVsZXRlcyBhbGwgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7Q2xlYXJBcHBPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgY2xlYW5pbmcgb2YgdGhlIGFwcCBkYXRhIGZhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUNsZWFyQXBwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQ2xlYXJBcHAgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7YXBwSWR9ID0gb3B0cztcbiAgaWYgKCFhcHBJZCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFRoZSAnYXBwSWQnIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuY2xlYXIoYXBwSWQpO1xufTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGNBQWMsR0FBRyxDQUFDLE1BQUQsRUFBUyxPQUFULENBQXZCO0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUcsbURBQS9CO0FBRUEsTUFBTUMsUUFBUSxHQUFHLEVBQWpCOzs7QUFRQUEsUUFBUSxDQUFDQyxjQUFULEdBQTBCLGVBQWVBLGNBQWYsQ0FBK0JDLEtBQS9CLEVBQXNDO0VBQzlELE9BQU8sTUFBTSxLQUFLQyxHQUFMLENBQVNGLGNBQVQsQ0FBd0JDLEtBQXhCLENBQWI7QUFDRCxDQUZEOztBQWVBRixRQUFRLENBQUNJLG9CQUFULEdBQWdDLGVBQWVBLG9CQUFmLENBQXFDQyxJQUFJLEdBQUcsRUFBNUMsRUFBZ0Q7RUFDOUUsTUFBTTtJQUFFSDtFQUFGLElBQVksSUFBQUksa0JBQUEsRUFBWSxPQUFaLEVBQXFCRCxJQUFyQixDQUFsQjtFQUNBLE9BQU8s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
|
|
@@ -48,6 +48,9 @@ extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}
|
|
|
48
48
|
stopScreenStreaming: 'mobileStopScreenStreaming',
|
|
49
49
|
getNotifications: 'mobileGetNotifications',
|
|
50
50
|
listSms: 'mobileListSms',
|
|
51
|
+
pushFile: 'mobilePushFile',
|
|
52
|
+
pullFile: 'mobilePullFile',
|
|
53
|
+
pullFolder: 'mobilePullFolder',
|
|
51
54
|
deleteFile: 'mobileDeleteFile',
|
|
52
55
|
isAppInstalled: 'mobileIsAppInstalled',
|
|
53
56
|
queryAppState: 'mobileQueryAppState',
|
|
@@ -77,4 +80,4 @@ extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}
|
|
|
77
80
|
|
|
78
81
|
var _default = extensions;
|
|
79
82
|
exports.default = _default;
|
|
80
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
83
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRlbnNpb25zIiwiZXhlY3V0ZSIsInNjcmlwdCIsImFyZ3MiLCJtYXRjaCIsImxvZyIsImluZm8iLCJyZXBsYWNlIiwidHJpbSIsImV4ZWN1dGVNb2JpbGUiLCJfIiwiaXNBcnJheSIsImlzV2ViQ29udGV4dCIsImVycm9ycyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJlbmRwb2ludCIsImNocm9tZWRyaXZlciIsImp3cHJveHkiLCJkb3duc3RyZWFtUHJvdG9jb2wiLCJQUk9UT0NPTFMiLCJNSlNPTldQIiwiY29tbWFuZCIsIm1vYmlsZUNvbW1hbmQiLCJvcHRzIiwibW9iaWxlQ29tbWFuZHNNYXBwaW5nIiwic2hlbGwiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJzdGFydExvZ3NCcm9hZGNhc3QiLCJzdG9wTG9nc0Jyb2FkY2FzdCIsImNoYW5nZVBlcm1pc3Npb25zIiwiZ2V0UGVybWlzc2lvbnMiLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwic2Vuc29yU2V0IiwiZ2V0RGV2aWNlVGltZSIsInN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwic3RvcFNjcmVlblN0cmVhbWluZyIsImdldE5vdGlmaWNhdGlvbnMiLCJsaXN0U21zIiwicHVzaEZpbGUiLCJwdWxsRmlsZSIsInB1bGxGb2xkZXIiLCJkZWxldGVGaWxlIiwiaXNBcHBJbnN0YWxsZWQiLCJxdWVyeUFwcFN0YXRlIiwiYWN0aXZhdGVBcHAiLCJyZW1vdmVBcHAiLCJ0ZXJtaW5hdGVBcHAiLCJpbnN0YWxsQXBwIiwiY2xlYXJBcHAiLCJzdGFydFNlcnZpY2UiLCJzdG9wU2VydmljZSIsInN0YXJ0QWN0aXZpdHkiLCJicm9hZGNhc3QiLCJnZXRDb250ZXh0cyIsInVubG9jayIsInJlZnJlc2hHcHNDYWNoZSIsInN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nIiwiaXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwic3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsImhhcyIsIlVua25vd25Db21tYW5kRXJyb3IiLCJrZXlzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2V4ZWN1dGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycywgUFJPVE9DT0xTIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IGV4dGVuc2lvbnMgPSB7fTtcblxuZXh0ZW5zaW9ucy5leGVjdXRlID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZSAoc2NyaXB0LCBhcmdzKSB7XG4gIGlmIChzY3JpcHQubWF0Y2goL15tb2JpbGU6LykpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBFeGVjdXRpbmcgbmF0aXZlIGNvbW1hbmQgJyR7c2NyaXB0fSdgKTtcbiAgICBzY3JpcHQgPSBzY3JpcHQucmVwbGFjZSgvXm1vYmlsZTovLCAnJykudHJpbSgpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVNb2JpbGUoc2NyaXB0LCBfLmlzQXJyYXkoYXJncykgPyBhcmdzWzBdIDogYXJncyk7XG4gIH1cbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbiAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmRvd25zdHJlYW1Qcm90b2NvbCA9PT0gUFJPVE9DT0xTLk1KU09OV1BcbiAgICA/ICcvZXhlY3V0ZSdcbiAgICA6ICcvZXhlY3V0ZS9zeW5jJztcbiAgcmV0dXJuIGF3YWl0IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZChlbmRwb2ludCwgJ1BPU1QnLCB7XG4gICAgc2NyaXB0LFxuICAgIGFyZ3MsXG4gIH0pO1xufTtcblxuZXh0ZW5zaW9ucy5leGVjdXRlTW9iaWxlID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZU1vYmlsZSAobW9iaWxlQ29tbWFuZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG1vYmlsZUNvbW1hbmRzTWFwcGluZyA9IHtcbiAgICBzaGVsbDogJ21vYmlsZVNoZWxsJyxcblxuICAgIGV4ZWNFbXVDb25zb2xlQ29tbWFuZDogJ21vYmlsZUV4ZWNFbXVDb25zb2xlQ29tbWFuZCcsXG5cbiAgICBzdGFydExvZ3NCcm9hZGNhc3Q6ICdtb2JpbGVTdGFydExvZ3NCcm9hZGNhc3QnLFxuICAgIHN0b3BMb2dzQnJvYWRjYXN0OiAnbW9iaWxlU3RvcExvZ3NCcm9hZGNhc3QnLFxuXG4gICAgY2hhbmdlUGVybWlzc2lvbnM6ICdtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucycsXG4gICAgZ2V0UGVybWlzc2lvbnM6ICdtb2JpbGVHZXRQZXJtaXNzaW9ucycsXG5cbiAgICBwZXJmb3JtRWRpdG9yQWN0aW9uOiAnbW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbicsXG5cbiAgICBzZW5zb3JTZXQ6ICdzZW5zb3JTZXQnLFxuXG4gICAgZ2V0RGV2aWNlVGltZTogJ21vYmlsZUdldERldmljZVRpbWUnLFxuXG4gICAgc3RhcnRTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdGFydFNjcmVlblN0cmVhbWluZycsXG4gICAgc3RvcFNjcmVlblN0cmVhbWluZzogJ21vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcnLFxuXG4gICAgZ2V0Tm90aWZpY2F0aW9uczogJ21vYmlsZUdldE5vdGlmaWNhdGlvbnMnLFxuXG4gICAgbGlzdFNtczogJ21vYmlsZUxpc3RTbXMnLFxuXG4gICAgcHVzaEZpbGU6ICdtb2JpbGVQdXNoRmlsZScsXG4gICAgcHVsbEZpbGU6ICdtb2JpbGVQdWxsRmlsZScsXG4gICAgcHVsbEZvbGRlcjogJ21vYmlsZVB1bGxGb2xkZXInLFxuICAgIGRlbGV0ZUZpbGU6ICdtb2JpbGVEZWxldGVGaWxlJyxcblxuICAgIGlzQXBwSW5zdGFsbGVkOiAnbW9iaWxlSXNBcHBJbnN0YWxsZWQnLFxuICAgIHF1ZXJ5QXBwU3RhdGU6ICdtb2JpbGVRdWVyeUFwcFN0YXRlJyxcbiAgICBhY3RpdmF0ZUFwcDogJ21vYmlsZUFjdGl2YXRlQXBwJyxcbiAgICByZW1vdmVBcHA6ICdtb2JpbGVSZW1vdmVBcHAnLFxuICAgIHRlcm1pbmF0ZUFwcDogJ21vYmlsZVRlcm1pbmF0ZUFwcCcsXG4gICAgaW5zdGFsbEFwcDogJ21vYmlsZUluc3RhbGxBcHAnLFxuICAgIGNsZWFyQXBwOiAnbW9iaWxlQ2xlYXJBcHAnLFxuXG4gICAgc3RhcnRTZXJ2aWNlOiAnbW9iaWxlU3RhcnRTZXJ2aWNlJyxcbiAgICBzdG9wU2VydmljZTogJ21vYmlsZVN0b3BTZXJ2aWNlJyxcbiAgICBzdGFydEFjdGl2aXR5OiAnbW9iaWxlU3RhcnRBY3Rpdml0eScsXG4gICAgYnJvYWRjYXN0OiAnbW9iaWxlQnJvYWRjYXN0JyxcblxuICAgIGdldENvbnRleHRzOiAnbW9iaWxlR2V0Q29udGV4dHMnLFxuXG4gICAgdW5sb2NrOiAnbW9iaWxlVW5sb2NrJyxcblxuICAgIHJlZnJlc2hHcHNDYWNoZTogJ21vYmlsZVJlZnJlc2hHcHNDYWNoZScsXG5cbiAgICBzdGFydE1lZGlhUHJvamVjdGlvblJlY29yZGluZzogJ21vYmlsZVN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nJyxcbiAgICBpc01lZGlhUHJvamVjdGlvblJlY29yZGluZ1J1bm5pbmc6ICdtb2JpbGVJc01lZGlhUHJvamVjdGlvblJlY29yZGluZ1J1bm5pbmcnLFxuICAgIHN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmc6ICdtb2JpbGVTdG9wTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nJyxcbiAgfTtcblxuICBpZiAoIV8uaGFzKG1vYmlsZUNvbW1hbmRzTWFwcGluZywgbW9iaWxlQ29tbWFuZCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLlVua25vd25Db21tYW5kRXJyb3IoYFVua25vd24gbW9iaWxlIGNvbW1hbmQgXCIke21vYmlsZUNvbW1hbmR9XCIuIGAgK1xuICAgICAgYE9ubHkgJHtfLmtleXMobW9iaWxlQ29tbWFuZHNNYXBwaW5nKX0gY29tbWFuZHMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpc1ttb2JpbGVDb21tYW5kc01hcHBpbmdbbW9iaWxlQ29tbWFuZF1dKG9wdHMpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUcsRUFBbkI7O0FBRUFBLFVBQVUsQ0FBQ0MsT0FBWCxHQUFxQixlQUFlQSxPQUFmLENBQXdCQyxNQUF4QixFQUFnQ0MsSUFBaEMsRUFBc0M7RUFDekQsSUFBSUQsTUFBTSxDQUFDRSxLQUFQLENBQWEsVUFBYixDQUFKLEVBQThCO0lBQzVCLEtBQUtDLEdBQUwsQ0FBU0MsSUFBVCxDQUFlLDZCQUE0QkosTUFBTyxHQUFsRDtJQUNBQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQ0ssT0FBUCxDQUFlLFVBQWYsRUFBMkIsRUFBM0IsRUFBK0JDLElBQS9CLEVBQVQ7SUFDQSxPQUFPLE1BQU0sS0FBS0MsYUFBTCxDQUFtQlAsTUFBbkIsRUFBMkJRLGVBQUEsQ0FBRUMsT0FBRixDQUFVUixJQUFWLElBQWtCQSxJQUFJLENBQUMsQ0FBRCxDQUF0QixHQUE0QkEsSUFBdkQsQ0FBYjtFQUNEOztFQUNELElBQUksQ0FBQyxLQUFLUyxZQUFMLEVBQUwsRUFBMEI7SUFDeEIsTUFBTSxJQUFJQyxjQUFBLENBQU9DLG1CQUFYLEVBQU47RUFDRDs7RUFDRCxNQUFNQyxRQUFRLEdBQUcsS0FBS0MsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLGtCQUExQixLQUFpREMsaUJBQUEsQ0FBVUMsT0FBM0QsR0FDYixVQURhLEdBRWIsZUFGSjtFQUdBLE9BQU8sTUFBTSxLQUFLSixZQUFMLENBQWtCQyxPQUFsQixDQUEwQkksT0FBMUIsQ0FBa0NOLFFBQWxDLEVBQTRDLE1BQTVDLEVBQW9EO0lBQy9EYixNQUQrRDtJQUUvREM7RUFGK0QsQ0FBcEQsQ0FBYjtBQUlELENBaEJEOztBQWtCQUgsVUFBVSxDQUFDUyxhQUFYLEdBQTJCLGVBQWVBLGFBQWYsQ0FBOEJhLGFBQTlCLEVBQTZDQyxJQUFJLEdBQUcsRUFBcEQsRUFBd0Q7RUFDakYsTUFBTUMscUJBQXFCLEdBQUc7SUFDNUJDLEtBQUssRUFBRSxhQURxQjtJQUc1QkMscUJBQXFCLEVBQUUsNkJBSEs7SUFLNUJDLGtCQUFrQixFQUFFLDBCQUxRO0lBTTVCQyxpQkFBaUIsRUFBRSx5QkFOUztJQVE1QkMsaUJBQWlCLEVBQUUseUJBUlM7SUFTNUJDLGNBQWMsRUFBRSxzQkFUWTtJQVc1QkMsbUJBQW1CLEVBQUUsMkJBWE87SUFhNUJDLFNBQVMsRUFBRSxXQWJpQjtJQWU1QkMsYUFBYSxFQUFFLHFCQWZhO0lBaUI1QkMsb0JBQW9CLEVBQUUsNEJBakJNO0lBa0I1QkMsbUJBQW1CLEVBQUUsMkJBbEJPO0lBb0I1QkMsZ0JBQWdCLEVBQUUsd0JBcEJVO0lBc0I1QkMsT0FBTyxFQUFFLGVBdEJtQjtJQXdCNUJDLFFBQVEsRUFBRSxnQkF4QmtCO0lBeUI1QkMsUUFBUSxFQUFFLGdCQXpCa0I7SUEwQjVCQyxVQUFVLEVBQUUsa0JBMUJnQjtJQTJCNUJDLFVBQVUsRUFBRSxrQkEzQmdCO0lBNkI1QkMsY0FBYyxFQUFFLHNCQTdCWTtJQThCNUJDLGFBQWEsRUFBRSxxQkE5QmE7SUErQjVCQyxXQUFXLEVBQUUsbUJBL0JlO0lBZ0M1QkMsU0FBUyxFQUFFLGlCQWhDaUI7SUFpQzVCQyxZQUFZLEVBQUUsb0JBakNjO0lBa0M1QkMsVUFBVSxFQUFFLGtCQWxDZ0I7SUFtQzVCQyxRQUFRLEVBQUUsZ0JBbkNrQjtJQXFDNUJDLFlBQVksRUFBRSxvQkFyQ2M7SUFzQzVCQyxXQUFXLEVBQUUsbUJBdENlO0lBdUM1QkMsYUFBYSxFQUFFLHFCQXZDYTtJQXdDNUJDLFNBQVMsRUFBRSxpQkF4Q2lCO0lBMEM1QkMsV0FBVyxFQUFFLG1CQTFDZTtJQTRDNUJDLE1BQU0sRUFBRSxjQTVDb0I7SUE4QzVCQyxlQUFlLEVBQUUsdUJBOUNXO0lBZ0Q1QkMsNkJBQTZCLEVBQUUscUNBaERIO0lBaUQ1QkMsaUNBQWlDLEVBQUUseUNBakRQO0lBa0Q1QkMsNEJBQTRCLEVBQUU7RUFsREYsQ0FBOUI7O0VBcURBLElBQUksQ0FBQ2hELGVBQUEsQ0FBRWlELEdBQUYsQ0FBTW5DLHFCQUFOLEVBQTZCRixhQUE3QixDQUFMLEVBQWtEO0lBQ2hELE1BQU0sSUFBSVQsY0FBQSxDQUFPK0MsbUJBQVgsQ0FBZ0MsMkJBQTBCdEMsYUFBYyxLQUF6QyxHQUNsQyxRQUFPWixlQUFBLENBQUVtRCxJQUFGLENBQU9yQyxxQkFBUCxDQUE4QiwwQkFEbEMsQ0FBTjtFQUVEOztFQUNELE9BQU8sTUFBTSxLQUFLQSxxQkFBcUIsQ0FBQ0YsYUFBRCxDQUExQixFQUEyQ0MsSUFBM0MsQ0FBYjtBQUNELENBM0REOztlQTZEZXZCLFUifQ==
|
|
@@ -17,6 +17,8 @@ var _path = _interopRequireDefault(require("path"));
|
|
|
17
17
|
|
|
18
18
|
var _driver = require("appium/driver");
|
|
19
19
|
|
|
20
|
+
var _utils = require("../utils");
|
|
21
|
+
|
|
20
22
|
const CONTAINER_PATH_MARKER = '@';
|
|
21
23
|
const CONTAINER_PATH_PATTERN = new RegExp(`^${CONTAINER_PATH_MARKER}([^/]+)/(.+)`);
|
|
22
24
|
const ANDROID_MEDIA_RESCAN_INTENT = 'android.intent.action.MEDIA_SCANNER_SCAN_FILE';
|
|
@@ -90,6 +92,13 @@ commands.pullFile = async function pullFile(remotePath) {
|
|
|
90
92
|
}
|
|
91
93
|
};
|
|
92
94
|
|
|
95
|
+
commands.mobilePullFile = async function mobilePullFile(opts = {}) {
|
|
96
|
+
const {
|
|
97
|
+
remotePath
|
|
98
|
+
} = (0, _utils.requireArgs)('remotePath', opts);
|
|
99
|
+
return await this.pullFile(remotePath);
|
|
100
|
+
};
|
|
101
|
+
|
|
93
102
|
commands.pushFile = async function pushFile(remotePath, base64Data) {
|
|
94
103
|
if (remotePath.endsWith('/')) {
|
|
95
104
|
throw new _driver.errors.InvalidArgumentError(`It is expected that remote path points to a file and not to a folder. ` + `'${remotePath}' is given instead`);
|
|
@@ -139,14 +148,32 @@ commands.pushFile = async function pushFile(remotePath, base64Data) {
|
|
|
139
148
|
}
|
|
140
149
|
};
|
|
141
150
|
|
|
151
|
+
commands.mobilePushFile = async function mobilePushFile(opts = {}) {
|
|
152
|
+
const {
|
|
153
|
+
remotePath,
|
|
154
|
+
payload
|
|
155
|
+
} = (0, _utils.requireArgs)(['remotePath', 'payload'], opts);
|
|
156
|
+
return await this.pushFile(remotePath, payload);
|
|
157
|
+
};
|
|
158
|
+
|
|
142
159
|
commands.pullFolder = async function pullFolder(remotePath) {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
160
|
+
const tmpRoot = await _support.tempDir.openDir();
|
|
161
|
+
|
|
162
|
+
try {
|
|
163
|
+
await this.adb.pull(remotePath, tmpRoot);
|
|
164
|
+
return (await _support.zip.toInMemoryZip(tmpRoot, {
|
|
165
|
+
encodeToBase64: true
|
|
166
|
+
})).toString();
|
|
167
|
+
} finally {
|
|
168
|
+
await _support.fs.rimraf(tmpRoot);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
commands.mobilePullFolder = async function mobilePullFolder(opts = {}) {
|
|
173
|
+
const {
|
|
174
|
+
remotePath
|
|
175
|
+
} = (0, _utils.requireArgs)('remotePath', opts);
|
|
176
|
+
return await this.pullFolder(remotePath);
|
|
150
177
|
};
|
|
151
178
|
|
|
152
179
|
async function deleteFileOrFolder(adb, remotePath) {
|
|
@@ -230,4 +257,4 @@ commands.mobileDeleteFile = async function mobileDeleteFile(opts = {}) {
|
|
|
230
257
|
|
|
231
258
|
var _default = commands;
|
|
232
259
|
exports.default = _default;
|
|
233
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT05UQUlORVJfUEFUSF9NQVJLRVIiLCJDT05UQUlORVJfUEFUSF9QQVRURVJOIiwiUmVnRXhwIiwiQU5EUk9JRF9NRURJQV9SRVNDQU5fSU5URU5UIiwiY29tbWFuZHMiLCJwYXJzZUNvbnRhaW5lclBhdGgiLCJyZW1vdGVQYXRoIiwibWF0Y2giLCJleGVjIiwiRXJyb3IiLCJwYXRoIiwicG9zaXgiLCJyZXNvbHZlIiwic2Nhbk1lZGlhIiwiYWRiIiwibG9nIiwiZGVidWciLCJnZXRBcGlMZXZlbCIsInNoZWxsIiwiZSIsIndhcm4iLCJzdGRlcnIiLCJtZXNzYWdlIiwiZXNjYXBlUGF0aCIsInAiLCJyZXBsYWNlIiwicHVsbEZpbGUiLCJlbmRzV2l0aCIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwidG1wRGVzdGluYXRpb24iLCJzdGFydHNXaXRoIiwicGFja2FnZUlkIiwicGF0aEluQ29udGFpbmVyIiwiYmFzZW5hbWUiLCJlcnJvckFuZFRocm93IiwibG9jYWxGaWxlIiwidGVtcERpciIsInByZWZpeCIsInN1ZmZpeCIsInB1bGwiLCJ1dGlsIiwidG9Jbk1lbW9yeUJhc2U2NCIsInRvU3RyaW5nIiwiZnMiLCJleGlzdHMiLCJ1bmxpbmsiLCJwdXNoRmlsZSIsImJhc2U2NERhdGEiLCJfIiwiaXNBcnJheSIsIkJ1ZmZlciIsImZyb20iLCJjb250ZW50Iiwid3JpdGVGaWxlIiwiZGlybmFtZSIsInB1c2giLCJwdWxsRm9sZGVyIiwibG9jYWxGb2xkZXIiLCJ6aXAiLCJ0b0luTWVtb3J5WmlwIiwiZW5jb2RlVG9CYXNlNjQiLCJkZWxldGVGaWxlT3JGb2xkZXIiLCJwZXJmb3JtUmVtb3RlRnNDaGVjayIsIm9wIiwicnVuQXMiLCJwYXNzRmxhZyIsImNoZWNrQ21kIiwiZnVsbENtZCIsImluY2x1ZGVzIiwiaWduIiwiaXNGaWxlIiwiaXNEaXIiLCJpc1ByZXNlbnQiLCJkc3RQYXRoIiwicGtnSWQiLCJpbmZvIiwiZXhwZWN0c0ZpbGUiLCJtb2JpbGVEZWxldGVGaWxlIiwib3B0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9maWxlLWFjdGlvbnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzLCB1dGlsLCB6aXAsIHRlbXBEaXIgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5cbmNvbnN0IENPTlRBSU5FUl9QQVRIX01BUktFUiA9ICdAJztcbi8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvUExkQjBHLzJcbmNvbnN0IENPTlRBSU5FUl9QQVRIX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeJHtDT05UQUlORVJfUEFUSF9NQVJLRVJ9KFteL10rKS8oLispYCk7XG5jb25zdCBBTkRST0lEX01FRElBX1JFU0NBTl9JTlRFTlQgPSAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1FRElBX1NDQU5ORVJfU0NBTl9GSUxFJztcblxuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG4vKipcbiAqIFBhcnNlcyB0aGUgYWN0dWFsIGRlc3RpbmF0aW9uIHBhdGggZnJvbSB0aGUgZ2l2ZW4gdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgcHJlZm9ybWF0dGVkIHJlbW90ZSBwYXRoLCB3aGljaCBsb29rcyBsaWtlXG4gKiBgQG15LmFwcC5pZC9teS9wYXRoYFxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IEFuIGFycmF5LCB3aGVyZSB0aGUgZmlyc3QgaXRlbSBpcyB0aGUgcGFyc2VkIHBhY2thZ2VcbiAqIGlkZW50aWZpZXIgYW5kIHRoZSBzZWNvbmQgb25lIGlzIHRoZSBhY3R1YWwgZGVzdGluYXRpb24gcGF0aCBpbnNpZGUgdGhlIHBhY2thZ2UuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIHN0cmluZyBjYW5ub3QgYmUgcGFyc2VkXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ29udGFpbmVyUGF0aCAocmVtb3RlUGF0aCkge1xuICBjb25zdCBtYXRjaCA9IENPTlRBSU5FUl9QQVRIX1BBVFRFUk4uZXhlYyhyZW1vdGVQYXRoKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSXQgaXMgZXhwZWN0ZWQgdGhhdCBwYWNrYWdlIGlkZW50aWZpZXIgaXMgc2VwYXJhdGVkIGZyb20gdGhlIHJlbGF0aXZlIHBhdGggd2l0aCBhIHNpbmdsZSBzbGFzaC4gYCArXG4gICAgICBgJyR7cmVtb3RlUGF0aH0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgfVxuICByZXR1cm4gW21hdGNoWzFdLCBwYXRoLnBvc2l4LnJlc29sdmUoYC9kYXRhL2RhdGEvJHttYXRjaFsxXX1gLCBtYXRjaFsyXSldO1xufVxuXG4vKipcbiAqIFNjYW5zIHRoZSBnaXZlbiBmaWxlL2ZvbGRlciBvbiB0aGUgcmVtb3RlIGRldmljZVxuICogYW5kIGFkZHMgbWF0Y2hpbmcgaXRlbXMgdG8gdGhlIGRldmljZSdzIG1lZGlhIGxpYnJhcnkuXG4gKiBFeGNlcHRpb25zIGFyZSBpZ25vcmVkIGFuZCB3cml0dGVuIGludG8gdGhlIGxvZy5cbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtPYmplY3Q/fSBsb2cgTG9nZ2VyIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZmlsZS9mb2xkZXIgcGF0aCBvbiB0aGUgcmVtb3RlIGRldmljZVxuICovXG5hc3luYyBmdW5jdGlvbiBzY2FuTWVkaWEgKGFkYiwgcmVtb3RlUGF0aCwgbG9nID0gbnVsbCkge1xuICBsb2c/LmRlYnVnKGBQZXJmb3JtaW5nIG1lZGlhIHNjYW4gb2YgJyR7cmVtb3RlUGF0aH0nYCk7XG4gIHRyeSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE2MTg0XG4gICAgaWYgKGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpID49IDI5KSB7XG4gICAgICBhd2FpdCBhZGIuc2Nhbk1lZGlhKHJlbW90ZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoW1xuICAgICAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAgICAgJy1hJywgQU5EUk9JRF9NRURJQV9SRVNDQU5fSU5URU5ULFxuICAgICAgICAnLWQnLCBgZmlsZTovLyR7cmVtb3RlUGF0aH1gXG4gICAgICBdKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2c/Lndhcm4oYElnbm9yaW5nIGFuIHVuZXhwZWN0ZWQgZXJyb3IgdXBvbiBtZWRpYSBzY2FubmluZyBvZiAnJHtyZW1vdGVQYXRofSc6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICB9XG59XG5cbi8qKlxuICogQSBzbWFsbCBoZWxwZXIsIHdoaWNoIGVzY2FwZXMgc2luZ2xlIHF1b3RlcyBpbiBwYXRocyxcbiAqIHNvIHRoZXkgYXJlIHNhZmUgdG8gYmUgcGFzc2VkIGFzIGFyZ3VtZW50cyBvZiBzaGVsbCBjb21tYW5kc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwIFRoZSBpbml0aWFsIHJlbW90ZSBwYXRoXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZXNjYXBlZCBwYXRoIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVBhdGggKHApIHtcbiAgcmV0dXJuIHAucmVwbGFjZSgvJy9nLCBgXFxcXCdgKTtcbn1cblxuLyoqXG4gKiBQdWxscyBhIHJlbW90ZSBmaWxlIGZyb20gdGhlIGRldmljZS5cbiAqIEl0IGlzIHJlcXVpcmVkLCB0aGF0IGEgcGFja2FnZSBoYXMgZGVidWdnaW5nIGZsYWcgZW5hYmxlZFxuICogaW4gb3JkZXIgdG8gYWNjZXNzIGl0cyBmaWxlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZVxuICogb3IgYSBzcGVjaWFsbHkgZm9ybWF0dGVkIHBhdGgsIHdoaWNoIHBvaW50cyB0byBhbiBpdGVtIGluc2lkZSBhcHAgYnVuZGxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQgZW5jb2RlZCBjb250ZW50IG9mIHRoZSBwdWxsZWQgZmlsZVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwdWxsIG9wZXJhdGlvbiBmYWlsZWRcbiAqL1xuY29tbWFuZHMucHVsbEZpbGUgPSBhc3luYyBmdW5jdGlvbiBwdWxsRmlsZSAocmVtb3RlUGF0aCkge1xuICBpZiAocmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgSXQgaXMgZXhwZWN0ZWQgdGhhdCByZW1vdGUgcGF0aCBwb2ludHMgdG8gYSBmaWxlIGFuZCBub3QgdG8gYSBmb2xkZXIuIGAgK1xuICAgICAgYCcke3JlbW90ZVBhdGh9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgbGV0IHRtcERlc3RpbmF0aW9uID0gbnVsbDtcbiAgaWYgKHJlbW90ZVBhdGguc3RhcnRzV2l0aChDT05UQUlORVJfUEFUSF9NQVJLRVIpKSB7XG4gICAgY29uc3QgW3BhY2thZ2VJZCwgcGF0aEluQ29udGFpbmVyXSA9IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIHBhY2thZ2UgaWRlbnRpZmllciAnJHtwYWNrYWdlSWR9JyBmcm9tICcke3JlbW90ZVBhdGh9Jy4gV2lsbCBnZXQgdGhlIGRhdGEgZnJvbSAnJHtwYXRoSW5Db250YWluZXJ9J2ApO1xuICAgIHRtcERlc3RpbmF0aW9uID0gYC9kYXRhL2xvY2FsL3RtcC8ke3BhdGgucG9zaXguYmFzZW5hbWUocGF0aEluQ29udGFpbmVyKX1gO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ3J1bi1hcycsIHBhY2thZ2VJZCwgYGNobW9kIDc3NyAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9J2BdKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFtcbiAgICAgICAgJ3J1bi1hcycsIHBhY2thZ2VJZCxcbiAgICAgICAgYGNwIC1mICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nICcke2VzY2FwZVBhdGgodG1wRGVzdGluYXRpb24pfSdgXG4gICAgICBdKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgYWNjZXNzIHRoZSBjb250YWluZXIgb2YgJyR7cGFja2FnZUlkfScgYXBwbGljYXRpb24uIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYElzIHRoZSBhcHBsaWNhdGlvbiBpbnN0YWxsZWQgYW5kIGhhcyAnZGVidWdnYWJsZScgYnVpbGQgb3B0aW9uIHNldCB0byB0cnVlPyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGxvY2FsRmlsZSA9IGF3YWl0IHRlbXBEaXIucGF0aCh7cHJlZml4OiAnYXBwaXVtJywgc3VmZml4OiAnLnRtcCd9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5wdWxsKHRtcERlc3RpbmF0aW9uIHx8IHJlbW90ZVBhdGgsIGxvY2FsRmlsZSk7XG4gICAgcmV0dXJuIChhd2FpdCB1dGlsLnRvSW5NZW1vcnlCYXNlNjQobG9jYWxGaWxlKSkudG9TdHJpbmcoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsRmlsZSkpIHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhsb2NhbEZpbGUpO1xuICAgIH1cbiAgICBpZiAodG1wRGVzdGluYXRpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncm0nLCAnLWYnLCB0bXBEZXN0aW5hdGlvbl0pO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBQdXNoZWQgdGhlIGdpdmVuIGRhdGEgdG8gYSBmaWxlIG9uIHRoZSByZW1vdGUgZGV2aWNlXG4gKiBJdCBpcyByZXF1aXJlZCwgdGhhdCBhIHBhY2thZ2UgaGFzIGRlYnVnZ2luZyBmbGFnIGVuYWJsZWRcbiAqIGluIG9yZGVyIHRvIGFjY2VzcyBpdHMgZmlsZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGUgb3JcbiAqIGEgZmlsZSBpbnNpZGUgYSBwYWNrYWdlIGJ1bmRsZVxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NERhdGEgQmFzZTY0IGVuY29kZWQgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZVxuICogcmVtb3RlIGZpbGUuIFRoZSByZW1vdGUgZmlsZSB3aWxsIGJlIHNpbGVudGx5IG92ZXJyaWRkZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHB1c2hpbmcgdGhlIGRhdGFcbiAqL1xuY29tbWFuZHMucHVzaEZpbGUgPSBhc3luYyBmdW5jdGlvbiBwdXNoRmlsZSAocmVtb3RlUGF0aCwgYmFzZTY0RGF0YSkge1xuICBpZiAocmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGBJdCBpcyBleHBlY3RlZCB0aGF0IHJlbW90ZSBwYXRoIHBvaW50cyB0byBhIGZpbGUgYW5kIG5vdCB0byBhIGZvbGRlci4gYCArXG4gICAgICBgJyR7cmVtb3RlUGF0aH0nIGlzIGdpdmVuIGluc3RlYWRgXG4gICAgKTtcbiAgfVxuICBjb25zdCBsb2NhbEZpbGUgPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe3ByZWZpeDogJ2FwcGl1bScsIHN1ZmZpeDogJy50bXAnfSk7XG4gIGlmIChfLmlzQXJyYXkoYmFzZTY0RGF0YSkpIHtcbiAgICAvLyBzb21lIGNsaWVudHMgKGFoZW0pIGphdmEsIHNlbmQgYSBieXRlIGFycmF5IGVuY29kaW5nIHV0ZjggY2hhcmFjdGVyc1xuICAgIC8vIGluc3RlYWQgb2YgYSBzdHJpbmcsIHdoaWNoIHdvdWxkIGJlIGluZmluaXRlbHkgYmV0dGVyIVxuICAgIGJhc2U2NERhdGEgPSBCdWZmZXIuZnJvbShiYXNlNjREYXRhKS50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIGNvbnN0IGNvbnRlbnQgPSBCdWZmZXIuZnJvbShiYXNlNjREYXRhLCAnYmFzZTY0Jyk7XG4gIGxldCB0bXBEZXN0aW5hdGlvbiA9IG51bGw7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGxvY2FsRmlsZSwgY29udGVudC50b1N0cmluZygnYmluYXJ5JyksICdiaW5hcnknKTtcbiAgICBpZiAocmVtb3RlUGF0aC5zdGFydHNXaXRoKENPTlRBSU5FUl9QQVRIX01BUktFUikpIHtcbiAgICAgIGNvbnN0IFtwYWNrYWdlSWQsIHBhdGhJbkNvbnRhaW5lcl0gPSBwYXJzZUNvbnRhaW5lclBhdGgocmVtb3RlUGF0aCk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIHBhY2thZ2UgaWRlbnRpZmllciAnJHtwYWNrYWdlSWR9JyBmcm9tICcke3JlbW90ZVBhdGh9Jy4gYCArXG4gICAgICAgIGBXaWxsIHB1dCB0aGUgZGF0YSBpbnRvICcke3BhdGhJbkNvbnRhaW5lcn0nYCk7XG4gICAgICB0bXBEZXN0aW5hdGlvbiA9IGAvZGF0YS9sb2NhbC90bXAvJHtwYXRoLnBvc2l4LmJhc2VuYW1lKHBhdGhJbkNvbnRhaW5lcil9YDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFxuICAgICAgICAgIFsncnVuLWFzJywgcGFja2FnZUlkLCBgbWtkaXIgLXAgJyR7ZXNjYXBlUGF0aChwYXRoLnBvc2l4LmRpcm5hbWUocGF0aEluQ29udGFpbmVyKSl9J2BdXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncnVuLWFzJywgcGFja2FnZUlkLCBgdG91Y2ggJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfSdgXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncnVuLWFzJywgcGFja2FnZUlkLCBgY2htb2QgNzc3ICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nYF0pO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5wdXNoKGxvY2FsRmlsZSwgdG1wRGVzdGluYXRpb24pO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbXG4gICAgICAgICAgJ3J1bi1hcycsIHBhY2thZ2VJZCxcbiAgICAgICAgICBgY3AgLWYgJyR7ZXNjYXBlUGF0aCh0bXBEZXN0aW5hdGlvbil9JyAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9J2BcbiAgICAgICAgXSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY2Nlc3MgdGhlIGNvbnRhaW5lciBvZiAnJHtwYWNrYWdlSWR9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBJcyB0aGUgYXBwbGljYXRpb24gaW5zdGFsbGVkIGFuZCBoYXMgJ2RlYnVnZ2FibGUnIGJ1aWxkIG9wdGlvbiBzZXQgdG8gdHJ1ZT8gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFkYiBwdXNoIGNyZWF0ZXMgZm9sZGVycyBhbmQgb3ZlcndyaXRlcyBleGlzdGluZyBmaWxlcy5cbiAgICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxGaWxlLCByZW1vdGVQYXRoKTtcblxuICAgICAgLy8gaWYgd2UgaGF2ZSBwdXNoZWQgYSBmaWxlLCBpdCBtaWdodCBiZSBhIG1lZGlhIGZpbGUsIHNvIGVuc3VyZSB0aGF0XG4gICAgICAvLyBhcHBzIGtub3cgYWJvdXQgaXRcbiAgICAgIGF3YWl0IHNjYW5NZWRpYSh0aGlzLmFkYiwgcmVtb3RlUGF0aCwgdGhpcy5sb2cpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsRmlsZSkpIHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhsb2NhbEZpbGUpO1xuICAgIH1cbiAgICBpZiAodG1wRGVzdGluYXRpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncm0nLCAnLWYnLCB0bXBEZXN0aW5hdGlvbl0pO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBQdWxscyB0aGUgd2hvbGUgZm9sZGVyIGZyb20gdGhlIHJlbW90ZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIGEgZm9sZGVyIG9uIHRoZVxuICogcmVtb3RlIGRldmljZSBvciBhIGZvbGRlciBpbnNpZGUgYW4gYXBwbGljYXRpb24gYnVuZGxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQtZW5jb2RlZCBhbmQgemlwcGVkIGNvbnRlbnQgb2YgdGhlIGZvbGRlclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgZ2V0dGluZyB0aGUgZm9sZGVyIGNvbnRlbnRcbiAqL1xuY29tbWFuZHMucHVsbEZvbGRlciA9IGFzeW5jIGZ1bmN0aW9uIHB1bGxGb2xkZXIgKHJlbW90ZVBhdGgpIHtcbiAgbGV0IGxvY2FsRm9sZGVyID0gYXdhaXQgdGVtcERpci5wYXRoKHtwcmVmaXg6ICdhcHBpdW0nfSk7XG4gIGF3YWl0IHRoaXMuYWRiLnB1bGwocmVtb3RlUGF0aCwgbG9jYWxGb2xkZXIpO1xuICByZXR1cm4gKGF3YWl0IHppcC50b0luTWVtb3J5WmlwKGxvY2FsRm9sZGVyLCB7XG4gICAgZW5jb2RlVG9CYXNlNjQ6IHRydWUsXG4gIH0pKS50b1N0cmluZygpO1xufTtcblxuLyoqXG4gKiBEZWxldGVzIHRoZSBnaXZlbiBmb2xkZXIgb3IgZmlsZSBmcm9tIHRoZSByZW1vdGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZvbGRlclxuICogb3IgZmlsZSAoZm9sZGVyIG5hbWVzIG11c3QgZW5kIHdpdGggYSBzaW5nbGUgc2xhc2gpXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb3ZpZGVkIHJlbW90ZSBwYXRoIGlzIGludmFsaWQgb3JcbiAqIHRoZSBwYWNrYWdlIGNvbnRlbnQgY2Fubm90IGJlIGFjY2Vzc2VkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByZW1vdGUgaXRlbSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZC5cbiAqIElmIHRoZSByZW1vdGUgcGF0aCBpcyB2YWxpZCwgYnV0IHRoZSByZW1vdGUgcGF0aCBkb2VzIG5vdCBleGlzdFxuICogdGhpcyBmdW5jdGlvbiByZXR1cm4gYGZhbHNlYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRmlsZU9yRm9sZGVyIChhZGIsIHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgcGVyZm9ybVJlbW90ZUZzQ2hlY2sgPSBhc3luYyAocCwgb3AsIHJ1bkFzID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhc3NGbGFnID0gJ19fUEFTU19fJztcbiAgICBjb25zdCBjaGVja0NtZCA9IGBbIC0ke29wfSAnJHtlc2NhcGVQYXRoKHApfScgXSAmJiBlY2hvICR7cGFzc0ZsYWd9YDtcbiAgICBjb25zdCBmdWxsQ21kID0gcnVuQXMgPyBgcnVuLWFzICR7cnVuQXN9ICR7Y2hlY2tDbWR9YCA6IGNoZWNrQ21kO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gXy5pbmNsdWRlcyhhd2FpdCBhZGIuc2hlbGwoW2Z1bGxDbWRdKSwgcGFzc0ZsYWcpO1xuICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaXNGaWxlID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2YnLCBydW5Bcyk7XG4gIGNvbnN0IGlzRGlyID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2QnLCBydW5Bcyk7XG4gIGNvbnN0IGlzUHJlc2VudCA9IGFzeW5jIChwLCBydW5BcyA9IG51bGwpID0+IGF3YWl0IHBlcmZvcm1SZW1vdGVGc0NoZWNrKHAsICdlJywgcnVuQXMpO1xuXG4gIGxldCBkc3RQYXRoID0gcmVtb3RlUGF0aDtcbiAgbGV0IHBrZ0lkID0gbnVsbDtcbiAgaWYgKHJlbW90ZVBhdGguc3RhcnRzV2l0aChDT05UQUlORVJfUEFUSF9NQVJLRVIpKSB7XG4gICAgY29uc3QgW3BhY2thZ2VJZCwgcGF0aEluQ29udGFpbmVyXSA9IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIHBhY2thZ2UgaWRlbnRpZmllciAnJHtwYWNrYWdlSWR9JyBmcm9tICcke3JlbW90ZVBhdGh9J2ApO1xuICAgIGRzdFBhdGggPSBwYXRoSW5Db250YWluZXI7XG4gICAgcGtnSWQgPSBwYWNrYWdlSWQ7XG4gIH1cblxuICBpZiAocGtnSWQpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsncnVuLWFzJywgcGtnSWQsICdscyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgYWNjZXNzIHRoZSBjb250YWluZXIgb2YgJyR7cGtnSWR9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICAgIGBJcyB0aGUgYXBwbGljYXRpb24gaW5zdGFsbGVkIGFuZCBoYXMgJ2RlYnVnZ2FibGUnIGJ1aWxkIG9wdGlvbiBzZXQgdG8gdHJ1ZT8gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFhd2FpdCBpc1ByZXNlbnQoZHN0UGF0aCwgcGtnSWQpKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIGRvZXMgbm90IGV4aXN0LiBQZXJoYXBzLCBhbHJlYWR5IGRlbGV0ZWQ/YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZXhwZWN0c0ZpbGUgPSAhcmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpO1xuICBpZiAoZXhwZWN0c0ZpbGUgJiYgIWF3YWl0IGlzRmlsZShkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgaXMgbm90IGEgZmlsZWApO1xuICB9IGVsc2UgaWYgKCFleHBlY3RzRmlsZSAmJiAhYXdhaXQgaXNEaXIoZHN0UGF0aCwgcGtnSWQpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIGlzIG5vdCBhIGZvbGRlcmApO1xuICB9XG5cbiAgaWYgKHBrZ0lkKSB7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFxuICAgICAgWydydW4tYXMnLCBwa2dJZCwgYHJtIC1mJHtleHBlY3RzRmlsZSA/ICcnIDogJ3InfSAnJHtlc2NhcGVQYXRoKGRzdFBhdGgpfSdgXSk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFsncm0nLCBgLWYke2V4cGVjdHNGaWxlID8gJycgOiAncid9YCwgZHN0UGF0aF0pO1xuICB9XG4gIGlmIChhd2FpdCBpc1ByZXNlbnQoZHN0UGF0aCwgcGtnSWQpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIHN0aWxsIGV4aXN0cyBhZnRlciBiZWluZyBkZWxldGVkLiBgICtcbiAgICAgIGBJcyBpdCB3cml0YWJsZT9gKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZWxldGVGaWxlT3B0c1xuICogQHByb3BlcnR5IHshc3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlXG4gKiBvciBhIGZpbGUgaW5zaWRlIGFuIGFwcGxpY2F0aW9uIGJ1bmRsZSAoZm9yIGV4YW1wbGUgYEBteS5hcHAuaWQvcGF0aC9pbi9idW5kbGVgKVxuICovXG5cbi8qKlxuICogRGVsZXRlcyBhIGZpbGUgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0RlbGV0ZUZpbGVPcHRzfSBvcHRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByZW1vdGUgZmlsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZC5cbiAqIElmIHRoZSBwYXRoIHRvIGEgcmVtb3RlIGZpbGUgaXMgdmFsaWQsIGJ1dCB0aGUgZmlsZSBpdHNlbGYgZG9lcyBub3QgZXhpc3RcbiAqIHRoZW4gYGZhbHNlYCBpcyByZXR1cm5lZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgYXJndW1lbnQgaXMgaW52YWxpZCBvciB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGVcbiAqIGRlbGV0aW5nIHRoZSBmaWxlXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURlbGV0ZUZpbGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEZWxldGVGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge3JlbW90ZVBhdGh9ID0gb3B0cztcbiAgaWYgKCFyZW1vdGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVGhlICdyZW1vdGVQYXRoJyBhcmd1bWVudCBpcyBtYW5kYXRvcnlgKTtcbiAgfVxuICBpZiAocmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGBJdCBpcyBleHBlY3RlZCB0aGF0IHJlbW90ZSBwYXRoIHBvaW50cyB0byBhIGZvbGRlciBhbmQgbm90IHRvIGEgZmlsZS4gYCArXG4gICAgICBgJyR7cmVtb3RlUGF0aH0nIGlzIGdpdmVuIGluc3RlYWRgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgZGVsZXRlRmlsZU9yRm9sZGVyKHRoaXMuYWRiLCByZW1vdGVQYXRoKTtcbn07XG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxxQkFBcUIsR0FBRyxHQUE5QjtBQUVBLE1BQU1DLHNCQUFzQixHQUFHLElBQUlDLE1BQUosQ0FBWSxJQUFHRixxQkFBc0IsY0FBckMsQ0FBL0I7QUFDQSxNQUFNRywyQkFBMkIsR0FBRywrQ0FBcEM7QUFHQSxNQUFNQyxRQUFRLEdBQUcsRUFBakI7OztBQVdBLFNBQVNDLGtCQUFULENBQTZCQyxVQUE3QixFQUF5QztFQUN2QyxNQUFNQyxLQUFLLEdBQUdOLHNCQUFzQixDQUFDTyxJQUF2QixDQUE0QkYsVUFBNUIsQ0FBZDs7RUFDQSxJQUFJLENBQUNDLEtBQUwsRUFBWTtJQUNWLE1BQU0sSUFBSUUsS0FBSixDQUFXLGtHQUFELEdBQ2IsSUFBR0gsVUFBVyxvQkFEWCxDQUFOO0VBRUQ7O0VBQ0QsT0FBTyxDQUFDQyxLQUFLLENBQUMsQ0FBRCxDQUFOLEVBQVdHLGFBQUEsQ0FBS0MsS0FBTCxDQUFXQyxPQUFYLENBQW9CLGNBQWFMLEtBQUssQ0FBQyxDQUFELENBQUksRUFBMUMsRUFBNkNBLEtBQUssQ0FBQyxDQUFELENBQWxELENBQVgsQ0FBUDtBQUNEOztBQVdELGVBQWVNLFNBQWYsQ0FBMEJDLEdBQTFCLEVBQStCUixVQUEvQixFQUEyQ1MsR0FBRyxHQUFHLElBQWpELEVBQXVEO0VBQ3JEQSxHQUFHLFNBQUgsSUFBQUEsR0FBRyxXQUFILFlBQUFBLEdBQUcsQ0FB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
|
|
260
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT05UQUlORVJfUEFUSF9NQVJLRVIiLCJDT05UQUlORVJfUEFUSF9QQVRURVJOIiwiUmVnRXhwIiwiQU5EUk9JRF9NRURJQV9SRVNDQU5fSU5URU5UIiwiY29tbWFuZHMiLCJwYXJzZUNvbnRhaW5lclBhdGgiLCJyZW1vdGVQYXRoIiwibWF0Y2giLCJleGVjIiwiRXJyb3IiLCJwYXRoIiwicG9zaXgiLCJyZXNvbHZlIiwic2Nhbk1lZGlhIiwiYWRiIiwibG9nIiwiZGVidWciLCJnZXRBcGlMZXZlbCIsInNoZWxsIiwiZSIsIndhcm4iLCJzdGRlcnIiLCJtZXNzYWdlIiwiZXNjYXBlUGF0aCIsInAiLCJyZXBsYWNlIiwicHVsbEZpbGUiLCJlbmRzV2l0aCIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwidG1wRGVzdGluYXRpb24iLCJzdGFydHNXaXRoIiwicGFja2FnZUlkIiwicGF0aEluQ29udGFpbmVyIiwiYmFzZW5hbWUiLCJlcnJvckFuZFRocm93IiwibG9jYWxGaWxlIiwidGVtcERpciIsInByZWZpeCIsInN1ZmZpeCIsInB1bGwiLCJ1dGlsIiwidG9Jbk1lbW9yeUJhc2U2NCIsInRvU3RyaW5nIiwiZnMiLCJleGlzdHMiLCJ1bmxpbmsiLCJtb2JpbGVQdWxsRmlsZSIsIm9wdHMiLCJyZXF1aXJlQXJncyIsInB1c2hGaWxlIiwiYmFzZTY0RGF0YSIsIl8iLCJpc0FycmF5IiwiQnVmZmVyIiwiZnJvbSIsImNvbnRlbnQiLCJ3cml0ZUZpbGUiLCJkaXJuYW1lIiwicHVzaCIsIm1vYmlsZVB1c2hGaWxlIiwicGF5bG9hZCIsInB1bGxGb2xkZXIiLCJ0bXBSb290Iiwib3BlbkRpciIsInppcCIsInRvSW5NZW1vcnlaaXAiLCJlbmNvZGVUb0Jhc2U2NCIsInJpbXJhZiIsIm1vYmlsZVB1bGxGb2xkZXIiLCJkZWxldGVGaWxlT3JGb2xkZXIiLCJwZXJmb3JtUmVtb3RlRnNDaGVjayIsIm9wIiwicnVuQXMiLCJwYXNzRmxhZyIsImNoZWNrQ21kIiwiZnVsbENtZCIsImluY2x1ZGVzIiwiaWduIiwiaXNGaWxlIiwiaXNEaXIiLCJpc1ByZXNlbnQiLCJkc3RQYXRoIiwicGtnSWQiLCJpbmZvIiwiZXhwZWN0c0ZpbGUiLCJtb2JpbGVEZWxldGVGaWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2ZpbGUtYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIHppcCwgdGVtcERpciB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgeyByZXF1aXJlQXJncyB9IGZyb20gJy4uL3V0aWxzJztcblxuXG5jb25zdCBDT05UQUlORVJfUEFUSF9NQVJLRVIgPSAnQCc7XG4vLyBodHRwczovL3JlZ2V4MTAxLmNvbS9yL1BMZEIwRy8yXG5jb25zdCBDT05UQUlORVJfUEFUSF9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiR7Q09OVEFJTkVSX1BBVEhfTUFSS0VSfShbXi9dKykvKC4rKWApO1xuY29uc3QgQU5EUk9JRF9NRURJQV9SRVNDQU5fSU5URU5UID0gJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NRURJQV9TQ0FOTkVSX1NDQU5fRklMRSc7XG5cblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBQYXJzZXMgdGhlIGFjdHVhbCBkZXN0aW5hdGlvbiBwYXRoIGZyb20gdGhlIGdpdmVuIHZhbHVlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIHByZWZvcm1hdHRlZCByZW1vdGUgcGF0aCwgd2hpY2ggbG9va3MgbGlrZVxuICogYEBteS5hcHAuaWQvbXkvcGF0aGBcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBBbiBhcnJheSwgd2hlcmUgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIHBhcnNlZCBwYWNrYWdlXG4gKiBpZGVudGlmaWVyIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyB0aGUgYWN0dWFsIGRlc3RpbmF0aW9uIHBhdGggaW5zaWRlIHRoZSBwYWNrYWdlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBzdHJpbmcgY2Fubm90IGJlIHBhcnNlZFxuICovXG5mdW5jdGlvbiBwYXJzZUNvbnRhaW5lclBhdGggKHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgbWF0Y2ggPSBDT05UQUlORVJfUEFUSF9QQVRURVJOLmV4ZWMocmVtb3RlUGF0aCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEl0IGlzIGV4cGVjdGVkIHRoYXQgcGFja2FnZSBpZGVudGlmaWVyIGlzIHNlcGFyYXRlZCBmcm9tIHRoZSByZWxhdGl2ZSBwYXRoIHdpdGggYSBzaW5nbGUgc2xhc2guIGAgK1xuICAgICAgYCcke3JlbW90ZVBhdGh9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcmV0dXJuIFttYXRjaFsxXSwgcGF0aC5wb3NpeC5yZXNvbHZlKGAvZGF0YS9kYXRhLyR7bWF0Y2hbMV19YCwgbWF0Y2hbMl0pXTtcbn1cblxuLyoqXG4gKiBTY2FucyB0aGUgZ2l2ZW4gZmlsZS9mb2xkZXIgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqIGFuZCBhZGRzIG1hdGNoaW5nIGl0ZW1zIHRvIHRoZSBkZXZpY2UncyBtZWRpYSBsaWJyYXJ5LlxuICogRXhjZXB0aW9ucyBhcmUgaWdub3JlZCBhbmQgd3JpdHRlbiBpbnRvIHRoZSBsb2cuXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0P30gbG9nIExvZ2dlciBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZpbGUvZm9sZGVyIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2Nhbk1lZGlhIChhZGIsIHJlbW90ZVBhdGgsIGxvZyA9IG51bGwpIHtcbiAgbG9nPy5kZWJ1ZyhgUGVyZm9ybWluZyBtZWRpYSBzY2FuIG9mICcke3JlbW90ZVBhdGh9J2ApO1xuICB0cnkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNjE4NFxuICAgIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOSkge1xuICAgICAgYXdhaXQgYWRiLnNjYW5NZWRpYShyZW1vdGVQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFtcbiAgICAgICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgICAgICctYScsIEFORFJPSURfTUVESUFfUkVTQ0FOX0lOVEVOVCxcbiAgICAgICAgJy1kJywgYGZpbGU6Ly8ke3JlbW90ZVBhdGh9YFxuICAgICAgXSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nPy53YXJuKGBJZ25vcmluZyBhbiB1bmV4cGVjdGVkIGVycm9yIHVwb24gbWVkaWEgc2Nhbm5pbmcgb2YgJyR7cmVtb3RlUGF0aH0nOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgc21hbGwgaGVscGVyLCB3aGljaCBlc2NhcGVzIHNpbmdsZSBxdW90ZXMgaW4gcGF0aHMsXG4gKiBzbyB0aGV5IGFyZSBzYWZlIHRvIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgb2Ygc2hlbGwgY29tbWFuZHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcCBUaGUgaW5pdGlhbCByZW1vdGUgcGF0aFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVzY2FwZWQgcGF0aCB2YWx1ZVxuICovXG5mdW5jdGlvbiBlc2NhcGVQYXRoIChwKSB7XG4gIHJldHVybiBwLnJlcGxhY2UoLycvZywgYFxcXFwnYCk7XG59XG5cbi8qKlxuICogUHVsbHMgYSByZW1vdGUgZmlsZSBmcm9tIHRoZSBkZXZpY2UuXG4gKiBJdCBpcyByZXF1aXJlZCwgdGhhdCBhIHBhY2thZ2UgaGFzIGRlYnVnZ2luZyBmbGFnIGVuYWJsZWRcbiAqIGluIG9yZGVyIHRvIGFjY2VzcyBpdHMgZmlsZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBwYXRoLCB3aGljaCBwb2ludHMgdG8gYW4gaXRlbSBpbnNpZGUgYXBwIGJ1bmRsZVxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IGVuY29kZWQgY29udGVudCBvZiB0aGUgcHVsbGVkIGZpbGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHVsbCBvcGVyYXRpb24gZmFpbGVkXG4gKi9cbmNvbW1hbmRzLnB1bGxGaWxlID0gYXN5bmMgZnVuY3Rpb24gcHVsbEZpbGUgKHJlbW90ZVBhdGgpIHtcbiAgaWYgKHJlbW90ZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZmlsZSBhbmQgbm90IHRvIGEgZm9sZGVyLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIGxldCB0bXBEZXN0aW5hdGlvbiA9IG51bGw7XG4gIGlmIChyZW1vdGVQYXRoLnN0YXJ0c1dpdGgoQ09OVEFJTkVSX1BBVEhfTUFSS0VSKSkge1xuICAgIGNvbnN0IFtwYWNrYWdlSWQsIHBhdGhJbkNvbnRhaW5lcl0gPSBwYXJzZUNvbnRhaW5lclBhdGgocmVtb3RlUGF0aCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBwYWNrYWdlIGlkZW50aWZpZXIgJyR7cGFja2FnZUlkfScgZnJvbSAnJHtyZW1vdGVQYXRofScuIFdpbGwgZ2V0IHRoZSBkYXRhIGZyb20gJyR7cGF0aEluQ29udGFpbmVyfSdgKTtcbiAgICB0bXBEZXN0aW5hdGlvbiA9IGAvZGF0YS9sb2NhbC90bXAvJHtwYXRoLnBvc2l4LmJhc2VuYW1lKHBhdGhJbkNvbnRhaW5lcil9YDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydydW4tYXMnLCBwYWNrYWdlSWQsIGBjaG1vZCA3NzcgJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfSdgXSk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbXG4gICAgICAgICdydW4tYXMnLCBwYWNrYWdlSWQsXG4gICAgICAgIGBjcCAtZiAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9JyAnJHtlc2NhcGVQYXRoKHRtcERlc3RpbmF0aW9uKX0nYFxuICAgICAgXSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGFjY2VzcyB0aGUgY29udGFpbmVyIG9mICcke3BhY2thZ2VJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBJcyB0aGUgYXBwbGljYXRpb24gaW5zdGFsbGVkIGFuZCBoYXMgJ2RlYnVnZ2FibGUnIGJ1aWxkIG9wdGlvbiBzZXQgdG8gdHJ1ZT8gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBsb2NhbEZpbGUgPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe3ByZWZpeDogJ2FwcGl1bScsIHN1ZmZpeDogJy50bXAnfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5hZGIucHVsbCh0bXBEZXN0aW5hdGlvbiB8fCByZW1vdGVQYXRoLCBsb2NhbEZpbGUpO1xuICAgIHJldHVybiAoYXdhaXQgdXRpbC50b0luTWVtb3J5QmFzZTY0KGxvY2FsRmlsZSkpLnRvU3RyaW5nKCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhsb2NhbEZpbGUpKSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxGaWxlKTtcbiAgICB9XG4gICAgaWYgKHRtcERlc3RpbmF0aW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ3JtJywgJy1mJywgdG1wRGVzdGluYXRpb25dKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUHVsbEZpbGVPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZVxuICogb3IgYSBzcGVjaWFsbHkgZm9ybWF0dGVkIHBhdGgsIHdoaWNoIHBvaW50cyB0byBhbiBpdGVtIGluc2lkZSBhbiBhcHAgYnVuZGxlLFxuICogZm9yIGV4YW1wbGUgYEBteS5hcHAuaWQvbXkvcGF0aGAuIEl0IGlzIG1hbmRhdG9yeSBmb3IgdGhlIGFwcCBidW5kbGUgdG8gaGF2ZVxuICogZGVidWdnaW5nIGVuYWJsZWQgaW4gb3JkZXIgdG8gdXNlIHRoZSBsYXR0ZXIgcmVtb3RlUGF0aCBmb3JtYXQuXG4gKi9cblxuLyoqXG4gKiBQdWxscyBhIHJlbW90ZSBmaWxlIGZyb20gdGhlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge1B1bGxGaWxlT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNhbWUgYXMgYHB1bGxGaWxlYFxuICovXG5jb21tYW5kcy5tb2JpbGVQdWxsRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVB1bGxGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyByZW1vdGVQYXRoIH0gPSByZXF1aXJlQXJncygncmVtb3RlUGF0aCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wdWxsRmlsZShyZW1vdGVQYXRoKTtcbn07XG5cbi8qKlxuICogUHVzaGVzIHRoZSBnaXZlbiBkYXRhIHRvIGEgZmlsZSBvbiB0aGUgcmVtb3RlIGRldmljZVxuICogSXQgaXMgcmVxdWlyZWQsIHRoYXQgYSBwYWNrYWdlIGhhcyBkZWJ1Z2dpbmcgZmxhZyBlbmFibGVkXG4gKiBpbiBvcmRlciB0byBhY2Nlc3MgaXRzIGZpbGVzLlxuICogQWZ0ZXIgYSBmaWxlIGlzIHB1c2hlZCBpdCBnZXRzIGF1dG9tYXRpY2FsbHkgc2Nhbm5lZCBmb3IgcG9zc2libGVcbiAqIG1lZGlhIG9jY3VycmVuY2VzLiBJZiB0aGUgc2NhbiBzdWNjZWVkcyB0aGVuIHRoZSBmaWxlIGlzIGFkZGVkIHRvIHRoZVxuICogbWVkaWEgbGlicmFyeS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZSBvclxuICogYSBmaWxlIGluc2lkZSBhIHBhY2thZ2UgYnVuZGxlXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZTY0RGF0YSBCYXNlNjQgZW5jb2RlZCBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlXG4gKiByZW1vdGUgZmlsZS4gVGhlIHJlbW90ZSBmaWxlIHdpbGwgYmUgc2lsZW50bHkgb3ZlcnJpZGRlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcHVzaGluZyB0aGUgZGF0YVxuICovXG5jb21tYW5kcy5wdXNoRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIHB1c2hGaWxlIChyZW1vdGVQYXRoLCBiYXNlNjREYXRhKSB7XG4gIGlmIChyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZmlsZSBhbmQgbm90IHRvIGEgZm9sZGVyLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGBcbiAgICApO1xuICB9XG4gIGNvbnN0IGxvY2FsRmlsZSA9IGF3YWl0IHRlbXBEaXIucGF0aCh7cHJlZml4OiAnYXBwaXVtJywgc3VmZml4OiAnLnRtcCd9KTtcbiAgaWYgKF8uaXNBcnJheShiYXNlNjREYXRhKSkge1xuICAgIC8vIHNvbWUgY2xpZW50cyAoYWhlbSkgamF2YSwgc2VuZCBhIGJ5dGUgYXJyYXkgZW5jb2RpbmcgdXRmOCBjaGFyYWN0ZXJzXG4gICAgLy8gaW5zdGVhZCBvZiBhIHN0cmluZywgd2hpY2ggd291bGQgYmUgaW5maW5pdGVseSBiZXR0ZXIhXG4gICAgYmFzZTY0RGF0YSA9IEJ1ZmZlci5mcm9tKGJhc2U2NERhdGEpLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cbiAgY29uc3QgY29udGVudCA9IEJ1ZmZlci5mcm9tKGJhc2U2NERhdGEsICdiYXNlNjQnKTtcbiAgbGV0IHRtcERlc3RpbmF0aW9uID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUobG9jYWxGaWxlLCBjb250ZW50LnRvU3RyaW5nKCdiaW5hcnknKSwgJ2JpbmFyeScpO1xuICAgIGlmIChyZW1vdGVQYXRoLnN0YXJ0c1dpdGgoQ09OVEFJTkVSX1BBVEhfTUFSS0VSKSkge1xuICAgICAgY29uc3QgW3BhY2thZ2VJZCwgcGF0aEluQ29udGFpbmVyXSA9IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBpZGVudGlmaWVyICcke3BhY2thZ2VJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nLiBgICtcbiAgICAgICAgYFdpbGwgcHV0IHRoZSBkYXRhIGludG8gJyR7cGF0aEluQ29udGFpbmVyfSdgKTtcbiAgICAgIHRtcERlc3RpbmF0aW9uID0gYC9kYXRhL2xvY2FsL3RtcC8ke3BhdGgucG9zaXguYmFzZW5hbWUocGF0aEluQ29udGFpbmVyKX1gO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoXG4gICAgICAgICAgWydydW4tYXMnLCBwYWNrYWdlSWQsIGBta2RpciAtcCAnJHtlc2NhcGVQYXRoKHBhdGgucG9zaXguZGlybmFtZShwYXRoSW5Db250YWluZXIpKX0nYF1cbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydydW4tYXMnLCBwYWNrYWdlSWQsIGB0b3VjaCAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9J2BdKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydydW4tYXMnLCBwYWNrYWdlSWQsIGBjaG1vZCA3NzcgJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfSdgXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxGaWxlLCB0bXBEZXN0aW5hdGlvbik7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFtcbiAgICAgICAgICAncnVuLWFzJywgcGFja2FnZUlkLFxuICAgICAgICAgIGBjcCAtZiAnJHtlc2NhcGVQYXRoKHRtcERlc3RpbmF0aW9uKX0nICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nYFxuICAgICAgICBdKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGFjY2VzcyB0aGUgY29udGFpbmVyIG9mICcke3BhY2thZ2VJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYElzIHRoZSBhcHBsaWNhdGlvbiBpbnN0YWxsZWQgYW5kIGhhcyAnZGVidWdnYWJsZScgYnVpbGQgb3B0aW9uIHNldCB0byB0cnVlPyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYWRiIHB1c2ggY3JlYXRlcyBmb2xkZXJzIGFuZCBvdmVyd3JpdGVzIGV4aXN0aW5nIGZpbGVzLlxuICAgICAgYXdhaXQgdGhpcy5hZGIucHVzaChsb2NhbEZpbGUsIHJlbW90ZVBhdGgpO1xuXG4gICAgICAvLyBpZiB3ZSBoYXZlIHB1c2hlZCBhIGZpbGUsIGl0IG1pZ2h0IGJlIGEgbWVkaWEgZmlsZSwgc28gZW5zdXJlIHRoYXRcbiAgICAgIC8vIGFwcHMga25vdyBhYm91dCBpdFxuICAgICAgYXdhaXQgc2Nhbk1lZGlhKHRoaXMuYWRiLCByZW1vdGVQYXRoLCB0aGlzLmxvZyk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxGaWxlKSkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gICAgfVxuICAgIGlmICh0bXBEZXN0aW5hdGlvbikge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydybScsICctZicsIHRtcERlc3RpbmF0aW9uXSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFB1c2hGaWxlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBwYXRoLCB3aGljaCBwb2ludHMgdG8gYW4gaXRlbSBpbnNpZGUgYW4gYXBwIGJ1bmRsZSxcbiAqIGZvciBleGFtcGxlIGBAbXkuYXBwLmlkL215L3BhdGhgLiBJdCBpcyBtYW5kYXRvcnkgZm9yIHRoZSBhcHAgYnVuZGxlIHRvIGhhdmVcbiAqIGRlYnVnZ2luZyBlbmFibGVkIGluIG9yZGVyIHRvIHVzZSB0aGUgbGF0dGVyIHJlbW90ZVBhdGggZm9ybWF0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBheWxvYWQgQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgZmlsZSB0byBiZSBwdXNoZWQuXG4gKi9cblxuLyoqXG4gKiBQdXNoZXMgdGhlIGdpdmVuIGRhdGEgdG8gYSBmaWxlIG9uIHRoZSByZW1vdGUgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSB7UHVzaEZpbGVPcHRpb25zfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVB1c2hGaWxlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUHVzaEZpbGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHJlbW90ZVBhdGgsIHBheWxvYWQgfSA9IHJlcXVpcmVBcmdzKFsncmVtb3RlUGF0aCcsICdwYXlsb2FkJ10sIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wdXNoRmlsZShyZW1vdGVQYXRoLCBwYXlsb2FkKTtcbn07XG5cbi8qKlxuICogUHVsbHMgdGhlIHdob2xlIGZvbGRlciBmcm9tIHRoZSByZW1vdGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byBhIGZvbGRlciBvbiB0aGVcbiAqIHJlbW90ZSBkZXZpY2Ugb3IgYSBmb2xkZXIgaW5zaWRlIGFuIGFwcGxpY2F0aW9uIGJ1bmRsZVxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0LWVuY29kZWQgYW5kIHppcHBlZCBjb250ZW50IG9mIHRoZSBmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGdldHRpbmcgdGhlIGZvbGRlciBjb250ZW50XG4gKi9cbmNvbW1hbmRzLnB1bGxGb2xkZXIgPSBhc3luYyBmdW5jdGlvbiBwdWxsRm9sZGVyIChyZW1vdGVQYXRoKSB7XG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5wdWxsKHJlbW90ZVBhdGgsIHRtcFJvb3QpO1xuICAgIHJldHVybiAoYXdhaXQgemlwLnRvSW5NZW1vcnlaaXAodG1wUm9vdCwge1xuICAgICAgZW5jb2RlVG9CYXNlNjQ6IHRydWUsXG4gICAgfSkpLnRvU3RyaW5nKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFB1bGxGb2xkZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZm9sZGVyLlxuICovXG5cbi8qKlxuICogUHVsbHMgdGhlIHdob2xlIGZvbGRlciBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge1B1bGxGb2xkZXJPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2FtZSBhcyBgcHVsbEZvbGRlcmBcbiAqL1xuY29tbWFuZHMubW9iaWxlUHVsbEZvbGRlciA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVB1bGxGb2xkZXIgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHJlbW90ZVBhdGggfSA9IHJlcXVpcmVBcmdzKCdyZW1vdGVQYXRoJywgb3B0cyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnB1bGxGb2xkZXIocmVtb3RlUGF0aCk7XG59O1xuXG4vKipcbiAqIERlbGV0ZXMgdGhlIGdpdmVuIGZvbGRlciBvciBmaWxlIGZyb20gdGhlIHJlbW90ZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZm9sZGVyXG4gKiBvciBmaWxlIChmb2xkZXIgbmFtZXMgbXVzdCBlbmQgd2l0aCBhIHNpbmdsZSBzbGFzaClcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvdmlkZWQgcmVtb3RlIHBhdGggaXMgaW52YWxpZCBvclxuICogdGhlIHBhY2thZ2UgY29udGVudCBjYW5ub3QgYmUgYWNjZXNzZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHJlbW90ZSBpdGVtIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxldGVkLlxuICogSWYgdGhlIHJlbW90ZSBwYXRoIGlzIHZhbGlkLCBidXQgdGhlIHJlbW90ZSBwYXRoIGRvZXMgbm90IGV4aXN0XG4gKiB0aGlzIGZ1bmN0aW9uIHJldHVybiBgZmFsc2VgLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVGaWxlT3JGb2xkZXIgKGFkYiwgcmVtb3RlUGF0aCkge1xuICBjb25zdCBwZXJmb3JtUmVtb3RlRnNDaGVjayA9IGFzeW5jIChwLCBvcCwgcnVuQXMgPSBudWxsKSA9PiB7XG4gICAgY29uc3QgcGFzc0ZsYWcgPSAnX19QQVNTX18nO1xuICAgIGNvbnN0IGNoZWNrQ21kID0gYFsgLSR7b3B9ICcke2VzY2FwZVBhdGgocCl9JyBdICYmIGVjaG8gJHtwYXNzRmxhZ31gO1xuICAgIGNvbnN0IGZ1bGxDbWQgPSBydW5BcyA/IGBydW4tYXMgJHtydW5Bc30gJHtjaGVja0NtZH1gIDogY2hlY2tDbWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBfLmluY2x1ZGVzKGF3YWl0IGFkYi5zaGVsbChbZnVsbENtZF0pLCBwYXNzRmxhZyk7XG4gICAgfSBjYXRjaCAoaWduKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBpc0ZpbGUgPSBhc3luYyAocCwgcnVuQXMgPSBudWxsKSA9PiBhd2FpdCBwZXJmb3JtUmVtb3RlRnNDaGVjayhwLCAnZicsIHJ1bkFzKTtcbiAgY29uc3QgaXNEaXIgPSBhc3luYyAocCwgcnVuQXMgPSBudWxsKSA9PiBhd2FpdCBwZXJmb3JtUmVtb3RlRnNDaGVjayhwLCAnZCcsIHJ1bkFzKTtcbiAgY29uc3QgaXNQcmVzZW50ID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2UnLCBydW5Bcyk7XG5cbiAgbGV0IGRzdFBhdGggPSByZW1vdGVQYXRoO1xuICBsZXQgcGtnSWQgPSBudWxsO1xuICBpZiAocmVtb3RlUGF0aC5zdGFydHNXaXRoKENPTlRBSU5FUl9QQVRIX01BUktFUikpIHtcbiAgICBjb25zdCBbcGFja2FnZUlkLCBwYXRoSW5Db250YWluZXJdID0gcGFyc2VDb250YWluZXJQYXRoKHJlbW90ZVBhdGgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBpZGVudGlmaWVyICcke3BhY2thZ2VJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nYCk7XG4gICAgZHN0UGF0aCA9IHBhdGhJbkNvbnRhaW5lcjtcbiAgICBwa2dJZCA9IHBhY2thZ2VJZDtcbiAgfVxuXG4gIGlmIChwa2dJZCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydydW4tYXMnLCBwa2dJZCwgJ2xzJ10pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY2Nlc3MgdGhlIGNvbnRhaW5lciBvZiAnJHtwa2dJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgYElzIHRoZSBhcHBsaWNhdGlvbiBpbnN0YWxsZWQgYW5kIGhhcyAnZGVidWdnYWJsZScgYnVpbGQgb3B0aW9uIHNldCB0byB0cnVlPyBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWF3YWl0IGlzUHJlc2VudChkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgZG9lcyBub3QgZXhpc3QuIFBlcmhhcHMsIGFscmVhZHkgZGVsZXRlZD9gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBleHBlY3RzRmlsZSA9ICFyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJyk7XG4gIGlmIChleHBlY3RzRmlsZSAmJiAhYXdhaXQgaXNGaWxlKGRzdFBhdGgsIHBrZ0lkKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYFRoZSBpdGVtIGF0ICcke2RzdFBhdGh9JyBpcyBub3QgYSBmaWxlYCk7XG4gIH0gZWxzZSBpZiAoIWV4cGVjdHNGaWxlICYmICFhd2FpdCBpc0Rpcihkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgaXMgbm90IGEgZm9sZGVyYCk7XG4gIH1cblxuICBpZiAocGtnSWQpIHtcbiAgICBhd2FpdCBhZGIuc2hlbGwoXG4gICAgICBbJ3J1bi1hcycsIHBrZ0lkLCBgcm0gLWYke2V4cGVjdHNGaWxlID8gJycgOiAncid9ICcke2VzY2FwZVBhdGgoZHN0UGF0aCl9J2BdKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBhZGIuc2hlbGwoWydybScsIGAtZiR7ZXhwZWN0c0ZpbGUgPyAnJyA6ICdyJ31gLCBkc3RQYXRoXSk7XG4gIH1cbiAgaWYgKGF3YWl0IGlzUHJlc2VudChkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgc3RpbGwgZXhpc3RzIGFmdGVyIGJlaW5nIGRlbGV0ZWQuIGAgK1xuICAgICAgYElzIGl0IHdyaXRhYmxlP2ApO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERlbGV0ZUZpbGVPcHRzXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgZmlsZSBpbnNpZGUgYW4gYXBwbGljYXRpb24gYnVuZGxlIChmb3IgZXhhbXBsZSBgQG15LmFwcC5pZC9wYXRoL2luL2J1bmRsZWApXG4gKi9cblxuLyoqXG4gKiBEZWxldGVzIGEgZmlsZSBvbiB0aGUgcmVtb3RlIGRldmljZVxuICpcbiAqIEBwYXJhbSB7RGVsZXRlRmlsZU9wdHN9IG9wdHNcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHJlbW90ZSBmaWxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxldGVkLlxuICogSWYgdGhlIHBhdGggdG8gYSByZW1vdGUgZmlsZSBpcyB2YWxpZCwgYnV0IHRoZSBmaWxlIGl0c2VsZiBkb2VzIG5vdCBleGlzdFxuICogdGhlbiBgZmFsc2VgIGlzIHJldHVybmVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBhcmd1bWVudCBpcyBpbnZhbGlkIG9yIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZVxuICogZGVsZXRpbmcgdGhlIGZpbGVcbiAqL1xuY29tbWFuZHMubW9iaWxlRGVsZXRlRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZURlbGV0ZUZpbGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7cmVtb3RlUGF0aH0gPSBvcHRzO1xuICBpZiAoIXJlbW90ZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBUaGUgJ3JlbW90ZVBhdGgnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG4gIGlmIChyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZm9sZGVyIGFuZCBub3QgdG8gYSBmaWxlLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGBcbiAgICApO1xuICB9XG4gIHJldHVybiBhd2FpdCBkZWxldGVGaWxlT3JGb2xkZXIodGhpcy5hZGIsIHJlbW90ZVBhdGgpO1xufTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLHFCQUFxQixHQUFHLEdBQTlCO0FBRUEsTUFBTUMsc0JBQXNCLEdBQUcsSUFBSUMsTUFBSixDQUFZLElBQUdGLHFCQUFzQixjQUFyQyxDQUEvQjtBQUNBLE1BQU1HLDJCQUEyQixHQUFHLCtDQUFwQztBQUdBLE1BQU1DLFFBQVEsR0FBRyxFQUFqQjs7O0FBV0EsU0FBU0Msa0JBQVQsQ0FBNkJDLFVBQTdCLEVBQXlDO0VBQ3ZDLE1BQU1DLEtB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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.requireArgs = requireArgs;
|
|
9
|
+
|
|
10
|
+
require("source-map-support/register");
|
|
11
|
+
|
|
12
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
+
|
|
14
|
+
var _driver = require("appium/driver");
|
|
15
|
+
|
|
16
|
+
function requireArgs(argNames, opts = {}) {
|
|
17
|
+
for (const argName of _lodash.default.isArray(argNames) ? argNames : [argNames]) {
|
|
18
|
+
if (!_lodash.default.has(opts, argName)) {
|
|
19
|
+
throw new _driver.errors.InvalidArgumentError(`'${argName}' argument must be provided`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return opts;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1aXJlQXJncyIsImFyZ05hbWVzIiwib3B0cyIsImFyZ05hbWUiLCJfIiwiaXNBcnJheSIsImhhcyIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuXG4vKipcbiAqIEFzc2VydCB0aGUgcHJlc2VuY2Ugb2YgcGFydGljdWxhciBrZXlzIGluIHRoZSBnaXZlbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSBhcmdOYW1lcyBvbmUgb3IgbW9yZSBrZXkgbmFtZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIHRoZSBvYmplY3QgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtPYmplY3R9IHRoZSBzYW1lIGdpdmVuIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUFyZ3MgKGFyZ05hbWVzLCBvcHRzID0ge30pIHtcbiAgZm9yIChjb25zdCBhcmdOYW1lIG9mIChfLmlzQXJyYXkoYXJnTmFtZXMpID8gYXJnTmFtZXMgOiBbYXJnTmFtZXNdKSkge1xuICAgIGlmICghXy5oYXMob3B0cywgYXJnTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCcke2FyZ05hbWV9JyBhcmd1bWVudCBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvcHRzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQVVPLFNBQVNBLFdBQVQsQ0FBc0JDLFFBQXRCLEVBQWdDQyxJQUFJLEdBQUcsRUFBdkMsRUFBMkM7RUFDaEQsS0FBSyxNQUFNQyxPQUFYLElBQXVCQyxlQUFBLENBQUVDLE9BQUYsQ0FBVUosUUFBVixJQUFzQkEsUUFBdEIsR0FBaUMsQ0FBQ0EsUUFBRCxDQUF4RCxFQUFxRTtJQUNuRSxJQUFJLENBQUNHLGVBQUEsQ0FBRUUsR0FBRixDQUFNSixJQUFOLEVBQVlDLE9BQVosQ0FBTCxFQUEyQjtNQUN6QixNQUFNLElBQUlJLGNBQUEsQ0FBT0Msb0JBQVgsQ0FBaUMsSUFBR0wsT0FBUSw2QkFBNUMsQ0FBTjtJQUNEO0VBQ0Y7O0VBQ0QsT0FBT0QsSUFBUDtBQUNEIn0=
|
|
@@ -3,28 +3,13 @@ import { waitForCondition } from 'asyncbox';
|
|
|
3
3
|
import { util } from 'appium/support';
|
|
4
4
|
import { APP_STATE } from '../android-helpers';
|
|
5
5
|
import { errors } from 'appium/driver';
|
|
6
|
+
import { requireArgs } from '../utils';
|
|
6
7
|
|
|
7
8
|
const APP_EXTENSIONS = ['.apk', '.apks'];
|
|
8
9
|
const RESOLVER_ACTIVITY_NAME = 'android/com.android.internal.app.ResolverActivity';
|
|
9
10
|
|
|
10
11
|
const commands = {};
|
|
11
12
|
|
|
12
|
-
/**
|
|
13
|
-
* Assert the presence of particular keys in the given object
|
|
14
|
-
*
|
|
15
|
-
* @param {string|Array<string>} argNames one or more key names
|
|
16
|
-
* @param {Object} opts the object to check
|
|
17
|
-
* @returns {Object} the same given object
|
|
18
|
-
*/
|
|
19
|
-
function requireArgs (argNames, opts = {}) {
|
|
20
|
-
for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {
|
|
21
|
-
if (!_.has(opts, argName)) {
|
|
22
|
-
throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return opts;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
13
|
/**
|
|
29
14
|
* Verify whether an application is installed or not
|
|
30
15
|
*
|
package/lib/commands/execute.js
CHANGED
|
@@ -46,6 +46,9 @@ extensions.executeMobile = async function executeMobile (mobileCommand, opts = {
|
|
|
46
46
|
|
|
47
47
|
listSms: 'mobileListSms',
|
|
48
48
|
|
|
49
|
+
pushFile: 'mobilePushFile',
|
|
50
|
+
pullFile: 'mobilePullFile',
|
|
51
|
+
pullFolder: 'mobilePullFolder',
|
|
49
52
|
deleteFile: 'mobileDeleteFile',
|
|
50
53
|
|
|
51
54
|
isAppInstalled: 'mobileIsAppInstalled',
|
|
@@ -2,6 +2,7 @@ import _ from 'lodash';
|
|
|
2
2
|
import { fs, util, zip, tempDir } from 'appium/support';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import { errors } from 'appium/driver';
|
|
5
|
+
import { requireArgs } from '../utils';
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
const CONTAINER_PATH_MARKER = '@';
|
|
@@ -115,9 +116,31 @@ commands.pullFile = async function pullFile (remotePath) {
|
|
|
115
116
|
};
|
|
116
117
|
|
|
117
118
|
/**
|
|
118
|
-
*
|
|
119
|
+
* @typedef {Object} PullFileOptions
|
|
120
|
+
* @property {string} remotePath The full path to the remote file
|
|
121
|
+
* or a specially formatted path, which points to an item inside an app bundle,
|
|
122
|
+
* for example `@my.app.id/my/path`. It is mandatory for the app bundle to have
|
|
123
|
+
* debugging enabled in order to use the latter remotePath format.
|
|
124
|
+
*/
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Pulls a remote file from the device.
|
|
128
|
+
*
|
|
129
|
+
* @param {PullFileOptions} opts
|
|
130
|
+
* @returns {string} The same as `pullFile`
|
|
131
|
+
*/
|
|
132
|
+
commands.mobilePullFile = async function mobilePullFile (opts = {}) {
|
|
133
|
+
const { remotePath } = requireArgs('remotePath', opts);
|
|
134
|
+
return await this.pullFile(remotePath);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Pushes the given data to a file on the remote device
|
|
119
139
|
* It is required, that a package has debugging flag enabled
|
|
120
140
|
* in order to access its files.
|
|
141
|
+
* After a file is pushed it gets automatically scanned for possible
|
|
142
|
+
* media occurrences. If the scan succeeds then the file is added to the
|
|
143
|
+
* media library.
|
|
121
144
|
*
|
|
122
145
|
* @param {string} remotePath The full path to the remote file or
|
|
123
146
|
* a file inside a package bundle
|
|
@@ -181,6 +204,25 @@ commands.pushFile = async function pushFile (remotePath, base64Data) {
|
|
|
181
204
|
}
|
|
182
205
|
};
|
|
183
206
|
|
|
207
|
+
/**
|
|
208
|
+
* @typedef {Object} PushFileOptions
|
|
209
|
+
* @property {string} remotePath The full path to the remote file
|
|
210
|
+
* or a specially formatted path, which points to an item inside an app bundle,
|
|
211
|
+
* for example `@my.app.id/my/path`. It is mandatory for the app bundle to have
|
|
212
|
+
* debugging enabled in order to use the latter remotePath format.
|
|
213
|
+
* @property {string} payload Base64-encoded content of the file to be pushed.
|
|
214
|
+
*/
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Pushes the given data to a file on the remote device.
|
|
218
|
+
*
|
|
219
|
+
* @param {PushFileOptions} opts
|
|
220
|
+
*/
|
|
221
|
+
commands.mobilePushFile = async function mobilePushFile (opts = {}) {
|
|
222
|
+
const { remotePath, payload } = requireArgs(['remotePath', 'payload'], opts);
|
|
223
|
+
return await this.pushFile(remotePath, payload);
|
|
224
|
+
};
|
|
225
|
+
|
|
184
226
|
/**
|
|
185
227
|
* Pulls the whole folder from the remote device
|
|
186
228
|
*
|
|
@@ -190,11 +232,31 @@ commands.pushFile = async function pushFile (remotePath, base64Data) {
|
|
|
190
232
|
* @throws {Error} If there was a failure while getting the folder content
|
|
191
233
|
*/
|
|
192
234
|
commands.pullFolder = async function pullFolder (remotePath) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
235
|
+
const tmpRoot = await tempDir.openDir();
|
|
236
|
+
try {
|
|
237
|
+
await this.adb.pull(remotePath, tmpRoot);
|
|
238
|
+
return (await zip.toInMemoryZip(tmpRoot, {
|
|
239
|
+
encodeToBase64: true,
|
|
240
|
+
})).toString();
|
|
241
|
+
} finally {
|
|
242
|
+
await fs.rimraf(tmpRoot);
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* @typedef {Object} PullFolderOptions
|
|
248
|
+
* @property {string} remotePath The full path to the remote folder.
|
|
249
|
+
*/
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Pulls the whole folder from the device under test.
|
|
253
|
+
*
|
|
254
|
+
* @param {PullFolderOptions} opts
|
|
255
|
+
* @returns {string} The same as `pullFolder`
|
|
256
|
+
*/
|
|
257
|
+
commands.mobilePullFolder = async function mobilePullFolder (opts = {}) {
|
|
258
|
+
const { remotePath } = requireArgs('remotePath', opts);
|
|
259
|
+
return await this.pullFolder(remotePath);
|
|
198
260
|
};
|
|
199
261
|
|
|
200
262
|
/**
|
package/lib/utils.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import { errors } from 'appium/driver';
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Assert the presence of particular keys in the given object
|
|
7
|
+
*
|
|
8
|
+
* @param {string|Array<string>} argNames one or more key names
|
|
9
|
+
* @param {Object} opts the object to check
|
|
10
|
+
* @returns {Object} the same given object
|
|
11
|
+
*/
|
|
12
|
+
export function requireArgs (argNames, opts = {}) {
|
|
13
|
+
for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {
|
|
14
|
+
if (!_.has(opts, argName)) {
|
|
15
|
+
throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return opts;
|
|
19
|
+
}
|