@appium/driver-test-support 0.2.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/LICENSE +201 -0
- package/README.md +112 -0
- package/build/lib/e2e-suite.d.ts +77 -0
- package/build/lib/e2e-suite.d.ts.map +1 -0
- package/build/lib/e2e-suite.js +389 -0
- package/build/lib/helpers.d.ts +19 -0
- package/build/lib/helpers.d.ts.map +1 -0
- package/build/lib/helpers.js +49 -0
- package/build/lib/index.d.ts +7 -0
- package/build/lib/index.d.ts.map +1 -0
- package/build/lib/index.js +47 -0
- package/build/lib/unit-suite.d.ts +12 -0
- package/build/lib/unit-suite.d.ts.map +1 -0
- package/build/lib/unit-suite.js +551 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/index.js +1 -0
- package/lib/e2e-suite.js +465 -0
- package/lib/helpers.js +68 -0
- package/lib/index.js +9 -0
- package/lib/unit-suite.js +632 -0
- package/package.json +70 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.createSessionHelpers = createSessionHelpers;
|
|
9
|
+
exports.driverE2ETestSuite = driverE2ETestSuite;
|
|
10
|
+
|
|
11
|
+
require("source-map-support/register");
|
|
12
|
+
|
|
13
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
14
|
+
|
|
15
|
+
var _driver = require("appium/driver");
|
|
16
|
+
|
|
17
|
+
var _axios = _interopRequireDefault(require("axios"));
|
|
18
|
+
|
|
19
|
+
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
20
|
+
|
|
21
|
+
var _helpers = require("./helpers");
|
|
22
|
+
|
|
23
|
+
var _chai = _interopRequireDefault(require("chai"));
|
|
24
|
+
|
|
25
|
+
var _sinon = _interopRequireDefault(require("sinon"));
|
|
26
|
+
|
|
27
|
+
const should = _chai.default.should();
|
|
28
|
+
|
|
29
|
+
function createSessionHelpers(port, address = _helpers.TEST_HOST) {
|
|
30
|
+
const createAppiumTestURL = (0, _helpers.createAppiumURL)(address, port);
|
|
31
|
+
const createSessionURL = createAppiumTestURL(_lodash.default, '');
|
|
32
|
+
const newSessionURL = createAppiumTestURL('', 'session');
|
|
33
|
+
return {
|
|
34
|
+
newSessionURL,
|
|
35
|
+
createAppiumTestURL,
|
|
36
|
+
postCommand: async (sessionId, cmdName, data = {}, config = {}) => {
|
|
37
|
+
var _response$data;
|
|
38
|
+
|
|
39
|
+
const url = createAppiumTestURL(sessionId, cmdName);
|
|
40
|
+
const response = await _axios.default.post(url, data, config);
|
|
41
|
+
return (_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.value;
|
|
42
|
+
},
|
|
43
|
+
getCommand: async (sessionIdOrCmdName, cmdNameOrConfig, config = {}) => {
|
|
44
|
+
var _response$data2;
|
|
45
|
+
|
|
46
|
+
if (!_lodash.default.isString(cmdNameOrConfig)) {
|
|
47
|
+
config = cmdNameOrConfig;
|
|
48
|
+
cmdNameOrConfig = sessionIdOrCmdName;
|
|
49
|
+
sessionIdOrCmdName = '';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const response = await (0, _axios.default)({
|
|
53
|
+
url: createAppiumTestURL(sessionIdOrCmdName, cmdNameOrConfig),
|
|
54
|
+
validateStatus: null,
|
|
55
|
+
...config
|
|
56
|
+
});
|
|
57
|
+
return (_response$data2 = response.data) === null || _response$data2 === void 0 ? void 0 : _response$data2.value;
|
|
58
|
+
},
|
|
59
|
+
startSession: async (data, config = {}) => {
|
|
60
|
+
var _response$data3;
|
|
61
|
+
|
|
62
|
+
data = _lodash.default.defaultsDeep(data, {
|
|
63
|
+
capabilities: {
|
|
64
|
+
alwaysMatch: {},
|
|
65
|
+
firstMatch: [{}]
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
const response = await _axios.default.post(newSessionURL, data, config);
|
|
69
|
+
return (_response$data3 = response.data) === null || _response$data3 === void 0 ? void 0 : _response$data3.value;
|
|
70
|
+
},
|
|
71
|
+
endSession: async sessionId => await _axios.default.delete(createSessionURL(sessionId), {
|
|
72
|
+
validateStatus: null
|
|
73
|
+
}),
|
|
74
|
+
getSession: async sessionId => {
|
|
75
|
+
var _response$data4;
|
|
76
|
+
|
|
77
|
+
const response = await (0, _axios.default)({
|
|
78
|
+
url: createSessionURL(sessionId),
|
|
79
|
+
validateStatus: null
|
|
80
|
+
});
|
|
81
|
+
return (_response$data4 = response.data) === null || _response$data4 === void 0 ? void 0 : _response$data4.value;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function driverE2ETestSuite(DriverClass, defaultCaps = {}) {
|
|
87
|
+
let address = defaultCaps['appium:address'] ?? _helpers.TEST_HOST;
|
|
88
|
+
let port = defaultCaps['appium:port'];
|
|
89
|
+
const className = DriverClass.name || '(unknown driver)';
|
|
90
|
+
describe(`BaseDriver E2E (as ${className})`, function () {
|
|
91
|
+
let baseServer;
|
|
92
|
+
let d;
|
|
93
|
+
let newSessionURL;
|
|
94
|
+
let startSession;
|
|
95
|
+
let getSession;
|
|
96
|
+
let endSession;
|
|
97
|
+
let getCommand;
|
|
98
|
+
let postCommand;
|
|
99
|
+
before(async function () {
|
|
100
|
+
port = port ?? (await (0, _helpers.getTestPort)());
|
|
101
|
+
defaultCaps = { ...defaultCaps,
|
|
102
|
+
'appium:port': port
|
|
103
|
+
};
|
|
104
|
+
d = new DriverClass({
|
|
105
|
+
port,
|
|
106
|
+
address
|
|
107
|
+
});
|
|
108
|
+
baseServer = await (0, _driver.server)({
|
|
109
|
+
routeConfiguringFunction: (0, _driver.routeConfiguringFunction)(d),
|
|
110
|
+
port,
|
|
111
|
+
hostname: address,
|
|
112
|
+
cliArgs: {}
|
|
113
|
+
});
|
|
114
|
+
({
|
|
115
|
+
startSession,
|
|
116
|
+
getSession,
|
|
117
|
+
endSession,
|
|
118
|
+
newSessionURL,
|
|
119
|
+
getCommand,
|
|
120
|
+
postCommand
|
|
121
|
+
} = createSessionHelpers(port, address));
|
|
122
|
+
});
|
|
123
|
+
after(async function () {
|
|
124
|
+
await baseServer.close();
|
|
125
|
+
});
|
|
126
|
+
describe('session handling', function () {
|
|
127
|
+
it('should handle idempotency while creating sessions', async function () {
|
|
128
|
+
const sessionIds = [];
|
|
129
|
+
let times = 0;
|
|
130
|
+
|
|
131
|
+
do {
|
|
132
|
+
const {
|
|
133
|
+
sessionId
|
|
134
|
+
} = await startSession({
|
|
135
|
+
capabilities: {
|
|
136
|
+
alwaysMatch: defaultCaps
|
|
137
|
+
}
|
|
138
|
+
}, {
|
|
139
|
+
headers: {
|
|
140
|
+
'X-Idempotency-Key': '123456'
|
|
141
|
+
},
|
|
142
|
+
simple: false,
|
|
143
|
+
resolveWithFullResponse: true
|
|
144
|
+
});
|
|
145
|
+
sessionIds.push(sessionId);
|
|
146
|
+
times++;
|
|
147
|
+
} while (times < 2);
|
|
148
|
+
|
|
149
|
+
_lodash.default.uniq(sessionIds).length.should.equal(1);
|
|
150
|
+
|
|
151
|
+
const {
|
|
152
|
+
status,
|
|
153
|
+
data
|
|
154
|
+
} = await endSession(sessionIds[0]);
|
|
155
|
+
status.should.equal(200);
|
|
156
|
+
should.equal(data.value, null);
|
|
157
|
+
});
|
|
158
|
+
it('should handle idempotency while creating parallel sessions', async function () {
|
|
159
|
+
const reqs = [];
|
|
160
|
+
let times = 0;
|
|
161
|
+
|
|
162
|
+
do {
|
|
163
|
+
reqs.push(startSession({
|
|
164
|
+
capabilities: {
|
|
165
|
+
alwaysMatch: defaultCaps
|
|
166
|
+
}
|
|
167
|
+
}, {
|
|
168
|
+
headers: {
|
|
169
|
+
'X-Idempotency-Key': '12345'
|
|
170
|
+
}
|
|
171
|
+
}));
|
|
172
|
+
times++;
|
|
173
|
+
} while (times < 2);
|
|
174
|
+
|
|
175
|
+
const sessionIds = _lodash.default.map(await _bluebird.default.all(reqs), 'sessionId');
|
|
176
|
+
|
|
177
|
+
_lodash.default.uniq(sessionIds).length.should.equal(1);
|
|
178
|
+
|
|
179
|
+
const {
|
|
180
|
+
status,
|
|
181
|
+
data
|
|
182
|
+
} = await endSession(sessionIds[0]);
|
|
183
|
+
status.should.equal(200);
|
|
184
|
+
should.equal(data.value, null);
|
|
185
|
+
});
|
|
186
|
+
it('should create session and retrieve a session id, then delete it', async function () {
|
|
187
|
+
let {
|
|
188
|
+
status,
|
|
189
|
+
data
|
|
190
|
+
} = await _axios.default.post(newSessionURL, {
|
|
191
|
+
capabilities: {
|
|
192
|
+
alwaysMatch: defaultCaps
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
status.should.equal(200);
|
|
196
|
+
should.exist(data.value.sessionId);
|
|
197
|
+
data.value.capabilities.platformName.should.equal(defaultCaps.platformName);
|
|
198
|
+
data.value.capabilities.deviceName.should.equal(defaultCaps['appium:deviceName']);
|
|
199
|
+
({
|
|
200
|
+
status,
|
|
201
|
+
data
|
|
202
|
+
} = await endSession(d.sessionId));
|
|
203
|
+
status.should.equal(200);
|
|
204
|
+
should.equal(data.value, null);
|
|
205
|
+
should.equal(d.sessionId, null);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
it.skip('should throw NYI for commands not implemented', async function () {});
|
|
209
|
+
describe('command timeouts', function () {
|
|
210
|
+
let originalFindElement, originalFindElements;
|
|
211
|
+
|
|
212
|
+
async function startTimeoutSession(timeout) {
|
|
213
|
+
const caps = _lodash.default.cloneDeep(defaultCaps);
|
|
214
|
+
|
|
215
|
+
caps['appium:newCommandTimeout'] = timeout;
|
|
216
|
+
return await startSession({
|
|
217
|
+
capabilities: {
|
|
218
|
+
alwaysMatch: caps
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
before(function () {
|
|
224
|
+
originalFindElement = d.findElement;
|
|
225
|
+
|
|
226
|
+
d.findElement = function () {
|
|
227
|
+
return 'foo';
|
|
228
|
+
}.bind(d);
|
|
229
|
+
|
|
230
|
+
originalFindElements = d.findElements;
|
|
231
|
+
|
|
232
|
+
d.findElements = async function () {
|
|
233
|
+
await _bluebird.default.delay(200);
|
|
234
|
+
return ['foo'];
|
|
235
|
+
}.bind(d);
|
|
236
|
+
});
|
|
237
|
+
after(function () {
|
|
238
|
+
d.findElement = originalFindElement;
|
|
239
|
+
d.findElements = originalFindElements;
|
|
240
|
+
});
|
|
241
|
+
it('should set a default commandTimeout', async function () {
|
|
242
|
+
let newSession = await startTimeoutSession();
|
|
243
|
+
d.newCommandTimeoutMs.should.be.above(0);
|
|
244
|
+
await endSession(newSession.sessionId);
|
|
245
|
+
});
|
|
246
|
+
it('should timeout on commands using commandTimeout cap', async function () {
|
|
247
|
+
let newSession = await startTimeoutSession(0.25);
|
|
248
|
+
const sessionId = d.sessionId;
|
|
249
|
+
await postCommand(sessionId, 'element', {
|
|
250
|
+
using: 'name',
|
|
251
|
+
value: 'foo'
|
|
252
|
+
});
|
|
253
|
+
await _bluebird.default.delay(400);
|
|
254
|
+
const value = await getSession(sessionId);
|
|
255
|
+
should.equal(value.error, 'invalid session id');
|
|
256
|
+
should.equal(d.sessionId, null);
|
|
257
|
+
const resp = (await endSession(newSession.sessionId)).data.value;
|
|
258
|
+
should.equal(resp === null || resp === void 0 ? void 0 : resp.error, 'invalid session id');
|
|
259
|
+
});
|
|
260
|
+
it('should not timeout with commandTimeout of false', async function () {
|
|
261
|
+
let newSession = await startTimeoutSession(0.1);
|
|
262
|
+
let start = Date.now();
|
|
263
|
+
const value = await postCommand(d.sessionId, 'elements', {
|
|
264
|
+
using: 'name',
|
|
265
|
+
value: 'foo'
|
|
266
|
+
});
|
|
267
|
+
(Date.now() - start).should.be.above(150);
|
|
268
|
+
value.should.eql(['foo']);
|
|
269
|
+
await endSession(newSession.sessionId);
|
|
270
|
+
});
|
|
271
|
+
it('should not timeout with commandTimeout of 0', async function () {
|
|
272
|
+
var _value$platformName;
|
|
273
|
+
|
|
274
|
+
d.newCommandTimeoutMs = 2;
|
|
275
|
+
let newSession = await startTimeoutSession(0);
|
|
276
|
+
await postCommand(d.sessionId, 'element', {
|
|
277
|
+
using: 'name',
|
|
278
|
+
value: 'foo'
|
|
279
|
+
});
|
|
280
|
+
await _bluebird.default.delay(400);
|
|
281
|
+
const value = await getSession(d.sessionId);
|
|
282
|
+
(_value$platformName = value.platformName) === null || _value$platformName === void 0 ? void 0 : _value$platformName.should.equal(defaultCaps.platformName);
|
|
283
|
+
const resp = (await endSession(newSession.sessionId)).data.value;
|
|
284
|
+
should.equal(resp, null);
|
|
285
|
+
d.newCommandTimeoutMs = 60 * 1000;
|
|
286
|
+
});
|
|
287
|
+
it('should not timeout if its just the command taking awhile', async function () {
|
|
288
|
+
let newSession = await startTimeoutSession(0.25);
|
|
289
|
+
const {
|
|
290
|
+
sessionId
|
|
291
|
+
} = d;
|
|
292
|
+
await postCommand(d.sessionId, 'element', {
|
|
293
|
+
using: 'name',
|
|
294
|
+
value: 'foo'
|
|
295
|
+
});
|
|
296
|
+
await _bluebird.default.delay(400);
|
|
297
|
+
const value = await getSession(sessionId);
|
|
298
|
+
value.error.should.equal('invalid session id');
|
|
299
|
+
should.equal(d.sessionId, null);
|
|
300
|
+
const resp = (await endSession(newSession.sessionId)).data.value;
|
|
301
|
+
resp.error.should.equal('invalid session id');
|
|
302
|
+
});
|
|
303
|
+
it('should not have a timer running before or after a session', async function () {
|
|
304
|
+
should.not.exist(d.noCommandTimer);
|
|
305
|
+
let newSession = await startTimeoutSession(0.25);
|
|
306
|
+
newSession.sessionId.should.equal(d.sessionId);
|
|
307
|
+
should.exist(d.noCommandTimer);
|
|
308
|
+
await endSession(newSession.sessionId);
|
|
309
|
+
should.not.exist(d.noCommandTimer);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
describe('settings api', function () {
|
|
313
|
+
before(function () {
|
|
314
|
+
d.settings = new _driver.DeviceSettings({
|
|
315
|
+
ignoreUnimportantViews: false
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
it('should be able to get settings object', function () {
|
|
319
|
+
d.settings.getSettings().ignoreUnimportantViews.should.be.false;
|
|
320
|
+
});
|
|
321
|
+
it('should not reject when `updateSettings` method is not provided', async function () {
|
|
322
|
+
await d.settings.update({
|
|
323
|
+
ignoreUnimportantViews: true
|
|
324
|
+
}).should.not.be.rejected;
|
|
325
|
+
});
|
|
326
|
+
it('should reject for invalid update object', async function () {
|
|
327
|
+
await d.settings.update('invalid json').should.be.rejectedWith('JSON');
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
describe('unexpected exits', function () {
|
|
331
|
+
let sandbox;
|
|
332
|
+
beforeEach(function () {
|
|
333
|
+
sandbox = _sinon.default.createSandbox();
|
|
334
|
+
});
|
|
335
|
+
afterEach(function () {
|
|
336
|
+
sandbox.restore();
|
|
337
|
+
});
|
|
338
|
+
it('should reject a current command when the driver crashes', async function () {
|
|
339
|
+
sandbox.stub(d, 'getStatus').callsFake(async function () {
|
|
340
|
+
await _bluebird.default.delay(5000);
|
|
341
|
+
});
|
|
342
|
+
const reqPromise = getCommand('status', {
|
|
343
|
+
validateStatus: null
|
|
344
|
+
});
|
|
345
|
+
await _bluebird.default.delay(100);
|
|
346
|
+
const shutdownEventPromise = new _bluebird.default((resolve, reject) => {
|
|
347
|
+
setTimeout(() => reject(new Error('onUnexpectedShutdown event is expected to be fired within 5 seconds timeout')), 5000);
|
|
348
|
+
d.onUnexpectedShutdown(resolve);
|
|
349
|
+
});
|
|
350
|
+
d.startUnexpectedShutdown(new Error('Crashytimes'));
|
|
351
|
+
const value = await reqPromise;
|
|
352
|
+
value.message.should.contain('Crashytimes');
|
|
353
|
+
await shutdownEventPromise;
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
describe('event timings', function () {
|
|
357
|
+
it('should not add timings if not using opt-in cap', async function () {
|
|
358
|
+
const session = await startSession({
|
|
359
|
+
capabilities: {
|
|
360
|
+
alwaysMatch: defaultCaps
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
const res = await getSession(session.sessionId);
|
|
364
|
+
should.not.exist(res.events);
|
|
365
|
+
await endSession(session.sessionId);
|
|
366
|
+
});
|
|
367
|
+
it('should add start session timings', async function () {
|
|
368
|
+
var _res$events, _res$events2, _res$events3, _res$events4;
|
|
369
|
+
|
|
370
|
+
const caps = { ...defaultCaps,
|
|
371
|
+
'appium:eventTimings': true
|
|
372
|
+
};
|
|
373
|
+
const session = await startSession({
|
|
374
|
+
capabilities: {
|
|
375
|
+
alwaysMatch: caps
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
const res = await getSession(session.sessionId);
|
|
379
|
+
should.exist(res.events);
|
|
380
|
+
should.exist((_res$events = res.events) === null || _res$events === void 0 ? void 0 : _res$events.newSessionRequested);
|
|
381
|
+
should.exist((_res$events2 = res.events) === null || _res$events2 === void 0 ? void 0 : _res$events2.newSessionStarted);
|
|
382
|
+
(_res$events3 = res.events) === null || _res$events3 === void 0 ? void 0 : _res$events3.newSessionRequested[0].should.be.a('number');
|
|
383
|
+
(_res$events4 = res.events) === null || _res$events4 === void 0 ? void 0 : _res$events4.newSessionStarted[0].should.be.a('number');
|
|
384
|
+
await endSession(session.sessionId);
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzaG91bGQiLCJjaGFpIiwiY3JlYXRlU2Vzc2lvbkhlbHBlcnMiLCJwb3J0IiwiYWRkcmVzcyIsIlRFU1RfSE9TVCIsImNyZWF0ZUFwcGl1bVRlc3RVUkwiLCJjcmVhdGVBcHBpdW1VUkwiLCJjcmVhdGVTZXNzaW9uVVJMIiwiXyIsIm5ld1Nlc3Npb25VUkwiLCJwb3N0Q29tbWFuZCIsInNlc3Npb25JZCIsImNtZE5hbWUiLCJkYXRhIiwiY29uZmlnIiwidXJsIiwicmVzcG9uc2UiLCJheGlvcyIsInBvc3QiLCJ2YWx1ZSIsImdldENvbW1hbmQiLCJzZXNzaW9uSWRPckNtZE5hbWUiLCJjbWROYW1lT3JDb25maWciLCJpc1N0cmluZyIsInZhbGlkYXRlU3RhdHVzIiwic3RhcnRTZXNzaW9uIiwiZGVmYXVsdHNEZWVwIiwiY2FwYWJpbGl0aWVzIiwiYWx3YXlzTWF0Y2giLCJmaXJzdE1hdGNoIiwiZW5kU2Vzc2lvbiIsImRlbGV0ZSIsImdldFNlc3Npb24iLCJkcml2ZXJFMkVUZXN0U3VpdGUiLCJEcml2ZXJDbGFzcyIsImRlZmF1bHRDYXBzIiwiY2xhc3NOYW1lIiwibmFtZSIsImRlc2NyaWJlIiwiYmFzZVNlcnZlciIsImQiLCJiZWZvcmUiLCJnZXRUZXN0UG9ydCIsInNlcnZlciIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsImhvc3RuYW1lIiwiY2xpQXJncyIsImFmdGVyIiwiY2xvc2UiLCJpdCIsInNlc3Npb25JZHMiLCJ0aW1lcyIsImhlYWRlcnMiLCJzaW1wbGUiLCJyZXNvbHZlV2l0aEZ1bGxSZXNwb25zZSIsInB1c2giLCJ1bmlxIiwibGVuZ3RoIiwiZXF1YWwiLCJzdGF0dXMiLCJyZXFzIiwibWFwIiwiQiIsImFsbCIsImV4aXN0IiwicGxhdGZvcm1OYW1lIiwiZGV2aWNlTmFtZSIsInNraXAiLCJvcmlnaW5hbEZpbmRFbGVtZW50Iiwib3JpZ2luYWxGaW5kRWxlbWVudHMiLCJzdGFydFRpbWVvdXRTZXNzaW9uIiwidGltZW91dCIsImNhcHMiLCJjbG9uZURlZXAiLCJmaW5kRWxlbWVudCIsImJpbmQiLCJmaW5kRWxlbWVudHMiLCJkZWxheSIsIm5ld1Nlc3Npb24iLCJuZXdDb21tYW5kVGltZW91dE1zIiwiYmUiLCJhYm92ZSIsInVzaW5nIiwiZXJyb3IiLCJyZXNwIiwic3RhcnQiLCJEYXRlIiwibm93IiwiZXFsIiwibm90Iiwibm9Db21tYW5kVGltZXIiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwiaWdub3JlVW5pbXBvcnRhbnRWaWV3cyIsImdldFNldHRpbmdzIiwiZmFsc2UiLCJ1cGRhdGUiLCJyZWplY3RlZCIsInJlamVjdGVkV2l0aCIsInNhbmRib3giLCJiZWZvcmVFYWNoIiwic2lub24iLCJjcmVhdGVTYW5kYm94IiwiYWZ0ZXJFYWNoIiwicmVzdG9yZSIsInN0dWIiLCJjYWxsc0Zha2UiLCJyZXFQcm9taXNlIiwic2h1dGRvd25FdmVudFByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwic2V0VGltZW91dCIsIkVycm9yIiwib25VbmV4cGVjdGVkU2h1dGRvd24iLCJzdGFydFVuZXhwZWN0ZWRTaHV0ZG93biIsIm1lc3NhZ2UiLCJjb250YWluIiwic2Vzc2lvbiIsInJlcyIsImV2ZW50cyIsIm5ld1Nlc3Npb25SZXF1ZXN0ZWQiLCJuZXdTZXNzaW9uU3RhcnRlZCIsImEiXSwic291cmNlcyI6WyIuLi8uLi9saWIvZTJlLXN1aXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge3NlcnZlciwgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLCBEZXZpY2VTZXR0aW5nc30gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtURVNUX0hPU1QsIGdldFRlc3RQb3J0LCBjcmVhdGVBcHBpdW1VUkx9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5cbmNvbnN0IHNob3VsZCA9IGNoYWkuc2hvdWxkKCk7XG5cbi8qKlxuICogQ3JlYXRlcyBzb21lIGhlbHBlciBmdW5jdGlvbnMgZm9yIEUyRSB0ZXN0cyB0byBtYW5hZ2Ugc2Vzc2lvbnMuXG4gKiBAdGVtcGxhdGUgW0NvbW1hbmREYXRhPXVua25vd25dXG4gKiBAdGVtcGxhdGUgW1Jlc3BvbnNlRGF0YT1hbnldXG4gKiBAcGFyYW0ge251bWJlcn0gcG9ydCAtIFBvcnQgb24gd2hpY2ggdGhlIHNlcnZlciBpcyBydW5uaW5nLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHJldHJpZXZlZCB2aWEgYGdldC1wb3J0YCBiZWZvcmVoYW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FkZHJlc3NdIC0gQWRkcmVzcy9ob3N0IG9uIHdoaWNoIHRoZSBzZXJ2ZXIgaXMgcnVubmluZy4gRGVmYXVsdHMgdG8ge0BsaW5rY29kZSBURVNUX0hPU1R9XG4gKiBAcmV0dXJucyB7U2Vzc2lvbkhlbHBlcnM8Q29tbWFuZERhdGEsIFJlc3BvbnNlRGF0YT59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZXNzaW9uSGVscGVycyhwb3J0LCBhZGRyZXNzID0gVEVTVF9IT1NUKSB7XG4gIGNvbnN0IGNyZWF0ZUFwcGl1bVRlc3RVUkwgPVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KCdsb2Rhc2gnKS5DdXJyaWVkRnVuY3Rpb24yPHN0cmluZyxzdHJpbmcsc3RyaW5nPn0gKi8gKFxuICAgICAgY3JlYXRlQXBwaXVtVVJMKGFkZHJlc3MsIHBvcnQpXG4gICAgKTtcblxuICBjb25zdCBjcmVhdGVTZXNzaW9uVVJMID0gY3JlYXRlQXBwaXVtVGVzdFVSTChfLCAnJyk7XG4gIGNvbnN0IG5ld1Nlc3Npb25VUkwgPSBjcmVhdGVBcHBpdW1UZXN0VVJMKCcnLCAnc2Vzc2lvbicpO1xuICByZXR1cm4gLyoqIEB0eXBlIHtTZXNzaW9uSGVscGVyczxDb21tYW5kRGF0YSwgUmVzcG9uc2VEYXRhPn0gKi8gKHtcbiAgICBuZXdTZXNzaW9uVVJMLFxuICAgIGNyZWF0ZUFwcGl1bVRlc3RVUkwsXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNtZE5hbWVcbiAgICAgKiBAcGFyYW0ge2FueX0gW2RhdGFdXG4gICAgICogQHBhcmFtIHtBeGlvc1JlcXVlc3RDb25maWd9IFtjb25maWddXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICAgKi9cbiAgICBwb3N0Q29tbWFuZDogYXN5bmMgKHNlc3Npb25JZCwgY21kTmFtZSwgZGF0YSA9IHt9LCBjb25maWcgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gY3JlYXRlQXBwaXVtVGVzdFVSTChzZXNzaW9uSWQsIGNtZE5hbWUpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KHVybCwgZGF0YSwgY29uZmlnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhPy52YWx1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZE9yQ21kTmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfEF4aW9zUmVxdWVzdENvbmZpZ30gY21kTmFtZU9yQ29uZmlnXG4gICAgICogQHBhcmFtIHtBeGlvc1JlcXVlc3RDb25maWd9IFtjb25maWddXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICAgKi9cbiAgICBnZXRDb21tYW5kOiBhc3luYyAoc2Vzc2lvbklkT3JDbWROYW1lLCBjbWROYW1lT3JDb25maWcsIGNvbmZpZyA9IHt9KSA9PiB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoY21kTmFtZU9yQ29uZmlnKSkge1xuICAgICAgICBjb25maWcgPSBjbWROYW1lT3JDb25maWc7XG4gICAgICAgIGNtZE5hbWVPckNvbmZpZyA9IHNlc3Npb25JZE9yQ21kTmFtZTtcbiAgICAgICAgc2Vzc2lvbklkT3JDbWROYW1lID0gJyc7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zKHtcbiAgICAgICAgdXJsOiBjcmVhdGVBcHBpdW1UZXN0VVJMKHNlc3Npb25JZE9yQ21kTmFtZSwgY21kTmFtZU9yQ29uZmlnKSxcbiAgICAgICAgdmFsaWRhdGVTdGF0dXM6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE/LnZhbHVlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge05ld1Nlc3Npb25EYXRhfSBkYXRhXG4gICAgICogQHBhcmFtIHtBeGlvc1JlcXVlc3RDb25maWd9IFtjb25maWddXG4gICAgICovXG4gICAgc3RhcnRTZXNzaW9uOiBhc3luYyAoZGF0YSwgY29uZmlnID0ge30pID0+IHtcbiAgICAgIGRhdGEgPSBfLmRlZmF1bHRzRGVlcChkYXRhLCB7XG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgIGFsd2F5c01hdGNoOiB7fSxcbiAgICAgICAgICBmaXJzdE1hdGNoOiBbe31dLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QobmV3U2Vzc2lvblVSTCwgZGF0YSwgY29uZmlnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhPy52YWx1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZFxuICAgICAqL1xuICAgIGVuZFNlc3Npb246IGFzeW5jIChzZXNzaW9uSWQpID0+XG4gICAgICBhd2FpdCBheGlvcy5kZWxldGUoY3JlYXRlU2Vzc2lvblVSTChzZXNzaW9uSWQpLCB7XG4gICAgICAgIHZhbGlkYXRlU3RhdHVzOiBudWxsLFxuICAgICAgfSksXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAgICovXG4gICAgZ2V0U2Vzc2lvbjogYXN5bmMgKHNlc3Npb25JZCkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcyh7XG4gICAgICAgIHVybDogY3JlYXRlU2Vzc2lvblVSTChzZXNzaW9uSWQpLFxuICAgICAgICB2YWxpZGF0ZVN0YXR1czogbnVsbCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE/LnZhbHVlO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgRTJFIHRlc3Qgc3VpdGVzIGZvciBhIGRyaXZlci5cbiAqIEB0ZW1wbGF0ZSB7RHJpdmVyfSBQXG4gKiBAcGFyYW0ge0RyaXZlckNsYXNzPFA+fSBEcml2ZXJDbGFzc1xuICogQHBhcmFtIHtBcHBpdW1XM0NDYXBhYmlsaXRpZXN9IFtkZWZhdWx0Q2Fwc11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXZlckUyRVRlc3RTdWl0ZShEcml2ZXJDbGFzcywgZGVmYXVsdENhcHMgPSB7fSkge1xuICBsZXQgYWRkcmVzcyA9IGRlZmF1bHRDYXBzWydhcHBpdW06YWRkcmVzcyddID8/IFRFU1RfSE9TVDtcbiAgbGV0IHBvcnQgPSBkZWZhdWx0Q2Fwc1snYXBwaXVtOnBvcnQnXTtcbiAgY29uc3QgY2xhc3NOYW1lID0gRHJpdmVyQ2xhc3MubmFtZSB8fCAnKHVua25vd24gZHJpdmVyKSc7XG5cbiAgZGVzY3JpYmUoYEJhc2VEcml2ZXIgRTJFIChhcyAke2NsYXNzTmFtZX0pYCwgZnVuY3Rpb24gKCkge1xuICAgIGxldCBiYXNlU2VydmVyO1xuICAgIC8qKiBAdHlwZSB7UH0gKi9cbiAgICBsZXQgZDtcbiAgICAvKipcbiAgICAgKiBUaGlzIFVSTCBjcmVhdGVzIGEgbmV3IHNlc3Npb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqKi9cbiAgICBsZXQgbmV3U2Vzc2lvblVSTDtcblxuICAgIC8qKiBAdHlwZSB7U2Vzc2lvbkhlbHBlcnNbJ3N0YXJ0U2Vzc2lvbiddfSAqL1xuICAgIGxldCBzdGFydFNlc3Npb247XG4gICAgLyoqIEB0eXBlIHtTZXNzaW9uSGVscGVyc1snZ2V0U2Vzc2lvbiddfSAqL1xuICAgIGxldCBnZXRTZXNzaW9uO1xuICAgIC8qKiBAdHlwZSB7U2Vzc2lvbkhlbHBlcnNbJ2VuZFNlc3Npb24nXX0gKi9cbiAgICBsZXQgZW5kU2Vzc2lvbjtcbiAgICAvKiogQHR5cGUge1Nlc3Npb25IZWxwZXJzWydnZXRDb21tYW5kJ119ICovXG4gICAgbGV0IGdldENvbW1hbmQ7XG4gICAgLyoqIEB0eXBlIHtTZXNzaW9uSGVscGVyc1sncG9zdENvbW1hbmQnXX0gKi9cbiAgICBsZXQgcG9zdENvbW1hbmQ7XG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHBvcnQgPSBwb3J0ID8/IChhd2FpdCBnZXRUZXN0UG9ydCgpKTtcbiAgICAgIGRlZmF1bHRDYXBzID0gey4uLmRlZmF1bHRDYXBzLCAnYXBwaXVtOnBvcnQnOiBwb3J0fTtcbiAgICAgIGQgPSBuZXcgRHJpdmVyQ2xhc3Moe3BvcnQsIGFkZHJlc3N9KTtcbiAgICAgIGJhc2VTZXJ2ZXIgPSBhd2FpdCBzZXJ2ZXIoe1xuICAgICAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb246IHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbihkKSxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgaG9zdG5hbWU6IGFkZHJlc3MsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgY2xpQXJnczoge30sXG4gICAgICB9KTtcbiAgICAgICh7c3RhcnRTZXNzaW9uLCBnZXRTZXNzaW9uLCBlbmRTZXNzaW9uLCBuZXdTZXNzaW9uVVJMLCBnZXRDb21tYW5kLCBwb3N0Q29tbWFuZH0gPVxuICAgICAgICBjcmVhdGVTZXNzaW9uSGVscGVycyhwb3J0LCBhZGRyZXNzKSk7XG4gICAgfSk7XG5cbiAgICBhZnRlcihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBiYXNlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2Vzc2lvbiBoYW5kbGluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIGlkZW1wb3RlbmN5IHdoaWxlIGNyZWF0aW5nIHNlc3Npb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzZXNzaW9uSWRzID0gW107XG4gICAgICAgIGxldCB0aW1lcyA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjb25zdCB7c2Vzc2lvbklkfSA9IGF3YWl0IHN0YXJ0U2Vzc2lvbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiB7YWx3YXlzTWF0Y2g6IGRlZmF1bHRDYXBzfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnWC1JZGVtcG90ZW5jeS1LZXknOiAnMTIzNDU2JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgLy8gWFhYOiBJJ20gbm90IHN1cmUgd2hhdCB0aGVzZSBhcmUsIGFzIHRoZXkgYXJlIG5vdCBkb2N1bWVudGVkIGF4aW9zIG9wdGlvbnMsXG4gICAgICAgICAgICAgIC8vIG5vciBhcmUgdGhleSBtZW50aW9uZWQgaW4gb3VyIHNvdXJjZVxuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICAgIHNpbXBsZTogZmFsc2UsXG4gICAgICAgICAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBzZXNzaW9uSWRzLnB1c2goc2Vzc2lvbklkKTtcbiAgICAgICAgICB0aW1lcysrO1xuICAgICAgICB9IHdoaWxlICh0aW1lcyA8IDIpO1xuICAgICAgICBfLnVuaXEoc2Vzc2lvbklkcykubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcblxuICAgICAgICBjb25zdCB7c3RhdHVzLCBkYXRhfSA9IGF3YWl0IGVuZFNlc3Npb24oc2Vzc2lvbklkc1swXSk7XG4gICAgICAgIHN0YXR1cy5zaG91bGQuZXF1YWwoMjAwKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGRhdGEudmFsdWUsIG51bGwpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIGlkZW1wb3RlbmN5IHdoaWxlIGNyZWF0aW5nIHBhcmFsbGVsIHNlc3Npb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZXFzID0gW107XG4gICAgICAgIGxldCB0aW1lcyA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICByZXFzLnB1c2goXG4gICAgICAgICAgICBzdGFydFNlc3Npb24oXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgICAgICAgIGFsd2F5c01hdGNoOiBkZWZhdWx0Q2FwcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgJ1gtSWRlbXBvdGVuY3ktS2V5JzogJzEyMzQ1JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aW1lcysrO1xuICAgICAgICB9IHdoaWxlICh0aW1lcyA8IDIpO1xuICAgICAgICBjb25zdCBzZXNzaW9uSWRzID0gXy5tYXAoYXdhaXQgQi5hbGwocmVxcyksICdzZXNzaW9uSWQnKTtcbiAgICAgICAgXy51bmlxKHNlc3Npb25JZHMpLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG5cbiAgICAgICAgY29uc3Qge3N0YXR1cywgZGF0YX0gPSBhd2FpdCBlbmRTZXNzaW9uKHNlc3Npb25JZHNbMF0pO1xuICAgICAgICBzdGF0dXMuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkYXRhLnZhbHVlLCBudWxsKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBzZXNzaW9uIGFuZCByZXRyaWV2ZSBhIHNlc3Npb24gaWQsIHRoZW4gZGVsZXRlIGl0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQge3N0YXR1cywgZGF0YX0gPSBhd2FpdCBheGlvcy5wb3N0KG5ld1Nlc3Npb25VUkwsIHtcbiAgICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgIGFsd2F5c01hdGNoOiBkZWZhdWx0Q2FwcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBzdGF0dXMuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICAgIHNob3VsZC5leGlzdChkYXRhLnZhbHVlLnNlc3Npb25JZCk7XG4gICAgICAgIGRhdGEudmFsdWUuY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZS5zaG91bGQuZXF1YWwoZGVmYXVsdENhcHMucGxhdGZvcm1OYW1lKTtcbiAgICAgICAgZGF0YS52YWx1ZS5jYXBhYmlsaXRpZXMuZGV2aWNlTmFtZS5zaG91bGQuZXF1YWwoZGVmYXVsdENhcHNbJ2FwcGl1bTpkZXZpY2VOYW1lJ10pO1xuXG4gICAgICAgICh7c3RhdHVzLCBkYXRhfSA9IGF3YWl0IGVuZFNlc3Npb24oLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkLnNlc3Npb25JZCkpKTtcblxuICAgICAgICBzdGF0dXMuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkYXRhLnZhbHVlLCBudWxsKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGQuc2Vzc2lvbklkLCBudWxsKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQuc2tpcCgnc2hvdWxkIHRocm93IE5ZSSBmb3IgY29tbWFuZHMgbm90IGltcGxlbWVudGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge30pO1xuXG4gICAgZGVzY3JpYmUoJ2NvbW1hbmQgdGltZW91dHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgb3JpZ2luYWxGaW5kRWxlbWVudCwgb3JpZ2luYWxGaW5kRWxlbWVudHM7XG5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAgICovXG4gICAgICBhc3luYyBmdW5jdGlvbiBzdGFydFRpbWVvdXRTZXNzaW9uKHRpbWVvdXQpIHtcbiAgICAgICAgY29uc3QgY2FwcyA9IF8uY2xvbmVEZWVwKGRlZmF1bHRDYXBzKTtcbiAgICAgICAgY2Fwc1snYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0J10gPSB0aW1lb3V0O1xuICAgICAgICByZXR1cm4gYXdhaXQgc3RhcnRTZXNzaW9uKHtjYXBhYmlsaXRpZXM6IHthbHdheXNNYXRjaDogY2Fwc319KTtcbiAgICAgIH1cblxuICAgICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb3JpZ2luYWxGaW5kRWxlbWVudCA9IGQuZmluZEVsZW1lbnQ7XG4gICAgICAgIGQuZmluZEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuICdmb28nO1xuICAgICAgICB9LmJpbmQoZCk7XG5cbiAgICAgICAgb3JpZ2luYWxGaW5kRWxlbWVudHMgPSBkLmZpbmRFbGVtZW50cztcbiAgICAgICAgZC5maW5kRWxlbWVudHMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgQi5kZWxheSgyMDApO1xuICAgICAgICAgIHJldHVybiBbJ2ZvbyddO1xuICAgICAgICB9LmJpbmQoZCk7XG4gICAgICB9KTtcblxuICAgICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBkLmZpbmRFbGVtZW50ID0gb3JpZ2luYWxGaW5kRWxlbWVudDtcbiAgICAgICAgZC5maW5kRWxlbWVudHMgPSBvcmlnaW5hbEZpbmRFbGVtZW50cztcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHNldCBhIGRlZmF1bHQgY29tbWFuZFRpbWVvdXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigpO1xuICAgICAgICBkLm5ld0NvbW1hbmRUaW1lb3V0TXMuc2hvdWxkLmJlLmFib3ZlKDApO1xuICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRpbWVvdXQgb24gY29tbWFuZHMgdXNpbmcgY29tbWFuZFRpbWVvdXQgY2FwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbmV3U2Vzc2lvbiA9IGF3YWl0IHN0YXJ0VGltZW91dFNlc3Npb24oMC4yNSk7XG4gICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZC5zZXNzaW9uSWQpO1xuICAgICAgICBhd2FpdCBwb3N0Q29tbWFuZChzZXNzaW9uSWQsICdlbGVtZW50Jywge1xuICAgICAgICAgIHVzaW5nOiAnbmFtZScsXG4gICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgQi5kZWxheSg0MDApO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGdldFNlc3Npb24oc2Vzc2lvbklkKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHZhbHVlLmVycm9yLCAnaW52YWxpZCBzZXNzaW9uIGlkJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkLnNlc3Npb25JZCwgbnVsbCk7XG4gICAgICAgIGNvbnN0IHJlc3AgPSAoYXdhaXQgZW5kU2Vzc2lvbihuZXdTZXNzaW9uLnNlc3Npb25JZCkpLmRhdGEudmFsdWU7XG4gICAgICAgIHNob3VsZC5lcXVhbChyZXNwPy5lcnJvciwgJ2ludmFsaWQgc2Vzc2lvbiBpZCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IHRpbWVvdXQgd2l0aCBjb21tYW5kVGltZW91dCBvZiBmYWxzZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IG5ld1Nlc3Npb24gPSBhd2FpdCBzdGFydFRpbWVvdXRTZXNzaW9uKDAuMSk7XG4gICAgICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcG9zdENvbW1hbmQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkLnNlc3Npb25JZCksICdlbGVtZW50cycsIHtcbiAgICAgICAgICB1c2luZzogJ25hbWUnLFxuICAgICAgICAgIHZhbHVlOiAnZm9vJyxcbiAgICAgICAgfSk7XG4gICAgICAgIChEYXRlLm5vdygpIC0gc3RhcnQpLnNob3VsZC5iZS5hYm92ZSgxNTApO1xuICAgICAgICB2YWx1ZS5zaG91bGQuZXFsKFsnZm9vJ10pO1xuICAgICAgICBhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCB0aW1lb3V0IHdpdGggY29tbWFuZFRpbWVvdXQgb2YgMCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZC5uZXdDb21tYW5kVGltZW91dE1zID0gMjtcbiAgICAgICAgbGV0IG5ld1Nlc3Npb24gPSBhd2FpdCBzdGFydFRpbWVvdXRTZXNzaW9uKDApO1xuXG4gICAgICAgIGF3YWl0IHBvc3RDb21tYW5kKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZC5zZXNzaW9uSWQpLCAnZWxlbWVudCcsIHtcbiAgICAgICAgICB1c2luZzogJ25hbWUnLFxuICAgICAgICAgIHZhbHVlOiAnZm9vJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IEIuZGVsYXkoNDAwKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBnZXRTZXNzaW9uKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZC5zZXNzaW9uSWQpKTtcbiAgICAgICAgdmFsdWUucGxhdGZvcm1OYW1lPy5zaG91bGQuZXF1YWwoZGVmYXVsdENhcHMucGxhdGZvcm1OYW1lKTtcbiAgICAgICAgY29uc3QgcmVzcCA9IChhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKSkuZGF0YS52YWx1ZTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJlc3AsIG51bGwpO1xuXG4gICAgICAgIGQubmV3Q29tbWFuZFRpbWVvdXRNcyA9IDYwICogMTAwMDtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCB0aW1lb3V0IGlmIGl0cyBqdXN0IHRoZSBjb21tYW5kIHRha2luZyBhd2hpbGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigwLjI1KTtcbiAgICAgICAgLy8gWFhYOiByYWNlIGNvbmRpdGlvbjogd2UgbXVzdCBidWlsZCB0aGlzIFVSTCBiZWZvcmUgLi4uc29tZXRoaW5nIGhhcHBlbnMuLi5cbiAgICAgICAgLy8gd2hpY2ggY2F1c2VzIGBkLnNlc3Npb25JZGAgdG8gYmUgbWlzc2luZ1xuICAgICAgICBjb25zdCB7c2Vzc2lvbklkfSA9IGQ7XG5cbiAgICAgICAgYXdhaXQgcG9zdENvbW1hbmQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkLnNlc3Npb25JZCksICdlbGVtZW50Jywge1xuICAgICAgICAgIHVzaW5nOiAnbmFtZScsXG4gICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgQi5kZWxheSg0MDApO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGdldFNlc3Npb24oLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzZXNzaW9uSWQpKTtcbiAgICAgICAgdmFsdWUuZXJyb3Iuc2hvdWxkLmVxdWFsKCdpbnZhbGlkIHNlc3Npb24gaWQnKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGQuc2Vzc2lvbklkLCBudWxsKTtcbiAgICAgICAgY29uc3QgcmVzcCA9IChhd2FpdCBlbmRTZXNzaW9uKG5ld1Nlc3Npb24uc2Vzc2lvbklkKSkuZGF0YS52YWx1ZTtcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovICgvKiogQHR5cGUgeyB7ZXJyb3I6IHN0cmluZ30gfSAqLyAocmVzcCkuZXJyb3IpLnNob3VsZC5lcXVhbChcbiAgICAgICAgICAnaW52YWxpZCBzZXNzaW9uIGlkJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IGhhdmUgYSB0aW1lciBydW5uaW5nIGJlZm9yZSBvciBhZnRlciBhIHNlc3Npb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgc2hvdWxkLm5vdC5leGlzdChkLm5vQ29tbWFuZFRpbWVyKTtcbiAgICAgICAgbGV0IG5ld1Nlc3Npb24gPSBhd2FpdCBzdGFydFRpbWVvdXRTZXNzaW9uKDAuMjUpO1xuICAgICAgICBuZXdTZXNzaW9uLnNlc3Npb25JZC5zaG91bGQuZXF1YWwoZC5zZXNzaW9uSWQpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHNob3VsZC5leGlzdChkLm5vQ29tbWFuZFRpbWVyKTtcbiAgICAgICAgYXdhaXQgZW5kU2Vzc2lvbihuZXdTZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgc2hvdWxkLm5vdC5leGlzdChkLm5vQ29tbWFuZFRpbWVyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NldHRpbmdzIGFwaScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGQuc2V0dGluZ3MgPSBuZXcgRGV2aWNlU2V0dGluZ3Moe2lnbm9yZVVuaW1wb3J0YW50Vmlld3M6IGZhbHNlfSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgYmUgYWJsZSB0byBnZXQgc2V0dGluZ3Mgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkLnNldHRpbmdzLmdldFNldHRpbmdzKCkuaWdub3JlVW5pbXBvcnRhbnRWaWV3cy5zaG91bGQuYmUuZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgbm90IHJlamVjdCB3aGVuIGB1cGRhdGVTZXR0aW5nc2AgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgZC5zZXR0aW5ncy51cGRhdGUoe2lnbm9yZVVuaW1wb3J0YW50Vmlld3M6IHRydWV9KS5zaG91bGQubm90LmJlLnJlamVjdGVkO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHJlamVjdCBmb3IgaW52YWxpZCB1cGRhdGUgb2JqZWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBkLnNldHRpbmdzXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIC51cGRhdGUoJ2ludmFsaWQganNvbicpXG4gICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0pTT04nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3VuZXhwZWN0ZWQgZXhpdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvKiogQHR5cGUge2ltcG9ydCgnc2lub24nKS5TaW5vblNhbmRib3h9ICovXG4gICAgICBsZXQgc2FuZGJveDtcbiAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBzYW5kYm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNhbmRib3gucmVzdG9yZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgY3VycmVudCBjb21tYW5kIHdoZW4gdGhlIGRyaXZlciBjcmFzaGVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBzYW5kYm94LnN0dWIoZCwgJ2dldFN0YXR1cycpLmNhbGxzRmFrZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgQi5kZWxheSg1MDAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlcVByb21pc2UgPSBnZXRDb21tYW5kKCdzdGF0dXMnLCB7dmFsaWRhdGVTdGF0dXM6IG51bGx9KTtcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVlc3QgZ2V0cyB0byB0aGUgc2VydmVyIGJlZm9yZSBvdXIgc2h1dGRvd25cbiAgICAgICAgYXdhaXQgQi5kZWxheSgxMDApO1xuICAgICAgICBjb25zdCBzaHV0ZG93bkV2ZW50UHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICdvblVuZXhwZWN0ZWRTaHV0ZG93biBldmVudCBpcyBleHBlY3RlZCB0byBiZSBmaXJlZCB3aXRoaW4gNSBzZWNvbmRzIHRpbWVvdXQnXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgNTAwMFxuICAgICAgICAgICk7XG4gICAgICAgICAgZC5vblVuZXhwZWN0ZWRTaHV0ZG93bihyZXNvbHZlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGQuc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24obmV3IEVycm9yKCdDcmFzaHl0aW1lcycpKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCByZXFQcm9taXNlO1xuICAgICAgICB2YWx1ZS5tZXNzYWdlLnNob3VsZC5jb250YWluKCdDcmFzaHl0aW1lcycpO1xuICAgICAgICBhd2FpdCBzaHV0ZG93bkV2ZW50UHJvbWlzZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2V2ZW50IHRpbWluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIG5vdCBhZGQgdGltaW5ncyBpZiBub3QgdXNpbmcgb3B0LWluIGNhcCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHN0YXJ0U2Vzc2lvbih7Y2FwYWJpbGl0aWVzOiB7YWx3YXlzTWF0Y2g6IGRlZmF1bHRDYXBzfX0pO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBnZXRTZXNzaW9uKHNlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgc2hvdWxkLm5vdC5leGlzdChyZXMuZXZlbnRzKTtcbiAgICAgICAgYXdhaXQgZW5kU2Vzc2lvbihzZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgYWRkIHN0YXJ0IHNlc3Npb24gdGltaW5ncycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY2FwcyA9IHsuLi5kZWZhdWx0Q2FwcywgJ2FwcGl1bTpldmVudFRpbWluZ3MnOiB0cnVlfTtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHN0YXJ0U2Vzc2lvbih7Y2FwYWJpbGl0aWVzOiB7YWx3YXlzTWF0Y2g6IGNhcHN9fSk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdldFNlc3Npb24oc2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgICBzaG91bGQuZXhpc3QocmVzLmV2ZW50cyk7XG4gICAgICAgIHNob3VsZC5leGlzdChyZXMuZXZlbnRzPy5uZXdTZXNzaW9uUmVxdWVzdGVkKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHJlcy5ldmVudHM/Lm5ld1Nlc3Npb25TdGFydGVkKTtcbiAgICAgICAgcmVzLmV2ZW50cz8ubmV3U2Vzc2lvblJlcXVlc3RlZFswXS5zaG91bGQuYmUuYSgnbnVtYmVyJyk7XG4gICAgICAgIHJlcy5ldmVudHM/Lm5ld1Nlc3Npb25TdGFydGVkWzBdLnNob3VsZC5iZS5hKCdudW1iZXInKTtcbiAgICAgICAgYXdhaXQgZW5kU2Vzc2lvbihzZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQSB7QGxpbmtjb2RlIERyaXZlckNsYXNzfSwgZXhjZXB0IHVzaW5nIHRoZSBiYXNlIHtAbGlua2NvZGUgRHJpdmVyfSB0eXBlIGluc3RlYWQgb2YgYEV4dGVybmFsRHJpdmVyYC5cbiAqIFRoaXMgYWxsb3dzIHRoZSBzdWl0ZSB0byB3b3JrIGZvciBgQmFzZURyaXZlcmAuXG4gKiBAdGVtcGxhdGUge0RyaXZlcn0gUFxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlckNsYXNzPFA+fSBEcml2ZXJDbGFzc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNhcGFiaWxpdGllc30gQ2FwYWJpbGl0aWVzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyfSBEcml2ZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJTdGF0aWN9IERyaXZlclN0YXRpY1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVczQ0NhcGFiaWxpdGllc30gQXBwaXVtVzNDQ2FwYWJpbGl0aWVzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdheGlvcycpLkF4aW9zUmVxdWVzdENvbmZpZ30gQXhpb3NSZXF1ZXN0Q29uZmlnXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuU2luZ3VsYXJTZXNzaW9uRGF0YX0gU2luZ3VsYXJTZXNzaW9uRGF0YVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFQsRFxuICogQHR5cGVkZWYge2ltcG9ydCgnYXhpb3MnKS5BeGlvc1Jlc3BvbnNlPFQsIEQ+fSBBeGlvc1Jlc3BvbnNlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBOZXdTZXNzaW9uRGF0YVxuICogQHByb3BlcnR5IHtpbXBvcnQoJ3R5cGUtZmVzdCcpLlJlcXVpcmVBdExlYXN0T25lPGltcG9ydCgnQGFwcGl1bS90eXBlcycpLlczQ0NhcGFiaWxpdGllcywgJ2ZpcnN0TWF0Y2gnfCdhbHdheXNNYXRjaCc+fSBjYXBhYmlsaXRpZXNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE5ld1Nlc3Npb25SZXNwb25zZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlc3Npb25JZCxcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ2FwYWJpbGl0aWVzfSBjYXBhYmlsaXRpZXNcbiAqL1xuXG4vKipcbiAqIFNvbWUgRTJFIGhlbHBlcnMgZm9yIG1ha2luZyByZXF1ZXN0cyBhbmQgbWFuYWdpbmcgc2Vzc2lvbnNcbiAqIFNlZSB7QGxpbmtjb2RlIGNyZWF0ZVNlc3Npb25IZWxwZXJzfVxuICogQHRlbXBsYXRlIFtDb21tYW5kRGF0YT11bmtub3duXVxuICogQHRlbXBsYXRlIFtSZXNwb25zZURhdGE9YW55XVxuICogQHR5cGVkZWYgU2Vzc2lvbkhlbHBlcnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuZXdTZXNzaW9uVVJMIC0gVVJMIHRvIGNyZWF0ZSBhIG5ldyBzZXNzaW9uLiBDYW4gYmUgdXNlZCB3aXRoIHJhdyBgYXhpb3NgIHJlcXVlc3RzIHRvIGZ1bGx5IGluc3BlY3QgcmF3IHJlc3BvbnNlLiAgTW9zdGx5LCB0aGlzIHdpbGwgbm90IGJlIHVzZWQuXG4gKiBAcHJvcGVydHkgeyhkYXRhOiBOZXdTZXNzaW9uRGF0YSwgY29uZmlnPzogQXhpb3NSZXF1ZXN0Q29uZmlnKSA9PiBQcm9taXNlPE5ld1Nlc3Npb25SZXNwb25zZT59IHN0YXJ0U2Vzc2lvbiAtIEJlZ2luIGEgc2Vzc2lvblxuICogQHByb3BlcnR5IHsoc2Vzc2lvbklkOiBzdHJpbmcpID0+IFByb21pc2U8QXhpb3NSZXNwb25zZTx7dmFsdWU6IHtlcnJvcj86IHN0cmluZ30/fSwge3ZhbGlkYXRlU3RhdHVzOiBudWxsfT4+fSBlbmRTZXNzaW9uIC0gRW5kIGEgc2Vzc2lvbi4gX05vdGU6IHJlc29sdmVzIHdpdGggcmF3IHJlc3BvbnNlIG9iamVjdF9cbiAqIEBwcm9wZXJ0eSB7KHNlc3Npb25JZDogc3RyaW5nKSA9PiBQcm9taXNlPFNpbmd1bGFyU2Vzc2lvbkRhdGE+fSBnZXRTZXNzaW9uIC0gR2V0IGluZm8gYWJvdXQgYSBzZXNzaW9uXG4gKiBAcHJvcGVydHkgeyhzZXNzaW9uSWQ6IHN0cmluZywgY21kTmFtZTogc3RyaW5nLCBkYXRhPzogQ29tbWFuZERhdGEsIGNvbmZpZz86IEF4aW9zUmVxdWVzdENvbmZpZykgPT4gUHJvbWlzZTxSZXNwb25zZURhdGE+fSBwb3N0Q29tbWFuZCAtIFNlbmQgYW4gYXJiaXRyYXJ5IGNvbW1hbmQgdmlhIGBQT1NUYC5cbiAqIEBwcm9wZXJ0eSB7KHNlc3Npb25JZE9yQ21kTmFtZTogc3RyaW5nLCBjbWROYW1lT3JDb25maWc6IHN0cmluZ3xBeGlvc1JlcXVlc3RDb25maWcsIGNvbmZpZz86IEF4aW9zUmVxdWVzdENvbmZpZykgPT4gUHJvbWlzZTxSZXNwb25zZURhdGE+fSBnZXRDb21tYW5kIC0gU2VuZCBhbiBhcmJpdHJhcnkgY29tbWFuZCB2aWEgYEdFVGAuIE9wdGlvbmFsIGBzZXNzaW9uSWRgLlxuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLE1BQU0sR0FBR0MsYUFBQSxDQUFLRCxNQUFMLEVBQWY7O0FBVU8sU0FBU0Usb0JBQVQsQ0FBOEJDLElBQTlCLEVBQW9DQyxPQUFPLEdBQUdDLGtCQUE5QyxFQUF5RDtFQUM5RCxNQUFNQyxtQkFBbUIsR0FFckIsSUFBQUMsd0JBQUEsRUFBZ0JILE9BQWhCLEVBQXlCRCxJQUF6QixDQUZKO0VBS0EsTUFBTUssZ0JBQWdCLEdBQUdGLG1CQUFtQixDQUFDRyxlQUFELEVBQUksRUFBSixDQUE1QztFQUNBLE1BQU1DLGFBQWEsR0FBR0osbUJBQW1CLENBQUMsRUFBRCxFQUFLLFNBQUwsQ0FBekM7RUFDQSxPQUFpRTtJQUMvREksYUFEK0Q7SUFFL0RKLG1CQUYrRDtJQVcvREssV0FBVyxFQUFFLE9BQU9DLFNBQVAsRUFBa0JDLE9BQWxCLEVBQTJCQyxJQUFJLEdBQUcsRUFBbEMsRUFBc0NDLE1BQU0sR0FBRyxFQUEvQyxLQUFzRDtNQUFBOztNQUNqRSxNQUFNQyxHQUFHLEdBQUdWLG1CQUFtQixDQUFDTSxTQUFELEVBQVlDLE9BQVosQ0FBL0I7TUFDQSxNQUFNSSxRQUFRLEdBQUcsTUFBTUMsY0FBQSxDQUFNQyxJQUFOLENBQVdILEdBQVgsRUFBZ0JGLElBQWhCLEVBQXNCQyxNQUF0QixDQUF2QjtNQUNBLHlCQUFPRSxRQUFRLENBQUNILElBQWhCLG1EQUFPLGVBQWVNLEtBQXRCO0lBQ0QsQ0FmOEQ7SUF1Qi9EQyxVQUFVLEVBQUUsT0FBT0Msa0JBQVAsRUFBMkJDLGVBQTNCLEVBQTRDUixNQUFNLEdBQUcsRUFBckQsS0FBNEQ7TUFBQTs7TUFDdEUsSUFBSSxDQUFDTixlQUFBLENBQUVlLFFBQUYsQ0FBV0QsZUFBWCxDQUFMLEVBQWtDO1FBQ2hDUixNQUFNLEdBQUdRLGVBQVQ7UUFDQUEsZUFBZSxHQUFHRCxrQkFBbEI7UUFDQUEsa0JBQWtCLEdBQUcsRUFBckI7TUFDRDs7TUFDRCxNQUFNTCxRQUFRLEdBQUcsTUFBTSxJQUFBQyxjQUFBLEVBQU07UUFDM0JGLEdBQUcsRUFBRVYsbUJBQW1CLENBQUNnQixrQkFBRCxFQUFxQkMsZUFBckIsQ0FERztRQUUzQkUsY0FBYyxFQUFFLElBRlc7UUFHM0IsR0FBR1Y7TUFId0IsQ0FBTixDQUF2QjtNQUtBLDBCQUFPRSxRQUFRLENBQUNILElBQWhCLG9EQUFPLGdCQUFlTSxLQUF0QjtJQUNELENBbkM4RDtJQXlDL0RNLFlBQVksRUFBRSxPQUFPWixJQUFQLEVBQWFDLE1BQU0sR0FBRyxFQUF0QixLQUE2QjtNQUFBOztNQUN6Q0QsSUFBSSxHQUFHTCxlQUFBLENBQUVrQixZQUFGLENBQWViLElBQWYsRUFBcUI7UUFDMUJjLFlBQVksRUFBRTtVQUNaQyxXQUFXLEVBQUUsRUFERDtVQUVaQyxVQUFVLEVBQUUsQ0FBQyxFQUFEO1FBRkE7TUFEWSxDQUFyQixDQUFQO01BTUEsTUFBTWIsUUFBUSxHQUFHLE1BQU1DLGNBQUEsQ0FBTUMsSUFBTixDQUFXVCxhQUFYLEVBQTBCSSxJQUExQixFQUFnQ0MsTUFBaEMsQ0FBdkI7TUFDQSwwQkFBT0UsUUFBUSxDQUFDSCxJQUFoQixvREFBTyxnQkFBZU0sS0FBdEI7SUFDRCxDQWxEOEQ7SUF1RC9EVyxVQUFVLEVBQUUsTUFBT25CLFNBQVAsSUFDVixNQUFNTSxjQUFBLENBQU1jLE1BQU4sQ0FBYXhCLGdCQUFnQixDQUFDSSxTQUFELENBQTdCLEVBQTBDO01BQzlDYSxjQUFjLEVBQUU7SUFEOEIsQ0FBMUMsQ0F4RHVEO0lBK0QvRFEsVUFBVSxFQUFFLE1BQU9yQixTQUFQLElBQXFCO01BQUE7O01BQy9CLE1BQU1LLFFBQVEsR0FBRyxNQUFNLElBQUFDLGNBQUEsRUFBTTtRQUMzQkYsR0FBRyxFQUFFUixnQkFBZ0IsQ0FBQ0ksU0FBRCxDQURNO1FBRTNCYSxjQUFjLEVBQUU7TUFGVyxDQUFOLENBQXZCO01BSUEsMEJBQU9SLFFBQVEsQ0FBQ0gsSUFBaEIsb0RBQU8sZ0JBQWVNLEtBQXRCO0lBQ0Q7RUFyRThELENBQWpFO0FBdUVEOztBQVFNLFNBQVNjLGtCQUFULENBQTRCQyxXQUE1QixFQUF5Q0MsV0FBVyxHQUFHLEVBQXZELEVBQTJEO0VBQ2hFLElBQUloQyxPQUFPLEdBQUdnQyxXQUFXLENBQUMsZ0JBQUQsQ0FBWCxJQUFpQy9CLGtCQUEvQztFQUNBLElBQUlGLElBQUksR0FBR2lDLFdBQVcsQ0FBQyxhQUFELENBQXRCO0VBQ0EsTUFBTUMsU0FBUyxHQUFHRixXQUFXLENBQUNHLElBQVosSUFBb0Isa0JBQXRDO0VBRUFDLFFBQVEsQ0FBRSxzQkFBcUJGLFNBQVUsR0FBakMsRUFBcUMsWUFBWTtJQUN2RCxJQUFJRyxVQUFKO0lBRUEsSUFBSUMsQ0FBSjtJQUtBLElBQUkvQixhQUFKO0lBR0EsSUFBSWdCLFlBQUo7SUFFQSxJQUFJTyxVQUFKO0lBRUEsSUFBSUYsVUFBSjtJQUVBLElBQUlWLFVBQUo7SUFFQSxJQUFJVixXQUFKO0lBQ0ErQixNQUFNLENBQUMsa0JBQWtCO01BQ3ZCdkMsSUFBSSxHQUFHQSxJQUFJLEtBQUssTUFBTSxJQUFBd0Msb0JBQUEsR0FBWCxDQUFYO01BQ0FQLFdBQVcsR0FBRyxFQUFDLEdBQUdBLFdBQUo7UUFBaUIsZUFBZWpDO01BQWhDLENBQWQ7TUFDQXNDLENBQUMsR0FBRyxJQUFJTixXQUFKLENBQWdCO1FBQUNoQyxJQUFEO1FBQU9DO01BQVAsQ0FBaEIsQ0FBSjtNQUNBb0MsVUFBVSxHQUFHLE1BQU0sSUFBQUksY0FBQSxFQUFPO1FBQ3hCQyx3QkFBd0IsRUFBRSxJQUFBQSxnQ0FBQSxFQUF5QkosQ0FBekIsQ0FERjtRQUV4QnRDLElBRndCO1FBR3hCMkMsUUFBUSxFQUFFMUMsT0FIYztRQUt4QjJDLE9BQU8sRUFBRTtNQUxlLENBQVAsQ0FBbkI7TUFPQSxDQUFDO1FBQUNyQixZQUFEO1FBQWVPLFVBQWY7UUFBMkJGLFVBQTNCO1FBQXVDckIsYUFBdkM7UUFBc0RXLFVBQXREO1FBQWtFVjtNQUFsRSxJQUNDVCxvQkFBb0IsQ0FBQ0MsSUFBRCxFQUFPQyxPQUFQLENBRHRCO0lBRUQsQ0FiSyxDQUFOO0lBZUE0QyxLQUFLLENBQUMsa0JBQWtCO01BQ3RCLE1BQU1SLFVBQVUsQ0FBQ1MsS0FBWCxFQUFOO0lBQ0QsQ0FGSSxDQUFMO0lBSUFWLFFBQVEsQ0FBQyxrQkFBRCxFQUFxQixZQUFZO01BQ3ZDVyxFQUFFLENBQUMsbURBQUQsRUFBc0Qsa0JBQWtCO1FBQ3hFLE1BQU1DLFVBQVUsR0FBRyxFQUFuQjtRQUNBLElBQUlDLEtBQUssR0FBRyxDQUFaOztRQUNBLEdBQUc7VUFDRCxNQUFNO1lBQUN4QztVQUFELElBQWMsTUFBTWMsWUFBWSxDQUNwQztZQUNFRSxZQUFZLEVBQUU7Y0FBQ0MsV0FBVyxFQUFFTztZQUFkO1VBRGhCLENBRG9DLEVBSXBDO1lBQ0VpQixPQUFPLEVBQUU7Y0FDUCxxQkFBcUI7WUFEZCxDQURYO1lBT0VDLE1BQU0sRUFBRSxLQVBWO1lBUUVDLHVCQUF1QixFQUFFO1VBUjNCLENBSm9DLENBQXRDO1VBZ0JBSixVQUFVLENBQUNLLElBQVgsQ0FBZ0I1QyxTQUFoQjtVQUNBd0MsS0FBSztRQUNOLENBbkJELFFBbUJTQSxLQUFLLEdBQUcsQ0FuQmpCOztRQW9CQTNDLGVBQUEsQ0FBRWdELElBQUYsQ0FBT04sVUFBUCxFQUFtQk8sTUFBbkIsQ0FBMEIxRCxNQUExQixDQUFpQzJELEtBQWpDLENBQXVDLENBQXZDOztRQUVBLE1BQU07VUFBQ0MsTUFBRDtVQUFTOUM7UUFBVCxJQUFpQixNQUFNaUIsVUFBVSxDQUFDb0IsVUFBVSxDQUFDLENBQUQsQ0FBWCxDQUF2QztRQUNBUyxNQUFNLENBQUM1RCxNQUFQLENBQWMyRCxLQUFkLENBQW9CLEdBQXBCO1FBQ0EzRCxNQUFNLENBQUMyRCxLQUFQLENBQWE3QyxJQUFJLENBQUNNLEtBQWxCLEVBQXlCLElBQXpCO01BQ0QsQ0E1QkMsQ0FBRjtNQThCQThCLEVBQUUsQ0FBQyw0REFBRCxFQUErRCxrQkFBa0I7UUFDakYsTUFBTVcsSUFBSSxHQUFHLEVBQWI7UUFDQSxJQUFJVCxLQUFLLEdBQUcsQ0FBWjs7UUFDQSxHQUFHO1VBQ0RTLElBQUksQ0FBQ0wsSUFBTCxDQUNFOUIsWUFBWSxDQUNWO1lBQ0VFLFlBQVksRUFBRTtjQUNaQyxXQUFXLEVBQUVPO1lBREQ7VUFEaEIsQ0FEVSxFQU1WO1lBQ0VpQixPQUFPLEVBQUU7Y0FDUCxxQkFBcUI7WUFEZDtVQURYLENBTlUsQ0FEZDtVQWNBRCxLQUFLO1FBQ04sQ0FoQkQsUUFnQlNBLEtBQUssR0FBRyxDQWhCakI7O1FBaUJBLE1BQU1ELFVBQVUsR0FBRzFDLGVBQUEsQ0FBRXFELEdBQUYsQ0FBTSxNQUFNQyxpQkFBQSxDQUFFQyxHQUFGLENBQU1ILElBQU4sQ0FBWixFQUF5QixXQUF6QixDQUFuQjs7UUFDQXBELGVBQUEsQ0FBRWdELElBQUYsQ0FBT04sVUFBUCxFQUFtQk8sTUFBbkIsQ0FBMEIxRCxNQUExQixDQUFpQzJELEtBQWpDLENBQXVDLENBQXZDOztRQUVBLE1BQU07VUFBQ0MsTUFBRDtVQUFTOUM7UUFBVCxJQUFpQixNQUFNaUIsVUFBVSxDQUFDb0IsVUFBVSxDQUFDLENBQUQsQ0FBWCxDQUF2QztRQUNBUyxNQUFNLENBQUM1RCxNQUFQLENBQWMyRCxLQUFkLENBQW9CLEdBQXBCO1FBQ0EzRCxNQUFNLENBQUMyRCxLQUFQLENBQWE3QyxJQUFJLENBQUNNLEtBQWxCLEVBQXlCLElBQXpCO01BQ0QsQ0ExQkMsQ0FBRjtNQTRCQThCLEVBQUUsQ0FBQyxpRUFBRCxFQUFvRSxrQkFBa0I7UUFDdEYsSUFBSTtVQUFDVSxNQUFEO1VBQVM5QztRQUFULElBQWlCLE1BQU1JLGNBQUEsQ0FBTUMsSUFBTixDQUFXVCxhQUFYLEVBQTBCO1VBQ25Ea0IsWUFBWSxFQUFFO1lBQ1pDLFdBQVcsRUFBRU87VUFERDtRQURxQyxDQUExQixDQUEzQjtRQU1Bd0IsTUFBTSxDQUFDNUQsTUFBUCxDQUFjMkQsS0FBZCxDQUFvQixHQUFwQjtRQUNBM0QsTUFBTSxDQUFDaUUsS0FBUCxDQUFhbkQsSUFBSSxDQUFDTSxLQUFMLENBQVdSLFNBQXhCO1FBQ0FFLElBQUksQ0FBQ00sS0FBTCxDQUFXUSxZQUFYLENBQXdCc0MsWUFBeEIsQ0FBcUNsRSxNQUFyQyxDQUE0QzJELEtBQTVDLENBQWtEdkIsV0FBVyxDQUFDOEIsWUFBOUQ7UUFDQXBELElBQUksQ0FBQ00sS0FBTCxDQUFXUSxZQUFYLENBQXdCdUMsVUFBeEIsQ0FBbUNuRSxNQUFuQyxDQUEwQzJELEtBQTFDLENBQWdEdkIsV0FBVyxDQUFDLG1CQUFELENBQTNEO1FBRUEsQ0FBQztVQUFDd0IsTUFBRDtVQUFTOUM7UUFBVCxJQUFpQixNQUFNaUIsVUFBVSxDQUF3QlUsQ0FBQyxDQUFDN0IsU0FBMUIsQ0FBbEM7UUFFQWdELE1BQU0sQ0FBQzVELE1BQVAsQ0FBYzJELEtBQWQsQ0FBb0IsR0FBcEI7UUFDQTNELE1BQU0sQ0FBQzJELEtBQVAsQ0FBYTdDLElBQUksQ0FBQ00sS0FBbEIsRUFBeUIsSUFBekI7UUFDQXBCLE1BQU0sQ0FBQzJELEtBQVAsQ0FBYWxCLENBQUMsQ0FBQzdCLFNBQWYsRUFBMEIsSUFBMUI7TUFDRCxDQWpCQyxDQUFGO0lBa0JELENBN0VPLENBQVI7SUErRUFzQyxFQUFFLENBQUNrQixJQUFILENBQVEsK0NBQVIsRUFBeUQsa0JBQWtCLENBQUUsQ0FBN0U7SUFFQTdCLFFBQVEsQ0FBQyxrQkFBRCxFQUFxQixZQUFZO01BQ3ZDLElBQUk4QixtQkFBSixFQUF5QkMsb0JBQXpCOztNQUtBLGVBQWVDLG1CQUFmLENBQW1DQyxPQUFuQyxFQUE0QztRQUMxQyxNQUFNQyxJQUFJLEdBQUdoRSxlQUFBLENBQUVpRSxTQUFGLENBQVl0QyxXQUFaLENBQWI7O1FBQ0FxQyxJQUFJLENBQUMsMEJBQUQsQ0FBSixHQUFtQ0QsT0FBbkM7UUFDQSxPQUFPLE1BQU05QyxZQUFZLENBQUM7VUFBQ0UsWUFBWSxFQUFFO1lBQUNDLFdBQVcsRUFBRTRDO1VBQWQ7UUFBZixDQUFELENBQXpCO01BQ0Q7O01BRUQvQixNQUFNLENBQUMsWUFBWTtRQUNqQjJCLG1CQUFtQixHQUFHNUIsQ0FBQyxDQUFDa0MsV0FBeEI7O1FBQ0FsQyxDQUFDLENBQUNrQyxXQUFGLEdBQWdCLFlBQVk7VUFDMUIsT0FBTyxLQUFQO1FBQ0QsQ0FGZSxDQUVkQyxJQUZjLENBRVRuQyxDQUZTLENBQWhCOztRQUlBNkIsb0JBQW9CLEdBQUc3QixDQUFDLENBQUNvQyxZQUF6Qjs7UUFDQXBDLENBQUMsQ0FBQ29DLFlBQUYsR0FBaUIsa0JBQWtCO1VBQ2pDLE1BQU1kLGlCQUFBLENBQUVlLEtBQUYsQ0FBUSxHQUFSLENBQU47VUFDQSxPQUFPLENBQUMsS0FBRCxDQUFQO1FBQ0QsQ0FIZ0IsQ0FHZkYsSUFIZSxDQUdWbkMsQ0FIVSxDQUFqQjtNQUlELENBWEssQ0FBTjtNQWFBTyxLQUFLLENBQUMsWUFBWTtRQUNoQlAsQ0FBQyxDQUFDa0MsV0FBRixHQUFnQk4sbUJBQWhCO1FBQ0E1QixDQUFDLENBQUNvQyxZQUFGLEdBQWlCUCxvQkFBakI7TUFDRCxDQUhJLENBQUw7TUFLQXBCLEVBQUUsQ0FBQyxxQ0FBRCxFQUF3QyxrQkFBa0I7UUFDMUQsSUFBSTZCLFVBQVUsR0FBRyxNQUFNUixtQkFBbUIsRUFBMUM7UUFDQTlCLENBQUMsQ0FBQ3VDLG1CQUFGLENBQXNCaEYsTUFBdEIsQ0FBNkJpRixFQUE3QixDQUFnQ0MsS0FBaEMsQ0FBc0MsQ0FBdEM7UUFDQSxNQUFNbkQsVUFBVSxDQUFDZ0QsVUFBVSxDQUFDbkUsU0FBWixDQUFoQjtNQUNELENBSkMsQ0FBRjtNQU1Bc0MsRUFBRSxDQUFDLHFEQUFELEVBQXdELGtCQUFrQjtRQUMxRSxJQUFJNkIsVUFBVSxHQUFHLE1BQU1SLG1CQUFtQixDQUFDLElBQUQsQ0FBMUM7UUFDQSxNQUFNM0QsU0FBUyxHQUEwQjZCLENBQUMsQ0FBQzdCLFNBQTNDO1FBQ0EsTUFBTUQsV0FBVyxDQUFDQyxTQUFELEVBQVksU0FBWixFQUF1QjtVQUN0Q3VFLEtBQUssRUFBRSxNQUQrQjtVQUV0Qy9ELEtBQUssRUFBRTtRQUYrQixDQUF2QixDQUFqQjtRQUlBLE1BQU0yQyxpQkFBQSxDQUFFZSxLQUFGLENBQVEsR0FBUixDQUFOO1FBQ0EsTUFBTTFELEtBQUssR0FBRyxNQUFNYSxVQUFVLENBQUNyQixTQUFELENBQTlCO1FBQ0FaLE1BQU0sQ0FBQzJELEtBQVAsQ0FBYXZDLEtBQUssQ0FBQ2dFLEtBQW5CLEVBQTBCLG9CQUExQjtRQUNBcEYsTUFBTSxDQUFDMkQsS0FBUCxDQUFhbEIsQ0FBQyxDQUFDN0IsU0FBZixFQUEwQixJQUExQjtRQUNBLE1BQU15RSxJQUFJLEdBQUcsQ0FBQyxNQUFNdEQsVUFBVSxDQUFDZ0QsVUFBVSxDQUFDbkUsU0FBWixDQUFqQixFQUF5Q0UsSUFBekMsQ0FBOENNLEtBQTNEO1FBQ0FwQixNQUFNLENBQUMyRCxLQUFQLENBQWEwQixJQUFiLGFBQWFBLElBQWIsdUJBQWFBLElBQUksQ0FBRUQsS0FBbkIsRUFBMEIsb0JBQTFCO01BQ0QsQ0FiQyxDQUFGO01BZUFsQyxFQUFFLENBQUMsaURBQUQsRUFBb0Qsa0JBQWtCO1FBQ3RFLElBQUk2QixVQUFVLEdBQUcsTUFBTVIsbUJBQW1CLENBQUMsR0FBRCxDQUExQztRQUNBLElBQUllLEtBQUssR0FBR0MsSUFBSSxDQUFDQyxHQUFMLEVBQVo7UUFDQSxNQUFNcEUsS0FBSyxHQUFHLE1BQU1ULFdBQVcsQ0FBd0I4QixDQUFDLENBQUM3QixTQUExQixFQUFzQyxVQUF0QyxFQUFrRDtVQUMvRXVFLEtBQUssRUFBRSxNQUR3RTtVQUUvRS9ELEtBQUssRUFBRTtRQUZ3RSxDQUFsRCxDQUEvQjtRQUlBLENBQUNtRSxJQUFJLENBQUNDLEdBQUwsS0FBYUYsS0FBZCxFQUFxQnRGLE1BQXJCLENBQTRCaUYsRUFBNUIsQ0FBK0JDLEtBQS9CLENBQXFDLEdBQXJDO1FBQ0E5RCxLQUFLLENBQUNwQixNQUFOLENBQWF5RixHQUFiLENBQWlCLENBQUMsS0FBRCxDQUFqQjtRQUNBLE1BQU0xRCxVQUFVLENBQUNnRCxVQUFVLENBQUNuRSxTQUFaLENBQWhCO01BQ0QsQ0FWQyxDQUFGO01BWUFzQyxFQUFFLENBQUMsNkNBQUQsRUFBZ0Qsa0JBQWtCO1FBQUE7O1FBQ2xFVCxDQUFDLENBQUN1QyxtQkFBRixHQUF3QixDQUF4QjtRQUNBLElBQUlELFVBQVUsR0FBRyxNQUFNUixtQkFBbUIsQ0FBQyxDQUFELENBQTFDO1FBRUEsTUFBTTVELFdBQVcsQ0FBd0I4QixDQUFDLENBQUM3QixTQUExQixFQUFzQyxTQUF0QyxFQUFpRDtVQUNoRXVFLEtBQUssRUFBRSxNQUR5RDtVQUVoRS9ELEtBQUssRUFBRTtRQUZ5RCxDQUFqRCxDQUFqQjtRQUlBLE1BQU0yQyxpQkFBQSxDQUFFZSxLQUFGLENBQVEsR0FBUixDQUFOO1FBQ0EsTUFBTTFELEtBQUssR0FBRyxNQUFNYSxVQUFVLENBQXdCUSxDQUFDLENBQUM3QixTQUExQixDQUE5QjtRQUNBLHVCQUFBUSxLQUFLLENBQUM4QyxZQUFOLDRFQUFvQmxFLE1BQXBCLENBQTJCMkQsS0FBM0IsQ0FBaUN2QixXQUFXLENBQUM4QixZQUE3QztRQUNBLE1BQU1tQixJQUFJLEdBQUcsQ0FBQyxNQUFNdEQsVUFBVSxDQUFDZ0QsVUFBVSxDQUFDbkUsU0FBWixDQUFqQixFQUF5Q0UsSUFBekMsQ0FBOENNLEtBQTNEO1FBQ0FwQixNQUFNLENBQUMyRCxLQUFQLENBQWEwQixJQUFiLEVBQW1CLElBQW5CO1FBRUE1QyxDQUFDLENBQUN1QyxtQkFBRixHQUF3QixLQUFLLElBQTdCO01BQ0QsQ0FmQyxDQUFGO01BaUJBOUIsRUFBRSxDQUFDLDBEQUFELEVBQTZELGtCQUFrQjtRQUMvRSxJQUFJNkIsVUFBVSxHQUFHLE1BQU1SLG1CQUFtQixDQUFDLElBQUQsQ0FBMUM7UUFHQSxNQUFNO1VBQUMzRDtRQUFELElBQWM2QixDQUFwQjtRQUVBLE1BQU05QixXQUFXLENBQXdCOEIsQ0FBQyxDQUFDN0IsU0FBMUIsRUFBc0MsU0FBdEMsRUFBaUQ7VUFDaEV1RSxLQUFLLEVBQUUsTUFEeUQ7VUFFaEUvRCxLQUFLLEVBQUU7UUFGeUQsQ0FBakQsQ0FBakI7UUFJQSxNQUFNMkMsaUJBQUEsQ0FBRWUsS0FBRixDQUFRLEdBQVIsQ0FBTjtRQUNBLE1BQU0xRCxLQUFLLEdBQUcsTUFBTWEsVUFBVSxDQUF3QnJCLFNBQXhCLENBQTlCO1FBQ0FRLEtBQUssQ0FBQ2dFLEtBQU4sQ0FBWXBGLE1BQVosQ0FBbUIyRCxLQUFuQixDQUF5QixvQkFBekI7UUFDQTNELE1BQU0sQ0FBQzJELEtBQVAsQ0FBYWxCLENBQUMsQ0FBQzdCLFNBQWYsRUFBMEIsSUFBMUI7UUFDQSxNQUFNeUUsSUFBSSxHQUFHLENBQUMsTUFBTXRELFVBQVUsQ0FBQ2dELFVBQVUsQ0FBQ25FLFNBQVosQ0FBakIsRUFBeUNFLElBQXpDLENBQThDTSxLQUEzRDtRQUN5RGlFLElBQUQsQ0FBT0QsS0FBekMsQ0FBZ0RwRixNQUFoRCxDQUF1RDJELEtBQXZELENBQ3BCLG9CQURvQjtNQUd2QixDQWxCQyxDQUFGO01Bb0JBVCxFQUFFLENBQUMsMkRBQUQsRUFBOEQsa0JBQWtCO1FBRWhGbEQsTUFBTSxDQUFDMEYsR0FBUCxDQUFXekIsS0FBWCxDQUFpQnhCLENBQUMsQ0FBQ2tELGNBQW5CO1FBQ0EsSUFBSVosVUFBVSxHQUFHLE1BQU1SLG1CQUFtQixDQUFDLElBQUQsQ0FBMUM7UUFDQVEsVUFBVSxDQUFDbkUsU0FBWCxDQUFxQlosTUFBckIsQ0FBNEIyRCxLQUE1QixDQUFrQ2xCLENBQUMsQ0FBQzdCLFNBQXBDO1FBRUFaLE1BQU0sQ0FBQ2lFLEtBQVAsQ0FBYXhCLENBQUMsQ0FBQ2tELGNBQWY7UUFDQSxNQUFNNUQsVUFBVSxDQUFDZ0QsVUFBVSxDQUFDbkUsU0FBWixDQUFoQjtRQUVBWixNQUFNLENBQUMwRixHQUFQLENBQVd6QixLQUFYLENBQWlCeEIsQ0FBQyxDQUFDa0QsY0FBbkI7TUFDRCxDQVZDLENBQUY7SUFXRCxDQS9HTyxDQUFSO0lBaUhBcEQsUUFBUSxDQUFDLGNBQUQsRUFBaUIsWUFBWTtNQUNuQ0csTUFBTSxDQUFDLFlBQVk7UUFDakJELENBQUMsQ0FBQ21ELFFBQUYsR0FBYSxJQUFJQyxzQkFBSixDQUFtQjtVQUFDQyxzQkFBc0IsRUFBRTtRQUF6QixDQUFuQixDQUFiO01BQ0QsQ0FGSyxDQUFOO01BR0E1QyxFQUFFLENBQUMsdUNBQUQsRUFBMEMsWUFBWTtRQUN0RFQsQ0FBQyxDQUFDbUQsUUFBRixDQUFXRyxXQUFYLEdBQXlCRCxzQkFBekIsQ0FBZ0Q5RixNQUFoRCxDQUF1RGlGLEVBQXZELENBQTBEZSxLQUExRDtNQUNELENBRkMsQ0FBRjtNQUdBOUMsRUFBRSxDQUFDLGdFQUFELEVBQW1FLGtCQUFrQjtRQUNyRixNQUFNVCxDQUFDLENBQUNtRCxRQUFGLENBQVdLLE1BQVgsQ0FBa0I7VUFBQ0gsc0JBQXNCLEVBQUU7UUFBekIsQ0FBbEIsRUFBa0Q5RixNQUFsRCxDQUF5RDBGLEdBQXpELENBQTZEVCxFQUE3RCxDQUFnRWlCLFFBQXRFO01BQ0QsQ0FGQyxDQUFGO01BR0FoRCxFQUFFLENBQUMseUNBQUQsRUFBNEMsa0JBQWtCO1FBQzlELE1BQU1ULENBQUMsQ0FBQ21ELFFBQUYsQ0FFSEssTUFGRyxDQUVJLGNBRkosRUFHSGpHLE1BSEcsQ0FHSWlGLEVBSEosQ0FHT2tCLFlBSFAsQ0FHb0IsTUFIcEIsQ0FBTjtNQUlELENBTEMsQ0FBRjtJQU1ELENBaEJPLENBQVI7SUFrQkE1RCxRQUFRLENBQUMsa0JBQUQsRUFBcUIsWUFBWTtNQUV2QyxJQUFJNkQsT0FBSjtNQUNBQyxVQUFVLENBQUMsWUFBWTtRQUNyQkQsT0FBTyxHQUFHRSxjQUFBLENBQU1DLGFBQU4sRUFBVjtNQUNELENBRlMsQ0FBVjtNQUlBQyxTQUFTLENBQUMsWUFBWTtRQUNwQkosT0FBTyxDQUFDSyxPQUFSO01BQ0QsQ0FGUSxDQUFUO01BSUF2RCxFQUFFLENBQUMseURBQUQsRUFBNEQsa0JBQWtCO1FBQzlFa0QsT0FBTyxDQUFDTSxJQUFSLENBQWFqRSxDQUFiLEVBQWdCLFdBQWhCLEVBQTZCa0UsU0FBN0IsQ0FBdUMsa0JBQWtCO1VBQ3ZELE1BQU01QyxpQkFBQSxDQUFFZSxLQUFGLENBQVEsSUFBUixDQUFOO1FBQ0QsQ0FGRDtRQUdBLE1BQU04QixVQUFVLEdBQUd2RixVQUFVLENBQUMsUUFBRCxFQUFXO1VBQUNJLGNBQWMsRUFBRTtRQUFqQixDQUFYLENBQTdCO1FBRUEsTUFBTXNDLGlCQUFBLENBQUVlLEtBQUYsQ0FBUSxHQUFSLENBQU47UUFDQSxNQUFNK0Isb0JBQW9CLEdBQUcsSUFBSTlDLGlCQUFKLENBQU0sQ0FBQytDLE9BQUQsRUFBVUMsTUFBVixLQUFxQjtVQUN0REMsVUFBVSxDQUNSLE1BQ0VELE1BQU0sQ0FDSixJQUFJRSxLQUFKLENBQ0UsNkVBREYsQ0FESSxDQUZBLEVBT1IsSUFQUSxDQUFWO1VBU0F4RSxDQUFDLENBQUN5RSxvQkFBRixDQUF1QkosT0FBdkI7UUFDRCxDQVg0QixDQUE3QjtRQVlBckUsQ0FBQyxDQUFDMEUsdUJBQUYsQ0FBMEIsSUFBSUYsS0FBSixDQUFVLGFBQVYsQ0FBMUI7UUFDQSxNQUFNN0YsS0FBSyxHQUFHLE1BQU13RixVQUFwQjtRQUNBeEYsS0FBSyxDQUFDZ0csT0FBTixDQUFjcEgsTUFBZCxDQUFxQnFILE9BQXJCLENBQTZCLGFBQTdCO1FBQ0EsTUFBTVIsb0JBQU47TUFDRCxDQXZCQyxDQUFGO0lBd0JELENBbkNPLENBQVI7SUFxQ0F0RSxRQUFRLENBQUMsZUFBRCxFQUFrQixZQUFZO01BQ3BDVyxFQUFFLENBQUMsZ0RBQUQsRUFBbUQsa0JBQWtCO1FBQ3JFLE1BQU1vRSxPQUFPLEdBQUcsTUFBTTVGLFlBQVksQ0FBQztVQUFDRSxZQUFZLEVBQUU7WUFBQ0MsV0FBVyxFQUFFTztVQUFkO1FBQWYsQ0FBRCxDQUFsQztRQUNBLE1BQU1tRixHQUFHLEdBQUcsTUFBTXRGLFVBQVUsQ0FBQ3FGLE9BQU8sQ0FBQzFHLFNBQVQsQ0FBNUI7UUFDQVosTUFBTSxDQUFDMEYsR0FBUCxDQUFXekIsS0FBWCxDQUFpQnNELEdBQUcsQ0FBQ0MsTUFBckI7UUFDQSxNQUFNekYsVUFBVSxDQUFDdUYsT0FBTyxDQUFDMUcsU0FBVCxDQUFoQjtNQUNELENBTEMsQ0FBRjtNQU1Bc0MsRUFBRSxDQUFDLGtDQUFELEVBQXFDLGtCQUFrQjtRQUFBOztRQUN2RCxNQUFNdUIsSUFBSSxHQUFHLEVBQUMsR0FBR3JDLFdBQUo7VUFBaUIsdUJBQXVCO1FBQXhDLENBQWI7UUFDQSxNQUFNa0YsT0FBTyxHQUFHLE1BQU01RixZQUFZLENBQUM7VUFBQ0UsWUFBWSxFQUFFO1lBQUNDLFdBQVcsRUFBRTRDO1VBQWQ7UUFBZixDQUFELENBQWxDO1FBQ0EsTUFBTThDLEdBQUcsR0FBRyxNQUFNdEYsVUFBVSxDQUFDcUYsT0FBTyxDQUFDMUcsU0FBVCxDQUE1QjtRQUNBWixNQUFNLENBQUNpRSxLQUFQLENBQWFzRCxHQUFHLENBQUNDLE1BQWpCO1FBQ0F4SCxNQUFNLENBQUNpRSxLQUFQLGdCQUFhc0QsR0FBRyxDQUFDQyxNQUFqQixnREFBYSxZQUFZQyxtQkFBekI7UUFDQXpILE1BQU0sQ0FBQ2lFLEtBQVAsaUJBQWFzRCxHQUFHLENBQUNDLE1BQWpCLGlEQUFhLGFBQVlFLGlCQUF6QjtRQUNBLGdCQUFBSCxHQUFHLENBQUNDLE1BQUosOERBQVlDLG1CQUFaLENBQWdDLENBQWhDLEVBQW1DekgsTUFBbkMsQ0FBMENpRixFQUExQyxDQUE2QzBDLENBQTdDLENBQStDLFFBQS9DO1FBQ0EsZ0JBQUFKLEdBQUcsQ0FBQ0MsTUFBSiw4REFBWUUsaUJBQVosQ0FBOEIsQ0FBOUIsRUFBaUMxSCxNQUFqQyxDQUF3Q2lGLEVBQXhDLENBQTJDMEMsQ0FBM0MsQ0FBNkMsUUFBN0M7UUFDQSxNQUFNNUYsVUFBVSxDQUFDdUYsT0FBTyxDQUFDMUcsU0FBVCxDQUFoQjtNQUNELENBVkMsQ0FBRjtJQVdELENBbEJPLENBQVI7RUFtQkQsQ0FuVE8sQ0FBUjtBQW9URCJ9
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default test host
|
|
3
|
+
*/
|
|
4
|
+
export const TEST_HOST: "127.0.0.1";
|
|
5
|
+
/**
|
|
6
|
+
* Returns a free port; one per process
|
|
7
|
+
* @param {boolean} [force] - If true, do not reuse the port (if it already exists)
|
|
8
|
+
* @returns {Promise<number>} a free port
|
|
9
|
+
*/
|
|
10
|
+
export function getTestPort(force?: boolean | undefined): Promise<number>;
|
|
11
|
+
/**
|
|
12
|
+
* Build an Appium URL from components.
|
|
13
|
+
*
|
|
14
|
+
* **All** parameters are required. Provide an empty string (`''`) if you don't need one.
|
|
15
|
+
* To rearrange arguments (if needed), use the placeholder from Lodash (`_`).
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
export const createAppiumURL: import("lodash").CurriedFunction4<string, string | number, string | null, string, string>;
|
|
19
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../lib/helpers.js"],"names":[],"mappings":"AAGA;;GAEG;AACH,oCAA8B;AAI9B;;;;GAIG;AACH,0DAFa,QAAQ,MAAM,CAAC,CAW3B;AAED;;;;;;GAMG;AACH,wHAgCE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.createAppiumURL = exports.TEST_HOST = void 0;
|
|
9
|
+
exports.getTestPort = getTestPort;
|
|
10
|
+
|
|
11
|
+
require("source-map-support/register");
|
|
12
|
+
|
|
13
|
+
var _getPort = _interopRequireDefault(require("get-port"));
|
|
14
|
+
|
|
15
|
+
var _lodash = require("lodash");
|
|
16
|
+
|
|
17
|
+
const TEST_HOST = '127.0.0.1';
|
|
18
|
+
exports.TEST_HOST = TEST_HOST;
|
|
19
|
+
let testPort;
|
|
20
|
+
|
|
21
|
+
async function getTestPort(force = false) {
|
|
22
|
+
if (force || !testPort) {
|
|
23
|
+
let port = await (0, _getPort.default)();
|
|
24
|
+
|
|
25
|
+
if (!testPort) {
|
|
26
|
+
testPort = port;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return port;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return testPort;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const createAppiumURL = (0, _lodash.curry)((address, port, session, pathname) => {
|
|
36
|
+
if (!/^https?:\/\//.test(address)) {
|
|
37
|
+
address = `http://${address}`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
let path = session ? `session/${session}` : '';
|
|
41
|
+
|
|
42
|
+
if (pathname) {
|
|
43
|
+
path = `${path}/${pathname}`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return new URL(path, `${address}:${port}`).href;
|
|
47
|
+
});
|
|
48
|
+
exports.createAppiumURL = createAppiumURL;
|
|
49
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJURVNUX0hPU1QiLCJ0ZXN0UG9ydCIsImdldFRlc3RQb3J0IiwiZm9yY2UiLCJwb3J0IiwiZ2V0UG9ydCIsImNyZWF0ZUFwcGl1bVVSTCIsImN1cnJ5IiwiYWRkcmVzcyIsInNlc3Npb24iLCJwYXRobmFtZSIsInRlc3QiLCJwYXRoIiwiVVJMIiwiaHJlZiJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBnZXRQb3J0IGZyb20gJ2dldC1wb3J0JztcbmltcG9ydCB7Y3Vycnl9IGZyb20gJ2xvZGFzaCc7XG5cbi8qKlxuICogRGVmYXVsdCB0ZXN0IGhvc3RcbiAqL1xuY29uc3QgVEVTVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5cbmxldCB0ZXN0UG9ydDtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnJlZSBwb3J0OyBvbmUgcGVyIHByb2Nlc3NcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlXSAtIElmIHRydWUsIGRvIG5vdCByZXVzZSB0aGUgcG9ydCAoaWYgaXQgYWxyZWFkeSBleGlzdHMpXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBhIGZyZWUgcG9ydFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRUZXN0UG9ydChmb3JjZSA9IGZhbHNlKSB7XG4gIGlmIChmb3JjZSB8fCAhdGVzdFBvcnQpIHtcbiAgICBsZXQgcG9ydCA9IGF3YWl0IGdldFBvcnQoKTtcbiAgICBpZiAoIXRlc3RQb3J0KSB7XG4gICAgICB0ZXN0UG9ydCA9IHBvcnQ7XG4gICAgfVxuICAgIHJldHVybiBwb3J0O1xuICB9XG4gIHJldHVybiB0ZXN0UG9ydDtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiBBcHBpdW0gVVJMIGZyb20gY29tcG9uZW50cy5cbiAqXG4gKiAqKkFsbCoqIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkLiAgUHJvdmlkZSBhbiBlbXB0eSBzdHJpbmcgKGAnJ2ApIGlmIHlvdSBkb24ndCBuZWVkIG9uZS5cbiAqIFRvIHJlYXJyYW5nZSBhcmd1bWVudHMgKGlmIG5lZWRlZCksIHVzZSB0aGUgcGxhY2Vob2xkZXIgZnJvbSBMb2Rhc2ggKGBfYCkuXG4gKlxuICovXG5jb25zdCBjcmVhdGVBcHBpdW1VUkwgPSBjdXJyeShcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gQmFzZSBhZGRyZXNzICh3LyBvcHRpb25hbCBwcm90b2NvbClcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwb3J0IC0gUG9ydCBudW1iZXJcbiAgICogQHBhcmFtIHtzdHJpbmc/fSBzZXNzaW9uIC0gU2Vzc2lvbiBJRFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aG5hbWUgLSBFeHRyYSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IE5ldyBVUkxcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbiAgICpcbiAgICogLy8gaHR0cDovLzEyNy4wLjAuMTozMTMzNy9zZXNzaW9uXG4gICAqIGNyZWF0ZUFwcGl1bVVSTCgnMTI3LjAuMC4xJywgMzEzMzcsICcnLCAnc2Vzc2lvbicpXG4gICAqXG4gICAqIC8vIGh0dHA6Ly8xMjcuMC4wLjE6MzEzMzcvc2Vzc2lvbi9hc2RmZ2prbFxuICAgKiBjb25zdCBjcmVhdGVTZXNzaW9uVVJMID0gY3JlYXRlQXBwaXVtVVJMKCcxMjcuMC4wLjEnLCAzMTMzNywgXywgJ3Nlc3Npb24nKVxuICAgKiBjcmVhdGVTZXNzaW9uVVJMKCdhc2RmZ2prbCcpXG4gICAqXG4gICAqIC8vIGh0dHA6Ly8xMjcuMC4wLjE6MzEzMzcvc2Vzc2lvbi9hc2RmZ2prbC9hcHBpdW0vZXhlY3V0ZVxuICAgKiBjb25zdCBjcmVhdGVVUkxXaXRoUGF0aCA9IGNyZWF0ZUFwcGl1bVVSTCgnMTI3LjAuMC4xJywgMzEzMzcsICdhc2RmZ2prbCcpO1xuICAgKiBjcmVhdGVVUkxXaXRoUGF0aCgnYXBwaXVtL2V4ZWN1dGUnKVxuICAgKi9cbiAgKGFkZHJlc3MsIHBvcnQsIHNlc3Npb24sIHBhdGhuYW1lKSA9PiB7XG4gICAgaWYgKCEvXmh0dHBzPzpcXC9cXC8vLnRlc3QoYWRkcmVzcykpIHtcbiAgICAgIGFkZHJlc3MgPSBgaHR0cDovLyR7YWRkcmVzc31gO1xuICAgIH1cbiAgICBsZXQgcGF0aCA9IHNlc3Npb24gPyBgc2Vzc2lvbi8ke3Nlc3Npb259YCA6ICcnO1xuICAgIGlmIChwYXRobmFtZSkge1xuICAgICAgcGF0aCA9IGAke3BhdGh9LyR7cGF0aG5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBVUkwocGF0aCwgYCR7YWRkcmVzc306JHtwb3J0fWApLmhyZWY7XG4gIH1cbik7XG5cbmV4cG9ydCB7VEVTVF9IT1NULCBnZXRUZXN0UG9ydCwgY3JlYXRlQXBwaXVtVVJMfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBS0EsTUFBTUEsU0FBUyxHQUFHLFdBQWxCOztBQUVBLElBQUlDLFFBQUo7O0FBT0EsZUFBZUMsV0FBZixDQUEyQkMsS0FBSyxHQUFHLEtBQW5DLEVBQTBDO0VBQ3hDLElBQUlBLEtBQUssSUFBSSxDQUFDRixRQUFkLEVBQXdCO0lBQ3RCLElBQUlHLElBQUksR0FBRyxNQUFNLElBQUFDLGdCQUFBLEdBQWpCOztJQUNBLElBQUksQ0FBQ0osUUFBTCxFQUFlO01BQ2JBLFFBQVEsR0FBR0csSUFBWDtJQUNEOztJQUNELE9BQU9BLElBQVA7RUFDRDs7RUFDRCxPQUFPSCxRQUFQO0FBQ0Q7O0FBU0QsTUFBTUssZUFBZSxHQUFHLElBQUFDLGFBQUEsRUFzQnRCLENBQUNDLE9BQUQsRUFBVUosSUFBVixFQUFnQkssT0FBaEIsRUFBeUJDLFFBQXpCLEtBQXNDO0VBQ3BDLElBQUksQ0FBQyxlQUFlQyxJQUFmLENBQW9CSCxPQUFwQixDQUFMLEVBQW1DO0lBQ2pDQSxPQUFPLEdBQUksVUFBU0EsT0FBUSxFQUE1QjtFQUNEOztFQUNELElBQUlJLElBQUksR0FBR0gsT0FBTyxHQUFJLFdBQVVBLE9BQVEsRUFBdEIsR0FBMEIsRUFBNUM7O0VBQ0EsSUFBSUMsUUFBSixFQUFjO0lBQ1pFLElBQUksR0FBSSxHQUFFQSxJQUFLLElBQUdGLFFBQVMsRUFBM0I7RUFDRDs7RUFDRCxPQUFPLElBQUlHLEdBQUosQ0FBUUQsSUFBUixFQUFlLEdBQUVKLE9BQVEsSUFBR0osSUFBSyxFQUFqQyxFQUFvQ1UsSUFBM0M7QUFDRCxDQS9CcUIsQ0FBeEIifQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./e2e-suite";
|
|
2
|
+
export * from "./unit-suite";
|
|
3
|
+
export * from "./helpers";
|
|
4
|
+
export type DriverClass = import('@appium/types').DriverClass;
|
|
5
|
+
export type W3CCapabilities = import('@appium/types').W3CCapabilities;
|
|
6
|
+
export type AppiumW3CCapabilities = import('@appium/types').AppiumW3CCapabilities;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/index.js"],"names":[],"mappings":";;;0BAKa,OAAO,eAAe,EAAE,WAAW;8BACnC,OAAO,eAAe,EAAE,eAAe;oCACvC,OAAO,eAAe,EAAE,qBAAqB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
require("source-map-support/register");
|
|
8
|
+
|
|
9
|
+
var _e2eSuite = require("./e2e-suite");
|
|
10
|
+
|
|
11
|
+
Object.keys(_e2eSuite).forEach(function (key) {
|
|
12
|
+
if (key === "default" || key === "__esModule") return;
|
|
13
|
+
if (key in exports && exports[key] === _e2eSuite[key]) return;
|
|
14
|
+
Object.defineProperty(exports, key, {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () {
|
|
17
|
+
return _e2eSuite[key];
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
var _unitSuite = require("./unit-suite");
|
|
23
|
+
|
|
24
|
+
Object.keys(_unitSuite).forEach(function (key) {
|
|
25
|
+
if (key === "default" || key === "__esModule") return;
|
|
26
|
+
if (key in exports && exports[key] === _unitSuite[key]) return;
|
|
27
|
+
Object.defineProperty(exports, key, {
|
|
28
|
+
enumerable: true,
|
|
29
|
+
get: function () {
|
|
30
|
+
return _unitSuite[key];
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
var _helpers = require("./helpers");
|
|
36
|
+
|
|
37
|
+
Object.keys(_helpers).forEach(function (key) {
|
|
38
|
+
if (key === "default" || key === "__esModule") return;
|
|
39
|
+
if (key in exports && exports[key] === _helpers[key]) return;
|
|
40
|
+
Object.defineProperty(exports, key, {
|
|
41
|
+
enumerable: true,
|
|
42
|
+
get: function () {
|
|
43
|
+
return _helpers[key];
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vbGliL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZTJlLXN1aXRlJztcbmV4cG9ydCAqIGZyb20gJy4vdW5pdC1zdWl0ZSc7XG5leHBvcnQgKiBmcm9tICcuL2hlbHBlcnMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJDbGFzc30gRHJpdmVyQ2xhc3NcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5XM0NDYXBhYmlsaXRpZXN9IFczQ0NhcGFiaWxpdGllc1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVczQ0NhcGFiaWxpdGllc30gQXBwaXVtVzNDQ2FwYWJpbGl0aWVzXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7QUFBQTtFQUFBO0VBQUE7RUFBQTtJQUFBO0lBQUE7TUFBQTtJQUFBO0VBQUE7QUFBQTs7QUFDQTs7QUFBQTtFQUFBO0VBQUE7RUFBQTtJQUFBO0lBQUE7TUFBQTtJQUFBO0VBQUE7QUFBQTs7QUFDQTs7QUFBQTtFQUFBO0VBQUE7RUFBQTtJQUFBO0lBQUE7TUFBQTtJQUFBO0VBQUE7QUFBQSJ9
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates unit test suites for a driver.
|
|
3
|
+
* @param {DriverClass} DriverClass
|
|
4
|
+
* @param {AppiumW3CCapabilities} [defaultCaps]
|
|
5
|
+
*/
|
|
6
|
+
export function driverUnitTestSuite(DriverClass: DriverClass, defaultCaps?: Partial<import("@wdio/types/build/Capabilities").Capabilities & import("@wdio/types/build/Capabilities").AppiumW3CCapabilities & {
|
|
7
|
+
[x: `${string}:${string}`]: any;
|
|
8
|
+
}> | undefined): void;
|
|
9
|
+
export type DriverClass = import('@appium/types').DriverClass;
|
|
10
|
+
export type W3CCapabilities = import('@appium/types').W3CCapabilities;
|
|
11
|
+
export type AppiumW3CCapabilities = import('@appium/types').AppiumW3CCapabilities;
|
|
12
|
+
//# sourceMappingURL=unit-suite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unit-suite.d.ts","sourceRoot":"","sources":["../../lib/unit-suite.js"],"names":[],"mappings":"AAYA;;;;GAIG;AAEH,iDAJW,WAAW;;sBAmmBrB;0BAGY,OAAO,eAAe,EAAE,WAAW;8BACnC,OAAO,eAAe,EAAE,eAAe;oCACvC,OAAO,eAAe,EAAE,qBAAqB"}
|