@appium/base-driver 8.5.7 → 8.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/basedriver/capabilities.js +2 -2
- package/build/lib/basedriver/commands/execute.d.ts +11 -0
- package/build/lib/basedriver/commands/execute.d.ts.map +1 -0
- package/build/lib/basedriver/commands/execute.js +62 -0
- package/build/lib/basedriver/commands/index.d.ts +1 -1
- package/build/lib/basedriver/commands/index.d.ts.map +1 -1
- package/build/lib/basedriver/commands/index.js +5 -2
- package/build/lib/basedriver/commands/log.js +2 -4
- package/build/lib/basedriver/core.d.ts +11 -0
- package/build/lib/basedriver/core.d.ts.map +1 -1
- package/build/lib/basedriver/core.js +6 -1
- package/build/lib/basedriver/helpers.js +2 -2
- package/build/lib/express/server.d.ts +70 -7
- package/build/lib/express/server.d.ts.map +1 -1
- package/build/lib/express/server.js +19 -16
- package/build/lib/express/websocket.d.ts +12 -30
- package/build/lib/express/websocket.d.ts.map +1 -1
- package/build/lib/express/websocket.js +6 -4
- package/build/lib/index.d.ts +12 -180
- package/build/lib/index.d.ts.map +1 -1
- package/build/lib/index.js +107 -80
- package/build/lib/jsonwp-proxy/protocol-converter.js +2 -4
- package/build/lib/jsonwp-proxy/proxy.js +3 -7
- package/build/lib/protocol/index.d.ts +3 -1
- package/build/lib/protocol/index.js +13 -1
- package/build/lib/protocol/protocol.d.ts +8 -4
- package/build/lib/protocol/protocol.d.ts.map +1 -1
- package/build/lib/protocol/protocol.js +7 -7
- package/build/lib/protocol/routes.js +2 -6
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/basedriver/commands/execute.js +65 -0
- package/lib/basedriver/commands/index.js +3 -1
- package/lib/basedriver/core.js +15 -0
- package/lib/express/server.js +126 -36
- package/lib/express/websocket.js +13 -11
- package/lib/index.js +19 -61
- package/lib/protocol/index.js +4 -0
- package/lib/protocol/protocol.js +10 -3
- package/package.json +17 -15
- package/build/test/basedriver/README.md +0 -5
- package/build/test/basedriver/driver-e2e-tests.js +0 -413
- package/build/test/basedriver/driver-tests.js +0 -572
- package/build/test/basedriver/index.js +0 -26
- package/build/test/e2e/basedriver/driver.e2e.spec.js +0 -15
- package/build/test/e2e/basedriver/helpers.e2e.spec.js +0 -192
- package/build/test/e2e/basedriver/websockets.e2e.spec.js +0 -87
- package/build/test/e2e/express/server.e2e.spec.js +0 -159
- package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +0 -59
- package/build/test/e2e/protocol/fake-driver.js +0 -163
- package/build/test/e2e/protocol/helpers.js +0 -25
- package/build/test/e2e/protocol/protocol.e2e.spec.js +0 -1186
- package/build/test/helpers.js +0 -55
- package/build/test/unit/basedriver/capabilities.spec.js +0 -672
- package/build/test/unit/basedriver/capability.spec.js +0 -353
- package/build/test/unit/basedriver/commands/event.spec.js +0 -110
- package/build/test/unit/basedriver/commands/log.spec.js +0 -92
- package/build/test/unit/basedriver/device-settings.spec.js +0 -97
- package/build/test/unit/basedriver/driver.spec.js +0 -15
- package/build/test/unit/basedriver/helpers.spec.js +0 -151
- package/build/test/unit/basedriver/timeout.spec.js +0 -135
- package/build/test/unit/express/server.spec.js +0 -155
- package/build/test/unit/express/static.spec.js +0 -26
- package/build/test/unit/jsonwp-proxy/mock-request.js +0 -91
- package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +0 -171
- package/build/test/unit/jsonwp-proxy/proxy.spec.js +0 -292
- package/build/test/unit/jsonwp-proxy/url.spec.js +0 -165
- package/build/test/unit/jsonwp-status/status.spec.js +0 -34
- package/build/test/unit/protocol/errors.spec.js +0 -390
- package/build/test/unit/protocol/routes.spec.js +0 -80
- package/build/test/unit/protocol/validator.spec.js +0 -149
- package/test/basedriver/README.md +0 -5
- package/test/basedriver/driver-e2e-tests.js +0 -386
- package/test/basedriver/driver-tests.js +0 -624
- package/test/basedriver/index.js +0 -6
|
@@ -1,353 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
8
|
-
|
|
9
|
-
var _lib = _interopRequireWildcard(require("../../../lib"));
|
|
10
|
-
|
|
11
|
-
var _logger = _interopRequireDefault(require("../../../lib/basedriver/logger"));
|
|
12
|
-
|
|
13
|
-
var _sinon = require("sinon");
|
|
14
|
-
|
|
15
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
16
|
-
|
|
17
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
18
|
-
|
|
19
|
-
describe('Desired Capabilities', function () {
|
|
20
|
-
let d;
|
|
21
|
-
let sandbox;
|
|
22
|
-
beforeEach(function () {
|
|
23
|
-
d = new _lib.default();
|
|
24
|
-
sandbox = (0, _sinon.createSandbox)();
|
|
25
|
-
sandbox.spy(d.log, 'warn');
|
|
26
|
-
sandbox.spy(_logger.default, 'warn');
|
|
27
|
-
});
|
|
28
|
-
afterEach(function () {
|
|
29
|
-
sandbox.restore();
|
|
30
|
-
});
|
|
31
|
-
it('should require platformName and deviceName', async function () {
|
|
32
|
-
await d.createSession({
|
|
33
|
-
firstMatch: [{}]
|
|
34
|
-
}).should.eventually.be.rejectedWith(_lib.errors.SessionNotCreatedError, /platformName/);
|
|
35
|
-
});
|
|
36
|
-
it('should require platformName', async function () {
|
|
37
|
-
await d.createSession({
|
|
38
|
-
alwaysMatch: {
|
|
39
|
-
'appium:deviceName': 'Delorean'
|
|
40
|
-
}
|
|
41
|
-
}).should.eventually.be.rejectedWith(_lib.errors.SessionNotCreatedError, /platformName/);
|
|
42
|
-
});
|
|
43
|
-
it('should not care about cap order', async function () {
|
|
44
|
-
await d.createSession(null, null, {
|
|
45
|
-
alwaysMatch: {
|
|
46
|
-
'appium:deviceName': 'Delorean',
|
|
47
|
-
platformName: 'iOS'
|
|
48
|
-
}
|
|
49
|
-
}).should.eventually.be.fulfilled;
|
|
50
|
-
});
|
|
51
|
-
it('should check required caps which are added to driver', async function () {
|
|
52
|
-
d.desiredCapConstraints = {
|
|
53
|
-
necessary: {
|
|
54
|
-
presence: true
|
|
55
|
-
},
|
|
56
|
-
proper: {
|
|
57
|
-
presence: true,
|
|
58
|
-
isString: true,
|
|
59
|
-
inclusion: ['Delorean', 'Reventon']
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
await d.createSession(null, null, {
|
|
63
|
-
alwaysMatch: {
|
|
64
|
-
platformName: 'iOS',
|
|
65
|
-
'appium:deviceName': 'Delorean'
|
|
66
|
-
}
|
|
67
|
-
}).should.eventually.be.rejectedWith(_lib.errors.SessionNotCreatedError, /necessary.*proper/);
|
|
68
|
-
});
|
|
69
|
-
it('should check added required caps in addition to base', async function () {
|
|
70
|
-
d.desiredCapConstraints = {
|
|
71
|
-
necessary: {
|
|
72
|
-
presence: true
|
|
73
|
-
},
|
|
74
|
-
proper: {
|
|
75
|
-
presence: true,
|
|
76
|
-
isString: true,
|
|
77
|
-
inclusion: ['Delorean', 'Reventon']
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
await d.createSession(null, null, {
|
|
81
|
-
alwaysMatch: {
|
|
82
|
-
'appium:necessary': 'yup'
|
|
83
|
-
}
|
|
84
|
-
}).should.eventually.be.rejectedWith(_lib.errors.SessionNotCreatedError, /platformName/);
|
|
85
|
-
});
|
|
86
|
-
it('should accept extra capabilities', async function () {
|
|
87
|
-
await d.createSession(null, null, {
|
|
88
|
-
alwaysMatch: {
|
|
89
|
-
platformName: 'iOS',
|
|
90
|
-
'appium:deviceName': 'Delorean',
|
|
91
|
-
'appium:extra': 'cheese',
|
|
92
|
-
'appium:hold the': 'sauce'
|
|
93
|
-
}
|
|
94
|
-
}).should.eventually.be.fulfilled;
|
|
95
|
-
});
|
|
96
|
-
it('should log the use of extra caps', async function () {
|
|
97
|
-
this.timeout(500);
|
|
98
|
-
await d.createSession(null, null, {
|
|
99
|
-
alwaysMatch: {
|
|
100
|
-
platformName: 'iOS',
|
|
101
|
-
'appium:deviceName': 'Delorean',
|
|
102
|
-
'appium:extra': 'cheese',
|
|
103
|
-
'appium:hold the': 'sauce'
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
d.log.warn.should.have.been.called;
|
|
107
|
-
});
|
|
108
|
-
it('should be sensitive to the case of caps', async function () {
|
|
109
|
-
await d.createSession(null, null, {
|
|
110
|
-
alwaysMatch: {
|
|
111
|
-
platformname: 'iOS',
|
|
112
|
-
'appium:deviceName': 'Delorean'
|
|
113
|
-
}
|
|
114
|
-
}).should.eventually.be.rejectedWith(_lib.errors.SessionNotCreatedError, /platformName/);
|
|
115
|
-
});
|
|
116
|
-
describe('boolean capabilities', function () {
|
|
117
|
-
it('should allow a string "false"', async function () {
|
|
118
|
-
await d.createSession(null, null, {
|
|
119
|
-
alwaysMatch: {
|
|
120
|
-
platformName: 'iOS',
|
|
121
|
-
'appium:deviceName': 'Delorean',
|
|
122
|
-
'appium:noReset': 'false'
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
d.log.warn.should.have.been.called;
|
|
126
|
-
let sessions = await d.getSessions();
|
|
127
|
-
sessions[0].capabilities.noReset.should.eql(false);
|
|
128
|
-
});
|
|
129
|
-
it('should allow a string "true"', async function () {
|
|
130
|
-
await d.createSession(null, null, {
|
|
131
|
-
alwaysMatch: {
|
|
132
|
-
platformName: 'iOS',
|
|
133
|
-
'appium:deviceName': 'Delorean',
|
|
134
|
-
'appium:noReset': 'true'
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
d.log.warn.should.have.been.called;
|
|
138
|
-
let sessions = await d.getSessions();
|
|
139
|
-
sessions[0].capabilities.noReset.should.eql(true);
|
|
140
|
-
});
|
|
141
|
-
it('should allow a string "true" in string capabilities', async function () {
|
|
142
|
-
await d.createSession(null, null, {
|
|
143
|
-
alwaysMatch: {
|
|
144
|
-
platformName: 'iOS',
|
|
145
|
-
'appium:deviceName': 'Delorean',
|
|
146
|
-
'appium:language': 'true'
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
d.log.warn.should.not.have.been.called;
|
|
150
|
-
let sessions = await d.getSessions();
|
|
151
|
-
sessions[0].capabilities.language.should.eql('true');
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
describe('number capabilities', function () {
|
|
155
|
-
it('should allow a string "1"', async function () {
|
|
156
|
-
await d.createSession(null, null, {
|
|
157
|
-
alwaysMatch: {
|
|
158
|
-
platformName: 'iOS',
|
|
159
|
-
'appium:deviceName': 'Delorean',
|
|
160
|
-
'appium:newCommandTimeout': '1'
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
d.log.warn.should.have.been.called;
|
|
164
|
-
let sessions = await d.getSessions();
|
|
165
|
-
sessions[0].capabilities.newCommandTimeout.should.eql(1);
|
|
166
|
-
});
|
|
167
|
-
it('should allow a string "1.1"', async function () {
|
|
168
|
-
await d.createSession(null, null, {
|
|
169
|
-
alwaysMatch: {
|
|
170
|
-
platformName: 'iOS',
|
|
171
|
-
'appium:deviceName': 'Delorean',
|
|
172
|
-
'appium:newCommandTimeout': '1.1'
|
|
173
|
-
}
|
|
174
|
-
});
|
|
175
|
-
d.log.warn.should.have.been.called;
|
|
176
|
-
let sessions = await d.getSessions();
|
|
177
|
-
sessions[0].capabilities.newCommandTimeout.should.eql(1.1);
|
|
178
|
-
});
|
|
179
|
-
it('should allow a string "1" in string capabilities', async function () {
|
|
180
|
-
await d.createSession(null, null, {
|
|
181
|
-
alwaysMatch: {
|
|
182
|
-
platformName: 'iOS',
|
|
183
|
-
'appium:deviceName': 'Delorean',
|
|
184
|
-
'appium:language': '1'
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
d.log.warn.should.not.have.been.called;
|
|
188
|
-
let sessions = await d.getSessions();
|
|
189
|
-
sessions[0].capabilities.language.should.eql('1');
|
|
190
|
-
});
|
|
191
|
-
});
|
|
192
|
-
it('should error if objects in caps', async function () {
|
|
193
|
-
await d.createSession(null, null, {
|
|
194
|
-
alwaysMatch: {
|
|
195
|
-
platformName: {
|
|
196
|
-
a: 'iOS'
|
|
197
|
-
},
|
|
198
|
-
'appium:deviceName': 'Delorean'
|
|
199
|
-
}
|
|
200
|
-
}).should.eventually.be.rejectedWith(_lib.errors.SessionNotCreatedError, /platformName/i);
|
|
201
|
-
});
|
|
202
|
-
it('should check for deprecated caps', async function () {
|
|
203
|
-
this.timeout(500);
|
|
204
|
-
d.desiredCapConstraints = {
|
|
205
|
-
'lynx-version': {
|
|
206
|
-
deprecated: true
|
|
207
|
-
}
|
|
208
|
-
};
|
|
209
|
-
await d.createSession(null, null, {
|
|
210
|
-
alwaysMatch: {
|
|
211
|
-
platformName: 'iOS',
|
|
212
|
-
'appium:deviceName': 'Delorean',
|
|
213
|
-
'appium:lynx-version': 5
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
_logger.default.warn.should.have.been.called;
|
|
217
|
-
});
|
|
218
|
-
it('should not warn if deprecated=false', async function () {
|
|
219
|
-
this.timeout(500);
|
|
220
|
-
d.desiredCapConstraints = {
|
|
221
|
-
'lynx-version': {
|
|
222
|
-
deprecated: false
|
|
223
|
-
}
|
|
224
|
-
};
|
|
225
|
-
await d.createSession(null, null, {
|
|
226
|
-
alwaysMatch: {
|
|
227
|
-
platformName: 'iOS',
|
|
228
|
-
'appium:deviceName': 'Delorean',
|
|
229
|
-
'appium:lynx-version': 5
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
d.log.warn.should.not.have.been.called;
|
|
233
|
-
});
|
|
234
|
-
it('should not validate against null/undefined caps', async function () {
|
|
235
|
-
d.desiredCapConstraints = {
|
|
236
|
-
foo: {
|
|
237
|
-
isString: true
|
|
238
|
-
}
|
|
239
|
-
};
|
|
240
|
-
|
|
241
|
-
try {
|
|
242
|
-
await d.createSession(null, null, {
|
|
243
|
-
alwaysMatch: {
|
|
244
|
-
platformName: 'iOS',
|
|
245
|
-
'appium:deviceName': 'Dumb',
|
|
246
|
-
'appium:foo': null
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
} finally {
|
|
250
|
-
await d.deleteSession();
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
await d.createSession(null, null, {
|
|
254
|
-
alwaysMatch: {
|
|
255
|
-
platformName: 'iOS',
|
|
256
|
-
'appium:deviceName': 'Dumb',
|
|
257
|
-
'appium:foo': 1
|
|
258
|
-
}
|
|
259
|
-
}).should.eventually.be.rejectedWith(/'foo' must be of type string/);
|
|
260
|
-
|
|
261
|
-
try {
|
|
262
|
-
await d.createSession(null, null, {
|
|
263
|
-
alwaysMatch: {
|
|
264
|
-
platformName: 'iOS',
|
|
265
|
-
'appium:deviceName': 'Dumb',
|
|
266
|
-
'appium:foo': undefined
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
} finally {
|
|
270
|
-
await d.deleteSession();
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
try {
|
|
274
|
-
await d.createSession(null, null, {
|
|
275
|
-
alwaysMatch: {
|
|
276
|
-
platformName: 'iOS',
|
|
277
|
-
'appium:deviceName': 'Dumb',
|
|
278
|
-
'appium:foo': ''
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
} finally {
|
|
282
|
-
await d.deleteSession();
|
|
283
|
-
}
|
|
284
|
-
});
|
|
285
|
-
it('should still validate null/undefined/empty caps whose presence is required', async function () {
|
|
286
|
-
d.desiredCapConstraints = {
|
|
287
|
-
foo: {
|
|
288
|
-
presence: true
|
|
289
|
-
}
|
|
290
|
-
};
|
|
291
|
-
await d.createSession(null, null, {
|
|
292
|
-
alwaysMatch: {
|
|
293
|
-
platformName: 'iOS',
|
|
294
|
-
'appium:deviceName': 'Dumb',
|
|
295
|
-
'appium:foo': null
|
|
296
|
-
}
|
|
297
|
-
}).should.eventually.be.rejectedWith(/blank/);
|
|
298
|
-
await d.createSession(null, {
|
|
299
|
-
alwaysMatch: {
|
|
300
|
-
platformName: 'iOS',
|
|
301
|
-
'appium:deviceName': 'Dumb',
|
|
302
|
-
'appium:foo': ''
|
|
303
|
-
}
|
|
304
|
-
}).should.eventually.be.rejectedWith(/blank/);
|
|
305
|
-
await d.createSession({
|
|
306
|
-
firstMatch: [{
|
|
307
|
-
platformName: 'iOS',
|
|
308
|
-
'appium:deviceName': 'Dumb',
|
|
309
|
-
'appium:foo': {}
|
|
310
|
-
}]
|
|
311
|
-
}).should.eventually.be.rejectedWith(/blank/);
|
|
312
|
-
await d.createSession({
|
|
313
|
-
alwaysMatch: {
|
|
314
|
-
platformName: 'iOS',
|
|
315
|
-
'appium:deviceName': 'Dumb',
|
|
316
|
-
'appium:foo': []
|
|
317
|
-
}
|
|
318
|
-
}).should.eventually.be.rejectedWith(/blank/);
|
|
319
|
-
await d.createSession({
|
|
320
|
-
alwaysMatch: {
|
|
321
|
-
platformName: 'iOS',
|
|
322
|
-
'appium:deviceName': 'Dumb',
|
|
323
|
-
'appium:foo': ' '
|
|
324
|
-
}
|
|
325
|
-
}).should.eventually.be.rejectedWith(/blank/);
|
|
326
|
-
});
|
|
327
|
-
describe('w3c', function () {
|
|
328
|
-
it('should accept w3c capabilities', async function () {
|
|
329
|
-
const [sessionId, caps] = await d.createSession(null, null, {
|
|
330
|
-
alwaysMatch: {
|
|
331
|
-
platformName: 'iOS',
|
|
332
|
-
'appium:deviceName': 'Delorean'
|
|
333
|
-
},
|
|
334
|
-
firstMatch: [{}]
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
try {
|
|
338
|
-
sessionId.should.exist;
|
|
339
|
-
caps.should.eql({
|
|
340
|
-
platformName: 'iOS',
|
|
341
|
-
deviceName: 'Delorean'
|
|
342
|
-
});
|
|
343
|
-
} finally {
|
|
344
|
-
await d.deleteSession();
|
|
345
|
-
}
|
|
346
|
-
});
|
|
347
|
-
it('should raise an error if w3c capabilities is not a plain JSON object', async function () {
|
|
348
|
-
const testValues = [true, 'string', [], 100];
|
|
349
|
-
await _bluebird.default.map(testValues, val => d.createSession(null, null, val).should.eventually.be.rejectedWith(_lib.errors.SessionNotCreatedError));
|
|
350
|
-
});
|
|
351
|
-
});
|
|
352
|
-
});
|
|
353
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXNjcmliZSIsImQiLCJzYW5kYm94IiwiYmVmb3JlRWFjaCIsIkJhc2VEcml2ZXIiLCJjcmVhdGVTYW5kYm94Iiwic3B5IiwibG9nIiwibG9nZ2VyIiwiYWZ0ZXJFYWNoIiwicmVzdG9yZSIsIml0IiwiY3JlYXRlU2Vzc2lvbiIsImZpcnN0TWF0Y2giLCJzaG91bGQiLCJldmVudHVhbGx5IiwiYmUiLCJyZWplY3RlZFdpdGgiLCJlcnJvcnMiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwiYWx3YXlzTWF0Y2giLCJwbGF0Zm9ybU5hbWUiLCJmdWxmaWxsZWQiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJuZWNlc3NhcnkiLCJwcmVzZW5jZSIsInByb3BlciIsImlzU3RyaW5nIiwiaW5jbHVzaW9uIiwidGltZW91dCIsIndhcm4iLCJoYXZlIiwiYmVlbiIsImNhbGxlZCIsInBsYXRmb3JtbmFtZSIsInNlc3Npb25zIiwiZ2V0U2Vzc2lvbnMiLCJjYXBhYmlsaXRpZXMiLCJub1Jlc2V0IiwiZXFsIiwibm90IiwibGFuZ3VhZ2UiLCJuZXdDb21tYW5kVGltZW91dCIsImEiLCJkZXByZWNhdGVkIiwiZm9vIiwiZGVsZXRlU2Vzc2lvbiIsInVuZGVmaW5lZCIsInNlc3Npb25JZCIsImNhcHMiLCJleGlzdCIsImRldmljZU5hbWUiLCJ0ZXN0VmFsdWVzIiwiQiIsIm1hcCIsInZhbCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iYXNlZHJpdmVyL2NhcGFiaWxpdHkuc3BlYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIEJhc2VEcml2ZXIsIGVycm9yc30gZnJvbSAnLi4vLi4vLi4vbGliJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vLi4vLi4vbGliL2Jhc2Vkcml2ZXIvbG9nZ2VyJztcbmltcG9ydCB7Y3JlYXRlU2FuZGJveH0gZnJvbSAnc2lub24nO1xuXG5kZXNjcmliZSgnRGVzaXJlZCBDYXBhYmlsaXRpZXMnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBkO1xuICBsZXQgc2FuZGJveDtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBkID0gbmV3IEJhc2VEcml2ZXIoKTtcbiAgICBzYW5kYm94ID0gY3JlYXRlU2FuZGJveCgpO1xuICAgIHNhbmRib3guc3B5KGQubG9nLCAnd2FybicpO1xuICAgIHNhbmRib3guc3B5KGxvZ2dlciwgJ3dhcm4nKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXF1aXJlIHBsYXRmb3JtTmFtZSBhbmQgZGV2aWNlTmFtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBkXG4gICAgICAuY3JlYXRlU2Vzc2lvbih7XG4gICAgICAgIGZpcnN0TWF0Y2g6IFt7fV0sXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aChlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvciwgL3BsYXRmb3JtTmFtZS8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlcXVpcmUgcGxhdGZvcm1OYW1lJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGRcbiAgICAgIC5jcmVhdGVTZXNzaW9uKHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IsIC9wbGF0Zm9ybU5hbWUvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgY2FyZSBhYm91dCBjYXAgb3JkZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbicsXG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICB9LFxuICAgIH0pLnNob3VsZC5ldmVudHVhbGx5LmJlLmZ1bGZpbGxlZDtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjaGVjayByZXF1aXJlZCBjYXBzIHdoaWNoIGFyZSBhZGRlZCB0byBkcml2ZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgZC5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSB7XG4gICAgICBuZWNlc3Nhcnk6IHtcbiAgICAgICAgcHJlc2VuY2U6IHRydWUsXG4gICAgICB9LFxuICAgICAgcHJvcGVyOiB7XG4gICAgICAgIHByZXNlbmNlOiB0cnVlLFxuICAgICAgICBpc1N0cmluZzogdHJ1ZSxcbiAgICAgICAgaW5jbHVzaW9uOiBbJ0RlbG9yZWFuJywgJ1JldmVudG9uJ10sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBhd2FpdCBkXG4gICAgICAuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IsIC9uZWNlc3NhcnkuKnByb3Blci8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNoZWNrIGFkZGVkIHJlcXVpcmVkIGNhcHMgaW4gYWRkaXRpb24gdG8gYmFzZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBkLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IHtcbiAgICAgIG5lY2Vzc2FyeToge1xuICAgICAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBwcm9wZXI6IHtcbiAgICAgICAgcHJlc2VuY2U6IHRydWUsXG4gICAgICAgIGlzU3RyaW5nOiB0cnVlLFxuICAgICAgICBpbmNsdXNpb246IFsnRGVsb3JlYW4nLCAnUmV2ZW50b24nXSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGF3YWl0IGRcbiAgICAgIC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICAnYXBwaXVtOm5lY2Vzc2FyeSc6ICd5dXAnLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IsIC9wbGF0Zm9ybU5hbWUvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhY2NlcHQgZXh0cmEgY2FwYWJpbGl0aWVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICAnYXBwaXVtOmV4dHJhJzogJ2NoZWVzZScsXG4gICAgICAgICdhcHBpdW06aG9sZCB0aGUnOiAnc2F1Y2UnLFxuICAgICAgfSxcbiAgICB9KS5zaG91bGQuZXZlbnR1YWxseS5iZS5mdWxmaWxsZWQ7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbG9nIHRoZSB1c2Ugb2YgZXh0cmEgY2FwcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRpbWVvdXQoNTAwKTtcblxuICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICAnYXBwaXVtOmV4dHJhJzogJ2NoZWVzZScsXG4gICAgICAgICdhcHBpdW06aG9sZCB0aGUnOiAnc2F1Y2UnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGQubG9nLndhcm4uc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWQ7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgc2Vuc2l0aXZlIHRvIHRoZSBjYXNlIG9mIGNhcHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgZFxuICAgICAgLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAgIHBsYXRmb3JtbmFtZTogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yLCAvcGxhdGZvcm1OYW1lLyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdib29sZWFuIGNhcGFiaWxpdGllcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFsbG93IGEgc3RyaW5nIFwiZmFsc2VcIicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICAgICdhcHBpdW06bm9SZXNldCc6ICdmYWxzZScsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGQubG9nLndhcm4uc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWQ7XG5cbiAgICAgIGxldCBzZXNzaW9ucyA9IGF3YWl0IGQuZ2V0U2Vzc2lvbnMoKTtcbiAgICAgIHNlc3Npb25zWzBdLmNhcGFiaWxpdGllcy5ub1Jlc2V0LnNob3VsZC5lcWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBhIHN0cmluZyBcInRydWVcIicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICAgICdhcHBpdW06bm9SZXNldCc6ICd0cnVlJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZC5sb2cud2Fybi5zaG91bGQuaGF2ZS5iZWVuLmNhbGxlZDtcblxuICAgICAgbGV0IHNlc3Npb25zID0gYXdhaXQgZC5nZXRTZXNzaW9ucygpO1xuICAgICAgc2Vzc2lvbnNbMF0uY2FwYWJpbGl0aWVzLm5vUmVzZXQuc2hvdWxkLmVxbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgYSBzdHJpbmcgXCJ0cnVlXCIgaW4gc3RyaW5nIGNhcGFiaWxpdGllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICAgICdhcHBpdW06bGFuZ3VhZ2UnOiAndHJ1ZScsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGQubG9nLndhcm4uc2hvdWxkLm5vdC5oYXZlLmJlZW4uY2FsbGVkO1xuXG4gICAgICBsZXQgc2Vzc2lvbnMgPSBhd2FpdCBkLmdldFNlc3Npb25zKCk7XG4gICAgICBzZXNzaW9uc1swXS5jYXBhYmlsaXRpZXMubGFuZ3VhZ2Uuc2hvdWxkLmVxbCgndHJ1ZScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbnVtYmVyIGNhcGFiaWxpdGllcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFsbG93IGEgc3RyaW5nIFwiMVwiJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbicsXG4gICAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6ICcxJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZC5sb2cud2Fybi5zaG91bGQuaGF2ZS5iZWVuLmNhbGxlZDtcblxuICAgICAgbGV0IHNlc3Npb25zID0gYXdhaXQgZC5nZXRTZXNzaW9ucygpO1xuICAgICAgc2Vzc2lvbnNbMF0uY2FwYWJpbGl0aWVzLm5ld0NvbW1hbmRUaW1lb3V0LnNob3VsZC5lcWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IGEgc3RyaW5nIFwiMS4xXCInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJyxcbiAgICAgICAgICAnYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0JzogJzEuMScsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGQubG9nLndhcm4uc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWQ7XG5cbiAgICAgIGxldCBzZXNzaW9ucyA9IGF3YWl0IGQuZ2V0U2Vzc2lvbnMoKTtcbiAgICAgIHNlc3Npb25zWzBdLmNhcGFiaWxpdGllcy5uZXdDb21tYW5kVGltZW91dC5zaG91bGQuZXFsKDEuMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IGEgc3RyaW5nIFwiMVwiIGluIHN0cmluZyBjYXBhYmlsaXRpZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJyxcbiAgICAgICAgICAnYXBwaXVtOmxhbmd1YWdlJzogJzEnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBkLmxvZy53YXJuLnNob3VsZC5ub3QuaGF2ZS5iZWVuLmNhbGxlZDtcblxuICAgICAgbGV0IHNlc3Npb25zID0gYXdhaXQgZC5nZXRTZXNzaW9ucygpO1xuICAgICAgc2Vzc2lvbnNbMF0uY2FwYWJpbGl0aWVzLmxhbmd1YWdlLnNob3VsZC5lcWwoJzEnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBlcnJvciBpZiBvYmplY3RzIGluIGNhcHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgZFxuICAgICAgLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAgIHBsYXRmb3JtTmFtZToge2E6ICdpT1MnfSxcbiAgICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IsIC9wbGF0Zm9ybU5hbWUvaSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY2hlY2sgZm9yIGRlcHJlY2F0ZWQgY2FwcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRpbWVvdXQoNTAwKTtcblxuICAgIGQuZGVzaXJlZENhcENvbnN0cmFpbnRzID0ge1xuICAgICAgJ2x5bngtdmVyc2lvbic6IHtcbiAgICAgICAgZGVwcmVjYXRlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICAnYXBwaXVtOmx5bngtdmVyc2lvbic6IDUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLndhcm4uc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWQ7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbm90IHdhcm4gaWYgZGVwcmVjYXRlZD1mYWxzZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRpbWVvdXQoNTAwKTtcblxuICAgIGQuZGVzaXJlZENhcENvbnN0cmFpbnRzID0ge1xuICAgICAgJ2x5bngtdmVyc2lvbic6IHtcbiAgICAgICAgZGVwcmVjYXRlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJyxcbiAgICAgICAgJ2FwcGl1bTpseW54LXZlcnNpb24nOiA1LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGQubG9nLndhcm4uc2hvdWxkLm5vdC5oYXZlLmJlZW4uY2FsbGVkO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCB2YWxpZGF0ZSBhZ2FpbnN0IG51bGwvdW5kZWZpbmVkIGNhcHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgZC5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSB7XG4gICAgICBmb286IHtcbiAgICAgICAgaXNTdHJpbmc6IHRydWUsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEdW1iJyxcbiAgICAgICAgICAnYXBwaXVtOmZvbyc6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZC5kZWxldGVTZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZFxuICAgICAgLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0R1bWInLFxuICAgICAgICAgICdhcHBpdW06Zm9vJzogMSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC8nZm9vJyBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEdW1iJyxcbiAgICAgICAgICAnYXBwaXVtOmZvbyc6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBkLmRlbGV0ZVNlc3Npb24oKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEdW1iJyxcbiAgICAgICAgICAnYXBwaXVtOmZvbyc6ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGQuZGVsZXRlU2Vzc2lvbigpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzdGlsbCB2YWxpZGF0ZSBudWxsL3VuZGVmaW5lZC9lbXB0eSBjYXBzIHdob3NlIHByZXNlbmNlIGlzIHJlcXVpcmVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGQuZGVzaXJlZENhcENvbnN0cmFpbnRzID0ge1xuICAgICAgZm9vOiB7XG4gICAgICAgIHByZXNlbmNlOiB0cnVlLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgYXdhaXQgZFxuICAgICAgLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0R1bWInLFxuICAgICAgICAgICdhcHBpdW06Zm9vJzogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9ibGFuay8pO1xuXG4gICAgYXdhaXQgZFxuICAgICAgLmNyZWF0ZVNlc3Npb24obnVsbCwge1xuICAgICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0R1bWInLFxuICAgICAgICAgICdhcHBpdW06Zm9vJzogJycsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgvYmxhbmsvKTtcblxuICAgIGF3YWl0IGRcbiAgICAgIC5jcmVhdGVTZXNzaW9uKHtcbiAgICAgICAgZmlyc3RNYXRjaDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRHVtYicsXG4gICAgICAgICAgICAnYXBwaXVtOmZvbyc6IHt9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgvYmxhbmsvKTtcblxuICAgIGF3YWl0IGRcbiAgICAgIC5jcmVhdGVTZXNzaW9uKHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEdW1iJyxcbiAgICAgICAgICAnYXBwaXVtOmZvbyc6IFtdLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL2JsYW5rLyk7XG5cbiAgICBhd2FpdCBkXG4gICAgICAuY3JlYXRlU2Vzc2lvbih7XG4gICAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRHVtYicsXG4gICAgICAgICAgJ2FwcGl1bTpmb28nOiAnICAnLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL2JsYW5rLyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3M2MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgdzNjIGNhcGFiaWxpdGllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IFtzZXNzaW9uSWQsIGNhcHNdID0gYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbicsXG4gICAgICAgIH0sXG4gICAgICAgIGZpcnN0TWF0Y2g6IFt7fV0sXG4gICAgICB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlc3Npb25JZC5zaG91bGQuZXhpc3Q7XG4gICAgICAgIGNhcHMuc2hvdWxkLmVxbCh7XG4gICAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgICBkZXZpY2VOYW1lOiAnRGVsb3JlYW4nLFxuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IGQuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByYWlzZSBhbiBlcnJvciBpZiB3M2MgY2FwYWJpbGl0aWVzIGlzIG5vdCBhIHBsYWluIEpTT04gb2JqZWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdGVzdFZhbHVlcyA9IFt0cnVlLCAnc3RyaW5nJywgW10sIDEwMF07XG4gICAgICAvLyB0aGlzIGxvb3AgcnVucyBpbiBwYXJhbGxlbCwgYW5kIGRvZXMgbm90IGd1YXJhbnRlZSBhbGwgYXNzZXJ0aW9ucyB3aWxsIGJlIG1hZGVcbiAgICAgIGF3YWl0IEIubWFwKHRlc3RWYWx1ZXMsICh2YWwpID0+XG4gICAgICAgIGRcbiAgICAgICAgICAuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB2YWwpXG4gICAgICAgICAgLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aChlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcilcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFQUEsUUFBUSxDQUFDLHNCQUFELEVBQXlCLFlBQVk7RUFDM0MsSUFBSUMsQ0FBSjtFQUNBLElBQUlDLE9BQUo7RUFFQUMsVUFBVSxDQUFDLFlBQVk7SUFDckJGLENBQUMsR0FBRyxJQUFJRyxZQUFKLEVBQUo7SUFDQUYsT0FBTyxHQUFHLElBQUFHLG9CQUFBLEdBQVY7SUFDQUgsT0FBTyxDQUFDSSxHQUFSLENBQVlMLENBQUMsQ0FBQ00sR0FBZCxFQUFtQixNQUFuQjtJQUNBTCxPQUFPLENBQUNJLEdBQVIsQ0FBWUUsZUFBWixFQUFvQixNQUFwQjtFQUNELENBTFMsQ0FBVjtFQU9BQyxTQUFTLENBQUMsWUFBWTtJQUNwQlAsT0FBTyxDQUFDUSxPQUFSO0VBQ0QsQ0FGUSxDQUFUO0VBSUFDLEVBQUUsQ0FBQyw0Q0FBRCxFQUErQyxrQkFBa0I7SUFDakUsTUFBTVYsQ0FBQyxDQUNKVyxhQURHLENBQ1c7TUFDYkMsVUFBVSxFQUFFLENBQUMsRUFBRDtJQURDLENBRFgsRUFJSEMsTUFKRyxDQUlJQyxVQUpKLENBSWVDLEVBSmYsQ0FJa0JDLFlBSmxCLENBSStCQyxXQUFBLENBQU9DLHNCQUp0QyxFQUk4RCxjQUo5RCxDQUFOO0VBS0QsQ0FOQyxDQUFGO0VBUUFSLEVBQUUsQ0FBQyw2QkFBRCxFQUFnQyxrQkFBa0I7SUFDbEQsTUFBTVYsQ0FBQyxDQUNKVyxhQURHLENBQ1c7TUFDYlEsV0FBVyxFQUFFO1FBQ1gscUJBQXFCO01BRFY7SUFEQSxDQURYLEVBTUhOLE1BTkcsQ0FNSUMsVUFOSixDQU1lQyxFQU5mLENBTWtCQyxZQU5sQixDQU0rQkMsV0FBQSxDQUFPQyxzQkFOdEMsRUFNOEQsY0FOOUQsQ0FBTjtFQU9ELENBUkMsQ0FBRjtFQVVBUixFQUFFLENBQUMsaUNBQUQsRUFBb0Msa0JBQWtCO0lB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
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
8
|
-
|
|
9
|
-
var _lib = require("../../../../lib");
|
|
10
|
-
|
|
11
|
-
describe('logging custom events', function () {
|
|
12
|
-
it('should allow logging of events', async function () {
|
|
13
|
-
const d = new _lib.BaseDriver();
|
|
14
|
-
|
|
15
|
-
d._eventHistory.should.eql({
|
|
16
|
-
commands: []
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
await d.logCustomEvent('myorg', 'myevent');
|
|
20
|
-
|
|
21
|
-
_lodash.default.keys(d._eventHistory).should.eql(['commands', 'myorg:myevent']);
|
|
22
|
-
});
|
|
23
|
-
it('should get all events including custom ones', async function () {
|
|
24
|
-
const d = new _lib.BaseDriver();
|
|
25
|
-
|
|
26
|
-
d._eventHistory.should.eql({
|
|
27
|
-
commands: []
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
d.logEvent('appiumEvent');
|
|
31
|
-
await d.logCustomEvent('myorg', 'myevent');
|
|
32
|
-
const events = await d.getLogEvents();
|
|
33
|
-
|
|
34
|
-
_lodash.default.keys(events).should.eql(['commands', 'appiumEvent', 'myorg:myevent']);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
describe('#getLogEvents', function () {
|
|
38
|
-
it('should allow to get all events', async function () {
|
|
39
|
-
const d = new _lib.BaseDriver();
|
|
40
|
-
|
|
41
|
-
d._eventHistory.should.eql({
|
|
42
|
-
commands: []
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
d._eventHistory.testCommand = ['1', '2', '3'];
|
|
46
|
-
(await d.getLogEvents()).should.eql({
|
|
47
|
-
commands: [],
|
|
48
|
-
testCommand: ['1', '2', '3']
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
it('should filter with testCommand', async function () {
|
|
52
|
-
const d = new _lib.BaseDriver();
|
|
53
|
-
|
|
54
|
-
d._eventHistory.should.eql({
|
|
55
|
-
commands: []
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
d._eventHistory.testCommand = ['1', '2', '3'];
|
|
59
|
-
(await d.getLogEvents('testCommand')).should.eql({
|
|
60
|
-
testCommand: ['1', '2', '3']
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
it('should not filter with wrong but can be a part of the event name', async function () {
|
|
64
|
-
const d = new _lib.BaseDriver();
|
|
65
|
-
|
|
66
|
-
d._eventHistory.should.eql({
|
|
67
|
-
commands: []
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
d._eventHistory.testCommand = ['1', '2', '3'];
|
|
71
|
-
(await d.getLogEvents('testCommandDummy')).should.eql({});
|
|
72
|
-
});
|
|
73
|
-
it('should filter with multiple event keys', async function () {
|
|
74
|
-
const d = new _lib.BaseDriver();
|
|
75
|
-
|
|
76
|
-
d._eventHistory.should.eql({
|
|
77
|
-
commands: []
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
d._eventHistory.testCommand = ['1', '2', '3'];
|
|
81
|
-
d._eventHistory.testCommand2 = ['4', '5'];
|
|
82
|
-
(await d.getLogEvents(['testCommand', 'testCommand2'])).should.eql({
|
|
83
|
-
testCommand: ['1', '2', '3'],
|
|
84
|
-
testCommand2: ['4', '5']
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
it('should filter with custom events', async function () {
|
|
88
|
-
const d = new _lib.BaseDriver();
|
|
89
|
-
|
|
90
|
-
d._eventHistory.should.eql({
|
|
91
|
-
commands: []
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
d._eventHistory['custom:appiumEvent'] = ['1', '2', '3'];
|
|
95
|
-
(await d.getLogEvents(['custom:appiumEvent'])).should.eql({
|
|
96
|
-
'custom:appiumEvent': ['1', '2', '3']
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
it('should not filter with no existed event name', async function () {
|
|
100
|
-
const d = new _lib.BaseDriver();
|
|
101
|
-
|
|
102
|
-
d._eventHistory.should.eql({
|
|
103
|
-
commands: []
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
d._eventHistory.testCommand = ['1', '2', '3'];
|
|
107
|
-
(await d.getLogEvents(['noEventName'])).should.eql({});
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXNjcmliZSIsIml0IiwiZCIsIkJhc2VEcml2ZXIiLCJfZXZlbnRIaXN0b3J5Iiwic2hvdWxkIiwiZXFsIiwiY29tbWFuZHMiLCJsb2dDdXN0b21FdmVudCIsIl8iLCJrZXlzIiwibG9nRXZlbnQiLCJldmVudHMiLCJnZXRMb2dFdmVudHMiLCJ0ZXN0Q29tbWFuZCIsInRlc3RDb21tYW5kMiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iYXNlZHJpdmVyL2NvbW1hbmRzL2V2ZW50LnNwZWMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7QmFzZURyaXZlcn0gZnJvbSAnLi4vLi4vLi4vLi4vbGliJztcblxuZGVzY3JpYmUoJ2xvZ2dpbmcgY3VzdG9tIGV2ZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCBhbGxvdyBsb2dnaW5nIG9mIGV2ZW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBkID0gbmV3IEJhc2VEcml2ZXIoKTtcbiAgICBkLl9ldmVudEhpc3Rvcnkuc2hvdWxkLmVxbCh7Y29tbWFuZHM6IFtdfSk7XG4gICAgYXdhaXQgZC5sb2dDdXN0b21FdmVudCgnbXlvcmcnLCAnbXlldmVudCcpO1xuICAgIF8ua2V5cyhkLl9ldmVudEhpc3RvcnkpLnNob3VsZC5lcWwoWydjb21tYW5kcycsICdteW9yZzpteWV2ZW50J10pO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCBnZXQgYWxsIGV2ZW50cyBpbmNsdWRpbmcgY3VzdG9tIG9uZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZCA9IG5ldyBCYXNlRHJpdmVyKCk7XG4gICAgZC5fZXZlbnRIaXN0b3J5LnNob3VsZC5lcWwoe2NvbW1hbmRzOiBbXX0pO1xuICAgIGQubG9nRXZlbnQoJ2FwcGl1bUV2ZW50Jyk7XG4gICAgYXdhaXQgZC5sb2dDdXN0b21FdmVudCgnbXlvcmcnLCAnbXlldmVudCcpO1xuICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IGQuZ2V0TG9nRXZlbnRzKCk7XG4gICAgXy5rZXlzKGV2ZW50cykuc2hvdWxkLmVxbChbJ2NvbW1hbmRzJywgJ2FwcGl1bUV2ZW50JywgJ215b3JnOm15ZXZlbnQnXSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCcjZ2V0TG9nRXZlbnRzJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc2hvdWxkIGFsbG93IHRvIGdldCBhbGwgZXZlbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGQgPSBuZXcgQmFzZURyaXZlcigpO1xuICAgIGQuX2V2ZW50SGlzdG9yeS5zaG91bGQuZXFsKHtjb21tYW5kczogW119KTtcbiAgICBkLl9ldmVudEhpc3RvcnkudGVzdENvbW1hbmQgPSBbJzEnLCAnMicsICczJ107XG4gICAgKGF3YWl0IGQuZ2V0TG9nRXZlbnRzKCkpLnNob3VsZC5lcWwoe1xuICAgICAgY29tbWFuZHM6IFtdLFxuICAgICAgdGVzdENvbW1hbmQ6IFsnMScsICcyJywgJzMnXSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmaWx0ZXIgd2l0aCB0ZXN0Q29tbWFuZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBkID0gbmV3IEJhc2VEcml2ZXIoKTtcbiAgICBkLl9ldmVudEhpc3Rvcnkuc2hvdWxkLmVxbCh7Y29tbWFuZHM6IFtdfSk7XG4gICAgZC5fZXZlbnRIaXN0b3J5LnRlc3RDb21tYW5kID0gWycxJywgJzInLCAnMyddO1xuICAgIChhd2FpdCBkLmdldExvZ0V2ZW50cygndGVzdENvbW1hbmQnKSkuc2hvdWxkLmVxbCh7XG4gICAgICB0ZXN0Q29tbWFuZDogWycxJywgJzInLCAnMyddLFxuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCBmaWx0ZXIgd2l0aCB3cm9uZyBidXQgY2FuIGJlIGEgcGFydCBvZiB0aGUgZXZlbnQgbmFtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBkID0gbmV3IEJhc2VEcml2ZXIoKTtcbiAgICBkLl9ldmVudEhpc3Rvcnkuc2hvdWxkLmVxbCh7Y29tbWFuZHM6IFtdfSk7XG4gICAgZC5fZXZlbnRIaXN0b3J5LnRlc3RDb21tYW5kID0gWycxJywgJzInLCAnMyddO1xuICAgIChhd2FpdCBkLmdldExvZ0V2ZW50cygndGVzdENvbW1hbmREdW1teScpKS5zaG91bGQuZXFsKHt9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmaWx0ZXIgd2l0aCBtdWx0aXBsZSBldmVudCBrZXlzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGQgPSBuZXcgQmFzZURyaXZlcigpO1xuICAgIGQuX2V2ZW50SGlzdG9yeS5zaG91bGQuZXFsKHtjb21tYW5kczogW119KTtcbiAgICBkLl9ldmVudEhpc3RvcnkudGVzdENvbW1hbmQgPSBbJzEnLCAnMicsICczJ107XG4gICAgZC5fZXZlbnRIaXN0b3J5LnRlc3RDb21tYW5kMiA9IFsnNCcsICc1J107XG4gICAgKGF3YWl0IGQuZ2V0TG9nRXZlbnRzKFsndGVzdENvbW1hbmQnLCAndGVzdENvbW1hbmQyJ10pKS5zaG91bGQuZXFsKHtcbiAgICAgIHRlc3RDb21tYW5kOiBbJzEnLCAnMicsICczJ10sXG4gICAgICB0ZXN0Q29tbWFuZDI6IFsnNCcsICc1J10sXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmlsdGVyIHdpdGggY3VzdG9tIGV2ZW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBkID0gbmV3IEJhc2VEcml2ZXIoKTtcbiAgICBkLl9ldmVudEhpc3Rvcnkuc2hvdWxkLmVxbCh7Y29tbWFuZHM6IFtdfSk7XG4gICAgZC5fZXZlbnRIaXN0b3J5WydjdXN0b206YXBwaXVtRXZlbnQnXSA9IFsnMScsICcyJywgJzMnXTtcbiAgICAoYXdhaXQgZC5nZXRMb2dFdmVudHMoWydjdXN0b206YXBwaXVtRXZlbnQnXSkpLnNob3VsZC5lcWwoe1xuICAgICAgJ2N1c3RvbTphcHBpdW1FdmVudCc6IFsnMScsICcyJywgJzMnXSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgZmlsdGVyIHdpdGggbm8gZXhpc3RlZCBldmVudCBuYW1lJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGQgPSBuZXcgQmFzZURyaXZlcigpO1xuICAgIGQuX2V2ZW50SGlzdG9yeS5zaG91bGQuZXFsKHtjb21tYW5kczogW119KTtcbiAgICBkLl9ldmVudEhpc3RvcnkudGVzdENvbW1hbmQgPSBbJzEnLCAnMicsICczJ107XG4gICAgKGF3YWl0IGQuZ2V0TG9nRXZlbnRzKFsnbm9FdmVudE5hbWUnXSkpLnNob3VsZC5lcWwoe30pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFFQUEsUUFBUSxDQUFDLHVCQUFELEVBQTBCLFlBQVk7RUFDNUNDLEVBQUUsQ0FBQyxnQ0FBRCxFQUFtQyxrQkFBa0I7SUFDckQsTUFBTUMsQ0FBQyxHQUFHLElBQUlDLGVBQUosRUFBVjs7SUFDQUQsQ0FBQyxDQUFDRSxhQUFGLENBQWdCQyxNQUFoQixDQUF1QkMsR0FBdkIsQ0FBMkI7TUFBQ0MsUUFBUSxFQUFFO0lBQVgsQ0FBM0I7O0lBQ0EsTUFBTUwsQ0FBQyxDQUFDTSxjQUFGLENBQWlCLE9BQWpCLEVBQTBCLFNBQTFCLENBQU47O0lBQ0FDLGVBQUEsQ0FBRUMsSUFBRixDQUFPUixDQUFDLENBQUNFLGFBQVQsRUFBd0JDLE1BQXhCLENBQStCQyxHQUEvQixDQUFtQyxDQUFDLFVBQUQsRUFBYSxlQUFiLENBQW5DO0VBQ0QsQ0FMQyxDQUFGO0VBTUFMLEVBQUUsQ0FBQyw2Q0FBRCxFQUFnRCxrQkFBa0I7SUFDbEUsTUFBTUMsQ0FBQyxHQUFHLElBQUlDLGVBQUosRUFBVjs7SUFDQUQsQ0FBQyxDQUFDRSxhQUFGLENBQWdCQyxNQUFoQixDQUF1QkMsR0FBdkIsQ0FBMkI7TUFBQ0MsUUFBUSxFQUFFO0lBQVgsQ0FBM0I7O0lBQ0FMLENBQUMsQ0FB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
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _log = require("../../../../lib/basedriver/commands/log");
|
|
8
|
-
|
|
9
|
-
var _sinon = require("sinon");
|
|
10
|
-
|
|
11
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
12
|
-
|
|
13
|
-
const expect = chai.expect;
|
|
14
|
-
const FIRST_LOGS = ['first', 'logs'];
|
|
15
|
-
const SECOND_LOGS = ['second', 'logs'];
|
|
16
|
-
const SUPPORTED_LOG_TYPES = {
|
|
17
|
-
one: {
|
|
18
|
-
description: 'First logs',
|
|
19
|
-
getter: () => _lodash.default.clone(FIRST_LOGS)
|
|
20
|
-
},
|
|
21
|
-
two: {
|
|
22
|
-
description: 'Seconds logs',
|
|
23
|
-
getter: () => _lodash.default.clone(SECOND_LOGS)
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
describe('log commands -', function () {
|
|
27
|
-
let sandbox;
|
|
28
|
-
let LogCommands;
|
|
29
|
-
let logCommands;
|
|
30
|
-
beforeEach(function () {
|
|
31
|
-
sandbox = (0, _sinon.createSandbox)();
|
|
32
|
-
LogCommands = (0, _log.LogMixin)(class {
|
|
33
|
-
get log() {
|
|
34
|
-
return this._log;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
});
|
|
38
|
-
logCommands = new LogCommands();
|
|
39
|
-
logCommands.supportedLogTypes = {};
|
|
40
|
-
logCommands._log = {
|
|
41
|
-
debug: _lodash.default.noop
|
|
42
|
-
};
|
|
43
|
-
});
|
|
44
|
-
afterEach(function () {
|
|
45
|
-
sandbox.restore();
|
|
46
|
-
});
|
|
47
|
-
describe('getLogTypes', function () {
|
|
48
|
-
it('should return empty array when no supported log types', async function () {
|
|
49
|
-
(await logCommands.getLogTypes()).should.eql([]);
|
|
50
|
-
});
|
|
51
|
-
it('should return keys to log type object', async function () {
|
|
52
|
-
logCommands.supportedLogTypes = SUPPORTED_LOG_TYPES;
|
|
53
|
-
(await logCommands.getLogTypes()).should.eql(['one', 'two']);
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
describe('getLog', function () {
|
|
57
|
-
let one;
|
|
58
|
-
let two;
|
|
59
|
-
beforeEach(function () {
|
|
60
|
-
one = sandbox.spy(SUPPORTED_LOG_TYPES.one, 'getter');
|
|
61
|
-
two = sandbox.spy(SUPPORTED_LOG_TYPES.two, 'getter');
|
|
62
|
-
});
|
|
63
|
-
it('should throw error if log type not supported', async function () {
|
|
64
|
-
await logCommands.getLog('one').should.eventually.be.rejected;
|
|
65
|
-
one.called.should.be.false;
|
|
66
|
-
two.called.should.be.false;
|
|
67
|
-
});
|
|
68
|
-
it('should throw an error with available log types if log type not supported', async function () {
|
|
69
|
-
logCommands.supportedLogTypes = SUPPORTED_LOG_TYPES;
|
|
70
|
-
let err;
|
|
71
|
-
|
|
72
|
-
try {
|
|
73
|
-
await logCommands.getLog('three');
|
|
74
|
-
} catch (_err) {
|
|
75
|
-
err = _err;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
expect(err).to.exist;
|
|
79
|
-
err.message.should.eql(`Unsupported log type 'three'. Supported types: {"one":"First logs","two":"Seconds logs"}`);
|
|
80
|
-
one.called.should.be.false;
|
|
81
|
-
two.called.should.be.false;
|
|
82
|
-
});
|
|
83
|
-
it('should call getter on appropriate log when found', async function () {
|
|
84
|
-
logCommands.supportedLogTypes = SUPPORTED_LOG_TYPES;
|
|
85
|
-
let logs = await logCommands.getLog('one');
|
|
86
|
-
logs.should.eql(FIRST_LOGS);
|
|
87
|
-
one.called.should.be.true;
|
|
88
|
-
two.called.should.be.false;
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHBlY3QiLCJjaGFpIiwiRklSU1RfTE9HUyIsIlNFQ09ORF9MT0dTIiwiU1VQUE9SVEVEX0xPR19UWVBFUyIsIm9uZSIsImRlc2NyaXB0aW9uIiwiZ2V0dGVyIiwiXyIsImNsb25lIiwidHdvIiwiZGVzY3JpYmUiLCJzYW5kYm94IiwiTG9nQ29tbWFuZHMiLCJsb2dDb21tYW5kcyIsImJlZm9yZUVhY2giLCJjcmVhdGVTYW5kYm94IiwiTG9nTWl4aW4iLCJsb2ciLCJfbG9nIiwic3VwcG9ydGVkTG9nVHlwZXMiLCJkZWJ1ZyIsIm5vb3AiLCJhZnRlckVhY2giLCJyZXN0b3JlIiwiaXQiLCJnZXRMb2dUeXBlcyIsInNob3VsZCIsImVxbCIsInNweSIsImdldExvZyIsImV2ZW50dWFsbHkiLCJiZSIsInJlamVjdGVkIiwiY2FsbGVkIiwiZmFsc2UiLCJlcnIiLCJfZXJyIiwidG8iLCJleGlzdCIsIm1lc3NhZ2UiLCJsb2dzIiwidHJ1ZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iYXNlZHJpdmVyL2NvbW1hbmRzL2xvZy5zcGVjLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuaW1wb3J0IHtMb2dNaXhpbn0gZnJvbSAnLi4vLi4vLi4vLi4vbGliL2Jhc2Vkcml2ZXIvY29tbWFuZHMvbG9nJztcbmltcG9ydCB7Y3JlYXRlU2FuZGJveH0gZnJvbSAnc2lub24nO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuY29uc3QgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5cbmNvbnN0IEZJUlNUX0xPR1MgPSBbJ2ZpcnN0JywgJ2xvZ3MnXTtcbmNvbnN0IFNFQ09ORF9MT0dTID0gWydzZWNvbmQnLCAnbG9ncyddO1xuY29uc3QgU1VQUE9SVEVEX0xPR19UWVBFUyA9IHtcbiAgb25lOiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXJzdCBsb2dzJyxcbiAgICBnZXR0ZXI6ICgpID0+IF8uY2xvbmUoRklSU1RfTE9HUyksXG4gIH0sXG4gIHR3bzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2Vjb25kcyBsb2dzJyxcbiAgICBnZXR0ZXI6ICgpID0+IF8uY2xvbmUoU0VDT05EX0xPR1MpLFxuICB9LFxufTtcblxuZGVzY3JpYmUoJ2xvZyBjb21tYW5kcyAtJywgZnVuY3Rpb24gKCkge1xuICBsZXQgc2FuZGJveDtcbiAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBMb2dNaXhpbj59ICovXG4gIGxldCBMb2dDb21tYW5kcztcblxuICBsZXQgbG9nQ29tbWFuZHM7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveCA9IGNyZWF0ZVNhbmRib3goKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgTG9nQ29tbWFuZHMgPSBMb2dNaXhpbihcbiAgICAgIGNsYXNzIHtcbiAgICAgICAgZ2V0IGxvZygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fbG9nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgICBsb2dDb21tYW5kcyA9IG5ldyBMb2dDb21tYW5kcygpO1xuICAgIC8vIHJlc2V0IHRoZSBzdXBwb3J0ZWQgbG9nIHR5cGVzXG4gICAgbG9nQ29tbWFuZHMuc3VwcG9ydGVkTG9nVHlwZXMgPSB7fTtcbiAgICBsb2dDb21tYW5kcy5fbG9nID0gLyoqIEB0eXBlIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5BcHBpdW1Mb2dnZXJ9ICovICh7XG4gICAgICBkZWJ1ZzogXy5ub29wLFxuICAgIH0pO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3gucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0TG9nVHlwZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW1wdHkgYXJyYXkgd2hlbiBubyBzdXBwb3J0ZWQgbG9nIHR5cGVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgKGF3YWl0IGxvZ0NvbW1hbmRzLmdldExvZ1R5cGVzKCkpLnNob3VsZC5lcWwoW10pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGtleXMgdG8gbG9nIHR5cGUgb2JqZWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbG9nQ29tbWFuZHMuc3VwcG9ydGVkTG9nVHlwZXMgPSBTVVBQT1JURURfTE9HX1RZUEVTO1xuICAgICAgKGF3YWl0IGxvZ0NvbW1hbmRzLmdldExvZ1R5cGVzKCkpLnNob3VsZC5lcWwoWydvbmUnLCAndHdvJ10pO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ2dldExvZycsIGZ1bmN0aW9uICgpIHtcbiAgICAvKiogQHR5cGUge3Npbm9uLlNpbm9uU3BpZWRNZW1iZXI8dHlwZW9mIFNVUFBPUlRFRF9MT0dfVFlQRVMub25lLmdldHRlcj59ICovXG4gICAgbGV0IG9uZTtcbiAgICAvKiogQHR5cGUge3Npbm9uLlNpbm9uU3BpZWRNZW1iZXI8dHlwZW9mIFNVUFBPUlRFRF9MT0dfVFlQRVMudHdvLmdldHRlcj59ICovXG4gICAgbGV0IHR3bztcbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIG9uZSA9IHNhbmRib3guc3B5KFNVUFBPUlRFRF9MT0dfVFlQRVMub25lLCAnZ2V0dGVyJyk7XG4gICAgICB0d28gPSBzYW5kYm94LnNweShTVVBQT1JURURfTE9HX1RZUEVTLnR3bywgJ2dldHRlcicpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgaWYgbG9nIHR5cGUgbm90IHN1cHBvcnRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGxvZ0NvbW1hbmRzLmdldExvZygnb25lJykuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWQ7XG4gICAgICBvbmUuY2FsbGVkLnNob3VsZC5iZS5mYWxzZTtcbiAgICAgIHR3by5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3Igd2l0aCBhdmFpbGFibGUgbG9nIHR5cGVzIGlmIGxvZyB0eXBlIG5vdCBzdXBwb3J0ZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsb2dDb21tYW5kcy5zdXBwb3J0ZWRMb2dUeXBlcyA9IFNVUFBPUlRFRF9MT0dfVFlQRVM7XG4gICAgICBsZXQgZXJyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgbG9nQ29tbWFuZHMuZ2V0TG9nKCd0aHJlZScpO1xuICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICBlcnIgPSBfZXJyO1xuICAgICAgfVxuICAgICAgZXhwZWN0KGVycikudG8uZXhpc3Q7XG4gICAgICBlcnIubWVzc2FnZS5zaG91bGQuZXFsKFxuICAgICAgICBgVW5zdXBwb3J0ZWQgbG9nIHR5cGUgJ3RocmVlJy4gU3VwcG9ydGVkIHR5cGVzOiB7XCJvbmVcIjpcIkZpcnN0IGxvZ3NcIixcInR3b1wiOlwiU2Vjb25kcyBsb2dzXCJ9YFxuICAgICAgKTtcbiAgICAgIG9uZS5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlO1xuICAgICAgdHdvLmNhbGxlZC5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIGdldHRlciBvbiBhcHByb3ByaWF0ZSBsb2cgd2hlbiBmb3VuZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxvZ0NvbW1hbmRzLnN1cHBvcnRlZExvZ1R5cGVzID0gU1VQUE9SVEVEX0xPR19UWVBFUztcbiAgICAgIGxldCBsb2dzID0gYXdhaXQgbG9nQ29tbWFuZHMuZ2V0TG9nKCdvbmUnKTtcbiAgICAgIGxvZ3Muc2hvdWxkLmVxbChGSVJTVF9MT0dTKTtcbiAgICAgIG9uZS5jYWxsZWQuc2hvdWxkLmJlLnRydWU7XG4gICAgICB0d28uY2FsbGVkLnNob3VsZC5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsTUFBTSxHQUFHQyxJQUFJLENBQUNELE1BQXBCO0FBRUEsTUFBTUUsVUFBVSxHQUFHLENBQUMsT0FBRCxFQUFVLE1BQVYsQ0FBbkI7QUFDQSxNQUFNQyxXQUFXLEdBQUcsQ0FBQyxRQUFELEVBQVcsTUFBWCxDQUFwQjtBQUNBLE1BQU1DLG1CQUFtQixHQUFHO0VBQzFCQyxHQUFHLEVBQUU7SUFDSEMsV0FBVyxFQUFFLFlBRFY7SUFFSEMsTUFBTSxFQUFFLE1BQU1DLGVBQUEsQ0FBRUMsS0FBRixDQUFRUCxVQUFSO0VBRlgsQ0FEcUI7RUFLMUJRLEdBQUcsRUFBRTtJQUNISixXQUFXLEVBQUUsY0FEVjtJQUVIQyxNQUFNLEVBQUUsTUFBTUMsZUFBQSxDQUFFQyxLQUFGLENBQVFOLFdBQVI7RUFGWDtBQUxxQixDQUE1QjtBQVdBUSxRQUFRLENBQUMsZ0JBQUQsRUFBbUIsWUFBWTtFQUNyQyxJQUFJQyxPQUFKO0VBRUEsSUFBSUMsV0FBSjtFQUVBLElBQUlDLFdBQUo7RUFFQUMsVUFBVSxDQUFDLFlBQVk7SUFDckJILE9BQU8sR0FBRyxJQUFBSSxvQkFBQSxHQUFWO0lBRUFILFdBQVcsR0FBRyxJQUFBSSxhQUFBLEVBQ1osTUFBTTtNQUNHLElBQUhDLEdBQUcsR0FBRztRQUNSLE9BQU8sS0FBS0MsSUFBWjtNQUNEOztJQUhHLENBRE0sQ0FBZDtJQU9BTCxXQUFXLEdBQUcsSUFBSUQsV0FBSixFQUFkO0lBRUFDLFdBQVcsQ0FBQ00saUJBQVosR0FBZ0MsRUFBaEM7SUFDQU4sV0FBVyxDQUFDSyxJQUFaLEdBQXdFO01BQ3RFRSxLQUFLLEVBQUViLGVBQUEsQ0FBRWM7SUFENkQsQ0FBeEU7RUFHRCxDQWhCUyxDQUFWO0VBa0JBQyxTQUFTLENBQUMsWUFBWTtJQUNwQlgsT0FBTyxDQUFDWSxPQUFSO0VBQ0QsQ0FGUSxDQUFUO0VBSUFiLFFBQVEsQ0FBQyxhQUFELEVBQWdCLFlBQVk7SUFDbENjLEVBQUUsQ0FBQyx1REFBRCxFQUEwRCxrQkFBa0I7TUFDNUUsQ0FBQyxNQUFNWCxXQUFXLENBQUNZLFdBQVosRUFBUCxFQUFrQ0MsTUFBbEMsQ0FBeUNDLEdBQXpDLENBQTZDLEVBQTdDO0lBQ0QsQ0FGQyxDQUFGO0lBR0FILEVBQUUsQ0FBQyx1Q0FBRCxFQUEwQyxrQkFBa0I7TUFDNURYLFdBQVcsQ0FBQ00saUJBQVosR0FBZ0NoQixtQkFBaEM7TUFDQSxDQUFDLE1BQU1VLFdBQVcsQ0FBQ1ksV0FBWixFQUFQLEVBQWtDQyxNQUFsQyxDQUF5Q0MsR0FBekMsQ0FBNkMsQ0FBQyxLQUFELEVBQVEsS0FBUixDQUE3QztJQUNELENBSEMsQ0FBRjtFQUlELENBUk8sQ0FBUjtFQVNBakIsUUFBUSxDQUFDLFFBQUQsRUFBVyxZQUFZO0lBRTdCLElBQUlOLEdBQUo7SUFFQSxJQUFJSyxHQUFKO0lBQ0FLLFVBQVUsQ0FBQyxZQUFZO01BQ3JCVixHQUFHLEdBQUdPLE9BQU8sQ0FBQ2lCLEdBQVIsQ0FBWXpCLG1CQUFtQixDQUFDQyxHQUFoQyxFQUFxQyxRQUFyQyxDQUFOO01BQ0FLLEdBQUcsR0FBR0UsT0FBTyxDQUFDaUIsR0FBUixDQUFZekIsbUJBQW1CLENBQUNNLEdBQWhDLEVBQXFDLFFBQXJDLENBQU47SUFDRCxDQUhTLENBQVY7SUFJQWUsRUFBRSxDQUFDLDhDQUFELEVBQWlELGtCQUFrQjtNQUNuRSxNQUFNWCxXQUFXLENBQUNnQixNQUFaLENBQW1CLEtBQW5CLEVBQTBCSCxNQUExQixDQUFpQ0ksVUFBakMsQ0FBNENDLEVBQTVDLENBQStDQyxRQUFyRDtNQUNBNUIsR0FBRyxDQUFDNkIsTUFBSixDQUFXUCxNQUFYLENBQWtCSyxFQUFsQixDQUFxQkcsS0FBckI7TUFDQXpCLEdBQUcsQ0FBQ3dCLE1BQUosQ0FBV1AsTUFBWCxDQUFrQkssRUFBbEIsQ0FBcUJHLEtBQXJCO0lBQ0QsQ0FKQyxDQUFGO0lBS0FWLEVBQUUsQ0FBQywwRUFBRCxFQUE2RSxrQkFBa0I7TUFDL0ZYLFdBQVcsQ0FBQ00saUJBQVosR0FBZ0NoQixtQkFBaEM7TUFDQSxJQUFJZ0MsR0FBSjs7TUFDQSxJQUFJO1FBQ0YsTUFBTXRCLFdBQVcsQ0FBQ2dCLE1BQVosQ0FBbUIsT0FBbkIsQ0FBTjtNQUNELENBRkQsQ0FFRSxPQUFPTyxJQUFQLEVBQWE7UUFDYkQsR0FBRyxHQUFHQyxJQUFOO01BQ0Q7O01BQ0RyQyxNQUFNLENBQUNvQyxHQUFELENBQU4sQ0FBWUUsRUFBWixDQUFlQyxLQUFmO01BQ0FILEdBQUcsQ0FBQ0ksT0FBSixDQUFZYixNQUFaLENBQW1CQyxHQUFuQixDQUNHLDBGQURIO01BR0F2QixHQUFHLENBQUM2QixNQUFKLENBQVdQLE1BQVgsQ0FBa0JLLEVBQWxCLENBQXFCRyxLQUFyQjtNQUNBekIsR0FBRyxDQUFDd0IsTUFBSixDQUFXUCxNQUFYLENBQWtCSyxFQUFsQixDQUFxQkcsS0FBckI7SUFDRCxDQWRDLENBQUY7SUFlQVYsRUFBRSxDQUFDLGtEQUFELEVBQXFELGtCQUFrQjtNQUN2RVgsV0FBVyxDQUFDTSxpQkFBWixHQUFnQ2hCLG1CQUFoQztNQUNBLElBQUlxQyxJQUFJLEdBQUcsTUFBTTNCLFdBQVcsQ0FBQ2dCLE1BQVosQ0FBbUIsS0FBbkIsQ0FBakI7TUFDQVcsSUFBSSxDQUFDZCxNQUFMLENBQVlDLEdBQVosQ0FBZ0IxQixVQUFoQjtNQUNBRyxHQUFHLENBQUM2QixNQUFKLENBQVdQLE1BQVgsQ0FBa0JLLEVBQWxCLENBQXFCVSxJQUFyQjtNQUNBaEMsR0FBRyxDQUFDd0IsTUFBSixDQUFXUCxNQUFYLENBQWtCSyxFQUFsQixDQUFxQkcsS0FBckI7SUFDRCxDQU5DLENBQUY7RUFPRCxDQXBDTyxDQUFSO0FBcUNELENBM0VPLENBQVIifQ==
|