appium-android-driver 5.13.1 → 5.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/build/index.js +43 -40
  3. package/build/lib/android-helpers.d.ts +136 -0
  4. package/build/lib/android-helpers.d.ts.map +1 -0
  5. package/build/lib/android-helpers.js +760 -679
  6. package/build/lib/android-helpers.js.map +1 -1
  7. package/build/lib/bootstrap.d.ts +29 -0
  8. package/build/lib/bootstrap.d.ts.map +1 -0
  9. package/build/lib/bootstrap.js +192 -179
  10. package/build/lib/bootstrap.js.map +1 -1
  11. package/build/lib/commands/actions.d.ts +209 -0
  12. package/build/lib/commands/actions.d.ts.map +1 -0
  13. package/build/lib/commands/actions.js +327 -265
  14. package/build/lib/commands/actions.js.map +1 -1
  15. package/build/lib/commands/alert.d.ts +10 -0
  16. package/build/lib/commands/alert.d.ts.map +1 -0
  17. package/build/lib/commands/alert.js +12 -18
  18. package/build/lib/commands/alert.js.map +1 -1
  19. package/build/lib/commands/app-management.d.ts +314 -0
  20. package/build/lib/commands/app-management.d.ts.map +1 -0
  21. package/build/lib/commands/app-management.js +278 -110
  22. package/build/lib/commands/app-management.js.map +1 -1
  23. package/build/lib/commands/context.d.ts +94 -0
  24. package/build/lib/commands/context.d.ts.map +1 -0
  25. package/build/lib/commands/context.js +412 -260
  26. package/build/lib/commands/context.js.map +1 -1
  27. package/build/lib/commands/coverage.d.ts +5 -0
  28. package/build/lib/commands/coverage.d.ts.map +1 -0
  29. package/build/lib/commands/coverage.js +14 -17
  30. package/build/lib/commands/coverage.js.map +1 -1
  31. package/build/lib/commands/element.d.ts +36 -0
  32. package/build/lib/commands/element.d.ts.map +1 -0
  33. package/build/lib/commands/element.js +97 -127
  34. package/build/lib/commands/element.js.map +1 -1
  35. package/build/lib/commands/emu-console.d.ts +49 -0
  36. package/build/lib/commands/emu-console.d.ts.map +1 -0
  37. package/build/lib/commands/emu-console.js +36 -25
  38. package/build/lib/commands/emu-console.js.map +1 -1
  39. package/build/lib/commands/execute.d.ts +6 -0
  40. package/build/lib/commands/execute.d.ts.map +1 -0
  41. package/build/lib/commands/execute.js +68 -69
  42. package/build/lib/commands/execute.js.map +1 -1
  43. package/build/lib/commands/file-actions.d.ts +129 -0
  44. package/build/lib/commands/file-actions.d.ts.map +1 -0
  45. package/build/lib/commands/file-actions.js +321 -178
  46. package/build/lib/commands/file-actions.js.map +1 -1
  47. package/build/lib/commands/find.d.ts +13 -0
  48. package/build/lib/commands/find.d.ts.map +1 -0
  49. package/build/lib/commands/find.js +69 -51
  50. package/build/lib/commands/find.js.map +1 -1
  51. package/build/lib/commands/general.d.ts +133 -0
  52. package/build/lib/commands/general.d.ts.map +1 -0
  53. package/build/lib/commands/general.js +275 -216
  54. package/build/lib/commands/general.js.map +1 -1
  55. package/build/lib/commands/ime.d.ts +11 -0
  56. package/build/lib/commands/ime.d.ts.map +1 -0
  57. package/build/lib/commands/ime.js +27 -33
  58. package/build/lib/commands/ime.js.map +1 -1
  59. package/build/lib/commands/index.d.ts +3 -0
  60. package/build/lib/commands/index.d.ts.map +1 -0
  61. package/build/lib/commands/index.js +32 -35
  62. package/build/lib/commands/index.js.map +1 -1
  63. package/build/lib/commands/intent.d.ts +418 -0
  64. package/build/lib/commands/intent.d.ts.map +1 -0
  65. package/build/lib/commands/intent.js +281 -151
  66. package/build/lib/commands/intent.js.map +1 -1
  67. package/build/lib/commands/keyboard.d.ts +6 -0
  68. package/build/lib/commands/keyboard.d.ts.map +1 -0
  69. package/build/lib/commands/keyboard.js +6 -14
  70. package/build/lib/commands/keyboard.js.map +1 -1
  71. package/build/lib/commands/log.d.ts +45 -0
  72. package/build/lib/commands/log.d.ts.map +1 -0
  73. package/build/lib/commands/log.js +117 -103
  74. package/build/lib/commands/log.js.map +1 -1
  75. package/build/lib/commands/media-projection.d.ts +144 -0
  76. package/build/lib/commands/media-projection.d.ts.map +1 -0
  77. package/build/lib/commands/media-projection.js +228 -171
  78. package/build/lib/commands/media-projection.js.map +1 -1
  79. package/build/lib/commands/network.d.ts +139 -0
  80. package/build/lib/commands/network.d.ts.map +1 -0
  81. package/build/lib/commands/network.js +249 -181
  82. package/build/lib/commands/network.js.map +1 -1
  83. package/build/lib/commands/performance.d.ts +101 -0
  84. package/build/lib/commands/performance.d.ts.map +1 -0
  85. package/build/lib/commands/performance.js +390 -236
  86. package/build/lib/commands/performance.js.map +1 -1
  87. package/build/lib/commands/permissions.d.ts +93 -0
  88. package/build/lib/commands/permissions.d.ts.map +1 -0
  89. package/build/lib/commands/permissions.js +133 -93
  90. package/build/lib/commands/permissions.js.map +1 -1
  91. package/build/lib/commands/recordscreen.d.ts +194 -0
  92. package/build/lib/commands/recordscreen.d.ts.map +1 -0
  93. package/build/lib/commands/recordscreen.js +293 -224
  94. package/build/lib/commands/recordscreen.js.map +1 -1
  95. package/build/lib/commands/shell.d.ts +8 -0
  96. package/build/lib/commands/shell.d.ts.map +1 -0
  97. package/build/lib/commands/shell.js +38 -43
  98. package/build/lib/commands/shell.js.map +1 -1
  99. package/build/lib/commands/streamscreen.d.ts +104 -0
  100. package/build/lib/commands/streamscreen.d.ts.map +1 -0
  101. package/build/lib/commands/streamscreen.js +364 -305
  102. package/build/lib/commands/streamscreen.js.map +1 -1
  103. package/build/lib/commands/system-bars.d.ts +100 -0
  104. package/build/lib/commands/system-bars.d.ts.map +1 -0
  105. package/build/lib/commands/system-bars.js +148 -90
  106. package/build/lib/commands/system-bars.js.map +1 -1
  107. package/build/lib/commands/touch.d.ts +30 -0
  108. package/build/lib/commands/touch.d.ts.map +1 -0
  109. package/build/lib/commands/touch.js +311 -287
  110. package/build/lib/commands/touch.js.map +1 -1
  111. package/build/lib/desired-caps.d.ts +353 -0
  112. package/build/lib/desired-caps.d.ts.map +1 -0
  113. package/build/lib/desired-caps.js +291 -292
  114. package/build/lib/desired-caps.js.map +1 -1
  115. package/build/lib/driver.d.ts +430 -0
  116. package/build/lib/driver.d.ts.map +1 -0
  117. package/build/lib/driver.js +449 -384
  118. package/build/lib/driver.js.map +1 -1
  119. package/build/lib/logger.d.ts +3 -0
  120. package/build/lib/logger.d.ts.map +1 -0
  121. package/build/lib/logger.js +5 -11
  122. package/build/lib/logger.js.map +1 -1
  123. package/build/lib/method-map.d.ts +389 -0
  124. package/build/lib/method-map.d.ts.map +1 -0
  125. package/build/lib/method-map.js +220 -394
  126. package/build/lib/method-map.js.map +1 -1
  127. package/build/lib/stubs.d.ts +8 -0
  128. package/build/lib/stubs.d.ts.map +1 -0
  129. package/build/lib/stubs.js +5 -0
  130. package/build/lib/stubs.js.map +1 -0
  131. package/build/lib/uiautomator.d.ts +24 -0
  132. package/build/lib/uiautomator.d.ts.map +1 -0
  133. package/build/lib/uiautomator.js +86 -82
  134. package/build/lib/uiautomator.js.map +1 -1
  135. package/build/lib/unlock-helpers.d.ts +38 -0
  136. package/build/lib/unlock-helpers.d.ts.map +1 -0
  137. package/build/lib/unlock-helpers.js +228 -204
  138. package/build/lib/unlock-helpers.js.map +1 -1
  139. package/build/lib/utils.d.ts +11 -0
  140. package/build/lib/utils.d.ts.map +1 -0
  141. package/build/lib/utils.js +23 -18
  142. package/build/lib/utils.js.map +1 -1
  143. package/build/lib/webview-helpers.d.ts +223 -0
  144. package/build/lib/webview-helpers.d.ts.map +1 -0
  145. package/build/lib/webview-helpers.js +476 -298
  146. package/build/lib/webview-helpers.js.map +1 -1
  147. package/index.js +3 -1
  148. package/lib/android-helpers.js +2 -1
  149. package/lib/stubs.ts +8 -0
  150. package/lib/unlock-helpers.js +2 -2
  151. package/package.json +23 -14
