@appium/base-driver 8.5.3 → 8.5.4
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.map +1 -1
- package/build/lib/basedriver/capabilities.js +1 -1
- package/build/lib/basedriver/commands/event.js +1 -1
- package/build/lib/basedriver/commands/find.d.ts.map +1 -1
- package/build/lib/basedriver/commands/find.js +1 -1
- package/build/lib/basedriver/commands/index.js +1 -1
- package/build/lib/basedriver/commands/log.d.ts.map +1 -1
- package/build/lib/basedriver/commands/log.js +1 -1
- package/build/lib/basedriver/commands/session.js +1 -1
- package/build/lib/basedriver/commands/settings.d.ts.map +1 -1
- package/build/lib/basedriver/commands/settings.js +1 -1
- package/build/lib/basedriver/commands/timeout.d.ts.map +1 -1
- package/build/lib/basedriver/commands/timeout.js +1 -1
- package/build/lib/basedriver/core.d.ts +120 -139
- package/build/lib/basedriver/core.d.ts.map +1 -1
- package/build/lib/basedriver/core.js +1 -49
- package/build/lib/basedriver/desired-caps.d.ts +5 -2
- package/build/lib/basedriver/desired-caps.d.ts.map +1 -1
- package/build/lib/basedriver/desired-caps.js +14 -18
- package/build/lib/basedriver/device-settings.d.ts +9 -9
- package/build/lib/basedriver/device-settings.d.ts.map +1 -1
- package/build/lib/basedriver/device-settings.js +4 -4
- package/build/lib/basedriver/driver.d.ts +43 -38
- package/build/lib/basedriver/driver.d.ts.map +1 -1
- package/build/lib/basedriver/driver.js +58 -11
- package/build/lib/basedriver/helpers.d.ts +8 -3
- package/build/lib/basedriver/helpers.d.ts.map +1 -1
- package/build/lib/basedriver/helpers.js +4 -6
- 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 +1 -1
- package/build/lib/constants.js +1 -1
- package/build/lib/express/crash.d.ts.map +1 -1
- package/build/lib/express/crash.js +1 -1
- package/build/lib/express/express-logging.d.ts.map +1 -1
- package/build/lib/express/express-logging.js +1 -1
- package/build/lib/express/idempotency.js +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 +1 -1
- package/build/lib/express/middleware.d.ts.map +1 -1
- package/build/lib/express/middleware.js +1 -1
- package/build/lib/express/server.d.ts +21 -0
- package/build/lib/express/server.d.ts.map +1 -1
- package/build/lib/express/server.js +4 -9
- package/build/lib/express/static.d.ts.map +1 -1
- package/build/lib/express/static.js +2 -2
- package/build/lib/express/websocket.d.ts +14 -11
- package/build/lib/express/websocket.d.ts.map +1 -1
- package/build/lib/express/websocket.js +2 -2
- package/build/lib/helpers/capabilities.d.ts.map +1 -1
- package/build/lib/helpers/capabilities.js +1 -1
- package/build/lib/index.d.ts +2 -1
- package/build/lib/index.js +7 -1
- package/build/lib/jsonwp-proxy/protocol-converter.d.ts.map +1 -1
- package/build/lib/jsonwp-proxy/protocol-converter.js +2 -2
- package/build/lib/jsonwp-proxy/proxy.d.ts +30 -5
- package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -1
- package/build/lib/jsonwp-proxy/proxy.js +20 -4
- package/build/lib/jsonwp-status/status.d.ts.map +1 -1
- package/build/lib/jsonwp-status/status.js +2 -2
- package/build/lib/protocol/errors.d.ts +17 -8
- package/build/lib/protocol/errors.d.ts.map +1 -1
- package/build/lib/protocol/errors.js +9 -5
- package/build/lib/protocol/helpers.js +1 -1
- package/build/lib/protocol/index.js +1 -1
- package/build/lib/protocol/protocol.d.ts.map +1 -1
- package/build/lib/protocol/protocol.js +1 -1
- package/build/lib/protocol/routes.d.ts +17 -3
- package/build/lib/protocol/routes.d.ts.map +1 -1
- package/build/lib/protocol/routes.js +1 -1
- package/build/lib/protocol/validators.js +1 -1
- package/build/test/basedriver/driver-e2e-tests.js +1 -1
- package/build/test/basedriver/driver-tests.js +1 -1
- package/build/test/basedriver/index.js +1 -1
- package/build/test/e2e/basedriver/driver.e2e.spec.js +1 -1
- package/build/test/e2e/basedriver/helpers.e2e.spec.js +1 -1
- package/build/test/e2e/basedriver/websockets.e2e.spec.js +1 -1
- package/build/test/e2e/express/server.e2e.spec.js +1 -1
- package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +1 -1
- package/build/test/e2e/protocol/fake-driver.js +1 -1
- package/build/test/e2e/protocol/helpers.js +1 -1
- package/build/test/e2e/protocol/protocol.e2e.spec.js +13 -13
- package/build/test/helpers.js +1 -1
- package/build/test/unit/basedriver/capabilities.spec.js +12 -12
- package/build/test/unit/basedriver/capability.spec.js +15 -15
- package/build/test/unit/basedriver/commands/event.spec.js +1 -1
- package/build/test/unit/basedriver/commands/log.spec.js +1 -1
- package/build/test/unit/basedriver/device-settings.spec.js +1 -1
- package/build/test/unit/basedriver/driver.spec.js +1 -1
- package/build/test/unit/basedriver/helpers.spec.js +33 -33
- package/build/test/unit/basedriver/timeout.spec.js +1 -1
- package/build/test/unit/express/server.spec.js +1 -1
- package/build/test/unit/express/static.spec.js +2 -2
- package/build/test/unit/jsonwp-proxy/mock-request.js +1 -1
- package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +1 -1
- package/build/test/unit/jsonwp-proxy/proxy.spec.js +2 -2
- package/build/test/unit/jsonwp-proxy/url.spec.js +1 -1
- package/build/test/unit/jsonwp-status/status.spec.js +1 -1
- package/build/test/unit/protocol/errors.spec.js +1 -1
- package/build/test/unit/protocol/routes.spec.js +1 -1
- package/build/test/unit/protocol/validator.spec.js +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/basedriver/capabilities.js +95 -47
- package/lib/basedriver/commands/event.js +4 -4
- package/lib/basedriver/commands/find.js +12 -26
- package/lib/basedriver/commands/index.js +7 -7
- package/lib/basedriver/commands/log.js +5 -7
- package/lib/basedriver/commands/session.js +3 -3
- package/lib/basedriver/commands/settings.js +3 -5
- package/lib/basedriver/commands/timeout.js +18 -23
- package/lib/basedriver/core.js +150 -229
- package/lib/basedriver/desired-caps.js +30 -29
- package/lib/basedriver/device-settings.js +21 -20
- package/lib/basedriver/driver.js +131 -96
- package/lib/basedriver/helpers.js +124 -81
- package/lib/basedriver/logger.js +1 -1
- package/lib/constants.js +2 -6
- package/lib/express/crash.js +4 -6
- package/lib/express/express-logging.js +26 -24
- package/lib/express/idempotency.js +16 -16
- package/lib/express/logger.js +1 -1
- package/lib/express/middleware.js +49 -33
- package/lib/express/server.js +68 -44
- package/lib/express/static.js +11 -12
- package/lib/express/websocket.js +26 -16
- package/lib/helpers/capabilities.js +11 -16
- package/lib/index.js +50 -33
- package/lib/jsonwp-proxy/protocol-converter.js +85 -69
- package/lib/jsonwp-proxy/proxy.js +116 -53
- package/lib/jsonwp-status/status.js +36 -29
- package/lib/protocol/errors.js +469 -292
- package/lib/protocol/helpers.js +5 -8
- package/lib/protocol/index.js +22 -15
- package/lib/protocol/protocol.js +103 -55
- package/lib/protocol/routes.js +430 -273
- package/lib/protocol/validators.js +5 -5
- package/package.json +7 -6
- package/test/basedriver/driver-e2e-tests.js +92 -66
- package/test/basedriver/driver-tests.js +90 -33
- package/test/basedriver/index.js +1 -1
|
@@ -5,13 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.desiredCapabilityConstraints = void 0;
|
|
9
|
-
Object.defineProperty(exports, "validator", {
|
|
10
|
-
enumerable: true,
|
|
11
|
-
get: function () {
|
|
12
|
-
return _validate.default;
|
|
13
|
-
}
|
|
14
|
-
});
|
|
8
|
+
exports.validator = exports.desiredCapabilityConstraints = void 0;
|
|
15
9
|
|
|
16
10
|
require("source-map-support/register");
|
|
17
11
|
|
|
@@ -21,6 +15,8 @@ var _validate = _interopRequireDefault(require("validate.js"));
|
|
|
21
15
|
|
|
22
16
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
23
17
|
|
|
18
|
+
const validator = _validate.default;
|
|
19
|
+
exports.validator = validator;
|
|
24
20
|
let desiredCapabilityConstraints = {
|
|
25
21
|
platformName: {
|
|
26
22
|
presence: true,
|
|
@@ -71,7 +67,7 @@ let desiredCapabilityConstraints = {
|
|
|
71
67
|
};
|
|
72
68
|
exports.desiredCapabilityConstraints = desiredCapabilityConstraints;
|
|
73
69
|
|
|
74
|
-
|
|
70
|
+
validator.validators.isString = function isString(value) {
|
|
75
71
|
if (typeof value === 'string') {
|
|
76
72
|
return null;
|
|
77
73
|
}
|
|
@@ -83,7 +79,7 @@ _validate.default.validators.isString = function isString(value) {
|
|
|
83
79
|
return 'must be of type string';
|
|
84
80
|
};
|
|
85
81
|
|
|
86
|
-
|
|
82
|
+
validator.validators.isNumber = function isNumber(value) {
|
|
87
83
|
if (typeof value === 'number') {
|
|
88
84
|
return null;
|
|
89
85
|
}
|
|
@@ -92,7 +88,7 @@ _validate.default.validators.isNumber = function isNumber(value) {
|
|
|
92
88
|
return null;
|
|
93
89
|
}
|
|
94
90
|
|
|
95
|
-
if (typeof value === 'string' && !isNaN(value)) {
|
|
91
|
+
if (typeof value === 'string' && !isNaN(Number(value))) {
|
|
96
92
|
_logger.default.warn('Number capability passed in as string. Functionality may be compromised.');
|
|
97
93
|
|
|
98
94
|
return null;
|
|
@@ -101,7 +97,7 @@ _validate.default.validators.isNumber = function isNumber(value) {
|
|
|
101
97
|
return 'must be of type number';
|
|
102
98
|
};
|
|
103
99
|
|
|
104
|
-
|
|
100
|
+
validator.validators.isBoolean = function isBoolean(value) {
|
|
105
101
|
if (typeof value === 'boolean') {
|
|
106
102
|
return null;
|
|
107
103
|
}
|
|
@@ -117,7 +113,7 @@ _validate.default.validators.isBoolean = function isBoolean(value) {
|
|
|
117
113
|
return 'must be of type boolean';
|
|
118
114
|
};
|
|
119
115
|
|
|
120
|
-
|
|
116
|
+
validator.validators.isObject = function isObject(value) {
|
|
121
117
|
if (typeof value === 'object') {
|
|
122
118
|
return null;
|
|
123
119
|
}
|
|
@@ -129,7 +125,7 @@ _validate.default.validators.isObject = function isObject(value) {
|
|
|
129
125
|
return 'must be of type object';
|
|
130
126
|
};
|
|
131
127
|
|
|
132
|
-
|
|
128
|
+
validator.validators.isArray = function isArray(value) {
|
|
133
129
|
if (Array.isArray(value)) {
|
|
134
130
|
return null;
|
|
135
131
|
}
|
|
@@ -141,7 +137,7 @@ _validate.default.validators.isArray = function isArray(value) {
|
|
|
141
137
|
return 'must be of type array';
|
|
142
138
|
};
|
|
143
139
|
|
|
144
|
-
|
|
140
|
+
validator.validators.deprecated = function deprecated(value, options, key) {
|
|
145
141
|
if (options) {
|
|
146
142
|
_logger.default.warn(`${key} is a deprecated capability`);
|
|
147
143
|
}
|
|
@@ -149,7 +145,7 @@ _validate.default.validators.deprecated = function deprecated(value, options, ke
|
|
|
149
145
|
return null;
|
|
150
146
|
};
|
|
151
147
|
|
|
152
|
-
|
|
148
|
+
validator.validators.inclusionCaseInsensitive = function inclusionCaseInsensitive(value, options) {
|
|
153
149
|
if (typeof value === 'undefined') {
|
|
154
150
|
return null;
|
|
155
151
|
} else if (typeof value !== 'string') {
|
|
@@ -165,9 +161,9 @@ _validate.default.validators.inclusionCaseInsensitive = function inclusionCaseIn
|
|
|
165
161
|
return `${value} not part of ${options.toString()}`;
|
|
166
162
|
};
|
|
167
163
|
|
|
168
|
-
|
|
164
|
+
validator.promise = _bluebird.default;
|
|
169
165
|
|
|
170
|
-
|
|
166
|
+
validator.prettify = function prettify(val) {
|
|
171
167
|
return val;
|
|
172
168
|
};
|
|
173
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
169
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ2YWxpZGF0b3IiLCJfdmFsaWRhdG9yIiwiZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyIsInBsYXRmb3JtTmFtZSIsInByZXNlbmNlIiwiaXNTdHJpbmciLCJkZXZpY2VOYW1lIiwicGxhdGZvcm1WZXJzaW9uIiwibmV3Q29tbWFuZFRpbWVvdXQiLCJpc051bWJlciIsImF1dG9tYXRpb25OYW1lIiwiYXV0b0xhdW5jaCIsImlzQm9vbGVhbiIsInVkaWQiLCJvcmllbnRhdGlvbiIsImluY2x1c2lvbiIsImF1dG9XZWJ2aWV3Iiwibm9SZXNldCIsImZ1bGxSZXNldCIsImxhbmd1YWdlIiwibG9jYWxlIiwiZXZlbnRUaW1pbmdzIiwicHJpbnRQYWdlU291cmNlT25GaW5kRmFpbHVyZSIsInZhbGlkYXRvcnMiLCJ2YWx1ZSIsImlzTmFOIiwiTnVtYmVyIiwibG9nIiwid2FybiIsImluY2x1ZGVzIiwiaXNPYmplY3QiLCJpc0FycmF5IiwiQXJyYXkiLCJkZXByZWNhdGVkIiwib3B0aW9ucyIsImtleSIsImluY2x1c2lvbkNhc2VJbnNlbnNpdGl2ZSIsIm9wdGlvbiIsInRvTG93ZXJDYXNlIiwidG9TdHJpbmciLCJwcm9taXNlIiwiQiIsInByZXR0aWZ5IiwidmFsIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2Jhc2Vkcml2ZXIvZGVzaXJlZC1jYXBzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IF92YWxpZGF0b3IgZnJvbSAndmFsaWRhdGUuanMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCB2YWxpZGF0b3IgPVxuICAvKiogQHR5cGUge2ltcG9ydCgndmFsaWRhdGUuanMnKS5WYWxpZGF0ZUpTICYge3Byb21pc2U6IHR5cGVvZiBpbXBvcnQoJ2JsdWViaXJkJyl9fSAqLyAoXG4gICAgX3ZhbGlkYXRvclxuICApO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnRzfSAqL1xubGV0IGRlc2lyZWRDYXBhYmlsaXR5Q29uc3RyYWludHMgPSB7XG4gIHBsYXRmb3JtTmFtZToge1xuICAgIHByZXNlbmNlOiB0cnVlLFxuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxuICBkZXZpY2VOYW1lOiB7XG4gICAgaXNTdHJpbmc6IHRydWUsXG4gIH0sXG4gIHBsYXRmb3JtVmVyc2lvbjoge1xuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxuICBuZXdDb21tYW5kVGltZW91dDoge1xuICAgIGlzTnVtYmVyOiB0cnVlLFxuICB9LFxuICBhdXRvbWF0aW9uTmFtZToge1xuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxuICBhdXRvTGF1bmNoOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlLFxuICB9LFxuICB1ZGlkOiB7XG4gICAgaXNTdHJpbmc6IHRydWUsXG4gIH0sXG4gIG9yaWVudGF0aW9uOiB7XG4gICAgaW5jbHVzaW9uOiBbJ0xBTkRTQ0FQRScsICdQT1JUUkFJVCddLFxuICB9LFxuICBhdXRvV2Vidmlldzoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZSxcbiAgfSxcbiAgbm9SZXNldDoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZSxcbiAgfSxcbiAgZnVsbFJlc2V0OiB7XG4gICAgaXNCb29sZWFuOiB0cnVlLFxuICB9LFxuICBsYW5ndWFnZToge1xuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxuICBsb2NhbGU6IHtcbiAgICBpc1N0cmluZzogdHJ1ZSxcbiAgfSxcbiAgZXZlbnRUaW1pbmdzOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlLFxuICB9LFxuICBwcmludFBhZ2VTb3VyY2VPbkZpbmRGYWlsdXJlOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlLFxuICB9LFxufTtcblxudmFsaWRhdG9yLnZhbGlkYXRvcnMuaXNTdHJpbmcgPSBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAnbXVzdCBiZSBvZiB0eXBlIHN0cmluZyc7XG59O1xudmFsaWRhdG9yLnZhbGlkYXRvcnMuaXNOdW1iZXIgPSBmdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIGFsbG93IGEgc3RyaW5nIHZhbHVlXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICFpc05hTihOdW1iZXIodmFsdWUpKSkge1xuICAgIGxvZy53YXJuKCdOdW1iZXIgY2FwYWJpbGl0eSBwYXNzZWQgaW4gYXMgc3RyaW5nLiBGdW5jdGlvbmFsaXR5IG1heSBiZSBjb21wcm9taXNlZC4nKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAnbXVzdCBiZSBvZiB0eXBlIG51bWJlcic7XG59O1xudmFsaWRhdG9yLnZhbGlkYXRvcnMuaXNCb29sZWFuID0gZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gYWxsb3cgYSBzdHJpbmcgdmFsdWVcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgWyd0cnVlJywgJ2ZhbHNlJywgJyddLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAnbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4nO1xufTtcbnZhbGlkYXRvci52YWxpZGF0b3JzLmlzT2JqZWN0ID0gZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gJ211c3QgYmUgb2YgdHlwZSBvYmplY3QnO1xufTtcbnZhbGlkYXRvci52YWxpZGF0b3JzLmlzQXJyYXkgPSBmdW5jdGlvbiBpc0FycmF5KHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAnbXVzdCBiZSBvZiB0eXBlIGFycmF5Jztcbn07XG52YWxpZGF0b3IudmFsaWRhdG9ycy5kZXByZWNhdGVkID0gZnVuY3Rpb24gZGVwcmVjYXRlZCh2YWx1ZSwgb3B0aW9ucywga2V5KSB7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgbG9nLndhcm4oYCR7a2V5fSBpcyBhIGRlcHJlY2F0ZWQgY2FwYWJpbGl0eWApO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcbnZhbGlkYXRvci52YWxpZGF0b3JzLmluY2x1c2lvbkNhc2VJbnNlbnNpdGl2ZSA9IGZ1bmN0aW9uIGluY2x1c2lvbkNhc2VJbnNlbnNpdGl2ZSh2YWx1ZSwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gJ3VucmVjb2duaXNlZCc7XG4gIH1cbiAgZm9yIChsZXQgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9uLnRvTG93ZXJDYXNlKCkgPT09IHZhbHVlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7dmFsdWV9IG5vdCBwYXJ0IG9mICR7b3B0aW9ucy50b1N0cmluZygpfWA7XG59O1xuXG52YWxpZGF0b3IucHJvbWlzZSA9IEI7XG52YWxpZGF0b3IucHJldHRpZnkgPSBmdW5jdGlvbiBwcmV0dGlmeSh2YWwpIHtcbiAgcmV0dXJuIHZhbDtcbn07XG5cbmV4cG9ydCB7ZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cywgdmFsaWRhdG9yfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxTQUFTLEdBRVhDLGlCQUZKOztBQU1BLElBQUlDLDRCQUE0QixHQUFHO0VBQ2pDQyxZQUFZLEVBQUU7SUFDWkMsUUFBUSxFQUFFLElBREU7SUFFWkMsUUFBUSxFQUFFO0VBRkUsQ0FEbUI7RUFLakNDLFVBQVUsRUFBRTtJQUNWRCxRQUFRLEVBQUU7RUFEQSxDQUxxQjtFQVFqQ0UsZUFBZSxFQUFFO0lBQ2ZGLFFBQVEsRUFBRTtFQURLLENBUmdCO0VBV2pDRyxpQkFBaUIsRUFBRTtJQUNqQkMsUUFBUSxFQUFFO0VBRE8sQ0FYYztFQWNqQ0MsY0FBYyxFQUFFO0lBQ2RMLFFBQVEsRUFBRTtFQURJLENBZGlCO0VBaUJqQ00sVUFBVSxFQUFFO0lBQ1ZDLFNBQVMsRUFBRTtFQURELENBakJxQjtFQW9CakNDLElBQUksRUFBRTtJQUNKUixRQUFRLEVBQUU7RUFETixDQXBCMkI7RUF1QmpDUyxXQUFXLEVBQUU7SUFDWEMsU0FBUyxFQUFFLENBQUMsV0FBRCxFQUFjLFVBQWQ7RUFEQSxDQXZCb0I7RUEwQmpDQyxXQUFXLEVBQUU7SUFDWEosU0FBUyxFQUFFO0VBREEsQ0ExQm9CO0VBNkJqQ0ssT0FBTyxFQUFFO0lBQ1BMLFNBQVMsRUFBRTtFQURKLENBN0J3QjtFQWdDakNNLFNBQVMsRUFBRTtJQUNU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
|
|
@@ -5,21 +5,21 @@ export const MAX_SETTINGS_SIZE: number;
|
|
|
5
5
|
export default DeviceSettings;
|
|
6
6
|
export type IDeviceSettings<T> = import('@appium/types').DeviceSettings<T>;
|
|
7
7
|
/**
|
|
8
|
-
* @template
|
|
8
|
+
* @template T
|
|
9
9
|
* @implements {IDeviceSettings<T>}
|
|
10
10
|
*/
|
|
11
|
-
export class DeviceSettings<T
|
|
11
|
+
export class DeviceSettings<T> implements IDeviceSettings<T> {
|
|
12
12
|
/**
|
|
13
13
|
* Creates a _shallow copy_ of the `defaultSettings` parameter!
|
|
14
|
-
* @param {T} [defaultSettings]
|
|
14
|
+
* @param {Record<string,T>} [defaultSettings]
|
|
15
15
|
* @param {import('@appium/types').SettingsUpdateListener<T>} [onSettingsUpdate]
|
|
16
16
|
*/
|
|
17
|
-
constructor(defaultSettings?: T | undefined, onSettingsUpdate?: import("@appium/types").SettingsUpdateListener<T> | undefined);
|
|
17
|
+
constructor(defaultSettings?: Record<string, T> | undefined, onSettingsUpdate?: import("@appium/types").SettingsUpdateListener<T> | undefined);
|
|
18
18
|
/**
|
|
19
19
|
* @protected
|
|
20
|
-
* @type {T}
|
|
20
|
+
* @type {Record<string,T>}
|
|
21
21
|
*/
|
|
22
|
-
protected _settings: T
|
|
22
|
+
protected _settings: Record<string, T>;
|
|
23
23
|
/**
|
|
24
24
|
* @protected
|
|
25
25
|
* @type {import('@appium/types').SettingsUpdateListener<T>}
|
|
@@ -27,9 +27,9 @@ export class DeviceSettings<T extends Record<string, unknown>> implements IDevic
|
|
|
27
27
|
protected _onSettingsUpdate: import('@appium/types').SettingsUpdateListener<T>;
|
|
28
28
|
/**
|
|
29
29
|
* calls updateSettings from implementing driver every time a setting is changed.
|
|
30
|
-
* @param {T} newSettings
|
|
30
|
+
* @param {Record<string,T>} newSettings
|
|
31
31
|
*/
|
|
32
|
-
update(newSettings: T): Promise<void>;
|
|
33
|
-
getSettings(): T
|
|
32
|
+
update(newSettings: Record<string, T>): Promise<void>;
|
|
33
|
+
getSettings(): Record<string, T>;
|
|
34
34
|
}
|
|
35
35
|
//# sourceMappingURL=device-settings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-settings.d.ts","sourceRoot":"","sources":["../../../lib/basedriver/device-settings.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"device-settings.d.ts","sourceRoot":"","sources":["../../../lib/basedriver/device-settings.js"],"names":[],"mappings":"AAKA;;GAEG;AACH,uCAAkD;;iCAuErC,OAAO,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC;AArEtD;;;GAGG;AACH,0DAFgC,CAAC;IAe/B;;;;OAIG;IACH,+IAGC;IApBD;;;OAGG;IACH,qBAFU,OAAO,MAAM,EAAC,CAAC,CAAC,CAEhB;IAEV;;;OAGG;IACH,6BAFU,OAAO,eAAe,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAEzC;IAYlB;;;OAGG;IACH,oBAFW,OAAO,MAAM,EAAC,CAAC,CAAC,iBA4B1B;IAED,iCAEC;CACF"}
|
|
@@ -24,10 +24,10 @@ class DeviceSettings {
|
|
|
24
24
|
_settings;
|
|
25
25
|
_onSettingsUpdate;
|
|
26
26
|
|
|
27
|
-
constructor(defaultSettings, onSettingsUpdate) {
|
|
28
|
-
this._settings = { ...
|
|
27
|
+
constructor(defaultSettings = {}, onSettingsUpdate = async () => {}) {
|
|
28
|
+
this._settings = { ...defaultSettings
|
|
29
29
|
};
|
|
30
|
-
this._onSettingsUpdate = onSettingsUpdate
|
|
30
|
+
this._onSettingsUpdate = onSettingsUpdate;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
async update(newSettings) {
|
|
@@ -66,4 +66,4 @@ class DeviceSettings {
|
|
|
66
66
|
exports.DeviceSettings = DeviceSettings;
|
|
67
67
|
var _default = DeviceSettings;
|
|
68
68
|
exports.default = _default;
|
|
69
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQVhfU0VUVElOR1NfU0laRSIsIkRldmljZVNldHRpbmdzIiwiX3NldHRpbmdzIiwiX29uU2V0dGluZ3NVcGRhdGUiLCJjb25zdHJ1Y3RvciIsImRlZmF1bHRTZXR0aW5ncyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJ1cGRhdGUiLCJuZXdTZXR0aW5ncyIsIl8iLCJpc1BsYWluT2JqZWN0IiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJKU09OIiwic3RyaW5naWZ5Iiwibm9kZSIsImdldE9iamVjdFNpemUiLCJ1dGlsIiwidG9SZWFkYWJsZVNpemVTdHJpbmciLCJwcm9wcyIsImtleXMiLCJwcm9wIiwiaXNVbmRlZmluZWQiLCJsb2ciLCJkZWJ1ZyIsImdldFNldHRpbmdzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2Jhc2Vkcml2ZXIvZGV2aWNlLXNldHRpbmdzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7bm9kZSwgdXRpbH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7ZXJyb3JzfSBmcm9tICcuLi9wcm90b2NvbC9lcnJvcnMnO1xuXG4vKipcbiAqIE1heGltdW0gc2l6ZSAoaW4gYnl0ZXMpIG9mIGEgZ2l2ZW4gZHJpdmVyJ3Mgc2V0dGluZ3Mgb2JqZWN0ICh3aGljaCBpcyBpbnRlcm5hbCB0byB7QGxpbmtjb2RlIERyaXZlclNldHRpbmdzfSkuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfU0VUVElOR1NfU0laRSA9IDIwICogMTAyNCAqIDEwMjQ7IC8vIDIwIE1CXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBpbXBsZW1lbnRzIHtJRGV2aWNlU2V0dGluZ3M8VD59XG4gKi9cbmNsYXNzIERldmljZVNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsVD59XG4gICAqL1xuICBfc2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHR5cGUge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlNldHRpbmdzVXBkYXRlTGlzdGVuZXI8VD59XG4gICAqL1xuICBfb25TZXR0aW5nc1VwZGF0ZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIF9zaGFsbG93IGNvcHlfIG9mIHRoZSBgZGVmYXVsdFNldHRpbmdzYCBwYXJhbWV0ZXIhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZyxUPn0gW2RlZmF1bHRTZXR0aW5nc11cbiAgICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TZXR0aW5nc1VwZGF0ZUxpc3RlbmVyPFQ+fSBbb25TZXR0aW5nc1VwZGF0ZV1cbiAgICovXG4gIGNvbnN0cnVjdG9yKGRlZmF1bHRTZXR0aW5ncyA9IHt9LCBvblNldHRpbmdzVXBkYXRlID0gYXN5bmMgKCkgPT4ge30pIHtcbiAgICB0aGlzLl9zZXR0aW5ncyA9IHsuLi5kZWZhdWx0U2V0dGluZ3N9O1xuICAgIHRoaXMuX29uU2V0dGluZ3NVcGRhdGUgPSBvblNldHRpbmdzVXBkYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGxzIHVwZGF0ZVNldHRpbmdzIGZyb20gaW1wbGVtZW50aW5nIGRyaXZlciBldmVyeSB0aW1lIGEgc2V0dGluZyBpcyBjaGFuZ2VkLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsVD59IG5ld1NldHRpbmdzXG4gICAqL1xuICBhc3luYyB1cGRhdGUobmV3U2V0dGluZ3MpIHtcbiAgICBpZiAoIV8uaXNQbGFpbk9iamVjdChuZXdTZXR0aW5ncykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgIGBTZXR0aW5ncyB1cGRhdGUgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHZhbGlkIEpTT04uIEdvdCBgICtcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyl9IGluc3RlYWRgXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChub2RlLmdldE9iamVjdFNpemUoey4uLnRoaXMuX3NldHRpbmdzLCAuLi5uZXdTZXR0aW5nc30pID49IE1BWF9TRVRUSU5HU19TSVpFKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICBgTmV3IHNldHRpbmdzIGNhbm5vdCBiZSBhcHBsaWVkLCBiZWNhdXNlIHRoZSBvdmVyYWxsIGAgK1xuICAgICAgICAgIGBvYmplY3Qgc2l6ZSBleGNlZWRzIHRoZSBhbGxvd2VkIGxpbWl0IG9mICR7dXRpbC50b1JlYWRhYmxlU2l6ZVN0cmluZyhNQVhfU0VUVElOR1NfU0laRSl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wcyA9IC8qKiBAdHlwZSB7KGtleW9mIFQgJiBzdHJpbmcpW119ICovIChfLmtleXMobmV3U2V0dGluZ3MpKTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLl9zZXR0aW5nc1twcm9wXSkpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzW3Byb3BdID09PSBuZXdTZXR0aW5nc1twcm9wXSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgVGhlIHZhbHVlIG9mICcke3Byb3B9JyBzZXR0aW5nIGRpZCBub3QgY2hhbmdlLiBTa2lwcGluZyB0aGUgdXBkYXRlIGZvciBpdGApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLl9vblNldHRpbmdzVXBkYXRlKHByb3AsIG5ld1NldHRpbmdzW3Byb3BdLCB0aGlzLl9zZXR0aW5nc1twcm9wXSk7XG4gICAgICB0aGlzLl9zZXR0aW5nc1twcm9wXSA9IG5ld1NldHRpbmdzW3Byb3BdO1xuICAgIH1cbiAgfVxuXG4gIGdldFNldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncztcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEZXZpY2VTZXR0aW5ncztcbmV4cG9ydCB7RGV2aWNlU2V0dGluZ3N9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRGV2aWNlU2V0dGluZ3M8VD59IElEZXZpY2VTZXR0aW5nc1xuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS08sTUFBTUEsaUJBQWlCLEdBQUcsS0FBSyxJQUFMLEdBQVksSUFBdEM7OztBQU1QLE1BQU1DLGNBQU4sQ0FBcUI7RUFLbkJDLFNBQVM7RUFNVEMsaUJBQWlCOztFQU9qQkMsV0FBVyxDQUFDQyxlQUFlLEdBQUcsRUFBbkIsRUFBdUJDLGdCQUFnQixHQUFHLFlBQVksQ0FBRSxDQUF4RCxFQUEwRDtJQUNuRSxLQUFLSixTQUFMLEdBQWlCLEVBQUMsR0FBR0c7SUFBSixDQUFqQjtJQUNBLEtBQUtGLGlCQUFMLEdBQXlCRyxnQkFBekI7RUFDRDs7RUFNVyxNQUFOQyxNQUFNLENBQUNDLFdBQUQsRUFBYztJQUN4QixJQUFJLENBQUNDLGVBQUEsQ0FBRUMsYUFBRixDQUFnQkYsV0FBaEIsQ0FBTCxFQUFtQztNQUNqQyxNQUFNLElBQUlHLGNBQUEsQ0FBT0Msb0JBQVgsQ0FDSCx3REFBRCxHQUNHLEdBQUVDLElBQUksQ0FBQ0MsU0FBTCxDQUFlTixXQUFmLENBQTRCLFVBRjdCLENBQU47SUFJRDs7SUFFRCxJQUFJTyxhQUFBLENBQUtDLGFBQUwsQ0FBbUIsRUFBQyxHQUFHLEtBQUtkLFNBQVQ7TUFBb0IsR0FBR007SUFBdkIsQ0FBbkIsS0FBMkRSLGlCQUEvRCxFQUFrRjtNQUNoRixNQUFNLElBQUlXLGNBQUEsQ0FBT0Msb0JBQVgsQ0FDSCxzREFBRCxHQUNHLDRDQUEyQ0ssYUFBQSxDQUFLQyxvQkFBTCxDQUEwQmxCLGlCQUExQixDQUE2QyxFQUZ2RixDQUFOO0lBSUQ7O0lBRUQsTUFBTW1CLEtBQUssR0FBd0NWLGVBQUEsQ0FBRVcsSUFBRixDQUFPWixXQUFQLENBQW5EOztJQUNBLEtBQUssTUFBTWEsSUFBWCxJQUFtQkYsS0FBbkIsRUFBMEI7TUFDeEIsSUFBSSxDQUFDVixlQUFBLENBQUVhLFdBQUYsQ0FBYyxLQUFLcEIsU0FBTCxDQUFlbUIsSUFBZixDQUFkLENBQUwsRUFBMEM7UUFDeEMsSUFBSSxLQUFLbkIsU0FBTCxDQUFlbUIsSUFBZixNQUF5QmIsV0FBVyxDQUFDYSxJQUFELENBQXhDLEVBQWdEO1VBQzlDRSxlQUFBLENBQUlDLEtBQUosQ0FBVyxpQkFBZ0JILElBQUssc0RBQWhDOztVQUNBO1FBQ0Q7TUFDRjs7TUFDRCxNQUFNLEtBQUtsQixpQkFBTCxDQUF1QmtCLElBQXZCLEVBQTZCYixXQUFXLENBQUNhLElBQUQsQ0FBeEMsRUFBZ0QsS0FBS25CLFNBQUwsQ0FBZW1CLElBQWYsQ0FBaEQsQ0FBTjtNQUNBLEtBQUtuQixTQUFMLENBQWVtQixJQUFmLElBQXVCYixXQUFXLENBQUNhLElBQUQsQ0FBbEM7SUFDRDtFQUNGOztFQUVESSxXQUFXLEdBQUc7SUFDWixPQUFPLEtBQUt2QixTQUFaO0VBQ0Q7O0FBekRrQjs7O2VBNERORCxjIn0=
|
|
@@ -2,18 +2,19 @@
|
|
|
2
2
|
* @implements {SessionHandler}
|
|
3
3
|
*/
|
|
4
4
|
export class BaseDriverCore extends DriverCore implements SessionHandler {
|
|
5
|
+
_constraints: import("@appium/types").Constraints;
|
|
5
6
|
/** @type {Record<string,any>|undefined} */
|
|
6
7
|
cliArgs: Record<string, any> | undefined;
|
|
7
8
|
/**
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
executeCommand(cmd: string, ...args: any[]
|
|
9
|
+
* @param {string} cmd
|
|
10
|
+
* @param {...any} args
|
|
11
|
+
* @returns {Promise<any>}
|
|
12
|
+
*/
|
|
13
|
+
executeCommand(cmd: string, ...args: any[]): Promise<any>;
|
|
13
14
|
/**
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
*
|
|
16
|
+
* @param {Error} err
|
|
17
|
+
*/
|
|
17
18
|
startUnexpectedShutdown(err?: Error): Promise<void>;
|
|
18
19
|
startNewCommandTimeout(): Promise<void>;
|
|
19
20
|
/**
|
|
@@ -31,25 +32,40 @@ export class BaseDriverCore extends DriverCore implements SessionHandler {
|
|
|
31
32
|
reset(): Promise<void>;
|
|
32
33
|
resetOnUnexpectedShutdown: (() => void) | undefined;
|
|
33
34
|
/**
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
35
|
+
*
|
|
36
|
+
* Historically the first two arguments were reserved for JSONWP capabilities.
|
|
37
|
+
* Appium 2 has dropped the support of these, so now we only accept capability
|
|
38
|
+
* objects in W3C format and thus allow any of the three arguments to represent
|
|
39
|
+
* the latter.
|
|
40
|
+
* @param {W3CCapabilities} w3cCapabilities1
|
|
41
|
+
* @param {W3CCapabilities} [w3cCapabilities2]
|
|
42
|
+
* @param {W3CCapabilities} [w3cCapabilities]
|
|
43
|
+
* @param {DriverData[]} [driverData]
|
|
44
|
+
* @returns {Promise<[string,object]>}
|
|
45
|
+
*/
|
|
45
46
|
createSession(w3cCapabilities1: W3CCapabilities, w3cCapabilities2?: W3CCapabilities | undefined, w3cCapabilities?: W3CCapabilities | undefined, driverData?: import("@appium/types").DriverData[] | undefined): Promise<[string, object]>;
|
|
46
47
|
/**
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
*
|
|
49
|
+
* @param {string} [sessionId]
|
|
50
|
+
* @param {DriverData[]} [driverData]
|
|
51
|
+
* @returns {Promise<void>}
|
|
52
|
+
*/
|
|
52
53
|
deleteSession(sessionId?: string | undefined, driverData?: import("@appium/types").DriverData[] | undefined): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
*
|
|
56
|
+
* @param {Capabilities} caps
|
|
57
|
+
*/
|
|
58
|
+
logExtraCaps(caps: Partial<import("@wdio/types/build/Capabilities").Capabilities & import("@wdio/types/build/Capabilities").AppiumCapabilities & {
|
|
59
|
+
[x: string]: any;
|
|
60
|
+
}>): void;
|
|
61
|
+
/**
|
|
62
|
+
*
|
|
63
|
+
* @param {Capabilities} caps
|
|
64
|
+
* @returns {boolean}
|
|
65
|
+
*/
|
|
66
|
+
validateDesiredCaps(caps: Capabilities): boolean;
|
|
67
|
+
set desiredCapConstraints(arg: import("@appium/types").Constraints);
|
|
68
|
+
get desiredCapConstraints(): import("@appium/types").Constraints;
|
|
53
69
|
}
|
|
54
70
|
export default BaseDriver;
|
|
55
71
|
export type HTTPMethod = import('@appium/types').HTTPMethod;
|
|
@@ -62,22 +78,11 @@ export type UpdateServerCallback = (app: import('express').Express, httpServer:
|
|
|
62
78
|
/**
|
|
63
79
|
* This is used to extend {@linkcode BaseDriverCore } by the mixins and also external drivers.
|
|
64
80
|
*/
|
|
65
|
-
export type BaseDriverBase<Proto = {}, Static = {}> = import('@appium/types').Class<BaseDriverCore & Proto,
|
|
66
|
-
/**
|
|
67
|
-
* Static properties of `BaseDriver` and optional properties for subclasses.
|
|
68
|
-
*/
|
|
69
|
-
export type BaseDriverStatic<T extends import("@appium/types").ExternalDriver = import("@appium/types").ExternalDriver> = {
|
|
70
|
-
baseVersion: string;
|
|
71
|
-
updateServer?: UpdateServerCallback | undefined;
|
|
72
|
-
newMethodMap?: import("@appium/types").MethodMap<T> | undefined;
|
|
73
|
-
};
|
|
81
|
+
export type BaseDriverBase<Proto = {}, Static = {}> = import('@appium/types').Class<BaseDriverCore & Proto, import('@appium/types').DriverStatic & Static>;
|
|
74
82
|
export type SessionHandler = import('@appium/types').SessionHandler<[string, object], void>;
|
|
75
83
|
import { DriverCore } from "./core";
|
|
76
|
-
declare const BaseDriver_base: import("./commands/session").SessionBase;
|
|
77
84
|
/**
|
|
78
|
-
*
|
|
79
|
-
* @implements {Driver}
|
|
85
|
+
* @type {import('@appium/types').DriverClass<Driver>}
|
|
80
86
|
*/
|
|
81
|
-
export
|
|
82
|
-
}
|
|
87
|
+
export const BaseDriver: import('@appium/types').DriverClass<Driver>;
|
|
83
88
|
//# sourceMappingURL=driver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../../lib/basedriver/driver.js"],"names":[],"mappings":"AA0BA;;GAEG;AACH;
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../../lib/basedriver/driver.js"],"names":[],"mappings":"AA0BA;;GAEG;AACH;IACE,kDAAyD;IAEzD,2CAA2C;IAC3C,SADW,OAAO,MAAM,EAAC,GAAG,CAAC,GAAC,SAAS,CAC/B;IAMR;;;;OAIG;IACH,oBAJW,MAAM,WACF,GAAG,KACL,QAAQ,GAAG,CAAC,CAsExB;IAED;;;OAGG;IACH,8BAFW,KAAK,iBAcf;IAED,wCAmBC;IAED;;;;;;OAMG;IACH,qBALW,OAAO,eAAe,EAAE,YAAY,QACpC,MAAM,QACN,MAAM,QACN,MAAM,QAOhB;IAJC,yDAAoB;IACpB,+BAAsB;IACtB,+BAAsB;IACtB,+BAAsB;IAOxB,uBA+BC;IAfC,oDAAyC;IAiB3C;;;;;;;;;;;OAWG;IACH,gCANW,eAAe,iKAIb,QAAQ,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC,CAoFpC;IAED;;;;;OAKG;IACH,8GAFa,QAAQ,IAAI,CAAC,CAczB;IAED;;;OAGG;IACH;;cAUC;IAED;;;;OAIG;IACH,0BAHW,YAAY,GACV,OAAO,CAqBnB;IAGD,oEAWC;IAED,iEAEC;CACF;;yBAiBY,OAAO,eAAe,EAAE,UAAU;qBAClC,OAAO,eAAe,EAAE,MAAM;6BAC9B,OAAO,eAAe,EAAE,cAAc;2BACtC,OAAO,eAAe,EAAE,YAAY;8BACpC,OAAO,eAAe,EAAE,eAAe;yBACvC,OAAO,eAAe,EAAE,UAAU;yCAKpC,OAAO,SAAS,EAAE,OAAO,cACzB,OAAO,eAAe,EAAE,YAAY,KAClC,OAAO,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC;;;;sDAOpC,OAAO,eAAe,EAAE,KAAK,CAAC,cAAc,GAAG,KAAK,EAAC,OAAO,eAAe,EAAE,YAAY,GAAG,MAAM,CAAC;6BAInG,OAAO,eAAe,EAAE,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAC,IAAI,CAAC;;AAhC1E;;GAEG;AACH,yBAFU,OAAO,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAEtB"}
|
|
@@ -9,6 +9,8 @@ exports.default = exports.BaseDriverCore = exports.BaseDriver = void 0;
|
|
|
9
9
|
|
|
10
10
|
require("source-map-support/register");
|
|
11
11
|
|
|
12
|
+
var _capabilities = require("./capabilities");
|
|
13
|
+
|
|
12
14
|
var _core = require("./core");
|
|
13
15
|
|
|
14
16
|
var _support = require("@appium/support");
|
|
@@ -17,16 +19,16 @@ var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
|
17
19
|
|
|
18
20
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
19
21
|
|
|
20
|
-
var
|
|
22
|
+
var _capabilities2 = require("../helpers/capabilities");
|
|
21
23
|
|
|
22
24
|
var _protocol = require("../protocol");
|
|
23
25
|
|
|
24
|
-
var _capabilities2 = require("./capabilities");
|
|
25
|
-
|
|
26
26
|
var _commands = require("./commands");
|
|
27
27
|
|
|
28
28
|
var _helpers = _interopRequireDefault(require("./helpers"));
|
|
29
29
|
|
|
30
|
+
var _desiredCaps = require("./desired-caps");
|
|
31
|
+
|
|
30
32
|
const EVENT_SESSION_INIT = 'newSessionRequested';
|
|
31
33
|
const EVENT_SESSION_START = 'newSessionStarted';
|
|
32
34
|
const EVENT_SESSION_QUIT_START = 'quitSessionRequested';
|
|
@@ -34,6 +36,7 @@ const EVENT_SESSION_QUIT_DONE = 'quitSessionFinished';
|
|
|
34
36
|
const ON_UNEXPECTED_SHUTDOWN_EVENT = 'onUnexpectedShutdown';
|
|
35
37
|
|
|
36
38
|
class BaseDriverCore extends _core.DriverCore {
|
|
39
|
+
_constraints = _lodash.default.cloneDeep(_desiredCaps.desiredCapabilityConstraints);
|
|
37
40
|
cliArgs;
|
|
38
41
|
|
|
39
42
|
async executeCommand(cmd, ...args) {
|
|
@@ -155,7 +158,7 @@ class BaseDriverCore extends _core.DriverCore {
|
|
|
155
158
|
|
|
156
159
|
this.log.debug();
|
|
157
160
|
|
|
158
|
-
const originalCaps = _lodash.default.cloneDeep([w3cCapabilities, w3cCapabilities1, w3cCapabilities2].find(
|
|
161
|
+
const originalCaps = _lodash.default.cloneDeep([w3cCapabilities, w3cCapabilities1, w3cCapabilities2].find(_capabilities2.isW3cCaps));
|
|
159
162
|
|
|
160
163
|
if (!originalCaps) {
|
|
161
164
|
throw new _protocol.errors.SessionNotCreatedError('Appium only supports W3C-style capability objects. ' + 'Your client is sending an older capabilities format. Please update your client library.');
|
|
@@ -167,14 +170,14 @@ class BaseDriverCore extends _core.DriverCore {
|
|
|
167
170
|
let caps;
|
|
168
171
|
|
|
169
172
|
try {
|
|
170
|
-
caps = (0,
|
|
173
|
+
caps = (0, _capabilities.processCapabilities)(originalCaps, this.desiredCapConstraints, this.shouldValidateCaps);
|
|
171
174
|
|
|
172
|
-
if (caps[
|
|
173
|
-
this.log.debug(`Found ${
|
|
174
|
-
caps = (0,
|
|
175
|
+
if (caps[_capabilities.APPIUM_OPTS_CAP]) {
|
|
176
|
+
this.log.debug(`Found ${_capabilities.PREFIXED_APPIUM_OPTS_CAP} capability present; will promote items inside to caps`);
|
|
177
|
+
caps = (0, _capabilities.promoteAppiumOptions)(caps);
|
|
175
178
|
}
|
|
176
179
|
|
|
177
|
-
caps = (0,
|
|
180
|
+
caps = (0, _capabilities2.fixCaps)(caps, this.desiredCapConstraints, this.log);
|
|
178
181
|
} catch (e) {
|
|
179
182
|
throw new _protocol.errors.SessionNotCreatedError(e.message);
|
|
180
183
|
}
|
|
@@ -226,13 +229,57 @@ class BaseDriverCore extends _core.DriverCore {
|
|
|
226
229
|
this._log.prefix = _helpers.default.generateDriverLogPrefix(this);
|
|
227
230
|
}
|
|
228
231
|
|
|
232
|
+
logExtraCaps(caps) {
|
|
233
|
+
let extraCaps = _lodash.default.difference(_lodash.default.keys(caps), _lodash.default.keys(this._constraints));
|
|
234
|
+
|
|
235
|
+
if (extraCaps.length) {
|
|
236
|
+
this.log.warn(`The following capabilities were provided, but are not ` + `recognized by Appium:`);
|
|
237
|
+
|
|
238
|
+
for (const cap of extraCaps) {
|
|
239
|
+
this.log.warn(` ${cap}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
validateDesiredCaps(caps) {
|
|
245
|
+
if (!this.shouldValidateCaps) {
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
try {
|
|
250
|
+
(0, _capabilities.validateCaps)(caps, this._constraints);
|
|
251
|
+
} catch (e) {
|
|
252
|
+
this.log.errorAndThrow(new _protocol.errors.SessionNotCreatedError(`The desiredCapabilities object was not valid for the ` + `following reason(s): ${e.message}`));
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
this.logExtraCaps(caps);
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
set desiredCapConstraints(constraints) {
|
|
260
|
+
this._constraints = Object.assign(this._constraints, constraints);
|
|
261
|
+
|
|
262
|
+
for (const [, value] of _lodash.default.toPairs(this._constraints)) {
|
|
263
|
+
if (value && value.presence === true) {
|
|
264
|
+
value.presence = {
|
|
265
|
+
allowEmpty: false
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
get desiredCapConstraints() {
|
|
272
|
+
return this._constraints;
|
|
273
|
+
}
|
|
274
|
+
|
|
229
275
|
}
|
|
230
276
|
|
|
231
277
|
exports.BaseDriverCore = BaseDriverCore;
|
|
232
278
|
|
|
233
|
-
class
|
|
279
|
+
class _BaseDriver extends (0, _commands.createBaseDriverClass)(BaseDriverCore) {}
|
|
234
280
|
|
|
281
|
+
const BaseDriver = _BaseDriver;
|
|
235
282
|
exports.BaseDriver = BaseDriver;
|
|
236
283
|
var _default = BaseDriver;
|
|
237
284
|
exports.default = _default;
|
|
238
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFVkVOVF9TRVNTSU9OX0lOSVQiLCJFVkVOVF9TRVNTSU9OX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX0RPTkUiLCJPTl9VTkVYUEVDVEVEX1NIVVRET1dOX0VWRU5UIiwiQmFzZURyaXZlckNvcmUiLCJEcml2ZXJDb3JlIiwiY2xpQXJncyIsImV4ZWN1dGVDb21tYW5kIiwiY21kIiwiYXJncyIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJwcm90b2NvbCIsImxvZ0V2ZW50IiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsImNsZWFyTmV3Q29tbWFuZFRpbWVvdXQiLCJzaHV0ZG93blVuZXhwZWN0ZWRseSIsImVycm9ycyIsIk5vU3VjaERyaXZlckVycm9yIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsInVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyIiwiY29tbWFuZEV4ZWN1dG9yIiwiQiIsInJhY2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZXZlbnRFbWl0dGVyIiwib24iLCJmaW5hbGx5IiwicmVtb3ZlTGlzdGVuZXIiLCJyZXMiLCJpc0NvbW1hbmRzUXVldWVFbmFibGVkIiwiY29tbWFuZHNRdWV1ZUd1YXJkIiwiYWNxdWlyZSIsIkJhc2VEcml2ZXIiLCJuYW1lIiwic3RhcnROZXdDb21tYW5kVGltZW91dCIsImVuZFRpbWUiLCJfZXZlbnRIaXN0b3J5IiwiY29tbWFuZHMiLCJwdXNoIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJlcnIiLCJlbWl0Iiwic2Vzc2lvbklkIiwiZGVsZXRlU2Vzc2lvbiIsIm5ld0NvbW1hbmRUaW1lb3V0TXMiLCJub0NvbW1hbmRUaW1lciIsInNldFRpbWVvdXQiLCJsb2ciLCJ3YXJuIiwiZXJyb3JNZXNzYWdlIiwiRXJyb3IiLCJhc3NpZ25TZXJ2ZXIiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInBhdGgiLCJzZXJ2ZXJIb3N0Iiwic2VydmVyUG9ydCIsInNlcnZlclBhdGgiLCJyZXNldCIsImRlYnVnIiwiY3VycmVudENvbmZpZyIsInByb3BlcnR5IiwicmVzZXRPblVuZXhwZWN0ZWRTaHV0ZG93biIsImNyZWF0ZVNlc3Npb24iLCJvcmlnaW5hbENhcHMiLCJrZXkiLCJ2YWx1ZSIsIl8iLCJ0b1BhaXJzIiwidzNjQ2FwYWJpbGl0aWVzMSIsInczY0NhcGFiaWxpdGllczIiLCJ3M2NDYXBhYmlsaXRpZXMiLCJkcml2ZXJEYXRhIiwiU2Vzc2lvbk5vdENyZWF0ZWRFcnJvciIsImNsb25lRGVlcCIsImZpbmQiLCJpc1czY0NhcHMiLCJzZXRQcm90b2NvbFczQyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjYXBzIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwiQVBQSVVNX09QVFNfQ0FQIiwiUFJFRklYRURfQVBQSVVNX09QVFNfQ0FQIiwiZSIsIm1lc3NhZ2UiLCJ2YWxpZGF0ZURlc2lyZWRDYXBzIiwidXRpbCIsInV1aWRWNCIsIm9wdHMiLCJpbml0aWFsT3B0cyIsIk9iamVjdCIsImFzc2lnbiIsIm5vUmVzZXQiLCJmdWxsUmVzZXQiLCJmYXN0UmVzZXQiLCJza2lwVW5pbnN0YWxsIiwiYXBwIiwidHJpbSIsImlzVW5kZWZpbmVkIiwibmV3Q29tbWFuZFRpbWVvdXQiLCJfbG9nIiwicHJlZml4IiwiaGVscGVycyIsImdlbmVyYXRlRHJpdmVyTG9nUHJlZml4IiwiaW5mbyIsImlzQnVzeSIsImtleXMiLCJxdWV1ZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvYmFzZWRyaXZlci9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG4vKiBlc2xpbnQtZGlzYWJsZSByZXF1aXJlLWF3YWl0ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG5pbXBvcnQgeyBEcml2ZXJDb3JlIH0gZnJvbSAnLi9jb3JlJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZpeENhcHMsIGlzVzNjQ2FwcyB9IGZyb20gJy4uL2hlbHBlcnMvY2FwYWJpbGl0aWVzJztcbmltcG9ydCB7IERFTEVURV9TRVNTSU9OX0NPTU1BTkQsIGRldGVybWluZVByb3RvY29sLCBlcnJvcnMgfSBmcm9tICcuLi9wcm90b2NvbCc7XG5pbXBvcnQge1xuICBBUFBJVU1fT1BUU19DQVAsXG4gIFBSRUZJWEVEX0FQUElVTV9PUFRTX0NBUCxcbiAgcHJvY2Vzc0NhcGFiaWxpdGllcyxcbiAgcHJvbW90ZUFwcGl1bU9wdGlvbnNcbn0gZnJvbSAnLi9jYXBhYmlsaXRpZXMnO1xuaW1wb3J0IHsgY3JlYXRlQmFzZURyaXZlckNsYXNzIH0gZnJvbSAnLi9jb21tYW5kcyc7XG5pbXBvcnQgaGVscGVycyBmcm9tICcuL2hlbHBlcnMnO1xuXG5jb25zdCBFVkVOVF9TRVNTSU9OX0lOSVQgPSAnbmV3U2Vzc2lvblJlcXVlc3RlZCc7XG5jb25zdCBFVkVOVF9TRVNTSU9OX1NUQVJUID0gJ25ld1Nlc3Npb25TdGFydGVkJztcbmNvbnN0IEVWRU5UX1NFU1NJT05fUVVJVF9TVEFSVCA9ICdxdWl0U2Vzc2lvblJlcXVlc3RlZCc7XG5jb25zdCBFVkVOVF9TRVNTSU9OX1FVSVRfRE9ORSA9ICdxdWl0U2Vzc2lvbkZpbmlzaGVkJztcbmNvbnN0IE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQgPSAnb25VbmV4cGVjdGVkU2h1dGRvd24nO1xuXG5cbi8qKlxuICogQGltcGxlbWVudHMge1Nlc3Npb25IYW5kbGVyfVxuICovXG5leHBvcnQgY2xhc3MgQmFzZURyaXZlckNvcmUgZXh0ZW5kcyBEcml2ZXJDb3JlIHtcblxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsYW55Pnx1bmRlZmluZWR9ICovXG4gIGNsaUFyZ3M7XG5cbiAgLy8gVGhpcyBpcyB0aGUgbWFpbiBjb21tYW5kIGhhbmRsZXIgZm9yIHRoZSBkcml2ZXIuIEl0IHdyYXBzIGNvbW1hbmRcbiAgLy8gZXhlY3V0aW9uIHdpdGggdGltZW91dCBsb2dpYywgY2hlY2tpbmcgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgc2Vzc2lvbixcbiAgLy8gYW5kIGVuc3VyaW5nIHRoYXQgd2UgZXhlY3V0ZSBjb21tYW5kcyBvbmUgYXQgYSB0aW1lLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWRcbiAgLy8gYnkgTUpTT05XUCdzIGV4cHJlc3Mgcm91dGVyLlxuICAvKipcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbWRcbiAgICAqIEBwYXJhbSAgey4uLmFueVtdfSBhcmdzXG4gICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgICovXG4gIGFzeW5jIGV4ZWN1dGVDb21tYW5kIChjbWQsIC4uLmFyZ3MpIHtcbiAgICAvLyBnZXQgc3RhcnQgdGltZSBmb3IgdGhpcyBjb21tYW5kLCBhbmQgbG9nIGluIHNwZWNpYWwgY2FzZXNcbiAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChjbWQgPT09ICdjcmVhdGVTZXNzaW9uJykge1xuICAgICAgLy8gSWYgY3JlYXRpbmcgYSBzZXNzaW9uIGRldGVybWluZSBpZiBXM0Mgb3IgTUpTT05XUCBwcm90b2NvbCB3YXMgcmVxdWVzdGVkIGFuZCByZW1lbWJlciB0aGUgY2hvaWNlXG4gICAgICB0aGlzLnByb3RvY29sID0gZGV0ZXJtaW5lUHJvdG9jb2woYXJncyk7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fSU5JVCk7XG4gICAgfSBlbHNlIGlmIChjbWQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgIHRoaXMubG9nRXZlbnQoRVZFTlRfU0VTU0lPTl9RVUlUX1NUQVJUKTtcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBoYWQgYSBjb21tYW5kIHRpbWVyIHJ1bm5pbmcsIGNsZWFyIGl0IG5vdyB0aGF0IHdlJ3JlIHN0YXJ0aW5nXG4gICAgLy8gYSBuZXcgY29tbWFuZCBhbmQgc28gZG9uJ3Qgd2FudCB0byB0aW1lIG91dFxuICAgIGF3YWl0IHRoaXMuY2xlYXJOZXdDb21tYW5kVGltZW91dCgpO1xuXG4gICAgaWYgKHRoaXMuc2h1dGRvd25VbmV4cGVjdGVkbHkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRHJpdmVyRXJyb3IoXG4gICAgICAgICAgJ1RoZSBkcml2ZXIgd2FzIHVuZXhwZWN0ZWRseSBzaHV0IGRvd24hJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIGNvbW1hbmQsIGl0IG11c3Qgbm90IGJlIGltcGxlbWVudGVkXG4gICAgaWYgKCF0aGlzW2NtZF0pIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuTm90WWV0SW1wbGVtZW50ZWRFcnJvcigpO1xuICAgIH1cblxuICAgIGxldCB1bmV4cGVjdGVkU2h1dGRvd25MaXN0ZW5lcjtcbiAgICBjb25zdCBjb21tYW5kRXhlY3V0b3IgPSBhc3luYyAoKSA9PlxuICAgICAgYXdhaXQgQi5yYWNlKFtcbiAgICAgICAgdGhpc1tjbWRdKC4uLmFyZ3MpLFxuICAgICAgICBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIgPSByZWplY3Q7XG4gICAgICAgICAgdGhpcy5ldmVudEVtaXR0ZXIub24oXG4gICAgICAgICAgICAgIE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsXG4gICAgICAgICAgICAgIHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pLFxuICAgICAgXSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGlmICh1bmV4cGVjdGVkU2h1dGRvd25MaXN0ZW5lcikge1xuICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAgICAgICAgdGhpcy5ldmVudEVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoXG4gICAgICAgICAgICAgIE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsXG4gICAgICAgICAgICAgIHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBjb25zdCByZXMgPSB0aGlzLmlzQ29tbWFuZHNRdWV1ZUVuYWJsZWRcbiAgICAgID8gYXdhaXQgdGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQuYWNxdWlyZShCYXNlRHJpdmVyLm5hbWUsIGNvbW1hbmRFeGVjdXRvcilcbiAgICAgIDogYXdhaXQgY29tbWFuZEV4ZWN1dG9yKCk7XG5cbiAgICAvLyBpZiB3ZSBoYXZlIHNldCBhIG5ldyBjb21tYW5kIHRpbWVvdXQgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSwgc3RhcnQgYVxuICAgIC8vIHRpbWVyIG9uY2Ugd2UndmUgZmluaXNoZWQgZXhlY3V0aW5nIHRoaXMgY29tbWFuZC4gSWYgd2UgZG9uJ3QgY2xlYXJcbiAgICAvLyB0aGUgdGltZXIgKHdoaWNoIGlzIGRvbmUgd2hlbiBhIG5ldyBjb21tYW5kIGNvbWVzIGluKSwgd2Ugd2lsbCB0cmlnZ2VyXG4gICAgLy8gYXV0b21hdGljIHNlc3Npb24gZGVsZXRpb24gaW4gdGhpcy5vbkNvbW1hbmRUaW1lb3V0LiBPZiBjb3Vyc2Ugd2UgZG9uJ3RcbiAgICAvLyB3YW50IHRvIHRyaWdnZXIgdGhlIHRpbWVyIHdoZW4gdGhlIHVzZXIgaXMgc2h1dHRpbmcgZG93biB0aGUgc2Vzc2lvblxuICAgIC8vIGludGVudGlvbmFsbHlcbiAgICBpZiAodGhpcy5pc0NvbW1hbmRzUXVldWVFbmFibGVkICYmIGNtZCAhPT0gREVMRVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgLy8gcmVzZXR0aW5nIGV4aXN0aW5nIHRpbWVvdXRcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnROZXdDb21tYW5kVGltZW91dCgpO1xuICAgIH1cblxuICAgIC8vIGxvZyB0aW1pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb21tYW5kXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5fZXZlbnRIaXN0b3J5LmNvbW1hbmRzLnB1c2goe2NtZCwgc3RhcnRUaW1lLCBlbmRUaW1lfSk7XG4gICAgaWYgKGNtZCA9PT0gJ2NyZWF0ZVNlc3Npb24nKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fU1RBUlQpO1xuICAgIH0gZWxzZSBpZiAoY21kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fUVVJVF9ET05FKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAgKlxuICAgICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gICAgKi9cbiAgYXN5bmMgc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24gKFxuICAgIGVyciA9IG5ldyBlcnJvcnMuTm9TdWNoRHJpdmVyRXJyb3IoXG4gICAgICAgICdUaGUgZHJpdmVyIHdhcyB1bmV4cGVjdGVkbHkgc2h1dCBkb3duIScsXG4gICAgKSxcbiAgKSB7XG4gICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdChPTl9VTkVYUEVDVEVEX1NIVVRET1dOX0VWRU5ULCBlcnIpOyAvLyBhbGxvdyBvdGhlcnMgdG8gbGlzdGVuIGZvciB0aGlzXG4gICAgdGhpcy5zaHV0ZG93blVuZXhwZWN0ZWRseSA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNlc3Npb25JZCAhPT0gbnVsbCkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24odGhpcy5zZXNzaW9uSWQpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNodXRkb3duVW5leHBlY3RlZGx5ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnROZXdDb21tYW5kVGltZW91dCAoKSB7XG4gICAgLy8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyByb2d1ZSB0aW1lb3V0c1xuICAgIGF3YWl0IHRoaXMuY2xlYXJOZXdDb21tYW5kVGltZW91dCgpO1xuXG4gICAgLy8gaWYgY29tbWFuZCB0aW1lb3V0IGlzIDAsIGl0IGlzIGRpc2FibGVkXG4gICAgaWYgKCF0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuXG4gICAgdGhpcy5ub0NvbW1hbmRUaW1lciA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5sb2cud2FybihcbiAgICAgICAgYFNodXR0aW5nIGRvd24gYmVjYXVzZSB3ZSB3YWl0ZWQgYCArXG4gICAgICAgICAgYCR7dGhpcy5uZXdDb21tYW5kVGltZW91dE1zIC8gMTAwMC4wfSBzZWNvbmRzIGZvciBhIGNvbW1hbmRgLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XG4gICAgICAgIGBOZXcgQ29tbWFuZCBUaW1lb3V0IG9mIGAgK1xuICAgICAgICBgJHt0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMgLyAxMDAwLjB9IHNlY29uZHMgYCArXG4gICAgICAgIGBleHBpcmVkLiBUcnkgY3VzdG9taXppbmcgdGhlIHRpbWVvdXQgdXNpbmcgdGhlIGAgK1xuICAgICAgICBgJ25ld0NvbW1hbmRUaW1lb3V0JyBkZXNpcmVkIGNhcGFiaWxpdHlgO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7XG4gICAgfSwgdGhpcy5uZXdDb21tYW5kVGltZW91dE1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVNlcnZlcn0gc2VydmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBob3N0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBhc3NpZ25TZXJ2ZXIgKHNlcnZlciwgaG9zdCwgcG9ydCwgcGF0aCkge1xuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuICAgIHRoaXMuc2VydmVySG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5zZXJ2ZXJQb3J0ID0gcG9ydDtcbiAgICB0aGlzLnNlcnZlclBhdGggPSBwYXRoO1xuICB9XG5cbiAgLypcbiAgICAqIFJlc3RhcnQgdGhlIHNlc3Npb24gd2l0aCB0aGUgb3JpZ2luYWwgY2FwcyxcbiAgICAqIHByZXNlcnZpbmcgdGhlIHRpbWVvdXQgY29uZmlnLlxuICAgICovXG4gIGFzeW5jIHJlc2V0ICgpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnUmVzZXR0aW5nIGFwcCBtaWQtc2Vzc2lvbicpO1xuICAgIHRoaXMubG9nLmRlYnVnKCdSdW5uaW5nIGdlbmVyaWMgZnVsbCByZXNldCcpO1xuXG4gICAgLy8gcHJlc2VydmluZyBzdGF0ZVxuICAgIGxldCBjdXJyZW50Q29uZmlnID0ge307XG4gICAgZm9yIChsZXQgcHJvcGVydHkgb2YgW1xuICAgICAgJ2ltcGxpY2l0V2FpdE1zJyxcbiAgICAgICduZXdDb21tYW5kVGltZW91dE1zJyxcbiAgICAgICdzZXNzaW9uSWQnLFxuICAgICAgJ3Jlc2V0T25VbmV4cGVjdGVkU2h1dGRvd24nLFxuICAgIF0pIHtcbiAgICAgIGN1cnJlbnRDb25maWdbcHJvcGVydHldID0gdGhpc1twcm9wZXJ0eV07XG4gICAgfVxuXG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIHByZXNlcnZlIHRoZSB1bmV4cGVjdGVkIHNodXRkb3duLCBhbmQgbWFrZSBzdXJlIGl0IGlzIG5vdCBjYW5jZWxsZWQgZHVyaW5nIHJlc2V0LlxuICAgIHRoaXMucmVzZXRPblVuZXhwZWN0ZWRTaHV0ZG93biA9ICgpID0+IHt9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNlc3Npb25JZCAhPT0gbnVsbCkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24odGhpcy5zZXNzaW9uSWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoJ1Jlc3RhcnRpbmcgYXBwJyk7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZVNlc3Npb24odGhpcy5vcmlnaW5hbENhcHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBhbHdheXMgcmVzdG9yZSBzdGF0ZS5cbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMoY3VycmVudENvbmZpZykpIHtcbiAgICAgICAgdGhpc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2xlYXJOZXdDb21tYW5kVGltZW91dCgpO1xuICB9XG5cbiAgLyoqXG4gICAgICpcbiAgICAgKiBIaXN0b3JpY2FsbHkgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgd2VyZSByZXNlcnZlZCBmb3IgSlNPTldQIGNhcGFiaWxpdGllcy5cbiAgICAgKiBBcHBpdW0gMiBoYXMgZHJvcHBlZCB0aGUgc3VwcG9ydCBvZiB0aGVzZSwgc28gbm93IHdlIG9ubHkgYWNjZXB0IGNhcGFiaWxpdHlcbiAgICAgKiBvYmplY3RzIGluIFczQyBmb3JtYXQgYW5kIHRodXMgYWxsb3cgYW55IG9mIHRoZSB0aHJlZSBhcmd1bWVudHMgdG8gcmVwcmVzZW50XG4gICAgICogdGhlIGxhdHRlci5cbiAgICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllc30gdzNjQ2FwYWJpbGl0aWVzMVxuICAgICAqIEBwYXJhbSB7VzNDQ2FwYWJpbGl0aWVzfSBbdzNjQ2FwYWJpbGl0aWVzMl1cbiAgICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllc30gW3czY0NhcGFiaWxpdGllc11cbiAgICAgKiBAcGFyYW0ge0RyaXZlckRhdGFbXX0gW2RyaXZlckRhdGFdXG4gICAgICogQHJldHVybnMge1Byb21pc2U8W3N0cmluZyxvYmplY3RdPn1cbiAgICAgKi9cbiAgYXN5bmMgY3JlYXRlU2Vzc2lvbiAoXG4gICAgdzNjQ2FwYWJpbGl0aWVzMSxcbiAgICB3M2NDYXBhYmlsaXRpZXMyLFxuICAgIHczY0NhcGFiaWxpdGllcyxcbiAgICBkcml2ZXJEYXRhLFxuICApIHtcbiAgICBpZiAodGhpcy5zZXNzaW9uSWQgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihcbiAgICAgICAgICAgJ0Nhbm5vdCBjcmVhdGUgYSBuZXcgc2Vzc2lvbiB3aGlsZSBvbmUgaXMgaW4gcHJvZ3Jlc3MnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZygpO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxDYXBzID0gXy5jbG9uZURlZXAoW1xuICAgICAgdzNjQ2FwYWJpbGl0aWVzLFxuICAgICAgdzNjQ2FwYWJpbGl0aWVzMSxcbiAgICAgIHczY0NhcGFiaWxpdGllczIsXG4gICAgXS5maW5kKGlzVzNjQ2FwcykpO1xuICAgIGlmICghb3JpZ2luYWxDYXBzKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoXG4gICAgICAgICAgICdBcHBpdW0gb25seSBzdXBwb3J0cyBXM0Mtc3R5bGUgY2FwYWJpbGl0eSBvYmplY3RzLiAnICtcbiAgICAgICAgICAgICAnWW91ciBjbGllbnQgaXMgc2VuZGluZyBhbiBvbGRlciBjYXBhYmlsaXRpZXMgZm9ybWF0LiBQbGVhc2UgdXBkYXRlIHlvdXIgY2xpZW50IGxpYnJhcnkuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRQcm90b2NvbFczQygpO1xuXG4gICAgdGhpcy5vcmlnaW5hbENhcHMgPSBfLmNsb25lRGVlcChvcmlnaW5hbENhcHMpO1xuICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIHNlc3Npb24gd2l0aCBXM0MgY2FwYWJpbGl0aWVzOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICBvcmlnaW5hbENhcHMsXG4gICAgICAgIG51bGwsXG4gICAgICAgIDIsXG4gICAgICApfWAsXG4gICAgKTtcblxuICAgIGxldCBjYXBzO1xuICAgIHRyeSB7XG4gICAgICBjYXBzID0gcHJvY2Vzc0NhcGFiaWxpdGllcyhcbiAgICAgICAgICAgb3JpZ2luYWxDYXBzLFxuICAgICAgICAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyxcbiAgICAgICAgICAgdGhpcy5zaG91bGRWYWxpZGF0ZUNhcHMsXG4gICAgICApO1xuICAgICAgaWYgKGNhcHNbQVBQSVVNX09QVFNfQ0FQXSkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICBgRm91bmQgJHtQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVB9IGNhcGFiaWxpdHkgcHJlc2VudDsgd2lsbCBwcm9tb3RlIGl0ZW1zIGluc2lkZSB0byBjYXBzYCxcbiAgICAgICAgKTtcbiAgICAgICAgY2FwcyA9IHByb21vdGVBcHBpdW1PcHRpb25zKGNhcHMpO1xuICAgICAgfVxuICAgICAgY2FwcyA9IGZpeENhcHMoY2FwcywgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsIHRoaXMubG9nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoZS5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcyk7XG5cbiAgICB0aGlzLnNlc3Npb25JZCA9IHV0aWwudXVpZFY0KCk7XG4gICAgdGhpcy5jYXBzID0gY2FwcztcbiAgICB0aGlzLm9wdHMgPSBfLmNsb25lRGVlcCh0aGlzLmluaXRpYWxPcHRzKTtcblxuICAgIC8vIG1lcmdlIGNhcHMgb250byBvcHRzIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgd2hhdCdzIHdoZXJlXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIHRoaXMuY2Fwcyk7XG5cbiAgICAvLyBkZWFsIHdpdGggcmVzZXRzXG4gICAgLy8gc29tZSBwZW9wbGUgbGlrZSB0byBkbyB3ZWlyZCB0aGluZ3MgYnkgc2V0dGluZyBub1Jlc2V0IGFuZCBmdWxsUmVzZXRcbiAgICAvLyBib3RoIHRvIHRydWUsIGJ1dCB0aGlzIGlzIG1pc2d1aWRlZCBhbmQgc3RyYW5nZSwgc28gZXJyb3IgaGVyZSBpbnN0ZWFkXG4gICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ICYmIHRoaXMub3B0cy5mdWxsUmVzZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgXCJUaGUgJ25vUmVzZXQnIGFuZCAnZnVsbFJlc2V0JyBjYXBhYmlsaXRpZXMgYXJlIG11dHVhbGx5IFwiICtcbiAgICAgICAgICAgICAnZXhjbHVzaXZlIGFuZCBzaG91bGQgbm90IGJvdGggYmUgc2V0IHRvIHRydWUuIFlvdSAnICtcbiAgICAgICAgICAgICBcInByb2JhYmx5IG1lYW50IHRvIGp1c3QgdXNlICdmdWxsUmVzZXQnIG9uIGl0cyBvd25cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdHMubm9SZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5vcHRzLmZ1bGxSZXNldCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5vcHRzLm5vUmVzZXQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5vcHRzLmZhc3RSZXNldCA9ICF0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMubm9SZXNldDtcbiAgICB0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCA9IHRoaXMub3B0cy5mYXN0UmVzZXQgfHwgdGhpcy5vcHRzLm5vUmVzZXQ7XG5cbiAgICAvLyBQcmV2ZW50cyBlbXB0eSBzdHJpbmcgY2FwcyBzbyB3ZSBkb24ndCBuZWVkIHRvIHRlc3QgaXQgZXZlcnl3aGVyZVxuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRzLmFwcCA9PT0gJ3N0cmluZycgJiYgdGhpcy5vcHRzLmFwcC50cmltKCkgPT09ICcnKSB7XG4gICAgICBkZWxldGUgdGhpcy5vcHRzLmFwcDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5jYXBzLm5ld0NvbW1hbmRUaW1lb3V0KSkge1xuICAgICAgdGhpcy5uZXdDb21tYW5kVGltZW91dE1zID0gdGhpcy5jYXBzLm5ld0NvbW1hbmRUaW1lb3V0ICogMTAwMDtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2cucHJlZml4ID0gaGVscGVycy5nZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCh0aGlzLCB0aGlzLnNlc3Npb25JZCk7XG5cbiAgICB0aGlzLmxvZy5pbmZvKGBTZXNzaW9uIGNyZWF0ZWQgd2l0aCBzZXNzaW9uIGlkOiAke3RoaXMuc2Vzc2lvbklkfWApO1xuXG4gICAgcmV0dXJuIFt0aGlzLnNlc3Npb25JZCwgY2Fwc107XG4gIH1cblxuICAvKipcbiAgICAqXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gW3Nlc3Npb25JZF1cbiAgICAqIEBwYXJhbSB7RHJpdmVyRGF0YVtdfSBbZHJpdmVyRGF0YV1cbiAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgICovXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKHNlc3Npb25JZCwgZHJpdmVyRGF0YSkge1xuICAgIGF3YWl0IHRoaXMuY2xlYXJOZXdDb21tYW5kVGltZW91dCgpO1xuICAgIGlmICh0aGlzLmlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQgJiYgdGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQuaXNCdXN5KCkpIHtcbiAgICAgIC8vIHNpbXBsZSBoYWNrIHRvIHJlbGVhc2UgcGVuZGluZyBjb21tYW5kcyBpZiB0aGV5IGV4aXN0XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBfLmtleXModGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQucXVldWVzKSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuY29tbWFuZHNRdWV1ZUd1YXJkLnF1ZXVlc1trZXldID0gW107XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2Vzc2lvbklkID0gbnVsbDtcbiAgICB0aGlzLl9sb2cucHJlZml4ID0gaGVscGVycy5nZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCh0aGlzKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgZW5zdXJlcyB0aGF0IGFsbCBvZiB0aGUgbWl4aW5zIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSBkZXNjcmliZWQgaW4ge0BsaW5rY29kZSBEcml2ZXJ9LlxuICogQGltcGxlbWVudHMge0RyaXZlcn1cbiAqL1xuY2xhc3MgQmFzZURyaXZlciBleHRlbmRzIGNyZWF0ZUJhc2VEcml2ZXJDbGFzcyhCYXNlRHJpdmVyQ29yZSkge31cbmV4cG9ydCB7IEJhc2VEcml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IEJhc2VEcml2ZXI7XG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkhUVFBNZXRob2R9IEhUVFBNZXRob2RcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJ9IERyaXZlclxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkV4dGVybmFsRHJpdmVyfSBFeHRlcm5hbERyaXZlclxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNhcGFiaWxpdGllc30gQ2FwYWJpbGl0aWVzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuVzNDQ2FwYWJpbGl0aWVzfSBXM0NDYXBhYmlsaXRpZXNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJEYXRhfSBEcml2ZXJEYXRhXG4gKi9cblxuXG4vKipcbiAqIEBjYWxsYmFjayBVcGRhdGVTZXJ2ZXJDYWxsYmFja1xuICogQHBhcmFtIHtpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzfSBhcHAgLSBFeHByZXNzIGFwcFxuICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5BcHBpdW1TZXJ2ZXJ9IGh0dHBTZXJ2ZXIgLSBIVFRQIHNlcnZlclxuICogQHJldHVybnMge2ltcG9ydCgndHlwZS1mZXN0JykuUHJvbWlzYWJsZTx2b2lkPn1cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdXNlZCB0byBleHRlbmQge0BsaW5rY29kZSBCYXNlRHJpdmVyQ29yZX0gYnkgdGhlIG1peGlucyBhbmQgYWxzbyBleHRlcm5hbCBkcml2ZXJzLlxuICogQHRlbXBsYXRlIFtQcm90bz17fV1cbiAqIEB0ZW1wbGF0ZSBbU3RhdGljPXt9XVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNsYXNzPEJhc2VEcml2ZXJDb3JlICYgUHJvdG8sQmFzZURyaXZlclN0YXRpYyAmIFN0YXRpYz59IEJhc2VEcml2ZXJCYXNlXG4gKi9cblxuLyoqXG4gKiBTdGF0aWMgcHJvcGVydGllcyBvZiBgQmFzZURyaXZlcmAgYW5kIG9wdGlvbmFsIHByb3BlcnRpZXMgZm9yIHN1YmNsYXNzZXMuXG4gKiBAdGVtcGxhdGUge0V4dGVybmFsRHJpdmVyfSBbVD1FeHRlcm5hbERyaXZlcl1cbiAqIEB0eXBlZGVmIEJhc2VEcml2ZXJTdGF0aWNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBiYXNlVmVyc2lvblxuICogQHByb3BlcnR5IHtVcGRhdGVTZXJ2ZXJDYWxsYmFja30gW3VwZGF0ZVNlcnZlcl1cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuTWV0aG9kTWFwPFQ+fSBbbmV3TWV0aG9kTWFwXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlNlc3Npb25IYW5kbGVyPFtzdHJpbmcsIG9iamVjdF0sdm9pZD59IFNlc3Npb25IYW5kbGVyXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFNQTs7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
|
|
285
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFVkVOVF9TRVNTSU9OX0lOSVQiLCJFVkVOVF9TRVNTSU9OX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX0RPTkUiLCJPTl9VTkVYUEVDVEVEX1NIVVRET1dOX0VWRU5UIiwiQmFzZURyaXZlckNvcmUiLCJEcml2ZXJDb3JlIiwiX2NvbnN0cmFpbnRzIiwiXyIsImNsb25lRGVlcCIsImRlc2lyZWRDYXBhYmlsaXR5Q29uc3RyYWludHMiLCJjbGlBcmdzIiwiZXhlY3V0ZUNvbW1hbmQiLCJjbWQiLCJhcmdzIiwic3RhcnRUaW1lIiwiRGF0ZSIsIm5vdyIsInByb3RvY29sIiwiZGV0ZXJtaW5lUHJvdG9jb2wiLCJsb2dFdmVudCIsIkRFTEVURV9TRVNTSU9OX0NPTU1BTkQiLCJjbGVhck5ld0NvbW1hbmRUaW1lb3V0Iiwic2h1dGRvd25VbmV4cGVjdGVkbHkiLCJlcnJvcnMiLCJOb1N1Y2hEcml2ZXJFcnJvciIsIk5vdFlldEltcGxlbWVudGVkRXJyb3IiLCJ1bmV4cGVjdGVkU2h1dGRvd25MaXN0ZW5lciIsImNvbW1hbmRFeGVjdXRvciIsIkIiLCJyYWNlIiwicmVzb2x2ZSIsInJlamVjdCIsImV2ZW50RW1pdHRlciIsIm9uIiwiZmluYWxseSIsInJlbW92ZUxpc3RlbmVyIiwicmVzIiwiaXNDb21tYW5kc1F1ZXVlRW5hYmxlZCIsImNvbW1hbmRzUXVldWVHdWFyZCIsImFjcXVpcmUiLCJCYXNlRHJpdmVyIiwibmFtZSIsInN0YXJ0TmV3Q29tbWFuZFRpbWVvdXQiLCJlbmRUaW1lIiwiX2V2ZW50SGlzdG9yeSIsImNvbW1hbmRzIiwicHVzaCIsInN0YXJ0VW5leHBlY3RlZFNodXRkb3duIiwiZXJyIiwiZW1pdCIsInNlc3Npb25JZCIsImRlbGV0ZVNlc3Npb24iLCJuZXdDb21tYW5kVGltZW91dE1zIiwibm9Db21tYW5kVGltZXIiLCJzZXRUaW1lb3V0IiwibG9nIiwid2FybiIsImVycm9yTWVzc2FnZSIsIkVycm9yIiwiYXNzaWduU2VydmVyIiwic2VydmVyIiwiaG9zdCIsInBvcnQiLCJwYXRoIiwic2VydmVySG9zdCIsInNlcnZlclBvcnQiLCJzZXJ2ZXJQYXRoIiwicmVzZXQiLCJkZWJ1ZyIsImN1cnJlbnRDb25maWciLCJwcm9wZXJ0eSIsInJlc2V0T25VbmV4cGVjdGVkU2h1dGRvd24iLCJjcmVhdGVTZXNzaW9uIiwib3JpZ2luYWxDYXBzIiwia2V5IiwidmFsdWUiLCJ0b1BhaXJzIiwidzNjQ2FwYWJpbGl0aWVzMSIsInczY0NhcGFiaWxpdGllczIiLCJ3M2NDYXBhYmlsaXRpZXMiLCJkcml2ZXJEYXRhIiwiU2Vzc2lvbk5vdENyZWF0ZWRFcnJvciIsImZpbmQiLCJpc1czY0NhcHMiLCJzZXRQcm90b2NvbFczQyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjYXBzIiwicHJvY2Vzc0NhcGFiaWxpdGllcyIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsIkFQUElVTV9PUFRTX0NBUCIsIlBSRUZJWEVEX0FQUElVTV9PUFRTX0NBUCIsInByb21vdGVBcHBpdW1PcHRpb25zIiwiZml4Q2FwcyIsImUiLCJtZXNzYWdlIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsInV0aWwiLCJ1dWlkVjQiLCJvcHRzIiwiaW5pdGlhbE9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJub1Jlc2V0IiwiZnVsbFJlc2V0IiwiZmFzdFJlc2V0Iiwic2tpcFVuaW5zdGFsbCIsImFwcCIsInRyaW0iLCJpc1VuZGVmaW5lZCIsIm5ld0NvbW1hbmRUaW1lb3V0IiwiX2xvZyIsInByZWZpeCIsImhlbHBlcnMiLCJnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCIsImluZm8iLCJpc0J1c3kiLCJrZXlzIiwicXVldWVzIiwibG9nRXh0cmFDYXBzIiwiZXh0cmFDYXBzIiwiZGlmZmVyZW5jZSIsImxlbmd0aCIsImNhcCIsInZhbGlkYXRlQ2FwcyIsImVycm9yQW5kVGhyb3ciLCJjb25zdHJhaW50cyIsInByZXNlbmNlIiwiYWxsb3dFbXB0eSIsIl9CYXNlRHJpdmVyIiwiY3JlYXRlQmFzZURyaXZlckNsYXNzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2Jhc2Vkcml2ZXIvZHJpdmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHJlcXVpcmUtYXdhaXQgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5cbmltcG9ydCB7XG4gIHZhbGlkYXRlQ2FwcyxcbiAgQVBQSVVNX09QVFNfQ0FQLFxuICBQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVAsXG4gIHByb2Nlc3NDYXBhYmlsaXRpZXMsXG4gIHByb21vdGVBcHBpdW1PcHRpb25zLFxufSBmcm9tICcuL2NhcGFiaWxpdGllcyc7XG5pbXBvcnQge0RyaXZlckNvcmV9IGZyb20gJy4vY29yZSc7XG5pbXBvcnQge3V0aWx9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtmaXhDYXBzLCBpc1czY0NhcHN9IGZyb20gJy4uL2hlbHBlcnMvY2FwYWJpbGl0aWVzJztcbmltcG9ydCB7REVMRVRFX1NFU1NJT05fQ09NTUFORCwgZGV0ZXJtaW5lUHJvdG9jb2wsIGVycm9yc30gZnJvbSAnLi4vcHJvdG9jb2wnO1xuaW1wb3J0IHtjcmVhdGVCYXNlRHJpdmVyQ2xhc3N9IGZyb20gJy4vY29tbWFuZHMnO1xuaW1wb3J0IGhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7ZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50c30gZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuXG5jb25zdCBFVkVOVF9TRVNTSU9OX0lOSVQgPSAnbmV3U2Vzc2lvblJlcXVlc3RlZCc7XG5jb25zdCBFVkVOVF9TRVNTSU9OX1NUQVJUID0gJ25ld1Nlc3Npb25TdGFydGVkJztcbmNvbnN0IEVWRU5UX1NFU1NJT05fUVVJVF9TVEFSVCA9ICdxdWl0U2Vzc2lvblJlcXVlc3RlZCc7XG5jb25zdCBFVkVOVF9TRVNTSU9OX1FVSVRfRE9ORSA9ICdxdWl0U2Vzc2lvbkZpbmlzaGVkJztcbmNvbnN0IE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQgPSAnb25VbmV4cGVjdGVkU2h1dGRvd24nO1xuXG4vKipcbiAqIEBpbXBsZW1lbnRzIHtTZXNzaW9uSGFuZGxlcn1cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VEcml2ZXJDb3JlIGV4dGVuZHMgRHJpdmVyQ29yZSB7XG4gIF9jb25zdHJhaW50cyA9IF8uY2xvbmVEZWVwKGRlc2lyZWRDYXBhYmlsaXR5Q29uc3RyYWludHMpO1xuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxhbnk+fHVuZGVmaW5lZH0gKi9cbiAgY2xpQXJncztcblxuICAvLyBUaGlzIGlzIHRoZSBtYWluIGNvbW1hbmQgaGFuZGxlciBmb3IgdGhlIGRyaXZlci4gSXQgd3JhcHMgY29tbWFuZFxuICAvLyBleGVjdXRpb24gd2l0aCB0aW1lb3V0IGxvZ2ljLCBjaGVja2luZyB0aGF0IHdlIGhhdmUgYSB2YWxpZCBzZXNzaW9uLFxuICAvLyBhbmQgZW5zdXJpbmcgdGhhdCB3ZSBleGVjdXRlIGNvbW1hbmRzIG9uZSBhdCBhIHRpbWUuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZFxuICAvLyBieSBNSlNPTldQJ3MgZXhwcmVzcyByb3V0ZXIuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY21kXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKSB7XG4gICAgLy8gZ2V0IHN0YXJ0IHRpbWUgZm9yIHRoaXMgY29tbWFuZCwgYW5kIGxvZyBpbiBzcGVjaWFsIGNhc2VzXG4gICAgbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICBpZiAoY21kID09PSAnY3JlYXRlU2Vzc2lvbicpIHtcbiAgICAgIC8vIElmIGNyZWF0aW5nIGEgc2Vzc2lvbiBkZXRlcm1pbmUgaWYgVzNDIG9yIE1KU09OV1AgcHJvdG9jb2wgd2FzIHJlcXVlc3RlZCBhbmQgcmVtZW1iZXIgdGhlIGNob2ljZVxuICAgICAgdGhpcy5wcm90b2NvbCA9IGRldGVybWluZVByb3RvY29sKGFyZ3MpO1xuICAgICAgdGhpcy5sb2dFdmVudChFVkVOVF9TRVNTSU9OX0lOSVQpO1xuICAgIH0gZWxzZSBpZiAoY21kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fUVVJVF9TVEFSVCk7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgaGFkIGEgY29tbWFuZCB0aW1lciBydW5uaW5nLCBjbGVhciBpdCBub3cgdGhhdCB3ZSdyZSBzdGFydGluZ1xuICAgIC8vIGEgbmV3IGNvbW1hbmQgYW5kIHNvIGRvbid0IHdhbnQgdG8gdGltZSBvdXRcbiAgICBhd2FpdCB0aGlzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKTtcblxuICAgIGlmICh0aGlzLnNodXRkb3duVW5leHBlY3RlZGx5KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaERyaXZlckVycm9yKCdUaGUgZHJpdmVyIHdhcyB1bmV4cGVjdGVkbHkgc2h1dCBkb3duIScpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBjb21tYW5kLCBpdCBtdXN0IG5vdCBiZSBpbXBsZW1lbnRlZFxuICAgIGlmICghdGhpc1tjbWRdKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdFlldEltcGxlbWVudGVkRXJyb3IoKTtcbiAgICB9XG5cbiAgICBsZXQgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXI7XG4gICAgY29uc3QgY29tbWFuZEV4ZWN1dG9yID0gYXN5bmMgKCkgPT5cbiAgICAgIGF3YWl0IEIucmFjZShbXG4gICAgICAgIHRoaXNbY21kXSguLi5hcmdzKSxcbiAgICAgICAgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyID0gcmVqZWN0O1xuICAgICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLm9uKE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsIHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyKTtcbiAgICAgICAgfSksXG4gICAgICBdKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgaWYgKHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5yZW1vdmVMaXN0ZW5lcihcbiAgICAgICAgICAgIE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsXG4gICAgICAgICAgICB1bmV4cGVjdGVkU2h1dGRvd25MaXN0ZW5lclxuICAgICAgICAgICk7XG4gICAgICAgICAgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBjb25zdCByZXMgPSB0aGlzLmlzQ29tbWFuZHNRdWV1ZUVuYWJsZWRcbiAgICAgID8gYXdhaXQgdGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQuYWNxdWlyZShCYXNlRHJpdmVyLm5hbWUsIGNvbW1hbmRFeGVjdXRvcilcbiAgICAgIDogYXdhaXQgY29tbWFuZEV4ZWN1dG9yKCk7XG5cbiAgICAvLyBpZiB3ZSBoYXZlIHNldCBhIG5ldyBjb21tYW5kIHRpbWVvdXQgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSwgc3RhcnQgYVxuICAgIC8vIHRpbWVyIG9uY2Ugd2UndmUgZmluaXNoZWQgZXhlY3V0aW5nIHRoaXMgY29tbWFuZC4gSWYgd2UgZG9uJ3QgY2xlYXJcbiAgICAvLyB0aGUgdGltZXIgKHdoaWNoIGlzIGRvbmUgd2hlbiBhIG5ldyBjb21tYW5kIGNvbWVzIGluKSwgd2Ugd2lsbCB0cmlnZ2VyXG4gICAgLy8gYXV0b21hdGljIHNlc3Npb24gZGVsZXRpb24gaW4gdGhpcy5vbkNvbW1hbmRUaW1lb3V0LiBPZiBjb3Vyc2Ugd2UgZG9uJ3RcbiAgICAvLyB3YW50IHRvIHRyaWdnZXIgdGhlIHRpbWVyIHdoZW4gdGhlIHVzZXIgaXMgc2h1dHRpbmcgZG93biB0aGUgc2Vzc2lvblxuICAgIC8vIGludGVudGlvbmFsbHlcbiAgICBpZiAodGhpcy5pc0NvbW1hbmRzUXVldWVFbmFibGVkICYmIGNtZCAhPT0gREVMRVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgLy8gcmVzZXR0aW5nIGV4aXN0aW5nIHRpbWVvdXRcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnROZXdDb21tYW5kVGltZW91dCgpO1xuICAgIH1cblxuICAgIC8vIGxvZyB0aW1pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb21tYW5kXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5fZXZlbnRIaXN0b3J5LmNvbW1hbmRzLnB1c2goe2NtZCwgc3RhcnRUaW1lLCBlbmRUaW1lfSk7XG4gICAgaWYgKGNtZCA9PT0gJ2NyZWF0ZVNlc3Npb24nKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fU1RBUlQpO1xuICAgIH0gZWxzZSBpZiAoY21kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fUVVJVF9ET05FKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICAgKi9cbiAgYXN5bmMgc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24oXG4gICAgZXJyID0gbmV3IGVycm9ycy5Ob1N1Y2hEcml2ZXJFcnJvcignVGhlIGRyaXZlciB3YXMgdW5leHBlY3RlZGx5IHNodXQgZG93biEnKVxuICApIHtcbiAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsIGVycik7IC8vIGFsbG93IG90aGVycyB0byBsaXN0ZW4gZm9yIHRoaXNcbiAgICB0aGlzLnNodXRkb3duVW5leHBlY3RlZGx5ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2Vzc2lvbklkICE9PSBudWxsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbih0aGlzLnNlc3Npb25JZCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc2h1dGRvd25VbmV4cGVjdGVkbHkgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydE5ld0NvbW1hbmRUaW1lb3V0KCkge1xuICAgIC8vIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gcm9ndWUgdGltZW91dHNcbiAgICBhd2FpdCB0aGlzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKTtcblxuICAgIC8vIGlmIGNvbW1hbmQgdGltZW91dCBpcyAwLCBpdCBpcyBkaXNhYmxlZFxuICAgIGlmICghdGhpcy5uZXdDb21tYW5kVGltZW91dE1zKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcblxuICAgIHRoaXMubm9Db21tYW5kVGltZXIgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMubG9nLndhcm4oXG4gICAgICAgIGBTaHV0dGluZyBkb3duIGJlY2F1c2Ugd2Ugd2FpdGVkIGAgK1xuICAgICAgICAgIGAke3RoaXMubmV3Q29tbWFuZFRpbWVvdXRNcyAvIDEwMDAuMH0gc2Vjb25kcyBmb3IgYSBjb21tYW5kYFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XG4gICAgICAgIGBOZXcgQ29tbWFuZCBUaW1lb3V0IG9mIGAgK1xuICAgICAgICBgJHt0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMgLyAxMDAwLjB9IHNlY29uZHMgYCArXG4gICAgICAgIGBleHBpcmVkLiBUcnkgY3VzdG9taXppbmcgdGhlIHRpbWVvdXQgdXNpbmcgdGhlIGAgK1xuICAgICAgICBgJ25ld0NvbW1hbmRUaW1lb3V0JyBkZXNpcmVkIGNhcGFiaWxpdHlgO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7XG4gICAgfSwgdGhpcy5uZXdDb21tYW5kVGltZW91dE1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVNlcnZlcn0gc2VydmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBob3N0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBhc3NpZ25TZXJ2ZXIoc2VydmVyLCBob3N0LCBwb3J0LCBwYXRoKSB7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy5zZXJ2ZXJIb3N0ID0gaG9zdDtcbiAgICB0aGlzLnNlcnZlclBvcnQgPSBwb3J0O1xuICAgIHRoaXMuc2VydmVyUGF0aCA9IHBhdGg7XG4gIH1cblxuICAvKlxuICAgKiBSZXN0YXJ0IHRoZSBzZXNzaW9uIHdpdGggdGhlIG9yaWdpbmFsIGNhcHMsXG4gICAqIHByZXNlcnZpbmcgdGhlIHRpbWVvdXQgY29uZmlnLlxuICAgKi9cbiAgYXN5bmMgcmVzZXQoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ1Jlc2V0dGluZyBhcHAgbWlkLXNlc3Npb24nKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnUnVubmluZyBnZW5lcmljIGZ1bGwgcmVzZXQnKTtcblxuICAgIC8vIHByZXNlcnZpbmcgc3RhdGVcbiAgICBsZXQgY3VycmVudENvbmZpZyA9IHt9O1xuICAgIGZvciAobGV0IHByb3BlcnR5IG9mIFtcbiAgICAgICdpbXBsaWNpdFdhaXRNcycsXG4gICAgICAnbmV3Q29tbWFuZFRpbWVvdXRNcycsXG4gICAgICAnc2Vzc2lvbklkJyxcbiAgICAgICdyZXNldE9uVW5leHBlY3RlZFNodXRkb3duJyxcbiAgICBdKSB7XG4gICAgICBjdXJyZW50Q29uZmlnW3Byb3BlcnR5XSA9IHRoaXNbcHJvcGVydHldO1xuICAgIH1cblxuICAgIC8vIFdlIGFsc28gbmVlZCB0byBwcmVzZXJ2ZSB0aGUgdW5leHBlY3RlZCBzaHV0ZG93biwgYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3QgY2FuY2VsbGVkIGR1cmluZyByZXNldC5cbiAgICB0aGlzLnJlc2V0T25VbmV4cGVjdGVkU2h1dGRvd24gPSAoKSA9PiB7fTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zZXNzaW9uSWQgIT09IG51bGwpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKHRoaXMuc2Vzc2lvbklkKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKCdSZXN0YXJ0aW5nIGFwcCcpO1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVTZXNzaW9uKHRoaXMub3JpZ2luYWxDYXBzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gYWx3YXlzIHJlc3RvcmUgc3RhdGUuXG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKGN1cnJlbnRDb25maWcpKSB7XG4gICAgICAgIHRoaXNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBIaXN0b3JpY2FsbHkgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgd2VyZSByZXNlcnZlZCBmb3IgSlNPTldQIGNhcGFiaWxpdGllcy5cbiAgICogQXBwaXVtIDIgaGFzIGRyb3BwZWQgdGhlIHN1cHBvcnQgb2YgdGhlc2UsIHNvIG5vdyB3ZSBvbmx5IGFjY2VwdCBjYXBhYmlsaXR5XG4gICAqIG9iamVjdHMgaW4gVzNDIGZvcm1hdCBhbmQgdGh1cyBhbGxvdyBhbnkgb2YgdGhlIHRocmVlIGFyZ3VtZW50cyB0byByZXByZXNlbnRcbiAgICogdGhlIGxhdHRlci5cbiAgICogQHBhcmFtIHtXM0NDYXBhYmlsaXRpZXN9IHczY0NhcGFiaWxpdGllczFcbiAgICogQHBhcmFtIHtXM0NDYXBhYmlsaXRpZXN9IFt3M2NDYXBhYmlsaXRpZXMyXVxuICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllc30gW3czY0NhcGFiaWxpdGllc11cbiAgICogQHBhcmFtIHtEcml2ZXJEYXRhW119IFtkcml2ZXJEYXRhXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxbc3RyaW5nLG9iamVjdF0+fVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU2Vzc2lvbih3M2NDYXBhYmlsaXRpZXMxLCB3M2NDYXBhYmlsaXRpZXMyLCB3M2NDYXBhYmlsaXRpZXMsIGRyaXZlckRhdGEpIHtcbiAgICBpZiAodGhpcy5zZXNzaW9uSWQgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBjcmVhdGUgYSBuZXcgc2Vzc2lvbiB3aGlsZSBvbmUgaXMgaW4gcHJvZ3Jlc3MnXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmRlYnVnKCk7XG5cbiAgICBjb25zdCBvcmlnaW5hbENhcHMgPSBfLmNsb25lRGVlcChcbiAgICAgIFt3M2NDYXBhYmlsaXRpZXMsIHczY0NhcGFiaWxpdGllczEsIHczY0NhcGFiaWxpdGllczJdLmZpbmQoaXNXM2NDYXBzKVxuICAgICk7XG4gICAgaWYgKCFvcmlnaW5hbENhcHMpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihcbiAgICAgICAgJ0FwcGl1bSBvbmx5IHN1cHBvcnRzIFczQy1zdHlsZSBjYXBhYmlsaXR5IG9iamVjdHMuICcgK1xuICAgICAgICAgICdZb3VyIGNsaWVudCBpcyBzZW5kaW5nIGFuIG9sZGVyIGNhcGFiaWxpdGllcyBmb3JtYXQuIFBsZWFzZSB1cGRhdGUgeW91ciBjbGllbnQgbGlicmFyeS4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuc2V0UHJvdG9jb2xXM0MoKTtcblxuICAgIHRoaXMub3JpZ2luYWxDYXBzID0gXy5jbG9uZURlZXAob3JpZ2luYWxDYXBzKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBzZXNzaW9uIHdpdGggVzNDIGNhcGFiaWxpdGllczogJHtKU09OLnN0cmluZ2lmeShvcmlnaW5hbENhcHMsIG51bGwsIDIpfWBcbiAgICApO1xuXG4gICAgbGV0IGNhcHM7XG4gICAgdHJ5IHtcbiAgICAgIGNhcHMgPSBwcm9jZXNzQ2FwYWJpbGl0aWVzKG9yaWdpbmFsQ2FwcywgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsIHRoaXMuc2hvdWxkVmFsaWRhdGVDYXBzKTtcbiAgICAgIGlmIChjYXBzW0FQUElVTV9PUFRTX0NBUF0pIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYEZvdW5kICR7UFJFRklYRURfQVBQSVVNX09QVFNfQ0FQfSBjYXBhYmlsaXR5IHByZXNlbnQ7IHdpbGwgcHJvbW90ZSBpdGVtcyBpbnNpZGUgdG8gY2Fwc2BcbiAgICAgICAgKTtcbiAgICAgICAgY2FwcyA9IHByb21vdGVBcHBpdW1PcHRpb25zKGNhcHMpO1xuICAgICAgfVxuICAgICAgY2FwcyA9IGZpeENhcHMoY2FwcywgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsIHRoaXMubG9nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoZS5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcyk7XG5cbiAgICB0aGlzLnNlc3Npb25JZCA9IHV0aWwudXVpZFY0KCk7XG4gICAgdGhpcy5jYXBzID0gY2FwcztcbiAgICB0aGlzLm9wdHMgPSBfLmNsb25lRGVlcCh0aGlzLmluaXRpYWxPcHRzKTtcblxuICAgIC8vIG1lcmdlIGNhcHMgb250byBvcHRzIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgd2hhdCdzIHdoZXJlXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIHRoaXMuY2Fwcyk7XG5cbiAgICAvLyBkZWFsIHdpdGggcmVzZXRzXG4gICAgLy8gc29tZSBwZW9wbGUgbGlrZSB0byBkbyB3ZWlyZCB0aGluZ3MgYnkgc2V0dGluZyBub1Jlc2V0IGFuZCBmdWxsUmVzZXRcbiAgICAvLyBib3RoIHRvIHRydWUsIGJ1dCB0aGlzIGlzIG1pc2d1aWRlZCBhbmQgc3RyYW5nZSwgc28gZXJyb3IgaGVyZSBpbnN0ZWFkXG4gICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ICYmIHRoaXMub3B0cy5mdWxsUmVzZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUaGUgJ25vUmVzZXQnIGFuZCAnZnVsbFJlc2V0JyBjYXBhYmlsaXRpZXMgYXJlIG11dHVhbGx5IFwiICtcbiAgICAgICAgICAnZXhjbHVzaXZlIGFuZCBzaG91bGQgbm90IGJvdGggYmUgc2V0IHRvIHRydWUuIFlvdSAnICtcbiAgICAgICAgICBcInByb2JhYmx5IG1lYW50IHRvIGp1c3QgdXNlICdmdWxsUmVzZXQnIG9uIGl0cyBvd25cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLm9wdHMuZnVsbFJlc2V0ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLm9wdHMubm9SZXNldCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm9wdHMuZmFzdFJlc2V0ID0gIXRoaXMub3B0cy5mdWxsUmVzZXQgJiYgIXRoaXMub3B0cy5ub1Jlc2V0O1xuICAgIHRoaXMub3B0cy5za2lwVW5pbnN0YWxsID0gdGhpcy5vcHRzLmZhc3RSZXNldCB8fCB0aGlzLm9wdHMubm9SZXNldDtcblxuICAgIC8vIFByZXZlbnRzIGVtcHR5IHN0cmluZyBjYXBzIHNvIHdlIGRvbid0IG5lZWQgdG8gdGVzdCBpdCBldmVyeXdoZXJlXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMuYXBwID09PSAnc3RyaW5nJyAmJiB0aGlzLm9wdHMuYXBwLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdHMuYXBwO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLmNhcHMubmV3Q29tbWFuZFRpbWVvdXQpKSB7XG4gICAgICB0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMgPSB0aGlzLmNhcHMubmV3Q29tbWFuZFRpbWVvdXQgKiAxMDAwO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZy5wcmVmaXggPSBoZWxwZXJzLmdlbmVyYXRlRHJpdmVyTG9nUHJlZml4KHRoaXMsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIHRoaXMubG9nLmluZm8oYFNlc3Npb24gY3JlYXRlZCB3aXRoIHNlc3Npb24gaWQ6ICR7dGhpcy5zZXNzaW9uSWR9YCk7XG5cbiAgICByZXR1cm4gW3RoaXMuc2Vzc2lvbklkLCBjYXBzXTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Nlc3Npb25JZF1cbiAgICogQHBhcmFtIHtEcml2ZXJEYXRhW119IFtkcml2ZXJEYXRhXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24oc2Vzc2lvbklkLCBkcml2ZXJEYXRhKSB7XG4gICAgYXdhaXQgdGhpcy5jbGVhck5ld0NvbW1hbmRUaW1lb3V0KCk7XG4gICAgaWYgKHRoaXMuaXNDb21tYW5kc1F1ZXVlRW5hYmxlZCAmJiB0aGlzLmNvbW1hbmRzUXVldWVHdWFyZC5pc0J1c3koKSkge1xuICAgICAgLy8gc2ltcGxlIGhhY2sgdG8gcmVsZWFzZSBwZW5kaW5nIGNvbW1hbmRzIGlmIHRoZXkgZXhpc3RcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIF8ua2V5cyh0aGlzLmNvbW1hbmRzUXVldWVHdWFyZC5xdWV1ZXMpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQucXVldWVzW2tleV0gPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZXNzaW9uSWQgPSBudWxsO1xuICAgIHRoaXMuX2xvZy5wcmVmaXggPSBoZWxwZXJzLmdlbmVyYXRlRHJpdmVyTG9nUHJlZml4KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Q2FwYWJpbGl0aWVzfSBjYXBzXG4gICAqL1xuICBsb2dFeHRyYUNhcHMoY2Fwcykge1xuICAgIGxldCBleHRyYUNhcHMgPSBfLmRpZmZlcmVuY2UoXy5rZXlzKGNhcHMpLCBfLmtleXModGhpcy5fY29uc3RyYWludHMpKTtcbiAgICBpZiAoZXh0cmFDYXBzLmxlbmd0aCkge1xuICAgICAgdGhpcy5sb2cud2FybihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgY2FwYWJpbGl0aWVzIHdlcmUgcHJvdmlkZWQsIGJ1dCBhcmUgbm90IGAgKyBgcmVjb2duaXplZCBieSBBcHBpdW06YFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgY2FwIG9mIGV4dHJhQ2Fwcykge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGAgICR7Y2FwfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0NhcGFiaWxpdGllc30gY2Fwc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcykge1xuICAgIGlmICghdGhpcy5zaG91bGRWYWxpZGF0ZUNhcHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZUNhcHMoY2FwcywgdGhpcy5fY29uc3RyYWludHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coXG4gICAgICAgIG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihcbiAgICAgICAgICBgVGhlIGRlc2lyZWRDYXBhYmlsaXRpZXMgb2JqZWN0IHdhcyBub3QgdmFsaWQgZm9yIHRoZSBgICtcbiAgICAgICAgICAgIGBmb2xsb3dpbmcgcmVhc29uKHMpOiAke2UubWVzc2FnZX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2dFeHRyYUNhcHMoY2Fwcyk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHdlIG9ubHkgd2FudCBzdWJjbGFzc2VzIHRvIGV2ZXIgZXh0ZW5kIHRoZSBjb250cmFpbnRzXG4gIHNldCBkZXNpcmVkQ2FwQ29uc3RyYWludHMoY29uc3RyYWludHMpIHtcbiAgICB0aGlzLl9jb25zdHJhaW50cyA9IE9iamVjdC5hc3NpZ24odGhpcy5fY29uc3RyYWludHMsIGNvbnN0cmFpbnRzKTtcbiAgICAvLyAncHJlc2VuY2UnIG1lYW5zIGRpZmZlcmVudCB0aGluZ3MgaW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSB2YWxpZGF0b3IsXG4gICAgLy8gd2hlbiB3ZSBzYXkgJ3RydWUnIHdlIG1lYW4gdGhhdCBpdCBzaG91bGQgbm90IGJlIGFibGUgdG8gYmUgZW1wdHlcbiAgICBmb3IgKGNvbnN0IFssIHZhbHVlXSBvZiBfLnRvUGFpcnModGhpcy5fY29uc3RyYWludHMpKSB7XG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUucHJlc2VuY2UgPT09IHRydWUpIHtcbiAgICAgICAgdmFsdWUucHJlc2VuY2UgPSB7XG4gICAgICAgICAgYWxsb3dFbXB0eTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRlc2lyZWRDYXBDb25zdHJhaW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uc3RyYWludHM7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgb2YgdGhlIG1peGlucyBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgZGVzY3JpYmVkIGluIHtAbGlua2NvZGUgRHJpdmVyfS5cbiAqIEBpbXBsZW1lbnRzIHtEcml2ZXJ9XG4gKi9cbmNsYXNzIF9CYXNlRHJpdmVyIGV4dGVuZHMgY3JlYXRlQmFzZURyaXZlckNsYXNzKEJhc2VEcml2ZXJDb3JlKSB7fVxuXG4vKipcbiAqIEB0eXBlIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJDbGFzczxEcml2ZXI+fVxuICovXG5jb25zdCBCYXNlRHJpdmVyID0gX0Jhc2VEcml2ZXI7XG5cbmV4cG9ydCB7QmFzZURyaXZlcn07XG5leHBvcnQgZGVmYXVsdCBCYXNlRHJpdmVyO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5IVFRQTWV0aG9kfSBIVFRQTWV0aG9kXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyfSBEcml2ZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlcm5hbERyaXZlcn0gRXh0ZXJuYWxEcml2ZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXN9IENhcGFiaWxpdGllc1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlczQ0NhcGFiaWxpdGllc30gVzNDQ2FwYWJpbGl0aWVzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyRGF0YX0gRHJpdmVyRGF0YVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFVwZGF0ZVNlcnZlckNhbGxiYWNrXG4gKiBAcGFyYW0ge2ltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3N9IGFwcCAtIEV4cHJlc3MgYXBwXG4gKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVNlcnZlcn0gaHR0cFNlcnZlciAtIEhUVFAgc2VydmVyXG4gKiBAcmV0dXJucyB7aW1wb3J0KCd0eXBlLWZlc3QnKS5Qcm9taXNhYmxlPHZvaWQ+fVxuICovXG5cbi8qKlxuICogVGhpcyBpcyB1c2VkIHRvIGV4dGVuZCB7QGxpbmtjb2RlIEJhc2VEcml2ZXJDb3JlfSBieSB0aGUgbWl4aW5zIGFuZCBhbHNvIGV4dGVybmFsIGRyaXZlcnMuXG4gKiBAdGVtcGxhdGUgW1Byb3RvPXt9XVxuICogQHRlbXBsYXRlIFtTdGF0aWM9e31dXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ2xhc3M8QmFzZURyaXZlckNvcmUgJiBQcm90byxpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJTdGF0aWMgJiBTdGF0aWM+fSBCYXNlRHJpdmVyQmFzZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlNlc3Npb25IYW5kbGVyPFtzdHJpbmcsIG9iamVjdF0sdm9pZD59IFNlc3Npb25IYW5kbGVyXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFHQTs7QUFPQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxrQkFBa0IsR0FBRyxxQkFBM0I7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxtQkFBNUI7QUFDQSxNQUFNQyx3QkFBd0IsR0FBRyxzQkFBakM7QUFDQSxNQUFNQyx1QkFBdUIsR0FBRyxxQkFBaEM7QUFDQSxNQUFNQyw0QkFBNEIsR0FBRyxzQkFBckM7O0FBS08sTUFBTUMsY0FBTixTQUE2QkMsZ0JBQTdCLENBQXdDO0VBQzdDQyxZQUFZLEdBQUdDLGVBQUEsQ0FBRUMsU0FBRixDQUFZQyx5Q0FBWixDQUFIO0VBR1pDLE9BQU87O0VBV2EsTUFBZEMsY0FBYyxDQUFDQyxHQUFELEVBQU0sR0FBR0MsSUFBVCxFQUFlO0lBRWpDLElBQUlDLFNBQVMsR0FBR0MsSUFBSSxDQUFDQyxHQUFMLEVBQWhCOztJQUVBLElBQUlKLEdBQUcsS0FBSyxlQUFaLEVBQTZCO01BRTNCLEtBQUtLLFFBQUwsR0FBZ0IsSUFBQUMsMkJBQUEsRUFBa0JMLElBQWxCLENBQWhCO01BQ0EsS0FBS00sUUFBTCxDQUFjcEIsa0JBQWQ7SUFDRCxDQUpELE1BSU8sSUFBSWEsR0FBRyxLQUFLUSxnQ0FBWixFQUFvQztNQUN6QyxLQUFLRCxRQUFMLENBQWNsQix3QkFBZDtJQUNEOztJQUlELE1BQU0sS0FBS29CLHNCQUFMLEVBQU47O0lBRUEsSUFBSSxLQUFLQyxvQkFBVCxFQUErQjtNQUM3QixNQUFNLElBQUlDLGdCQUFBLENBQU9DLGlCQUFYLENBQTZCLHdDQUE3QixDQUFOO0lBQ0Q7O0lBR0QsSUFBSSxDQUFDLEtBQUtaLEdBQUwsQ0FBTCxFQUFnQjtNQUNkLE1BQU0sSUFBSVcsZ0JBQUEsQ0FBT0Usc0JBQVgsRUFBTjtJQUNEOztJQUVELElBQUlDLDBCQUFKOztJQUNBLE1BQU1DLGVBQWUsR0FBRyxZQUN0QixNQUFNQyxpQkFBQSxDQUFFQyxJQUFGLENBQU8sQ0FDWCxLQUFLakIsR0FBTCxFQUFVLEdBQUdDLElBQWIsQ0FEVyxFQUVYLElBQUllLGlCQUFKLENBQU0sQ0FBQ0UsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO01BQ3pCTCwwQkFBMEIsR0FBR0ssTUFBN0I7TUFDQSxLQUFLQyxZQUFMLENBQWtCQyxFQUFsQixDQUFxQjlCLDRCQUFyQixFQUFtRHVCLDBCQUFuRDtJQUNELENBSEQsQ0FGVyxDQUFQLEVBTUhRLE9BTkcsQ0FNSyxNQUFNO01BQ2YsSUFBSVIsMEJBQUosRUFBZ0M7UUFFOUIsS0FBS00sWUFBTCxDQUFrQkcsY0FBbEIsQ0FDRWhDLDRCQURGLEVBRUV1QiwwQkFGRjtRQUlBQSwwQkFBMEIsR0FBRyxJQUE3QjtNQUNEO0lBQ0YsQ0FmSyxDQURSOztJQWlCQSxNQUFNVSxHQUFHLEdBQUcsS0FBS0Msc0JBQUwsR0FDUixNQUFNLEtBQUtDLGtCQUFMLENBQXdCQyxPQUF4QixDQUFnQ0MsVUFBVSxDQUFDQyxJQUEzQyxFQUFpRGQsZUFBakQsQ0FERSxHQUVSLE1BQU1BLGVBQWUsRUFGekI7O0lBVUEsSUFBSSxLQUFLVSxzQkFBTCxJQUErQnpCLEdBQUcsS0FBS1EsZ0NBQTNDLEVBQW1FO01BRWpFLE1BQU0sS0FBS3NCLHNCQUFMLEVBQU47SUFDRDs7SUFHRCxNQUFNQyxPQUFPLEdBQUc1QixJQUFJLENBQUNDLEdBQUwsRUFBaEI7O0lBQ0EsS0FBSzRCLGFBQUwsQ0FBbUJDLFFBQW5CLENBQTRCQyxJQUE1QixDQUFpQztNQUFDbEMsR0FBRDtNQUFNRSxTQUFOO01BQWlCNkI7SUFBakIsQ0FBakM7O0lBQ0EsSUFBSS9CLEdBQUcsS0FBSyxlQUFaLEVBQTZCO01BQzNCLEtBQUtPLFFBQUwsQ0FBY25CLG1CQUFkO0lBQ0QsQ0FGRCxNQUVPLElBQUlZLEdBQUcsS0FBS1EsZ0NBQVosRUFBb0M7TUFDekMsS0FBS0QsUUFBTCxDQUFjakIsdUJBQWQ7SUFDRDs7SUFFRCxPQUFPa0MsR0FBUDtFQUNEOztFQU00QixNQUF2QlcsdUJBQXVCLENBQzNCQyxHQUFHLEdBQUcsSUFBSXpCLGdCQUFBLENBQU9DLGlCQUFYLENBQTZCLHdDQUE3QixDQURxQixFQUUzQjtJQUNBLEtBQUtRLFlBQUwsQ0FBa0JpQixJQUFsQixDQUF1QjlDLDRCQUF2QixFQUFxRDZDLEdBQXJEO0lBQ0EsS0FBSzFCLG9CQUFMLEdBQTRCLElBQTVCOztJQUNBLElBQUk7TUFDRixJQUFJLEtBQUs0QixTQUFMLEtBQW1CLElBQXZCLEVBQTZCO1FBQzNCLE1BQU0sS0FBS0MsYUFBTCxDQUFtQixLQUFLRCxTQUF4QixDQUFOO01BQ0Q7SUFDRixDQUpELFNBSVU7TUFDUixLQUFLNUIsb0JBQUwsR0FBNEIsS0FBNUI7SUFDRDtFQUNGOztFQUUyQixNQUF0Qm9CLHNCQUFzQixHQUFHO0lBRTdCLE1BQU0sS0FBS3JCLHNCQUFMLEVBQU47SUFHQSxJQUFJLENBQUMsS0FBSytCLG1CQUFWLEVBQStCO0lBRS9CLEtBQUtDLGNBQUwsR0FBc0JDLFVBQVUsQ0FBQyxZQUFZO01BQzNDLEtBQUtDLEdBQUwsQ0FBU0MsSUFBVCxDQUNHLGtDQUFELEdBQ0csR0FBRSxLQUFLSixtQkFBTCxHQUEyQixNQUFPLHdCQUZ6QztNQUlBLE1BQU1LLFlBQVksR0FDZix5QkFBRCxHQUNDLEdBQUUsS0FBS0wsbUJBQUwsR0FBMkIsTUFBTyxXQURyQyxHQUVDLGlEQUZELEdBR0Msd0NBSkg7TUFLQSxNQUFNLEtBQUtMLHVCQUFMLENBQTZCLElBQUlXLEtBQUosQ0FBVUQsWUFBVixDQUE3QixDQUFOO0lBQ0QsQ0FYK0IsRUFXN0IsS0FBS0wsbUJBWHdCLENBQWhDO0VBWUQ7O0VBU0RPLFlBQVksQ0FBQ0MsTUFBRCxFQUFTQyxJQUFULEVBQWVDLElBQWYsRUFBcUJDLElBQXJCLEVBQTJCO0lBQ3JDLEtBQUtILE1BQUwsR0FBY0EsTUFBZDtJQUNBLEtBQUtJLFVBQUwsR0FBa0JILElBQWxCO0lBQ0EsS0FBS0ksVUFBTCxHQUFrQkgsSUFBbEI7SUFDQSxLQUFLSSxVQUFMLEdBQWtCSCxJQUFsQjtFQUNEOztFQU1VLE1BQUxJLEtBQUssR0FBRztJQUNaLEtBQUtaLEdBQUwsQ0FBU2EsS0FBVCxDQUFlLDJCQUFmO0lBQ0EsS0FBS2IsR0FBTCxDQUFTYSxLQUFULENBQWUsNEJBQWY7SUFHQSxJQUFJQyxhQUFhLEdBQUcsRUFBcEI7O0lBQ0EsS0FBSyxJQUFJQyxRQUFULElBQXFCLENBQ25CLGdCQURtQixFQUVuQixxQkFGbUIsRUFHbkIsV0FIbUIsRUFJbkIsMkJBSm1CLENBQXJCLEVBS0c7TUFDREQsYUFBYSxDQUFDQyxRQUFELENBQWIsR0FBMEIsS0FBS0EsUUFBTCxDQUExQjtJQUNEOztJQUdELEtBQUtDLHlCQUFMLEdBQWlDLE1BQU0sQ0FBRSxDQUF6Qzs7SUFFQSxJQUFJO01BQ0YsSUFBSSxLQUFLckIsU0FBTCxLQUFtQixJQUF2QixFQUE2QjtRQUMzQixNQUFNLEtBQUtDLGFBQUwsQ0FBbUIsS0FBS0QsU0FBeEIsQ0FBTjtNQUNEOztNQUNELEtBQUtLLEdBQUwsQ0FBU2EsS0FBVCxDQUFlLGdCQUFmO01BQ0EsTUFBTSxLQUFLSSxhQUFMLENBQW1CLEtBQUtDLFlBQXhCLENBQU47SUFDRCxDQU5ELFNBTVU7TUFFUixLQUFLLElBQUksQ0FBQ0MsR0FBRCxFQUFNQyxLQUFOLENBQVQsSUFBeUJwRSxlQUFBLENBQUVxRSxPQUFGLENBQVVQLGFBQVYsQ0FBekIsRUFBbUQ7UUFDakQsS0FBS0ssR0FBTCxJQUFZQyxLQUFaO01BQ0Q7SUFDRjs7SUFDRCxNQUFNLEtBQUt0RCxzQkFBTCxFQUFOO0VBQ0Q7O0VBY2tCLE1BQWJtRCxhQUFhLENBQUNLLGdCQUFELEVBQW1CQyxnQkFBbkIsRUFBcUNDLGVBQXJDLEVBQXNEQyxVQUF0RCxFQUFrRTtJQUNuRixJQUFJLEtBQUs5QixTQUFMLEtBQW1CLElBQXZCLEVBQTZCO01BQzNCLE1BQU0sSUFBSTNCLGdCQUFBLENBQU8wRCxzQkFBWCxDQUNKLHNEQURJLENBQU47SUFHRDs7SUFFRCxLQUFLMUIsR0FBTCxDQUFTYSxLQUFUOztJQUVBLE1BQU1LLFlBQVksR0FBR2xFLGVBQUEsQ0FBRUMsU0FBRixDQUNuQixDQUFDdUUsZUFBRCxFQUFrQkYsZ0JBQWxCLEVBQW9DQyxnQkFBcEMsRUFBc0RJLElBQXRELENBQTJEQyx3QkFBM0QsQ0FEbUIsQ0FBckI7O0lBR0EsSUFBSSxDQUFDVixZQUFMLEVBQW1CO01BQ2pCLE1BQU0sSUFBSWxELGdCQUFBLENBQU8wRCxzQkFBWCxDQUNKLHdEQUNFLHlGQUZFLENBQU47SUFJRDs7SUFFRCxLQUFLRyxjQUFMO0lBRUEsS0FBS1gsWUFBTCxHQUFvQmxFLGVBQUEsQ0FBRUMsU0FBRixDQUFZaUUsWUFBWixDQUFwQjtJQUNBLEtBQUtsQixHQUFMLENBQVNhLEtBQVQsQ0FDRywyQ0FBMENpQixJQUFJLENBQUNDLFNBQUwsQ0FBZWIsWUFBZixFQUE2QixJQUE3QixFQUFtQyxDQUFuQyxDQUFzQyxFQURuRjtJQUlBLElBQUljLElBQUo7O0lBQ0EsSUFBSTtNQUNGQSxJQUFJLEdBQUcsSUFBQUMsaUNBQUEsRUFBb0JmLFlBQXBCLEVBQWtDLEtBQUtnQixxQkFBdkMsRUFBOEQsS0FBS0Msa0JBQW5FLENBQVA7O01BQ0EsSUFBSUgsSUFBSSxDQUFDSSw2QkFBRCxDQUFSLEVBQTJCO1FBQ3pCLEtBQUtwQyxHQUFMLENBQVNhLEtBQVQsQ0FDRyxTQUFRd0Isc0NBQXlCLHdEQURwQztRQUdBTCxJQUFJLEdBQUcsSUFBQU0sa0NBQUEsRUFBcUJOLElBQXJCLENBQVA7TUFDRDs7TUFDREEsSUFBSSxHQUFHLElBQUFPLHNCQUFBLEVBQVFQLElBQVIsRUFBYyxLQUFLRSxxQkFBbkIsRUFBMEMsS0FBS2xDLEdBQS9DLENBQVA7SUFDRCxDQVRELENBU0UsT0FBT3dDLENBQVAsRUFBVTtNQUNWLE1BQU0sSUFBSXhFLGdCQUFBLENBQU8wRCxzQkFBWCxDQUFrQ2MsQ0FBQyxDQUFDQyxPQUFwQyxDQUFOO0lBQ0Q7O0lBRUQsS0FBS0MsbUJBQUwsQ0FBeUJWLElBQXpCO0lBRUEsS0FBS3JDLFNBQUwsR0FBaUJnRCxhQUFBLENBQUtDLE1BQUwsRUFBakI7SUFDQSxLQUFLWixJQUFMLEdBQVlBLElBQVo7SUFDQSxLQUFLYSxJQUFMLEdBQVk3RixlQUFBLENBQUVDLFNBQUYsQ0FBWSxLQUFLNkYsV0FBakIsQ0FBWjtJQUdBQyxNQUFNLENBQUNDLE1BQVAsQ0FBYyxLQUFLSCxJQUFuQixFQUF5QixLQUFLYixJQUE5Qjs7SUFLQSxJQUFJLEtBQUthLElBQUwsQ0FBVUksT0FBVixJQUFxQixLQUFLSixJQUFMLENBQVVLLFNBQW5DLEVBQThDO01BQzVDLE1BQU0sSUFBSS9DLEtBQUosQ0FDSiw2REFDRSxvREFERixHQUVFLG1EQUhFLENBQU47SUFLRDs7SUFDRCxJQUFJLEtBQUswQyxJQUFMLENBQVVJLE9BQVYsS0FBc0IsSUFBMUIsRUFBZ0M7TUFDOUIsS0FBS0osSUFBTCxDQUFVSyxTQUFWLEdBQXNCLEtBQXRCO0lBQ0Q7O0lBQ0QsSUFBSSxLQUFLTCxJQUFMLENBQVVLLFNBQVYsS0FBd0IsSUFBNUIsRUFBa0M7TUFDaEMsS0FBS0wsSUFBTCxDQUFVSSxPQUFWLEdBQW9CLEtBQXBCO0lBQ0Q7O0lBQ0QsS0FBS0osSUFBTCxDQUFVTSxTQUFWLEdBQXNCLENBQUMsS0FBS04sSUFBTCxDQUFVSyxTQUFYLElBQXdCLENBQUMsS0FBS0wsSUFBTCxDQUFVSSxPQUF6RDtJQUNBLEtBQUtKLElBQUwsQ0FBVU8sYUFBVixHQUEwQixLQUFLUCxJQUFMLENBQVVNLFNBQVYsSUFBdUIsS0FBS04sSUFBTCxDQUFVSSxPQUEzRDs7SUFHQSxJQUFJLE9BQU8sS0FBS0osSUFBTCxDQUFVUSxHQUFqQixLQUF5QixRQUF6QixJQUFxQyxLQUFLUixJQUFMLENBQVVRLEdBQVYsQ0FBY0MsSUFBZCxPQUF5QixFQUFsRSxFQUFzRTtNQUNwRSxPQUFPLEtBQUtULElBQUwsQ0FBVVEsR0FBakI7SUFDRDs7SUFFRCxJQUFJLENBQUNyRyxlQUFBLENBQUV1RyxXQUFGLENBQWMsS0FBS3ZCLElBQUwsQ0FBVXdCLGlCQUF4QixDQUFMLEVBQWlEO01BQy9DLEtBQUszRCxtQkFBTCxHQUEyQixLQUFLbUMsSUFBTCxDQUFVd0IsaUJBQVYsR0FBOEIsSUFBekQ7SUFDRDs7SUFFRCxLQUFLQyxJQUFMLENBQVVDLE1BQVYsR0FBbUJDLGdCQUFBLENBQVFDLHVCQUFSLENBQWdDLElBQWhDLEVBQXNDLEtBQUtqRSxTQUEzQyxDQUFuQjtJQUVBLEtBQUtLLEdBQUwsQ0FBUzZELElBQVQsQ0FBZSxvQ0FBbUMsS0FBS2xFLFNBQVUsRUFBakU7SUFFQSxPQUFPLENBQUMsS0FBS0EsU0FBTixFQUFpQnFDLElBQWpCLENBQVA7RUFDRDs7RUFRa0IsTUFBYnBDLGFBQWEsQ0FBQ0QsU0FBRCxFQUFZOEIsVUFBWixFQUF3QjtJQUN6QyxNQUFNLEtBQUszRCxzQkFBTCxFQUFOOztJQUNBLElBQUksS0FBS2dCLHNCQUFMLElBQStCLEtBQUtDLGtCQUFMLENBQXdCK0UsTUFBeEIsRUFBbkMsRUFBcUU7TUFHbkUsS0FBSyxNQUFNM0MsR0FBWCxJQUFrQm5FLGVBQUEsQ0FBRStHLElBQUYsQ0FBTyxLQUFLaEYsa0JBQUwsQ0FBd0JpRixNQUEvQixDQUFsQixFQUEwRDtRQUV4RCxLQUFLakYsa0JBQUwsQ0FBd0JpRixNQUF4QixDQUErQjdDLEdBQS9CLElBQXNDLEVBQXRDO01BQ0Q7SUFDRjs7SUFDRCxLQUFLeEIsU0FBTCxHQUFpQixJQUFqQjtJQUNBLEtBQUs4RCxJQUFMLENBQVVDLE1BQVYsR0FBbUJDLGdCQUFBLENBQVFDLHVCQUFSLENBQWdDLElBQWhDLENBQW5CO0VBQ0Q7O0VBTURLLFlBQVksQ0FBQ2pDLElBQUQsRUFBTztJQUNqQixJQUFJa0MsU0FBUyxHQUFHbEgsZUFBQSxDQUFFbUgsVUFBRixDQUFhbkgsZUFBQSxDQUFFK0csSUFBRixDQUFPL0IsSUFBUCxDQUFiLEVBQTJCaEYsZUFBQSxDQUFFK0csSUFBRixDQUFPLEtBQUtoSCxZQUFaLENBQTNCLENBQWhCOztJQUNBLElBQUltSCxTQUFTLENBQUNFLE1BQWQsRUFBc0I7TUFDcEIsS0FBS3BFLEdBQUwsQ0FBU0MsSUFBVCxDQUNHLHdEQUFELEdBQTRELHVCQUQ5RDs7TUFHQSxLQUFLLE1BQU1vRSxHQUFYLElBQWtCSCxTQUFsQixFQUE2QjtRQUMzQixLQUFLbEUsR0FBTCxDQUFTQyxJQUFULENBQWUsS0FBSW9FLEdBQUksRUFBdkI7TUFDRDtJQUNGO0VBQ0Y7O0VBT0QzQixtQkFBbUIsQ0FBQ1YsSUFBRCxFQUFPO0lBQ3hCLElBQUksQ0FBQyxLQUFLRyxrQkFBVixFQUE4QjtNQUM1QixPQUFPLElBQVA7SUFDRDs7SUFFRCxJQUFJO01BQ0YsSUFBQW1DLDBCQUFBLEVBQWF0QyxJQUFiLEVBQW1CLEtBQUtqRixZQUF4QjtJQUNELENBRkQsQ0FFRSxPQUFPeUYsQ0FBUCxFQUFVO01BQ1YsS0FBS3hDLEdBQUwsQ0FBU3VFLGFBQVQsQ0FDRSxJQUFJdkcsZ0JBQUEsQ0FBTzBELHNCQUFYLENBQ0csdURBQUQsR0FDRyx3QkFBdUJjLENBQUMsQ0FBQ0MsT0FBUSxFQUZ0QyxDQURGO0lBTUQ7O0lBRUQsS0FBS3dCLFlBQUwsQ0FBa0JqQyxJQUFsQjtJQUVBLE9BQU8sSUFBUDtFQUNEOztFQUd3QixJQUFyQkUscUJBQXFCLENBQUNzQyxXQUFELEVBQWM7SUFDckMsS0FBS3pILFlBQUwsR0FBb0JnRyxNQUFNLENBQUNDLE1BQVAsQ0FBYyxLQUFLakcsWUFBbkIsRUFBaUN5SCxXQUFqQyxDQUFwQjs7SUFHQSxLQUFLLE1BQU0sR0FBR3BELEtBQUgsQ0FBWCxJQUF3QnBFLGVBQUEsQ0FBRXFFLE9BQUYsQ0FBVSxLQUFLdEUsWUFBZixDQUF4QixFQUFzRDtNQUNwRCxJQUFJcUUsS0FBSyxJQUFJQSxLQUFLLENBQUNxRCxRQUFOLEtBQW1CLElBQWhDLEVBQXNDO1FBQ3BDckQsS0FBSyxDQUFDcUQsUUFBTixHQUFpQjtVQUNmQyxVQUFVLEVBQUU7UUFERyxDQUFqQjtNQUdEO0lBQ0Y7RUFDRjs7RUFFd0IsSUFBckJ4QyxxQkFBcUIsR0FBRztJQUMxQixPQUFPLEtBQUtuRixZQUFaO0VBQ0Q7O0FBN1Y0Qzs7OztBQW9XL0MsTUFBTTRILFdBQU4sU0FBMEIsSUFBQUMsK0JBQUEsRUFBc0IvSCxjQUF0QixDQUExQixDQUFnRTs7QUFLaEUsTUFBTW9DLFVBQVUsR0FBRzBGLFdBQW5COztlQUdlMUYsVSJ9
|