@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.
Files changed (74) hide show
  1. package/build/lib/basedriver/capabilities.js +2 -2
  2. package/build/lib/basedriver/commands/execute.d.ts +11 -0
  3. package/build/lib/basedriver/commands/execute.d.ts.map +1 -0
  4. package/build/lib/basedriver/commands/execute.js +62 -0
  5. package/build/lib/basedriver/commands/index.d.ts +1 -1
  6. package/build/lib/basedriver/commands/index.d.ts.map +1 -1
  7. package/build/lib/basedriver/commands/index.js +5 -2
  8. package/build/lib/basedriver/commands/log.js +2 -4
  9. package/build/lib/basedriver/core.d.ts +11 -0
  10. package/build/lib/basedriver/core.d.ts.map +1 -1
  11. package/build/lib/basedriver/core.js +6 -1
  12. package/build/lib/basedriver/helpers.js +2 -2
  13. package/build/lib/express/server.d.ts +70 -7
  14. package/build/lib/express/server.d.ts.map +1 -1
  15. package/build/lib/express/server.js +19 -16
  16. package/build/lib/express/websocket.d.ts +12 -30
  17. package/build/lib/express/websocket.d.ts.map +1 -1
  18. package/build/lib/express/websocket.js +6 -4
  19. package/build/lib/index.d.ts +12 -180
  20. package/build/lib/index.d.ts.map +1 -1
  21. package/build/lib/index.js +107 -80
  22. package/build/lib/jsonwp-proxy/protocol-converter.js +2 -4
  23. package/build/lib/jsonwp-proxy/proxy.js +3 -7
  24. package/build/lib/protocol/index.d.ts +3 -1
  25. package/build/lib/protocol/index.js +13 -1
  26. package/build/lib/protocol/protocol.d.ts +8 -4
  27. package/build/lib/protocol/protocol.d.ts.map +1 -1
  28. package/build/lib/protocol/protocol.js +7 -7
  29. package/build/lib/protocol/routes.js +2 -6
  30. package/build/tsconfig.tsbuildinfo +1 -1
  31. package/lib/basedriver/commands/execute.js +65 -0
  32. package/lib/basedriver/commands/index.js +3 -1
  33. package/lib/basedriver/core.js +15 -0
  34. package/lib/express/server.js +126 -36
  35. package/lib/express/websocket.js +13 -11
  36. package/lib/index.js +19 -61
  37. package/lib/protocol/index.js +4 -0
  38. package/lib/protocol/protocol.js +10 -3
  39. package/package.json +17 -15
  40. package/build/test/basedriver/README.md +0 -5
  41. package/build/test/basedriver/driver-e2e-tests.js +0 -413
  42. package/build/test/basedriver/driver-tests.js +0 -572
  43. package/build/test/basedriver/index.js +0 -26
  44. package/build/test/e2e/basedriver/driver.e2e.spec.js +0 -15
  45. package/build/test/e2e/basedriver/helpers.e2e.spec.js +0 -192
  46. package/build/test/e2e/basedriver/websockets.e2e.spec.js +0 -87
  47. package/build/test/e2e/express/server.e2e.spec.js +0 -159
  48. package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +0 -59
  49. package/build/test/e2e/protocol/fake-driver.js +0 -163
  50. package/build/test/e2e/protocol/helpers.js +0 -25
  51. package/build/test/e2e/protocol/protocol.e2e.spec.js +0 -1186
  52. package/build/test/helpers.js +0 -55
  53. package/build/test/unit/basedriver/capabilities.spec.js +0 -672
  54. package/build/test/unit/basedriver/capability.spec.js +0 -353
  55. package/build/test/unit/basedriver/commands/event.spec.js +0 -110
  56. package/build/test/unit/basedriver/commands/log.spec.js +0 -92
  57. package/build/test/unit/basedriver/device-settings.spec.js +0 -97
  58. package/build/test/unit/basedriver/driver.spec.js +0 -15
  59. package/build/test/unit/basedriver/helpers.spec.js +0 -151
  60. package/build/test/unit/basedriver/timeout.spec.js +0 -135
  61. package/build/test/unit/express/server.spec.js +0 -155
  62. package/build/test/unit/express/static.spec.js +0 -26
  63. package/build/test/unit/jsonwp-proxy/mock-request.js +0 -91
  64. package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +0 -171
  65. package/build/test/unit/jsonwp-proxy/proxy.spec.js +0 -292
  66. package/build/test/unit/jsonwp-proxy/url.spec.js +0 -165
  67. package/build/test/unit/jsonwp-status/status.spec.js +0 -34
  68. package/build/test/unit/protocol/errors.spec.js +0 -390
  69. package/build/test/unit/protocol/routes.spec.js +0 -80
  70. package/build/test/unit/protocol/validator.spec.js +0 -149
  71. package/test/basedriver/README.md +0 -5
  72. package/test/basedriver/driver-e2e-tests.js +0 -386
  73. package/test/basedriver/driver-tests.js +0 -624
  74. package/test/basedriver/index.js +0 -6