@@ -1,274 +1,333 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.helpers = exports.default = exports.commands = void 0;
8
- require("source-map-support/register");
9
- var _lodash = _interopRequireDefault(require("lodash"));
10
- var _androidHelpers = _interopRequireDefault(require("../android-helpers"));
11
- var _support = require("@appium/support");
12
- var _moment = _interopRequireDefault(require("moment"));
13
- var _asyncbox = require("asyncbox");
14
- var _driver = require("appium/driver");
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.helpers = exports.commands = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const android_helpers_1 = __importDefault(require("../android-helpers"));
9
+ const support_1 = require("@appium/support");
10
+ const moment_1 = __importDefault(require("moment"));
11
+ const asyncbox_1 = require("asyncbox");
12
+ const driver_1 = require("appium/driver");
15
13
  const MOMENT_FORMAT_ISO8601 = 'YYYY-MM-DDTHH:mm:ssZ';
16
- let commands = {},
17
- helpers = {},
18
- extensions = {};
19
- exports.helpers = helpers;
14
+ let commands = {}, helpers = {}, extensions = {};
20
15
  exports.commands = commands;
16
+ exports.helpers = helpers;
21
17
  commands.keys = async function keys(keys) {
22
- keys = _lodash.default.isArray(keys) ? keys.join('') : keys;
23
- let params = {
24
- text: keys,
25
- replace: false
26
- };
27
- if (this.opts.unicodeKeyboard) {
28
- params.unicodeKeyboard = true;
29
- }
30
- await this.doSendKeys(params);
18
+ // Protocol sends an array; rethink approach
19
+ keys = lodash_1.default.isArray(keys) ? keys.join('') : keys;
20
+ let params = {
21
+ text: keys,
22
+ replace: false
23
+ };
24
+ if (this.opts.unicodeKeyboard) {
25
+ params.unicodeKeyboard = true;
26
+ }
27
+ await this.doSendKeys(params);
31
28
  };
32
29
  commands.doSendKeys = async function doSendKeys(params) {
33
- return await this.bootstrap.sendAction('setText', params);
30
+ return await this.bootstrap.sendAction('setText', params);
34
31
  };
32
+ /**
33
+ * Retrieves the current device's timestamp.
34
+ *
35
+ * @param {string} format - The set of format specifiers. Read
36
+ * https://momentjs.com/docs/ to get the full list of supported
37
+ * datetime format specifiers. The default format is
38
+ * `YYYY-MM-DDTHH:mm:ssZ`, which complies to ISO-8601
39
+ * @return {string} Formatted datetime string or the raw command output if formatting fails
40
+ */
35
41
  commands.getDeviceTime = async function getDeviceTime(format = MOMENT_FORMAT_ISO8601) {
36
- this.log.debug('Attempting to capture android device date and time. ' + `The format specifier is '${format}'`);
37
- const deviceTimestamp = (await this.adb.shell(['date', '+%Y-%m-%dT%T%z'])).trim();
38
- this.log.debug(`Got device timestamp: ${deviceTimestamp}`);
39
- const parsedTimestamp = _moment.default.utc(deviceTimestamp, 'YYYY-MM-DDTHH:mm:ssZZ');
40
- if (!parsedTimestamp.isValid()) {
41
- this.log.warn('Cannot parse the returned timestamp. Returning as is');
42
- return deviceTimestamp;
43
- }
44
- return parsedTimestamp.utcOffset(parsedTimestamp._tzm || 0).format(format);
42
+ this.log.debug('Attempting to capture android device date and time. ' +
43
+ `The format specifier is '${format}'`);
44
+ const deviceTimestamp = (await this.adb.shell(['date', '+%Y-%m-%dT%T%z'])).trim();
45
+ this.log.debug(`Got device timestamp: ${deviceTimestamp}`);
46
+ const parsedTimestamp = moment_1.default.utc(deviceTimestamp, 'YYYY-MM-DDTHH:mm:ssZZ');
47
+ if (!parsedTimestamp.isValid()) {
48
+ this.log.warn('Cannot parse the returned timestamp. Returning as is');
49
+ return deviceTimestamp;
50
+ }
51
+ return parsedTimestamp.utcOffset(parsedTimestamp._tzm || 0).format(format);
45
52
  };
53
+ /**
54
+ * @typedef {Object} DeviceTimeOptions
55
+ * @property {string} format [YYYY-MM-DDTHH:mm:ssZ] - See getDeviceTime#format
56
+ */
57
+ /**
58
+ * Retrieves the current device time
59
+ *
60
+ * @param {DeviceTimeOptions} opts
61
+ * @return {string} Formatted datetime string or the raw command output if formatting fails
62
+ */
46
63
  commands.mobileGetDeviceTime = async function mobileGetDeviceTime(opts = {}) {
47
- return await this.getDeviceTime(opts.format);
64
+ return await this.getDeviceTime(opts.format);
48
65
  };
49
66
  commands.getPageSource = async function getPageSource() {
50
- return await this.bootstrap.sendAction('source');
67
+ return await this.bootstrap.sendAction('source');
51
68
  };
52
69
  commands.back = async function back() {
53
- return await this.bootstrap.sendAction('pressBack');
70
+ return await this.bootstrap.sendAction('pressBack');
54
71
  };
55
72
  commands.openSettingsActivity = async function openSettingsActivity(setting) {
56
- let {
57
- appPackage,
58
- appActivity
59
- } = await this.adb.getFocusedPackageAndActivity();
60
- await this.adb.shell(['am', 'start', '-a', `android.settings.${setting}`]);
61
- await this.adb.waitForNotActivity(appPackage, appActivity, 5000);
73
+ let { appPackage, appActivity } = await this.adb.getFocusedPackageAndActivity();
74
+ await this.adb.shell(['am', 'start', '-a', `android.settings.${setting}`]);
75
+ await this.adb.waitForNotActivity(appPackage, appActivity, 5000);
62
76
  };
63
77
  commands.getWindowSize = async function getWindowSize() {
64
- return await this.bootstrap.sendAction('getDeviceSize');
78
+ return await this.bootstrap.sendAction('getDeviceSize');
65
79
  };
80
+ // For W3C
66
81
  commands.getWindowRect = async function getWindowRect() {
67
- const {
68
- width,
69
- height
70
- } = await this.getWindowSize();
71
- return {
72
- width,
73
- height,
74
- x: 0,
75
- y: 0
76
- };
82
+ const { width, height } = await this.getWindowSize();
83
+ return {
84
+ width,
85
+ height,
86
+ x: 0,
87
+ y: 0
88
+ };
77
89
  };
78
90
  commands.getCurrentActivity = async function getCurrentActivity() {
79
- return (await this.adb.getFocusedPackageAndActivity()).appActivity;
91
+ return (await this.adb.getFocusedPackageAndActivity()).appActivity;
80
92
  };
81
93
  commands.getCurrentPackage = async function getCurrentPackage() {
82
- return (await this.adb.getFocusedPackageAndActivity()).appPackage;
94
+ return (await this.adb.getFocusedPackageAndActivity()).appPackage;
83
95
  };
