@appium/base-driver 8.7.1 → 8.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/basedriver/capabilities.d.ts +207 -42
- package/build/lib/basedriver/capabilities.d.ts.map +1 -1
- package/build/lib/basedriver/capabilities.js +39 -44
- package/build/lib/basedriver/capabilities.js.map +1 -0
- package/build/lib/basedriver/commands/event.js +3 -3
- package/build/lib/basedriver/commands/event.js.map +1 -0
- package/build/lib/basedriver/commands/execute.js +3 -3
- package/build/lib/basedriver/commands/execute.js.map +1 -0
- package/build/lib/basedriver/commands/find.js.map +1 -0
- package/build/lib/basedriver/commands/index.js.map +1 -0
- package/build/lib/basedriver/commands/log.js +3 -3
- package/build/lib/basedriver/commands/log.js.map +1 -0
- package/build/lib/basedriver/commands/session.js +3 -3
- package/build/lib/basedriver/commands/session.js.map +1 -0
- package/build/lib/basedriver/commands/settings.js.map +1 -0
- package/build/lib/basedriver/commands/timeout.js +3 -3
- package/build/lib/basedriver/commands/timeout.js.map +1 -0
- package/build/lib/basedriver/core.d.ts +171 -20
- package/build/lib/basedriver/core.d.ts.map +1 -1
- package/build/lib/basedriver/core.js +4 -6
- package/build/lib/basedriver/core.js.map +1 -0
- package/build/lib/basedriver/desired-caps.d.ts +0 -2
- package/build/lib/basedriver/desired-caps.d.ts.map +1 -1
- package/build/lib/basedriver/desired-caps.js +4 -53
- package/build/lib/basedriver/desired-caps.js.map +1 -0
- package/build/lib/basedriver/device-settings.js +3 -3
- package/build/lib/basedriver/device-settings.js.map +1 -0
- package/build/lib/basedriver/driver.d.ts +318 -28
- package/build/lib/basedriver/driver.d.ts.map +1 -1
- package/build/lib/basedriver/driver.js +23 -30
- package/build/lib/basedriver/driver.js.map +1 -0
- package/build/lib/basedriver/helpers.d.ts +1 -1
- package/build/lib/basedriver/helpers.d.ts.map +1 -1
- package/build/lib/basedriver/helpers.js +3 -3
- package/build/lib/basedriver/helpers.js.map +1 -0
- package/build/lib/basedriver/logger.js.map +1 -0
- package/build/lib/constants.js.map +1 -0
- package/build/lib/express/crash.js.map +1 -0
- package/build/lib/express/express-logging.js +3 -3
- package/build/lib/express/express-logging.js.map +1 -0
- package/build/lib/express/idempotency.js +3 -3
- package/build/lib/express/idempotency.js.map +1 -0
- package/build/lib/express/logger.js.map +1 -0
- package/build/lib/express/middleware.js +3 -3
- package/build/lib/express/middleware.js.map +1 -0
- package/build/lib/express/server.js +3 -3
- package/build/lib/express/server.js.map +1 -0
- package/build/lib/express/static.js +3 -3
- package/build/lib/express/static.js.map +1 -0
- package/build/lib/express/websocket.js +3 -3
- package/build/lib/express/websocket.js.map +1 -0
- package/build/lib/helpers/capabilities.d.ts +66 -5
- package/build/lib/helpers/capabilities.d.ts.map +1 -1
- package/build/lib/helpers/capabilities.js +7 -7
- package/build/lib/helpers/capabilities.js.map +1 -0
- package/build/lib/index.d.ts +1 -1
- package/build/lib/index.d.ts.map +1 -1
- package/build/lib/index.js +10 -3
- package/build/lib/index.js.map +1 -0
- package/build/lib/jsonwp-proxy/protocol-converter.js +3 -3
- package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -0
- package/build/lib/jsonwp-proxy/proxy.js +3 -3
- package/build/lib/jsonwp-proxy/proxy.js.map +1 -0
- package/build/lib/jsonwp-status/status.js +3 -3
- package/build/lib/jsonwp-status/status.js.map +1 -0
- package/build/lib/protocol/errors.js +3 -3
- package/build/lib/protocol/errors.js.map +1 -0
- package/build/lib/protocol/helpers.js +3 -3
- package/build/lib/protocol/helpers.js.map +1 -0
- package/build/lib/protocol/index.js.map +1 -0
- package/build/lib/protocol/protocol.js +3 -3
- package/build/lib/protocol/protocol.js.map +1 -0
- package/build/lib/protocol/routes.js +3 -3
- package/build/lib/protocol/routes.js.map +1 -0
- package/build/lib/protocol/validators.js +3 -3
- package/build/lib/protocol/validators.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/basedriver/capabilities.js +151 -93
- package/lib/basedriver/core.js +34 -18
- package/lib/basedriver/desired-caps.js +1 -53
- package/lib/basedriver/driver.js +98 -51
- package/lib/helpers/capabilities.js +19 -9
- package/lib/index.js +1 -0
- package/package.json +9 -10
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
@@ -27,7 +25,9 @@ var _commands = require("./commands");
|
|
|
27
25
|
|
|
28
26
|
var _helpers = _interopRequireDefault(require("./helpers"));
|
|
29
27
|
|
|
30
|
-
var
|
|
28
|
+
var _types = require("@appium/types");
|
|
29
|
+
|
|
30
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
31
31
|
|
|
32
32
|
const EVENT_SESSION_INIT = 'newSessionRequested';
|
|
33
33
|
const EVENT_SESSION_START = 'newSessionStarted';
|
|
@@ -36,8 +36,17 @@ const EVENT_SESSION_QUIT_DONE = 'quitSessionFinished';
|
|
|
36
36
|
const ON_UNEXPECTED_SHUTDOWN_EVENT = 'onUnexpectedShutdown';
|
|
37
37
|
|
|
38
38
|
class BaseDriverCore extends _core.DriverCore {
|
|
39
|
-
_constraints = _lodash.default.cloneDeep(_desiredCaps.desiredCapabilityConstraints);
|
|
40
39
|
cliArgs;
|
|
40
|
+
caps;
|
|
41
|
+
originalCaps;
|
|
42
|
+
desiredCapConstraints;
|
|
43
|
+
opts;
|
|
44
|
+
|
|
45
|
+
get _desiredCapConstraints() {
|
|
46
|
+
return Object.freeze(_lodash.default.merge({}, _types.BASE_DESIRED_CAP_CONSTRAINTS, this.desiredCapConstraints));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static BASE_DESIRED_CAP_CONSTRAINTS = _types.BASE_DESIRED_CAP_CONSTRAINTS;
|
|
41
50
|
|
|
42
51
|
async executeCommand(cmd, ...args) {
|
|
43
52
|
let startTime = Date.now();
|
|
@@ -165,19 +174,19 @@ class BaseDriverCore extends _core.DriverCore {
|
|
|
165
174
|
}
|
|
166
175
|
|
|
167
176
|
this.setProtocolW3C();
|
|
168
|
-
this.originalCaps =
|
|
177
|
+
this.originalCaps = originalCaps;
|
|
169
178
|
this.log.debug(`Creating session with W3C capabilities: ${JSON.stringify(originalCaps, null, 2)}`);
|
|
170
179
|
let caps;
|
|
171
180
|
|
|
172
181
|
try {
|
|
173
|
-
caps = (0, _capabilities.processCapabilities)(originalCaps, this.
|
|
182
|
+
caps = (0, _capabilities.processCapabilities)(originalCaps, this._desiredCapConstraints, this.shouldValidateCaps);
|
|
174
183
|
|
|
175
184
|
if (caps[_capabilities.APPIUM_OPTS_CAP]) {
|
|
176
185
|
this.log.debug(`Found ${_capabilities.PREFIXED_APPIUM_OPTS_CAP} capability present; will promote items inside to caps`);
|
|
177
186
|
caps = (0, _capabilities.promoteAppiumOptions)(caps);
|
|
178
187
|
}
|
|
179
188
|
|
|
180
|
-
caps = (0, _capabilities2.fixCaps)(caps, this.
|
|
189
|
+
caps = (0, _capabilities2.fixCaps)(caps, this._desiredCapConstraints, this.log);
|
|
181
190
|
} catch (e) {
|
|
182
191
|
throw new _protocol.errors.SessionNotCreatedError(e.message);
|
|
183
192
|
}
|
|
@@ -185,8 +194,9 @@ class BaseDriverCore extends _core.DriverCore {
|
|
|
185
194
|
this.validateDesiredCaps(caps);
|
|
186
195
|
this.sessionId = _support.util.uuidV4();
|
|
187
196
|
this.caps = caps;
|
|
188
|
-
this.opts = _lodash.default.cloneDeep(this.initialOpts)
|
|
189
|
-
|
|
197
|
+
this.opts = { ..._lodash.default.cloneDeep(this.initialOpts),
|
|
198
|
+
...this.caps
|
|
199
|
+
};
|
|
190
200
|
|
|
191
201
|
if (this.opts.noReset && this.opts.fullReset) {
|
|
192
202
|
throw new Error("The 'noReset' and 'fullReset' capabilities are mutually " + 'exclusive and should not both be set to true. You ' + "probably meant to just use 'fullReset' on its own");
|
|
@@ -230,7 +240,7 @@ class BaseDriverCore extends _core.DriverCore {
|
|
|
230
240
|
}
|
|
231
241
|
|
|
232
242
|
logExtraCaps(caps) {
|
|
233
|
-
let extraCaps = _lodash.default.difference(_lodash.default.keys(caps), _lodash.default.keys(this.
|
|
243
|
+
let extraCaps = _lodash.default.difference(_lodash.default.keys(caps), _lodash.default.keys(this._desiredCapConstraints));
|
|
234
244
|
|
|
235
245
|
if (extraCaps.length) {
|
|
236
246
|
this.log.warn(`The following capabilities were provided, but are not ` + `recognized by Appium:`);
|
|
@@ -247,7 +257,7 @@ class BaseDriverCore extends _core.DriverCore {
|
|
|
247
257
|
}
|
|
248
258
|
|
|
249
259
|
try {
|
|
250
|
-
(0, _capabilities.validateCaps)(caps, this.
|
|
260
|
+
(0, _capabilities.validateCaps)(caps, this._desiredCapConstraints);
|
|
251
261
|
} catch (e) {
|
|
252
262
|
this.log.errorAndThrow(new _protocol.errors.SessionNotCreatedError(`The desiredCapabilities object was not valid for the ` + `following reason(s): ${e.message}`));
|
|
253
263
|
}
|
|
@@ -256,30 +266,13 @@ class BaseDriverCore extends _core.DriverCore {
|
|
|
256
266
|
return true;
|
|
257
267
|
}
|
|
258
268
|
|
|
259
|
-
set desiredCapConstraints(constraints) {
|
|
260
|
-
this._constraints = Object.assign(this._constraints, constraints);
|
|
261
|
-
|
|
262
|
-
for (const [, value] of _lodash.default.toPairs(this._constraints)) {
|
|
263
|
-
if (value && value.presence === true) {
|
|
264
|
-
value.presence = {
|
|
265
|
-
allowEmpty: false
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
get desiredCapConstraints() {
|
|
272
|
-
return this._constraints;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
269
|
}
|
|
276
270
|
|
|
277
271
|
exports.BaseDriverCore = BaseDriverCore;
|
|
278
272
|
|
|
279
|
-
class
|
|
273
|
+
class BaseDriver extends (0, _commands.createBaseDriverClass)(BaseDriverCore) {}
|
|
280
274
|
|
|
281
|
-
const BaseDriver = _BaseDriver;
|
|
282
275
|
exports.BaseDriver = BaseDriver;
|
|
283
276
|
var _default = BaseDriver;
|
|
284
277
|
exports.default = _default;
|
|
285
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFVkVOVF9TRVNTSU9OX0lOSVQiLCJFVkVOVF9TRVNTSU9OX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX0RPTkUiLCJPTl9VTkVYUEVDVEVEX1NIVVRET1dOX0VWRU5UIiwiQmFzZURyaXZlckNvcmUiLCJEcml2ZXJDb3JlIiwiX2NvbnN0cmFpbnRzIiwiXyIsImNsb25lRGVlcCIsImRlc2lyZWRDYXBhYmlsaXR5Q29uc3RyYWludHMiLCJjbGlBcmdzIiwiZXhlY3V0ZUNvbW1hbmQiLCJjbWQiLCJhcmdzIiwic3RhcnRUaW1lIiwiRGF0ZSIsIm5vdyIsInByb3RvY29sIiwiZGV0ZXJtaW5lUHJvdG9jb2wiLCJsb2dFdmVudCIsIkRFTEVURV9TRVNTSU9OX0NPTU1BTkQiLCJjbGVhck5ld0NvbW1hbmRUaW1lb3V0Iiwic2h1dGRvd25VbmV4cGVjdGVkbHkiLCJlcnJvcnMiLCJOb1N1Y2hEcml2ZXJFcnJvciIsIk5vdFlldEltcGxlbWVudGVkRXJyb3IiLCJ1bmV4cGVjdGVkU2h1dGRvd25MaXN0ZW5lciIsImNvbW1hbmRFeGVjdXRvciIsIkIiLCJyYWNlIiwicmVzb2x2ZSIsInJlamVjdCIsImV2ZW50RW1pdHRlciIsIm9uIiwiZmluYWxseSIsInJlbW92ZUxpc3RlbmVyIiwicmVzIiwiaXNDb21tYW5kc1F1ZXVlRW5hYmxlZCIsImNvbW1hbmRzUXVldWVHdWFyZCIsImFjcXVpcmUiLCJCYXNlRHJpdmVyIiwibmFtZSIsInN0YXJ0TmV3Q29tbWFuZFRpbWVvdXQiLCJlbmRUaW1lIiwiX2V2ZW50SGlzdG9yeSIsImNvbW1hbmRzIiwicHVzaCIsInN0YXJ0VW5leHBlY3RlZFNodXRkb3duIiwiZXJyIiwiZW1pdCIsInNlc3Npb25JZCIsImRlbGV0ZVNlc3Npb24iLCJuZXdDb21tYW5kVGltZW91dE1zIiwibm9Db21tYW5kVGltZXIiLCJzZXRUaW1lb3V0IiwibG9nIiwid2FybiIsImVycm9yTWVzc2FnZSIsIkVycm9yIiwiYXNzaWduU2VydmVyIiwic2VydmVyIiwiaG9zdCIsInBvcnQiLCJwYXRoIiwic2VydmVySG9zdCIsInNlcnZlclBvcnQiLCJzZXJ2ZXJQYXRoIiwicmVzZXQiLCJkZWJ1ZyIsImN1cnJlbnRDb25maWciLCJwcm9wZXJ0eSIsInJlc2V0T25VbmV4cGVjdGVkU2h1dGRvd24iLCJjcmVhdGVTZXNzaW9uIiwib3JpZ2luYWxDYXBzIiwia2V5IiwidmFsdWUiLCJ0b1BhaXJzIiwidzNjQ2FwYWJpbGl0aWVzMSIsInczY0NhcGFiaWxpdGllczIiLCJ3M2NDYXBhYmlsaXRpZXMiLCJkcml2ZXJEYXRhIiwiU2Vzc2lvbk5vdENyZWF0ZWRFcnJvciIsImZpbmQiLCJpc1czY0NhcHMiLCJzZXRQcm90b2NvbFczQyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjYXBzIiwicHJvY2Vzc0NhcGFiaWxpdGllcyIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsIkFQUElVTV9PUFRTX0NBUCIsIlBSRUZJWEVEX0FQUElVTV9PUFRTX0NBUCIsInByb21vdGVBcHBpdW1PcHRpb25zIiwiZml4Q2FwcyIsImUiLCJtZXNzYWdlIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsInV0aWwiLCJ1dWlkVjQiLCJvcHRzIiwiaW5pdGlhbE9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJub1Jlc2V0IiwiZnVsbFJlc2V0IiwiZmFzdFJlc2V0Iiwic2tpcFVuaW5zdGFsbCIsImFwcCIsInRyaW0iLCJpc1VuZGVmaW5lZCIsIm5ld0NvbW1hbmRUaW1lb3V0IiwiX2xvZyIsInByZWZpeCIsImhlbHBlcnMiLCJnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCIsImluZm8iLCJpc0J1c3kiLCJrZXlzIiwicXVldWVzIiwibG9nRXh0cmFDYXBzIiwiZXh0cmFDYXBzIiwiZGlmZmVyZW5jZSIsImxlbmd0aCIsImNhcCIsInZhbGlkYXRlQ2FwcyIsImVycm9yQW5kVGhyb3ciLCJjb25zdHJhaW50cyIsInByZXNlbmNlIiwiYWxsb3dFbXB0eSIsIl9CYXNlRHJpdmVyIiwiY3JlYXRlQmFzZURyaXZlckNsYXNzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2Jhc2Vkcml2ZXIvZHJpdmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHJlcXVpcmUtYXdhaXQgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5cbmltcG9ydCB7XG4gIHZhbGlkYXRlQ2FwcyxcbiAgQVBQSVVNX09QVFNfQ0FQLFxuICBQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVAsXG4gIHByb2Nlc3NDYXBhYmlsaXRpZXMsXG4gIHByb21vdGVBcHBpdW1PcHRpb25zLFxufSBmcm9tICcuL2NhcGFiaWxpdGllcyc7XG5pbXBvcnQge0RyaXZlckNvcmV9IGZyb20gJy4vY29yZSc7XG5pbXBvcnQge3V0aWx9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtmaXhDYXBzLCBpc1czY0NhcHN9IGZyb20gJy4uL2hlbHBlcnMvY2FwYWJpbGl0aWVzJztcbmltcG9ydCB7REVMRVRFX1NFU1NJT05fQ09NTUFORCwgZGV0ZXJtaW5lUHJvdG9jb2wsIGVycm9yc30gZnJvbSAnLi4vcHJvdG9jb2wnO1xuaW1wb3J0IHtjcmVhdGVCYXNlRHJpdmVyQ2xhc3N9IGZyb20gJy4vY29tbWFuZHMnO1xuaW1wb3J0IGhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7ZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50c30gZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuXG5jb25zdCBFVkVOVF9TRVNTSU9OX0lOSVQgPSAnbmV3U2Vzc2lvblJlcXVlc3RlZCc7XG5jb25zdCBFVkVOVF9TRVNTSU9OX1NUQVJUID0gJ25ld1Nlc3Npb25TdGFydGVkJztcbmNvbnN0IEVWRU5UX1NFU1NJT05fUVVJVF9TVEFSVCA9ICdxdWl0U2Vzc2lvblJlcXVlc3RlZCc7XG5jb25zdCBFVkVOVF9TRVNTSU9OX1FVSVRfRE9ORSA9ICdxdWl0U2Vzc2lvbkZpbmlzaGVkJztcbmNvbnN0IE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQgPSAnb25VbmV4cGVjdGVkU2h1dGRvd24nO1xuXG4vKipcbiAqIEBpbXBsZW1lbnRzIHtTZXNzaW9uSGFuZGxlcn1cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VEcml2ZXJDb3JlIGV4dGVuZHMgRHJpdmVyQ29yZSB7XG4gIF9jb25zdHJhaW50cyA9IF8uY2xvbmVEZWVwKGRlc2lyZWRDYXBhYmlsaXR5Q29uc3RyYWludHMpO1xuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxhbnk+fHVuZGVmaW5lZH0gKi9cbiAgY2xpQXJncztcblxuICAvLyBUaGlzIGlzIHRoZSBtYWluIGNvbW1hbmQgaGFuZGxlciBmb3IgdGhlIGRyaXZlci4gSXQgd3JhcHMgY29tbWFuZFxuICAvLyBleGVjdXRpb24gd2l0aCB0aW1lb3V0IGxvZ2ljLCBjaGVja2luZyB0aGF0IHdlIGhhdmUgYSB2YWxpZCBzZXNzaW9uLFxuICAvLyBhbmQgZW5zdXJpbmcgdGhhdCB3ZSBleGVjdXRlIGNvbW1hbmRzIG9uZSBhdCBhIHRpbWUuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZFxuICAvLyBieSBNSlNPTldQJ3MgZXhwcmVzcyByb3V0ZXIuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY21kXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKSB7XG4gICAgLy8gZ2V0IHN0YXJ0IHRpbWUgZm9yIHRoaXMgY29tbWFuZCwgYW5kIGxvZyBpbiBzcGVjaWFsIGNhc2VzXG4gICAgbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICBpZiAoY21kID09PSAnY3JlYXRlU2Vzc2lvbicpIHtcbiAgICAgIC8vIElmIGNyZWF0aW5nIGEgc2Vzc2lvbiBkZXRlcm1pbmUgaWYgVzNDIG9yIE1KU09OV1AgcHJvdG9jb2wgd2FzIHJlcXVlc3RlZCBhbmQgcmVtZW1iZXIgdGhlIGNob2ljZVxuICAgICAgdGhpcy5wcm90b2NvbCA9IGRldGVybWluZVByb3RvY29sKGFyZ3MpO1xuICAgICAgdGhpcy5sb2dFdmVudChFVkVOVF9TRVNTSU9OX0lOSVQpO1xuICAgIH0gZWxzZSBpZiAoY21kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fUVVJVF9TVEFSVCk7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgaGFkIGEgY29tbWFuZCB0aW1lciBydW5uaW5nLCBjbGVhciBpdCBub3cgdGhhdCB3ZSdyZSBzdGFydGluZ1xuICAgIC8vIGEgbmV3IGNvbW1hbmQgYW5kIHNvIGRvbid0IHdhbnQgdG8gdGltZSBvdXRcbiAgICBhd2FpdCB0aGlzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKTtcblxuICAgIGlmICh0aGlzLnNodXRkb3duVW5leHBlY3RlZGx5KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaERyaXZlckVycm9yKCdUaGUgZHJpdmVyIHdhcyB1bmV4cGVjdGVkbHkgc2h1dCBkb3duIScpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBjb21tYW5kLCBpdCBtdXN0IG5vdCBiZSBpbXBsZW1lbnRlZFxuICAgIGlmICghdGhpc1tjbWRdKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdFlldEltcGxlbWVudGVkRXJyb3IoKTtcbiAgICB9XG5cbiAgICBsZXQgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXI7XG4gICAgY29uc3QgY29tbWFuZEV4ZWN1dG9yID0gYXN5bmMgKCkgPT5cbiAgICAgIGF3YWl0IEIucmFjZShbXG4gICAgICAgIHRoaXNbY21kXSguLi5hcmdzKSxcbiAgICAgICAgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyID0gcmVqZWN0O1xuICAgICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLm9uKE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsIHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyKTtcbiAgICAgICAgfSksXG4gICAgICBdKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgaWYgKHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5yZW1vdmVMaXN0ZW5lcihcbiAgICAgICAgICAgIE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsXG4gICAgICAgICAgICB1bmV4cGVjdGVkU2h1dGRvd25MaXN0ZW5lclxuICAgICAgICAgICk7XG4gICAgICAgICAgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBjb25zdCByZXMgPSB0aGlzLmlzQ29tbWFuZHNRdWV1ZUVuYWJsZWRcbiAgICAgID8gYXdhaXQgdGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQuYWNxdWlyZShCYXNlRHJpdmVyLm5hbWUsIGNvbW1hbmRFeGVjdXRvcilcbiAgICAgIDogYXdhaXQgY29tbWFuZEV4ZWN1dG9yKCk7XG5cbiAgICAvLyBpZiB3ZSBoYXZlIHNldCBhIG5ldyBjb21tYW5kIHRpbWVvdXQgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSwgc3RhcnQgYVxuICAgIC8vIHRpbWVyIG9uY2Ugd2UndmUgZmluaXNoZWQgZXhlY3V0aW5nIHRoaXMgY29tbWFuZC4gSWYgd2UgZG9uJ3QgY2xlYXJcbiAgICAvLyB0aGUgdGltZXIgKHdoaWNoIGlzIGRvbmUgd2hlbiBhIG5ldyBjb21tYW5kIGNvbWVzIGluKSwgd2Ugd2lsbCB0cmlnZ2VyXG4gICAgLy8gYXV0b21hdGljIHNlc3Npb24gZGVsZXRpb24gaW4gdGhpcy5vbkNvbW1hbmRUaW1lb3V0LiBPZiBjb3Vyc2Ugd2UgZG9uJ3RcbiAgICAvLyB3YW50IHRvIHRyaWdnZXIgdGhlIHRpbWVyIHdoZW4gdGhlIHVzZXIgaXMgc2h1dHRpbmcgZG93biB0aGUgc2Vzc2lvblxuICAgIC8vIGludGVudGlvbmFsbHlcbiAgICBpZiAodGhpcy5pc0NvbW1hbmRzUXVldWVFbmFibGVkICYmIGNtZCAhPT0gREVMRVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgLy8gcmVzZXR0aW5nIGV4aXN0aW5nIHRpbWVvdXRcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnROZXdDb21tYW5kVGltZW91dCgpO1xuICAgIH1cblxuICAgIC8vIGxvZyB0aW1pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb21tYW5kXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5fZXZlbnRIaXN0b3J5LmNvbW1hbmRzLnB1c2goe2NtZCwgc3RhcnRUaW1lLCBlbmRUaW1lfSk7XG4gICAgaWYgKGNtZCA9PT0gJ2NyZWF0ZVNlc3Npb24nKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fU1RBUlQpO1xuICAgIH0gZWxzZSBpZiAoY21kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fUVVJVF9ET05FKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICAgKi9cbiAgYXN5bmMgc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24oXG4gICAgZXJyID0gbmV3IGVycm9ycy5Ob1N1Y2hEcml2ZXJFcnJvcignVGhlIGRyaXZlciB3YXMgdW5leHBlY3RlZGx5IHNodXQgZG93biEnKVxuICApIHtcbiAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsIGVycik7IC8vIGFsbG93IG90aGVycyB0byBsaXN0ZW4gZm9yIHRoaXNcbiAgICB0aGlzLnNodXRkb3duVW5leHBlY3RlZGx5ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2Vzc2lvbklkICE9PSBudWxsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbih0aGlzLnNlc3Npb25JZCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc2h1dGRvd25VbmV4cGVjdGVkbHkgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydE5ld0NvbW1hbmRUaW1lb3V0KCkge1xuICAgIC8vIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gcm9ndWUgdGltZW91dHNcbiAgICBhd2FpdCB0aGlzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKTtcblxuICAgIC8vIGlmIGNvbW1hbmQgdGltZW91dCBpcyAwLCBpdCBpcyBkaXNhYmxlZFxuICAgIGlmICghdGhpcy5uZXdDb21tYW5kVGltZW91dE1zKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcblxuICAgIHRoaXMubm9Db21tYW5kVGltZXIgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMubG9nLndhcm4oXG4gICAgICAgIGBTaHV0dGluZyBkb3duIGJlY2F1c2Ugd2Ugd2FpdGVkIGAgK1xuICAgICAgICAgIGAke3RoaXMubmV3Q29tbWFuZFRpbWVvdXRNcyAvIDEwMDAuMH0gc2Vjb25kcyBmb3IgYSBjb21tYW5kYFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XG4gICAgICAgIGBOZXcgQ29tbWFuZCBUaW1lb3V0IG9mIGAgK1xuICAgICAgICBgJHt0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMgLyAxMDAwLjB9IHNlY29uZHMgYCArXG4gICAgICAgIGBleHBpcmVkLiBUcnkgY3VzdG9taXppbmcgdGhlIHRpbWVvdXQgdXNpbmcgdGhlIGAgK1xuICAgICAgICBgJ25ld0NvbW1hbmRUaW1lb3V0JyBkZXNpcmVkIGNhcGFiaWxpdHlgO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7XG4gICAgfSwgdGhpcy5uZXdDb21tYW5kVGltZW91dE1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVNlcnZlcn0gc2VydmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBob3N0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBhc3NpZ25TZXJ2ZXIoc2VydmVyLCBob3N0LCBwb3J0LCBwYXRoKSB7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy5zZXJ2ZXJIb3N0ID0gaG9zdDtcbiAgICB0aGlzLnNlcnZlclBvcnQgPSBwb3J0O1xuICAgIHRoaXMuc2VydmVyUGF0aCA9IHBhdGg7XG4gIH1cblxuICAvKlxuICAgKiBSZXN0YXJ0IHRoZSBzZXNzaW9uIHdpdGggdGhlIG9yaWdpbmFsIGNhcHMsXG4gICAqIHByZXNlcnZpbmcgdGhlIHRpbWVvdXQgY29uZmlnLlxuICAgKi9cbiAgYXN5bmMgcmVzZXQoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ1Jlc2V0dGluZyBhcHAgbWlkLXNlc3Npb24nKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnUnVubmluZyBnZW5lcmljIGZ1bGwgcmVzZXQnKTtcblxuICAgIC8vIHByZXNlcnZpbmcgc3RhdGVcbiAgICBsZXQgY3VycmVudENvbmZpZyA9IHt9O1xuICAgIGZvciAobGV0IHByb3BlcnR5IG9mIFtcbiAgICAgICdpbXBsaWNpdFdhaXRNcycsXG4gICAgICAnbmV3Q29tbWFuZFRpbWVvdXRNcycsXG4gICAgICAnc2Vzc2lvbklkJyxcbiAgICAgICdyZXNldE9uVW5leHBlY3RlZFNodXRkb3duJyxcbiAgICBdKSB7XG4gICAgICBjdXJyZW50Q29uZmlnW3Byb3BlcnR5XSA9IHRoaXNbcHJvcGVydHldO1xuICAgIH1cblxuICAgIC8vIFdlIGFsc28gbmVlZCB0byBwcmVzZXJ2ZSB0aGUgdW5leHBlY3RlZCBzaHV0ZG93biwgYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3QgY2FuY2VsbGVkIGR1cmluZyByZXNldC5cbiAgICB0aGlzLnJlc2V0T25VbmV4cGVjdGVkU2h1dGRvd24gPSAoKSA9PiB7fTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zZXNzaW9uSWQgIT09IG51bGwpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKHRoaXMuc2Vzc2lvbklkKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKCdSZXN0YXJ0aW5nIGFwcCcpO1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVTZXNzaW9uKHRoaXMub3JpZ2luYWxDYXBzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gYWx3YXlzIHJlc3RvcmUgc3RhdGUuXG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKGN1cnJlbnRDb25maWcpKSB7XG4gICAgICAgIHRoaXNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBIaXN0b3JpY2FsbHkgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgd2VyZSByZXNlcnZlZCBmb3IgSlNPTldQIGNhcGFiaWxpdGllcy5cbiAgICogQXBwaXVtIDIgaGFzIGRyb3BwZWQgdGhlIHN1cHBvcnQgb2YgdGhlc2UsIHNvIG5vdyB3ZSBvbmx5IGFjY2VwdCBjYXBhYmlsaXR5XG4gICAqIG9iamVjdHMgaW4gVzNDIGZvcm1hdCBhbmQgdGh1cyBhbGxvdyBhbnkgb2YgdGhlIHRocmVlIGFyZ3VtZW50cyB0byByZXByZXNlbnRcbiAgICogdGhlIGxhdHRlci5cbiAgICogQHBhcmFtIHtXM0NDYXBhYmlsaXRpZXN9IHczY0NhcGFiaWxpdGllczFcbiAgICogQHBhcmFtIHtXM0NDYXBhYmlsaXRpZXN9IFt3M2NDYXBhYmlsaXRpZXMyXVxuICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllc30gW3czY0NhcGFiaWxpdGllc11cbiAgICogQHBhcmFtIHtEcml2ZXJEYXRhW119IFtkcml2ZXJEYXRhXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxbc3RyaW5nLG9iamVjdF0+fVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU2Vzc2lvbih3M2NDYXBhYmlsaXRpZXMxLCB3M2NDYXBhYmlsaXRpZXMyLCB3M2NDYXBhYmlsaXRpZXMsIGRyaXZlckRhdGEpIHtcbiAgICBpZiAodGhpcy5zZXNzaW9uSWQgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBjcmVhdGUgYSBuZXcgc2Vzc2lvbiB3aGlsZSBvbmUgaXMgaW4gcHJvZ3Jlc3MnXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmRlYnVnKCk7XG5cbiAgICBjb25zdCBvcmlnaW5hbENhcHMgPSBfLmNsb25lRGVlcChcbiAgICAgIFt3M2NDYXBhYmlsaXRpZXMsIHczY0NhcGFiaWxpdGllczEsIHczY0NhcGFiaWxpdGllczJdLmZpbmQoaXNXM2NDYXBzKVxuICAgICk7XG4gICAgaWYgKCFvcmlnaW5hbENhcHMpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihcbiAgICAgICAgJ0FwcGl1bSBvbmx5IHN1cHBvcnRzIFczQy1zdHlsZSBjYXBhYmlsaXR5IG9iamVjdHMuICcgK1xuICAgICAgICAgICdZb3VyIGNsaWVudCBpcyBzZW5kaW5nIGFuIG9sZGVyIGNhcGFiaWxpdGllcyBmb3JtYXQuIFBsZWFzZSB1cGRhdGUgeW91ciBjbGllbnQgbGlicmFyeS4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuc2V0UHJvdG9jb2xXM0MoKTtcblxuICAgIHRoaXMub3JpZ2luYWxDYXBzID0gXy5jbG9uZURlZXAob3JpZ2luYWxDYXBzKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBzZXNzaW9uIHdpdGggVzNDIGNhcGFiaWxpdGllczogJHtKU09OLnN0cmluZ2lmeShvcmlnaW5hbENhcHMsIG51bGwsIDIpfWBcbiAgICApO1xuXG4gICAgbGV0IGNhcHM7XG4gICAgdHJ5IHtcbiAgICAgIGNhcHMgPSBwcm9jZXNzQ2FwYWJpbGl0aWVzKG9yaWdpbmFsQ2FwcywgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsIHRoaXMuc2hvdWxkVmFsaWRhdGVDYXBzKTtcbiAgICAgIGlmIChjYXBzW0FQUElVTV9PUFRTX0NBUF0pIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYEZvdW5kICR7UFJFRklYRURfQVBQSVVNX09QVFNfQ0FQfSBjYXBhYmlsaXR5IHByZXNlbnQ7IHdpbGwgcHJvbW90ZSBpdGVtcyBpbnNpZGUgdG8gY2Fwc2BcbiAgICAgICAgKTtcbiAgICAgICAgY2FwcyA9IHByb21vdGVBcHBpdW1PcHRpb25zKGNhcHMpO1xuICAgICAgfVxuICAgICAgY2FwcyA9IGZpeENhcHMoY2FwcywgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsIHRoaXMubG9nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoZS5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcyk7XG5cbiAgICB0aGlzLnNlc3Npb25JZCA9IHV0aWwudXVpZFY0KCk7XG4gICAgdGhpcy5jYXBzID0gY2FwcztcbiAgICB0aGlzLm9wdHMgPSBfLmNsb25lRGVlcCh0aGlzLmluaXRpYWxPcHRzKTtcblxuICAgIC8vIG1lcmdlIGNhcHMgb250byBvcHRzIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgd2hhdCdzIHdoZXJlXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIHRoaXMuY2Fwcyk7XG5cbiAgICAvLyBkZWFsIHdpdGggcmVzZXRzXG4gICAgLy8gc29tZSBwZW9wbGUgbGlrZSB0byBkbyB3ZWlyZCB0aGluZ3MgYnkgc2V0dGluZyBub1Jlc2V0IGFuZCBmdWxsUmVzZXRcbiAgICAvLyBib3RoIHRvIHRydWUsIGJ1dCB0aGlzIGlzIG1pc2d1aWRlZCBhbmQgc3RyYW5nZSwgc28gZXJyb3IgaGVyZSBpbnN0ZWFkXG4gICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ICYmIHRoaXMub3B0cy5mdWxsUmVzZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUaGUgJ25vUmVzZXQnIGFuZCAnZnVsbFJlc2V0JyBjYXBhYmlsaXRpZXMgYXJlIG11dHVhbGx5IFwiICtcbiAgICAgICAgICAnZXhjbHVzaXZlIGFuZCBzaG91bGQgbm90IGJvdGggYmUgc2V0IHRvIHRydWUuIFlvdSAnICtcbiAgICAgICAgICBcInByb2JhYmx5IG1lYW50IHRvIGp1c3QgdXNlICdmdWxsUmVzZXQnIG9uIGl0cyBvd25cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLm9wdHMuZnVsbFJlc2V0ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLm9wdHMubm9SZXNldCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm9wdHMuZmFzdFJlc2V0ID0gIXRoaXMub3B0cy5mdWxsUmVzZXQgJiYgIXRoaXMub3B0cy5ub1Jlc2V0O1xuICAgIHRoaXMub3B0cy5za2lwVW5pbnN0YWxsID0gdGhpcy5vcHRzLmZhc3RSZXNldCB8fCB0aGlzLm9wdHMubm9SZXNldDtcblxuICAgIC8vIFByZXZlbnRzIGVtcHR5IHN0cmluZyBjYXBzIHNvIHdlIGRvbid0IG5lZWQgdG8gdGVzdCBpdCBldmVyeXdoZXJlXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMuYXBwID09PSAnc3RyaW5nJyAmJiB0aGlzLm9wdHMuYXBwLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdHMuYXBwO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLmNhcHMubmV3Q29tbWFuZFRpbWVvdXQpKSB7XG4gICAgICB0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMgPSB0aGlzLmNhcHMubmV3Q29tbWFuZFRpbWVvdXQgKiAxMDAwO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZy5wcmVmaXggPSBoZWxwZXJzLmdlbmVyYXRlRHJpdmVyTG9nUHJlZml4KHRoaXMsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIHRoaXMubG9nLmluZm8oYFNlc3Npb24gY3JlYXRlZCB3aXRoIHNlc3Npb24gaWQ6ICR7dGhpcy5zZXNzaW9uSWR9YCk7XG5cbiAgICByZXR1cm4gW3RoaXMuc2Vzc2lvbklkLCBjYXBzXTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Nlc3Npb25JZF1cbiAgICogQHBhcmFtIHtEcml2ZXJEYXRhW119IFtkcml2ZXJEYXRhXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24oc2Vzc2lvbklkLCBkcml2ZXJEYXRhKSB7XG4gICAgYXdhaXQgdGhpcy5jbGVhck5ld0NvbW1hbmRUaW1lb3V0KCk7XG4gICAgaWYgKHRoaXMuaXNDb21tYW5kc1F1ZXVlRW5hYmxlZCAmJiB0aGlzLmNvbW1hbmRzUXVldWVHdWFyZC5pc0J1c3koKSkge1xuICAgICAgLy8gc2ltcGxlIGhhY2sgdG8gcmVsZWFzZSBwZW5kaW5nIGNvbW1hbmRzIGlmIHRoZXkgZXhpc3RcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIF8ua2V5cyh0aGlzLmNvbW1hbmRzUXVldWVHdWFyZC5xdWV1ZXMpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQucXVldWVzW2tleV0gPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZXNzaW9uSWQgPSBudWxsO1xuICAgIHRoaXMuX2xvZy5wcmVmaXggPSBoZWxwZXJzLmdlbmVyYXRlRHJpdmVyTG9nUHJlZml4KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Q2FwYWJpbGl0aWVzfSBjYXBzXG4gICAqL1xuICBsb2dFeHRyYUNhcHMoY2Fwcykge1xuICAgIGxldCBleHRyYUNhcHMgPSBfLmRpZmZlcmVuY2UoXy5rZXlzKGNhcHMpLCBfLmtleXModGhpcy5fY29uc3RyYWludHMpKTtcbiAgICBpZiAoZXh0cmFDYXBzLmxlbmd0aCkge1xuICAgICAgdGhpcy5sb2cud2FybihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgY2FwYWJpbGl0aWVzIHdlcmUgcHJvdmlkZWQsIGJ1dCBhcmUgbm90IGAgKyBgcmVjb2duaXplZCBieSBBcHBpdW06YFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgY2FwIG9mIGV4dHJhQ2Fwcykge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGAgICR7Y2FwfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0NhcGFiaWxpdGllc30gY2Fwc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcykge1xuICAgIGlmICghdGhpcy5zaG91bGRWYWxpZGF0ZUNhcHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZUNhcHMoY2FwcywgdGhpcy5fY29uc3RyYWludHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coXG4gICAgICAgIG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihcbiAgICAgICAgICBgVGhlIGRlc2lyZWRDYXBhYmlsaXRpZXMgb2JqZWN0IHdhcyBub3QgdmFsaWQgZm9yIHRoZSBgICtcbiAgICAgICAgICAgIGBmb2xsb3dpbmcgcmVhc29uKHMpOiAke2UubWVzc2FnZX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2dFeHRyYUNhcHMoY2Fwcyk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHdlIG9ubHkgd2FudCBzdWJjbGFzc2VzIHRvIGV2ZXIgZXh0ZW5kIHRoZSBjb250cmFpbnRzXG4gIHNldCBkZXNpcmVkQ2FwQ29uc3RyYWludHMoY29uc3RyYWludHMpIHtcbiAgICB0aGlzLl9jb25zdHJhaW50cyA9IE9iamVjdC5hc3NpZ24odGhpcy5fY29uc3RyYWludHMsIGNvbnN0cmFpbnRzKTtcbiAgICAvLyAncHJlc2VuY2UnIG1lYW5zIGRpZmZlcmVudCB0aGluZ3MgaW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSB2YWxpZGF0b3IsXG4gICAgLy8gd2hlbiB3ZSBzYXkgJ3RydWUnIHdlIG1lYW4gdGhhdCBpdCBzaG91bGQgbm90IGJlIGFibGUgdG8gYmUgZW1wdHlcbiAgICBmb3IgKGNvbnN0IFssIHZhbHVlXSBvZiBfLnRvUGFpcnModGhpcy5fY29uc3RyYWludHMpKSB7XG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUucHJlc2VuY2UgPT09IHRydWUpIHtcbiAgICAgICAgdmFsdWUucHJlc2VuY2UgPSB7XG4gICAgICAgICAgYWxsb3dFbXB0eTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRlc2lyZWRDYXBDb25zdHJhaW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uc3RyYWludHM7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgb2YgdGhlIG1peGlucyBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgZGVzY3JpYmVkIGluIHtAbGlua2NvZGUgRHJpdmVyfS5cbiAqIEBpbXBsZW1lbnRzIHtEcml2ZXJ9XG4gKi9cbmNsYXNzIF9CYXNlRHJpdmVyIGV4dGVuZHMgY3JlYXRlQmFzZURyaXZlckNsYXNzKEJhc2VEcml2ZXJDb3JlKSB7fVxuXG4vKipcbiAqIEB0eXBlIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJDbGFzczxEcml2ZXI+fVxuICovXG5jb25zdCBCYXNlRHJpdmVyID0gX0Jhc2VEcml2ZXI7XG5cbmV4cG9ydCB7QmFzZURyaXZlcn07XG5leHBvcnQgZGVmYXVsdCBCYXNlRHJpdmVyO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5IVFRQTWV0aG9kfSBIVFRQTWV0aG9kXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyfSBEcml2ZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlcm5hbERyaXZlcn0gRXh0ZXJuYWxEcml2ZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXN9IENhcGFiaWxpdGllc1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlczQ0NhcGFiaWxpdGllc30gVzNDQ2FwYWJpbGl0aWVzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyRGF0YX0gRHJpdmVyRGF0YVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFVwZGF0ZVNlcnZlckNhbGxiYWNrXG4gKiBAcGFyYW0ge2ltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3N9IGFwcCAtIEV4cHJlc3MgYXBwXG4gKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVNlcnZlcn0gaHR0cFNlcnZlciAtIEhUVFAgc2VydmVyXG4gKiBAcmV0dXJucyB7aW1wb3J0KCd0eXBlLWZlc3QnKS5Qcm9taXNhYmxlPHZvaWQ+fVxuICovXG5cbi8qKlxuICogVGhpcyBpcyB1c2VkIHRvIGV4dGVuZCB7QGxpbmtjb2RlIEJhc2VEcml2ZXJDb3JlfSBieSB0aGUgbWl4aW5zIGFuZCBhbHNvIGV4dGVybmFsIGRyaXZlcnMuXG4gKiBAdGVtcGxhdGUgW1Byb3RvPXt9XVxuICogQHRlbXBsYXRlIFtTdGF0aWM9e31dXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ2xhc3M8QmFzZURyaXZlckNvcmUgJiBQcm90byxpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJTdGF0aWMgJiBTdGF0aWM+fSBCYXNlRHJpdmVyQmFzZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlNlc3Npb25IYW5kbGVyPFtzdHJpbmcsIG9iamVjdF0sdm9pZD59IFNlc3Npb25IYW5kbGVyXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFHQTs7QUFPQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxrQkFBa0IsR0FBRyxxQkFBM0I7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxtQkFBNUI7QUFDQSxNQUFNQyx3QkFBd0IsR0FBRyxzQkFBakM7QUFDQSxNQUFNQyx1QkFBdUIsR0FBRyxxQkFBaEM7QUFDQSxNQUFNQyw0QkFBNEIsR0FBRyxzQkFBckM7O0FBS08sTUFBTUMsY0FBTixTQUE2QkMsZ0JBQTdCLENBQXdDO0VBQzdDQyxZQUFZLEdBQUdDLGVBQUEsQ0FBRUMsU0FBRixDQUFZQyx5Q0FBWixDQUFIO0VBR1pDLE9BQU87O0VBV2EsTUFBZEMsY0FBYyxDQUFDQyxHQUFELEVBQU0sR0FBR0MsSUFBVCxFQUFlO0lBRWpDLElBQUlDLFNBQVMsR0FBR0MsSUFBSSxDQUFDQyxHQUFMLEVBQWhC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
|
|
278
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFVkVOVF9TRVNTSU9OX0lOSVQiLCJFVkVOVF9TRVNTSU9OX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX0RPTkUiLCJPTl9VTkVYUEVDVEVEX1NIVVRET1dOX0VWRU5UIiwiQmFzZURyaXZlckNvcmUiLCJEcml2ZXJDb3JlIiwiY2xpQXJncyIsImNhcHMiLCJvcmlnaW5hbENhcHMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJvcHRzIiwiX2Rlc2lyZWRDYXBDb25zdHJhaW50cyIsIk9iamVjdCIsImZyZWV6ZSIsIl8iLCJtZXJnZSIsIkJBU0VfREVTSVJFRF9DQVBfQ09OU1RSQUlOVFMiLCJleGVjdXRlQ29tbWFuZCIsImNtZCIsImFyZ3MiLCJzdGFydFRpbWUiLCJEYXRlIiwibm93IiwicHJvdG9jb2wiLCJkZXRlcm1pbmVQcm90b2NvbCIsImxvZ0V2ZW50IiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsImNsZWFyTmV3Q29tbWFuZFRpbWVvdXQiLCJzaHV0ZG93blVuZXhwZWN0ZWRseSIsImVycm9ycyIsIk5vU3VjaERyaXZlckVycm9yIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsInVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyIiwiY29tbWFuZEV4ZWN1dG9yIiwiQiIsInJhY2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZXZlbnRFbWl0dGVyIiwib24iLCJmaW5hbGx5IiwicmVtb3ZlTGlzdGVuZXIiLCJyZXMiLCJpc0NvbW1hbmRzUXVldWVFbmFibGVkIiwiY29tbWFuZHNRdWV1ZUd1YXJkIiwiYWNxdWlyZSIsIkJhc2VEcml2ZXIiLCJuYW1lIiwic3RhcnROZXdDb21tYW5kVGltZW91dCIsImVuZFRpbWUiLCJfZXZlbnRIaXN0b3J5IiwiY29tbWFuZHMiLCJwdXNoIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJlcnIiLCJlbWl0Iiwic2Vzc2lvbklkIiwiZGVsZXRlU2Vzc2lvbiIsIm5ld0NvbW1hbmRUaW1lb3V0TXMiLCJub0NvbW1hbmRUaW1lciIsInNldFRpbWVvdXQiLCJsb2ciLCJ3YXJuIiwiZXJyb3JNZXNzYWdlIiwiRXJyb3IiLCJhc3NpZ25TZXJ2ZXIiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInBhdGgiLCJzZXJ2ZXJIb3N0Iiwic2VydmVyUG9ydCIsInNlcnZlclBhdGgiLCJyZXNldCIsImRlYnVnIiwiY3VycmVudENvbmZpZyIsInByb3BlcnR5IiwicmVzZXRPblVuZXhwZWN0ZWRTaHV0ZG93biIsImNyZWF0ZVNlc3Npb24iLCJrZXkiLCJ2YWx1ZSIsInRvUGFpcnMiLCJ3M2NDYXBhYmlsaXRpZXMxIiwidzNjQ2FwYWJpbGl0aWVzMiIsInczY0NhcGFiaWxpdGllcyIsImRyaXZlckRhdGEiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwiY2xvbmVEZWVwIiwiZmluZCIsImlzVzNjQ2FwcyIsInNldFByb3RvY29sVzNDIiwiSlNPTiIsInN0cmluZ2lmeSIsInByb2Nlc3NDYXBhYmlsaXRpZXMiLCJzaG91bGRWYWxpZGF0ZUNhcHMiLCJBUFBJVU1fT1BUU19DQVAiLCJQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVAiLCJwcm9tb3RlQXBwaXVtT3B0aW9ucyIsImZpeENhcHMiLCJlIiwibWVzc2FnZSIsInZhbGlkYXRlRGVzaXJlZENhcHMiLCJ1dGlsIiwidXVpZFY0IiwiaW5pdGlhbE9wdHMiLCJub1Jlc2V0IiwiZnVsbFJlc2V0IiwiZmFzdFJlc2V0Iiwic2tpcFVuaW5zdGFsbCIsImFwcCIsInRyaW0iLCJpc1VuZGVmaW5lZCIsIm5ld0NvbW1hbmRUaW1lb3V0IiwiX2xvZyIsInByZWZpeCIsImhlbHBlcnMiLCJnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCIsImluZm8iLCJpc0J1c3kiLCJrZXlzIiwicXVldWVzIiwibG9nRXh0cmFDYXBzIiwiZXh0cmFDYXBzIiwiZGlmZmVyZW5jZSIsImxlbmd0aCIsImNhcCIsInZhbGlkYXRlQ2FwcyIsImVycm9yQW5kVGhyb3ciLCJjcmVhdGVCYXNlRHJpdmVyQ2xhc3MiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvYmFzZWRyaXZlci9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgcmVxdWlyZS1hd2FpdCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cblxuaW1wb3J0IHtcbiAgdmFsaWRhdGVDYXBzLFxuICBBUFBJVU1fT1BUU19DQVAsXG4gIFBSRUZJWEVEX0FQUElVTV9PUFRTX0NBUCxcbiAgcHJvY2Vzc0NhcGFiaWxpdGllcyxcbiAgcHJvbW90ZUFwcGl1bU9wdGlvbnMsXG59IGZyb20gJy4vY2FwYWJpbGl0aWVzJztcbmltcG9ydCB7RHJpdmVyQ29yZX0gZnJvbSAnLi9jb3JlJztcbmltcG9ydCB7dXRpbH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge2ZpeENhcHMsIGlzVzNjQ2Fwc30gZnJvbSAnLi4vaGVscGVycy9jYXBhYmlsaXRpZXMnO1xuaW1wb3J0IHtERUxFVEVfU0VTU0lPTl9DT01NQU5ELCBkZXRlcm1pbmVQcm90b2NvbCwgZXJyb3JzfSBmcm9tICcuLi9wcm90b2NvbCc7XG5pbXBvcnQge2NyZWF0ZUJhc2VEcml2ZXJDbGFzc30gZnJvbSAnLi9jb21tYW5kcyc7XG5pbXBvcnQgaGVscGVycyBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtCQVNFX0RFU0lSRURfQ0FQX0NPTlNUUkFJTlRTfSBmcm9tICdAYXBwaXVtL3R5cGVzJztcblxuY29uc3QgRVZFTlRfU0VTU0lPTl9JTklUID0gJ25ld1Nlc3Npb25SZXF1ZXN0ZWQnO1xuY29uc3QgRVZFTlRfU0VTU0lPTl9TVEFSVCA9ICduZXdTZXNzaW9uU3RhcnRlZCc7XG5jb25zdCBFVkVOVF9TRVNTSU9OX1FVSVRfU1RBUlQgPSAncXVpdFNlc3Npb25SZXF1ZXN0ZWQnO1xuY29uc3QgRVZFTlRfU0VTU0lPTl9RVUlUX0RPTkUgPSAncXVpdFNlc3Npb25GaW5pc2hlZCc7XG5jb25zdCBPTl9VTkVYUEVDVEVEX1NIVVRET1dOX0VWRU5UID0gJ29uVW5leHBlY3RlZFNodXRkb3duJztcblxuLyoqXG4gKiBAaW1wbGVtZW50cyB7U2Vzc2lvbkhhbmRsZXI8Qz59XG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBDXG4gKiBAdGVtcGxhdGUge1N0cmluZ1JlY29yZH0gW0E9U3RyaW5nUmVjb3JkXVxuICogQGV4dGVuZHMge0RyaXZlckNvcmU8Qz59XG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlRHJpdmVyQ29yZSBleHRlbmRzIERyaXZlckNvcmUge1xuICAvKipcbiAgICogQHR5cGUge0EgJiBTZXJ2ZXJBcmdzfVxuICAgKi9cbiAgY2xpQXJncztcblxuICAvKipcbiAgICogQHR5cGUge0NhcGFiaWxpdGllczxDPn1cbiAgICovXG4gIGNhcHM7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtXM0NDYXBhYmlsaXRpZXM8Qz59XG4gICAqL1xuICBvcmlnaW5hbENhcHM7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtDfVxuICAgKi9cbiAgZGVzaXJlZENhcENvbnN0cmFpbnRzO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7RHJpdmVyT3B0czxDPiAmIERyaXZlck9wdHM8QmFzZURyaXZlckNhcENvbnN0cmFpbnRzPn1cbiAgICovXG4gIG9wdHM7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIHRoZSBiYXNlIGNvbnN0cmFpbnRzIHBsdXMgd2hhdGV2ZXIgdGhlIHN1YmNsYXNzIHdhbnRzIHRvIGFkZC5cbiAgICpcbiAgICogU3ViY2xhc3NlcyBfc2hvdWxkbid0XyBuZWVkIHRvIHVzZSB0aGlzLiBJZiB5b3UgbmVlZCB0byB1c2UgdGhpcywgcGxlYXNlIGNyZWF0ZVxuICAgKiBhbiBpc3N1ZTpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvbmV3XG4gICAqIEB0eXBlIHtSZWFkb25seTxCYXNlRHJpdmVyQ2FwQ29uc3RyYWludHMgJiBDPn1cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgZ2V0IF9kZXNpcmVkQ2FwQ29uc3RyYWludHMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoXy5tZXJnZSh7fSwgQkFTRV9ERVNJUkVEX0NBUF9DT05TVFJBSU5UUywgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMpKTtcbiAgfVxuXG4gIHN0YXRpYyBCQVNFX0RFU0lSRURfQ0FQX0NPTlNUUkFJTlRTID0gQkFTRV9ERVNJUkVEX0NBUF9DT05TVFJBSU5UUztcblxuICAvLyBUaGlzIGlzIHRoZSBtYWluIGNvbW1hbmQgaGFuZGxlciBmb3IgdGhlIGRyaXZlci4gSXQgd3JhcHMgY29tbWFuZFxuICAvLyBleGVjdXRpb24gd2l0aCB0aW1lb3V0IGxvZ2ljLCBjaGVja2luZyB0aGF0IHdlIGhhdmUgYSB2YWxpZCBzZXNzaW9uLFxuICAvLyBhbmQgZW5zdXJpbmcgdGhhdCB3ZSBleGVjdXRlIGNvbW1hbmRzIG9uZSBhdCBhIHRpbWUuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZFxuICAvLyBieSBNSlNPTldQJ3MgZXhwcmVzcyByb3V0ZXIuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY21kXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKSB7XG4gICAgLy8gZ2V0IHN0YXJ0IHRpbWUgZm9yIHRoaXMgY29tbWFuZCwgYW5kIGxvZyBpbiBzcGVjaWFsIGNhc2VzXG4gICAgbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICBpZiAoY21kID09PSAnY3JlYXRlU2Vzc2lvbicpIHtcbiAgICAgIC8vIElmIGNyZWF0aW5nIGEgc2Vzc2lvbiBkZXRlcm1pbmUgaWYgVzNDIG9yIE1KU09OV1AgcHJvdG9jb2wgd2FzIHJlcXVlc3RlZCBhbmQgcmVtZW1iZXIgdGhlIGNob2ljZVxuICAgICAgdGhpcy5wcm90b2NvbCA9IGRldGVybWluZVByb3RvY29sKGFyZ3MpO1xuICAgICAgdGhpcy5sb2dFdmVudChFVkVOVF9TRVNTSU9OX0lOSVQpO1xuICAgIH0gZWxzZSBpZiAoY21kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fUVVJVF9TVEFSVCk7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgaGFkIGEgY29tbWFuZCB0aW1lciBydW5uaW5nLCBjbGVhciBpdCBub3cgdGhhdCB3ZSdyZSBzdGFydGluZ1xuICAgIC8vIGEgbmV3IGNvbW1hbmQgYW5kIHNvIGRvbid0IHdhbnQgdG8gdGltZSBvdXRcbiAgICBhd2FpdCB0aGlzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKTtcblxuICAgIGlmICh0aGlzLnNodXRkb3duVW5leHBlY3RlZGx5KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaERyaXZlckVycm9yKCdUaGUgZHJpdmVyIHdhcyB1bmV4cGVjdGVkbHkgc2h1dCBkb3duIScpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBjb21tYW5kLCBpdCBtdXN0IG5vdCBiZSBpbXBsZW1lbnRlZFxuICAgIGlmICghdGhpc1tjbWRdKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdFlldEltcGxlbWVudGVkRXJyb3IoKTtcbiAgICB9XG5cbiAgICBsZXQgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXI7XG4gICAgY29uc3QgY29tbWFuZEV4ZWN1dG9yID0gYXN5bmMgKCkgPT5cbiAgICAgIGF3YWl0IEIucmFjZShbXG4gICAgICAgIHRoaXNbY21kXSguLi5hcmdzKSxcbiAgICAgICAgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyID0gcmVqZWN0O1xuICAgICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLm9uKE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsIHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyKTtcbiAgICAgICAgfSksXG4gICAgICBdKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgaWYgKHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5yZW1vdmVMaXN0ZW5lcihcbiAgICAgICAgICAgIE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsXG4gICAgICAgICAgICB1bmV4cGVjdGVkU2h1dGRvd25MaXN0ZW5lclxuICAgICAgICAgICk7XG4gICAgICAgICAgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBjb25zdCByZXMgPSB0aGlzLmlzQ29tbWFuZHNRdWV1ZUVuYWJsZWRcbiAgICAgID8gYXdhaXQgdGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQuYWNxdWlyZShCYXNlRHJpdmVyLm5hbWUsIGNvbW1hbmRFeGVjdXRvcilcbiAgICAgIDogYXdhaXQgY29tbWFuZEV4ZWN1dG9yKCk7XG5cbiAgICAvLyBpZiB3ZSBoYXZlIHNldCBhIG5ldyBjb21tYW5kIHRpbWVvdXQgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSwgc3RhcnQgYVxuICAgIC8vIHRpbWVyIG9uY2Ugd2UndmUgZmluaXNoZWQgZXhlY3V0aW5nIHRoaXMgY29tbWFuZC4gSWYgd2UgZG9uJ3QgY2xlYXJcbiAgICAvLyB0aGUgdGltZXIgKHdoaWNoIGlzIGRvbmUgd2hlbiBhIG5ldyBjb21tYW5kIGNvbWVzIGluKSwgd2Ugd2lsbCB0cmlnZ2VyXG4gICAgLy8gYXV0b21hdGljIHNlc3Npb24gZGVsZXRpb24gaW4gdGhpcy5vbkNvbW1hbmRUaW1lb3V0LiBPZiBjb3Vyc2Ugd2UgZG9uJ3RcbiAgICAvLyB3YW50IHRvIHRyaWdnZXIgdGhlIHRpbWVyIHdoZW4gdGhlIHVzZXIgaXMgc2h1dHRpbmcgZG93biB0aGUgc2Vzc2lvblxuICAgIC8vIGludGVudGlvbmFsbHlcbiAgICBpZiAodGhpcy5pc0NvbW1hbmRzUXVldWVFbmFibGVkICYmIGNtZCAhPT0gREVMRVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgLy8gcmVzZXR0aW5nIGV4aXN0aW5nIHRpbWVvdXRcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnROZXdDb21tYW5kVGltZW91dCgpO1xuICAgIH1cblxuICAgIC8vIGxvZyB0aW1pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb21tYW5kXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5fZXZlbnRIaXN0b3J5LmNvbW1hbmRzLnB1c2goe2NtZCwgc3RhcnRUaW1lLCBlbmRUaW1lfSk7XG4gICAgaWYgKGNtZCA9PT0gJ2NyZWF0ZVNlc3Npb24nKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fU1RBUlQpO1xuICAgIH0gZWxzZSBpZiAoY21kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fUVVJVF9ET05FKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RXJyb3J8aW1wb3J0KCcuLi9wcm90b2NvbC9lcnJvcnMnKS5Ob1N1Y2hEcml2ZXJFcnJvcn0gZXJyXG4gICAqL1xuICBhc3luYyBzdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihcbiAgICBlcnIgPSBuZXcgZXJyb3JzLk5vU3VjaERyaXZlckVycm9yKCdUaGUgZHJpdmVyIHdhcyB1bmV4cGVjdGVkbHkgc2h1dCBkb3duIScpXG4gICkge1xuICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQoT05fVU5FWFBFQ1RFRF9TSFVURE9XTl9FVkVOVCwgZXJyKTsgLy8gYWxsb3cgb3RoZXJzIHRvIGxpc3RlbiBmb3IgdGhpc1xuICAgIHRoaXMuc2h1dGRvd25VbmV4cGVjdGVkbHkgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zZXNzaW9uSWQgIT09IG51bGwpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKHRoaXMuc2Vzc2lvbklkKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zaHV0ZG93blVuZXhwZWN0ZWRseSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0TmV3Q29tbWFuZFRpbWVvdXQoKSB7XG4gICAgLy8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyByb2d1ZSB0aW1lb3V0c1xuICAgIGF3YWl0IHRoaXMuY2xlYXJOZXdDb21tYW5kVGltZW91dCgpO1xuXG4gICAgLy8gaWYgY29tbWFuZCB0aW1lb3V0IGlzIDAsIGl0IGlzIGRpc2FibGVkXG4gICAgaWYgKCF0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuXG4gICAgdGhpcy5ub0NvbW1hbmRUaW1lciA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5sb2cud2FybihcbiAgICAgICAgYFNodXR0aW5nIGRvd24gYmVjYXVzZSB3ZSB3YWl0ZWQgYCArXG4gICAgICAgICAgYCR7dGhpcy5uZXdDb21tYW5kVGltZW91dE1zIC8gMTAwMC4wfSBzZWNvbmRzIGZvciBhIGNvbW1hbmRgXG4gICAgICApO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cbiAgICAgICAgYE5ldyBDb21tYW5kIFRpbWVvdXQgb2YgYCArXG4gICAgICAgIGAke3RoaXMubmV3Q29tbWFuZFRpbWVvdXRNcyAvIDEwMDAuMH0gc2Vjb25kcyBgICtcbiAgICAgICAgYGV4cGlyZWQuIFRyeSBjdXN0b21pemluZyB0aGUgdGltZW91dCB1c2luZyB0aGUgYCArXG4gICAgICAgIGAnbmV3Q29tbWFuZFRpbWVvdXQnIGRlc2lyZWQgY2FwYWJpbGl0eWA7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICB9LCB0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtU2VydmVyfSBzZXJ2ZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhvc3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBvcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGFzc2lnblNlcnZlcihzZXJ2ZXIsIGhvc3QsIHBvcnQsIHBhdGgpIHtcbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcbiAgICB0aGlzLnNlcnZlckhvc3QgPSBob3N0O1xuICAgIHRoaXMuc2VydmVyUG9ydCA9IHBvcnQ7XG4gICAgdGhpcy5zZXJ2ZXJQYXRoID0gcGF0aDtcbiAgfVxuXG4gIC8qXG4gICAqIFJlc3RhcnQgdGhlIHNlc3Npb24gd2l0aCB0aGUgb3JpZ2luYWwgY2FwcyxcbiAgICogcHJlc2VydmluZyB0aGUgdGltZW91dCBjb25maWcuXG4gICAqL1xuICBhc3luYyByZXNldCgpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnUmVzZXR0aW5nIGFwcCBtaWQtc2Vzc2lvbicpO1xuICAgIHRoaXMubG9nLmRlYnVnKCdSdW5uaW5nIGdlbmVyaWMgZnVsbCByZXNldCcpO1xuXG4gICAgLy8gcHJlc2VydmluZyBzdGF0ZVxuICAgIGxldCBjdXJyZW50Q29uZmlnID0ge307XG4gICAgZm9yIChsZXQgcHJvcGVydHkgb2YgW1xuICAgICAgJ2ltcGxpY2l0V2FpdE1zJyxcbiAgICAgICduZXdDb21tYW5kVGltZW91dE1zJyxcbiAgICAgICdzZXNzaW9uSWQnLFxuICAgICAgJ3Jlc2V0T25VbmV4cGVjdGVkU2h1dGRvd24nLFxuICAgIF0pIHtcbiAgICAgIGN1cnJlbnRDb25maWdbcHJvcGVydHldID0gdGhpc1twcm9wZXJ0eV07XG4gICAgfVxuXG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIHByZXNlcnZlIHRoZSB1bmV4cGVjdGVkIHNodXRkb3duLCBhbmQgbWFrZSBzdXJlIGl0IGlzIG5vdCBjYW5jZWxsZWQgZHVyaW5nIHJlc2V0LlxuICAgIHRoaXMucmVzZXRPblVuZXhwZWN0ZWRTaHV0ZG93biA9ICgpID0+IHt9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNlc3Npb25JZCAhPT0gbnVsbCkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24odGhpcy5zZXNzaW9uSWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoJ1Jlc3RhcnRpbmcgYXBwJyk7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZVNlc3Npb24odGhpcy5vcmlnaW5hbENhcHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBhbHdheXMgcmVzdG9yZSBzdGF0ZS5cbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMoY3VycmVudENvbmZpZykpIHtcbiAgICAgICAgdGhpc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2xlYXJOZXdDb21tYW5kVGltZW91dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEhpc3RvcmljYWxseSB0aGUgZmlyc3QgdHdvIGFyZ3VtZW50cyB3ZXJlIHJlc2VydmVkIGZvciBKU09OV1AgY2FwYWJpbGl0aWVzLlxuICAgKiBBcHBpdW0gMiBoYXMgZHJvcHBlZCB0aGUgc3VwcG9ydCBvZiB0aGVzZSwgc28gbm93IHdlIG9ubHkgYWNjZXB0IGNhcGFiaWxpdHlcbiAgICogb2JqZWN0cyBpbiBXM0MgZm9ybWF0IGFuZCB0aHVzIGFsbG93IGFueSBvZiB0aGUgdGhyZWUgYXJndW1lbnRzIHRvIHJlcHJlc2VudFxuICAgKiB0aGUgbGF0dGVyLlxuICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllczxDPn0gdzNjQ2FwYWJpbGl0aWVzMVxuICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllczxDPn0gW3czY0NhcGFiaWxpdGllczJdXG4gICAqIEBwYXJhbSB7VzNDQ2FwYWJpbGl0aWVzPEM+fSBbdzNjQ2FwYWJpbGl0aWVzXVxuICAgKiBAcGFyYW0ge0RyaXZlckRhdGFbXX0gW2RyaXZlckRhdGFdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFtzdHJpbmcsQ2FwYWJpbGl0aWVzPEM+XT59XG4gICAqL1xuICBhc3luYyBjcmVhdGVTZXNzaW9uKHczY0NhcGFiaWxpdGllczEsIHczY0NhcGFiaWxpdGllczIsIHczY0NhcGFiaWxpdGllcywgZHJpdmVyRGF0YSkge1xuICAgIGlmICh0aGlzLnNlc3Npb25JZCAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKFxuICAgICAgICAnQ2Fubm90IGNyZWF0ZSBhIG5ldyBzZXNzaW9uIHdoaWxlIG9uZSBpcyBpbiBwcm9ncmVzcydcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuZGVidWcoKTtcblxuICAgIGNvbnN0IG9yaWdpbmFsQ2FwcyA9IF8uY2xvbmVEZWVwKFxuICAgICAgW3czY0NhcGFiaWxpdGllcywgdzNjQ2FwYWJpbGl0aWVzMSwgdzNjQ2FwYWJpbGl0aWVzMl0uZmluZChpc1czY0NhcHMpXG4gICAgKTtcbiAgICBpZiAoIW9yaWdpbmFsQ2Fwcykge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKFxuICAgICAgICAnQXBwaXVtIG9ubHkgc3VwcG9ydHMgVzNDLXN0eWxlIGNhcGFiaWxpdHkgb2JqZWN0cy4gJyArXG4gICAgICAgICAgJ1lvdXIgY2xpZW50IGlzIHNlbmRpbmcgYW4gb2xkZXIgY2FwYWJpbGl0aWVzIGZvcm1hdC4gUGxlYXNlIHVwZGF0ZSB5b3VyIGNsaWVudCBsaWJyYXJ5LidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRQcm90b2NvbFczQygpO1xuXG4gICAgdGhpcy5vcmlnaW5hbENhcHMgPSBvcmlnaW5hbENhcHM7XG4gICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICBgQ3JlYXRpbmcgc2Vzc2lvbiB3aXRoIFczQyBjYXBhYmlsaXRpZXM6ICR7SlNPTi5zdHJpbmdpZnkob3JpZ2luYWxDYXBzLCBudWxsLCAyKX1gXG4gICAgKTtcblxuICAgIC8qKiBAdHlwZSB7Q2FwYWJpbGl0aWVzPEM+fSAqL1xuICAgIGxldCBjYXBzO1xuICAgIHRyeSB7XG4gICAgICBjYXBzID0gcHJvY2Vzc0NhcGFiaWxpdGllcyhcbiAgICAgICAgb3JpZ2luYWxDYXBzLFxuICAgICAgICB0aGlzLl9kZXNpcmVkQ2FwQ29uc3RyYWludHMsXG4gICAgICAgIHRoaXMuc2hvdWxkVmFsaWRhdGVDYXBzXG4gICAgICApO1xuICAgICAgaWYgKGNhcHNbQVBQSVVNX09QVFNfQ0FQXSkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgRm91bmQgJHtQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVB9IGNhcGFiaWxpdHkgcHJlc2VudDsgd2lsbCBwcm9tb3RlIGl0ZW1zIGluc2lkZSB0byBjYXBzYFxuICAgICAgICApO1xuICAgICAgICBjYXBzID0gcHJvbW90ZUFwcGl1bU9wdGlvbnMoY2Fwcyk7XG4gICAgICB9XG4gICAgICBjYXBzID0gZml4Q2FwcyhjYXBzLCB0aGlzLl9kZXNpcmVkQ2FwQ29uc3RyYWludHMsIHRoaXMubG9nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoZS5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcyk7XG5cbiAgICB0aGlzLnNlc3Npb25JZCA9IHV0aWwudXVpZFY0KCk7XG4gICAgdGhpcy5jYXBzID0gY2FwcztcbiAgICAvLyBtZXJnZSBjYXBzIG9udG8gb3B0cyBzbyB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHdoYXQncyB3aGVyZVxuICAgIHRoaXMub3B0cyA9IHsuLi5fLmNsb25lRGVlcCh0aGlzLmluaXRpYWxPcHRzKSwgLi4udGhpcy5jYXBzfTtcblxuICAgIC8vIGRlYWwgd2l0aCByZXNldHNcbiAgICAvLyBzb21lIHBlb3BsZSBsaWtlIHRvIGRvIHdlaXJkIHRoaW5ncyBieSBzZXR0aW5nIG5vUmVzZXQgYW5kIGZ1bGxSZXNldFxuICAgIC8vIGJvdGggdG8gdHJ1ZSwgYnV0IHRoaXMgaXMgbWlzZ3VpZGVkIGFuZCBzdHJhbmdlLCBzbyBlcnJvciBoZXJlIGluc3RlYWRcbiAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgJiYgdGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSAnbm9SZXNldCcgYW5kICdmdWxsUmVzZXQnIGNhcGFiaWxpdGllcyBhcmUgbXV0dWFsbHkgXCIgK1xuICAgICAgICAgICdleGNsdXNpdmUgYW5kIHNob3VsZCBub3QgYm90aCBiZSBzZXQgdG8gdHJ1ZS4gWW91ICcgK1xuICAgICAgICAgIFwicHJvYmFibHkgbWVhbnQgdG8ganVzdCB1c2UgJ2Z1bGxSZXNldCcgb24gaXRzIG93blwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMub3B0cy5mdWxsUmVzZXQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMub3B0cy5ub1Jlc2V0ID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMub3B0cy5mYXN0UmVzZXQgPSAhdGhpcy5vcHRzLmZ1bGxSZXNldCAmJiAhdGhpcy5vcHRzLm5vUmVzZXQ7XG4gICAgdGhpcy5vcHRzLnNraXBVbmluc3RhbGwgPSB0aGlzLm9wdHMuZmFzdFJlc2V0IHx8IHRoaXMub3B0cy5ub1Jlc2V0O1xuXG4gICAgLy8gUHJldmVudHMgZW1wdHkgc3RyaW5nIGNhcHMgc28gd2UgZG9uJ3QgbmVlZCB0byB0ZXN0IGl0IGV2ZXJ5d2hlcmVcbiAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5hcHAgPT09ICdzdHJpbmcnICYmIHRoaXMub3B0cy5hcHAudHJpbSgpID09PSAnJykge1xuICAgICAgZGVsZXRlIHRoaXMub3B0cy5hcHA7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMuY2Fwcy5uZXdDb21tYW5kVGltZW91dCkpIHtcbiAgICAgIHRoaXMubmV3Q29tbWFuZFRpbWVvdXRNcyA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAodGhpcy5jYXBzLm5ld0NvbW1hbmRUaW1lb3V0KSAqIDEwMDA7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nLnByZWZpeCA9IGhlbHBlcnMuZ2VuZXJhdGVEcml2ZXJMb2dQcmVmaXgodGhpcywgdGhpcy5zZXNzaW9uSWQpO1xuXG4gICAgdGhpcy5sb2cuaW5mbyhgU2Vzc2lvbiBjcmVhdGVkIHdpdGggc2Vzc2lvbiBpZDogJHt0aGlzLnNlc3Npb25JZH1gKTtcblxuICAgIHJldHVybiBbdGhpcy5zZXNzaW9uSWQsIGNhcHNdO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2Vzc2lvbklkXVxuICAgKiBAcGFyYW0ge0RyaXZlckRhdGFbXX0gW2RyaXZlckRhdGFdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbihzZXNzaW9uSWQsIGRyaXZlckRhdGEpIHtcbiAgICBhd2FpdCB0aGlzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKTtcbiAgICBpZiAodGhpcy5pc0NvbW1hbmRzUXVldWVFbmFibGVkICYmIHRoaXMuY29tbWFuZHNRdWV1ZUd1YXJkLmlzQnVzeSgpKSB7XG4gICAgICAvLyBzaW1wbGUgaGFjayB0byByZWxlYXNlIHBlbmRpbmcgY29tbWFuZHMgaWYgdGhleSBleGlzdFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgXy5rZXlzKHRoaXMuY29tbWFuZHNRdWV1ZUd1YXJkLnF1ZXVlcykpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmNvbW1hbmRzUXVldWVHdWFyZC5xdWV1ZXNba2V5XSA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNlc3Npb25JZCA9IG51bGw7XG4gICAgdGhpcy5fbG9nLnByZWZpeCA9IGhlbHBlcnMuZ2VuZXJhdGVEcml2ZXJMb2dQcmVmaXgodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtDYXBhYmlsaXRpZXN9IGNhcHNcbiAgICovXG4gIGxvZ0V4dHJhQ2FwcyhjYXBzKSB7XG4gICAgbGV0IGV4dHJhQ2FwcyA9IF8uZGlmZmVyZW5jZShfLmtleXMoY2FwcyksIF8ua2V5cyh0aGlzLl9kZXNpcmVkQ2FwQ29uc3RyYWludHMpKTtcbiAgICBpZiAoZXh0cmFDYXBzLmxlbmd0aCkge1xuICAgICAgdGhpcy5sb2cud2FybihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgY2FwYWJpbGl0aWVzIHdlcmUgcHJvdmlkZWQsIGJ1dCBhcmUgbm90IGAgKyBgcmVjb2duaXplZCBieSBBcHBpdW06YFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgY2FwIG9mIGV4dHJhQ2Fwcykge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGAgICR7Y2FwfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0NhcGFiaWxpdGllczxDPn0gY2Fwc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcykge1xuICAgIGlmICghdGhpcy5zaG91bGRWYWxpZGF0ZUNhcHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZUNhcHMoY2FwcywgdGhpcy5fZGVzaXJlZENhcENvbnN0cmFpbnRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KFxuICAgICAgICBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoXG4gICAgICAgICAgYFRoZSBkZXNpcmVkQ2FwYWJpbGl0aWVzIG9iamVjdCB3YXMgbm90IHZhbGlkIGZvciB0aGUgYCArXG4gICAgICAgICAgICBgZm9sbG93aW5nIHJlYXNvbihzKTogJHtlLm1lc3NhZ2V9YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubG9nRXh0cmFDYXBzKGNhcHMpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgb2YgdGhlIG1peGlucyBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgZGVzY3JpYmVkIGluIHtAbGlua2NvZGUgRHJpdmVyfS5cbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPXt9XVxuICogQGltcGxlbWVudHMge0RyaXZlcjxDPn1cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VEcml2ZXIgZXh0ZW5kcyBjcmVhdGVCYXNlRHJpdmVyQ2xhc3MoQmFzZURyaXZlckNvcmUpIHt9XG5leHBvcnQgZGVmYXVsdCBCYXNlRHJpdmVyO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5IVFRQTWV0aG9kfSBIVFRQTWV0aG9kXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRXh0ZXJuYWxEcml2ZXJ9IEV4dGVybmFsRHJpdmVyXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyRGF0YX0gRHJpdmVyRGF0YVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnRzfSBDb25zdHJhaW50c1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnR9IENvbnN0cmFpbnRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TdHJpbmdSZWNvcmR9IFN0cmluZ1JlY29yZFxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkJhc2VEcml2ZXJDYXBDb25zdHJhaW50c30gQmFzZURyaXZlckNhcENvbnN0cmFpbnRzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuU2VydmVyQXJnc30gU2VydmVyQXJnc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFVwZGF0ZVNlcnZlckNhbGxiYWNrXG4gKiBAcGFyYW0ge2ltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3N9IGFwcCAtIEV4cHJlc3MgYXBwXG4gKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVNlcnZlcn0gaHR0cFNlcnZlciAtIEhUVFAgc2VydmVyXG4gKiBAcmV0dXJucyB7aW1wb3J0KCd0eXBlLWZlc3QnKS5Qcm9taXNhYmxlPHZvaWQ+fVxuICovXG5cbi8qKlxuICogVGhpcyBpcyB1c2VkIHRvIGV4dGVuZCB7QGxpbmtjb2RlIEJhc2VEcml2ZXJDb3JlfSBieSB0aGUgbWl4aW5zIGFuZCBhbHNvIGV4dGVybmFsIGRyaXZlcnMuXG4gKiBAdGVtcGxhdGUgW1Byb3RvPXt9XVxuICogQHRlbXBsYXRlIFtTdGF0aWM9e31dXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ2xhc3M8QmFzZURyaXZlckNvcmUgJiBQcm90byxpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJTdGF0aWMgJiBTdGF0aWM+fSBCYXNlRHJpdmVyQmFzZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9QmFzZURyaXZlckNhcENvbnN0cmFpbnRzXVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlNlc3Npb25IYW5kbGVyPFtzdHJpbmcsIG9iamVjdF0sdm9pZCwgQz59IFNlc3Npb25IYW5kbGVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBbQz1CYXNlRHJpdmVyQ2FwQ29uc3RyYWludHNdXG4gKiBAdGVtcGxhdGUge1N0cmluZ1JlY29yZHx2b2lkfSBbRXh0cmE9dm9pZF1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8QywgRXh0cmE+fSBDYXBhYmlsaXRpZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPUJhc2VEcml2ZXJDYXBDb25zdHJhaW50c11cbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfHZvaWR9IFtFeHRyYT12b2lkXVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlczQ0NhcGFiaWxpdGllczxDLCBFeHRyYT59IFczQ0NhcGFiaWxpdGllc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gQ1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnRzVG9DYXBzPEM+fSBDb25zdHJhaW50c1RvQ2Fwc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gQ1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlcjxDPn0gRHJpdmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBDXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyT3B0czxDPn0gRHJpdmVyT3B0c1xuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUdBOztBQU9BOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsa0JBQWtCLEdBQUcscUJBQTNCO0FBQ0EsTUFBTUMsbUJB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","names":["EVENT_SESSION_INIT","EVENT_SESSION_START","EVENT_SESSION_QUIT_START","EVENT_SESSION_QUIT_DONE","ON_UNEXPECTED_SHUTDOWN_EVENT","BaseDriverCore","DriverCore","cliArgs","caps","originalCaps","desiredCapConstraints","opts","_desiredCapConstraints","Object","freeze","_","merge","BASE_DESIRED_CAP_CONSTRAINTS","executeCommand","cmd","args","startTime","Date","now","protocol","determineProtocol","logEvent","DELETE_SESSION_COMMAND","clearNewCommandTimeout","shutdownUnexpectedly","errors","NoSuchDriverError","NotYetImplementedError","unexpectedShutdownListener","commandExecutor","B","race","resolve","reject","eventEmitter","on","finally","removeListener","res","isCommandsQueueEnabled","commandsQueueGuard","acquire","BaseDriver","name","startNewCommandTimeout","endTime","_eventHistory","commands","push","startUnexpectedShutdown","err","emit","sessionId","deleteSession","newCommandTimeoutMs","noCommandTimer","setTimeout","log","warn","errorMessage","Error","assignServer","server","host","port","path","serverHost","serverPort","serverPath","reset","debug","currentConfig","property","resetOnUnexpectedShutdown","createSession","key","value","toPairs","w3cCapabilities1","w3cCapabilities2","w3cCapabilities","driverData","SessionNotCreatedError","cloneDeep","find","isW3cCaps","setProtocolW3C","JSON","stringify","processCapabilities","shouldValidateCaps","APPIUM_OPTS_CAP","PREFIXED_APPIUM_OPTS_CAP","promoteAppiumOptions","fixCaps","e","message","validateDesiredCaps","util","uuidV4","initialOpts","noReset","fullReset","fastReset","skipUninstall","app","trim","isUndefined","newCommandTimeout","_log","prefix","helpers","generateDriverLogPrefix","info","isBusy","keys","queues","logExtraCaps","extraCaps","difference","length","cap","validateCaps","errorAndThrow","createBaseDriverClass"],"sources":["../../../lib/basedriver/driver.js"],"sourcesContent":["/* eslint-disable require-await */\n/* eslint-disable no-unused-vars */\n\nimport {\n validateCaps,\n APPIUM_OPTS_CAP,\n PREFIXED_APPIUM_OPTS_CAP,\n processCapabilities,\n promoteAppiumOptions,\n} from './capabilities';\nimport {DriverCore} from './core';\nimport {util} from '@appium/support';\nimport B from 'bluebird';\nimport _ from 'lodash';\nimport {fixCaps, isW3cCaps} from '../helpers/capabilities';\nimport {DELETE_SESSION_COMMAND, determineProtocol, errors} from '../protocol';\nimport {createBaseDriverClass} from './commands';\nimport helpers from './helpers';\nimport {BASE_DESIRED_CAP_CONSTRAINTS} from '@appium/types';\n\nconst EVENT_SESSION_INIT = 'newSessionRequested';\nconst EVENT_SESSION_START = 'newSessionStarted';\nconst EVENT_SESSION_QUIT_START = 'quitSessionRequested';\nconst EVENT_SESSION_QUIT_DONE = 'quitSessionFinished';\nconst ON_UNEXPECTED_SHUTDOWN_EVENT = 'onUnexpectedShutdown';\n\n/**\n * @implements {SessionHandler<C>}\n * @template {Constraints} C\n * @template {StringRecord} [A=StringRecord]\n * @extends {DriverCore<C>}\n */\nexport class BaseDriverCore extends DriverCore {\n /**\n * @type {A & ServerArgs}\n */\n cliArgs;\n\n /**\n * @type {Capabilities<C>}\n */\n caps;\n\n /**\n * @type {W3CCapabilities<C>}\n */\n originalCaps;\n\n /**\n * @type {C}\n */\n desiredCapConstraints;\n\n /**\n * @type {DriverOpts<C> & DriverOpts<BaseDriverCapConstraints>}\n */\n opts;\n\n /**\n * Contains the base constraints plus whatever the subclass wants to add.\n *\n * Subclasses _shouldn't_ need to use this. If you need to use this, please create\n * an issue:\n * @see https://github.com/appium/appium/issues/new\n * @type {Readonly<BaseDriverCapConstraints & C>}\n * @protected\n */\n get _desiredCapConstraints() {\n return Object.freeze(_.merge({}, BASE_DESIRED_CAP_CONSTRAINTS, this.desiredCapConstraints));\n }\n\n static BASE_DESIRED_CAP_CONSTRAINTS = BASE_DESIRED_CAP_CONSTRAINTS;\n\n // This is the main command handler for the driver. It wraps command\n // execution with timeout logic, checking that we have a valid session,\n // and ensuring that we execute commands one at a time. This method is called\n // by MJSONWP's express router.\n /**\n * @param {string} cmd\n * @param {...any} args\n * @returns {Promise<any>}\n */\n async executeCommand(cmd, ...args) {\n // get start time for this command, and log in special cases\n let startTime = Date.now();\n\n if (cmd === 'createSession') {\n // If creating a session determine if W3C or MJSONWP protocol was requested and remember the choice\n this.protocol = determineProtocol(args);\n this.logEvent(EVENT_SESSION_INIT);\n } else if (cmd === DELETE_SESSION_COMMAND) {\n this.logEvent(EVENT_SESSION_QUIT_START);\n }\n\n // if we had a command timer running, clear it now that we're starting\n // a new command and so don't want to time out\n await this.clearNewCommandTimeout();\n\n if (this.shutdownUnexpectedly) {\n throw new errors.NoSuchDriverError('The driver was unexpectedly shut down!');\n }\n\n // If we don't have this command, it must not be implemented\n if (!this[cmd]) {\n throw new errors.NotYetImplementedError();\n }\n\n let unexpectedShutdownListener;\n const commandExecutor = async () =>\n await B.race([\n this[cmd](...args),\n new B((resolve, reject) => {\n unexpectedShutdownListener = reject;\n this.eventEmitter.on(ON_UNEXPECTED_SHUTDOWN_EVENT, unexpectedShutdownListener);\n }),\n ]).finally(() => {\n if (unexpectedShutdownListener) {\n // This is needed to prevent memory leaks\n this.eventEmitter.removeListener(\n ON_UNEXPECTED_SHUTDOWN_EVENT,\n unexpectedShutdownListener\n );\n unexpectedShutdownListener = null;\n }\n });\n const res = this.isCommandsQueueEnabled\n ? await this.commandsQueueGuard.acquire(BaseDriver.name, commandExecutor)\n : await commandExecutor();\n\n // if we have set a new command timeout (which is the default), start a\n // timer once we've finished executing this command. If we don't clear\n // the timer (which is done when a new command comes in), we will trigger\n // automatic session deletion in this.onCommandTimeout. Of course we don't\n // want to trigger the timer when the user is shutting down the session\n // intentionally\n if (this.isCommandsQueueEnabled && cmd !== DELETE_SESSION_COMMAND) {\n // resetting existing timeout\n await this.startNewCommandTimeout();\n }\n\n // log timing information about this command\n const endTime = Date.now();\n this._eventHistory.commands.push({cmd, startTime, endTime});\n if (cmd === 'createSession') {\n this.logEvent(EVENT_SESSION_START);\n } else if (cmd === DELETE_SESSION_COMMAND) {\n this.logEvent(EVENT_SESSION_QUIT_DONE);\n }\n\n return res;\n }\n\n /**\n *\n * @param {Error|import('../protocol/errors').NoSuchDriverError} err\n */\n async startUnexpectedShutdown(\n err = new errors.NoSuchDriverError('The driver was unexpectedly shut down!')\n ) {\n this.eventEmitter.emit(ON_UNEXPECTED_SHUTDOWN_EVENT, err); // allow others to listen for this\n this.shutdownUnexpectedly = true;\n try {\n if (this.sessionId !== null) {\n await this.deleteSession(this.sessionId);\n }\n } finally {\n this.shutdownUnexpectedly = false;\n }\n }\n\n async startNewCommandTimeout() {\n // make sure there are no rogue timeouts\n await this.clearNewCommandTimeout();\n\n // if command timeout is 0, it is disabled\n if (!this.newCommandTimeoutMs) return; // eslint-disable-line curly\n\n this.noCommandTimer = setTimeout(async () => {\n this.log.warn(\n `Shutting down because we waited ` +\n `${this.newCommandTimeoutMs / 1000.0} seconds for a command`\n );\n const errorMessage =\n `New Command Timeout of ` +\n `${this.newCommandTimeoutMs / 1000.0} seconds ` +\n `expired. Try customizing the timeout using the ` +\n `'newCommandTimeout' desired capability`;\n await this.startUnexpectedShutdown(new Error(errorMessage));\n }, this.newCommandTimeoutMs);\n }\n\n /**\n *\n * @param {import('@appium/types').AppiumServer} server\n * @param {string} host\n * @param {number} port\n * @param {string} path\n */\n assignServer(server, host, port, path) {\n this.server = server;\n this.serverHost = host;\n this.serverPort = port;\n this.serverPath = path;\n }\n\n /*\n * Restart the session with the original caps,\n * preserving the timeout config.\n */\n async reset() {\n this.log.debug('Resetting app mid-session');\n this.log.debug('Running generic full reset');\n\n // preserving state\n let currentConfig = {};\n for (let property of [\n 'implicitWaitMs',\n 'newCommandTimeoutMs',\n 'sessionId',\n 'resetOnUnexpectedShutdown',\n ]) {\n currentConfig[property] = this[property];\n }\n\n // We also need to preserve the unexpected shutdown, and make sure it is not cancelled during reset.\n this.resetOnUnexpectedShutdown = () => {};\n\n try {\n if (this.sessionId !== null) {\n await this.deleteSession(this.sessionId);\n }\n this.log.debug('Restarting app');\n await this.createSession(this.originalCaps);\n } finally {\n // always restore state.\n for (let [key, value] of _.toPairs(currentConfig)) {\n this[key] = value;\n }\n }\n await this.clearNewCommandTimeout();\n }\n\n /**\n *\n * Historically the first two arguments were reserved for JSONWP capabilities.\n * Appium 2 has dropped the support of these, so now we only accept capability\n * objects in W3C format and thus allow any of the three arguments to represent\n * the latter.\n * @param {W3CCapabilities<C>} w3cCapabilities1\n * @param {W3CCapabilities<C>} [w3cCapabilities2]\n * @param {W3CCapabilities<C>} [w3cCapabilities]\n * @param {DriverData[]} [driverData]\n * @returns {Promise<[string,Capabilities<C>]>}\n */\n async createSession(w3cCapabilities1, w3cCapabilities2, w3cCapabilities, driverData) {\n if (this.sessionId !== null) {\n throw new errors.SessionNotCreatedError(\n 'Cannot create a new session while one is in progress'\n );\n }\n\n this.log.debug();\n\n const originalCaps = _.cloneDeep(\n [w3cCapabilities, w3cCapabilities1, w3cCapabilities2].find(isW3cCaps)\n );\n if (!originalCaps) {\n throw new errors.SessionNotCreatedError(\n 'Appium only supports W3C-style capability objects. ' +\n 'Your client is sending an older capabilities format. Please update your client library.'\n );\n }\n\n this.setProtocolW3C();\n\n this.originalCaps = originalCaps;\n this.log.debug(\n `Creating session with W3C capabilities: ${JSON.stringify(originalCaps, null, 2)}`\n );\n\n /** @type {Capabilities<C>} */\n let caps;\n try {\n caps = processCapabilities(\n originalCaps,\n this._desiredCapConstraints,\n this.shouldValidateCaps\n );\n if (caps[APPIUM_OPTS_CAP]) {\n this.log.debug(\n `Found ${PREFIXED_APPIUM_OPTS_CAP} capability present; will promote items inside to caps`\n );\n caps = promoteAppiumOptions(caps);\n }\n caps = fixCaps(caps, this._desiredCapConstraints, this.log);\n } catch (e) {\n throw new errors.SessionNotCreatedError(e.message);\n }\n\n this.validateDesiredCaps(caps);\n\n this.sessionId = util.uuidV4();\n this.caps = caps;\n // merge caps onto opts so we don't need to worry about what's where\n this.opts = {..._.cloneDeep(this.initialOpts), ...this.caps};\n\n // deal with resets\n // some people like to do weird things by setting noReset and fullReset\n // both to true, but this is misguided and strange, so error here instead\n if (this.opts.noReset && this.opts.fullReset) {\n throw new Error(\n \"The 'noReset' and 'fullReset' capabilities are mutually \" +\n 'exclusive and should not both be set to true. You ' +\n \"probably meant to just use 'fullReset' on its own\"\n );\n }\n if (this.opts.noReset === true) {\n this.opts.fullReset = false;\n }\n if (this.opts.fullReset === true) {\n this.opts.noReset = false;\n }\n this.opts.fastReset = !this.opts.fullReset && !this.opts.noReset;\n this.opts.skipUninstall = this.opts.fastReset || this.opts.noReset;\n\n // Prevents empty string caps so we don't need to test it everywhere\n if (typeof this.opts.app === 'string' && this.opts.app.trim() === '') {\n delete this.opts.app;\n }\n\n if (!_.isUndefined(this.caps.newCommandTimeout)) {\n this.newCommandTimeoutMs = /** @type {number} */ (this.caps.newCommandTimeout) * 1000;\n }\n\n this._log.prefix = helpers.generateDriverLogPrefix(this, this.sessionId);\n\n this.log.info(`Session created with session id: ${this.sessionId}`);\n\n return [this.sessionId, caps];\n }\n\n /**\n *\n * @param {string} [sessionId]\n * @param {DriverData[]} [driverData]\n * @returns {Promise<void>}\n */\n async deleteSession(sessionId, driverData) {\n await this.clearNewCommandTimeout();\n if (this.isCommandsQueueEnabled && this.commandsQueueGuard.isBusy()) {\n // simple hack to release pending commands if they exist\n // @ts-ignore\n for (const key of _.keys(this.commandsQueueGuard.queues)) {\n // @ts-ignore\n this.commandsQueueGuard.queues[key] = [];\n }\n }\n this.sessionId = null;\n this._log.prefix = helpers.generateDriverLogPrefix(this);\n }\n\n /**\n *\n * @param {Capabilities} caps\n */\n logExtraCaps(caps) {\n let extraCaps = _.difference(_.keys(caps), _.keys(this._desiredCapConstraints));\n if (extraCaps.length) {\n this.log.warn(\n `The following capabilities were provided, but are not ` + `recognized by Appium:`\n );\n for (const cap of extraCaps) {\n this.log.warn(` ${cap}`);\n }\n }\n }\n\n /**\n *\n * @param {Capabilities<C>} caps\n * @returns {boolean}\n */\n validateDesiredCaps(caps) {\n if (!this.shouldValidateCaps) {\n return true;\n }\n\n try {\n validateCaps(caps, this._desiredCapConstraints);\n } catch (e) {\n this.log.errorAndThrow(\n new errors.SessionNotCreatedError(\n `The desiredCapabilities object was not valid for the ` +\n `following reason(s): ${e.message}`\n )\n );\n }\n\n this.logExtraCaps(caps);\n\n return true;\n }\n}\n\n/**\n * This ensures that all of the mixins correctly implement the interface described in {@linkcode Driver}.\n * @template {Constraints} [C={}]\n * @implements {Driver<C>}\n */\nexport class BaseDriver extends createBaseDriverClass(BaseDriverCore) {}\nexport default BaseDriver;\n\n/**\n * @typedef {import('@appium/types').HTTPMethod} HTTPMethod\n * @typedef {import('@appium/types').ExternalDriver} ExternalDriver\n * @typedef {import('@appium/types').DriverData} DriverData\n * @typedef {import('@appium/types').Constraints} Constraints\n * @typedef {import('@appium/types').Constraint} Constraint\n * @typedef {import('@appium/types').StringRecord} StringRecord\n * @typedef {import('@appium/types').BaseDriverCapConstraints} BaseDriverCapConstraints\n * @typedef {import('@appium/types').ServerArgs} ServerArgs\n */\n\n/**\n * @callback UpdateServerCallback\n * @param {import('express').Express} app - Express app\n * @param {import('@appium/types').AppiumServer} httpServer - HTTP server\n * @returns {import('type-fest').Promisable<void>}\n */\n\n/**\n * This is used to extend {@linkcode BaseDriverCore} by the mixins and also external drivers.\n * @template [Proto={}]\n * @template [Static={}]\n * @typedef {import('@appium/types').Class<BaseDriverCore & Proto,import('@appium/types').DriverStatic & Static>} BaseDriverBase\n */\n\n/**\n * @template {Constraints} [C=BaseDriverCapConstraints]\n * @typedef {import('@appium/types').SessionHandler<[string, object],void, C>} SessionHandler\n */\n\n/**\n * @template {Constraints} [C=BaseDriverCapConstraints]\n * @template {StringRecord|void} [Extra=void]\n * @typedef {import('@appium/types').Capabilities<C, Extra>} Capabilities\n */\n\n/**\n * @template {Constraints} [C=BaseDriverCapConstraints]\n * @template {StringRecord|void} [Extra=void]\n * @typedef {import('@appium/types').W3CCapabilities<C, Extra>} W3CCapabilities\n */\n\n/**\n * @template {Constraints} C\n * @typedef {import('@appium/types').ConstraintsToCaps<C>} ConstraintsToCaps\n */\n\n/**\n * @template {Constraints} C\n * @typedef {import('@appium/types').Driver<C>} Driver\n */\n\n/**\n * @template {Constraints} C\n * @typedef {import('@appium/types').DriverOpts<C>} DriverOpts\n */\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../lib/basedriver/helpers.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../lib/basedriver/helpers.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;WAyKc,OAAO;;;;;;;;;;aAGP,MAAM;;;;;;;aAMN,MAAM;;;;;;;;;;;;2BAMA,kBAAkB,KAAK,CAAC,QAAQ,iBAAiB,GAAC,SAAS,CAAC,GAAC,iBAAiB,GAAC,SAAS,CAAC;;;;;yBAQ/F,MAAM,EAAE;;;kBA8ZR,IAAI;eACJ,OAAO;YACP,MAAM;;AApcpB;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;GAIG;AAEH;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;GASG;AACH,kCAJW,MAAM,YACN,MAAM,GAAC,MAAM,EAAE,GAAC,mBAAmB,gBA4N7C;AA8FD,qDAEC;AAED;;;;;;;;;GASG;AACH,oFAuBC;AAED;;;;;GAKG;AACH,oCAFW,MAAM,GAAC,aAAa,SAoB9B;AAED;;;;;;GAMG;AACH,6CAJW,OAAO,eAAe,EAAE,IAAI,cAC5B,MAAM,UACJ,MAAM,CAKlB"}
|