@@ -1,26 +0,0 @@
1
- "use strict";
2
-
3
- require("source-map-support/register");
4
-
5
- var _static = require("../../../lib/express/static");
6
-
7
- var _sinon = require("sinon");
8
-
9
- describe('welcome', function () {
10
- let sandbox;
11
- beforeEach(function () {
12
- sandbox = (0, _sinon.createSandbox)();
13
- });
14
- afterEach(function () {
15
- sandbox.restore();
16
- });
17
- it('should fill the template', async function () {
18
- let res = {
19
- send: sandbox.stub()
20
- };
21
- await (0, _static.welcome)({}, res);
22
- res.send.calledOnce.should.be.true;
23
- res.send.args[0][0].should.include("Let's browse!");
24
- });
25
- });
26
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXNjcmliZSIsInNhbmRib3giLCJiZWZvcmVFYWNoIiwiY3JlYXRlU2FuZGJveCIsImFmdGVyRWFjaCIsInJlc3RvcmUiLCJpdCIsInJlcyIsInNlbmQiLCJzdHViIiwid2VsY29tZSIsImNhbGxlZE9uY2UiLCJzaG91bGQiLCJiZSIsInRydWUiLCJhcmdzIiwiaW5jbHVkZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9leHByZXNzL3N0YXRpYy5zcGVjLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptb2NoYVxuXG5pbXBvcnQge3dlbGNvbWV9IGZyb20gJy4uLy4uLy4uL2xpYi9leHByZXNzL3N0YXRpYyc7XG5pbXBvcnQge2NyZWF0ZVNhbmRib3h9IGZyb20gJ3Npbm9uJztcblxuZGVzY3JpYmUoJ3dlbGNvbWUnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBzYW5kYm94O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3ggPSBjcmVhdGVTYW5kYm94KCk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmlsbCB0aGUgdGVtcGxhdGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHJlcyA9IHtcbiAgICAgIHNlbmQ6IHNhbmRib3guc3R1YigpLFxuICAgIH07XG4gICAgYXdhaXQgd2VsY29tZSh7fSwgcmVzKTtcblxuICAgIHJlcy5zZW5kLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWU7XG4gICAgcmVzLnNlbmQuYXJnc1swXVswXS5zaG91bGQuaW5jbHVkZShcIkxldCdzIGJyb3dzZSFcIik7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFFQTs7QUFDQTs7QUFFQUEsUUFBUSxDQUFDLFNBQUQsRUFBWSxZQUFZO0VBQzlCLElBQUlDLE9BQUo7RUFFQUMsVUFBVSxDQUFDLFlBQVk7SUFDckJELE9BQU8sR0FBRyxJQUFBRSxvQkFBQSxHQUFWO0VBQ0QsQ0FGUyxDQUFWO0VBSUFDLFNBQVMsQ0FBQyxZQUFZO0lBQ3BCSCxPQUFPLENBQUNJLE9BQVI7RUFDRCxDQUZRLENBQVQ7RUFJQUMsRUFBRSxDQUFDLDBCQUFELEVBQTZCLGtCQUFrQjtJQUMvQyxJQUFJQyxHQUFHLEdBQUc7TUFDUkMsSUFBSSxFQUFFUCxPQUFPLENBQUNRLElBQVI7SUFERSxDQUFWO0lBR0EsTUFBTSxJQUFBQyxlQUFBLEVBQVEsRUFBUixFQUFZSCxHQUFaLENBQU47SUFFQUEsR0FBRyxDQUFDQyxJQUFKLENBQVNHLFVBQVQsQ0FBb0JDLE1BQXBCLENBQTJCQyxFQUEzQixDQUE4QkMsSUFBOUI7SUFDQVAsR0FBRyxDQUFDQyxJQUFKLENBQVNPLElBQVQsQ0FBYyxDQUFkLEVBQWlCLENBQWpCLEVBQW9CSCxNQUFwQixDQUEyQkksT0FBM0IsQ0FBbUMsZUFBbkM7RUFDRCxDQVJDLENBQUY7QUFTRCxDQXBCTyxDQUFSIn0=
@@ -1,91 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- function resFixture(url, method) {
11
- if (/\/status$/.test(url)) {
12
- return [200, {
13
- status: 0,
14
- value: {
15
- foo: 'bar'
16
- }
17
- }];
18
- }
19
-
20
- if (/\/element\/bad\/text$/.test(url)) {
21
- return [500, {
22
- status: 11,
23
- value: {
24
- message: 'Invisible element'
25
- }
26
- }];
27
- }
28
-
29
- if (/\/element\/200\/text$/.test(url)) {
30
- return [200, {
31
- status: 11,
32
- value: {
33
- message: 'Invisible element'
34
- }
35
- }];
36
- }
37
-
38
- if (/\/element\/200\/value$/.test(url)) {
39
- return [200, {
40
- status: 0,
41
- sessionId: 'innersessionid',
42
- value: 'foobar'
43
- }];
44
- }
45
-
46
- if (/\/session$/.test(url) && method === 'POST') {
47
- return [200, {
48
- status: 0,
49
- sessionId: '123',
50
- value: {
51
- browserName: 'boo'
52
- }
53
- }];
54
- }
55
-
56
- if (/\/nochrome$/.test(url)) {
57
- return [100, {
58
- status: 0,
59
- value: {
60
- message: 'chrome not reachable'
61
- }
62
- }];
63
- }
64
-
65
- throw new Error("Can't handle url " + url);
66
- }
67
-
68
- async function request(opts) {
69
- const {
70
- url,
71
- method,
72
- json
73
- } = opts;
74
-
75
- if (/badurl$/.test(url)) {
76
- throw new Error('noworky');
77
- }
78
-
79
- const [status, data] = resFixture(url, method, json);
80
- return {
81
- status,
82
- headers: {
83
- 'content-type': 'application/json; charset=utf-8'
84
- },
85
- data
86
- };
87
- }
88
-
89
- var _default = request;
90
- exports.default = _default;
91
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXNGaXh0dXJlIiwidXJsIiwibWV0aG9kIiwidGVzdCIsInN0YXR1cyIsInZhbHVlIiwiZm9vIiwibWVzc2FnZSIsInNlc3Npb25JZCIsImJyb3dzZXJOYW1lIiwiRXJyb3IiLCJyZXF1ZXN0Iiwib3B0cyIsImpzb24iLCJkYXRhIiwiaGVhZGVycyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9qc29ud3AtcHJveHkvbW9jay1yZXF1ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIHJlc0ZpeHR1cmUodXJsLCBtZXRob2QpIHtcbiAgaWYgKC9cXC9zdGF0dXMkLy50ZXN0KHVybCkpIHtcbiAgICByZXR1cm4gWzIwMCwge3N0YXR1czogMCwgdmFsdWU6IHtmb286ICdiYXInfX1dO1xuICB9XG4gIGlmICgvXFwvZWxlbWVudFxcL2JhZFxcL3RleHQkLy50ZXN0KHVybCkpIHtcbiAgICByZXR1cm4gWzUwMCwge3N0YXR1czogMTEsIHZhbHVlOiB7bWVzc2FnZTogJ0ludmlzaWJsZSBlbGVtZW50J319XTtcbiAgfVxuICBpZiAoL1xcL2VsZW1lbnRcXC8yMDBcXC90ZXh0JC8udGVzdCh1cmwpKSB7XG4gICAgcmV0dXJuIFsyMDAsIHtzdGF0dXM6IDExLCB2YWx1ZToge21lc3NhZ2U6ICdJbnZpc2libGUgZWxlbWVudCd9fV07XG4gIH1cbiAgaWYgKC9cXC9lbGVtZW50XFwvMjAwXFwvdmFsdWUkLy50ZXN0KHVybCkpIHtcbiAgICByZXR1cm4gWzIwMCwge3N0YXR1czogMCwgc2Vzc2lvbklkOiAnaW5uZXJzZXNzaW9uaWQnLCB2YWx1ZTogJ2Zvb2Jhcid9XTtcbiAgfVxuICBpZiAoL1xcL3Nlc3Npb24kLy50ZXN0KHVybCkgJiYgbWV0aG9kID09PSAnUE9TVCcpIHtcbiAgICByZXR1cm4gWzIwMCwge3N0YXR1czogMCwgc2Vzc2lvbklkOiAnMTIzJywgdmFsdWU6IHticm93c2VyTmFtZTogJ2Jvbyd9fV07XG4gIH1cbiAgaWYgKC9cXC9ub2Nocm9tZSQvLnRlc3QodXJsKSkge1xuICAgIHJldHVybiBbMTAwLCB7c3RhdHVzOiAwLCB2YWx1ZToge21lc3NhZ2U6ICdjaHJvbWUgbm90IHJlYWNoYWJsZSd9fV07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgaGFuZGxlIHVybCBcIiArIHVybCk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF3YWl0XG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0KG9wdHMpIHtcbiAgY29uc3Qge3VybCwgbWV0aG9kLCBqc29ufSA9IG9wdHM7XG4gIGlmICgvYmFkdXJsJC8udGVzdCh1cmwpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3dvcmt5Jyk7XG4gIH1cblxuICBjb25zdCBbc3RhdHVzLCBkYXRhXSA9IHJlc0ZpeHR1cmUodXJsLCBtZXRob2QsIGpzb24pO1xuICByZXR1cm4ge1xuICAgIHN0YXR1cyxcbiAgICBoZWFkZXJzOiB7J2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J30sXG4gICAgZGF0YSxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVxdWVzdDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsU0FBU0EsVUFBVCxDQUFvQkMsR0FBcEIsRUFBeUJDLE1BQXpCLEVBQWlDO0VBQy9CLElBQUksWUFBWUMsSUFBWixDQUFpQkYsR0FBakIsQ0FBSixFQUEyQjtJQUN6QixPQUFPLENBQUMsR0FBRCxFQUFNO01BQUNHLE1BQU0sRUFBRSxDQUFUO01BQVlDLEtBQUssRUFBRTtRQUFDQyxHQUFHLEVBQUU7TUFBTjtJQUFuQixDQUFOLENBQVA7RUFDRDs7RUFDRCxJQUFJLHdCQUF3QkgsSUFBeEIsQ0FBNkJGLEdBQTdCLENBQUosRUFBdUM7SUFDckMsT0FBTyxDQUFDLEdBQUQsRUFBTTtNQUFDRyxNQUFNLEVBQUUsRUFBVDtNQUFhQyxLQUFLLEVBQUU7UUFBQ0UsT0FBTyxFQUFFO01BQVY7SUFBcEIsQ0FBTixDQUFQO0VBQ0Q7O0VBQ0QsSUFBSSx3QkFBd0JKLElBQXhCLENBQTZCRixHQUE3QixDQUFKLEVBQXVDO0lBQ3JDLE9BQU8sQ0FBQyxHQUFELEVBQU07TUFBQ0csTUFBTSxFQUFFLEVBQVQ7TUFBYUMsS0FBSyxFQUFFO1FBQUNFLE9BQU8sRUFBRTtNQUFWO0lBQXBCLENBQU4sQ0FBUDtFQUNEOztFQUNELElBQUkseUJBQXlCSixJQUF6QixDQUE4QkYsR0FBOUIsQ0FBSixFQUF3QztJQUN0QyxPQUFPLENBQUMsR0FBRCxFQUFNO01BQUNHLE1BQU0sRUFBRSxDQUFUO01BQVlJLFNBQVMsRUFBRSxnQkFBdkI7TUFBeUNILEtBQUssRUFBRTtJQUFoRCxDQUFOLENBQVA7RUFDRDs7RUFDRCxJQUFJLGFBQWFGLElBQWIsQ0FBa0JGLEdBQWxCLEtBQTBCQyxNQUFNLEtBQUssTUFBekMsRUFBaUQ7SUFDL0MsT0FBTyxDQUFDLEdBQUQsRUFBTTtNQUFDRSxNQUFNLEVBQUUsQ0FBVDtNQUFZSSxTQUFTLEVBQUUsS0FBdkI7TUFBOEJILEtBQUssRUFBRTtRQUFDSSxXQUFXLEVBQUU7TUFBZDtJQUFyQyxDQUFOLENBQVA7RUFDRDs7RUFDRCxJQUFJLGNBQWNOLElBQWQsQ0FBbUJGLEdBQW5CLENBQUosRUFBNkI7SUFDM0IsT0FBTyxDQUFDLEdBQUQsRUFBTTtNQUFDRyxNQUFNLEVBQUUsQ0FBVDtNQUFZQyxLQUFLLEVBQUU7UUFBQ0UsT0FBTyxFQUFFO01BQVY7SUFBbkIsQ0FBTixDQUFQO0VBQ0Q7O0VBQ0QsTUFBTSxJQUFJRyxLQUFKLENBQVUsc0JBQXNCVCxHQUFoQyxDQUFOO0FBQ0Q7O0FBR0QsZUFBZVUsT0FBZixDQUF1QkMsSUFBdkIsRUFBNkI7RUFDM0IsTUFBTTtJQUFDWCxHQUFEO0lBQU1DLE1BQU47SUFBY1c7RUFBZCxJQUFzQkQsSUFBNUI7O0VBQ0EsSUFBSSxVQUFVVCxJQUFWLENBQWVGLEdBQWYsQ0FBSixFQUF5QjtJQUN2QixNQUFNLElBQUlTLEtBQUosQ0FBVSxTQUFWLENBQU47RUFDRDs7RUFFRCxNQUFNLENBQUNOLE1BQUQsRUFBU1UsSUFBVCxJQUFpQmQsVUFBVSxDQUFDQyxHQUFELEVBQU1DLE1BQU4sRUFBY1csSUFBZCxDQUFqQztFQUNBLE9BQU87SUFDTFQsTUFESztJQUVMVyxPQUFPLEVBQUU7TUFBQyxnQkFBZ0I7SUFBakIsQ0FGSjtJQUdMRDtFQUhLLENBQVA7QUFLRDs7ZUFFY0gsTyJ9
@@ -1,171 +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 _constants = require("../../../lib/constants");
10
-
11
- var _protocolConverter = _interopRequireWildcard(require("../../../lib/jsonwp-proxy/protocol-converter"));
12
-
13
- 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); }
14
-
15
- 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; }
16
-
17
- const {
18
- MJSONWP,
19
- W3C
20
- } = _constants.PROTOCOLS;
21
- describe('Protocol Converter', function () {
22
- describe('getTimeoutRequestObjects', function () {
23
- let converter;
24
- before(function () {
25
- converter = new _protocolConverter.default(_lodash.default.noop);
26
- });
27
- it('should take W3C inputs and produce MJSONWP compatible objects', function () {
28
- converter.downstreamProtocol = MJSONWP;
29
- let timeoutObjects = converter.getTimeoutRequestObjects({
30
- script: 100
31
- });
32
- timeoutObjects.length.should.equal(1);
33
- timeoutObjects[0].should.eql({
34
- type: 'script',
35
- ms: 100
36
- });
37
- });
38
- it('should ignore invalid entries while converting from W3C', function () {
39
- converter.downstreamProtocol = MJSONWP;
40
- let timeoutObjects = converter.getTimeoutRequestObjects({
41
- script: 100,
42
- sessionId: '5432a4f3-cd89-4781-8905-ea9d3150840c',
43
- bar: -1,
44
- baz: undefined
45
- });
46
- timeoutObjects.length.should.equal(1);
47
- timeoutObjects[0].should.eql({
48
- type: 'script',
49
- ms: 100
50
- });
51
- });
52
- it('should take multiple W3C timeouts and produce multiple MJSONWP compatible objects', function () {
53
- converter.downstreamProtocol = MJSONWP;
54
- let [scriptTimeout, pageLoadTimeout, implicitTimeout] = converter.getTimeoutRequestObjects({
55
- script: 100,
56
- pageLoad: 200,
57
- implicit: 300
58
- });
59
- scriptTimeout.should.eql({
60
- type: 'script',
61
- ms: 100
62
- });
63
- pageLoadTimeout.should.eql({
64
- type: 'page load',
65
- ms: 200
66
- });
67
- implicitTimeout.should.eql({
68
- type: 'implicit',
69
- ms: 300
70
- });
71
- });
72
- it('should take MJSONWP input and produce W3C compatible object', function () {
73
- converter.downstreamProtocol = W3C;
74
- let timeoutObjects = converter.getTimeoutRequestObjects({
75
- type: 'implicit',
76
- ms: 300
77
- });
78
- timeoutObjects.length.should.equal(1);
79
- timeoutObjects[0].should.eql({
80
- implicit: 300
81
- });
82
- });
83
- it('should not change the input if protocol name is unknown', function () {
84
- converter.downstreamProtocol = null;
85
- let timeoutObjects = converter.getTimeoutRequestObjects({
86
- type: 'implicit',
87
- ms: 300
88
- });
89
- timeoutObjects.length.should.equal(1);
90
- timeoutObjects[0].should.eql({
91
- type: 'implicit',
92
- ms: 300
93
- });
94
- });
95
- it('should not change the input if protocol name is unchanged', function () {
96
- converter.downstreamProtocol = MJSONWP;
97
- let timeoutObjects = converter.getTimeoutRequestObjects({
98
- type: 'implicit',
99
- ms: 300
100
- });
101
- timeoutObjects.length.should.equal(1);
102
- timeoutObjects[0].should.eql({
103
- type: 'implicit',
104
- ms: 300
105
- });
106
- });
107
- });
108
- describe('setValue', function () {
109
- let converter;
110
- let responseBody;
111
- before(function () {
112
- responseBody = null;
113
- converter = new _protocolConverter.default((url, method, body) => {
114
- responseBody = body;
115
- });
116
- });
117
- beforeEach(function () {
118
- responseBody = {};
119
- });
120
- it('should calculate value if not present', async function () {
121
- await converter.proxySetValue('', '', {
122
- text: 'bla'
123
- });
124
- responseBody.should.eql({
125
- text: 'bla',
126
- value: ['b', 'l', 'a']
127
- });
128
- });
129
- it('should calculate text if not present', async function () {
130
- await converter.proxySetValue('', '', {
131
- value: ['b', 'l', 'a']
132
- });
133
- responseBody.should.eql({
134
- text: 'bla',
135
- value: ['b', 'l', 'a']
136
- });
137
- });
138
- it('should keep the response body unchanged if both value and text are present', async function () {
139
- await converter.proxySetValue('', '', {
140
- text: 'bla',
141
- value: ['b', 'l', 'a']
142
- });
143
- responseBody.should.eql({
144
- text: 'bla',
145
- value: ['b', 'l', 'a']
146
- });
147
- });
148
- });
149
- describe('getProperty', function () {
150
- let jsonwpConverter, w3cConverter;
151
- before(function () {
152
- for (let command of _protocolConverter.COMMAND_URLS_CONFLICTS) {
153
- if (command.commandNames.includes('getProperty')) {
154
- jsonwpConverter = command.jsonwpConverter;
155
- w3cConverter = command.w3cConverter;
156
- }
157
- }
158
- });
159
- it('should convert "property/value" to "attribute/value"', function () {
160
- jsonwpConverter('/session/123/element/456/property/value').should.equal('/session/123/element/456/attribute/value');
161
- });
162
- it('should convert "property/:somePropName" to "attribute/:somePropName"', function () {
163
- jsonwpConverter('/session/123/element/456/property/somePropName').should.equal('/session/123/element/456/attribute/somePropName');
164
- });
165
- it('should not convert from JSONWP to W3C', function () {
166
- w3cConverter('/session/123/element/456/attribute/someAttr').should.equal('/session/123/element/456/attribute/someAttr');
167
- w3cConverter('/session/123/element/456/property/someProp').should.equal('/session/123/element/456/property/someProp');
168
- });
169
- });
170
- });
171
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNSlNPTldQIiwiVzNDIiwiUFJPVE9DT0xTIiwiZGVzY3JpYmUiLCJjb252ZXJ0ZXIiLCJiZWZvcmUiLCJQcm90b2NvbENvbnZlcnRlciIsIl8iLCJub29wIiwiaXQiLCJkb3duc3RyZWFtUHJvdG9jb2wiLCJ0aW1lb3V0T2JqZWN0cyIsImdldFRpbWVvdXRSZXF1ZXN0T2JqZWN0cyIsInNjcmlwdCIsImxlbmd0aCIsInNob3VsZCIsImVxdWFsIiwiZXFsIiwidHlwZSIsIm1zIiwic2Vzc2lvbklkIiwiYmFyIiwiYmF6IiwidW5kZWZpbmVkIiwic2NyaXB0VGltZW91dCIsInBhZ2VMb2FkVGltZW91dCIsImltcGxpY2l0VGltZW91dCIsInBhZ2VMb2FkIiwiaW1wbGljaXQiLCJyZXNwb25zZUJvZHkiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwiYmVmb3JlRWFjaCIsInByb3h5U2V0VmFsdWUiLCJ0ZXh0IiwidmFsdWUiLCJqc29ud3BDb252ZXJ0ZXIiLCJ3M2NDb252ZXJ0ZXIiLCJjb21tYW5kIiwiQ09NTUFORF9VUkxTX0NPTkZMSUNUUyIsImNvbW1hbmROYW1lcyIsImluY2x1ZGVzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2pzb253cC1wcm94eS9wcm90b2NvbC1jb252ZXJ0ZXIuc3BlYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtQUk9UT0NPTFN9IGZyb20gJy4uLy4uLy4uL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IFByb3RvY29sQ29udmVydGVyLCB7XG4gIENPTU1BTkRfVVJMU19DT05GTElDVFMsXG59IGZyb20gJy4uLy4uLy4uL2xpYi9qc29ud3AtcHJveHkvcHJvdG9jb2wtY29udmVydGVyJztcblxuY29uc3Qge01KU09OV1AsIFczQ30gPSBQUk9UT0NPTFM7XG5cbmRlc2NyaWJlKCdQcm90b2NvbCBDb252ZXJ0ZXInLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdnZXRUaW1lb3V0UmVxdWVzdE9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGNvbnZlcnRlcjtcbiAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgY29udmVydGVyID0gbmV3IFByb3RvY29sQ29udmVydGVyKF8ubm9vcCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0YWtlIFczQyBpbnB1dHMgYW5kIHByb2R1Y2UgTUpTT05XUCBjb21wYXRpYmxlIG9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb252ZXJ0ZXIuZG93bnN0cmVhbVByb3RvY29sID0gTUpTT05XUDtcbiAgICAgIGxldCB0aW1lb3V0T2JqZWN0cyA9IGNvbnZlcnRlci5nZXRUaW1lb3V0UmVxdWVzdE9iamVjdHMoe3NjcmlwdDogMTAwfSk7XG4gICAgICB0aW1lb3V0T2JqZWN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdGltZW91dE9iamVjdHNbMF0uc2hvdWxkLmVxbCh7dHlwZTogJ3NjcmlwdCcsIG1zOiAxMDB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGlnbm9yZSBpbnZhbGlkIGVudHJpZXMgd2hpbGUgY29udmVydGluZyBmcm9tIFczQycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnZlcnRlci5kb3duc3RyZWFtUHJvdG9jb2wgPSBNSlNPTldQO1xuICAgICAgbGV0IHRpbWVvdXRPYmplY3RzID0gY29udmVydGVyLmdldFRpbWVvdXRSZXF1ZXN0T2JqZWN0cyh7XG4gICAgICAgIHNjcmlwdDogMTAwLFxuICAgICAgICBzZXNzaW9uSWQ6ICc1NDMyYTRmMy1jZDg5LTQ3ODEtODkwNS1lYTlkMzE1MDg0MGMnLFxuICAgICAgICBiYXI6IC0xLFxuICAgICAgICBiYXo6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgdGltZW91dE9iamVjdHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHRpbWVvdXRPYmplY3RzWzBdLnNob3VsZC5lcWwoe3R5cGU6ICdzY3JpcHQnLCBtczogMTAwfSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0YWtlIG11bHRpcGxlIFczQyB0aW1lb3V0cyBhbmQgcHJvZHVjZSBtdWx0aXBsZSBNSlNPTldQIGNvbXBhdGlibGUgb2JqZWN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnZlcnRlci5kb3duc3RyZWFtUHJvdG9jb2wgPSBNSlNPTldQO1xuICAgICAgbGV0IFtzY3JpcHRUaW1lb3V0LCBwYWdlTG9hZFRpbWVvdXQsIGltcGxpY2l0VGltZW91dF0gPSBjb252ZXJ0ZXIuZ2V0VGltZW91dFJlcXVlc3RPYmplY3RzKHtcbiAgICAgICAgc2NyaXB0OiAxMDAsXG4gICAgICAgIHBhZ2VMb2FkOiAyMDAsXG4gICAgICAgIGltcGxpY2l0OiAzMDAsXG4gICAgICB9KTtcbiAgICAgIHNjcmlwdFRpbWVvdXQuc2hvdWxkLmVxbCh7XG4gICAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgICBtczogMTAwLFxuICAgICAgfSk7XG4gICAgICBwYWdlTG9hZFRpbWVvdXQuc2hvdWxkLmVxbCh7XG4gICAgICAgIHR5cGU6ICdwYWdlIGxvYWQnLFxuICAgICAgICBtczogMjAwLFxuICAgICAgfSk7XG4gICAgICBpbXBsaWNpdFRpbWVvdXQuc2hvdWxkLmVxbCh7XG4gICAgICAgIHR5cGU6ICdpbXBsaWNpdCcsXG4gICAgICAgIG1zOiAzMDAsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHRha2UgTUpTT05XUCBpbnB1dCBhbmQgcHJvZHVjZSBXM0MgY29tcGF0aWJsZSBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb252ZXJ0ZXIuZG93bnN0cmVhbVByb3RvY29sID0gVzNDO1xuICAgICAgbGV0IHRpbWVvdXRPYmplY3RzID0gY29udmVydGVyLmdldFRpbWVvdXRSZXF1ZXN0T2JqZWN0cyh7XG4gICAgICAgIHR5cGU6ICdpbXBsaWNpdCcsXG4gICAgICAgIG1zOiAzMDAsXG4gICAgICB9KTtcbiAgICAgIHRpbWVvdXRPYmplY3RzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0aW1lb3V0T2JqZWN0c1swXS5zaG91bGQuZXFsKHtpbXBsaWNpdDogMzAwfSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBub3QgY2hhbmdlIHRoZSBpbnB1dCBpZiBwcm90b2NvbCBuYW1lIGlzIHVua25vd24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb252ZXJ0ZXIuZG93bnN0cmVhbVByb3RvY29sID0gbnVsbDtcbiAgICAgIGxldCB0aW1lb3V0T2JqZWN0cyA9IGNvbnZlcnRlci5nZXRUaW1lb3V0UmVxdWVzdE9iamVjdHMoe1xuICAgICAgICB0eXBlOiAnaW1wbGljaXQnLFxuICAgICAgICBtczogMzAwLFxuICAgICAgfSk7XG4gICAgICB0aW1lb3V0T2JqZWN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdGltZW91dE9iamVjdHNbMF0uc2hvdWxkLmVxbCh7dHlwZTogJ2ltcGxpY2l0JywgbXM6IDMwMH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgbm90IGNoYW5nZSB0aGUgaW5wdXQgaWYgcHJvdG9jb2wgbmFtZSBpcyB1bmNoYW5nZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb252ZXJ0ZXIuZG93bnN0cmVhbVByb3RvY29sID0gTUpTT05XUDtcbiAgICAgIGxldCB0aW1lb3V0T2JqZWN0cyA9IGNvbnZlcnRlci5nZXRUaW1lb3V0UmVxdWVzdE9iamVjdHMoe1xuICAgICAgICB0eXBlOiAnaW1wbGljaXQnLFxuICAgICAgICBtczogMzAwLFxuICAgICAgfSk7XG4gICAgICB0aW1lb3V0T2JqZWN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdGltZW91dE9iamVjdHNbMF0uc2hvdWxkLmVxbCh7dHlwZTogJ2ltcGxpY2l0JywgbXM6IDMwMH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2V0VmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGNvbnZlcnRlcjtcbiAgICBsZXQgcmVzcG9uc2VCb2R5O1xuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICByZXNwb25zZUJvZHkgPSBudWxsO1xuICAgICAgY29udmVydGVyID0gbmV3IFByb3RvY29sQ29udmVydGVyKCh1cmwsIG1ldGhvZCwgYm9keSkgPT4ge1xuICAgICAgICByZXNwb25zZUJvZHkgPSBib2R5O1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICByZXNwb25zZUJvZHkgPSB7fTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsY3VsYXRlIHZhbHVlIGlmIG5vdCBwcmVzZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgY29udmVydGVyLnByb3h5U2V0VmFsdWUoJycsICcnLCB7XG4gICAgICAgIHRleHQ6ICdibGEnLFxuICAgICAgfSk7XG4gICAgICByZXNwb25zZUJvZHkuc2hvdWxkLmVxbCh7XG4gICAgICAgIHRleHQ6ICdibGEnLFxuICAgICAgICB2YWx1ZTogWydiJywgJ2wnLCAnYSddLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgdGV4dCBpZiBub3QgcHJlc2VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGNvbnZlcnRlci5wcm94eVNldFZhbHVlKCcnLCAnJywge1xuICAgICAgICB2YWx1ZTogWydiJywgJ2wnLCAnYSddLFxuICAgICAgfSk7XG4gICAgICByZXNwb25zZUJvZHkuc2hvdWxkLmVxbCh7XG4gICAgICAgIHRleHQ6ICdibGEnLFxuICAgICAgICB2YWx1ZTogWydiJywgJ2wnLCAnYSddLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBrZWVwIHRoZSByZXNwb25zZSBib2R5IHVuY2hhbmdlZCBpZiBib3RoIHZhbHVlIGFuZCB0ZXh0IGFyZSBwcmVzZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgY29udmVydGVyLnByb3h5U2V0VmFsdWUoJycsICcnLCB7XG4gICAgICAgIHRleHQ6ICdibGEnLFxuICAgICAgICB2YWx1ZTogWydiJywgJ2wnLCAnYSddLFxuICAgICAgfSk7XG4gICAgICByZXNwb25zZUJvZHkuc2hvdWxkLmVxbCh7XG4gICAgICAgIHRleHQ6ICdibGEnLFxuICAgICAgICB2YWx1ZTogWydiJywgJ2wnLCAnYSddLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnZ2V0UHJvcGVydHknLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGpzb253cENvbnZlcnRlciwgdzNjQ29udmVydGVyO1xuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGxldCBjb21tYW5kIG9mIENPTU1BTkRfVVJMU19DT05GTElDVFMpIHtcbiAgICAgICAgaWYgKGNvbW1hbmQuY29tbWFuZE5hbWVzLmluY2x1ZGVzKCdnZXRQcm9wZXJ0eScpKSB7XG4gICAgICAgICAganNvbndwQ29udmVydGVyID0gY29tbWFuZC5qc29ud3BDb252ZXJ0ZXI7XG4gICAgICAgICAgdzNjQ29udmVydGVyID0gY29tbWFuZC53M2NDb252ZXJ0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgXCJwcm9wZXJ0eS92YWx1ZVwiIHRvIFwiYXR0cmlidXRlL3ZhbHVlXCInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBqc29ud3BDb252ZXJ0ZXIoJy9zZXNzaW9uLzEyMy9lbGVtZW50LzQ1Ni9wcm9wZXJ0eS92YWx1ZScpLnNob3VsZC5lcXVhbChcbiAgICAgICAgJy9zZXNzaW9uLzEyMy9lbGVtZW50LzQ1Ni9hdHRyaWJ1dGUvdmFsdWUnXG4gICAgICApO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgY29udmVydCBcInByb3BlcnR5Lzpzb21lUHJvcE5hbWVcIiB0byBcImF0dHJpYnV0ZS86c29tZVByb3BOYW1lXCInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBqc29ud3BDb252ZXJ0ZXIoJy9zZXNzaW9uLzEyMy9lbGVtZW50LzQ1Ni9wcm9wZXJ0eS9zb21lUHJvcE5hbWUnKS5zaG91bGQuZXF1YWwoXG4gICAgICAgICcvc2Vzc2lvbi8xMjMvZWxlbWVudC80NTYvYXR0cmlidXRlL3NvbWVQcm9wTmFtZSdcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBub3QgY29udmVydCBmcm9tIEpTT05XUCB0byBXM0MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB3M2NDb252ZXJ0ZXIoJy9zZXNzaW9uLzEyMy9lbGVtZW50LzQ1Ni9hdHRyaWJ1dGUvc29tZUF0dHInKS5zaG91bGQuZXF1YWwoXG4gICAgICAgICcvc2Vzc2lvbi8xMjMvZWxlbWVudC80NTYvYXR0cmlidXRlL3NvbWVBdHRyJ1xuICAgICAgKTtcbiAgICAgIHczY0NvbnZlcnRlcignL3Nlc3Npb24vMTIzL2VsZW1lbnQvNDU2L3Byb3BlcnR5L3NvbWVQcm9wJykuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnL3Nlc3Npb24vMTIzL2VsZW1lbnQvNDU2L3Byb3BlcnR5L3NvbWVQcm9wJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7OztBQUlBLE1BQU07RUFBQ0EsT0FBRDtFQUFVQztBQUFWLElBQWlCQyxvQkFBdkI7QUFFQUMsUUFBUSxDQUFDLG9CQUFELEVBQXVCLFlBQVk7RUFDekNBLFFBQVEsQ0FBQywwQkFBRCxFQUE2QixZQUFZO0lBQy9DLElBQUlDLFNBQUo7SUFDQUMsTUFBTSxDQUFDLFlBQVk7TUFDakJELFNBQVMsR0FBRyxJQUFJRSwwQkFBSixDQUFzQkMsZUFBQSxDQUFFQyxJQUF4QixDQUFaO0lBQ0QsQ0FGSyxDQUFOO0lBR0FDLEVBQUUsQ0FBQywrREFBRCxFQUFrRSxZQUFZO01BQzlFTCxTQUFTLENBQUNNLGtCQUFWLEdBQStCVixPQUEvQjtNQUNBLElBQUlXLGNB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
@@ -1,292 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _lib = require("../../../lib");
8
-
9
- var _mockRequest = _interopRequireDefault(require("./mock-request"));
10
-
11
- var _errors = require("../../../lib/protocol/errors");
12
-
13
- var _helpers = require("../../helpers");
14
-
15
- function buildReqRes(url, method, body) {
16
- let req = {
17
- originalUrl: url,
18
- method,
19
- body
20
- };
21
- let res = {};
22
- res.headers = {};
23
-
24
- res.set = (k, v) => {
25
- res[k] = v;
26
- };
27
-
28
- res.status = code => {
29
- res.sentCode = code;
30
- return res;
31
- };
32
-
33
- res.send = body => {
34
- try {
35
- body = JSON.parse(body);
36
- } catch (e) {}
37
-
38
- res.sentBody = body;
39
- };
40
-
41
- return [req, res];
42
- }
43
-
44
- describe('proxy', function () {
45
- let port;
46
-
47
- function mockProxy(opts = {}) {
48
- opts = {
49
- server: _helpers.TEST_HOST,
50
- port,
51
- ...opts
52
- };
53
- let proxy = new _lib.JWProxy(opts);
54
-
55
- proxy.request = async function (...args) {
56
- return await (0, _mockRequest.default)(...args);
57
- };
58
-
59
- return proxy;
60
- }
61
-
62
- before(async function () {
63
- port = await (0, _helpers.getTestPort)();
64
- });
65
- it('should override default params', function () {
66
- let j = mockProxy({
67
- server: '127.0.0.2',
68
- port
69
- });
70
- j.server.should.equal('127.0.0.2');
71
- j.port.should.equal(port);
72
- });
73
- it('should save session id on session creation', async function () {
74
- let j = mockProxy();
75
- let [res, body] = await j.proxy('/session', 'POST', {
76
- desiredCapabilities: {}
77
- });
78
- res.statusCode.should.equal(200);
79
- body.should.eql({
80
- status: 0,
81
- sessionId: '123',
82
- value: {
83
- browserName: 'boo'
84
- }
85
- });
86
- j.sessionId.should.equal('123');
87
- });
88
- describe('getUrlForProxy', function () {
89
- it('should modify session id, host, and port', function () {
90
- let j = mockProxy({
91
- sessionId: '123'
92
- });
93
- j.getUrlForProxy('http://host.com:1234/session/456/element/200/value').should.eql(`http://${_helpers.TEST_HOST}:${port}/session/123/element/200/value`);
94
- });
95
- it('should prepend scheme, host and port if not provided', function () {
96
- let j = mockProxy({
97
- sessionId: '123'
98
- });
99
- j.getUrlForProxy('/session/456/element/200/value').should.eql(`http://${_helpers.TEST_HOST}:${port}/session/123/element/200/value`);
100
- });
101
- it('should respect nonstandard incoming request base path', function () {
102
- let j = mockProxy({
103
- sessionId: '123',
104
- reqBasePath: ''
105
- });
106
- j.getUrlForProxy('/session/456/element/200/value').should.eql(`http://${_helpers.TEST_HOST}:${port}/session/123/element/200/value`);
107
- j = mockProxy({
108
- sessionId: '123',
109
- reqBasePath: '/my/base/path'
110
- });
111
- j.getUrlForProxy('/my/base/path/session/456/element/200/value').should.eql(`http://${_helpers.TEST_HOST}:${port}/session/123/element/200/value`);
112
- });
113
- it('should work with urls which do not have session ids', function () {
114
- let j = mockProxy({
115
- sessionId: '123'
116
- });
117
- j.getUrlForProxy('http://host.com:1234/session').should.eql(`http://${_helpers.TEST_HOST}:${port}/session`);
118
- let newUrl = j.getUrlForProxy('/session');
119
- newUrl.should.eql(`http://${_helpers.TEST_HOST}:${port}/session`);
120
- });
121
- it('should throw an error if url requires a sessionId but its null', function () {
122
- let j = mockProxy();
123
- let e;
124
-
125
- try {
126
- j.getUrlForProxy('/session/456/element/200/value');
127
- } catch (err) {
128
- e = err;
129
- }
130
-
131
- should.exist(e);
132
- e.message.should.contain('without session id');
133
- });
134
- it('should not throw an error if url does not require a session id and its null', function () {
135
- let j = mockProxy();
136
- let newUrl = j.getUrlForProxy('/status');
137
- should.exist(newUrl);
138
- });
139
- });
140
- describe('straight proxy', function () {
141
- it('should successfully proxy straight', async function () {
142
- let j = mockProxy();
143
- let [res, body] = await j.proxy('/status', 'GET');
144
- res.statusCode.should.equal(200);
145
- body.should.eql({
146
- status: 0,
147
- value: {
148
- foo: 'bar'
149
- }
150
- });
151
- });
152
- it('should pass along request errors', function () {
153
- let j = mockProxy({
154
- sessionId: '123'
155
- });
156
- j.proxy('/badurl', 'GET').should.eventually.be.rejectedWith('Could not proxy');
157
- });
158
- it('should proxy error responses and codes', async function () {
159
- let j = mockProxy({
160
- sessionId: '123'
161
- });
162
-
163
- try {
164
- await j.proxy('/element/bad/text', 'GET');
165
- } catch (e) {
166
- (0, _errors.isErrorType)(e.getActualError(), _errors.errors.ElementNotVisibleError).should.be.true;
167
- }
168
- });
169
- });
170
- describe('command proxy', function () {
171
- it('should successfully proxy command', async function () {
172
- let j = mockProxy();
173
- let res = await j.command('/status', 'GET');
174
- res.should.eql({
175
- foo: 'bar'
176
- });
177
- });
178
- it('should pass along request errors', function () {
179
- let j = mockProxy({
180
- sessionId: '123'
181
- });
182
- j.command('/badurl', 'GET').should.eventually.be.rejectedWith('Could not proxy');
183
- });
184
- it('should throw when a command fails', async function () {
185
- let j = mockProxy({
186
- sessionId: '123'
187
- });
188
- let e = null;
189
-
190
- try {
191
- await j.command('/element/bad/text', 'GET');
192
- } catch (err) {
193
- e = err;
194
- }
195
-
196
- should.exist(e);
197
- e.message.should.contain('Invisible element');
198
- });
199
- it('should throw when a command fails with a 200 because the status is not 0', async function () {
200
- let j = mockProxy({
201
- sessionId: '123'
202
- });
203
- let e = null;
204
-
205
- try {
206
- await j.command('/element/200/text', 'GET');
207
- } catch (err) {
208
- e = err;
209
- }
210
-
211
- should.exist(e);
212
- e.error.should.eql('element not visible');
213
- });
214
- it('should throw when a command fails with a 100', async function () {
215
- let j = mockProxy({
216
- sessionId: '123'
217
- });
218
- let e = null;
219
-
220
- try {
221
- await j.command('/session/badchrome/nochrome', 'GET');
222
- } catch (err) {
223
- e = err;
224
- }
225
-
226
- should.exist(e);
227
- e.message.should.contain('chrome not reachable');
228
- });
229
- });
230
- describe('req/res proxy', function () {
231
- it('should successfully proxy via req and send to res', async function () {
232
- let j = mockProxy();
233
- let [req, res] = buildReqRes('/status', 'GET');
234
- await j.proxyReqRes(req, res);
235
- res.headers['content-type'].should.equal('application/json; charset=utf-8');
236
- res.sentCode.should.equal(200);
237
- res.sentBody.should.eql({
238
- value: {
239
- foo: 'bar'
240
- }
241
- });
242
- });
243
- it('should rewrite the inner session id so it doesnt change', async function () {
244
- let j = mockProxy({
245
- sessionId: '123'
246
- });
247
- let [req, res] = buildReqRes('/element/200/value', 'GET');
248
- await j.proxyReqRes(req, res);
249
- res.sentBody.should.eql({
250
- value: 'foobar',
251
- sessionId: '123'
252
- });
253
- });
254
- it('should rewrite the inner session id with sessionId in url', async function () {
255
- let j = mockProxy({
256
- sessionId: '123'
257
- });
258
- let [req, res] = buildReqRes('/session/456/element/200/value', 'POST');
259
- await j.proxyReqRes(req, res);
260
- res.sentBody.should.eql({
261
- value: 'foobar',
262
- sessionId: '456'
263
- });
264
- });
265
- it('should pass through urls that do not require session IDs', async function () {
266
- let j = mockProxy({
267
- sessionId: '123'
268
- });
269
- let [req, res] = buildReqRes('/status', 'GET');
270
- await j.proxyReqRes(req, res);
271
- res.sentBody.should.eql({
272
- value: {
273
- foo: 'bar'
274
- }
275
- });
276
- });
277
- it('should proxy strange responses', async function () {
278
- let j = mockProxy({
279
- sessionId: '123'
280
- });
281
- let [req, res] = buildReqRes('/nochrome', 'GET');
282
- await j.proxyReqRes(req, res);
283
- res.sentCode.should.equal(100);
284
- res.sentBody.should.eql({
285
- value: {
286
- message: 'chrome not reachable'
287
- }
288
- });
289
- });
290
- });
291
- });
292
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJidWlsZFJlcVJlcyIsInVybCIsIm1ldGhvZCIsImJvZHkiLCJyZXEiLCJvcmlnaW5hbFVybCIsInJlcyIsImhlYWRlcnMiLCJzZXQiLCJrIiwidiIsInN0YXR1cyIsImNvZGUiLCJzZW50Q29kZSIsInNlbmQiLCJKU09OIiwicGFyc2UiLCJlIiwic2VudEJvZHkiLCJkZXNjcmliZSIsInBvcnQiLCJtb2NrUHJveHkiLCJvcHRzIiwic2VydmVyIiwiVEVTVF9IT1NUIiwicHJveHkiLCJKV1Byb3h5IiwicmVxdWVzdCIsImFyZ3MiLCJiZWZvcmUiLCJnZXRUZXN0UG9ydCIsIml0IiwiaiIsInNob3VsZCIsImVxdWFsIiwiZGVzaXJlZENhcGFiaWxpdGllcyIsInN0YXR1c0NvZGUiLCJlcWwiLCJzZXNzaW9uSWQiLCJ2YWx1ZSIsImJyb3dzZXJOYW1lIiwiZ2V0VXJsRm9yUHJveHkiLCJyZXFCYXNlUGF0aCIsIm5ld1VybCIsImVyciIsImV4aXN0IiwibWVzc2FnZSIsImNvbnRhaW4iLCJmb28iLCJldmVudHVhbGx5IiwiYmUiLCJyZWplY3RlZFdpdGgiLCJpc0Vycm9yVHlwZSIsImdldEFjdHVhbEVycm9yIiwiZXJyb3JzIiwiRWxlbWVudE5vdFZpc2libGVFcnJvciIsInRydWUiLCJjb21tYW5kIiwiZXJyb3IiLCJwcm94eVJlcVJlcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9qc29ud3AtcHJveHkvcHJveHkuc3BlYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bW9jaGFcblxuaW1wb3J0IHtKV1Byb3h5fSBmcm9tICcuLi8uLi8uLi9saWInO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi9tb2NrLXJlcXVlc3QnO1xuaW1wb3J0IHtpc0Vycm9yVHlwZSwgZXJyb3JzfSBmcm9tICcuLi8uLi8uLi9saWIvcHJvdG9jb2wvZXJyb3JzJztcbmltcG9ydCB7Z2V0VGVzdFBvcnQsIFRFU1RfSE9TVH0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5cbmZ1bmN0aW9uIGJ1aWxkUmVxUmVzKHVybCwgbWV0aG9kLCBib2R5KSB7XG4gIGxldCByZXEgPSB7b3JpZ2luYWxVcmw6IHVybCwgbWV0aG9kLCBib2R5fTtcbiAgbGV0IHJlcyA9IHt9O1xuICByZXMuaGVhZGVycyA9IHt9O1xuICByZXMuc2V0ID0gKGssIHYpID0+IHtcbiAgICByZXNba10gPSB2O1xuICB9O1xuICByZXMuc3RhdHVzID0gKGNvZGUpID0+IHtcbiAgICByZXMuc2VudENvZGUgPSBjb2RlO1xuICAgIHJldHVybiByZXM7XG4gIH07XG4gIHJlcy5zZW5kID0gKGJvZHkpID0+IHtcbiAgICB0cnkge1xuICAgICAgYm9keSA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXMuc2VudEJvZHkgPSBib2R5O1xuICB9O1xuICByZXR1cm4gW3JlcSwgcmVzXTtcbn1cblxuZGVzY3JpYmUoJ3Byb3h5JywgZnVuY3Rpb24gKCkge1xuICBsZXQgcG9ydDtcblxuICBmdW5jdGlvbiBtb2NrUHJveHkob3B0cyA9IHt9KSB7XG4gICAgLy8gc2V0cyBkZWZhdWx0IHNlcnZlci9wb3J0XG4gICAgb3B0cyA9IHtzZXJ2ZXI6IFRFU1RfSE9TVCwgcG9ydCwgLi4ub3B0c307XG4gICAgbGV0IHByb3h5ID0gbmV3IEpXUHJveHkob3B0cyk7XG4gICAgcHJveHkucmVxdWVzdCA9IGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVxdWVzdCguLi5hcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiBwcm94eTtcbiAgfVxuXG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgcG9ydCA9IGF3YWl0IGdldFRlc3RQb3J0KCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgb3ZlcnJpZGUgZGVmYXVsdCBwYXJhbXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGogPSBtb2NrUHJveHkoe3NlcnZlcjogJzEyNy4wLjAuMicsIHBvcnR9KTtcbiAgICBqLnNlcnZlci5zaG91bGQuZXF1YWwoJzEyNy4wLjAuMicpO1xuICAgIGoucG9ydC5zaG91bGQuZXF1YWwocG9ydCk7XG4gIH0pO1xuICBpdCgnc2hvdWxkIHNhdmUgc2Vzc2lvbiBpZCBvbiBzZXNzaW9uIGNyZWF0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGxldCBqID0gbW9ja1Byb3h5KCk7XG4gICAgbGV0IFtyZXMsIGJvZHldID0gYXdhaXQgai5wcm94eSgnL3Nlc3Npb24nLCAnUE9TVCcsIHtcbiAgICAgIGRlc2lyZWRDYXBhYmlsaXRpZXM6IHt9LFxuICAgIH0pO1xuICAgIHJlcy5zdGF0dXNDb2RlLnNob3VsZC5lcXVhbCgyMDApO1xuICAgIGJvZHkuc2hvdWxkLmVxbCh7c3RhdHVzOiAwLCBzZXNzaW9uSWQ6ICcxMjMnLCB2YWx1ZToge2Jyb3dzZXJOYW1lOiAnYm9vJ319KTtcbiAgICBqLnNlc3Npb25JZC5zaG91bGQuZXF1YWwoJzEyMycpO1xuICB9KTtcbiAgZGVzY3JpYmUoJ2dldFVybEZvclByb3h5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgbW9kaWZ5IHNlc3Npb24gaWQsIGhvc3QsIGFuZCBwb3J0JywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIGouZ2V0VXJsRm9yUHJveHkoJ2h0dHA6Ly9ob3N0LmNvbToxMjM0L3Nlc3Npb24vNDU2L2VsZW1lbnQvMjAwL3ZhbHVlJykuc2hvdWxkLmVxbChcbiAgICAgICAgYGh0dHA6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fS9zZXNzaW9uLzEyMy9lbGVtZW50LzIwMC92YWx1ZWBcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwcmVwZW5kIHNjaGVtZSwgaG9zdCBhbmQgcG9ydCBpZiBub3QgcHJvdmlkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJ30pO1xuICAgICAgai5nZXRVcmxGb3JQcm94eSgnL3Nlc3Npb24vNDU2L2VsZW1lbnQvMjAwL3ZhbHVlJykuc2hvdWxkLmVxbChcbiAgICAgICAgYGh0dHA6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fS9zZXNzaW9uLzEyMy9lbGVtZW50LzIwMC92YWx1ZWBcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZXNwZWN0IG5vbnN0YW5kYXJkIGluY29taW5nIHJlcXVlc3QgYmFzZSBwYXRoJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMycsIHJlcUJhc2VQYXRoOiAnJ30pO1xuICAgICAgai5nZXRVcmxGb3JQcm94eSgnL3Nlc3Npb24vNDU2L2VsZW1lbnQvMjAwL3ZhbHVlJykuc2hvdWxkLmVxbChcbiAgICAgICAgYGh0dHA6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fS9zZXNzaW9uLzEyMy9lbGVtZW50LzIwMC92YWx1ZWBcbiAgICAgICk7XG5cbiAgICAgIGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMycsIHJlcUJhc2VQYXRoOiAnL215L2Jhc2UvcGF0aCd9KTtcbiAgICAgIGouZ2V0VXJsRm9yUHJveHkoJy9teS9iYXNlL3BhdGgvc2Vzc2lvbi80NTYvZWxlbWVudC8yMDAvdmFsdWUnKS5zaG91bGQuZXFsKFxuICAgICAgICBgaHR0cDovLyR7VEVTVF9IT1NUfToke3BvcnR9L3Nlc3Npb24vMTIzL2VsZW1lbnQvMjAwL3ZhbHVlYFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHdvcmsgd2l0aCB1cmxzIHdoaWNoIGRvIG5vdCBoYXZlIHNlc3Npb24gaWRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIGouZ2V0VXJsRm9yUHJveHkoJ2h0dHA6Ly9ob3N0LmNvbToxMjM0L3Nlc3Npb24nKS5zaG91bGQuZXFsKFxuICAgICAgICBgaHR0cDovLyR7VEVTVF9IT1NUfToke3BvcnR9L3Nlc3Npb25gXG4gICAgICApO1xuXG4gICAgICBsZXQgbmV3VXJsID0gai5nZXRVcmxGb3JQcm94eSgnL3Nlc3Npb24nKTtcbiAgICAgIG5ld1VybC5zaG91bGQuZXFsKGBodHRwOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0vc2Vzc2lvbmApO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3IgaWYgdXJsIHJlcXVpcmVzIGEgc2Vzc2lvbklkIGJ1dCBpdHMgbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KCk7XG4gICAgICBsZXQgZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGouZ2V0VXJsRm9yUHJveHkoJy9zZXNzaW9uLzQ1Ni9lbGVtZW50LzIwMC92YWx1ZScpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGUgPSBlcnI7XG4gICAgICB9XG4gICAgICBzaG91bGQuZXhpc3QoZSk7XG4gICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmNvbnRhaW4oJ3dpdGhvdXQgc2Vzc2lvbiBpZCcpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgbm90IHRocm93IGFuIGVycm9yIGlmIHVybCBkb2VzIG5vdCByZXF1aXJlIGEgc2Vzc2lvbiBpZCBhbmQgaXRzIG51bGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSgpO1xuICAgICAgbGV0IG5ld1VybCA9IGouZ2V0VXJsRm9yUHJveHkoJy9zdGF0dXMnKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KG5ld1VybCk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnc3RyYWlnaHQgcHJveHknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgcHJveHkgc3RyYWlnaHQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSgpO1xuICAgICAgbGV0IFtyZXMsIGJvZHldID0gYXdhaXQgai5wcm94eSgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgIHJlcy5zdGF0dXNDb2RlLnNob3VsZC5lcXVhbCgyMDApO1xuICAgICAgYm9keS5zaG91bGQuZXFsKHtzdGF0dXM6IDAsIHZhbHVlOiB7Zm9vOiAnYmFyJ319KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHBhc3MgYWxvbmcgcmVxdWVzdCBlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJ30pO1xuICAgICAgai5wcm94eSgnL2JhZHVybCcsICdHRVQnKS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoJ0NvdWxkIG5vdCBwcm94eScpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcHJveHkgZXJyb3IgcmVzcG9uc2VzIGFuZCBjb2RlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KHtzZXNzaW9uSWQ6ICcxMjMnfSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBqLnByb3h5KCcvZWxlbWVudC9iYWQvdGV4dCcsICdHRVQnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaXNFcnJvclR5cGUoZS5nZXRBY3R1YWxFcnJvcigpLCBlcnJvcnMuRWxlbWVudE5vdFZpc2libGVFcnJvcikuc2hvdWxkLmJlLnRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnY29tbWFuZCBwcm94eScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBwcm94eSBjb21tYW5kJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoKTtcbiAgICAgIGxldCByZXMgPSBhd2FpdCBqLmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgICByZXMuc2hvdWxkLmVxbCh7Zm9vOiAnYmFyJ30pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGFzcyBhbG9uZyByZXF1ZXN0IGVycm9ycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KHtzZXNzaW9uSWQ6ICcxMjMnfSk7XG4gICAgICBqLmNvbW1hbmQoJy9iYWR1cmwnLCAnR0VUJykuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKCdDb3VsZCBub3QgcHJveHknKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gYSBjb21tYW5kIGZhaWxzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIGxldCBlID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGouY29tbWFuZCgnL2VsZW1lbnQvYmFkL3RleHQnLCAnR0VUJyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgZSA9IGVycjtcbiAgICAgIH1cbiAgICAgIHNob3VsZC5leGlzdChlKTtcbiAgICAgIGUubWVzc2FnZS5zaG91bGQuY29udGFpbignSW52aXNpYmxlIGVsZW1lbnQnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gYSBjb21tYW5kIGZhaWxzIHdpdGggYSAyMDAgYmVjYXVzZSB0aGUgc3RhdHVzIGlzIG5vdCAwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIGxldCBlID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGouY29tbWFuZCgnL2VsZW1lbnQvMjAwL3RleHQnLCAnR0VUJyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgZSA9IGVycjtcbiAgICAgIH1cbiAgICAgIHNob3VsZC5leGlzdChlKTtcbiAgICAgIGUuZXJyb3Iuc2hvdWxkLmVxbCgnZWxlbWVudCBub3QgdmlzaWJsZScpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBhIGNvbW1hbmQgZmFpbHMgd2l0aCBhIDEwMCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KHtzZXNzaW9uSWQ6ICcxMjMnfSk7XG4gICAgICBsZXQgZSA9IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBqLmNvbW1hbmQoJy9zZXNzaW9uL2JhZGNocm9tZS9ub2Nocm9tZScsICdHRVQnKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlID0gZXJyO1xuICAgICAgfVxuICAgICAgc2hvdWxkLmV4aXN0KGUpO1xuICAgICAgZS5tZXNzYWdlLnNob3VsZC5jb250YWluKCdjaHJvbWUgbm90IHJlYWNoYWJsZScpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ3JlcS9yZXMgcHJveHknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgcHJveHkgdmlhIHJlcSBhbmQgc2VuZCB0byByZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSgpO1xuICAgICAgbGV0IFtyZXEsIHJlc10gPSBidWlsZFJlcVJlcygnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgIGF3YWl0IGoucHJveHlSZXFSZXMocmVxLCByZXMpO1xuICAgICAgcmVzLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddLnNob3VsZC5lcXVhbCgnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcpO1xuICAgICAgcmVzLnNlbnRDb2RlLnNob3VsZC5lcXVhbCgyMDApO1xuICAgICAgcmVzLnNlbnRCb2R5LnNob3VsZC5lcWwoe3ZhbHVlOiB7Zm9vOiAnYmFyJ319KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJld3JpdGUgdGhlIGlubmVyIHNlc3Npb24gaWQgc28gaXQgZG9lc250IGNoYW5nZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KHtzZXNzaW9uSWQ6ICcxMjMnfSk7XG4gICAgICBsZXQgW3JlcSwgcmVzXSA9IGJ1aWxkUmVxUmVzKCcvZWxlbWVudC8yMDAvdmFsdWUnLCAnR0VUJyk7XG4gICAgICBhd2FpdCBqLnByb3h5UmVxUmVzKHJlcSwgcmVzKTtcbiAgICAgIHJlcy5zZW50Qm9keS5zaG91bGQuZXFsKHt2YWx1ZTogJ2Zvb2JhcicsIHNlc3Npb25JZDogJzEyMyd9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJld3JpdGUgdGhlIGlubmVyIHNlc3Npb24gaWQgd2l0aCBzZXNzaW9uSWQgaW4gdXJsJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIGxldCBbcmVxLCByZXNdID0gYnVpbGRSZXFSZXMoJy9zZXNzaW9uLzQ1Ni9lbGVtZW50LzIwMC92YWx1ZScsICdQT1NUJyk7XG4gICAgICBhd2FpdCBqLnByb3h5UmVxUmVzKHJlcSwgcmVzKTtcbiAgICAgIHJlcy5zZW50Qm9keS5zaG91bGQuZXFsKHt2YWx1ZTogJ2Zvb2JhcicsIHNlc3Npb25JZDogJzQ1Nid9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHBhc3MgdGhyb3VnaCB1cmxzIHRoYXQgZG8gbm90IHJlcXVpcmUgc2Vzc2lvbiBJRHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJ30pO1xuICAgICAgbGV0IFtyZXEsIHJlc10gPSBidWlsZFJlcVJlcygnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgIGF3YWl0IGoucHJveHlSZXFSZXMocmVxLCByZXMpO1xuICAgICAgcmVzLnNlbnRCb2R5LnNob3VsZC5lcWwoe3ZhbHVlOiB7Zm9vOiAnYmFyJ319KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHByb3h5IHN0cmFuZ2UgcmVzcG9uc2VzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIGxldCBbcmVxLCByZXNdID0gYnVpbGRSZXFSZXMoJy9ub2Nocm9tZScsICdHRVQnKTtcbiAgICAgIGF3YWl0IGoucHJveHlSZXFSZXMocmVxLCByZXMpO1xuICAgICAgcmVzLnNlbnRDb2RlLnNob3VsZC5lcXVhbCgxMDApO1xuICAgICAgcmVzLnNlbnRCb2R5LnNob3VsZC5lcWwoe3ZhbHVlOiB7bWVzc2FnZTogJ2Nocm9tZSBub3QgcmVhY2hhYmxlJ319KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsU0FBU0EsV0FBVCxDQUFxQkMsR0FBckIsRUFBMEJDLE1BQTFCLEVBQWtDQyxJQUFsQyxFQUF3QztFQUN0QyxJQUFJQyxHQUFHLEdBQUc7SUFBQ0MsV0FBVyxFQUFFSixHQUFkO0lBQW1CQyxNQUFuQjtJQUEyQkM7RUFBM0IsQ0FBVjtFQUNBLElBQUlHLEdBQUcsR0FBRyxFQUFWO0VBQ0FBLEdBQUcsQ0FBQ0MsT0FBSixHQUFjLEVBQWQ7O0VBQ0FELEdBQUcsQ0FBQ0UsR0FBSixHQUFVLENBQUNDLENBQUQsRUFBSUMsQ0FBSixLQUFVO0lBQ2xCSixHQUFHLENBQUNHLENBQUQsQ0FBSCxHQUFTQyxDQUFUO0VBQ0QsQ0FGRDs7RUFHQUosR0FBRyxDQUFDSyxNQUFKLEdBQWNDLElBQUQsSUFBVTtJQUNyQk4sR0FBRyxDQUFDTyxRQUFKLEdBQWVELElBQWY7SUFDQSxPQUFPTixHQUFQO0VBQ0QsQ0FIRDs7RUFJQUEsR0FBRyxDQUFDUSxJQUFKLEdBQVlYLElBQUQsSUFBVTtJQUNuQixJQUFJO01BQ0ZBLElBQUksR0FBR1ksSUFBSSxDQUFDQyxLQUFMLENBQVdiLElBQVgsQ0FBUDtJQUNELENBRkQsQ0FFRSxPQUFPYyxDQUFQLEVBQVUsQ0FBRTs7SUFDZFgsR0FBRyxDQUFDWSxRQUFKLEdBQWVmLElBQWY7RUFDRCxDQUxEOztFQU1BLE9BQU8sQ0FBQ0MsR0FBRCxFQUFNRSxHQUFOLENBQVA7QUFDRDs7QUFFRGEsUUFBUSxDQUFDLE9BQUQsRUFBVSxZQUFZO0VBQzVCLElBQUlDLElBQUo7O0VBRUEsU0FBU0MsU0FBVCxDQUFtQkMsSUFBSSxHQUFHLEVBQTFCLEVBQThCO0lBRTVCQSxJQUFJLEdBQUc7TUFBQ0MsTUFBTSxFQUFFQyxrQkFBVDtNQUFvQkosSUFBcEI7TUFBMEIsR0FBR0U7SUFBN0IsQ0FBUDtJQUNBLElBQUlHLEtBQUssR0FBRyxJQUFJQyxZQUFKLENBQVlKLElBQVosQ0FBWjs7SUFDQUcsS0FBSyxDQUFDRSxPQUFOLEdBQWdCLGdCQUFnQixHQUFHQyxJQUFuQixFQUF5QjtNQUN2QyxPQUFPLE1BQU0sSUFBQUQsb0JBQUEsRUFBUSxHQUFHQyxJQUFYLENBQWI7SUFDRCxDQUZEOztJQUdBLE9BQU9ILEtBQVA7RUFDRDs7RUFFREksTUFBTSxDQUFDLGtCQUFrQjtJQUN2QlQsSUFBSSxHQUFHLE1BQU0sSUFBQVUsb0JBQUEsR0FBYjtFQUNELENBRkssQ0FBTjtFQUlBQyxFQUFFLENBQUMsZ0NBQUQsRUFBbUMsWUFBWTtJQUMvQyxJQUFJQyxDQUFDLEdBQUdYLFNBQVMsQ0FBQztNQUFDRSxNQUFNLEVBQUUsV0FBVDtNQUFzQkg7SUFBdEIsQ0FBRCxDQUFqQjtJQUNBWSxDQUFDLENBQUNULE1BQUYsQ0FBU1UsTUFBVCxDQUFnQkMsS0FBaEIsQ0FBc0IsV0FBdEI7SUFDQUYsQ0FBQyxDQUFDWixJQUFGLENBQU9hLE1BQVAsQ0FBY0MsS0FBZCxDQUFvQmQsSUFBcEI7RUFDRCxDQUpDLENBQUY7RUFLQVcsRUFBRSxDQUFDLDRDQUFELEVBQStDLGtCQUFrQjtJQUNqRSxJQUFJQyxDQUFDLEdBQUdYLFNBQVMsRUFBakI7SUFDQSxJQUFJLENBQUNmLEdBQUQsRUFBTUgsSUFBTixJQUFjLE1BQU02QixDQUFDLENBQUNQLEtBQUYsQ0FBUSxVQUFSLEVBQW9CLE1BQXBCLEVBQTRCO01BQ2xEVSxtQkFBbUIsRUFBRTtJQUQ2QixDQUE1QixDQUF4QjtJQUdBN0IsR0FBRyxDQUFDOEIsVUFBSixDQUFlSCxNQUFmLENBQXNCQyxLQUF0QixDQUE0QixHQUE1QjtJQUNBL0IsSUFBSSxDQUFDOEIsTUFBTCxDQUFZSSxHQUFaLENBQWdCO01BQUMxQixNQUFNLEVBQUUsQ0FBVDtNQUFZMkIsU0FBUyxFQUFFLEtBQXZCO01BQThCQyxLQUFLLEVBQUU7UUFBQ0MsV0FBVyxFQUFFO01BQWQ7SUFBckMsQ0FBaEI7SUFDQVIsQ0FBQyxDQUFDTSxTQUFGLENBQVlMLE1BQVosQ0FBbUJDLEtBQW5CLENBQXlCLEtBQXpCO0VBQ0QsQ0FSQyxDQUFGO0VBU0FmLFFBQVEsQ0FBQyxnQkFBRCxFQUFtQixZQUFZO0lBQ3JDWSxFQUFFLENBQUMsMENBQUQsRUFBNkMsWUFBWTtNQUN6RCxJQUFJQyxDQUFDLEdBQUdYLFNBQVMsQ0FBQztRQUFDaUIsU0FBUyxFQUFFO01BQVosQ0FBRCxDQUFqQjtNQUNBTixDQUFDLENBQUNTLGNBQUYsQ0FBaUIsb0RBQWpCLEVBQXVFUixNQUF2RSxDQUE4RUksR0FBOUUsQ0FDRyxVQUFTYixrQkFBVSxJQUFHSixJQUFLLGdDQUQ5QjtJQUdELENBTEMsQ0FBRjtJQU1BVyxFQUFFLENBQUMsc0RBQUQsRUFBeUQsWUFBWTtNQUNyRSxJQUFJQyxDQUFDLEdBQUdYLFNBQVMsQ0FBQztRQUFDaUIsU0FBUyxFQUFFO01BQVosQ0FBRCxDQUFqQjtNQUNBTixDQUFDLENBQUNTLGNBQUYsQ0FBaUIsZ0NBQWpCLEVBQW1EUixNQUFuRCxDQUEwREksR0FBMUQsQ0FDRyxVQUFTYixrQkFBVSxJQUFHSixJQUFLLGdDQUQ5QjtJQUdELENBTEMsQ0FBRjtJQU1BVyxFQUFFLENBQUMsdURBQUQsRUFBMEQsWUFBWTtNQUN0RSxJQUFJQyxDQUFDLEdBQUdYLFNBQVMsQ0FBQztRQUFDaUIsU0FBUyxFQUFFLEtBQVo7UUFBbUJJLFdBQVcsRUFBRTtNQUFoQyxDQUFELENBQWpCO01BQ0FWLENBQUMsQ0FBQ1MsY0FBRixDQUFpQixnQ0FBakIsRUFBbURSLE1BQW5ELENBQTBESSxHQUExRCxDQUNHLFVBQVNiLGtCQUFVLElBQUdKLElBQUssZ0NBRDlCO01BSUFZLENBQUMsR0FBR1gsU0FBUyxDQUFDO1FBQUNpQixTQUFTLEVBQUUsS0FBWjtRQUFtQkksV0FBVyxFQUFFO01BQWhDLENBQUQsQ0FBYjtNQUNBVixDQUFDLENBQUNTLGNBQUYsQ0FBaUIsNkNBQWpCLEVBQWdFUixNQUFoRSxDQUF1RUksR0FBdkUsQ0FDRyxVQUFTYixrQkFBVSxJQUFHSixJQUFLLGdDQUQ5QjtJQUdELENBVkMsQ0FBRjtJQVdBVyxFQUFFLENBQUMscURBQUQsRUFBd0QsWUFBWTtNQUNwRSxJQUFJQyxDQUFDLEdBQUdYLFNBQVMsQ0FBQztRQUFDaUIsU0FBUyxFQUFFO01BQVosQ0FBRCxDQUFqQjtNQUNBTixDQUFDLENBQUNTLGNBQUYsQ0FBaUIsOEJBQWpCLEVBQWlEUixNQUFqRCxDQUF3REksR0FBeEQsQ0FDRyxVQUFTYixrQkFBVSxJQUFHSixJQUFLLFVBRDlCO01BSUEsSUFBSXVCLE1BQU0sR0FBR1gsQ0FBQyxDQUFDUyxjQUFGLENBQWlCLFVBQWpCLENBQWI7TUFDQUUsTUFBTSxDQUFDVixNQUFQLENBQWNJLEdBQWQsQ0FBbUIsVUFBU2Isa0JBQVUsSUFBR0osSUFBSyxVQUE5QztJQUNELENBUkMsQ0FBRjtJQVNBVyxFQUFFLENBQUMsZ0VBQUQsRUFBbUUsWUFBWTtNQUMvRSxJQUFJQyxDQUFDLEdBQUdYLFNBQVMsRUFBakI7TUFDQSxJQUFJSixDQUFKOztNQUNBLElBQUk7UUFDRmUsQ0FBQyxDQUFDUyxjQUFGLENBQWlCLGdDQUFqQjtNQUNELENBRkQsQ0FFRSxPQUFPRyxHQUFQLEVBQVk7UUFDWjNCLENBQUMsR0FBRzJCLEdBQUo7TUFDRDs7TUFDRFgsTUFBTSxDQUFDWSxLQUFQLENBQWE1QixDQUFiO01BQ0FBLENBQUMsQ0FBQzZCLE9BQUYsQ0FBVWIsTUFBVixDQUFpQmMsT0FBakIsQ0FBeUIsb0JBQXpCO0lBQ0QsQ0FWQyxDQUFGO0lBV0FoQixFQUFFLENBQUMsNkVBQUQsRUFBZ0YsWUFBWTtNQUM1RixJQUFJQyxDQUFDLEdBQUdYLFNBQVMsRUFBakI7TUFDQSxJQUFJc0IsTUFBTSxHQUFHWCxDQUFDLENBQUNTLGNBQUYsQ0FBaUIsU0FBakIsQ0FBYjtNQUVBUixNQUFNLENBQUNZLEtBQVAsQ0FBYUYsTUFBYjtJQUNELENBTEMsQ0FBRjtFQU1ELENBbERPLENBQVI7RUFtREF4QixRQUFRLENBQUMsZ0JBQUQsRUFBbUIsWUFBWTtJQUNyQ1ksRUFBRSxDQUFDLG9DQUFELEVBQXVDLGtCQUFrQjtNQUN6RCxJQUFJQyxDQUFDLEdBQUdYLFNBQVMsRUFBakI7TUFDQSxJQUFJLENBQUNmLEdBQUQsRUFBTUgsSUFBTixJQUFjLE1BQU02QixDQUFDLENBQUNQLEtBQUYsQ0FBUSxTQUFSLEVBQW1CLEtBQW5CLENBQXhCO01BQ0FuQixHQUFHLENBQUM4QixVQUFKLENBQWVILE1BQWYsQ0FBc0JDLEtBQXRCLENBQTRCLEdBQTVCO01BQ0EvQixJQUFJLENBQUM4QixNQUFMLENBQVlJLEdBQVosQ0FBZ0I7UUFBQzFCLE1BQU0sRUFBRSxDQUFUO1FBQVk0QixLQUFLLEVBQUU7VUFBQ1MsR0FBRyxFQUFFO1FBQU47TUFBbkIsQ0FBaEI7SUFDRCxDQUxDLENBQUY7SUFNQWpCLEVBQUUsQ0FBQyxrQ0FBRCxFQUFxQyxZQUFZO01BQ2pELElBQUlDLENBQUMsR0FBR1gsU0FBUyxDQUFDO1FBQUNpQixTQUFTLEVBQUU7TUFBWixDQUFELENBQWpCO01BQ0FOLENBQUMsQ0FBQ1AsS0FBRixDQUFRLFNBQVIsRUFBbUIsS0FBbkIsRUFBMEJRLE1BQTFCLENBQWlDZ0IsVUFBakMsQ0FBNENDLEVBQTVDLENBQStDQyxZQUEvQyxDQUE0RCxpQkFBNUQ7SUFDRCxDQUhDLENBQUY7SUFJQXBCLEVBQUUsQ0FBQyx3Q0FBRCxFQUEyQyxrQkFBa0I7TUFDN0QsSUFBSUMsQ0FBQyxHQUFHWCxTQUFTLENBQUM7UUFBQ2lCLFNBQVMsRUFBRTtNQUFaLENBQUQsQ0FBakI7O01BQ0EsSUFBSTtRQUNGLE1BQU1OLENBQUMsQ0FBQ1AsS0FBRixDQUFRLG1CQUFSLEVBQTZCLEtBQTdCLENBQU47TUFDRCxDQUZELENBRUUsT0FBT1IsQ0FBUCxFQUFVO1FBQ1YsSUFBQW1DLG1CQUFBLEVBQVluQyxDQUFDLENBQUNvQyxjQUFGLEVBQVosRUFBZ0NDLGNBQUEsQ0FBT0Msc0JBQXZDLEVBQStEdEIsTUFBL0QsQ0FBc0VpQixFQUF0RSxDQUF5RU0sSUFBekU7TUFDRDtJQUNGLENBUEMsQ0FBRjtFQVFELENBbkJPLENBQVI7RUFvQkFyQyxRQUFRLENBQUMsZUFBRCxFQUFrQixZQUFZO0lBQ3BDWSxFQUFFLENBQUMsbUNBQUQsRUFBc0Msa0JBQWtCO01BQ3hELElBQUlDLENBQUMsR0FBR1gsU0FBUyxFQUFqQjtNQUNBLElBQUlmLEdBQUcsR0FBRyxNQUFNMEIsQ0FBQyxDQUFDeUIsT0FBRixDQUFVLFNBQVYsRUFBcUIsS0FBckIsQ0FBaEI7TUFDQW5ELEdBQUcsQ0FBQzJCLE1BQUosQ0FBV0ksR0FBWCxDQUFlO1FBQUNXLEdBQUcsRUFBRTtNQUFOLENBQWY7SUFDRCxDQUpDLENBQUY7SUFLQWpCLEVBQUUsQ0FBQyxrQ0FBRCxFQUFxQyxZQUFZO01BQ2pELElBQUlDLENBQUMsR0FBR1gsU0FBUyxDQUFDO1FBQUNpQixTQUFTLEVBQUU7TUFBWixDQUFELENBQWpCO01BQ0FOLENBQUMsQ0FBQ3lCLE9BQUYsQ0FBVSxTQUFWLEVBQXFCLEtBQXJCLEVBQTRCeEIsTUFBNUIsQ0FBbUNnQixVQUFuQyxDQUE4Q0MsRUFBOUMsQ0FBaURDLFlBQWpELENBQThELGlCQUE5RDtJQUNELENBSEMsQ0FBRjtJQUlBcEIsRUFBRSxDQUFDLG1DQUFELEVBQXNDLGtCQUFrQjtNQUN4RCxJQUFJQyxDQUFDLEdBQUdYLFNBQVMsQ0FBQztRQUFDaUIsU0FBUyxFQUFFO01BQVosQ0FBRCxDQUFqQjtNQUNBLElBQUlyQixDQUFDLEdBQUcsSUFBUjs7TUFDQSxJQUFJO1FBQ0YsTUFBTWUsQ0FBQyxDQUFDeUIsT0FBRixDQUFVLG1CQUFWLEVBQStCLEtBQS9CLENBQU47TUFDRCxDQUZELENBRUUsT0FBT2IsR0FBUCxFQUFZO1FBQ1ozQixDQUFDLEdBQUcyQixHQUFKO01BQ0Q7O01BQ0RYLE1BQU0sQ0FBQ1ksS0FBUCxDQUFhNUIsQ0FBYjtNQUNBQSxDQUFDLENBQUM2QixPQUFGLENBQVViLE1BQVYsQ0FBaUJjLE9BQWpCLENBQXlCLG1CQUF6QjtJQUNELENBVkMsQ0FBRjtJQVdBaEIsRUFBRSxDQUFDLDBFQUFELEVBQTZFLGtCQUFrQjtNQUMvRixJQUFJQyxDQUFDLEdBQUdYLFNBQVMsQ0FBQztRQUFDaUIsU0FBUyxFQUFFO01BQVosQ0FBRCxDQUFqQjtNQUNBLElBQUlyQixDQUFDLEdBQUcsSUFBUjs7TUFDQSxJQUFJO1FBQ0YsTUFBTWUsQ0FBQyxDQUFDeUIsT0FBRixDQUFVLG1CQUFWLEVBQStCLEtBQS9CLENBQU47TUFDRCxDQUZELENBRUUsT0FBT2IsR0FBUCxFQUFZO1FBQ1ozQixDQUFDLEdBQUcyQixHQUFKO01BQ0Q7O01BQ0RYLE1BQU0sQ0FBQ1ksS0FBUCxDQUFhNUIsQ0FBYjtNQUNBQSxDQUFDLENBQUN5QyxLQUFGLENBQVF6QixNQUFSLENBQWVJLEdBQWYsQ0FBbUIscUJBQW5CO0lBQ0QsQ0FWQyxDQUFGO0lBV0FOLEVBQUUsQ0FBQyw4Q0FBRCxFQUFpRCxrQkFBa0I7TUFDbkUsSUFBSUMsQ0FBQyxHQUFHWCxTQUFTLENBQUM7UUFBQ2lCLFNBQVMsRUFBRTtNQUFaLENBQUQsQ0FBakI7TUFDQSxJQUFJckIsQ0FBQyxHQUFHLElBQVI7O01BQ0EsSUFBSTtRQUNGLE1BQU1lLENBQUMsQ0FBQ3lCLE9BQUYsQ0FBVSw2QkFBVixFQUF5QyxLQUF6QyxDQUFOO01BQ0QsQ0FGRCxDQUVFLE9BQU9iLEdBQVAsRUFBWTtRQUNaM0IsQ0FBQyxHQUFHMkIsR0FBSjtNQUNEOztNQUNEWCxNQUFNLENBQUNZLEtBQVAsQ0FBYTVCLENBQWI7TUFDQUEsQ0FBQyxDQUFDNkIsT0FBRixDQUFVYixNQUFWLENBQWlCYyxPQUFqQixDQUF5QixzQkFBekI7SUFDRCxDQVZDLENBQUY7RUFXRCxDQTNDTyxDQUFSO0VBNENBNUIsUUFBUSxDQUFDLGVBQUQsRUFBa0IsWUFBWTtJQUNwQ1ksRUFBRSxDQUFDLG1EQUFELEVBQXNELGtCQUFrQjtNQUN4RSxJQUFJQyxDQUFDLEdBQUdYLFNBQVMsRUFBakI7TUFDQSxJQUFJLENBQUNqQixHQUFELEVBQU1FLEdBQU4sSUFBYU4sV0FBVyxDQUFDLFNBQUQsRUFBWSxLQUFaLENBQTVCO01BQ0EsTUFBTWdDLENBQUMsQ0FBQzJCLFdBQUYsQ0FBY3ZELEdBQWQsRUFBbUJFLEdBQW5CLENBQU47TUFDQUEsR0FBRyxDQUFDQyxPQUFKLENBQVksY0FBWixFQUE0QjBCLE1BQTVCLENBQW1DQyxLQUFuQyxDQUF5QyxpQ0FBekM7TUFDQTVCLEdBQUcsQ0FBQ08sUUFBSixDQUFhb0IsTUFBYixDQUFvQkMsS0FBcEIsQ0FBMEIsR0FBMUI7TUFDQTVCLEdBQUcsQ0FBQ1ksUUFBSixDQUFhZSxNQUFiLENBQW9CSSxHQUFwQixDQUF3QjtRQUFDRSxLQUFLLEVBQUU7VUFBQ1MsR0FBRyxFQUFFO1FBQU47TUFBUixDQUF4QjtJQUNELENBUEMsQ0FBRjtJQVFBakIsRUFBRSxDQUFDLHlEQUFELEVBQTRELGtCQUFrQjtNQUM5RSxJQUFJQyxDQUFDLEdBQUdYLFNBQVMsQ0FBQztRQUFDaUIsU0FBUyxFQUFFO01BQVosQ0FBRCxDQUFqQjtNQUNBLElBQUksQ0FBQ2xDLEdBQUQsRUFBTUUsR0FBTixJQUFhTixXQUFXLENBQUMsb0JBQUQsRUFBdUIsS0FBdkIsQ0FBNUI7TUFDQSxNQUFNZ0MsQ0FBQyxDQUFDMkIsV0FBRixDQUFjdkQsR0FBZCxFQUFtQkUsR0FBbkIsQ0FBTjtNQUNBQSxHQUFHLENBQUNZLFFBQUosQ0FBYWUsTUFBYixDQUFvQkksR0FBcEIsQ0FBd0I7UUFBQ0UsS0FBSyxFQUFFLFFBQVI7UUFBa0JELFNBQVMsRUFBRTtNQUE3QixDQUF4QjtJQUNELENBTEMsQ0FBRjtJQU1BUCxFQUFFLENBQUMsMkRBQUQsRUFBOEQsa0JBQWtCO01BQ2hGLElBQUlDLENBQUMsR0FBR1gsU0FBUyxDQUFDO1FBQUNpQixTQUFTLEVBQUU7TUFBWixDQUFELENBQWpCO01BQ0EsSUFBSSxDQUFDbEMsR0FBRCxFQUFNRSxHQUFOLElBQWFOLFdBQVcsQ0FBQyxnQ0FBRCxFQUFtQyxNQUFuQyxDQUE1QjtNQUNBLE1BQU1nQyxDQUFDLENBQUMyQixXQUFGLENBQWN2RCxHQUFkLEVBQW1CRSxHQUFuQixDQUFOO01BQ0FBLEdBQUcsQ0FBQ1ksUUFBSixDQUFhZSxNQUFiLENBQW9CSSxHQUFwQixDQUF3QjtRQUFDRSxLQUFLLEVBQUUsUUFBUjtRQUFrQkQsU0FBUyxFQUFFO01BQTdCLENBQXhCO0lBQ0QsQ0FMQyxDQUFGO0lBTUFQLEVBQUUsQ0FBQywwREFBRCxFQUE2RCxrQkFBa0I7TUFDL0UsSUFBSUMsQ0FBQyxHQUFHWCxTQUFTLENBQUM7UUFBQ2lCLFNBQVMsRUFBRTtNQUFaLENBQUQsQ0FBakI7TUFDQSxJQUFJLENBQUNsQyxHQUFELEVBQU1FLEdBQU4sSUFBYU4sV0FBVyxDQUFDLFNBQUQsRUFBWSxLQUFaLENBQTVCO01BQ0EsTUFBTWdDLENBQUMsQ0FBQzJCLFdBQUYsQ0FBY3ZELEdBQWQsRUFBbUJFLEdBQW5CLENBQU47TUFDQUEsR0FBRyxDQUFDWSxRQUFKLENBQWFlLE1BQWIsQ0FBb0JJLEdBQXBCLENBQXdCO1FBQUNFLEtBQUssRUFBRTtVQUFDUyxHQUFHLEVBQUU7UUFBTjtNQUFSLENBQXhCO0lBQ0QsQ0FMQyxDQUFGO0lBTUFqQixFQUFFLENBQUMsZ0NBQUQsRUFBbUMsa0JBQWtCO01BQ3JELElBQUlDLENBQUMsR0FBR1gsU0FBUyxDQUFDO1FBQUNpQixTQUFTLEVBQUU7TUFBWixDQUFELENBQWpCO01BQ0EsSUFBSSxDQUFDbEMsR0FBRCxFQUFNRSxHQUFOLElBQWFOLFdBQVcsQ0FBQyxXQUFELEVBQWMsS0FBZCxDQUE1QjtNQUNBLE1BQU1nQyxDQUFDLENBQUMyQixXQUFGLENBQWN2RCxHQUFkLEVBQW1CRSxHQUFuQixDQUFOO01BQ0FBLEdBQUcsQ0FBQ08sUUFBSixDQUFhb0IsTUFBYixDQUFvQkMsS0FBcEIsQ0FBMEIsR0FBMUI7TUFDQTVCLEdBQUcsQ0FBQ1ksUUFBSixDQUFhZSxNQUFiLENBQW9CSSxHQUFwQixDQUF3QjtRQUFDRSxLQUFLLEVBQUU7VUFBQ08sT0FBTyxFQUFFO1FBQVY7TUFBUixDQUF4QjtJQUNELENBTkMsQ0FBRjtFQU9ELENBbENPLENBQVI7QUFtQ0QsQ0FyTE8sQ0FBUiJ9