84
96
  commands.background = async function background(seconds) {
85
- if (seconds < 0) {
97
+ if (seconds < 0) {
98
+ // if user passes in a negative seconds value, interpret that as the instruction
99
+ // to not bring the app back at all
100
+ await this.adb.goToHome();
101
+ return true;
102
+ }
103
+ let { appPackage, appActivity } = await this.adb.getFocusedPackageAndActivity();
86
104
  await this.adb.goToHome();
87
- return true;
88
- }
89
- let {
90
- appPackage,
91
- appActivity
92
- } = await this.adb.getFocusedPackageAndActivity();
93
- await this.adb.goToHome();
94
- const sleepMs = seconds * 1000;
95
- const thresholdMs = 30 * 1000;
96
- const intervalMs = _lodash.default.min([30 * 1000, parseInt(sleepMs / 100, 10)]);
97
- const progressCb = ({
98
- elapsedMs,
99
- progress
100
- }) => {
101
- const waitSecs = (elapsedMs / 1000).toFixed(0);
102
- const progressPct = (progress * 100).toFixed(2);
103
- this.log.debug(`Waited ${waitSecs}s so far (${progressPct}%)`);
104
- };
105
- await (0, _asyncbox.longSleep)(sleepMs, {
106
- thresholdMs,
107
- intervalMs,
108
- progressCb
109
- });
110
- let args;
111
- if (this._cachedActivityArgs && this._cachedActivityArgs[`${appPackage}/${appActivity}`]) {
112
- args = this._cachedActivityArgs[`${appPackage}/${appActivity}`];
113
- } else {
114
- try {
115
- this.log.debug(`Activating app '${appPackage}' in order to restore it`);
116
- await this.activateApp(appPackage);
117
- return true;
118
- } catch (ign) {}
119
- args = appPackage === this.opts.appPackage && appActivity === this.opts.appActivity || appPackage === this.opts.appWaitPackage && (this.opts.appWaitActivity || '').split(',').includes(appActivity) ? {
120
- pkg: this.opts.appPackage,
121
- activity: this.opts.appActivity,
122
- action: this.opts.intentAction,
123
- category: this.opts.intentCategory,
124
- flags: this.opts.intentFlags,
125
- waitPkg: this.opts.appWaitPackage,
126
- waitActivity: this.opts.appWaitActivity,
127
- waitForLaunch: this.opts.appWaitForLaunch,
128
- waitDuration: this.opts.appWaitDuration,
129
- optionalIntentArguments: this.opts.optionalIntentArguments,
130
- stopApp: false,
131
- user: this.opts.userProfile
132
- } : {
133
- pkg: appPackage,
134
- activity: appActivity,
135
- waitPkg: appPackage,
136
- waitActivity: appActivity,
137
- stopApp: false
105
+ // people can wait for a long time, so to be safe let's use the longSleep function and log
106
+ // progress periodically.
107
+ const sleepMs = seconds * 1000;
108
+ const thresholdMs = 30 * 1000; // use the spin-wait for anything over this threshold
109
+ // for our spin interval, use 1% of the total wait time, but nothing bigger than 30s
110
+ const intervalMs = lodash_1.default.min([30 * 1000, parseInt(sleepMs / 100, 10)]);
111
+ const progressCb = ({ elapsedMs, progress }) => {
112
+ const waitSecs = (elapsedMs / 1000).toFixed(0);
113
+ const progressPct = (progress * 100).toFixed(2);
114
+ this.log.debug(`Waited ${waitSecs}s so far (${progressPct}%)`);
138
115
  };
139
- }
140
- args = await _support.util.filterObject(args);
141
- this.log.debug(`Bringing application back to foreground with arguments: ${JSON.stringify(args)}`);
142
- return await this.adb.startApp(args);
116
+ await (0, asyncbox_1.longSleep)(sleepMs, { thresholdMs, intervalMs, progressCb });
117
+ let args;
118
+ if (this._cachedActivityArgs && this._cachedActivityArgs[`${appPackage}/${appActivity}`]) {
119
+ // the activity was started with `startActivity`, so use those args to restart
120
+ args = this._cachedActivityArgs[`${appPackage}/${appActivity}`];
121
+ }
122
+ else {
123
+ try {
124
+ this.log.debug(`Activating app '${appPackage}' in order to restore it`);
125
+ await this.activateApp(appPackage);
126
+ return true;
127
+ }
128
+ catch (ign) { }
129
+ args = ((appPackage === this.opts.appPackage && appActivity === this.opts.appActivity) ||
130
+ (appPackage === this.opts.appWaitPackage && (this.opts.appWaitActivity || '').split(',').includes(appActivity)))
131
+ ? {
132
+ pkg: this.opts.appPackage,
133
+ activity: this.opts.appActivity,
134
+ action: this.opts.intentAction,
135
+ category: this.opts.intentCategory,
136
+ flags: this.opts.intentFlags,
137
+ waitPkg: this.opts.appWaitPackage,
138
+ waitActivity: this.opts.appWaitActivity,
139
+ waitForLaunch: this.opts.appWaitForLaunch,
140
+ waitDuration: this.opts.appWaitDuration,
141
+ optionalIntentArguments: this.opts.optionalIntentArguments,
142
+ stopApp: false,
143
+ user: this.opts.userProfile
144
+ }
145
+ : {
146
+ pkg: appPackage,
147
+ activity: appActivity,
148
+ waitPkg: appPackage,
149
+ waitActivity: appActivity,
150
+ stopApp: false
151
+ };
152
+ }
153
+ args = await support_1.util.filterObject(args);
154
+ this.log.debug(`Bringing application back to foreground with arguments: ${JSON.stringify(args)}`);
155
+ return await this.adb.startApp(args);
143
156
  };
144
157
  commands.getStrings = async function getStrings(language) {
145
- if (!language) {
146
- language = await this.adb.getDeviceLanguage();
147
- this.log.info(`No language specified, returning strings for: ${language}`);
148
- }
149
- const preprocessStringsMap = mapping => {
150
- const result = {};
151
- for (const [key, value] of _lodash.default.toPairs(mapping)) {
152
- result[key] = _lodash.default.isString(value) ? value : JSON.stringify(value);
158
+ if (!language) {
159
+ language = await this.adb.getDeviceLanguage();
160
+ this.log.info(`No language specified, returning strings for: ${language}`);
161
+ }
162
+ // Clients require the resulting mapping to have both keys
163
+ // and values of type string
164
+ const preprocessStringsMap = (mapping) => {
165
+ const result = {};
166
+ for (const [key, value] of lodash_1.default.toPairs(mapping)) {
167
+ result[key] = lodash_1.default.isString(value) ? value : JSON.stringify(value);
168
+ }
169
+ return result;
170
+ };
171
+ if (this.apkStrings[language]) {
172
+ // Return cached strings
173
+ return preprocessStringsMap(this.apkStrings[language]);
174
+ }
175
+ this.apkStrings[language] = await android_helpers_1.default.pushStrings(language, this.adb, this.opts);
176
+ if (this.bootstrap) {
177
+ // TODO: This is mutating the current language, but it's how appium currently works
178
+ await this.bootstrap.sendAction('updateStrings');
153
179
  }
154
- return result;
155
- };
156
- if (this.apkStrings[language]) {
157
180
  return preprocessStringsMap(this.apkStrings[language]);
158
- }
159
- this.apkStrings[language] = await _androidHelpers.default.pushStrings(language, this.adb, this.opts);
160
- if (this.bootstrap) {
161
- await this.bootstrap.sendAction('updateStrings');
162
- }
163
- return preprocessStringsMap(this.apkStrings[language]);
164
181
  };
165
182
  commands.launchApp = async function launchApp() {
166
- await this.initAUT();
167
- await this.startAUT();
183
+ await this.initAUT();
184
+ await this.startAUT();
168
185
  };
169
186
  commands.startActivity = async function startActivity(appPackage, appActivity, appWaitPackage, appWaitActivity, intentAction, intentCategory, intentFlags, optionalIntentArguments, dontStopAppOnReset) {
170
- this.log.debug(`Starting package '${appPackage}' and activity '${appActivity}'`);
171
- if (!_support.util.hasValue(dontStopAppOnReset)) {
172
- dontStopAppOnReset = !!this.opts.dontStopAppOnReset;
173
- }
174
- let args = {
175
- pkg: appPackage,
176
- activity: appActivity,
177
- waitPkg: appWaitPackage || appPackage,
178
- waitActivity: appWaitActivity || appActivity,
179
- action: intentAction,
180
- category: intentCategory,
181
- flags: intentFlags,
182
- optionalIntentArguments,
183
- stopApp: !dontStopAppOnReset
184
- };
185
- this._cachedActivityArgs = this._cachedActivityArgs || {};
186
- this._cachedActivityArgs[`${args.waitPkg}/${args.waitActivity}`] = args;
187
- await this.adb.startApp(args);
187
+ this.log.debug(`Starting package '${appPackage}' and activity '${appActivity}'`);
188
+ // dontStopAppOnReset is both an argument here, and a desired capability
189
+ // if the argument is set, use it, otherwise use the cap
190
+ if (!support_1.util.hasValue(dontStopAppOnReset)) {
191
+ dontStopAppOnReset = !!this.opts.dontStopAppOnReset;
192
+ }
193
+ let args = {
194
+ pkg: appPackage,
195
+ activity: appActivity,
196
+ waitPkg: appWaitPackage || appPackage,
197
+ waitActivity: appWaitActivity || appActivity,
198
+ action: intentAction,
199
+ category: intentCategory,
200
+ flags: intentFlags,
201
+ optionalIntentArguments,
202
+ stopApp: !dontStopAppOnReset
203
+ };
204
+ this._cachedActivityArgs = this._cachedActivityArgs || {};
205
+ this._cachedActivityArgs[`${args.waitPkg}/${args.waitActivity}`] = args;
206
+ await this.adb.startApp(args);
188
207
  };
189
208
  commands.reset = async function reset() {
190
- await _androidHelpers.default.resetApp(this.adb, Object.assign({}, this.opts, {
191
- fastReset: true
192
- }));
193
- await this.setContext();
194
- return (await this.isChromeSession) ? this.startChromeSession() : this.startAUT();
209
+ await android_helpers_1.default.resetApp(this.adb, Object.assign({}, this.opts, { fastReset: true }));
210
+ // reset context since we don't know what kind on context we will end up after app launch.
211
+ await this.setContext();
212
+ return await this.isChromeSession ? this.startChromeSession() : this.startAUT();
195
213
  };
196
214
  commands.startAUT = async function startAUT() {
197
- await this.adb.startApp({
198
- pkg: this.opts.appPackage,
199
- activity: this.opts.appActivity,
200
- action: this.opts.intentAction,
201
- category: this.opts.intentCategory,
202
- flags: this.opts.intentFlags,
203
- waitPkg: this.opts.appWaitPackage,
204
- waitActivity: this.opts.appWaitActivity,
205
- waitForLaunch: this.opts.appWaitForLaunch,
206
- waitDuration: this.opts.appWaitDuration,
207
- optionalIntentArguments: this.opts.optionalIntentArguments,
208
- stopApp: !this.opts.dontStopAppOnReset,
209
- user: this.opts.userProfile
210
- });
215
+ await this.adb.startApp({
216
+ pkg: this.opts.appPackage,
217
+ activity: this.opts.appActivity,
218
+ action: this.opts.intentAction,
219
+ category: this.opts.intentCategory,
220
+ flags: this.opts.intentFlags,
221
+ waitPkg: this.opts.appWaitPackage,
222
+ waitActivity: this.opts.appWaitActivity,
223
+ waitForLaunch: this.opts.appWaitForLaunch,
224
+ waitDuration: this.opts.appWaitDuration,
225
+ optionalIntentArguments: this.opts.optionalIntentArguments,
226
+ stopApp: !this.opts.dontStopAppOnReset,
227
+ user: this.opts.userProfile,
228
+ });
211
229
  };
230
+ // we override setUrl to take an android URI which can be used for deep-linking
231
+ // inside an app, similar to starting an intent
212
232
  commands.setUrl = async function setUrl(uri) {
213
- await this.adb.startUri(uri, this.opts.appPackage);
233
+ await this.adb.startUri(uri, this.opts.appPackage);
214
234
  };
235
+ // closing app using force stop
215
236
  commands.closeApp = async function closeApp() {
216
- await this.adb.forceStop(this.opts.appPackage);
217
- await this.setContext();
237
+ await this.adb.forceStop(this.opts.appPackage);
238
+ // reset context since we don't know what kind on context we will end up after app launch.
239
+ await this.setContext();
218
240
  };
219
241
  commands.getDisplayDensity = async function getDisplayDensity() {
220
- let out = await this.adb.shell(['getprop', 'ro.sf.lcd_density']);
221
- if (out) {
222
- let val = parseInt(out, 10);
223
- if (!isNaN(val)) {
224
- return val;
242
+ // first try the property for devices
243
+ let out = await this.adb.shell(['getprop', 'ro.sf.lcd_density']);
244
+ if (out) {
245
+ let val = parseInt(out, 10);
246
+ // if the value is NaN, try getting the emulator property
247
+ if (!isNaN(val)) {
248
+ return val;
249
+ }
250
+ this.log.debug(`Parsed density value was NaN: "${out}"`);
225
251
  }
226
- this.log.debug(`Parsed density value was NaN: "${out}"`);
227
- }
228
- out = await this.adb.shell(['getprop', 'qemu.sf.lcd_density']);
229
- if (out) {
230
- let val = parseInt(out, 10);
231
- if (!isNaN(val)) {
232
- return val;
252
+ // fallback to trying property for emulators
253
+ out = await this.adb.shell(['getprop', 'qemu.sf.lcd_density']);
254
+ if (out) {
255
+ let val = parseInt(out, 10);
256
+ if (!isNaN(val)) {
257
+ return val;
258
+ }
259
+ this.log.debug(`Parsed density value was NaN: "${out}"`);
233
260
  }
234
- this.log.debug(`Parsed density value was NaN: "${out}"`);
235
- }
236
- this.log.errorAndThrow('Failed to get display density property.');
261
+ // couldn't get anything, so error out
262
+ this.log.errorAndThrow('Failed to get display density property.');
237
263
  };
238
264
  commands.mobilePerformEditorAction = async function mobilePerformEditorAction(opts = {}) {
239
- const {
240
- action
241
- } = opts;
242
- if (!_support.util.hasValue(action)) {
243
- throw new _driver.errors.InvalidArgumentError(`'action' argument is required`);
244
- }
245
- await this.adb.performEditorAction(action);
265
+ const { action } = opts;
266
+ if (!support_1.util.hasValue(action)) {
267
+ throw new driver_1.errors.InvalidArgumentError(`'action' argument is required`);
268
+ }
269
+ await this.adb.performEditorAction(action);
246
270
  };
271
+ /**
272
+ * Retrieves the list of recent system notifications.
273
+ *
274
+ * @returns {Object} See the documentation on `adb.getNotifications` for
275
+ * more details
276
+ */
247
277
  commands.mobileGetNotifications = async function mobileGetNotifications() {
248
- return await this.adb.getNotifications();
278
+ return await this.adb.getNotifications();
249
279
  };
280
+ /**
281
+ * @typedef {Object} SmsListOptions
282
+ * @property {number} max [100] - The maximum count of recent SMS messages
283
+ * to retrieve
284
+ */
285
+ /**
286
+ * Retrieves the list of recent SMS messages with their properties.
287
+ *
288
+ * @param {SmsListOptions} opts
289
+ * @returns {Object} See the documentation on `adb.getSmsList` for
290
+ * more details
291
+ */
250
292
  commands.mobileListSms = async function mobileListSms(opts = {}) {
251
- return await this.adb.getSmsList(opts);
293
+ return await this.adb.getSmsList(opts);
252
294
  };
295
+ /**
296
+ * @typedef {Object} UnlockOptions
297
+ * @property {string?} key The unlock key. The value of this key depends
298
+ * on the actual unlock type and could be a pin/password/pattern value or
299
+ * a biometric finger id.
300
+ * If not provided then the corresponding value from session capabilities is used.
301
+ * @property {string?} type The unlock type. The following unlock types
302
+ * are supported: `pin`, `pinWithKeyEvent`, `password`, `pattern` and `fingerprint`.
303
+ * If not provided then the corresponding value from session capabilities is used.
304
+ * @property {string?} strategy Either 'locksettings' (default) or 'uiautomator'.
305
+ * Setting it to 'uiautomator' will enforce the driver to avoid using special
306
+ * ADB shortcuts in order to speed up the unlock procedure.
307
+ * @property {number?} timeoutMs [2000] The maximum time in milliseconds
308
+ * to wait until the screen gets unlocked
309
+ */
310
+ /**
311
+ * Unlocks the device if it is locked. Noop if the device's screen is not locked.
312
+ *
313
+ * @param {UnlockOptions} opts
314
+ * @throws {Error} if unlock operation fails or the provided
315
+ * arguments are not valid
316
+ */
253
317
  commands.mobileUnlock = async function mobileUnlock(opts = {}) {
254
- const {
255
- key,
256
- type,
257
- strategy,
258
- timeoutMs
259
- } = opts;
260
- if (!key && !type) {
261
- await this.unlock();
262
- } else {
263
- await _androidHelpers.default.unlock(this, this.adb, {
264
- unlockKey: key,
265
- unlockType: type,
266
- unlockStrategy: strategy,
267
- unlockSuccessTimeout: timeoutMs
268
- });
269
- }
318
+ const { key, type, strategy, timeoutMs } = opts;
319
+ if (!key && !type) {
320
+ await this.unlock();
321
+ }
322
+ else {
323
+ await android_helpers_1.default.unlock(this, this.adb, {
324
+ unlockKey: key,
325
+ unlockType: type,
326
+ unlockStrategy: strategy,
327
+ unlockSuccessTimeout: timeoutMs,
328
+ });
329
+ }
270
330
  };
271
331
  Object.assign(extensions, commands, helpers);
272
- var _default = extensions;
273
- exports.default = _default;
274
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYW5kcm9pZEhlbHBlcnMiLCJfc3VwcG9ydCIsIl9tb21lbnQiLCJfYXN5bmNib3giLCJfZHJpdmVyIiwiTU9NRU5UX0ZPUk1BVF9JU084NjAxIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJrZXlzIiwiXyIsImlzQXJyYXkiLCJqb2luIiwicGFyYW1zIiwidGV4dCIsInJlcGxhY2UiLCJvcHRzIiwidW5pY29kZUtleWJvYXJkIiwiZG9TZW5kS2V5cyIsImJvb3RzdHJhcCIsInNlbmRBY3Rpb24iLCJnZXREZXZpY2VUaW1lIiwiZm9ybWF0IiwibG9nIiwiZGVidWciLCJkZXZpY2VUaW1lc3RhbXAiLCJhZGIiLCJzaGVsbCIsInRyaW0iLCJwYXJzZWRUaW1lc3RhbXAiLCJtb21lbnQiLCJ1dGMiLCJpc1ZhbGlkIiwid2FybiIsInV0Y09mZnNldCIsIl90em0iLCJtb2JpbGVHZXREZXZpY2VUaW1lIiwiZ2V0UGFnZVNvdXJjZSIsImJhY2siLCJvcGVuU2V0dGluZ3NBY3Rpdml0eSIsInNldHRpbmciLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJnZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5Iiwid2FpdEZvck5vdEFjdGl2aXR5IiwiZ2V0V2luZG93U2l6ZSIsImdldFdpbmRvd1JlY3QiLCJ3aWR0aCIsImhlaWdodCIsIngiLCJ5IiwiZ2V0Q3VycmVudEFjdGl2aXR5IiwiZ2V0Q3VycmVudFBhY2thZ2UiLCJiYWNrZ3JvdW5kIiwic2Vjb25kcyIsImdvVG9Ib21lIiwic2xlZXBNcyIsInRocmVzaG9sZE1zIiwiaW50ZXJ2YWxNcyIsIm1pbiIsInBhcnNlSW50IiwicHJvZ3Jlc3NDYiIsImVsYXBzZWRNcyIsInByb2dyZXNzIiwid2FpdFNlY3MiLCJ0b0ZpeGVkIiwicHJvZ3Jlc3NQY3QiLCJsb25nU2xlZXAiLCJhcmdzIiwiX2NhY2hlZEFjdGl2aXR5QXJncyIsImFjdGl2YXRlQXBwIiwiaWduIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJzcGxpdCIsImluY2x1ZGVzIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJpbnRlbnRBY3Rpb24iLCJjYXRlZ29yeSIsImludGVudENhdGVnb3J5IiwiZmxhZ3MiLCJpbnRlbnRGbGFncyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJ3YWl0Rm9yTGF1bmNoIiwiYXBwV2FpdEZvckxhdW5jaCIsIndhaXREdXJhdGlvbiIsImFwcFdhaXREdXJhdGlvbiIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic3RvcEFwcCIsInVzZXIiLCJ1c2VyUHJvZmlsZSIsInV0aWwiLCJmaWx0ZXJPYmplY3QiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhcnRBcHAiLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsInRvUGFpcnMiLCJpc1N0cmluZyIsImFwa1N0cmluZ3MiLCJhbmRyb2lkSGVscGVycyIsInB1c2hTdHJpbmdzIiwibGF1bmNoQXBwIiwiaW5pdEFVVCIsInN0YXJ0QVVUIiwic3RhcnRBY3Rpdml0eSIsImRvbnRTdG9wQXBwT25SZXNldCIsImhhc1ZhbHVlIiwicmVzZXQiLCJyZXNldEFwcCIsIk9iamVjdCIsImFzc2lnbiIsImZhc3RSZXNldCIsInNldENvbnRleHQiLCJpc0Nocm9tZVNlc3Npb24iLCJzdGFydENocm9tZVNlc3Npb24iLCJzZXRVcmwiLCJ1cmkiLCJzdGFydFVyaSIsImNsb3NlQXBwIiwiZm9yY2VTdG9wIiwiZ2V0RGlzcGxheURlbnNpdHkiLCJvdXQiLCJ2YWwiLCJpc05hTiIsImVycm9yQW5kVGhyb3ciLCJtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwibW9iaWxlR2V0Tm90aWZpY2F0aW9ucyIsImdldE5vdGlmaWNhdGlvbnMiLCJtb2JpbGVMaXN0U21zIiwiZ2V0U21zTGlzdCIsIm1vYmlsZVVubG9jayIsInR5cGUiLCJzdHJhdGVneSIsInRpbWVvdXRNcyIsInVubG9jayIsInVubG9ja0tleSIsInVubG9ja1R5cGUiLCJ1bmxvY2tTdHJhdGVneSIsInVubG9ja1N1Y2Nlc3NUaW1lb3V0IiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2dlbmVyYWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhbmRyb2lkSGVscGVycyBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBsb25nU2xlZXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuY29uc3QgTU9NRU5UX0ZPUk1BVF9JU084NjAxID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb21tYW5kcy5rZXlzID0gYXN5bmMgZnVuY3Rpb24ga2V5cyAoa2V5cykge1xuICAvLyBQcm90b2NvbCBzZW5kcyBhbiBhcnJheTsgcmV0aGluayBhcHByb2FjaFxuICBrZXlzID0gXy5pc0FycmF5KGtleXMpID8ga2V5cy5qb2luKCcnKSA6IGtleXM7XG4gIGxldCBwYXJhbXMgPSB7XG4gICAgdGV4dDoga2V5cyxcbiAgICByZXBsYWNlOiBmYWxzZVxuICB9O1xuICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCkge1xuICAgIHBhcmFtcy51bmljb2RlS2V5Ym9hcmQgPSB0cnVlO1xuICB9XG4gIGF3YWl0IHRoaXMuZG9TZW5kS2V5cyhwYXJhbXMpO1xufTtcblxuY29tbWFuZHMuZG9TZW5kS2V5cyA9IGFzeW5jIGZ1bmN0aW9uIGRvU2VuZEtleXMgKHBhcmFtcykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc2V0VGV4dCcsIHBhcmFtcyk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBkZXZpY2UncyB0aW1lc3RhbXAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIFRoZSBzZXQgb2YgZm9ybWF0IHNwZWNpZmllcnMuIFJlYWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRldGltZSBmb3JtYXQgc3BlY2lmaWVycy4gVGhlIGRlZmF1bHQgZm9ybWF0IGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYFlZWVktTU0tRERUSEg6bW06c3NaYCwgd2hpY2ggY29tcGxpZXMgdG8gSVNPLTg2MDFcbiAqIEByZXR1cm4ge3N0cmluZ30gRm9ybWF0dGVkIGRhdGV0aW1lIHN0cmluZyBvciB0aGUgcmF3IGNvbW1hbmQgb3V0cHV0IGlmIGZvcm1hdHRpbmcgZmFpbHNcbiAqL1xuY29tbWFuZHMuZ2V0RGV2aWNlVGltZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVRpbWUgKGZvcm1hdCA9IE1PTUVOVF9GT1JNQVRfSVNPODYwMSkge1xuICB0aGlzLmxvZy5kZWJ1ZygnQXR0ZW1wdGluZyB0byBjYXB0dXJlIGFuZHJvaWQgZGV2aWNlIGRhdGUgYW5kIHRpbWUuICcgK1xuICAgIGBUaGUgZm9ybWF0IHNwZWNpZmllciBpcyAnJHtmb3JtYXR9J2ApO1xuICBjb25zdCBkZXZpY2VUaW1lc3RhbXAgPSAoYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkYXRlJywgJyslWS0lbS0lZFQlVCV6J10pKS50cmltKCk7XG4gIHRoaXMubG9nLmRlYnVnKGBHb3QgZGV2aWNlIHRpbWVzdGFtcDogJHtkZXZpY2VUaW1lc3RhbXB9YCk7XG4gIGNvbnN0IHBhcnNlZFRpbWVzdGFtcCA9IG1vbWVudC51dGMoZGV2aWNlVGltZXN0YW1wLCAnWVlZWS1NTS1ERFRISDptbTpzc1paJyk7XG4gIGlmICghcGFyc2VkVGltZXN0YW1wLmlzVmFsaWQoKSkge1xuICAgIHRoaXMubG9nLndhcm4oJ0Nhbm5vdCBwYXJzZSB0aGUgcmV0dXJuZWQgdGltZXN0YW1wLiBSZXR1cm5pbmcgYXMgaXMnKTtcbiAgICByZXR1cm4gZGV2aWNlVGltZXN0YW1wO1xuICB9XG4gIHJldHVybiBwYXJzZWRUaW1lc3RhbXAudXRjT2Zmc2V0KHBhcnNlZFRpbWVzdGFtcC5fdHptIHx8IDApLmZvcm1hdChmb3JtYXQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXZpY2VUaW1lT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1hdCBbWVlZWS1NTS1ERFRISDptbTpzc1pdIC0gU2VlIGdldERldmljZVRpbWUjZm9ybWF0XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZGV2aWNlIHRpbWVcbiAqXG4gKiBAcGFyYW0ge0RldmljZVRpbWVPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZvcm1hdHRlZCBkYXRldGltZSBzdHJpbmcgb3IgdGhlIHJhdyBjb21tYW5kIG91dHB1dCBpZiBmb3JtYXR0aW5nIGZhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldERldmljZVRpbWUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXREZXZpY2VUaW1lIChvcHRzID0ge30pIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlVGltZShvcHRzLmZvcm1hdCk7XG59O1xuXG5jb21tYW5kcy5nZXRQYWdlU291cmNlID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGFnZVNvdXJjZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdzb3VyY2UnKTtcbn07XG5cbmNvbW1hbmRzLmJhY2sgPSBhc3luYyBmdW5jdGlvbiBiYWNrICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3ByZXNzQmFjaycpO1xufTtcblxuY29tbWFuZHMub3BlblNldHRpbmdzQWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBvcGVuU2V0dGluZ3NBY3Rpdml0eSAoc2V0dGluZykge1xuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcbiAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydhbScsICdzdGFydCcsICctYScsIGBhbmRyb2lkLnNldHRpbmdzLiR7c2V0dGluZ31gXSk7XG4gIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG59O1xuXG5jb21tYW5kcy5nZXRXaW5kb3dTaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93U2l6ZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdnZXREZXZpY2VTaXplJyk7XG59O1xuXG4vLyBGb3IgVzNDXG5jb21tYW5kcy5nZXRXaW5kb3dSZWN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93UmVjdCAoKSB7XG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYXdhaXQgdGhpcy5nZXRXaW5kb3dTaXplKCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xufTtcblxuY29tbWFuZHMuZ2V0Q3VycmVudEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudEFjdGl2aXR5ICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCkpLmFwcEFjdGl2aXR5O1xufTtcblxuY29tbWFuZHMuZ2V0Q3VycmVudFBhY2thZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50UGFja2FnZSAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpKS5hcHBQYWNrYWdlO1xufTtcblxuY29tbWFuZHMuYmFja2dyb3VuZCA9IGFzeW5jIGZ1bmN0aW9uIGJhY2tncm91bmQgKHNlY29uZHMpIHtcbiAgaWYgKHNlY29uZHMgPCAwKSB7XG4gICAgLy8gaWYgdXNlciBwYXNzZXMgaW4gYSBuZWdhdGl2ZSBzZWNvbmRzIHZhbHVlLCBpbnRlcnByZXQgdGhhdCBhcyB0aGUgaW5zdHJ1Y3Rpb25cbiAgICAvLyB0byBub3QgYnJpbmcgdGhlIGFwcCBiYWNrIGF0IGFsbFxuICAgIGF3YWl0IHRoaXMuYWRiLmdvVG9Ib21lKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgbGV0IHthcHBQYWNrYWdlLCBhcHBBY3Rpdml0eX0gPSBhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCk7XG4gIGF3YWl0IHRoaXMuYWRiLmdvVG9Ib21lKCk7XG5cbiAgLy8gcGVvcGxlIGNhbiB3YWl0IGZvciBhIGxvbmcgdGltZSwgc28gdG8gYmUgc2FmZSBsZXQncyB1c2UgdGhlIGxvbmdTbGVlcCBmdW5jdGlvbiBhbmQgbG9nXG4gIC8vIHByb2dyZXNzIHBlcmlvZGljYWxseS5cbiAgY29uc3Qgc2xlZXBNcyA9IHNlY29uZHMgKiAxMDAwO1xuICBjb25zdCB0aHJlc2hvbGRNcyA9IDMwICogMTAwMDsgLy8gdXNlIHRoZSBzcGluLXdhaXQgZm9yIGFueXRoaW5nIG92ZXIgdGhpcyB0aHJlc2hvbGRcbiAgLy8gZm9yIG91ciBzcGluIGludGVydmFsLCB1c2UgMSUgb2YgdGhlIHRvdGFsIHdhaXQgdGltZSwgYnV0IG5vdGhpbmcgYmlnZ2VyIHRoYW4gMzBzXG4gIGNvbnN0IGludGVydmFsTXMgPSBfLm1pbihbMzAgKiAxMDAwLCBwYXJzZUludChzbGVlcE1zIC8gMTAwLCAxMCldKTtcbiAgY29uc3QgcHJvZ3Jlc3NDYiA9ICh7ZWxhcHNlZE1zLCBwcm9ncmVzc30pID0+IHtcbiAgICBjb25zdCB3YWl0U2VjcyA9IChlbGFwc2VkTXMgLyAxMDAwKS50b0ZpeGVkKDApO1xuICAgIGNvbnN0IHByb2dyZXNzUGN0ID0gKHByb2dyZXNzICogMTAwKS50b0ZpeGVkKDIpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBXYWl0ZWQgJHt3YWl0U2Vjc31zIHNvIGZhciAoJHtwcm9ncmVzc1BjdH0lKWApO1xuICB9O1xuICBhd2FpdCBsb25nU2xlZXAoc2xlZXBNcywge3RocmVzaG9sZE1zLCBpbnRlcnZhbE1zLCBwcm9ncmVzc0NifSk7XG5cbiAgbGV0IGFyZ3M7XG4gIGlmICh0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3MgJiYgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FwcFBhY2thZ2V9LyR7YXBwQWN0aXZpdHl9YF0pIHtcbiAgICAvLyB0aGUgYWN0aXZpdHkgd2FzIHN0YXJ0ZWQgd2l0aCBgc3RhcnRBY3Rpdml0eWAsIHNvIHVzZSB0aG9zZSBhcmdzIHRvIHJlc3RhcnRcbiAgICBhcmdzID0gdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FwcFBhY2thZ2V9LyR7YXBwQWN0aXZpdHl9YF07XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBBY3RpdmF0aW5nIGFwcCAnJHthcHBQYWNrYWdlfScgaW4gb3JkZXIgdG8gcmVzdG9yZSBpdGApO1xuICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZUFwcChhcHBQYWNrYWdlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICBhcmdzID0gKChhcHBQYWNrYWdlID09PSB0aGlzLm9wdHMuYXBwUGFja2FnZSAmJiBhcHBBY3Rpdml0eSA9PT0gdGhpcy5vcHRzLmFwcEFjdGl2aXR5KSB8fFxuICAgICAgICAgICAgKGFwcFBhY2thZ2UgPT09IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSAmJiAodGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSB8fCAnJykuc3BsaXQoJywnKS5pbmNsdWRlcyhhcHBBY3Rpdml0eSkpKVxuICAgICAgPyB7Ly8gdGhlIGFjdGl2aXR5IGlzIHRoZSBvcmlnaW5hbCBzZXNzaW9uIGFjdGl2aXR5LCBzbyB1c2UgdGhlIG9yaWdpbmFsIGFyZ3NcbiAgICAgICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgICAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgICAgc3RvcEFwcDogZmFsc2UsXG4gICAgICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZX1cbiAgICAgIDogey8vIHRoZSBhY3Rpdml0eSB3YXMgc3RhcnRlZCBzb21lIG90aGVyIHdheSwgc28gdXNlIGRlZmF1bHRzXG4gICAgICAgIHBrZzogYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgICAgICB3YWl0UGtnOiBhcHBQYWNrYWdlLFxuICAgICAgICB3YWl0QWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgICAgICBzdG9wQXBwOiBmYWxzZX07XG4gIH1cbiAgYXJncyA9IGF3YWl0IHV0aWwuZmlsdGVyT2JqZWN0KGFyZ3MpO1xuICB0aGlzLmxvZy5kZWJ1ZyhgQnJpbmdpbmcgYXBwbGljYXRpb24gYmFjayB0byBmb3JlZ3JvdW5kIHdpdGggYXJndW1lbnRzOiAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoYXJncyk7XG59O1xuXG5jb21tYW5kcy5nZXRTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gZ2V0U3RyaW5ncyAobGFuZ3VhZ2UpIHtcbiAgaWYgKCFsYW5ndWFnZSkge1xuICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5hZGIuZ2V0RGV2aWNlTGFuZ3VhZ2UoKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBObyBsYW5ndWFnZSBzcGVjaWZpZWQsIHJldHVybmluZyBzdHJpbmdzIGZvcjogJHtsYW5ndWFnZX1gKTtcbiAgfVxuXG4gIC8vIENsaWVudHMgcmVxdWlyZSB0aGUgcmVzdWx0aW5nIG1hcHBpbmcgdG8gaGF2ZSBib3RoIGtleXNcbiAgLy8gYW5kIHZhbHVlcyBvZiB0eXBlIHN0cmluZ1xuICBjb25zdCBwcmVwcm9jZXNzU3RyaW5nc01hcCA9IChtYXBwaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKG1hcHBpbmcpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IF8uaXNTdHJpbmcodmFsdWUpID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgaWYgKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIHN0cmluZ3NcbiAgICByZXR1cm4gcHJlcHJvY2Vzc1N0cmluZ3NNYXAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSk7XG4gIH1cblxuICB0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMucHVzaFN0cmluZ3MobGFuZ3VhZ2UsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBpZiAodGhpcy5ib290c3RyYXApIHtcbiAgICAvLyBUT0RPOiBUaGlzIGlzIG11dGF0aW5nIHRoZSBjdXJyZW50IGxhbmd1YWdlLCBidXQgaXQncyBob3cgYXBwaXVtIGN1cnJlbnRseSB3b3Jrc1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3VwZGF0ZVN0cmluZ3MnKTtcbiAgfVxuXG4gIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbn07XG5cbmNvbW1hbmRzLmxhdW5jaEFwcCA9IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaEFwcCAoKSB7XG4gIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuICBhd2FpdCB0aGlzLnN0YXJ0QVVUKCk7XG59O1xuXG5jb21tYW5kcy5zdGFydEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBY3Rpdml0eSAoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksXG4gIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHksIGludGVudEFjdGlvbiwgaW50ZW50Q2F0ZWdvcnksIGludGVudEZsYWdzLFxuICBvcHRpb25hbEludGVudEFyZ3VtZW50cywgZG9udFN0b3BBcHBPblJlc2V0KSB7XG4gIHRoaXMubG9nLmRlYnVnKGBTdGFydGluZyBwYWNrYWdlICcke2FwcFBhY2thZ2V9JyBhbmQgYWN0aXZpdHkgJyR7YXBwQWN0aXZpdHl9J2ApO1xuXG4gIC8vIGRvbnRTdG9wQXBwT25SZXNldCBpcyBib3RoIGFuIGFyZ3VtZW50IGhlcmUsIGFuZCBhIGRlc2lyZWQgY2FwYWJpbGl0eVxuICAvLyBpZiB0aGUgYXJndW1lbnQgaXMgc2V0LCB1c2UgaXQsIG90aGVyd2lzZSB1c2UgdGhlIGNhcFxuICBpZiAoIXV0aWwuaGFzVmFsdWUoZG9udFN0b3BBcHBPblJlc2V0KSkge1xuICAgIGRvbnRTdG9wQXBwT25SZXNldCA9ICEhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldDtcbiAgfVxuXG4gIGxldCBhcmdzID0ge1xuICAgIHBrZzogYXBwUGFja2FnZSxcbiAgICBhY3Rpdml0eTogYXBwQWN0aXZpdHksXG4gICAgd2FpdFBrZzogYXBwV2FpdFBhY2thZ2UgfHwgYXBwUGFja2FnZSxcbiAgICB3YWl0QWN0aXZpdHk6IGFwcFdhaXRBY3Rpdml0eSB8fCBhcHBBY3Rpdml0eSxcbiAgICBhY3Rpb246IGludGVudEFjdGlvbixcbiAgICBjYXRlZ29yeTogaW50ZW50Q2F0ZWdvcnksXG4gICAgZmxhZ3M6IGludGVudEZsYWdzLFxuICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgIHN0b3BBcHA6ICFkb250U3RvcEFwcE9uUmVzZXRcbiAgfTtcbiAgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzID0gdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzIHx8IHt9O1xuICB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXJncy53YWl0UGtnfS8ke2FyZ3Mud2FpdEFjdGl2aXR5fWBdID0gYXJncztcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoYXJncyk7XG59O1xuXG5jb21tYW5kcy5yZXNldCA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0ICgpIHtcbiAgYXdhaXQgYW5kcm9pZEhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywge2Zhc3RSZXNldDogdHJ1ZX0pKTtcbiAgLy8gcmVzZXQgY29udGV4dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvbiBjb250ZXh0IHdlIHdpbGwgZW5kIHVwIGFmdGVyIGFwcCBsYXVuY2guXG4gIGF3YWl0IHRoaXMuc2V0Q29udGV4dCgpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5pc0Nocm9tZVNlc3Npb24gPyB0aGlzLnN0YXJ0Q2hyb21lU2Vzc2lvbigpIDogdGhpcy5zdGFydEFVVCgpO1xufTtcblxuY29tbWFuZHMuc3RhcnRBVVQgPSBhc3luYyBmdW5jdGlvbiBzdGFydEFVVCAoKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKHtcbiAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgIGFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgIGNhdGVnb3J5OiB0aGlzLm9wdHMuaW50ZW50Q2F0ZWdvcnksXG4gICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyxcbiAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgd2FpdEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5LFxuICAgIHdhaXRGb3JMYXVuY2g6IHRoaXMub3B0cy5hcHBXYWl0Rm9yTGF1bmNoLFxuICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICBvcHRpb25hbEludGVudEFyZ3VtZW50czogdGhpcy5vcHRzLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgIHN0b3BBcHA6ICF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0LFxuICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZSxcbiAgfSk7XG59O1xuXG4vLyB3ZSBvdmVycmlkZSBzZXRVcmwgdG8gdGFrZSBhbiBhbmRyb2lkIFVSSSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZGVlcC1saW5raW5nXG4vLyBpbnNpZGUgYW4gYXBwLCBzaW1pbGFyIHRvIHN0YXJ0aW5nIGFuIGludGVudFxuY29tbWFuZHMuc2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gc2V0VXJsICh1cmkpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJpLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG59O1xuXG4vLyBjbG9zaW5nIGFwcCB1c2luZyBmb3JjZSBzdG9wXG5jb21tYW5kcy5jbG9zZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQXBwICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgLy8gcmVzZXQgY29udGV4dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvbiBjb250ZXh0IHdlIHdpbGwgZW5kIHVwIGFmdGVyIGFwcCBsYXVuY2guXG4gIGF3YWl0IHRoaXMuc2V0Q29udGV4dCgpO1xufTtcblxuY29tbWFuZHMuZ2V0RGlzcGxheURlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXREaXNwbGF5RGVuc2l0eSAoKSB7XG4gIC8vIGZpcnN0IHRyeSB0aGUgcHJvcGVydHkgZm9yIGRldmljZXNcbiAgbGV0IG91dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZ2V0cHJvcCcsICdyby5zZi5sY2RfZGVuc2l0eSddKTtcbiAgaWYgKG91dCkge1xuICAgIGxldCB2YWwgPSBwYXJzZUludChvdXQsIDEwKTtcbiAgICAvLyBpZiB0aGUgdmFsdWUgaXMgTmFOLCB0cnkgZ2V0dGluZyB0aGUgZW11bGF0b3IgcHJvcGVydHlcbiAgICBpZiAoIWlzTmFOKHZhbCkpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgZGVuc2l0eSB2YWx1ZSB3YXMgTmFOOiBcIiR7b3V0fVwiYCk7XG4gIH1cbiAgLy8gZmFsbGJhY2sgdG8gdHJ5aW5nIHByb3BlcnR5IGZvciBlbXVsYXRvcnNcbiAgb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydnZXRwcm9wJywgJ3FlbXUuc2YubGNkX2RlbnNpdHknXSk7XG4gIGlmIChvdXQpIHtcbiAgICBsZXQgdmFsID0gcGFyc2VJbnQob3V0LCAxMCk7XG4gICAgaWYgKCFpc05hTih2YWwpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIGRlbnNpdHkgdmFsdWUgd2FzIE5hTjogXCIke291dH1cImApO1xuICB9XG4gIC8vIGNvdWxkbid0IGdldCBhbnl0aGluZywgc28gZXJyb3Igb3V0XG4gIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ0ZhaWxlZCB0byBnZXQgZGlzcGxheSBkZW5zaXR5IHByb3BlcnR5LicpO1xufTtcblxuY29tbWFuZHMubW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7YWN0aW9ufSA9IG9wdHM7XG4gIGlmICghdXRpbC5oYXNWYWx1ZShhY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ2FjdGlvbicgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMuYWRiLnBlcmZvcm1FZGl0b3JBY3Rpb24oYWN0aW9uKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHJlY2VudCBzeXN0ZW0gbm90aWZpY2F0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXROb3RpZmljYXRpb25zYCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVHZXROb3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Tm90aWZpY2F0aW9ucyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXROb3RpZmljYXRpb25zKCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNtc0xpc3RPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4IFsxMDBdIC0gVGhlIG1heGltdW0gY291bnQgb2YgcmVjZW50IFNNUyBtZXNzYWdlc1xuICogdG8gcmV0cmlldmVcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiByZWNlbnQgU01TIG1lc3NhZ2VzIHdpdGggdGhlaXIgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge1Ntc0xpc3RPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXRTbXNMaXN0YCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVMaXN0U21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTGlzdFNtcyAob3B0cyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXRTbXNMaXN0KG9wdHMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmxvY2tPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZz99IGtleSBUaGUgdW5sb2NrIGtleS4gVGhlIHZhbHVlIG9mIHRoaXMga2V5IGRlcGVuZHNcbiAqIG9uIHRoZSBhY3R1YWwgdW5sb2NrIHR5cGUgYW5kIGNvdWxkIGJlIGEgcGluL3Bhc3N3b3JkL3BhdHRlcm4gdmFsdWUgb3JcbiAqIGEgYmlvbWV0cmljIGZpbmdlciBpZC5cbiAqIElmIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gc2Vzc2lvbiBjYXBhYmlsaXRpZXMgaXMgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdHlwZSBUaGUgdW5sb2NrIHR5cGUuIFRoZSBmb2xsb3dpbmcgdW5sb2NrIHR5cGVzXG4gKiBhcmUgc3VwcG9ydGVkOiBgcGluYCwgYHBpbldpdGhLZXlFdmVudGAsIGBwYXNzd29yZGAsIGBwYXR0ZXJuYCBhbmQgYGZpbmdlcnByaW50YC5cbiAqIElmIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gc2Vzc2lvbiBjYXBhYmlsaXRpZXMgaXMgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gc3RyYXRlZ3kgRWl0aGVyICdsb2Nrc2V0dGluZ3MnIChkZWZhdWx0KSBvciAndWlhdXRvbWF0b3InLlxuICogU2V0dGluZyBpdCB0byAndWlhdXRvbWF0b3InIHdpbGwgZW5mb3JjZSB0aGUgZHJpdmVyIHRvIGF2b2lkIHVzaW5nIHNwZWNpYWxcbiAqIEFEQiBzaG9ydGN1dHMgaW4gb3JkZXIgdG8gc3BlZWQgdXAgdGhlIHVubG9jayBwcm9jZWR1cmUuXG4gKiBAcHJvcGVydHkge251bWJlcj99IHRpbWVvdXRNcyBbMjAwMF0gVGhlIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIHRvIHdhaXQgdW50aWwgdGhlIHNjcmVlbiBnZXRzIHVubG9ja2VkXG4gKi9cblxuLyoqXG4gKiBVbmxvY2tzIHRoZSBkZXZpY2UgaWYgaXQgaXMgbG9ja2VkLiBOb29wIGlmIHRoZSBkZXZpY2UncyBzY3JlZW4gaXMgbm90IGxvY2tlZC5cbiAqXG4gKiBAcGFyYW0ge1VubG9ja09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB1bmxvY2sgb3BlcmF0aW9uIGZhaWxzIG9yIHRoZSBwcm92aWRlZFxuICogYXJndW1lbnRzIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVW5sb2NrIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBrZXksIHR5cGUsIHN0cmF0ZWd5LCB0aW1lb3V0TXMgfSA9IG9wdHM7XG4gIGlmICgha2V5ICYmICF0eXBlKSB7XG4gICAgYXdhaXQgdGhpcy51bmxvY2soKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHtcbiAgICAgIHVubG9ja0tleToga2V5LFxuICAgICAgdW5sb2NrVHlwZTogdHlwZSxcbiAgICAgIHVubG9ja1N0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgIHVubG9ja1N1Y2Nlc3NUaW1lb3V0OiB0aW1lb3V0TXMsXG4gICAgfSk7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsZUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksU0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBTCxPQUFBO0FBRUEsTUFBTU0scUJBQXFCLEdBQUcsc0JBQXNCO0FBRXBELElBQUlDLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUNDLE9BQUEsQ0FBQUYsT0FBQSxHQUFBQSxPQUFBO0FBQUFFLE9BQUEsQ0FBQUgsUUFBQSxHQUFBQSxRQUFBO0FBRWpEQSxRQUFRLENBQUNJLElBQUksR0FBRyxlQUFlQSxJQUFJQSxDQUFFQSxJQUFJLEVBQUU7RUFFekNBLElBQUksR0FBR0MsZUFBQyxDQUFDQyxPQUFPLENBQUNGLElBQUksQ0FBQyxHQUFHQSxJQUFJLENBQUNHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBR0gsSUFBSTtFQUM3QyxJQUFJSSxNQUFNLEdBQUc7SUFDWEMsSUFBSSxFQUFFTCxJQUFJO0lBQ1ZNLE9BQU8sRUFBRTtFQUNYLENBQUM7RUFDRCxJQUFJLElBQUksQ0FBQ0MsSUFBSSxDQUFDQyxlQUFlLEVBQUU7SUFDN0JKLE1BQU0sQ0FBQ0ksZUFBZSxHQUFHLElBQUk7RUFDL0I7RUFDQSxNQUFNLElBQUksQ0FBQ0Ms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
332
+ exports.default = extensions;
333
+ //# sourceMappingURL=general.js.map