@appium/base-driver 8.7.3 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/basedriver/capabilities.d.ts +11 -163
- package/build/lib/basedriver/capabilities.d.ts.map +1 -1
- package/build/lib/basedriver/capabilities.js +354 -236
- package/build/lib/basedriver/capabilities.js.map +1 -1
- package/build/lib/basedriver/commands/event.d.ts +7 -6
- package/build/lib/basedriver/commands/event.d.ts.map +1 -1
- package/build/lib/basedriver/commands/event.js +55 -35
- package/build/lib/basedriver/commands/event.js.map +1 -1
- package/build/lib/basedriver/commands/execute.d.ts +7 -6
- package/build/lib/basedriver/commands/execute.d.ts.map +1 -1
- package/build/lib/basedriver/commands/execute.js +66 -58
- package/build/lib/basedriver/commands/execute.js.map +1 -1
- package/build/lib/basedriver/commands/find.d.ts +9 -7
- package/build/lib/basedriver/commands/find.d.ts.map +1 -1
- package/build/lib/basedriver/commands/find.js +102 -54
- package/build/lib/basedriver/commands/find.js.map +1 -1
- package/build/lib/basedriver/commands/index.d.ts +3 -7
- package/build/lib/basedriver/commands/index.d.ts.map +1 -1
- package/build/lib/basedriver/commands/index.js +30 -33
- package/build/lib/basedriver/commands/index.js.map +1 -1
- package/build/lib/basedriver/commands/log.d.ts +8 -9
- package/build/lib/basedriver/commands/log.d.ts.map +1 -1
- package/build/lib/basedriver/commands/log.js +54 -38
- package/build/lib/basedriver/commands/log.js.map +1 -1
- package/build/lib/basedriver/commands/session.d.ts +7 -6
- package/build/lib/basedriver/commands/session.d.ts.map +1 -1
- package/build/lib/basedriver/commands/session.js +46 -39
- package/build/lib/basedriver/commands/session.js.map +1 -1
- package/build/lib/basedriver/commands/settings.d.ts +7 -7
- package/build/lib/basedriver/commands/settings.d.ts.map +1 -1
- package/build/lib/basedriver/commands/settings.js +35 -28
- package/build/lib/basedriver/commands/settings.js.map +1 -1
- package/build/lib/basedriver/commands/timeout.d.ts +7 -5
- package/build/lib/basedriver/commands/timeout.d.ts.map +1 -1
- package/build/lib/basedriver/commands/timeout.js +144 -162
- package/build/lib/basedriver/commands/timeout.js.map +1 -1
- package/build/lib/basedriver/core.d.ts +6 -157
- package/build/lib/basedriver/core.d.ts.map +1 -1
- package/build/lib/basedriver/core.js +361 -230
- package/build/lib/basedriver/core.js.map +1 -1
- package/build/lib/basedriver/desired-caps.js +80 -110
- package/build/lib/basedriver/desired-caps.js.map +1 -1
- package/build/lib/basedriver/device-settings.js +57 -62
- package/build/lib/basedriver/device-settings.js.map +1 -1
- package/build/lib/basedriver/driver.d.ts +11 -262
- package/build/lib/basedriver/driver.d.ts.map +1 -1
- package/build/lib/basedriver/driver.js +362 -262
- package/build/lib/basedriver/driver.js.map +1 -1
- package/build/lib/basedriver/helpers.js +500 -495
- package/build/lib/basedriver/helpers.js.map +1 -1
- package/build/lib/basedriver/logger.d.ts +1 -1
- package/build/lib/basedriver/logger.d.ts.map +1 -1
- package/build/lib/basedriver/logger.js +5 -15
- package/build/lib/basedriver/logger.js.map +1 -1
- package/build/lib/constants.js +14 -14
- package/build/lib/constants.js.map +1 -1
- package/build/lib/express/crash.js +8 -15
- package/build/lib/express/crash.js.map +1 -1
- package/build/lib/express/express-logging.js +49 -59
- package/build/lib/express/express-logging.js.map +1 -1
- package/build/lib/express/idempotency.js +125 -177
- package/build/lib/express/idempotency.js.map +1 -1
- package/build/lib/express/logger.d.ts +1 -1
- package/build/lib/express/logger.d.ts.map +1 -1
- package/build/lib/express/logger.js +5 -15
- package/build/lib/express/logger.js.map +1 -1
- package/build/lib/express/middleware.js +82 -107
- package/build/lib/express/middleware.js.map +1 -1
- package/build/lib/express/server.d.ts +17 -5
- package/build/lib/express/server.d.ts.map +1 -1
- package/build/lib/express/server.js +259 -224
- package/build/lib/express/server.js.map +1 -1
- package/build/lib/express/static.js +64 -81
- package/build/lib/express/static.js.map +1 -1
- package/build/lib/express/websocket.js +115 -87
- package/build/lib/express/websocket.js.map +1 -1
- package/build/lib/helpers/capabilities.d.ts +1 -59
- package/build/lib/helpers/capabilities.d.ts.map +1 -1
- package/build/lib/helpers/capabilities.js +72 -69
- package/build/lib/helpers/capabilities.js.map +1 -1
- package/build/lib/index.js +64 -180
- package/build/lib/index.js.map +1 -1
- package/build/lib/jsonwp-proxy/protocol-converter.js +215 -227
- package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -1
- package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -1
- package/build/lib/jsonwp-proxy/proxy.js +355 -393
- package/build/lib/jsonwp-proxy/proxy.js.map +1 -1
- package/build/lib/jsonwp-status/status.js +119 -130
- package/build/lib/jsonwp-status/status.js.map +1 -1
- package/build/lib/protocol/errors.d.ts +135 -32
- package/build/lib/protocol/errors.d.ts.map +1 -1
- package/build/lib/protocol/errors.js +871 -919
- package/build/lib/protocol/errors.js.map +1 -1
- package/build/lib/protocol/helpers.js +37 -37
- package/build/lib/protocol/helpers.js.map +1 -1
- package/build/lib/protocol/index.js +22 -109
- package/build/lib/protocol/index.js.map +1 -1
- package/build/lib/protocol/protocol.js +394 -350
- package/build/lib/protocol/protocol.js.map +1 -1
- package/build/lib/protocol/routes.d.ts +1238 -4
- package/build/lib/protocol/routes.d.ts.map +1 -1
- package/build/lib/protocol/routes.js +964 -1327
- package/build/lib/protocol/routes.js.map +1 -1
- package/build/lib/protocol/validators.js +32 -39
- package/build/lib/protocol/validators.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/basedriver/capabilities.js +80 -39
- package/lib/basedriver/commands/event.js +10 -5
- package/lib/basedriver/commands/execute.js +14 -9
- package/lib/basedriver/commands/find.js +18 -12
- package/lib/basedriver/commands/index.js +21 -16
- package/lib/basedriver/commands/log.js +24 -18
- package/lib/basedriver/commands/session.js +10 -5
- package/lib/basedriver/commands/settings.js +9 -6
- package/lib/basedriver/commands/timeout.js +10 -4
- package/lib/basedriver/core.js +2 -3
- package/lib/basedriver/driver.js +12 -16
- package/lib/express/server.js +6 -3
- package/lib/protocol/errors.js +155 -44
- package/lib/protocol/routes.js +11 -7
- package/package.json +14 -16
|
@@ -1,1018 +1,970 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
exports.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
exports.isUnknownError = isUnknownError;
|
|
14
|
-
|
|
15
|
-
require("source-map-support/register");
|
|
16
|
-
|
|
17
|
-
var _es6Error = _interopRequireDefault(require("es6-error"));
|
|
18
|
-
|
|
19
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
20
|
-
|
|
21
|
-
var _support = require("@appium/support");
|
|
22
|
-
|
|
23
|
-
var _httpStatusCodes = require("http-status-codes");
|
|
24
|
-
|
|
25
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
26
|
-
|
|
27
|
-
const mjsonwpLog = _support.logger.getLogger('MJSONWP');
|
|
28
|
-
|
|
29
|
-
const w3cLog = _support.logger.getLogger('W3C');
|
|
30
|
-
|
|
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.getResponseForJsonwpError = exports.getResponseForW3CError = exports.errorFromW3CJsonCode = exports.errorFromMJSONWPStatusCode = exports.isUnknownError = exports.isErrorType = exports.errors = exports.ProxyRequestError = exports.BadParametersError = exports.UnableToCaptureScreen = exports.NotImplementedError = exports.NotYetImplementedError = exports.InvalidContextError = exports.NoSuchContextError = exports.MoveTargetOutOfBoundsError = exports.SessionNotCreatedError = exports.InvalidSelectorError = exports.IMEEngineActivationFailedError = exports.IMENotAvailableError = exports.InvalidCoordinatesError = exports.InvalidElementCoordinatesError = exports.ScriptTimeoutError = exports.NoSuchAlertError = exports.NoAlertOpenError = exports.UnexpectedAlertOpenError = exports.UnableToSetCookieError = exports.NoSuchCookieError = exports.InvalidCookieDomainError = exports.InvalidArgumentError = exports.NoSuchWindowError = exports.TimeoutError = exports.XPathLookupError = exports.JavaScriptError = exports.InsecureCertificateError = exports.ElementNotInteractableError = exports.ElementClickInterceptedError = exports.ElementIsNotSelectableError = exports.UnsupportedOperationError = exports.UnknownMethodError = exports.UnknownError = exports.InvalidElementStateError = exports.ElementNotVisibleError = exports.StaleElementReferenceError = exports.UnknownCommandError = exports.NoSuchFrameError = exports.NoSuchElementError = exports.NoSuchDriverError = exports.ProtocolError = void 0;
|
|
7
|
+
const es6_error_1 = __importDefault(require("es6-error"));
|
|
8
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
9
|
+
const support_1 = require("@appium/support");
|
|
10
|
+
const http_status_codes_1 = require("http-status-codes");
|
|
11
|
+
const mjsonwpLog = support_1.logger.getLogger('MJSONWP');
|
|
12
|
+
const w3cLog = support_1.logger.getLogger('W3C');
|
|
31
13
|
const W3C_UNKNOWN_ERROR = 'unknown error';
|
|
32
|
-
|
|
33
|
-
class ProtocolError extends
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
set stacktrace(value) {
|
|
52
|
-
this._stacktrace = value;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
|
|
14
|
+
// base error class for all of our errors
|
|
15
|
+
class ProtocolError extends es6_error_1.default {
|
|
16
|
+
constructor(msg, jsonwpCode, w3cStatus, error) {
|
|
17
|
+
super(msg);
|
|
18
|
+
this.jsonwpCode = jsonwpCode;
|
|
19
|
+
this.error = error || W3C_UNKNOWN_ERROR;
|
|
20
|
+
if (this.jsonwpCode === null) {
|
|
21
|
+
this.jsonwpCode = 13;
|
|
22
|
+
}
|
|
23
|
+
this.w3cStatus = w3cStatus || http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
24
|
+
this._stacktrace = null;
|
|
25
|
+
}
|
|
26
|
+
get stacktrace() {
|
|
27
|
+
return this._stacktrace || this.stack;
|
|
28
|
+
}
|
|
29
|
+
set stacktrace(value) {
|
|
30
|
+
this._stacktrace = value;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
57
33
|
exports.ProtocolError = ProtocolError;
|
|
58
|
-
|
|
34
|
+
// https://github.com/SeleniumHQ/selenium/blob/176b4a9e3082ac1926f2a436eb346760c37a5998/java/client/src/org/openqa/selenium/remote/ErrorCodes.java#L215
|
|
35
|
+
// https://github.com/SeleniumHQ/selenium/issues/5562#issuecomment-370379470
|
|
36
|
+
// https://w3c.github.io/webdriver/webdriver-spec.html#dfn-error-code
|
|
59
37
|
class NoSuchDriverError extends ProtocolError {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
|
|
38
|
+
static code() {
|
|
39
|
+
return 6;
|
|
40
|
+
}
|
|
41
|
+
// W3C Error is called InvalidSessionID
|
|
42
|
+
static w3cStatus() {
|
|
43
|
+
return http_status_codes_1.StatusCodes.NOT_FOUND;
|
|
44
|
+
}
|
|
45
|
+
static error() {
|
|
46
|
+
return 'invalid session id';
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* @param {string} [message] error message
|
|
50
|
+
*/
|
|
51
|
+
constructor(message) {
|
|
52
|
+
super(message || 'A session is either terminated or not started', NoSuchDriverError.code(), NoSuchDriverError.w3cStatus(), NoSuchDriverError.error());
|
|
53
|
+
}
|
|
54
|
+
}
|
|
78
55
|
exports.NoSuchDriverError = NoSuchDriverError;
|
|
79
|
-
|
|
80
56
|
class NoSuchElementError extends ProtocolError {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}
|
|
98
|
-
|
|
57
|
+
static code() {
|
|
58
|
+
return 7;
|
|
59
|
+
}
|
|
60
|
+
static w3cStatus() {
|
|
61
|
+
return http_status_codes_1.StatusCodes.NOT_FOUND;
|
|
62
|
+
}
|
|
63
|
+
static error() {
|
|
64
|
+
return 'no such element';
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* @param {string} [message] error message
|
|
68
|
+
*/
|
|
69
|
+
constructor(message) {
|
|
70
|
+
super(message ||
|
|
71
|
+
'An element could not be located on the page using the given ' + 'search parameters.', NoSuchElementError.code(), NoSuchElementError.w3cStatus(), NoSuchElementError.error());
|
|
72
|
+
}
|
|
73
|
+
}
|
|
99
74
|
exports.NoSuchElementError = NoSuchElementError;
|
|
100
|
-
|
|
101
75
|
class NoSuchFrameError extends ProtocolError {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
76
|
+
static code() {
|
|
77
|
+
return 8;
|
|
78
|
+
}
|
|
79
|
+
static error() {
|
|
80
|
+
return 'no such frame';
|
|
81
|
+
}
|
|
82
|
+
static w3cStatus() {
|
|
83
|
+
return http_status_codes_1.StatusCodes.NOT_FOUND;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
*
|
|
87
|
+
* @param {string} [message]
|
|
88
|
+
*/
|
|
89
|
+
constructor(message) {
|
|
90
|
+
super(message ||
|
|
91
|
+
'A request to switch to a frame could not be satisfied because ' +
|
|
92
|
+
'the frame could not be found.', NoSuchFrameError.code(), NoSuchFrameError.w3cStatus(), NoSuchFrameError.error());
|
|
93
|
+
}
|
|
94
|
+
}
|
|
120
95
|
exports.NoSuchFrameError = NoSuchFrameError;
|
|
121
|
-
|
|
122
96
|
class UnknownCommandError extends ProtocolError {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
97
|
+
static code() {
|
|
98
|
+
return 9;
|
|
99
|
+
}
|
|
100
|
+
static w3cStatus() {
|
|
101
|
+
return http_status_codes_1.StatusCodes.NOT_FOUND;
|
|
102
|
+
}
|
|
103
|
+
static error() {
|
|
104
|
+
return 'unknown command';
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
*
|
|
108
|
+
* @param {string} [message]
|
|
109
|
+
*/
|
|
110
|
+
constructor(message) {
|
|
111
|
+
super(message ||
|
|
112
|
+
'The requested resource could not be found, or a request was ' +
|
|
113
|
+
'received using an HTTP method that is not supported by the mapped ' +
|
|
114
|
+
'resource.', UnknownCommandError.code(), UnknownCommandError.w3cStatus(), UnknownCommandError.error());
|
|
115
|
+
}
|
|
116
|
+
}
|
|
141
117
|
exports.UnknownCommandError = UnknownCommandError;
|
|
142
|
-
|
|
143
118
|
class StaleElementReferenceError extends ProtocolError {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
119
|
+
static code() {
|
|
120
|
+
return 10;
|
|
121
|
+
}
|
|
122
|
+
static w3cStatus() {
|
|
123
|
+
return http_status_codes_1.StatusCodes.NOT_FOUND;
|
|
124
|
+
}
|
|
125
|
+
static error() {
|
|
126
|
+
return 'stale element reference';
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
*
|
|
130
|
+
* @param {string} [message]
|
|
131
|
+
*/
|
|
132
|
+
constructor(message) {
|
|
133
|
+
super(message ||
|
|
134
|
+
'An element command failed because the referenced element is no ' +
|
|
135
|
+
'longer attached to the DOM.', StaleElementReferenceError.code(), StaleElementReferenceError.w3cStatus(), StaleElementReferenceError.error());
|
|
136
|
+
}
|
|
137
|
+
}
|
|
162
138
|
exports.StaleElementReferenceError = StaleElementReferenceError;
|
|
163
|
-
|
|
164
139
|
class ElementNotVisibleError extends ProtocolError {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}
|
|
182
|
-
|
|
140
|
+
static code() {
|
|
141
|
+
return 11;
|
|
142
|
+
}
|
|
143
|
+
static w3cStatus() {
|
|
144
|
+
return http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
145
|
+
}
|
|
146
|
+
static error() {
|
|
147
|
+
return 'element not visible';
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* @param {string} [message] error message
|
|
151
|
+
*/
|
|
152
|
+
constructor(message) {
|
|
153
|
+
super(message ||
|
|
154
|
+
'An element command could not be completed because the element is ' +
|
|
155
|
+
'not visible on the page.', ElementNotVisibleError.code(), ElementNotVisibleError.w3cStatus(), ElementNotVisibleError.error());
|
|
156
|
+
}
|
|
157
|
+
}
|
|
183
158
|
exports.ElementNotVisibleError = ElementNotVisibleError;
|
|
184
|
-
|
|
185
159
|
class InvalidElementStateError extends ProtocolError {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
160
|
+
static code() {
|
|
161
|
+
return 12;
|
|
162
|
+
}
|
|
163
|
+
static w3cStatus() {
|
|
164
|
+
return http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
165
|
+
}
|
|
166
|
+
static error() {
|
|
167
|
+
return 'invalid element state';
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
*
|
|
171
|
+
* @param {string} [message]
|
|
172
|
+
*/
|
|
173
|
+
constructor(message) {
|
|
174
|
+
super(message ||
|
|
175
|
+
'An element command could not be completed because the element is ' +
|
|
176
|
+
'in an invalid state (e.g. attempting to click a disabled element).', InvalidElementStateError.code(), InvalidElementStateError.w3cStatus(), InvalidElementStateError.error());
|
|
177
|
+
}
|
|
178
|
+
}
|
|
204
179
|
exports.InvalidElementStateError = InvalidElementStateError;
|
|
205
|
-
|
|
206
180
|
class UnknownError extends ProtocolError {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
}
|
|
226
|
-
|
|
181
|
+
static code() {
|
|
182
|
+
return 13;
|
|
183
|
+
}
|
|
184
|
+
static w3cStatus() {
|
|
185
|
+
return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
|
|
186
|
+
}
|
|
187
|
+
static error() {
|
|
188
|
+
return W3C_UNKNOWN_ERROR;
|
|
189
|
+
}
|
|
190
|
+
constructor(errorOrMessage) {
|
|
191
|
+
const origMessage = lodash_1.default.isString((errorOrMessage || {}).message)
|
|
192
|
+
? errorOrMessage.message
|
|
193
|
+
: errorOrMessage;
|
|
194
|
+
const message = 'An unknown server-side error occurred while processing the command.' +
|
|
195
|
+
(origMessage ? ` Original error: ${origMessage}` : '');
|
|
196
|
+
super(message, UnknownError.code(), UnknownError.w3cStatus(), UnknownError.error());
|
|
197
|
+
}
|
|
198
|
+
}
|
|
227
199
|
exports.UnknownError = UnknownError;
|
|
228
|
-
|
|
229
200
|
class UnknownMethodError extends ProtocolError {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
}
|
|
247
|
-
|
|
201
|
+
static code() {
|
|
202
|
+
return 405;
|
|
203
|
+
}
|
|
204
|
+
static w3cStatus() {
|
|
205
|
+
return http_status_codes_1.StatusCodes.METHOD_NOT_ALLOWED;
|
|
206
|
+
}
|
|
207
|
+
static error() {
|
|
208
|
+
return 'unknown method';
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* @param {string} [message] error message
|
|
212
|
+
*/
|
|
213
|
+
constructor(message) {
|
|
214
|
+
super(message ||
|
|
215
|
+
'The requested command matched a known URL but did not match an method for that URL', UnknownMethodError.code(), UnknownMethodError.w3cStatus(), UnknownMethodError.error());
|
|
216
|
+
}
|
|
217
|
+
}
|
|
248
218
|
exports.UnknownMethodError = UnknownMethodError;
|
|
249
|
-
|
|
250
219
|
class UnsupportedOperationError extends ProtocolError {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
}
|
|
268
|
-
|
|
220
|
+
static code() {
|
|
221
|
+
return 405;
|
|
222
|
+
}
|
|
223
|
+
static w3cStatus() {
|
|
224
|
+
return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
|
|
225
|
+
}
|
|
226
|
+
static error() {
|
|
227
|
+
return 'unsupported operation';
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* @param {string} [message] error message
|
|
231
|
+
*/
|
|
232
|
+
constructor(message) {
|
|
233
|
+
super(message || 'A server-side error occurred. Command cannot be supported.', UnsupportedOperationError.code(), UnsupportedOperationError.w3cStatus(), UnsupportedOperationError.error());
|
|
234
|
+
}
|
|
235
|
+
}
|
|
269
236
|
exports.UnsupportedOperationError = UnsupportedOperationError;
|
|
270
|
-
|
|
271
237
|
class ElementIsNotSelectableError extends ProtocolError {
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
}
|
|
289
|
-
|
|
238
|
+
static code() {
|
|
239
|
+
return 15;
|
|
240
|
+
}
|
|
241
|
+
static error() {
|
|
242
|
+
return 'element not selectable';
|
|
243
|
+
}
|
|
244
|
+
static w3cStatus() {
|
|
245
|
+
return http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* @param {string} [message] error message
|
|
249
|
+
*/
|
|
250
|
+
constructor(message) {
|
|
251
|
+
super(message || 'An attempt was made to select an element that cannot be selected.', ElementIsNotSelectableError.code(), ElementIsNotSelectableError.w3cStatus(), ElementIsNotSelectableError.error());
|
|
252
|
+
}
|
|
253
|
+
}
|
|
290
254
|
exports.ElementIsNotSelectableError = ElementIsNotSelectableError;
|
|
291
|
-
|
|
292
255
|
class ElementClickInterceptedError extends ProtocolError {
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
}
|
|
310
|
-
|
|
256
|
+
static code() {
|
|
257
|
+
return 64;
|
|
258
|
+
}
|
|
259
|
+
static error() {
|
|
260
|
+
return 'element click intercepted';
|
|
261
|
+
}
|
|
262
|
+
static w3cStatus() {
|
|
263
|
+
return http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* @param {string} [message] error message
|
|
267
|
+
*/
|
|
268
|
+
constructor(message) {
|
|
269
|
+
super(message ||
|
|
270
|
+
'The Element Click command could not be completed because the element receiving ' +
|
|
271
|
+
'the events is obscuring the element that was requested clicked', ElementClickInterceptedError.code(), ElementClickInterceptedError.w3cStatus(), ElementClickInterceptedError.error());
|
|
272
|
+
}
|
|
273
|
+
}
|
|
311
274
|
exports.ElementClickInterceptedError = ElementClickInterceptedError;
|
|
312
|
-
|
|
313
275
|
class ElementNotInteractableError extends ProtocolError {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
}
|
|
331
|
-
|
|
276
|
+
static code() {
|
|
277
|
+
return 60;
|
|
278
|
+
}
|
|
279
|
+
static error() {
|
|
280
|
+
return 'element not interactable';
|
|
281
|
+
}
|
|
282
|
+
static w3cStatus() {
|
|
283
|
+
return http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* @param {string} [message] error message
|
|
287
|
+
*/
|
|
288
|
+
constructor(message) {
|
|
289
|
+
super(message ||
|
|
290
|
+
'A command could not be completed because the element is not pointer- or keyboard interactable', ElementNotInteractableError.code(), ElementNotInteractableError.w3cStatus(), ElementNotInteractableError.error());
|
|
291
|
+
}
|
|
292
|
+
}
|
|
332
293
|
exports.ElementNotInteractableError = ElementNotInteractableError;
|
|
333
|
-
|
|
334
294
|
class InsecureCertificateError extends ProtocolError {
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
295
|
+
static error() {
|
|
296
|
+
return 'insecure certificate';
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* @param {string} [message] error message
|
|
300
|
+
*/
|
|
301
|
+
constructor(message) {
|
|
302
|
+
super(message ||
|
|
303
|
+
'Navigation caused the user agent to hit a certificate warning, which is usually the result of an expired or invalid TLS certificate', ElementIsNotSelectableError.code(), null, InsecureCertificateError.error());
|
|
304
|
+
}
|
|
305
|
+
}
|
|
345
306
|
exports.InsecureCertificateError = InsecureCertificateError;
|
|
346
|
-
|
|
347
307
|
class JavaScriptError extends ProtocolError {
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
}
|
|
365
|
-
|
|
308
|
+
static code() {
|
|
309
|
+
return 17;
|
|
310
|
+
}
|
|
311
|
+
static w3cStatus() {
|
|
312
|
+
return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
|
|
313
|
+
}
|
|
314
|
+
static error() {
|
|
315
|
+
return 'javascript error';
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* @param {string} [message] error message
|
|
319
|
+
*/
|
|
320
|
+
constructor(message) {
|
|
321
|
+
super(message || 'An error occurred while executing user supplied JavaScript.', JavaScriptError.code(), JavaScriptError.w3cStatus(), JavaScriptError.error());
|
|
322
|
+
}
|
|
323
|
+
}
|
|
366
324
|
exports.JavaScriptError = JavaScriptError;
|
|
367
|
-
|
|
368
325
|
class XPathLookupError extends ProtocolError {
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
}
|
|
386
|
-
|
|
326
|
+
static code() {
|
|
327
|
+
return 19;
|
|
328
|
+
}
|
|
329
|
+
static w3cStatus() {
|
|
330
|
+
return http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
331
|
+
}
|
|
332
|
+
static error() {
|
|
333
|
+
return 'invalid selector';
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* @param {string} [message] error message
|
|
337
|
+
*/
|
|
338
|
+
constructor(message) {
|
|
339
|
+
super(message || 'An error occurred while searching for an element by XPath.', XPathLookupError.code(), XPathLookupError.w3cStatus(), XPathLookupError.error());
|
|
340
|
+
}
|
|
341
|
+
}
|
|
387
342
|
exports.XPathLookupError = XPathLookupError;
|
|
388
|
-
|
|
389
343
|
class TimeoutError extends ProtocolError {
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
}
|
|
407
|
-
|
|
344
|
+
static code() {
|
|
345
|
+
return 21;
|
|
346
|
+
}
|
|
347
|
+
static w3cStatus() {
|
|
348
|
+
return http_status_codes_1.StatusCodes.REQUEST_TIMEOUT;
|
|
349
|
+
}
|
|
350
|
+
static error() {
|
|
351
|
+
return 'timeout';
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* @param {string} [message] error message
|
|
355
|
+
*/
|
|
356
|
+
constructor(message) {
|
|
357
|
+
super(message || 'An operation did not complete before its timeout expired.', TimeoutError.code(), TimeoutError.w3cStatus(), TimeoutError.error());
|
|
358
|
+
}
|
|
359
|
+
}
|
|
408
360
|
exports.TimeoutError = TimeoutError;
|
|
409
|
-
|
|
410
361
|
class NoSuchWindowError extends ProtocolError {
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
}
|
|
428
|
-
|
|
362
|
+
static code() {
|
|
363
|
+
return 23;
|
|
364
|
+
}
|
|
365
|
+
static error() {
|
|
366
|
+
return 'no such window';
|
|
367
|
+
}
|
|
368
|
+
static w3cStatus() {
|
|
369
|
+
return http_status_codes_1.StatusCodes.NOT_FOUND;
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* @param {string} [message] error message
|
|
373
|
+
*/
|
|
374
|
+
constructor(message) {
|
|
375
|
+
super(message ||
|
|
376
|
+
'A request to switch to a different window could not be satisfied ' +
|
|
377
|
+
'because the window could not be found.', NoSuchWindowError.code(), NoSuchWindowError.w3cStatus(), NoSuchWindowError.error());
|
|
378
|
+
}
|
|
379
|
+
}
|
|
429
380
|
exports.NoSuchWindowError = NoSuchWindowError;
|
|
430
|
-
|
|
431
381
|
class InvalidArgumentError extends ProtocolError {
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
}
|
|
449
|
-
|
|
382
|
+
static code() {
|
|
383
|
+
return 61;
|
|
384
|
+
}
|
|
385
|
+
static error() {
|
|
386
|
+
return 'invalid argument';
|
|
387
|
+
}
|
|
388
|
+
static w3cStatus() {
|
|
389
|
+
return http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* @param {string} [err] error message
|
|
393
|
+
*/
|
|
394
|
+
constructor(err) {
|
|
395
|
+
super(err || 'The arguments passed to the command are either invalid or malformed', InvalidArgumentError.code(), InvalidArgumentError.w3cStatus(), InvalidArgumentError.error());
|
|
396
|
+
}
|
|
397
|
+
}
|
|
450
398
|
exports.InvalidArgumentError = InvalidArgumentError;
|
|
451
|
-
|
|
452
399
|
class InvalidCookieDomainError extends ProtocolError {
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
}
|
|
470
|
-
|
|
400
|
+
static code() {
|
|
401
|
+
return 24;
|
|
402
|
+
}
|
|
403
|
+
static error() {
|
|
404
|
+
return 'invalid cookie domain';
|
|
405
|
+
}
|
|
406
|
+
static w3cStatus() {
|
|
407
|
+
return http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* @param {string} [err] error message
|
|
411
|
+
*/
|
|
412
|
+
constructor(err) {
|
|
413
|
+
super(err ||
|
|
414
|
+
'An illegal attempt was made to set a cookie under a different ' +
|
|
415
|
+
'domain than the current page.', InvalidCookieDomainError.code(), InvalidCookieDomainError.w3cStatus(), InvalidCookieDomainError.error());
|
|
416
|
+
}
|
|
417
|
+
}
|
|
471
418
|
exports.InvalidCookieDomainError = InvalidCookieDomainError;
|
|
472
|
-
|
|
473
419
|
class NoSuchCookieError extends ProtocolError {
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
}
|
|
491
|
-
|
|
420
|
+
static code() {
|
|
421
|
+
return 62;
|
|
422
|
+
}
|
|
423
|
+
static w3cStatus() {
|
|
424
|
+
return http_status_codes_1.StatusCodes.NOT_FOUND;
|
|
425
|
+
}
|
|
426
|
+
static error() {
|
|
427
|
+
return 'no such cookie';
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* @param {string} [err] error message
|
|
431
|
+
*/
|
|
432
|
+
constructor(err) {
|
|
433
|
+
super(err ||
|
|
434
|
+
'No cookie matching the given path name was found amongst the associated cookies of the current browsing context’s active document', NoSuchCookieError.code(), NoSuchCookieError.w3cStatus(), NoSuchCookieError.error());
|
|
435
|
+
}
|
|
436
|
+
}
|
|
492
437
|
exports.NoSuchCookieError = NoSuchCookieError;
|
|
493
|
-
|
|
494
438
|
class UnableToSetCookieError extends ProtocolError {
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
}
|
|
512
|
-
|
|
439
|
+
static code() {
|
|
440
|
+
return 25;
|
|
441
|
+
}
|
|
442
|
+
static w3cStatus() {
|
|
443
|
+
return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
|
|
444
|
+
}
|
|
445
|
+
static error() {
|
|
446
|
+
return 'unable to set cookie';
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* @param {string} [err] error message
|
|
450
|
+
*/
|
|
451
|
+
constructor(err) {
|
|
452
|
+
super(err || "A request to set a cookie's value could not be satisfied.", UnableToSetCookieError.code(), UnableToSetCookieError.w3cStatus(), UnableToSetCookieError.error());
|
|
453
|
+
}
|
|
454
|
+
}
|
|
513
455
|
exports.UnableToSetCookieError = UnableToSetCookieError;
|
|
514
|
-
|
|
515
456
|
class UnexpectedAlertOpenError extends ProtocolError {
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
}
|
|
533
|
-
|
|
457
|
+
static code() {
|
|
458
|
+
return 26;
|
|
459
|
+
}
|
|
460
|
+
static w3cStatus() {
|
|
461
|
+
return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
|
|
462
|
+
}
|
|
463
|
+
static error() {
|
|
464
|
+
return 'unexpected alert open';
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* @param {string} [message] error message
|
|
468
|
+
*/
|
|
469
|
+
constructor(message) {
|
|
470
|
+
super(message || 'A modal dialog was open, blocking this operation', UnexpectedAlertOpenError.code(), UnexpectedAlertOpenError.w3cStatus(), UnexpectedAlertOpenError.error());
|
|
471
|
+
}
|
|
472
|
+
}
|
|
534
473
|
exports.UnexpectedAlertOpenError = UnexpectedAlertOpenError;
|
|
535
|
-
|
|
536
474
|
class NoAlertOpenError extends ProtocolError {
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
}
|
|
554
|
-
|
|
475
|
+
static code() {
|
|
476
|
+
return 27;
|
|
477
|
+
}
|
|
478
|
+
static w3cStatus() {
|
|
479
|
+
return http_status_codes_1.StatusCodes.NOT_FOUND;
|
|
480
|
+
}
|
|
481
|
+
static error() {
|
|
482
|
+
return 'no such alert';
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
*
|
|
486
|
+
* @param {string} [message]
|
|
487
|
+
*/
|
|
488
|
+
constructor(message) {
|
|
489
|
+
super(message || 'An attempt was made to operate on a modal dialog when one ' + 'was not open.', NoAlertOpenError.code(), NoAlertOpenError.w3cStatus(), NoAlertOpenError.error());
|
|
490
|
+
}
|
|
491
|
+
}
|
|
555
492
|
exports.NoAlertOpenError = NoAlertOpenError;
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
493
|
+
class NoSuchAlertError extends NoAlertOpenError {
|
|
494
|
+
}
|
|
559
495
|
exports.NoSuchAlertError = NoSuchAlertError;
|
|
560
|
-
|
|
561
496
|
class ScriptTimeoutError extends ProtocolError {
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
}
|
|
579
|
-
|
|
497
|
+
static code() {
|
|
498
|
+
return 28;
|
|
499
|
+
}
|
|
500
|
+
static w3cStatus() {
|
|
501
|
+
return http_status_codes_1.StatusCodes.REQUEST_TIMEOUT;
|
|
502
|
+
}
|
|
503
|
+
static error() {
|
|
504
|
+
return 'script timeout';
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* @param {string} [err] error message
|
|
508
|
+
*/
|
|
509
|
+
constructor(err) {
|
|
510
|
+
super(err || 'A script did not complete before its timeout expired.', ScriptTimeoutError.code(), ScriptTimeoutError.w3cStatus(), ScriptTimeoutError.error());
|
|
511
|
+
}
|
|
512
|
+
}
|
|
580
513
|
exports.ScriptTimeoutError = ScriptTimeoutError;
|
|
581
|
-
|
|
582
514
|
class InvalidElementCoordinatesError extends ProtocolError {
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
}
|
|
600
|
-
|
|
515
|
+
static code() {
|
|
516
|
+
return 29;
|
|
517
|
+
}
|
|
518
|
+
static w3cStatus() {
|
|
519
|
+
return http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
520
|
+
}
|
|
521
|
+
static error() {
|
|
522
|
+
return 'invalid coordinates';
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* @param {string} [err] error message
|
|
526
|
+
*/
|
|
527
|
+
constructor(err) {
|
|
528
|
+
super(err || 'The coordinates provided to an interactions operation are invalid.', InvalidElementCoordinatesError.code(), InvalidElementCoordinatesError.w3cStatus(), InvalidElementCoordinatesError.error());
|
|
529
|
+
}
|
|
530
|
+
}
|
|
601
531
|
exports.InvalidElementCoordinatesError = InvalidElementCoordinatesError;
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
532
|
+
class InvalidCoordinatesError extends InvalidElementCoordinatesError {
|
|
533
|
+
}
|
|
605
534
|
exports.InvalidCoordinatesError = InvalidCoordinatesError;
|
|
606
|
-
|
|
607
535
|
class IMENotAvailableError extends ProtocolError {
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
}
|
|
625
|
-
|
|
536
|
+
static code() {
|
|
537
|
+
return 30;
|
|
538
|
+
}
|
|
539
|
+
static w3cStatus() {
|
|
540
|
+
return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
|
|
541
|
+
}
|
|
542
|
+
static error() {
|
|
543
|
+
return 'unsupported operation';
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* @param {string} [message] error message
|
|
547
|
+
*/
|
|
548
|
+
constructor(message) {
|
|
549
|
+
super(message || 'IME was not available.', IMENotAvailableError.code(), IMENotAvailableError.w3cStatus(), IMENotAvailableError.error());
|
|
550
|
+
}
|
|
551
|
+
}
|
|
626
552
|
exports.IMENotAvailableError = IMENotAvailableError;
|
|
627
|
-
|
|
628
553
|
class IMEEngineActivationFailedError extends ProtocolError {
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
}
|
|
646
|
-
|
|
554
|
+
static code() {
|
|
555
|
+
return 31;
|
|
556
|
+
}
|
|
557
|
+
static w3cStatus() {
|
|
558
|
+
return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
|
|
559
|
+
}
|
|
560
|
+
static error() {
|
|
561
|
+
return 'unsupported operation';
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* @param {string} [err] error message
|
|
565
|
+
*/
|
|
566
|
+
constructor(err) {
|
|
567
|
+
super(err || 'An IME engine could not be started.', IMEEngineActivationFailedError.code(), IMEEngineActivationFailedError.w3cStatus(), IMEEngineActivationFailedError.error());
|
|
568
|
+
}
|
|
569
|
+
}
|
|
647
570
|
exports.IMEEngineActivationFailedError = IMEEngineActivationFailedError;
|
|
648
|
-
|
|
649
571
|
class InvalidSelectorError extends ProtocolError {
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
}
|
|
667
|
-
|
|
572
|
+
static code() {
|
|
573
|
+
return 32;
|
|
574
|
+
}
|
|
575
|
+
static w3cStatus() {
|
|
576
|
+
return http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
577
|
+
}
|
|
578
|
+
static error() {
|
|
579
|
+
return 'invalid selector';
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* @param {string} [err] error message
|
|
583
|
+
*/
|
|
584
|
+
constructor(err) {
|
|
585
|
+
super(err || 'Argument was an invalid selector (e.g. XPath/CSS).', InvalidSelectorError.code(), InvalidSelectorError.w3cStatus(), InvalidSelectorError.error());
|
|
586
|
+
}
|
|
587
|
+
}
|
|
668
588
|
exports.InvalidSelectorError = InvalidSelectorError;
|
|
669
|
-
|
|
670
589
|
class SessionNotCreatedError extends ProtocolError {
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
super(message, SessionNotCreatedError.code(), SessionNotCreatedError.w3cStatus(), SessionNotCreatedError.error());
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
}
|
|
694
|
-
|
|
590
|
+
static code() {
|
|
591
|
+
return 33;
|
|
592
|
+
}
|
|
593
|
+
static w3cStatus() {
|
|
594
|
+
return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
|
|
595
|
+
}
|
|
596
|
+
static error() {
|
|
597
|
+
return 'session not created';
|
|
598
|
+
}
|
|
599
|
+
constructor(details) {
|
|
600
|
+
let message = 'A new session could not be created.';
|
|
601
|
+
if (details) {
|
|
602
|
+
message += ` Details: ${details}`;
|
|
603
|
+
}
|
|
604
|
+
super(message, SessionNotCreatedError.code(), SessionNotCreatedError.w3cStatus(), SessionNotCreatedError.error());
|
|
605
|
+
}
|
|
606
|
+
}
|
|
695
607
|
exports.SessionNotCreatedError = SessionNotCreatedError;
|
|
696
|
-
|
|
697
608
|
class MoveTargetOutOfBoundsError extends ProtocolError {
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
}
|
|
715
|
-
|
|
609
|
+
static code() {
|
|
610
|
+
return 34;
|
|
611
|
+
}
|
|
612
|
+
static w3cStatus() {
|
|
613
|
+
return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
|
|
614
|
+
}
|
|
615
|
+
static error() {
|
|
616
|
+
return 'move target out of bounds';
|
|
617
|
+
}
|
|
618
|
+
/**
|
|
619
|
+
* @param {string} [err] error message
|
|
620
|
+
*/
|
|
621
|
+
constructor(err) {
|
|
622
|
+
super(err || 'Target provided for a move action is out of bounds.', MoveTargetOutOfBoundsError.code(), MoveTargetOutOfBoundsError.w3cStatus(), MoveTargetOutOfBoundsError.error());
|
|
623
|
+
}
|
|
624
|
+
}
|
|
716
625
|
exports.MoveTargetOutOfBoundsError = MoveTargetOutOfBoundsError;
|
|
717
|
-
|
|
718
626
|
class NoSuchContextError extends ProtocolError {
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
627
|
+
static code() {
|
|
628
|
+
return 35;
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
*
|
|
632
|
+
* @param {string} [message]
|
|
633
|
+
*/
|
|
634
|
+
constructor(message) {
|
|
635
|
+
super(message || 'No such context found.', NoSuchContextError.code());
|
|
636
|
+
}
|
|
637
|
+
}
|
|
729
638
|
exports.NoSuchContextError = NoSuchContextError;
|
|
730
|
-
|
|
731
639
|
class InvalidContextError extends ProtocolError {
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
640
|
+
static code() {
|
|
641
|
+
return 36;
|
|
642
|
+
}
|
|
643
|
+
/**
|
|
644
|
+
*
|
|
645
|
+
* @param {string} [message]
|
|
646
|
+
*/
|
|
647
|
+
constructor(message) {
|
|
648
|
+
super(message || 'That command could not be executed in the current context.', InvalidContextError.code());
|
|
649
|
+
}
|
|
650
|
+
}
|
|
742
651
|
exports.InvalidContextError = InvalidContextError;
|
|
743
|
-
|
|
652
|
+
// These are aliases for UnknownMethodError
|
|
744
653
|
class NotYetImplementedError extends UnknownMethodError {
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
654
|
+
/**
|
|
655
|
+
* @param {string} [err] error message
|
|
656
|
+
*/
|
|
657
|
+
constructor(err) {
|
|
658
|
+
super(err || 'Method has not yet been implemented');
|
|
659
|
+
}
|
|
749
660
|
}
|
|
750
|
-
|
|
751
661
|
exports.NotYetImplementedError = NotYetImplementedError;
|
|
752
|
-
|
|
753
662
|
class NotImplementedError extends UnknownMethodError {
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
663
|
+
/**
|
|
664
|
+
* @param {string} [err] error message
|
|
665
|
+
*/
|
|
666
|
+
constructor(err) {
|
|
667
|
+
super(err || 'Method is not implemented');
|
|
668
|
+
}
|
|
758
669
|
}
|
|
759
|
-
|
|
760
670
|
exports.NotImplementedError = NotImplementedError;
|
|
761
|
-
|
|
762
671
|
class UnableToCaptureScreen extends ProtocolError {
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
}
|
|
780
|
-
|
|
672
|
+
static code() {
|
|
673
|
+
return 63;
|
|
674
|
+
}
|
|
675
|
+
static w3cStatus() {
|
|
676
|
+
return http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
|
|
677
|
+
}
|
|
678
|
+
static error() {
|
|
679
|
+
return 'unable to capture screen';
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* @param {string} [err] error message
|
|
683
|
+
*/
|
|
684
|
+
constructor(err) {
|
|
685
|
+
super(err || 'A screen capture was made impossible', UnableToCaptureScreen.code(), UnableToCaptureScreen.w3cStatus(), UnableToCaptureScreen.error());
|
|
686
|
+
}
|
|
687
|
+
}
|
|
781
688
|
exports.UnableToCaptureScreen = UnableToCaptureScreen;
|
|
782
|
-
|
|
783
|
-
class BadParametersError extends
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
}
|
|
802
|
-
|
|
689
|
+
// Equivalent to W3C InvalidArgumentError
|
|
690
|
+
class BadParametersError extends es6_error_1.default {
|
|
691
|
+
static error() {
|
|
692
|
+
return 'invalid argument';
|
|
693
|
+
}
|
|
694
|
+
constructor(requiredParams, actualParams, errMessage) {
|
|
695
|
+
let message;
|
|
696
|
+
if (!errMessage) {
|
|
697
|
+
message =
|
|
698
|
+
`Parameters were incorrect. We wanted ` +
|
|
699
|
+
`${JSON.stringify(requiredParams)} and you ` +
|
|
700
|
+
`sent ${JSON.stringify(actualParams)}`;
|
|
701
|
+
}
|
|
702
|
+
else {
|
|
703
|
+
message = `Parameters were incorrect. You sent ${JSON.stringify(actualParams)}, ${errMessage}`;
|
|
704
|
+
}
|
|
705
|
+
super(message);
|
|
706
|
+
this.w3cStatus = http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
707
|
+
}
|
|
708
|
+
}
|
|
803
709
|
exports.BadParametersError = BadParametersError;
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
}
|
|
847
|
-
|
|
710
|
+
/**
|
|
711
|
+
* ProxyRequestError is a custom error and will be thrown up on unsuccessful proxy request and
|
|
712
|
+
* will contain information about the proxy failure.
|
|
713
|
+
* In case of ProxyRequestError should fetch the actual error by calling `getActualError()`
|
|
714
|
+
* for proxy failure to generate the client response.
|
|
715
|
+
*/
|
|
716
|
+
class ProxyRequestError extends es6_error_1.default {
|
|
717
|
+
constructor(err, responseError, httpStatus) {
|
|
718
|
+
let responseErrorObj = support_1.util.safeJsonParse(responseError);
|
|
719
|
+
if (!lodash_1.default.isPlainObject(responseErrorObj)) {
|
|
720
|
+
responseErrorObj = {};
|
|
721
|
+
}
|
|
722
|
+
let origMessage = lodash_1.default.isString(responseError) ? responseError : '';
|
|
723
|
+
if (!lodash_1.default.isEmpty(responseErrorObj)) {
|
|
724
|
+
if (lodash_1.default.isString(responseErrorObj.value)) {
|
|
725
|
+
origMessage = responseErrorObj.value;
|
|
726
|
+
}
|
|
727
|
+
else if (lodash_1.default.isPlainObject(responseErrorObj.value) &&
|
|
728
|
+
lodash_1.default.isString(responseErrorObj.value.message)) {
|
|
729
|
+
origMessage = responseErrorObj.value.message;
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
super(lodash_1.default.isEmpty(err) ? `Proxy request unsuccessful. ${origMessage}` : err);
|
|
733
|
+
this.w3cStatus = http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
734
|
+
// If the response error is an object and value is an object, it's a W3C error (for JSONWP value is a string)
|
|
735
|
+
if (lodash_1.default.isPlainObject(responseErrorObj.value) && lodash_1.default.has(responseErrorObj.value, 'error')) {
|
|
736
|
+
this.w3c = responseErrorObj.value;
|
|
737
|
+
this.w3cStatus = httpStatus || http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
738
|
+
}
|
|
739
|
+
else {
|
|
740
|
+
this.jsonwp = responseErrorObj;
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
getActualError() {
|
|
744
|
+
// If it's MJSONWP error, returns actual error cause for request failure based on `jsonwp.status`
|
|
745
|
+
if (support_1.util.hasValue(this.jsonwp?.status) && support_1.util.hasValue(this.jsonwp?.value)) {
|
|
746
|
+
return errorFromMJSONWPStatusCode(this.jsonwp.status, this.jsonwp.value);
|
|
747
|
+
}
|
|
748
|
+
else if (support_1.util.hasValue(this.w3c) && lodash_1.default.isNumber(this.w3cStatus) && this.w3cStatus >= 300) {
|
|
749
|
+
return errorFromW3CJsonCode(this.w3c.error, this.w3c.message || this.message, this.w3c.stacktrace);
|
|
750
|
+
}
|
|
751
|
+
return new UnknownError(this.message);
|
|
752
|
+
}
|
|
753
|
+
}
|
|
848
754
|
exports.ProxyRequestError = ProxyRequestError;
|
|
755
|
+
// map of error class name to error class
|
|
849
756
|
const errors = {
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
757
|
+
NotYetImplementedError,
|
|
758
|
+
NotImplementedError,
|
|
759
|
+
BadParametersError,
|
|
760
|
+
InvalidArgumentError,
|
|
761
|
+
NoSuchDriverError,
|
|
762
|
+
NoSuchElementError,
|
|
763
|
+
UnknownCommandError,
|
|
764
|
+
StaleElementReferenceError,
|
|
765
|
+
ElementNotVisibleError,
|
|
766
|
+
InvalidElementStateError,
|
|
767
|
+
UnknownError,
|
|
768
|
+
ElementIsNotSelectableError,
|
|
769
|
+
ElementClickInterceptedError,
|
|
770
|
+
ElementNotInteractableError,
|
|
771
|
+
InsecureCertificateError,
|
|
772
|
+
JavaScriptError,
|
|
773
|
+
XPathLookupError,
|
|
774
|
+
TimeoutError,
|
|
775
|
+
NoSuchWindowError,
|
|
776
|
+
NoSuchCookieError,
|
|
777
|
+
InvalidCookieDomainError,
|
|
778
|
+
InvalidCoordinatesError,
|
|
779
|
+
UnableToSetCookieError,
|
|
780
|
+
UnexpectedAlertOpenError,
|
|
781
|
+
NoAlertOpenError,
|
|
782
|
+
ScriptTimeoutError,
|
|
783
|
+
InvalidElementCoordinatesError,
|
|
784
|
+
IMENotAvailableError,
|
|
785
|
+
IMEEngineActivationFailedError,
|
|
786
|
+
InvalidSelectorError,
|
|
787
|
+
SessionNotCreatedError,
|
|
788
|
+
MoveTargetOutOfBoundsError,
|
|
789
|
+
NoSuchAlertError,
|
|
790
|
+
NoSuchContextError,
|
|
791
|
+
InvalidContextError,
|
|
792
|
+
NoSuchFrameError,
|
|
793
|
+
UnableToCaptureScreen,
|
|
794
|
+
UnknownMethodError,
|
|
795
|
+
UnsupportedOperationError,
|
|
796
|
+
ProxyRequestError,
|
|
890
797
|
};
|
|
891
798
|
exports.errors = errors;
|
|
799
|
+
// map of error code to error class
|
|
892
800
|
const jsonwpErrorCodeMap = {};
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
}
|
|
801
|
+
for (let ErrorClass of lodash_1.default.values(errors)) {
|
|
802
|
+
if ('code' in ErrorClass) {
|
|
803
|
+
jsonwpErrorCodeMap[ErrorClass.code()] = ErrorClass;
|
|
804
|
+
}
|
|
898
805
|
}
|
|
899
|
-
|
|
900
806
|
const w3cErrorCodeMap = {};
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
}
|
|
807
|
+
for (let ErrorClass of lodash_1.default.values(errors)) {
|
|
808
|
+
if ('error' in ErrorClass) {
|
|
809
|
+
w3cErrorCodeMap[ErrorClass.error()] = ErrorClass;
|
|
810
|
+
}
|
|
906
811
|
}
|
|
907
|
-
|
|
908
812
|
function isUnknownError(err) {
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
813
|
+
return (!err.constructor.name ||
|
|
814
|
+
!lodash_1.default.values(errors).find(function equalNames(error) {
|
|
815
|
+
return error.name === err.constructor.name;
|
|
816
|
+
}));
|
|
912
817
|
}
|
|
913
|
-
|
|
818
|
+
exports.isUnknownError = isUnknownError;
|
|
914
819
|
function isErrorType(err, type) {
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
820
|
+
// `name` property is the constructor name
|
|
821
|
+
if (type.name === ProtocolError.name) {
|
|
822
|
+
// `jsonwpCode` is `0` on success
|
|
823
|
+
return !!err.jsonwpCode;
|
|
824
|
+
}
|
|
825
|
+
else if (type.name === ProxyRequestError.name) {
|
|
826
|
+
// `status` is `0` on success
|
|
827
|
+
if (err.jsonwp) {
|
|
828
|
+
return !!err.jsonwp.status;
|
|
829
|
+
}
|
|
830
|
+
if (lodash_1.default.isPlainObject(err.w3c)) {
|
|
831
|
+
return lodash_1.default.isNumber(err.w3cStatus) && err.w3cStatus >= 300;
|
|
832
|
+
}
|
|
833
|
+
return false;
|
|
834
|
+
}
|
|
835
|
+
return err.constructor.name === type.name;
|
|
836
|
+
}
|
|
837
|
+
exports.isErrorType = isErrorType;
|
|
838
|
+
/**
|
|
839
|
+
* Retrieve an error derived from MJSONWP status
|
|
840
|
+
* @param {number} code JSONWP status code
|
|
841
|
+
* @param {string|Object} value The error message, or an object with a `message` property
|
|
842
|
+
* @return {ProtocolError} The error that is associated with provided JSONWP status code
|
|
843
|
+
*/
|
|
932
844
|
function errorFromMJSONWPStatusCode(code, value = '') {
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
}
|
|
943
|
-
|
|
845
|
+
// if `value` is an object, pull message from it, otherwise use the plain
|
|
846
|
+
// value, or default to an empty string, if null
|
|
847
|
+
const message = (value || {}).message || value || '';
|
|
848
|
+
if (code !== UnknownError.code() && jsonwpErrorCodeMap[code]) {
|
|
849
|
+
mjsonwpLog.debug(`Matched JSONWP error code ${code} to ${jsonwpErrorCodeMap[code].name}`);
|
|
850
|
+
return new jsonwpErrorCodeMap[code](message);
|
|
851
|
+
}
|
|
852
|
+
mjsonwpLog.debug(`Matched JSONWP error code ${code} to UnknownError`);
|
|
853
|
+
return new UnknownError(message);
|
|
854
|
+
}
|
|
855
|
+
exports.errorFromMJSONWPStatusCode = errorFromMJSONWPStatusCode;
|
|
856
|
+
/**
|
|
857
|
+
* Retrieve an error derived from W3C JSON Code
|
|
858
|
+
* @param {string} code W3C error string (see https://www.w3.org/TR/webdriver/#handling-errors `JSON Error Code` column)
|
|
859
|
+
* @param {string} message the error message
|
|
860
|
+
* @param {?string} stacktrace an optional error stacktrace
|
|
861
|
+
* @return {ProtocolError} The error that is associated with the W3C error string
|
|
862
|
+
*/
|
|
944
863
|
function errorFromW3CJsonCode(code, message, stacktrace = null) {
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
864
|
+
if (code && w3cErrorCodeMap[code.toLowerCase()]) {
|
|
865
|
+
w3cLog.debug(`Matched W3C error code '${code}' to ${w3cErrorCodeMap[code.toLowerCase()].name}`);
|
|
866
|
+
const resultError = new w3cErrorCodeMap[code.toLowerCase()](message);
|
|
867
|
+
resultError.stacktrace = stacktrace;
|
|
868
|
+
return resultError;
|
|
869
|
+
}
|
|
870
|
+
w3cLog.debug(`Matched W3C error code '${code}' to UnknownError`);
|
|
871
|
+
const resultError = new UnknownError(message);
|
|
948
872
|
resultError.stacktrace = stacktrace;
|
|
949
873
|
return resultError;
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
874
|
+
}
|
|
875
|
+
exports.errorFromW3CJsonCode = errorFromW3CJsonCode;
|
|
876
|
+
/**
|
|
877
|
+
*
|
|
878
|
+
* @param {any} err
|
|
879
|
+
* @returns {err is ProtocolError}
|
|
880
|
+
*/
|
|
958
881
|
function isProtocolError(err) {
|
|
959
|
-
|
|
882
|
+
return 'w3cStatus' in err;
|
|
960
883
|
}
|
|
961
|
-
|
|
884
|
+
/**
|
|
885
|
+
* Convert an Appium error to proper W3C HTTP response
|
|
886
|
+
* @param {ProtocolError|MJSONWPError} err The error that needs to be translated
|
|
887
|
+
*/
|
|
962
888
|
function getResponseForW3CError(err) {
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
889
|
+
let httpStatus;
|
|
890
|
+
// W3C defined error message (https://www.w3.org/TR/webdriver/#dfn-error-code)
|
|
891
|
+
let w3cErrorString;
|
|
892
|
+
if (!isProtocolError(err)) {
|
|
893
|
+
err = support_1.util.hasValue(err.status)
|
|
894
|
+
? // If it's a JSONWP error, find corresponding error
|
|
895
|
+
errorFromMJSONWPStatusCode(err.status, err.value)
|
|
896
|
+
: new errors.UnknownError(err.message);
|
|
897
|
+
}
|
|
898
|
+
if (isErrorType(err, errors.BadParametersError)) {
|
|
899
|
+
// respond with a 400 if we have bad parameters
|
|
900
|
+
w3cLog.debug(`Bad parameters: ${err}`);
|
|
901
|
+
w3cErrorString = BadParametersError.error();
|
|
902
|
+
}
|
|
903
|
+
else {
|
|
904
|
+
w3cErrorString = err.error;
|
|
905
|
+
}
|
|
906
|
+
httpStatus = err.w3cStatus;
|
|
907
|
+
if (!w3cErrorString) {
|
|
908
|
+
w3cErrorString = UnknownError.error();
|
|
909
|
+
}
|
|
910
|
+
let httpResBody = {
|
|
911
|
+
value: {
|
|
912
|
+
error: w3cErrorString,
|
|
913
|
+
message: err.message,
|
|
914
|
+
stacktrace: err.stacktrace || err.stack,
|
|
915
|
+
},
|
|
916
|
+
};
|
|
917
|
+
return [httpStatus, httpResBody];
|
|
918
|
+
}
|
|
919
|
+
exports.getResponseForW3CError = getResponseForW3CError;
|
|
920
|
+
/**
|
|
921
|
+
* Convert an Appium error to a proper JSONWP response
|
|
922
|
+
* @param {ProtocolError} err The error to be converted
|
|
923
|
+
*/
|
|
993
924
|
function getResponseForJsonwpError(err) {
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtanNvbndwTG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwidzNjTG9nIiwiVzNDX1VOS05PV05fRVJST1IiLCJQcm90b2NvbEVycm9yIiwiRVM2RXJyb3IiLCJjb25zdHJ1Y3RvciIsIm1zZyIsImpzb253cENvZGUiLCJ3M2NTdGF0dXMiLCJlcnJvciIsIkhUVFBTdGF0dXNDb2RlcyIsIkJBRF9SRVFVRVNUIiwiX3N0YWNrdHJhY2UiLCJzdGFja3RyYWNlIiwic3RhY2siLCJ2YWx1ZSIsIk5vU3VjaERyaXZlckVycm9yIiwiY29kZSIsIk5PVF9GT1VORCIsImVyciIsIk5vU3VjaEVsZW1lbnRFcnJvciIsIk5vU3VjaEZyYW1lRXJyb3IiLCJVbmtub3duQ29tbWFuZEVycm9yIiwiU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IiLCJFbGVtZW50Tm90VmlzaWJsZUVycm9yIiwiSW52YWxpZEVsZW1lbnRTdGF0ZUVycm9yIiwiVW5rbm93bkVycm9yIiwiSU5URVJOQUxfU0VSVkVSX0VSUk9SIiwiZXJyb3JPck1lc3NhZ2UiLCJvcmlnTWVzc2FnZSIsIl8iLCJpc1N0cmluZyIsIm1lc3NhZ2UiLCJVbmtub3duTWV0aG9kRXJyb3IiLCJNRVRIT0RfTk9UX0FMTE9XRUQiLCJVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yIiwiRWxlbWVudElzTm90U2VsZWN0YWJsZUVycm9yIiwiRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvciIsIkVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvciIsIkluc2VjdXJlQ2VydGlmaWNhdGVFcnJvciIsIkphdmFTY3JpcHRFcnJvciIsIlhQYXRoTG9va3VwRXJyb3IiLCJUaW1lb3V0RXJyb3IiLCJSRVFVRVNUX1RJTUVPVVQiLCJOb1N1Y2hXaW5kb3dFcnJvciIsIkludmFsaWRBcmd1bWVudEVycm9yIiwiSW52YWxpZENvb2tpZURvbWFpbkVycm9yIiwiTm9TdWNoQ29va2llRXJyb3IiLCJVbmFibGVUb1NldENvb2tpZUVycm9yIiwiVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yIiwiTm9BbGVydE9wZW5FcnJvciIsIk5vU3VjaEFsZXJ0RXJyb3IiLCJTY3JpcHRUaW1lb3V0RXJyb3IiLCJJbnZhbGlkRWxlbWVudENvb3JkaW5hdGVzRXJyb3IiLCJJbnZhbGlkQ29vcmRpbmF0ZXNFcnJvciIsIklNRU5vdEF2YWlsYWJsZUVycm9yIiwiSU1FRW5naW5lQWN0aXZhdGlvbkZhaWxlZEVycm9yIiwiSW52YWxpZFNlbGVjdG9yRXJyb3IiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwiZGV0YWlscyIsIk1vdmVUYXJnZXRPdXRPZkJvdW5kc0Vycm9yIiwiTm9TdWNoQ29udGV4dEVycm9yIiwiSW52YWxpZENvbnRleHRFcnJvciIsIk5vdFlldEltcGxlbWVudGVkRXJyb3IiLCJOb3RJbXBsZW1lbnRlZEVycm9yIiwiVW5hYmxlVG9DYXB0dXJlU2NyZWVuIiwiQmFkUGFyYW1ldGVyc0Vycm9yIiwicmVxdWlyZWRQYXJhbXMiLCJhY3R1YWxQYXJhbXMiLCJlcnJNZXNzYWdlIiwiSlNPTiIsInN0cmluZ2lmeSIsIlByb3h5UmVxdWVzdEVycm9yIiwicmVzcG9uc2VFcnJvciIsImh0dHBTdGF0dXMiLCJyZXNwb25zZUVycm9yT2JqIiwidXRpbCIsInNhZmVKc29uUGFyc2UiLCJpc1BsYWluT2JqZWN0IiwiaXNFbXB0eSIsImhhcyIsInczYyIsImpzb253cCIsImdldEFjdHVhbEVycm9yIiwiaGFzVmFsdWUiLCJzdGF0dXMiLCJlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZSIsImlzTnVtYmVyIiwiZXJyb3JGcm9tVzNDSnNvbkNvZGUiLCJlcnJvcnMiLCJqc29ud3BFcnJvckNvZGVNYXAiLCJFcnJvckNsYXNzIiwidmFsdWVzIiwidzNjRXJyb3JDb2RlTWFwIiwiaXNVbmtub3duRXJyb3IiLCJuYW1lIiwiZmluZCIsImVxdWFsTmFtZXMiLCJpc0Vycm9yVHlwZSIsInR5cGUiLCJkZWJ1ZyIsInRvTG93ZXJDYXNlIiwicmVzdWx0RXJyb3IiLCJpc1Byb3RvY29sRXJyb3IiLCJnZXRSZXNwb25zZUZvclczQ0Vycm9yIiwidzNjRXJyb3JTdHJpbmciLCJodHRwUmVzQm9keSIsImdldFJlc3BvbnNlRm9ySnNvbndwRXJyb3IiLCJOT1RfSU1QTEVNRU5URUQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvcHJvdG9jb2wvZXJyb3JzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFUzZFcnJvciBmcm9tICdlczYtZXJyb3InO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7dXRpbCwgbG9nZ2VyfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHtTdGF0dXNDb2RlcyBhcyBIVFRQU3RhdHVzQ29kZXN9IGZyb20gJ2h0dHAtc3RhdHVzLWNvZGVzJztcblxuY29uc3QgbWpzb253cExvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ01KU09OV1AnKTtcbmNvbnN0IHczY0xvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1czQycpO1xuXG5jb25zdCBXM0NfVU5LTk9XTl9FUlJPUiA9ICd1bmtub3duIGVycm9yJztcblxuLy8gYmFzZSBlcnJvciBjbGFzcyBmb3IgYWxsIG9mIG91ciBlcnJvcnNcbmV4cG9ydCBjbGFzcyBQcm90b2NvbEVycm9yIGV4dGVuZHMgRVM2RXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2csIGpzb253cENvZGUsIHczY1N0YXR1cywgZXJyb3IpIHtcbiAgICBzdXBlcihtc2cpO1xuICAgIHRoaXMuanNvbndwQ29kZSA9IGpzb253cENvZGU7XG4gICAgdGhpcy5lcnJvciA9IGVycm9yIHx8IFczQ19VTktOT1dOX0VSUk9SO1xuICAgIGlmICh0aGlzLmpzb253cENvZGUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuanNvbndwQ29kZSA9IDEzO1xuICAgIH1cbiAgICB0aGlzLnczY1N0YXR1cyA9IHczY1N0YXR1cyB8fCBIVFRQU3RhdHVzQ29kZXMuQkFEX1JFUVVFU1Q7XG4gICAgdGhpcy5fc3RhY2t0cmFjZSA9IG51bGw7XG4gIH1cblxuICBnZXQgc3RhY2t0cmFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhY2t0cmFjZSB8fCB0aGlzLnN0YWNrO1xuICB9XG5cbiAgc2V0IHN0YWNrdHJhY2UodmFsdWUpIHtcbiAgICB0aGlzLl9zdGFja3RyYWNlID0gdmFsdWU7XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL1NlbGVuaXVtSFEvc2VsZW5pdW0vYmxvYi8xNzZiNGE5ZTMwODJhYzE5MjZmMmE0MzZlYjM0Njc2MGMzN2E1OTk4L2phdmEvY2xpZW50L3NyYy9vcmcvb3BlbnFhL3NlbGVuaXVtL3JlbW90ZS9FcnJvckNvZGVzLmphdmEjTDIxNVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL1NlbGVuaXVtSFEvc2VsZW5pdW0vaXNzdWVzLzU1NjIjaXNzdWVjb21tZW50LTM3MDM3OTQ3MFxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmRyaXZlci93ZWJkcml2ZXItc3BlYy5odG1sI2Rmbi1lcnJvci1jb2RlXG5cbmV4cG9ydCBjbGFzcyBOb1N1Y2hEcml2ZXJFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gNjtcbiAgfVxuICAvLyBXM0MgRXJyb3IgaXMgY2FsbGVkIEludmFsaWRTZXNzaW9uSURcbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLk5PVF9GT1VORDtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdpbnZhbGlkIHNlc3Npb24gaWQnO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdBIHNlc3Npb24gaXMgZWl0aGVyIHRlcm1pbmF0ZWQgb3Igbm90IHN0YXJ0ZWQnLFxuICAgICAgTm9TdWNoRHJpdmVyRXJyb3IuY29kZSgpLFxuICAgICAgTm9TdWNoRHJpdmVyRXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBOb1N1Y2hEcml2ZXJFcnJvci5lcnJvcigpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9TdWNoRWxlbWVudEVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiA3O1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5OT1RfRk9VTkQ7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAnbm8gc3VjaCBlbGVtZW50JztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fCAnQW4gZWxlbWVudCBjb3VsZCBub3QgYmUgbG9jYXRlZCBvbiB0aGUgcGFnZSB1c2luZyB0aGUgZ2l2ZW4gJyArICdzZWFyY2ggcGFyYW1ldGVycy4nLFxuICAgICAgTm9TdWNoRWxlbWVudEVycm9yLmNvZGUoKSxcbiAgICAgIE5vU3VjaEVsZW1lbnRFcnJvci53M2NTdGF0dXMoKSxcbiAgICAgIE5vU3VjaEVsZW1lbnRFcnJvci5lcnJvcigpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9TdWNoRnJhbWVFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gODtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdubyBzdWNoIGZyYW1lJztcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuTk9UX0ZPVU5EO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8XG4gICAgICAgICdBIHJlcXVlc3QgdG8gc3dpdGNoIHRvIGEgZnJhbWUgY291bGQgbm90IGJlIHNhdGlzZmllZCBiZWNhdXNlICcgK1xuICAgICAgICAgICd0aGUgZnJhbWUgY291bGQgbm90IGJlIGZvdW5kLicsXG4gICAgICBOb1N1Y2hGcmFtZUVycm9yLmNvZGUoKSxcbiAgICAgIE5vU3VjaEZyYW1lRXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBOb1N1Y2hGcmFtZUVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmtub3duQ29tbWFuZEVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiA5O1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5OT1RfRk9VTkQ7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAndW5rbm93biBjb21tYW5kJztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fFxuICAgICAgICAnVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQsIG9yIGEgcmVxdWVzdCB3YXMgJyArXG4gICAgICAgICAgJ3JlY2VpdmVkIHVzaW5nIGFuIEhUVFAgbWV0aG9kIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbWFwcGVkICcgK1xuICAgICAgICAgICdyZXNvdXJjZS4nLFxuICAgICAgVW5rbm93bkNvbW1hbmRFcnJvci5jb2RlKCksXG4gICAgICBVbmtub3duQ29tbWFuZEVycm9yLnczY1N0YXR1cygpLFxuICAgICAgVW5rbm93bkNvbW1hbmRFcnJvci5lcnJvcigpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDEwO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5OT1RfRk9VTkQ7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAnc3RhbGUgZWxlbWVudCByZWZlcmVuY2UnO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8XG4gICAgICAgICdBbiBlbGVtZW50IGNvbW1hbmQgZmFpbGVkIGJlY2F1c2UgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBpcyBubyAnICtcbiAgICAgICAgICAnbG9uZ2VyIGF0dGFjaGVkIHRvIHRoZSBET00uJyxcbiAgICAgIFN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yLmNvZGUoKSxcbiAgICAgIFN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yLnczY1N0YXR1cygpLFxuICAgICAgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVsZW1lbnROb3RWaXNpYmxlRXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDExO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5CQURfUkVRVUVTVDtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdlbGVtZW50IG5vdCB2aXNpYmxlJztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fFxuICAgICAgICAnQW4gZWxlbWVudCBjb21tYW5kIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgYmVjYXVzZSB0aGUgZWxlbWVudCBpcyAnICtcbiAgICAgICAgICAnbm90IHZpc2libGUgb24gdGhlIHBhZ2UuJyxcbiAgICAgIEVsZW1lbnROb3RWaXNpYmxlRXJyb3IuY29kZSgpLFxuICAgICAgRWxlbWVudE5vdFZpc2libGVFcnJvci53M2NTdGF0dXMoKSxcbiAgICAgIEVsZW1lbnROb3RWaXNpYmxlRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRFbGVtZW50U3RhdGVFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMTI7XG4gIH1cbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLkJBRF9SRVFVRVNUO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ2ludmFsaWQgZWxlbWVudCBzdGF0ZSc7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHxcbiAgICAgICAgJ0FuIGVsZW1lbnQgY29tbWFuZCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGJlY2F1c2UgdGhlIGVsZW1lbnQgaXMgJyArXG4gICAgICAgICAgJ2luIGFuIGludmFsaWQgc3RhdGUgKGUuZy4gYXR0ZW1wdGluZyB0byBjbGljayBhIGRpc2FibGVkIGVsZW1lbnQpLicsXG4gICAgICBJbnZhbGlkRWxlbWVudFN0YXRlRXJyb3IuY29kZSgpLFxuICAgICAgSW52YWxpZEVsZW1lbnRTdGF0ZUVycm9yLnczY1N0YXR1cygpLFxuICAgICAgSW52YWxpZEVsZW1lbnRTdGF0ZUVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmtub3duRXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDEzO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5JTlRFUk5BTF9TRVJWRVJfRVJST1I7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiBXM0NfVU5LTk9XTl9FUlJPUjtcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnJvck9yTWVzc2FnZSkge1xuICAgIGNvbnN0IG9yaWdNZXNzYWdlID0gXy5pc1N0cmluZygoZXJyb3JPck1lc3NhZ2UgfHwge30pLm1lc3NhZ2UpXG4gICAgICA/IGVycm9yT3JNZXNzYWdlLm1lc3NhZ2VcbiAgICAgIDogZXJyb3JPck1lc3NhZ2U7XG4gICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAnQW4gdW5rbm93biBzZXJ2ZXItc2lkZSBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBjb21tYW5kLicgK1xuICAgICAgKG9yaWdNZXNzYWdlID8gYCBPcmlnaW5hbCBlcnJvcjogJHtvcmlnTWVzc2FnZX1gIDogJycpO1xuICAgIHN1cGVyKG1lc3NhZ2UsIFVua25vd25FcnJvci5jb2RlKCksIFVua25vd25FcnJvci53M2NTdGF0dXMoKSwgVW5rbm93bkVycm9yLmVycm9yKCkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmtub3duTWV0aG9kRXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDQwNTtcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuTUVUSE9EX05PVF9BTExPV0VEO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ3Vua25vd24gbWV0aG9kJztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fCAnVGhlIHJlcXVlc3RlZCBjb21tYW5kIG1hdGNoZWQgYSBrbm93biBVUkwgYnV0IGRpZCBub3QgbWF0Y2ggYW4gbWV0aG9kIGZvciB0aGF0IFVSTCcsXG4gICAgICBVbmtub3duTWV0aG9kRXJyb3IuY29kZSgpLFxuICAgICAgVW5rbm93bk1ldGhvZEVycm9yLnczY1N0YXR1cygpLFxuICAgICAgVW5rbm93bk1ldGhvZEVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiA0MDU7XG4gIH1cbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUjtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICd1bnN1cHBvcnRlZCBvcGVyYXRpb24nO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdBIHNlcnZlci1zaWRlIGVycm9yIG9jY3VycmVkLiBDb21tYW5kIGNhbm5vdCBiZSBzdXBwb3J0ZWQuJyxcbiAgICAgIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IuY29kZSgpLFxuICAgICAgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvci53M2NTdGF0dXMoKSxcbiAgICAgIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRJc05vdFNlbGVjdGFibGVFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMTU7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAnZWxlbWVudCBub3Qgc2VsZWN0YWJsZSc7XG4gIH1cbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLkJBRF9SRVFVRVNUO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHNlbGVjdCBhbiBlbGVtZW50IHRoYXQgY2Fubm90IGJlIHNlbGVjdGVkLicsXG4gICAgICBFbGVtZW50SXNOb3RTZWxlY3RhYmxlRXJyb3IuY29kZSgpLFxuICAgICAgRWxlbWVudElzTm90U2VsZWN0YWJsZUVycm9yLnczY1N0YXR1cygpLFxuICAgICAgRWxlbWVudElzTm90U2VsZWN0YWJsZUVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiA2NDtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdlbGVtZW50IGNsaWNrIGludGVyY2VwdGVkJztcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuQkFEX1JFUVVFU1Q7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHxcbiAgICAgICAgJ1RoZSBFbGVtZW50IENsaWNrIGNvbW1hbmQgY291bGQgbm90IGJlIGNvbXBsZXRlZCBiZWNhdXNlIHRoZSBlbGVtZW50IHJlY2VpdmluZyAnICtcbiAgICAgICAgICAndGhlIGV2ZW50cyBpcyBvYnNjdXJpbmcgdGhlIGVsZW1lbnQgdGhhdCB3YXMgcmVxdWVzdGVkIGNsaWNrZWQnLFxuICAgICAgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvci5jb2RlKCksXG4gICAgICBFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yLnczY1N0YXR1cygpLFxuICAgICAgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvci5lcnJvcigpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRWxlbWVudE5vdEludGVyYWN0YWJsZUVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiA2MDtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdlbGVtZW50IG5vdCBpbnRlcmFjdGFibGUnO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5CQURfUkVRVUVTVDtcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fFxuICAgICAgICAnQSBjb21tYW5kIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgYmVjYXVzZSB0aGUgZWxlbWVudCBpcyBub3QgcG9pbnRlci0gb3Iga2V5Ym9hcmQgaW50ZXJhY3RhYmxlJyxcbiAgICAgIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvci5jb2RlKCksXG4gICAgICBFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluc2VjdXJlQ2VydGlmaWNhdGVFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdpbnNlY3VyZSBjZXJ0aWZpY2F0ZSc7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHxcbiAgICAgICAgJ05hdmlnYXRpb24gY2F1c2VkIHRoZSB1c2VyIGFnZW50IHRvIGhpdCBhIGNlcnRpZmljYXRlIHdhcm5pbmcsIHdoaWNoIGlzIHVzdWFsbHkgdGhlIHJlc3VsdCBvZiBhbiBleHBpcmVkIG9yIGludmFsaWQgVExTIGNlcnRpZmljYXRlJyxcbiAgICAgIEVsZW1lbnRJc05vdFNlbGVjdGFibGVFcnJvci5jb2RlKCksXG4gICAgICBudWxsLFxuICAgICAgSW5zZWN1cmVDZXJ0aWZpY2F0ZUVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBKYXZhU2NyaXB0RXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDE3O1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5JTlRFUk5BTF9TRVJWRVJfRVJST1I7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAnamF2YXNjcmlwdCBlcnJvcic7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHwgJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIGV4ZWN1dGluZyB1c2VyIHN1cHBsaWVkIEphdmFTY3JpcHQuJyxcbiAgICAgIEphdmFTY3JpcHRFcnJvci5jb2RlKCksXG4gICAgICBKYXZhU2NyaXB0RXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBKYXZhU2NyaXB0RXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFhQYXRoTG9va3VwRXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDE5O1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5CQURfUkVRVUVTVDtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdpbnZhbGlkIHNlbGVjdG9yJztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fCAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2VhcmNoaW5nIGZvciBhbiBlbGVtZW50IGJ5IFhQYXRoLicsXG4gICAgICBYUGF0aExvb2t1cEVycm9yLmNvZGUoKSxcbiAgICAgIFhQYXRoTG9va3VwRXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBYUGF0aExvb2t1cEVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUaW1lb3V0RXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDIxO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5SRVFVRVNUX1RJTUVPVVQ7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAndGltZW91dCc7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHwgJ0FuIG9wZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlIGJlZm9yZSBpdHMgdGltZW91dCBleHBpcmVkLicsXG4gICAgICBUaW1lb3V0RXJyb3IuY29kZSgpLFxuICAgICAgVGltZW91dEVycm9yLnczY1N0YXR1cygpLFxuICAgICAgVGltZW91dEVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb1N1Y2hXaW5kb3dFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMjM7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAnbm8gc3VjaCB3aW5kb3cnO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5OT1RfRk9VTkQ7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHxcbiAgICAgICAgJ0EgcmVxdWVzdCB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgd2luZG93IGNvdWxkIG5vdCBiZSBzYXRpc2ZpZWQgJyArXG4gICAgICAgICAgJ2JlY2F1c2UgdGhlIHdpbmRvdyBjb3VsZCBub3QgYmUgZm91bmQuJyxcbiAgICAgIE5vU3VjaFdpbmRvd0Vycm9yLmNvZGUoKSxcbiAgICAgIE5vU3VjaFdpbmRvd0Vycm9yLnczY1N0YXR1cygpLFxuICAgICAgTm9TdWNoV2luZG93RXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRBcmd1bWVudEVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiA2MTtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdpbnZhbGlkIGFyZ3VtZW50JztcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuQkFEX1JFUVVFU1Q7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHwgJ1RoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjb21tYW5kIGFyZSBlaXRoZXIgaW52YWxpZCBvciBtYWxmb3JtZWQnLFxuICAgICAgSW52YWxpZEFyZ3VtZW50RXJyb3IuY29kZSgpLFxuICAgICAgSW52YWxpZEFyZ3VtZW50RXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBJbnZhbGlkQXJndW1lbnRFcnJvci5lcnJvcigpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZENvb2tpZURvbWFpbkVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiAyNDtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdpbnZhbGlkIGNvb2tpZSBkb21haW4nO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5CQURfUkVRVUVTVDtcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fFxuICAgICAgICAnQW4gaWxsZWdhbCBhdHRlbXB0IHdhcyBtYWRlIHRvIHNldCBhIGNvb2tpZSB1bmRlciBhIGRpZmZlcmVudCAnICtcbiAgICAgICAgICAnZG9tYWluIHRoYW4gdGhlIGN1cnJlbnQgcGFnZS4nLFxuICAgICAgSW52YWxpZENvb2tpZURvbWFpbkVycm9yLmNvZGUoKSxcbiAgICAgIEludmFsaWRDb29raWVEb21haW5FcnJvci53M2NTdGF0dXMoKSxcbiAgICAgIEludmFsaWRDb29raWVEb21haW5FcnJvci5lcnJvcigpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9TdWNoQ29va2llRXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDYyO1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5OT1RfRk9VTkQ7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAnbm8gc3VjaCBjb29raWUnO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8XG4gICAgICAgICdObyBjb29raWUgbWF0Y2hpbmcgdGhlIGdpdmVuIHBhdGggbmFtZSB3YXMgZm91bmQgYW1vbmdzdCB0aGUgYXNzb2NpYXRlZCBjb29raWVzIG9mIHRoZSBjdXJyZW50IGJyb3dzaW5nIGNvbnRleHTigJlzIGFjdGl2ZSBkb2N1bWVudCcsXG4gICAgICBOb1N1Y2hDb29raWVFcnJvci5jb2RlKCksXG4gICAgICBOb1N1Y2hDb29raWVFcnJvci53M2NTdGF0dXMoKSxcbiAgICAgIE5vU3VjaENvb2tpZUVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmFibGVUb1NldENvb2tpZUVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiAyNTtcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ3VuYWJsZSB0byBzZXQgY29va2llJztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fCBcIkEgcmVxdWVzdCB0byBzZXQgYSBjb29raWUncyB2YWx1ZSBjb3VsZCBub3QgYmUgc2F0aXNmaWVkLlwiLFxuICAgICAgVW5hYmxlVG9TZXRDb29raWVFcnJvci5jb2RlKCksXG4gICAgICBVbmFibGVUb1NldENvb2tpZUVycm9yLnczY1N0YXR1cygpLFxuICAgICAgVW5hYmxlVG9TZXRDb29raWVFcnJvci5lcnJvcigpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiAyNjtcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ3VuZXhwZWN0ZWQgYWxlcnQgb3Blbic7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHwgJ0EgbW9kYWwgZGlhbG9nIHdhcyBvcGVuLCBibG9ja2luZyB0aGlzIG9wZXJhdGlvbicsXG4gICAgICBVbmV4cGVjdGVkQWxlcnRPcGVuRXJyb3IuY29kZSgpLFxuICAgICAgVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yLnczY1N0YXR1cygpLFxuICAgICAgVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0FsZXJ0T3BlbkVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiAyNztcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuTk9UX0ZPVU5EO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ25vIHN1Y2ggYWxlcnQnO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIG9wZXJhdGUgb24gYSBtb2RhbCBkaWFsb2cgd2hlbiBvbmUgJyArICd3YXMgbm90IG9wZW4uJyxcbiAgICAgIE5vQWxlcnRPcGVuRXJyb3IuY29kZSgpLFxuICAgICAgTm9BbGVydE9wZW5FcnJvci53M2NTdGF0dXMoKSxcbiAgICAgIE5vQWxlcnRPcGVuRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vU3VjaEFsZXJ0RXJyb3IgZXh0ZW5kcyBOb0FsZXJ0T3BlbkVycm9yIHt9XG5cbmV4cG9ydCBjbGFzcyBTY3JpcHRUaW1lb3V0RXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDI4O1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5SRVFVRVNUX1RJTUVPVVQ7XG4gIH1cbiAgc3RhdGljIGVycm9yKCkge1xuICAgIHJldHVybiAnc2NyaXB0IHRpbWVvdXQnO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdBIHNjcmlwdCBkaWQgbm90IGNvbXBsZXRlIGJlZm9yZSBpdHMgdGltZW91dCBleHBpcmVkLicsXG4gICAgICBTY3JpcHRUaW1lb3V0RXJyb3IuY29kZSgpLFxuICAgICAgU2NyaXB0VGltZW91dEVycm9yLnczY1N0YXR1cygpLFxuICAgICAgU2NyaXB0VGltZW91dEVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkRWxlbWVudENvb3JkaW5hdGVzRXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDI5O1xuICB9XG4gIHN0YXRpYyB3M2NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIEhUVFBTdGF0dXNDb2Rlcy5CQURfUkVRVUVTVDtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdpbnZhbGlkIGNvb3JkaW5hdGVzJztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fCAnVGhlIGNvb3JkaW5hdGVzIHByb3ZpZGVkIHRvIGFuIGludGVyYWN0aW9ucyBvcGVyYXRpb24gYXJlIGludmFsaWQuJyxcbiAgICAgIEludmFsaWRFbGVtZW50Q29vcmRpbmF0ZXNFcnJvci5jb2RlKCksXG4gICAgICBJbnZhbGlkRWxlbWVudENvb3JkaW5hdGVzRXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBJbnZhbGlkRWxlbWVudENvb3JkaW5hdGVzRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRDb29yZGluYXRlc0Vycm9yIGV4dGVuZHMgSW52YWxpZEVsZW1lbnRDb29yZGluYXRlc0Vycm9yIHt9XG5cbmV4cG9ydCBjbGFzcyBJTUVOb3RBdmFpbGFibGVFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMzA7XG4gIH1cbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUjtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICd1bnN1cHBvcnRlZCBvcGVyYXRpb24nO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdJTUUgd2FzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgIElNRU5vdEF2YWlsYWJsZUVycm9yLmNvZGUoKSxcbiAgICAgIElNRU5vdEF2YWlsYWJsZUVycm9yLnczY1N0YXR1cygpLFxuICAgICAgSU1FTm90QXZhaWxhYmxlRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIElNRUVuZ2luZUFjdGl2YXRpb25GYWlsZWRFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMzE7XG4gIH1cbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUjtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICd1bnN1cHBvcnRlZCBvcGVyYXRpb24nO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdBbiBJTUUgZW5naW5lIGNvdWxkIG5vdCBiZSBzdGFydGVkLicsXG4gICAgICBJTUVFbmdpbmVBY3RpdmF0aW9uRmFpbGVkRXJyb3IuY29kZSgpLFxuICAgICAgSU1FRW5naW5lQWN0aXZhdGlvbkZhaWxlZEVycm9yLnczY1N0YXR1cygpLFxuICAgICAgSU1FRW5naW5lQWN0aXZhdGlvbkZhaWxlZEVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkU2VsZWN0b3JFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMzI7XG4gIH1cbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLkJBRF9SRVFVRVNUO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ2ludmFsaWQgc2VsZWN0b3InO1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdBcmd1bWVudCB3YXMgYW4gaW52YWxpZCBzZWxlY3RvciAoZS5nLiBYUGF0aC9DU1MpLicsXG4gICAgICBJbnZhbGlkU2VsZWN0b3JFcnJvci5jb2RlKCksXG4gICAgICBJbnZhbGlkU2VsZWN0b3JFcnJvci53M2NTdGF0dXMoKSxcbiAgICAgIEludmFsaWRTZWxlY3RvckVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uTm90Q3JlYXRlZEVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiAzMztcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ3Nlc3Npb24gbm90IGNyZWF0ZWQnO1xuICB9XG4gIGNvbnN0cnVjdG9yKGRldGFpbHMpIHtcbiAgICBsZXQgbWVzc2FnZSA9ICdBIG5ldyBzZXNzaW9uIGNvdWxkIG5vdCBiZSBjcmVhdGVkLic7XG4gICAgaWYgKGRldGFpbHMpIHtcbiAgICAgIG1lc3NhZ2UgKz0gYCBEZXRhaWxzOiAke2RldGFpbHN9YDtcbiAgICB9XG5cbiAgICBzdXBlcihcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBTZXNzaW9uTm90Q3JlYXRlZEVycm9yLmNvZGUoKSxcbiAgICAgIFNlc3Npb25Ob3RDcmVhdGVkRXJyb3IudzNjU3RhdHVzKCksXG4gICAgICBTZXNzaW9uTm90Q3JlYXRlZEVycm9yLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb3ZlVGFyZ2V0T3V0T2ZCb3VuZHNFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMzQ7XG4gIH1cbiAgc3RhdGljIHczY1N0YXR1cygpIHtcbiAgICByZXR1cm4gSFRUUFN0YXR1c0NvZGVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUjtcbiAgfVxuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdtb3ZlIHRhcmdldCBvdXQgb2YgYm91bmRzJztcbiAgfVxuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihcbiAgICAgIGVyciB8fCAnVGFyZ2V0IHByb3ZpZGVkIGZvciBhIG1vdmUgYWN0aW9uIGlzIG91dCBvZiBib3VuZHMuJyxcbiAgICAgIE1vdmVUYXJnZXRPdXRPZkJvdW5kc0Vycm9yLmNvZGUoKSxcbiAgICAgIE1vdmVUYXJnZXRPdXRPZkJvdW5kc0Vycm9yLnczY1N0YXR1cygpLFxuICAgICAgTW92ZVRhcmdldE91dE9mQm91bmRzRXJyb3IuZXJyb3IoKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vU3VjaENvbnRleHRFcnJvciBleHRlbmRzIFByb3RvY29sRXJyb3Ige1xuICBzdGF0aWMgY29kZSgpIHtcbiAgICByZXR1cm4gMzU7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoZXJyIHx8ICdObyBzdWNoIGNvbnRleHQgZm91bmQuJywgTm9TdWNoQ29udGV4dEVycm9yLmNvZGUoKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRDb250ZXh0RXJyb3IgZXh0ZW5kcyBQcm90b2NvbEVycm9yIHtcbiAgc3RhdGljIGNvZGUoKSB7XG4gICAgcmV0dXJuIDM2O1xuICB9XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKFxuICAgICAgZXJyIHx8ICdUaGF0IGNvbW1hbmQgY291bGQgbm90IGJlIGV4ZWN1dGVkIGluIHRoZSBjdXJyZW50IGNvbnRleHQuJyxcbiAgICAgIEludmFsaWRDb250ZXh0RXJyb3IuY29kZSgpXG4gICAgKTtcbiAgfVxufVxuXG4vLyBUaGVzZSBhcmUgYWxpYXNlcyBmb3IgVW5rbm93bk1ldGhvZEVycm9yXG5leHBvcnQgY2xhc3MgTm90WWV0SW1wbGVtZW50ZWRFcnJvciBleHRlbmRzIFVua25vd25NZXRob2RFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGVycikge1xuICAgIHN1cGVyKGVyciB8fCAnTWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIE5vdEltcGxlbWVudGVkRXJyb3IgZXh0ZW5kcyBVbmtub3duTWV0aG9kRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihlcnIpIHtcbiAgICBzdXBlcihlcnIgfHwgJ01ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5hYmxlVG9DYXB0dXJlU2NyZWVuIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG4gIHN0YXRpYyBjb2RlKCkge1xuICAgIHJldHVybiA2MztcbiAgfVxuICBzdGF0aWMgdzNjU3RhdHVzKCkge1xuICAgIHJldHVybiBIVFRQU3RhdHVzQ29kZXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SO1xuICB9XG4gIHN0YXRpYyBlcnJvcigpIHtcbiAgICByZXR1cm4gJ3VuYWJsZSB0byBjYXB0dXJlIHNjcmVlbic7XG4gIH1cbiAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgc3VwZXIoXG4gICAgICBlcnIgfHwgJ0Egc2NyZWVuIGNhcHR1cmUgd2FzIG1hZGUgaW1wb3NzaWJsZScsXG4gICAgICBVbmFibGVUb0NhcHR1cmVTY3JlZW4uY29kZSgpLFxuICAgICAgVW5hYmxlVG9DYXB0dXJlU2NyZWVuLnczY1N0YXR1cygpLFxuICAgICAgVW5hYmxlVG9DYXB0dXJlU2NyZWVuLmVycm9yKClcbiAgICApO1xuICB9XG59XG5cbi8vIEVxdWl2YWxlbnQgdG8gVzNDIEludmFsaWRBcmd1bWVudEVycm9yXG5leHBvcnQgY2xhc3MgQmFkUGFyYW1ldGVyc0Vycm9yIGV4dGVuZHMgRVM2RXJyb3Ige1xuICBzdGF0aWMgZXJyb3IoKSB7XG4gICAgcmV0dXJuICdpbnZhbGlkIGFyZ3VtZW50JztcbiAgfVxuICBjb25zdHJ1Y3RvcihyZXF1aXJlZFBhcmFtcywgYWN0dWFsUGFyYW1zLCBlcnJNZXNzYWdlKSB7XG4gICAgbGV0IG1lc3NhZ2U7XG4gICAgaWYgKCFlcnJNZXNzYWdlKSB7XG4gICAgICBtZXNzYWdlID1cbiAgICAgICAgYFBhcmFtZXRlcnMgd2VyZSBpbmNvcnJlY3QuIFdlIHdhbnRlZCBgICtcbiAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkocmVxdWlyZWRQYXJhbXMpfSBhbmQgeW91IGAgK1xuICAgICAgICBgc2VudCAke0pTT04uc3RyaW5naWZ5KGFjdHVhbFBhcmFtcyl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVzc2FnZSA9IGBQYXJhbWV0ZXJzIHdlcmUgaW5jb3JyZWN0LiBZb3Ugc2VudCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICBhY3R1YWxQYXJhbXNcbiAgICAgICl9LCAke2Vyck1lc3NhZ2V9YDtcbiAgICB9XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy53M2NTdGF0dXMgPSBIVFRQU3RhdHVzQ29kZXMuQkFEX1JFUVVFU1Q7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm94eVJlcXVlc3RFcnJvciBpcyBhIGN1c3RvbSBlcnJvciBhbmQgd2lsbCBiZSB0aHJvd24gdXAgb24gdW5zdWNjZXNzZnVsIHByb3h5IHJlcXVlc3QgYW5kXG4gKiB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3h5IGZhaWx1cmUuXG4gKiBJbiBjYXNlIG9mIFByb3h5UmVxdWVzdEVycm9yIHNob3VsZCBmZXRjaCB0aGUgYWN0dWFsIGVycm9yIGJ5IGNhbGxpbmcgYGdldEFjdHVhbEVycm9yKClgXG4gKiBmb3IgcHJveHkgZmFpbHVyZSB0byBnZW5lcmF0ZSB0aGUgY2xpZW50IHJlc3BvbnNlLlxuICovXG5leHBvcnQgY2xhc3MgUHJveHlSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFUzZFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGVyciwgcmVzcG9uc2VFcnJvciwgaHR0cFN0YXR1cykge1xuICAgIGxldCByZXNwb25zZUVycm9yT2JqID0gdXRpbC5zYWZlSnNvblBhcnNlKHJlc3BvbnNlRXJyb3IpO1xuICAgIGlmICghXy5pc1BsYWluT2JqZWN0KHJlc3BvbnNlRXJyb3JPYmopKSB7XG4gICAgICByZXNwb25zZUVycm9yT2JqID0ge307XG4gICAgfVxuICAgIGxldCBvcmlnTWVzc2FnZSA9IF8uaXNTdHJpbmcocmVzcG9uc2VFcnJvcikgPyByZXNwb25zZUVycm9yIDogJyc7XG4gICAgaWYgKCFfLmlzRW1wdHkocmVzcG9uc2VFcnJvck9iaikpIHtcbiAgICAgIGlmIChfLmlzU3RyaW5nKHJlc3BvbnNlRXJyb3JPYmoudmFsdWUpKSB7XG4gICAgICAgIG9yaWdNZXNzYWdlID0gcmVzcG9uc2VFcnJvck9iai52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIF8uaXNQbGFpbk9iamVjdChyZXNwb25zZUVycm9yT2JqLnZhbHVlKSAmJlxuICAgICAgICBfLmlzU3RyaW5nKHJlc3BvbnNlRXJyb3JPYmoudmFsdWUubWVzc2FnZSlcbiAgICAgICkge1xuICAgICAgICBvcmlnTWVzc2FnZSA9IHJlc3BvbnNlRXJyb3JPYmoudmFsdWUubWVzc2FnZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIoXy5pc0VtcHR5KGVycikgPyBgUHJveHkgcmVxdWVzdCB1bnN1Y2Nlc3NmdWwuICR7b3JpZ01lc3NhZ2V9YCA6IGVycik7XG5cbiAgICB0aGlzLnczY1N0YXR1cyA9IEhUVFBTdGF0dXNDb2Rlcy5CQURfUkVRVUVTVDtcblxuICAgIC8vIElmIHRoZSByZXNwb25zZSBlcnJvciBpcyBhbiBvYmplY3QgYW5kIHZhbHVlIGlzIGFuIG9iamVjdCwgaXQncyBhIFczQyBlcnJvciAoZm9yIEpTT05XUCB2YWx1ZSBpcyBhIHN0cmluZylcbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KHJlc3BvbnNlRXJyb3JPYmoudmFsdWUpICYmIF8uaGFzKHJlc3BvbnNlRXJyb3JPYmoudmFsdWUsICdlcnJvcicpKSB7XG4gICAgICB0aGlzLnczYyA9IHJlc3BvbnNlRXJyb3JPYmoudmFsdWU7XG4gICAgICB0aGlzLnczY1N0YXR1cyA9IGh0dHBTdGF0dXMgfHwgSFRUUFN0YXR1c0NvZGVzLkJBRF9SRVFVRVNUO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmpzb253cCA9IHJlc3BvbnNlRXJyb3JPYmo7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWN0dWFsRXJyb3IoKSB7XG4gICAgLy8gSWYgaXQncyBNSlNPTldQIGVycm9yLCByZXR1cm5zIGFjdHVhbCBlcnJvciBjYXVzZSBmb3IgcmVxdWVzdCBmYWlsdXJlIGJhc2VkIG9uIGBqc29ud3Auc3RhdHVzYFxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMuanNvbndwPy5zdGF0dXMpICYmIHV0aWwuaGFzVmFsdWUodGhpcy5qc29ud3A/LnZhbHVlKSkge1xuICAgICAgcmV0dXJuIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKHRoaXMuanNvbndwLnN0YXR1cywgdGhpcy5qc29ud3AudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLnczYykgJiYgXy5pc051bWJlcih0aGlzLnczY1N0YXR1cykgJiYgdGhpcy53M2NTdGF0dXMgPj0gMzAwKSB7XG4gICAgICByZXR1cm4gZXJyb3JGcm9tVzNDSnNvbkNvZGUoXG4gICAgICAgIHRoaXMudzNjLmVycm9yLFxuICAgICAgICB0aGlzLnczYy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgICAgdGhpcy53M2Muc3RhY2t0cmFjZVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBVbmtub3duRXJyb3IodGhpcy5tZXNzYWdlKTtcbiAgfVxufVxuLy8gbWFwIG9mIGVycm9yIGNsYXNzIG5hbWUgdG8gZXJyb3IgY2xhc3NcbmNvbnN0IGVycm9ycyA9IHtcbiAgTm90WWV0SW1wbGVtZW50ZWRFcnJvcixcbiAgTm90SW1wbGVtZW50ZWRFcnJvcixcbiAgQmFkUGFyYW1ldGVyc0Vycm9yLFxuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgTm9TdWNoRHJpdmVyRXJyb3IsXG4gIE5vU3VjaEVsZW1lbnRFcnJvcixcbiAgVW5rbm93bkNvbW1hbmRFcnJvcixcbiAgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IsXG4gIEVsZW1lbnROb3RWaXNpYmxlRXJyb3IsXG4gIEludmFsaWRFbGVtZW50U3RhdGVFcnJvcixcbiAgVW5rbm93bkVycm9yLFxuICBFbGVtZW50SXNOb3RTZWxlY3RhYmxlRXJyb3IsXG4gIEVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3IsXG4gIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvcixcbiAgSW5zZWN1cmVDZXJ0aWZpY2F0ZUVycm9yLFxuICBKYXZhU2NyaXB0RXJyb3IsXG4gIFhQYXRoTG9va3VwRXJyb3IsXG4gIFRpbWVvdXRFcnJvcixcbiAgTm9TdWNoV2luZG93RXJyb3IsXG4gIE5vU3VjaENvb2tpZUVycm9yLFxuICBJbnZhbGlkQ29va2llRG9tYWluRXJyb3IsXG4gIEludmFsaWRDb29yZGluYXRlc0Vycm9yLFxuICBVbmFibGVUb1NldENvb2tpZUVycm9yLFxuICBVbmV4cGVjdGVkQWxlcnRPcGVuRXJyb3IsXG4gIE5vQWxlcnRPcGVuRXJyb3IsXG4gIFNjcmlwdFRpbWVvdXRFcnJvcixcbiAgSW52YWxpZEVsZW1lbnRDb29yZGluYXRlc0Vycm9yLFxuICBJTUVOb3RBdmFpbGFibGVFcnJvcixcbiAgSU1FRW5naW5lQWN0aXZhdGlvbkZhaWxlZEVycm9yLFxuICBJbnZhbGlkU2VsZWN0b3JFcnJvcixcbiAgU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcixcbiAgTW92ZVRhcmdldE91dE9mQm91bmRzRXJyb3IsXG4gIE5vU3VjaEFsZXJ0RXJyb3IsXG4gIE5vU3VjaENvbnRleHRFcnJvcixcbiAgSW52YWxpZENvbnRleHRFcnJvcixcbiAgTm9TdWNoRnJhbWVFcnJvcixcbiAgVW5hYmxlVG9DYXB0dXJlU2NyZWVuLFxuICBVbmtub3duTWV0aG9kRXJyb3IsXG4gIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IsXG4gIFByb3h5UmVxdWVzdEVycm9yLFxufTtcblxuLy8gbWFwIG9mIGVycm9yIGNvZGUgdG8gZXJyb3IgY2xhc3NcbmNvbnN0IGpzb253cEVycm9yQ29kZU1hcCA9IHt9O1xuZm9yIChsZXQgRXJyb3JDbGFzcyBvZiBfLnZhbHVlcyhlcnJvcnMpKSB7XG4gIGlmICgnY29kZScgaW4gRXJyb3JDbGFzcykge1xuICAgIGpzb253cEVycm9yQ29kZU1hcFtFcnJvckNsYXNzLmNvZGUoKV0gPSBFcnJvckNsYXNzO1xuICB9XG59XG5cbmNvbnN0IHczY0Vycm9yQ29kZU1hcCA9IHt9O1xuZm9yIChsZXQgRXJyb3JDbGFzcyBvZiBfLnZhbHVlcyhlcnJvcnMpKSB7XG4gIGlmICgnZXJyb3InIGluIEVycm9yQ2xhc3MpIHtcbiAgICB3M2NFcnJvckNvZGVNYXBbRXJyb3JDbGFzcy5lcnJvcigpXSA9IEVycm9yQ2xhc3M7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNVbmtub3duRXJyb3IoZXJyKSB7XG4gIHJldHVybiAoXG4gICAgIWVyci5jb25zdHJ1Y3Rvci5uYW1lIHx8XG4gICAgIV8udmFsdWVzKGVycm9ycykuZmluZChmdW5jdGlvbiBlcXVhbE5hbWVzKGVycm9yKSB7XG4gICAgICByZXR1cm4gZXJyb3IubmFtZSA9PT0gZXJyLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgfSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNFcnJvclR5cGUoZXJyLCB0eXBlKSB7XG4gIC8vIGBuYW1lYCBwcm9wZXJ0eSBpcyB0aGUgY29uc3RydWN0b3IgbmFtZVxuICBpZiAodHlwZS5uYW1lID09PSBQcm90b2NvbEVycm9yLm5hbWUpIHtcbiAgICAvLyBganNvbndwQ29kZWAgaXMgYDBgIG9uIHN1Y2Nlc3NcbiAgICByZXR1cm4gISFlcnIuanNvbndwQ29kZTtcbiAgfSBlbHNlIGlmICh0eXBlLm5hbWUgPT09IFByb3h5UmVxdWVzdEVycm9yLm5hbWUpIHtcbiAgICAvLyBgc3RhdHVzYCBpcyBgMGAgb24gc3VjY2Vzc1xuICAgIGlmIChlcnIuanNvbndwKSB7XG4gICAgICByZXR1cm4gISFlcnIuanNvbndwLnN0YXR1cztcbiAgICB9XG5cbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGVyci53M2MpKSB7XG4gICAgICByZXR1cm4gXy5pc051bWJlcihlcnIudzNjU3RhdHVzKSAmJiBlcnIudzNjU3RhdHVzID49IDMwMDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGVyci5jb25zdHJ1Y3Rvci5uYW1lID09PSB0eXBlLm5hbWU7XG59XG5cbi8qKlxuICogUmV0cmlldmUgYW4gZXJyb3IgZGVyaXZlZCBmcm9tIE1KU09OV1Agc3RhdHVzXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZSBKU09OV1Agc3RhdHVzIGNvZGVcbiAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gdmFsdWUgVGhlIGVycm9yIG1lc3NhZ2UsIG9yIGFuIG9iamVjdCB3aXRoIGEgYG1lc3NhZ2VgIHByb3BlcnR5XG4gKiBAcmV0dXJuIHtQcm90b2NvbEVycm9yfSBUaGUgZXJyb3IgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggcHJvdmlkZWQgSlNPTldQIHN0YXR1cyBjb2RlXG4gKi9cbmZ1bmN0aW9uIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKGNvZGUsIHZhbHVlID0gJycpIHtcbiAgLy8gaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIHB1bGwgbWVzc2FnZSBmcm9tIGl0LCBvdGhlcndpc2UgdXNlIHRoZSBwbGFpblxuICAvLyB2YWx1ZSwgb3IgZGVmYXVsdCB0byBhbiBlbXB0eSBzdHJpbmcsIGlmIG51bGxcbiAgY29uc3QgbWVzc2FnZSA9ICh2YWx1ZSB8fCB7fSkubWVzc2FnZSB8fCB2YWx1ZSB8fCAnJztcbiAgaWYgKGNvZGUgIT09IFVua25vd25FcnJvci5jb2RlKCkgJiYganNvbndwRXJyb3JDb2RlTWFwW2NvZGVdKSB7XG4gICAgbWpzb253cExvZy5kZWJ1ZyhgTWF0Y2hlZCBKU09OV1AgZXJyb3IgY29kZSAke2NvZGV9IHRvICR7anNvbndwRXJyb3JDb2RlTWFwW2NvZGVdLm5hbWV9YCk7XG4gICAgcmV0dXJuIG5ldyBqc29ud3BFcnJvckNvZGVNYXBbY29kZV0obWVzc2FnZSk7XG4gIH1cbiAgbWpzb253cExvZy5kZWJ1ZyhgTWF0Y2hlZCBKU09OV1AgZXJyb3IgY29kZSAke2NvZGV9IHRvIFVua25vd25FcnJvcmApO1xuICByZXR1cm4gbmV3IFVua25vd25FcnJvcihtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSBhbiBlcnJvciBkZXJpdmVkIGZyb20gVzNDIEpTT04gQ29kZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgVzNDIGVycm9yIHN0cmluZyAoc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2hhbmRsaW5nLWVycm9ycyBgSlNPTiBFcnJvciBDb2RlYCBjb2x1bW4pXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZVxuICogQHBhcmFtIHs/c3RyaW5nfSBzdGFja3RyYWNlIGFuIG9wdGlvbmFsIGVycm9yIHN0YWNrdHJhY2VcbiAqIEByZXR1cm4ge1Byb3RvY29sRXJyb3J9ICBUaGUgZXJyb3IgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIFczQyBlcnJvciBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZXJyb3JGcm9tVzNDSnNvbkNvZGUoY29kZSwgbWVzc2FnZSwgc3RhY2t0cmFjZSA9IG51bGwpIHtcbiAgaWYgKGNvZGUgJiYgdzNjRXJyb3JDb2RlTWFwW2NvZGUudG9Mb3dlckNhc2UoKV0pIHtcbiAgICB3M2NMb2cuZGVidWcoYE1hdGNoZWQgVzNDIGVycm9yIGNvZGUgJyR7Y29kZX0nIHRvICR7dzNjRXJyb3JDb2RlTWFwW2NvZGUudG9Mb3dlckNhc2UoKV0ubmFtZX1gKTtcbiAgICBjb25zdCByZXN1bHRFcnJvciA9IG5ldyB3M2NFcnJvckNvZGVNYXBbY29kZS50b0xvd2VyQ2FzZSgpXShtZXNzYWdlKTtcbiAgICByZXN1bHRFcnJvci5zdGFja3RyYWNlID0gc3RhY2t0cmFjZTtcbiAgICByZXR1cm4gcmVzdWx0RXJyb3I7XG4gIH1cbiAgdzNjTG9nLmRlYnVnKGBNYXRjaGVkIFczQyBlcnJvciBjb2RlICcke2NvZGV9JyB0byBVbmtub3duRXJyb3JgKTtcbiAgY29uc3QgcmVzdWx0RXJyb3IgPSBuZXcgVW5rbm93bkVycm9yKG1lc3NhZ2UpO1xuICByZXN1bHRFcnJvci5zdGFja3RyYWNlID0gc3RhY2t0cmFjZTtcbiAgcmV0dXJuIHJlc3VsdEVycm9yO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2FueX0gZXJyXG4gKiBAcmV0dXJucyB7ZXJyIGlzIFByb3RvY29sRXJyb3J9XG4gKi9cbmZ1bmN0aW9uIGlzUHJvdG9jb2xFcnJvcihlcnIpIHtcbiAgcmV0dXJuICd3M2NTdGF0dXMnIGluIGVycjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIEFwcGl1bSBlcnJvciB0byBwcm9wZXIgVzNDIEhUVFAgcmVzcG9uc2VcbiAqIEBwYXJhbSB7UHJvdG9jb2xFcnJvcnxNSlNPTldQRXJyb3J9IGVyciBUaGUgZXJyb3IgdGhhdCBuZWVkcyB0byBiZSB0cmFuc2xhdGVkXG4gKi9cbmZ1bmN0aW9uIGdldFJlc3BvbnNlRm9yVzNDRXJyb3IoZXJyKSB7XG4gIGxldCBodHRwU3RhdHVzO1xuXG4gIC8vIFczQyBkZWZpbmVkIGVycm9yIG1lc3NhZ2UgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2Rmbi1lcnJvci1jb2RlKVxuICBsZXQgdzNjRXJyb3JTdHJpbmc7XG5cbiAgaWYgKCFpc1Byb3RvY29sRXJyb3IoZXJyKSkge1xuICAgIGVyciA9IHV0aWwuaGFzVmFsdWUoZXJyLnN0YXR1cylcbiAgICAgID8gLy8gSWYgaXQncyBhIEpTT05XUCBlcnJvciwgZmluZCBjb3JyZXNwb25kaW5nIGVycm9yXG4gICAgICAgIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKGVyci5zdGF0dXMsIGVyci52YWx1ZSlcbiAgICAgIDogbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICB9XG5cbiAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcikpIHtcbiAgICAvLyByZXNwb25kIHdpdGggYSA0MDAgaWYgd2UgaGF2ZSBiYWQgcGFyYW1ldGVyc1xuICAgIHczY0xvZy5kZWJ1ZyhgQmFkIHBhcmFtZXRlcnM6ICR7ZXJyfWApO1xuICAgIHczY0Vycm9yU3RyaW5nID0gQmFkUGFyYW1ldGVyc0Vycm9yLmVycm9yKCk7XG4gIH0gZWxzZSB7XG4gICAgdzNjRXJyb3JTdHJpbmcgPSBlcnIuZXJyb3I7XG4gIH1cblxuICBodHRwU3RhdHVzID0gZXJyLnczY1N0YXR1cztcblxuICBpZiAoIXczY0Vycm9yU3RyaW5nKSB7XG4gICAgdzNjRXJyb3JTdHJpbmcgPSBVbmtub3duRXJyb3IuZXJyb3IoKTtcbiAgfVxuXG4gIGxldCBodHRwUmVzQm9keSA9IHtcbiAgICB2YWx1ZToge1xuICAgICAgZXJyb3I6IHczY0Vycm9yU3RyaW5nLFxuICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICBzdGFja3RyYWNlOiBlcnIuc3RhY2t0cmFjZSB8fCBlcnIuc3RhY2ssXG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIFtodHRwU3RhdHVzLCBodHRwUmVzQm9keV07XG59XG5cbi8qKlxuICogQ29udmVydCBhbiBBcHBpdW0gZXJyb3IgdG8gYSBwcm9wZXIgSlNPTldQIHJlc3BvbnNlXG4gKiBAcGFyYW0ge1Byb3RvY29sRXJyb3J9IGVyciBUaGUgZXJyb3IgdG8gYmUgY29udmVydGVkXG4gKi9cbmZ1bmN0aW9uIGdldFJlc3BvbnNlRm9ySnNvbndwRXJyb3IoZXJyKSB7XG4gIGlmIChpc1Vua25vd25FcnJvcihlcnIpKSB7XG4gICAgZXJyID0gbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoZXJyKTtcbiAgfVxuICAvLyBNSlNPTldQIGVycm9ycyBhcmUgdXN1YWxseSA1MDAgc3RhdHVzIGNvZGUgc28gc2V0IGl0IHRvIHRoYXQgYnkgZGVmYXVsdFxuICBsZXQgaHR0cFN0YXR1cyA9IEhUVFBTdGF0dXNDb2Rlcy5JTlRFUk5BTF9TRVJWRVJfRVJST1I7XG5cbiAgLyoqIEB0eXBlIHtIdHRwUmVzdWx0Qm9keX0gKi9cbiAgbGV0IGh0dHBSZXNCb2R5ID0ge1xuICAgIHN0YXR1czogZXJyLmpzb253cENvZGUsXG4gICAgdmFsdWU6IHtcbiAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgIH0sXG4gIH07XG5cbiAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcikpIHtcbiAgICAvLyByZXNwb25kIHdpdGggYSA0MDAgaWYgd2UgaGF2ZSBiYWQgcGFyYW1ldGVyc1xuICAgIG1qc29ud3BMb2cuZGVidWcoYEJhZCBwYXJhbWV0ZXJzOiAke2Vycn1gKTtcbiAgICBodHRwU3RhdHVzID0gSFRUUFN0YXR1c0NvZGVzLkJBRF9SRVFVRVNUO1xuICAgIGh0dHBSZXNCb2R5ID0gZXJyLm1lc3NhZ2U7XG4gIH0gZWxzZSBpZiAoXG4gICAgaXNFcnJvclR5cGUoZXJyLCBlcnJvcnMuTm90WWV0SW1wbGVtZW50ZWRFcnJvcikgfHxcbiAgICBpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKVxuICApIHtcbiAgICAvLyByZXNwb25kIHdpdGggYSA1MDEgaWYgdGhlIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWRcbiAgICBodHRwU3RhdHVzID0gSFRUUFN0YXR1c0NvZGVzLk5PVF9JTVBMRU1FTlRFRDtcbiAgfSBlbHNlIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Ob1N1Y2hEcml2ZXJFcnJvcikpIHtcbiAgICAvLyByZXNwb25kIHdpdGggYSA0MDQgaWYgdGhlcmUgaXMgbm8gZHJpdmVyIGZvciB0aGUgc2Vzc2lvblxuICAgIGh0dHBTdGF0dXMgPSBIVFRQU3RhdHVzQ29kZXMuTk9UX0ZPVU5EO1xuICB9XG5cbiAgcmV0dXJuIFtodHRwU3RhdHVzLCBodHRwUmVzQm9keV07XG59XG5cbmV4cG9ydCB7XG4gIGVycm9ycyxcbiAgaXNFcnJvclR5cGUsXG4gIGlzVW5rbm93bkVycm9yLFxuICBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZSxcbiAgZXJyb3JGcm9tVzNDSnNvbkNvZGUsXG4gIGdldFJlc3BvbnNlRm9yVzNDRXJyb3IsXG4gIGdldFJlc3BvbnNlRm9ySnNvbndwRXJyb3IsXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgc3RyaW5nIHwge3ZhbHVlOiBIdHRwUmVzdWx0Qm9keVZhbHVlLCBzdGF0dXM/OiBudW1iZXIgfSB9IEh0dHBSZXN1bHRCb2R5XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdHRwUmVzdWx0Qm9keVZhbHVlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21lc3NhZ2VdXG4gKiBAcHJvcGVydHkge3N0cmluZ3xFcnJvcn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzdGFja3RyYWNlXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTUpTT05XUEVycm9yXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3RhdHVzXG4gKiBAcHJvcGVydHkge3N0cmluZ3xvYmplY3R9IHZhbHVlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVzc2FnZVxuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLFVBQVUsR0FBR0MsZUFBQSxDQUFPQyxTQUFQLENBQWlCLFNBQWpCLENBQW5COztBQUNBLE1BQU1DLE1BQU0sR0FBR0YsZUFBQSxDQUFPQyxTQUFQLENBQWlCLEtBQWpCLENBQWY7O0FBRUEsTUFBTUUsaUJBQWlCLEdBQUcsZUFBMUI7O0FBR08sTUFBTUMsYUFBTixTQUE0QkMsaUJBQTVCLENBQXFDO0VBQzFDQyxXQUFXLENBQUNDLEdBQUQsRUFBTUMsVUFBTixFQUFrQkMsU0FBbEIsRUFBNkJDLEtBQTdCLEVBQW9DO0lBQzdDLE1BQU1ILEdBQU47SUFDQSxLQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtJQUNBLEtBQUtFLEtBQUwsR0FBYUEsS0FBSyxJQUFJUCxpQkFBdEI7O0lBQ0EsSUFBSSxLQUFLSyxVQUFMLEtBQW9CLElBQXhCLEVBQThCO01BQzVCLEtBQUtBLFVBQUwsR0FBa0IsRUFBbEI7SUFDRDs7SUFDRCxLQUFLQyxTQUFMLEdBQWlCQSxTQUFTLElBQUlFLDRCQUFBLENBQWdCQyxX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
|
|
925
|
+
if (isUnknownError(err)) {
|
|
926
|
+
err = new errors.UnknownError(err);
|
|
927
|
+
}
|
|
928
|
+
// MJSONWP errors are usually 500 status code so set it to that by default
|
|
929
|
+
let httpStatus = http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR;
|
|
930
|
+
/** @type {HttpResultBody} */
|
|
931
|
+
let httpResBody = {
|
|
932
|
+
status: err.jsonwpCode,
|
|
933
|
+
value: {
|
|
934
|
+
message: err.message,
|
|
935
|
+
},
|
|
936
|
+
};
|
|
937
|
+
if (isErrorType(err, errors.BadParametersError)) {
|
|
938
|
+
// respond with a 400 if we have bad parameters
|
|
939
|
+
mjsonwpLog.debug(`Bad parameters: ${err}`);
|
|
940
|
+
httpStatus = http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
941
|
+
httpResBody = err.message;
|
|
942
|
+
}
|
|
943
|
+
else if (isErrorType(err, errors.NotYetImplementedError) ||
|
|
944
|
+
isErrorType(err, errors.NotImplementedError)) {
|
|
945
|
+
// respond with a 501 if the method is not implemented
|
|
946
|
+
httpStatus = http_status_codes_1.StatusCodes.NOT_IMPLEMENTED;
|
|
947
|
+
}
|
|
948
|
+
else if (isErrorType(err, errors.NoSuchDriverError)) {
|
|
949
|
+
// respond with a 404 if there is no driver for the session
|
|
950
|
+
httpStatus = http_status_codes_1.StatusCodes.NOT_FOUND;
|
|
951
|
+
}
|
|
952
|
+
return [httpStatus, httpResBody];
|
|
953
|
+
}
|
|
954
|
+
exports.getResponseForJsonwpError = getResponseForJsonwpError;
|
|
955
|
+
/**
|
|
956
|
+
* @typedef { string | {value: HttpResultBodyValue, status?: number } } HttpResultBody
|
|
957
|
+
*/
|
|
958
|
+
/**
|
|
959
|
+
* @typedef HttpResultBodyValue
|
|
960
|
+
* @property {string} [message]
|
|
961
|
+
* @property {string|Error} [error]
|
|
962
|
+
* @property {string} [stacktrace]
|
|
963
|
+
*/
|
|
964
|
+
/**
|
|
965
|
+
* @typedef MJSONWPError
|
|
966
|
+
* @property {number} status
|
|
967
|
+
* @property {string|object} value
|
|
968
|
+
* @property {string} message
|
|
969
|
+
*/
|
|
970
|
+
//# sourceMappingURL=errors.js.map
|