israeli-bank-scrapers 4.2.2 → 4.4.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/README.md +14 -0
- package/lib/assertNever.js +1 -2
- package/lib/constants.js +1 -1
- package/lib/definitions.d.ts +5 -0
- package/lib/definitions.js +7 -4
- package/lib/helpers/dates.js +1 -7
- package/lib/helpers/debug.js +1 -4
- package/lib/helpers/elements-interactions.js +5 -27
- package/lib/helpers/fetch.js +1 -21
- package/lib/helpers/navigation.js +1 -9
- package/lib/helpers/storage.js +1 -3
- package/lib/helpers/transactions.js +1 -17
- package/lib/helpers/waiting.js +4 -12
- package/lib/index.js +2 -12
- package/lib/scrapers/amex.js +1 -7
- package/lib/scrapers/amex.test.js +1 -14
- package/lib/scrapers/base-beinleumi-group.js +4 -67
- package/lib/scrapers/base-isracard-amex.js +1 -75
- package/lib/scrapers/base-scraper-with-browser.js +14 -82
- package/lib/scrapers/base-scraper-with-browser.test.js +13 -23
- package/lib/scrapers/base-scraper.js +13 -36
- package/lib/scrapers/behatsdaa.js +5 -26
- package/lib/scrapers/behatsdaa.test.js +1 -10
- package/lib/scrapers/beinleumi.js +1 -11
- package/lib/scrapers/beinleumi.test.js +1 -14
- package/lib/scrapers/beyahad-bishvilha.js +1 -35
- package/lib/scrapers/beyahad-bishvilha.test.js +1 -14
- package/lib/scrapers/discount.js +1 -31
- package/lib/scrapers/discount.test.js +1 -14
- package/lib/scrapers/errors.js +1 -5
- package/lib/scrapers/factory.js +4 -39
- package/lib/scrapers/factory.test.js +2 -4
- package/lib/scrapers/hapoalim.js +4 -50
- package/lib/scrapers/hapoalim.test.js +1 -14
- package/lib/scrapers/interface.js +1 -1
- package/lib/scrapers/isracard.js +1 -7
- package/lib/scrapers/isracard.test.js +1 -14
- package/lib/scrapers/leumi.js +12 -44
- package/lib/scrapers/leumi.test.js +1 -14
- package/lib/scrapers/massad.js +1 -11
- package/lib/scrapers/max.d.ts +20 -0
- package/lib/scrapers/max.js +76 -111
- package/lib/scrapers/max.test.js +21 -16
- package/lib/scrapers/mercantile.d.ts +20 -0
- package/lib/scrapers/mercantile.js +21 -0
- package/lib/scrapers/mercantile.test.d.ts +1 -0
- package/lib/scrapers/mercantile.test.js +48 -0
- package/lib/scrapers/mizrahi.js +14 -40
- package/lib/scrapers/mizrahi.test.js +1 -15
- package/lib/scrapers/one-zero-queries.js +1 -1
- package/lib/scrapers/one-zero.js +2 -54
- package/lib/scrapers/one-zero.test.js +1 -14
- package/lib/scrapers/otsar-hahayal.js +9 -47
- package/lib/scrapers/otsar-hahayal.test.js +1 -14
- package/lib/scrapers/union-bank.js +2 -60
- package/lib/scrapers/union-bank.test.js +1 -14
- package/lib/scrapers/visa-cal.js +17 -56
- package/lib/scrapers/visa-cal.test.js +3 -16
- package/lib/scrapers/yahav.js +25 -52
- package/lib/scrapers/yahav.test.js +1 -14
- package/lib/transactions.js +1 -4
- package/package.json +2 -7
|
@@ -1,72 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
require("core-js/modules/es.array.iterator");
|
|
4
|
-
|
|
5
4
|
require("core-js/modules/es.promise");
|
|
6
|
-
|
|
7
5
|
Object.defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
10
8
|
exports.BaseScraperWithBrowser = exports.LoginResults = void 0;
|
|
11
|
-
|
|
12
9
|
var _puppeteer = _interopRequireDefault(require("puppeteer"));
|
|
13
|
-
|
|
14
10
|
var _baseScraper = require("./base-scraper");
|
|
15
|
-
|
|
16
11
|
var _navigation = require("../helpers/navigation");
|
|
17
|
-
|
|
18
12
|
var _elementsInteractions = require("../helpers/elements-interactions");
|
|
19
|
-
|
|
20
13
|
var _debug = require("../helpers/debug");
|
|
21
|
-
|
|
22
14
|
var _errors = require("./errors");
|
|
23
|
-
|
|
24
15
|
var _definitions = require("../definitions");
|
|
25
|
-
|
|
26
16
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
27
|
-
|
|
28
17
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
29
|
-
|
|
30
18
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
31
|
-
|
|
32
19
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
33
|
-
|
|
34
20
|
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
35
|
-
|
|
36
21
|
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
37
|
-
|
|
38
22
|
const VIEWPORT_WIDTH = 1024;
|
|
39
23
|
const VIEWPORT_HEIGHT = 768;
|
|
40
24
|
const OK_STATUS = 200;
|
|
41
25
|
const debug = (0, _debug.getDebug)('base-scraper-with-browser');
|
|
42
26
|
var LoginBaseResults;
|
|
43
|
-
|
|
44
27
|
(function (LoginBaseResults) {
|
|
45
28
|
LoginBaseResults["Success"] = "SUCCESS";
|
|
46
29
|
LoginBaseResults["UnknownError"] = "UNKNOWN_ERROR";
|
|
47
30
|
})(LoginBaseResults || (LoginBaseResults = {}));
|
|
48
|
-
|
|
49
31
|
const {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
} = _errors.ScraperErrorTypes,
|
|
54
|
-
|
|
55
|
-
|
|
32
|
+
Timeout,
|
|
33
|
+
Generic,
|
|
34
|
+
General
|
|
35
|
+
} = _errors.ScraperErrorTypes,
|
|
36
|
+
rest = _objectWithoutProperties(_errors.ScraperErrorTypes, ["Timeout", "Generic", "General"]);
|
|
56
37
|
const LoginResults = _objectSpread({}, rest, {}, LoginBaseResults);
|
|
57
|
-
|
|
58
38
|
exports.LoginResults = LoginResults;
|
|
59
|
-
|
|
60
39
|
async function getKeyByValue(object, value, page) {
|
|
61
40
|
const keys = Object.keys(object);
|
|
62
|
-
|
|
63
41
|
for (const key of keys) {
|
|
64
42
|
// @ts-ignore
|
|
65
43
|
const conditions = object[key];
|
|
66
|
-
|
|
67
44
|
for (const condition of conditions) {
|
|
68
45
|
let result = false;
|
|
69
|
-
|
|
70
46
|
if (condition instanceof RegExp) {
|
|
71
47
|
result = condition.test(value);
|
|
72
48
|
} else if (typeof condition === 'function') {
|
|
@@ -77,52 +53,45 @@ async function getKeyByValue(object, value, page) {
|
|
|
77
53
|
} else {
|
|
78
54
|
result = value.toLowerCase() === condition.toLowerCase();
|
|
79
55
|
}
|
|
80
|
-
|
|
81
56
|
if (result) {
|
|
82
57
|
// @ts-ignore
|
|
83
58
|
return Promise.resolve(key);
|
|
84
59
|
}
|
|
85
60
|
}
|
|
86
61
|
}
|
|
87
|
-
|
|
88
62
|
return Promise.resolve(LoginResults.UnknownError);
|
|
89
63
|
}
|
|
90
|
-
|
|
91
64
|
function createGeneralError() {
|
|
92
65
|
return {
|
|
93
66
|
success: false,
|
|
94
67
|
errorType: _errors.ScraperErrorTypes.General
|
|
95
68
|
};
|
|
96
69
|
}
|
|
97
|
-
|
|
98
70
|
class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
|
|
99
71
|
constructor(...args) {
|
|
100
72
|
super(...args);
|
|
101
|
-
|
|
102
73
|
_defineProperty(this, "browser", void 0);
|
|
103
|
-
|
|
104
74
|
_defineProperty(this, "page", void 0);
|
|
105
|
-
}
|
|
106
|
-
|
|
75
|
+
} // NOTICE - it is discouraged to use bang (!) in general. It is used here because
|
|
76
|
+
// all the classes that inherit from this base assume is it mandatory.
|
|
77
|
+
// NOTICE - it is discouraged to use bang (!) in general. It is used here because
|
|
78
|
+
// all the classes that inherit from this base assume is it mandatory.
|
|
107
79
|
getViewPort() {
|
|
108
80
|
return {
|
|
109
81
|
width: VIEWPORT_WIDTH,
|
|
110
82
|
height: VIEWPORT_HEIGHT
|
|
111
83
|
};
|
|
112
84
|
}
|
|
113
|
-
|
|
114
85
|
async initialize() {
|
|
115
86
|
await super.initialize();
|
|
116
87
|
debug('initialize scraper');
|
|
117
88
|
this.emitProgress(_definitions.ScraperProgressTypes.Initializing);
|
|
118
89
|
let env;
|
|
119
|
-
|
|
120
90
|
if (this.options.verbose) {
|
|
121
91
|
env = _objectSpread({
|
|
122
92
|
DEBUG: '*'
|
|
123
93
|
}, process.env);
|
|
124
94
|
}
|
|
125
|
-
|
|
126
95
|
if (typeof this.options.browser !== 'undefined' && this.options.browser !== null) {
|
|
127
96
|
debug('use custom browser instance provided in options');
|
|
128
97
|
this.browser = this.options.browser;
|
|
@@ -142,19 +111,15 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
|
|
|
142
111
|
timeout
|
|
143
112
|
});
|
|
144
113
|
}
|
|
145
|
-
|
|
146
114
|
if (this.options.prepareBrowser) {
|
|
147
115
|
debug('execute \'prepareBrowser\' interceptor provided in options');
|
|
148
116
|
await this.options.prepareBrowser(this.browser);
|
|
149
117
|
}
|
|
150
|
-
|
|
151
118
|
if (!this.browser) {
|
|
152
119
|
debug('failed to initiate a browser, exit');
|
|
153
120
|
return;
|
|
154
121
|
}
|
|
155
|
-
|
|
156
122
|
const pages = await this.browser.pages();
|
|
157
|
-
|
|
158
123
|
if (pages.length) {
|
|
159
124
|
debug('browser has already pages open, use the first one');
|
|
160
125
|
[this.page] = pages;
|
|
@@ -162,16 +127,13 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
|
|
|
162
127
|
debug('create a new browser page');
|
|
163
128
|
this.page = await this.browser.newPage();
|
|
164
129
|
}
|
|
165
|
-
|
|
166
130
|
if (this.options.defaultTimeout) {
|
|
167
131
|
this.page.setDefaultTimeout(this.options.defaultTimeout);
|
|
168
132
|
}
|
|
169
|
-
|
|
170
133
|
if (this.options.preparePage) {
|
|
171
134
|
debug('execute \'preparePage\' interceptor provided in options');
|
|
172
135
|
await this.options.preparePage(this.page);
|
|
173
136
|
}
|
|
174
|
-
|
|
175
137
|
const viewport = this.getViewPort();
|
|
176
138
|
debug(`set viewport to width ${viewport.width}, height ${viewport.height}`);
|
|
177
139
|
await this.page.setViewport({
|
|
@@ -180,67 +142,54 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
|
|
|
180
142
|
});
|
|
181
143
|
this.page.on('requestfailed', request => {
|
|
182
144
|
var _request$failure;
|
|
183
|
-
|
|
184
145
|
debug('Request failed: %s %s', (_request$failure = request.failure()) === null || _request$failure === void 0 ? void 0 : _request$failure.errorText, request.url());
|
|
185
146
|
});
|
|
186
147
|
}
|
|
187
|
-
|
|
188
148
|
async navigateTo(url, page, timeout, waitUntil = 'load') {
|
|
189
149
|
const pageToUse = page || this.page;
|
|
190
|
-
|
|
191
150
|
if (!pageToUse) {
|
|
192
151
|
return;
|
|
193
152
|
}
|
|
194
|
-
|
|
195
153
|
const options = _objectSpread({}, timeout === null ? null : {
|
|
196
154
|
timeout
|
|
197
155
|
}, {
|
|
198
156
|
waitUntil
|
|
199
157
|
});
|
|
158
|
+
const response = await pageToUse.goto(url, options);
|
|
200
159
|
|
|
201
|
-
|
|
202
|
-
|
|
160
|
+
// note: response will be null when navigating to same url while changing the hash part. the condition below will always accept null as valid result.
|
|
203
161
|
if (response !== null && (response === undefined || response.status() !== OK_STATUS)) {
|
|
204
162
|
throw new Error(`Error while trying to navigate to url ${url}`);
|
|
205
163
|
}
|
|
206
|
-
}
|
|
207
|
-
|
|
164
|
+
}
|
|
208
165
|
|
|
166
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
209
167
|
getLoginOptions(_credentials) {
|
|
210
168
|
throw new Error(`getLoginOptions() is not created in ${this.options.companyId}`);
|
|
211
169
|
}
|
|
212
|
-
|
|
213
170
|
async fillInputs(pageOrFrame, fields) {
|
|
214
171
|
const modified = [...fields];
|
|
215
172
|
const input = modified.shift();
|
|
216
|
-
|
|
217
173
|
if (!input) {
|
|
218
174
|
return;
|
|
219
175
|
}
|
|
220
|
-
|
|
221
176
|
await (0, _elementsInteractions.fillInput)(pageOrFrame, input.selector, input.value);
|
|
222
|
-
|
|
223
177
|
if (modified.length) {
|
|
224
178
|
await this.fillInputs(pageOrFrame, modified);
|
|
225
179
|
}
|
|
226
180
|
}
|
|
227
|
-
|
|
228
181
|
async login(credentials) {
|
|
229
182
|
if (!credentials || !this.page) {
|
|
230
183
|
return createGeneralError();
|
|
231
184
|
}
|
|
232
|
-
|
|
233
185
|
debug('execute login process');
|
|
234
186
|
const loginOptions = this.getLoginOptions(credentials);
|
|
235
|
-
|
|
236
187
|
if (loginOptions.userAgent) {
|
|
237
188
|
debug('set custom user agent provided in options');
|
|
238
189
|
await this.page.setUserAgent(loginOptions.userAgent);
|
|
239
190
|
}
|
|
240
|
-
|
|
241
191
|
debug('navigate to login url');
|
|
242
192
|
await this.navigateTo(loginOptions.loginUrl, undefined, undefined, loginOptions.waitUntil);
|
|
243
|
-
|
|
244
193
|
if (loginOptions.checkReadiness) {
|
|
245
194
|
debug('execute \'checkReadiness\' interceptor provided in login options');
|
|
246
195
|
await loginOptions.checkReadiness();
|
|
@@ -248,26 +197,20 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
|
|
|
248
197
|
debug('wait until submit button is available');
|
|
249
198
|
await (0, _elementsInteractions.waitUntilElementFound)(this.page, loginOptions.submitButtonSelector);
|
|
250
199
|
}
|
|
251
|
-
|
|
252
200
|
let loginFrameOrPage = this.page;
|
|
253
|
-
|
|
254
201
|
if (loginOptions.preAction) {
|
|
255
202
|
debug('execute \'preAction\' interceptor provided in login options');
|
|
256
203
|
loginFrameOrPage = (await loginOptions.preAction()) || this.page;
|
|
257
204
|
}
|
|
258
|
-
|
|
259
205
|
debug('fill login components input with relevant values');
|
|
260
206
|
await this.fillInputs(loginFrameOrPage, loginOptions.fields);
|
|
261
207
|
debug('click on login submit button');
|
|
262
|
-
|
|
263
208
|
if (typeof loginOptions.submitButtonSelector === 'string') {
|
|
264
209
|
await (0, _elementsInteractions.clickButton)(loginFrameOrPage, loginOptions.submitButtonSelector);
|
|
265
210
|
} else {
|
|
266
211
|
await loginOptions.submitButtonSelector();
|
|
267
212
|
}
|
|
268
|
-
|
|
269
213
|
this.emitProgress(_definitions.ScraperProgressTypes.LoggingIn);
|
|
270
|
-
|
|
271
214
|
if (loginOptions.postAction) {
|
|
272
215
|
debug('execute \'postAction\' interceptor provided in login options');
|
|
273
216
|
await loginOptions.postAction();
|
|
@@ -275,18 +218,15 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
|
|
|
275
218
|
debug('wait for page navigation');
|
|
276
219
|
await (0, _navigation.waitForNavigation)(this.page);
|
|
277
220
|
}
|
|
278
|
-
|
|
279
221
|
debug('check login result');
|
|
280
222
|
const current = await (0, _navigation.getCurrentUrl)(this.page, true);
|
|
281
223
|
const loginResult = await getKeyByValue(loginOptions.possibleResults, current, this.page);
|
|
282
224
|
debug(`handle login results ${loginResult}`);
|
|
283
225
|
return this.handleLoginResult(loginResult);
|
|
284
226
|
}
|
|
285
|
-
|
|
286
227
|
async terminate(_success) {
|
|
287
228
|
debug(`terminating browser with success = ${_success}`);
|
|
288
229
|
this.emitProgress(_definitions.ScraperProgressTypes.Terminating);
|
|
289
|
-
|
|
290
230
|
if (!_success && !!this.options.storeFailureScreenShotPath) {
|
|
291
231
|
debug(`create a snapshot before terminated in ${this.options.storeFailureScreenShotPath}`);
|
|
292
232
|
await this.page.screenshot({
|
|
@@ -294,14 +234,11 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
|
|
|
294
234
|
fullPage: true
|
|
295
235
|
});
|
|
296
236
|
}
|
|
297
|
-
|
|
298
237
|
if (!this.browser) {
|
|
299
238
|
return;
|
|
300
239
|
}
|
|
301
|
-
|
|
302
240
|
await this.browser.close();
|
|
303
241
|
}
|
|
304
|
-
|
|
305
242
|
handleLoginResult(loginResult) {
|
|
306
243
|
switch (loginResult) {
|
|
307
244
|
case LoginResults.Success:
|
|
@@ -309,7 +246,6 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
|
|
|
309
246
|
return {
|
|
310
247
|
success: true
|
|
311
248
|
};
|
|
312
|
-
|
|
313
249
|
case LoginResults.InvalidPassword:
|
|
314
250
|
case LoginResults.UnknownError:
|
|
315
251
|
this.emitProgress(_definitions.ScraperProgressTypes.LoginFailed);
|
|
@@ -318,20 +254,16 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
|
|
|
318
254
|
errorType: loginResult === LoginResults.InvalidPassword ? _errors.ScraperErrorTypes.InvalidPassword : _errors.ScraperErrorTypes.General,
|
|
319
255
|
errorMessage: `Login failed with ${loginResult} error`
|
|
320
256
|
};
|
|
321
|
-
|
|
322
257
|
case LoginResults.ChangePassword:
|
|
323
258
|
this.emitProgress(_definitions.ScraperProgressTypes.ChangePassword);
|
|
324
259
|
return {
|
|
325
260
|
success: false,
|
|
326
261
|
errorType: _errors.ScraperErrorTypes.ChangePassword
|
|
327
262
|
};
|
|
328
|
-
|
|
329
263
|
default:
|
|
330
264
|
throw new Error(`unexpected login result "${loginResult}"`);
|
|
331
265
|
}
|
|
332
266
|
}
|
|
333
|
-
|
|
334
267
|
}
|
|
335
|
-
|
|
336
268
|
exports.BaseScraperWithBrowser = BaseScraperWithBrowser;
|
|
337
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyLnRzIl0sIm5hbWVzIjpbIlZJRVdQT1JUX1dJRFRIIiwiVklFV1BPUlRfSEVJR0hUIiwiT0tfU1RBVFVTIiwiZGVidWciLCJMb2dpbkJhc2VSZXN1bHRzIiwiVGltZW91dCIsIkdlbmVyaWMiLCJHZW5lcmFsIiwiU2NyYXBlckVycm9yVHlwZXMiLCJyZXN0IiwiTG9naW5SZXN1bHRzIiwiZ2V0S2V5QnlWYWx1ZSIsIm9iamVjdCIsInZhbHVlIiwicGFnZSIsImtleXMiLCJPYmplY3QiLCJrZXkiLCJjb25kaXRpb25zIiwiY29uZGl0aW9uIiwicmVzdWx0IiwiUmVnRXhwIiwidGVzdCIsInRvTG93ZXJDYXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJVbmtub3duRXJyb3IiLCJjcmVhdGVHZW5lcmFsRXJyb3IiLCJzdWNjZXNzIiwiZXJyb3JUeXBlIiwiQmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsIkJhc2VTY3JhcGVyIiwiZ2V0Vmlld1BvcnQiLCJ3aWR0aCIsImhlaWdodCIsImluaXRpYWxpemUiLCJlbWl0UHJvZ3Jlc3MiLCJTY3JhcGVyUHJvZ3Jlc3NUeXBlcyIsIkluaXRpYWxpemluZyIsImVudiIsIm9wdGlvbnMiLCJ2ZXJib3NlIiwiREVCVUciLCJwcm9jZXNzIiwiYnJvd3NlciIsImV4ZWN1dGFibGVQYXRoIiwidW5kZWZpbmVkIiwiYXJncyIsInRpbWVvdXQiLCJoZWFkbGVzcyIsInNob3dCcm93c2VyIiwicHVwcGV0ZWVyIiwibGF1bmNoIiwicHJlcGFyZUJyb3dzZXIiLCJwYWdlcyIsImxlbmd0aCIsIm5ld1BhZ2UiLCJkZWZhdWx0VGltZW91dCIsInNldERlZmF1bHRUaW1lb3V0IiwicHJlcGFyZVBhZ2UiLCJ2aWV3cG9ydCIsInNldFZpZXdwb3J0Iiwib24iLCJyZXF1ZXN0IiwiZmFpbHVyZSIsImVycm9yVGV4dCIsInVybCIsIm5hdmlnYXRlVG8iLCJ3YWl0VW50aWwiLCJwYWdlVG9Vc2UiLCJyZXNwb25zZSIsImdvdG8iLCJzdGF0dXMiLCJFcnJvciIsImdldExvZ2luT3B0aW9ucyIsIl9jcmVkZW50aWFscyIsImNvbXBhbnlJZCIsImZpbGxJbnB1dHMiLCJwYWdlT3JGcmFtZSIsImZpZWxkcyIsIm1vZGlmaWVkIiwiaW5wdXQiLCJzaGlmdCIsInNlbGVjdG9yIiwibG9naW4iLCJjcmVkZW50aWFscyIsImxvZ2luT3B0aW9ucyIsInVzZXJBZ2VudCIsInNldFVzZXJBZ2VudCIsImxvZ2luVXJsIiwiY2hlY2tSZWFkaW5lc3MiLCJzdWJtaXRCdXR0b25TZWxlY3RvciIsImxvZ2luRnJhbWVPclBhZ2UiLCJwcmVBY3Rpb24iLCJMb2dnaW5nSW4iLCJwb3N0QWN0aW9uIiwiY3VycmVudCIsImxvZ2luUmVzdWx0IiwicG9zc2libGVSZXN1bHRzIiwiaGFuZGxlTG9naW5SZXN1bHQiLCJ0ZXJtaW5hdGUiLCJfc3VjY2VzcyIsIlRlcm1pbmF0aW5nIiwic3RvcmVGYWlsdXJlU2NyZWVuU2hvdFBhdGgiLCJzY3JlZW5zaG90IiwicGF0aCIsImZ1bGxQYWdlIiwiY2xvc2UiLCJTdWNjZXNzIiwiTG9naW5TdWNjZXNzIiwiSW52YWxpZFBhc3N3b3JkIiwiTG9naW5GYWlsZWQiLCJlcnJvck1lc3NhZ2UiLCJDaGFuZ2VQYXNzd29yZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFJQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSxNQUFNQSxjQUFjLEdBQUcsSUFBdkI7QUFDQSxNQUFNQyxlQUFlLEdBQUcsR0FBeEI7QUFDQSxNQUFNQyxTQUFTLEdBQUcsR0FBbEI7QUFFQSxNQUFNQyxLQUFLLEdBQUcscUJBQVMsMkJBQVQsQ0FBZDtJQUVLQyxnQjs7V0FBQUEsZ0I7QUFBQUEsRUFBQUEsZ0I7QUFBQUEsRUFBQUEsZ0I7R0FBQUEsZ0IsS0FBQUEsZ0I7O0FBS0wsTUFBTTtBQUNKQyxFQUFBQSxPQURJO0FBQ0tDLEVBQUFBLE9BREw7QUFDY0MsRUFBQUE7QUFEZCxJQUVGQyx5QkFGSjtBQUFBLE1BQ2dDQyxJQURoQyw0QkFFSUQseUJBRko7O0FBR08sTUFBTUUsWUFBWSxxQkFDcEJELElBRG9CLE1BRXBCTCxnQkFGb0IsQ0FBbEI7Ozs7QUEwQlAsZUFBZU8sYUFBZixDQUE2QkMsTUFBN0IsRUFBMkRDLEtBQTNELEVBQTBFQyxJQUExRSxFQUE2RztBQUMzRyxRQUFNQyxJQUFJLEdBQUdDLE1BQU0sQ0FBQ0QsSUFBUCxDQUFZSCxNQUFaLENBQWI7O0FBQ0EsT0FBSyxNQUFNSyxHQUFYLElBQWtCRixJQUFsQixFQUF3QjtBQUN0QjtBQUNBLFVBQU1HLFVBQVUsR0FBR04sTUFBTSxDQUFDSyxHQUFELENBQXpCOztBQUVBLFNBQUssTUFBTUUsU0FBWCxJQUF3QkQsVUFBeEIsRUFBb0M7QUFDbEMsVUFBSUUsTUFBTSxHQUFHLEtBQWI7O0FBRUEsVUFBSUQsU0FBUyxZQUFZRSxNQUF6QixFQUFpQztBQUMvQkQsUUFBQUEsTUFBTSxHQUFHRCxTQUFTLENBQUNHLElBQVYsQ0FBZVQsS0FBZixDQUFUO0FBQ0QsT0FGRCxNQUVPLElBQUksT0FBT00sU0FBUCxLQUFxQixVQUF6QixFQUFxQztBQUMxQ0MsUUFBQUEsTUFBTSxHQUFHLE1BQU1ELFNBQVMsQ0FBQztBQUFFTCxVQUFBQSxJQUFGO0FBQVFELFVBQUFBO0FBQVIsU0FBRCxDQUF4QjtBQUNELE9BRk0sTUFFQTtBQUNMTyxRQUFBQSxNQUFNLEdBQUdQLEtBQUssQ0FBQ1UsV0FBTixPQUF3QkosU0FBUyxDQUFDSSxXQUFWLEVBQWpDO0FBQ0Q7O0FBRUQsVUFBSUgsTUFBSixFQUFZO0FBQ1Y7QUFDQSxlQUFPSSxPQUFPLENBQUNDLE9BQVIsQ0FBZ0JSLEdBQWhCLENBQVA7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQsU0FBT08sT0FBTyxDQUFDQyxPQUFSLENBQWdCZixZQUFZLENBQUNnQixZQUE3QixDQUFQO0FBQ0Q7O0FBRUQsU0FBU0Msa0JBQVQsR0FBcUQ7QUFDbkQsU0FBTztBQUNMQyxJQUFBQSxPQUFPLEVBQUUsS0FESjtBQUVMQyxJQUFBQSxTQUFTLEVBQUVyQiwwQkFBa0JEO0FBRnhCLEdBQVA7QUFJRDs7QUFFRCxNQUFNdUIsc0JBQU4sU0FBOEVDLHdCQUE5RSxDQUF3RztBQUFBO0FBQUE7O0FBQUE7O0FBQUE7QUFBQTs7QUFTNUZDLEVBQUFBLFdBQVYsR0FBd0I7QUFDdEIsV0FBTztBQUNMQyxNQUFBQSxLQUFLLEVBQUVqQyxjQURGO0FBRUxrQyxNQUFBQSxNQUFNLEVBQUVqQztBQUZILEtBQVA7QUFJRDs7QUFFRCxRQUFNa0MsVUFBTixHQUFtQjtBQUNqQixVQUFNLE1BQU1BLFVBQU4sRUFBTjtBQUNBaEMsSUFBQUEsS0FBSyxDQUFDLG9CQUFELENBQUw7QUFDQSxTQUFLaUMsWUFBTCxDQUFrQkMsa0NBQXFCQyxZQUF2QztBQUVBLFFBQUlDLEdBQUo7O0FBQ0EsUUFBSSxLQUFLQyxPQUFMLENBQWFDLE9BQWpCLEVBQTBCO0FBQ3hCRixNQUFBQSxHQUFHO0FBQUtHLFFBQUFBLEtBQUssRUFBRTtBQUFaLFNBQW9CQyxPQUFPLENBQUNKLEdBQTVCLENBQUg7QUFDRDs7QUFFRCxRQUFJLE9BQU8sS0FBS0MsT0FBTCxDQUFhSSxPQUFwQixLQUFnQyxXQUFoQyxJQUErQyxLQUFLSixPQUFMLENBQWFJLE9BQWIsS0FBeUIsSUFBNUUsRUFBa0Y7QUFDaEZ6QyxNQUFBQSxLQUFLLENBQUMsaURBQUQsQ0FBTDtBQUNBLFdBQUt5QyxPQUFMLEdBQWUsS0FBS0osT0FBTCxDQUFhSSxPQUE1QjtBQUNELEtBSEQsTUFHTztBQUNMLFlBQU1DLGNBQWMsR0FBRyxLQUFLTCxPQUFMLENBQWFLLGNBQWIsSUFBK0JDLFNBQXREO0FBQ0EsWUFBTUMsSUFBSSxHQUFHLEtBQUtQLE9BQUwsQ0FBYU8sSUFBYixJQUFxQixFQUFsQztBQUNBLFlBQU07QUFBRUMsUUFBQUE7QUFBRixVQUFjLEtBQUtSLE9BQXpCO0FBRUEsWUFBTVMsUUFBUSxHQUFHLENBQUMsS0FBS1QsT0FBTCxDQUFhVSxXQUEvQjtBQUNBL0MsTUFBQUEsS0FBSyxDQUFFLHlDQUF3QzhDLFFBQVMsRUFBbkQsQ0FBTDtBQUNBLFdBQUtMLE9BQUwsR0FBZSxNQUFNTyxtQkFBVUMsTUFBVixDQUFpQjtBQUNwQ2IsUUFBQUEsR0FEb0M7QUFFcENVLFFBQUFBLFFBRm9DO0FBR3BDSixRQUFBQSxjQUhvQztBQUlwQ0UsUUFBQUEsSUFKb0M7QUFLcENDLFFBQUFBO0FBTG9DLE9BQWpCLENBQXJCO0FBT0Q7O0FBRUQsUUFBSSxLQUFLUixPQUFMLENBQWFhLGNBQWpCLEVBQWlDO0FBQy9CbEQsTUFBQUEsS0FBSyxDQUFDLDREQUFELENBQUw7QUFDQSxZQUFNLEtBQUtxQyxPQUFMLENBQWFhLGNBQWIsQ0FBNEIsS0FBS1QsT0FBakMsQ0FBTjtBQUNEOztBQUVELFFBQUksQ0FBQyxLQUFLQSxPQUFWLEVBQW1CO0FBQ2pCekMsTUFBQUEsS0FBSyxDQUFDLG9DQUFELENBQUw7QUFDQTtBQUNEOztBQUVELFVBQU1tRCxLQUFLLEdBQUcsTUFBTSxLQUFLVixPQUFMLENBQWFVLEtBQWIsRUFBcEI7O0FBQ0EsUUFBSUEsS0FBSyxDQUFDQyxNQUFWLEVBQWtCO0FBQ2hCcEQsTUFBQUEsS0FBSyxDQUFDLG1EQUFELENBQUw7QUFDQSxPQUFDLEtBQUtXLElBQU4sSUFBY3dDLEtBQWQ7QUFDRCxLQUhELE1BR087QUFDTG5ELE1BQUFBLEtBQUssQ0FBQywyQkFBRCxDQUFMO0FBQ0EsV0FBS1csSUFBTCxHQUFZLE1BQU0sS0FBSzhCLE9BQUwsQ0FBYVksT0FBYixFQUFsQjtBQUNEOztBQUVELFFBQUksS0FBS2hCLE9BQUwsQ0FBYWlCLGNBQWpCLEVBQWlDO0FBQy9CLFdBQUszQyxJQUFMLENBQVU0QyxpQkFBVixDQUE0QixLQUFLbEIsT0FBTCxDQUFhaUIsY0FBekM7QUFDRDs7QUFFRCxRQUFJLEtBQUtqQixPQUFMLENBQWFtQixXQUFqQixFQUE4QjtBQUM1QnhELE1BQUFBLEtBQUssQ0FBQyx5REFBRCxDQUFMO0FBQ0EsWUFBTSxLQUFLcUMsT0FBTCxDQUFhbUIsV0FBYixDQUF5QixLQUFLN0MsSUFBOUIsQ0FBTjtBQUNEOztBQUVELFVBQU04QyxRQUFRLEdBQUcsS0FBSzVCLFdBQUwsRUFBakI7QUFDQTdCLElBQUFBLEtBQUssQ0FBRSx5QkFBd0J5RCxRQUFRLENBQUMzQixLQUFNLFlBQVcyQixRQUFRLENBQUMxQixNQUFPLEVBQXBFLENBQUw7QUFDQSxVQUFNLEtBQUtwQixJQUFMLENBQVUrQyxXQUFWLENBQXNCO0FBQzFCNUIsTUFBQUEsS0FBSyxFQUFFMkIsUUFBUSxDQUFDM0IsS0FEVTtBQUUxQkMsTUFBQUEsTUFBTSxFQUFFMEIsUUFBUSxDQUFDMUI7QUFGUyxLQUF0QixDQUFOO0FBS0EsU0FBS3BCLElBQUwsQ0FBVWdELEVBQVYsQ0FBYSxlQUFiLEVBQStCQyxPQUFELElBQWE7QUFBQTs7QUFDekM1RCxNQUFBQSxLQUFLLENBQUMsdUJBQUQsc0JBQTBCNEQsT0FBTyxDQUFDQyxPQUFSLEVBQTFCLHFEQUEwQixpQkFBbUJDLFNBQTdDLEVBQXdERixPQUFPLENBQUNHLEdBQVIsRUFBeEQsQ0FBTDtBQUNELEtBRkQ7QUFHRDs7QUFFRCxRQUFNQyxVQUFOLENBQWlCRCxHQUFqQixFQUE4QnBELElBQTlCLEVBQTJDa0MsT0FBM0MsRUFBNkRvQixTQUFnQyxHQUFHLE1BQWhHLEVBQXVIO0FBQ3JILFVBQU1DLFNBQVMsR0FBR3ZELElBQUksSUFBSSxLQUFLQSxJQUEvQjs7QUFFQSxRQUFJLENBQUN1RCxTQUFMLEVBQWdCO0FBQ2Q7QUFDRDs7QUFFRCxVQUFNN0IsT0FBTyxxQkFBU1EsT0FBTyxLQUFLLElBQVosR0FBbUIsSUFBbkIsR0FBMEI7QUFBRUEsTUFBQUE7QUFBRixLQUFuQztBQUFpRG9CLE1BQUFBO0FBQWpELE1BQWI7O0FBQ0EsVUFBTUUsUUFBUSxHQUFHLE1BQU1ELFNBQVMsQ0FBQ0UsSUFBVixDQUFlTCxHQUFmLEVBQW9CMUIsT0FBcEIsQ0FBdkIsQ0FScUgsQ0FVckg7O0FBQ0EsUUFBSThCLFFBQVEsS0FBSyxJQUFiLEtBQXNCQSxRQUFRLEtBQUt4QixTQUFiLElBQTBCd0IsUUFBUSxDQUFDRSxNQUFULE9BQXNCdEUsU0FBdEUsQ0FBSixFQUFzRjtBQUNwRixZQUFNLElBQUl1RSxLQUFKLENBQVcseUNBQXdDUCxHQUFJLEVBQXZELENBQU47QUFDRDtBQUNGLEdBbkdxRyxDQXFHdEc7OztBQUNBUSxFQUFBQSxlQUFlLENBQUNDLFlBQUQsRUFBaUQ7QUFDOUQsVUFBTSxJQUFJRixLQUFKLENBQVcsdUNBQXNDLEtBQUtqQyxPQUFMLENBQWFvQyxTQUFVLEVBQXhFLENBQU47QUFDRDs7QUFFRCxRQUFNQyxVQUFOLENBQWlCQyxXQUFqQixFQUE0Q0MsTUFBNUMsRUFBeUc7QUFDdkcsVUFBTUMsUUFBUSxHQUFHLENBQUMsR0FBR0QsTUFBSixDQUFqQjtBQUNBLFVBQU1FLEtBQUssR0FBR0QsUUFBUSxDQUFDRSxLQUFULEVBQWQ7O0FBRUEsUUFBSSxDQUFDRCxLQUFMLEVBQVk7QUFDVjtBQUNEOztBQUNELFVBQU0scUNBQVVILFdBQVYsRUFBdUJHLEtBQUssQ0FBQ0UsUUFBN0IsRUFBdUNGLEtBQUssQ0FBQ3BFLEtBQTdDLENBQU47O0FBQ0EsUUFBSW1FLFFBQVEsQ0FBQ3pCLE1BQWIsRUFBcUI7QUFDbkIsWUFBTSxLQUFLc0IsVUFBTCxDQUFnQkMsV0FBaEIsRUFBNkJFLFFBQTdCLENBQU47QUFDRDtBQUNGOztBQUVELFFBQU1JLEtBQU4sQ0FBWUMsV0FBWixFQUE2RTtBQUMzRSxRQUFJLENBQUNBLFdBQUQsSUFBZ0IsQ0FBQyxLQUFLdkUsSUFBMUIsRUFBZ0M7QUFDOUIsYUFBT2Esa0JBQWtCLEVBQXpCO0FBQ0Q7O0FBRUR4QixJQUFBQSxLQUFLLENBQUMsdUJBQUQsQ0FBTDtBQUNBLFVBQU1tRixZQUFZLEdBQUcsS0FBS1osZUFBTCxDQUFxQlcsV0FBckIsQ0FBckI7O0FBRUEsUUFBSUMsWUFBWSxDQUFDQyxTQUFqQixFQUE0QjtBQUMxQnBGLE1BQUFBLEtBQUssQ0FBQywyQ0FBRCxDQUFMO0FBQ0EsWUFBTSxLQUFLVyxJQUFMLENBQVUwRSxZQUFWLENBQXVCRixZQUFZLENBQUNDLFNBQXBDLENBQU47QUFDRDs7QUFFRHBGLElBQUFBLEtBQUssQ0FBQyx1QkFBRCxDQUFMO0FBQ0EsVUFBTSxLQUFLZ0UsVUFBTCxDQUFnQm1CLFlBQVksQ0FBQ0csUUFBN0IsRUFBdUMzQyxTQUF2QyxFQUFrREEsU0FBbEQsRUFBNkR3QyxZQUFZLENBQUNsQixTQUExRSxDQUFOOztBQUNBLFFBQUlrQixZQUFZLENBQUNJLGNBQWpCLEVBQWlDO0FBQy9CdkYsTUFBQUEsS0FBSyxDQUFDLGtFQUFELENBQUw7QUFDQSxZQUFNbUYsWUFBWSxDQUFDSSxjQUFiLEVBQU47QUFDRCxLQUhELE1BR08sSUFBSSxPQUFPSixZQUFZLENBQUNLLG9CQUFwQixLQUE2QyxRQUFqRCxFQUEyRDtBQUNoRXhGLE1BQUFBLEtBQUssQ0FBQyx1Q0FBRCxDQUFMO0FBQ0EsWUFBTSxpREFBc0IsS0FBS1csSUFBM0IsRUFBaUN3RSxZQUFZLENBQUNLLG9CQUE5QyxDQUFOO0FBQ0Q7O0FBRUQsUUFBSUMsZ0JBQXVDLEdBQUcsS0FBSzlFLElBQW5EOztBQUNBLFFBQUl3RSxZQUFZLENBQUNPLFNBQWpCLEVBQTRCO0FBQzFCMUYsTUFBQUEsS0FBSyxDQUFDLDZEQUFELENBQUw7QUFDQXlGLE1BQUFBLGdCQUFnQixHQUFHLE9BQU1OLFlBQVksQ0FBQ08sU0FBYixFQUFOLEtBQWtDLEtBQUsvRSxJQUExRDtBQUNEOztBQUVEWCxJQUFBQSxLQUFLLENBQUMsa0RBQUQsQ0FBTDtBQUNBLFVBQU0sS0FBSzBFLFVBQUwsQ0FBZ0JlLGdCQUFoQixFQUFrQ04sWUFBWSxDQUFDUCxNQUEvQyxDQUFOO0FBQ0E1RSxJQUFBQSxLQUFLLENBQUMsOEJBQUQsQ0FBTDs7QUFDQSxRQUFJLE9BQU9tRixZQUFZLENBQUNLLG9CQUFwQixLQUE2QyxRQUFqRCxFQUEyRDtBQUN6RCxZQUFNLHVDQUFZQyxnQkFBWixFQUE4Qk4sWUFBWSxDQUFDSyxvQkFBM0MsQ0FBTjtBQUNELEtBRkQsTUFFTztBQUNMLFlBQU1MLFlBQVksQ0FBQ0ssb0JBQWIsRUFBTjtBQUNEOztBQUNELFNBQUt2RCxZQUFMLENBQWtCQyxrQ0FBcUJ5RCxTQUF2Qzs7QUFFQSxRQUFJUixZQUFZLENBQUNTLFVBQWpCLEVBQTZCO0FBQzNCNUYsTUFBQUEsS0FBSyxDQUFDLDhEQUFELENBQUw7QUFDQSxZQUFNbUYsWUFBWSxDQUFDUyxVQUFiLEVBQU47QUFDRCxLQUhELE1BR087QUFDTDVGLE1BQUFBLEtBQUssQ0FBQywwQkFBRCxDQUFMO0FBQ0EsWUFBTSxtQ0FBa0IsS0FBS1csSUFBdkIsQ0FBTjtBQUNEOztBQUVEWCxJQUFBQSxLQUFLLENBQUMsb0JBQUQsQ0FBTDtBQUNBLFVBQU02RixPQUFPLEdBQUcsTUFBTSwrQkFBYyxLQUFLbEYsSUFBbkIsRUFBeUIsSUFBekIsQ0FBdEI7QUFDQSxVQUFNbUYsV0FBVyxHQUFHLE1BQU10RixhQUFhLENBQUMyRSxZQUFZLENBQUNZLGVBQWQsRUFBK0JGLE9BQS9CLEVBQXdDLEtBQUtsRixJQUE3QyxDQUF2QztBQUNBWCxJQUFBQSxLQUFLLENBQUUsd0JBQXVCOEYsV0FBWSxFQUFyQyxDQUFMO0FBQ0EsV0FBTyxLQUFLRSxpQkFBTCxDQUF1QkYsV0FBdkIsQ0FBUDtBQUNEOztBQUVELFFBQU1HLFNBQU4sQ0FBZ0JDLFFBQWhCLEVBQW1DO0FBQ2pDbEcsSUFBQUEsS0FBSyxDQUFFLHNDQUFxQ2tHLFFBQVMsRUFBaEQsQ0FBTDtBQUNBLFNBQUtqRSxZQUFMLENBQWtCQyxrQ0FBcUJpRSxXQUF2Qzs7QUFFQSxRQUFJLENBQUNELFFBQUQsSUFBYSxDQUFDLENBQUMsS0FBSzdELE9BQUwsQ0FBYStELDBCQUFoQyxFQUE0RDtBQUMxRHBHLE1BQUFBLEtBQUssQ0FBRSwwQ0FBeUMsS0FBS3FDLE9BQUwsQ0FBYStELDBCQUEyQixFQUFuRixDQUFMO0FBQ0EsWUFBTSxLQUFLekYsSUFBTCxDQUFVMEYsVUFBVixDQUFxQjtBQUN6QkMsUUFBQUEsSUFBSSxFQUFFLEtBQUtqRSxPQUFMLENBQWErRCwwQkFETTtBQUV6QkcsUUFBQUEsUUFBUSxFQUFFO0FBRmUsT0FBckIsQ0FBTjtBQUlEOztBQUVELFFBQUksQ0FBQyxLQUFLOUQsT0FBVixFQUFtQjtBQUNqQjtBQUNEOztBQUVELFVBQU0sS0FBS0EsT0FBTCxDQUFhK0QsS0FBYixFQUFOO0FBQ0Q7O0FBRU9SLEVBQUFBLGlCQUFSLENBQTBCRixXQUExQixFQUFxRDtBQUNuRCxZQUFRQSxXQUFSO0FBQ0UsV0FBS3ZGLFlBQVksQ0FBQ2tHLE9BQWxCO0FBQ0UsYUFBS3hFLFlBQUwsQ0FBa0JDLGtDQUFxQndFLFlBQXZDO0FBQ0EsZUFBTztBQUFFakYsVUFBQUEsT0FBTyxFQUFFO0FBQVgsU0FBUDs7QUFDRixXQUFLbEIsWUFBWSxDQUFDb0csZUFBbEI7QUFDQSxXQUFLcEcsWUFBWSxDQUFDZ0IsWUFBbEI7QUFDRSxhQUFLVSxZQUFMLENBQWtCQyxrQ0FBcUIwRSxXQUF2QztBQUNBLGVBQU87QUFDTG5GLFVBQUFBLE9BQU8sRUFBRSxLQURKO0FBRUxDLFVBQUFBLFNBQVMsRUFBRW9FLFdBQVcsS0FBS3ZGLFlBQVksQ0FBQ29HLGVBQTdCLEdBQStDdEcsMEJBQWtCc0csZUFBakUsR0FDVHRHLDBCQUFrQkQsT0FIZjtBQUlMeUcsVUFBQUEsWUFBWSxFQUFHLHFCQUFvQmYsV0FBWTtBQUoxQyxTQUFQOztBQU1GLFdBQUt2RixZQUFZLENBQUN1RyxjQUFsQjtBQUNFLGFBQUs3RSxZQUFMLENBQWtCQyxrQ0FBcUI0RSxjQUF2QztBQUNBLGVBQU87QUFDTHJGLFVBQUFBLE9BQU8sRUFBRSxLQURKO0FBRUxDLFVBQUFBLFNBQVMsRUFBRXJCLDBCQUFrQnlHO0FBRnhCLFNBQVA7O0FBSUY7QUFDRSxjQUFNLElBQUl4QyxLQUFKLENBQVcsNEJBQTJCd0IsV0FBWSxHQUFsRCxDQUFOO0FBcEJKO0FBc0JEOztBQXZOcUciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcHVwcGV0ZWVyLCB7XG4gIEJyb3dzZXIsIEZyYW1lLCBQYWdlLCBMb2FkRXZlbnQsXG59IGZyb20gJ3B1cHBldGVlcic7XG5cbmltcG9ydCB7XG4gIEJhc2VTY3JhcGVyLFxuXG59IGZyb20gJy4vYmFzZS1zY3JhcGVyJztcbmltcG9ydCB7IGdldEN1cnJlbnRVcmwsIHdhaXRGb3JOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IGNsaWNrQnV0dG9uLCBmaWxsSW5wdXQsIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCB9IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IGdldERlYnVnIH0gZnJvbSAnLi4vaGVscGVycy9kZWJ1Zyc7XG5pbXBvcnQgeyBTY3JhcGVyRXJyb3JUeXBlcyB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IFNjcmFwZXJTY3JhcGluZ1Jlc3VsdCwgU2NyYXBlckNyZWRlbnRpYWxzIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2NyYXBlclByb2dyZXNzVHlwZXMgfSBmcm9tICcuLi9kZWZpbml0aW9ucyc7XG5cbmNvbnN0IFZJRVdQT1JUX1dJRFRIID0gMTAyNDtcbmNvbnN0IFZJRVdQT1JUX0hFSUdIVCA9IDc2ODtcbmNvbnN0IE9LX1NUQVRVUyA9IDIwMDtcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZygnYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3NlcicpO1xuXG5lbnVtIExvZ2luQmFzZVJlc3VsdHMge1xuICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICBVbmtub3duRXJyb3IgPSAnVU5LTk9XTl9FUlJPUidcbn1cblxuY29uc3Qge1xuICBUaW1lb3V0LCBHZW5lcmljLCBHZW5lcmFsLCAuLi5yZXN0XG59ID0gU2NyYXBlckVycm9yVHlwZXM7XG5leHBvcnQgY29uc3QgTG9naW5SZXN1bHRzID0ge1xuICAuLi5yZXN0LFxuICAuLi5Mb2dpbkJhc2VSZXN1bHRzLFxufTtcblxuZXhwb3J0IHR5cGUgTG9naW5SZXN1bHRzID0gRXhjbHVkZTxTY3JhcGVyRXJyb3JUeXBlcyxcblNjcmFwZXJFcnJvclR5cGVzLlRpbWVvdXRcbnwgU2NyYXBlckVycm9yVHlwZXMuR2VuZXJpY1xufCBTY3JhcGVyRXJyb3JUeXBlcy5HZW5lcmFsPiB8IExvZ2luQmFzZVJlc3VsdHM7XG5cbmV4cG9ydCB0eXBlIFBvc3NpYmxlTG9naW5SZXN1bHRzID0ge1xuICBba2V5IGluIExvZ2luUmVzdWx0c10/OiAoc3RyaW5nIHwgUmVnRXhwIHwgKChvcHRpb25zPzogeyBwYWdlPzogUGFnZX0pID0+IFByb21pc2U8Ym9vbGVhbj4pKVtdXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2luT3B0aW9ucyB7XG4gIGxvZ2luVXJsOiBzdHJpbmc7XG4gIGNoZWNrUmVhZGluZXNzPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgZmllbGRzOiB7c2VsZWN0b3I6IHN0cmluZywgdmFsdWU6IHN0cmluZ31bXTtcbiAgc3VibWl0QnV0dG9uU2VsZWN0b3I6IHN0cmluZyB8ICgoKSA9PiBQcm9taXNlPHZvaWQ+KTtcbiAgcHJlQWN0aW9uPzogKCkgPT4gUHJvbWlzZTxGcmFtZSB8IHZvaWQ+O1xuICBwb3N0QWN0aW9uPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcG9zc2libGVSZXN1bHRzOiBQb3NzaWJsZUxvZ2luUmVzdWx0cztcbiAgdXNlckFnZW50Pzogc3RyaW5nO1xuICB3YWl0VW50aWw/OiBMb2FkRXZlbnQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEtleUJ5VmFsdWUob2JqZWN0OiBQb3NzaWJsZUxvZ2luUmVzdWx0cywgdmFsdWU6IHN0cmluZywgcGFnZTogUGFnZSk6IFByb21pc2U8TG9naW5SZXN1bHRzPiB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBvYmplY3Rba2V5XTtcblxuICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcbiAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcblxuICAgICAgaWYgKGNvbmRpdGlvbiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXN1bHQgPSBjb25kaXRpb24udGVzdCh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgY29uZGl0aW9uKHsgcGFnZSwgdmFsdWUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBjb25kaXRpb24udG9Mb3dlckNhc2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKExvZ2luUmVzdWx0cy5Vbmtub3duRXJyb3IpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVHZW5lcmFsRXJyb3IoKTogU2NyYXBlclNjcmFwaW5nUmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICBlcnJvclR5cGU6IFNjcmFwZXJFcnJvclR5cGVzLkdlbmVyYWwsXG4gIH07XG59XG5cbmNsYXNzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8VENyZWRlbnRpYWxzIGV4dGVuZHMgU2NyYXBlckNyZWRlbnRpYWxzPiBleHRlbmRzIEJhc2VTY3JhcGVyPFRDcmVkZW50aWFscz4ge1xuICAvLyBOT1RJQ0UgLSBpdCBpcyBkaXNjb3VyYWdlZCB0byB1c2UgYmFuZyAoISkgaW4gZ2VuZXJhbC4gSXQgaXMgdXNlZCBoZXJlIGJlY2F1c2VcbiAgLy8gYWxsIHRoZSBjbGFzc2VzIHRoYXQgaW5oZXJpdCBmcm9tIHRoaXMgYmFzZSBhc3N1bWUgaXMgaXQgbWFuZGF0b3J5LlxuICBwcm90ZWN0ZWQgYnJvd3NlciE6IEJyb3dzZXI7XG5cbiAgLy8gTk9USUNFIC0gaXQgaXMgZGlzY291cmFnZWQgdG8gdXNlIGJhbmcgKCEpIGluIGdlbmVyYWwuIEl0IGlzIHVzZWQgaGVyZSBiZWNhdXNlXG4gIC8vIGFsbCB0aGUgY2xhc3NlcyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIGJhc2UgYXNzdW1lIGlzIGl0IG1hbmRhdG9yeS5cbiAgcHJvdGVjdGVkIHBhZ2UhOiBQYWdlO1xuXG4gIHByb3RlY3RlZCBnZXRWaWV3UG9ydCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IFZJRVdQT1JUX1dJRFRILFxuICAgICAgaGVpZ2h0OiBWSUVXUE9SVF9IRUlHSFQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemUoKSB7XG4gICAgYXdhaXQgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIGRlYnVnKCdpbml0aWFsaXplIHNjcmFwZXInKTtcbiAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Jbml0aWFsaXppbmcpO1xuXG4gICAgbGV0IGVudjogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5vcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgIGVudiA9IHsgREVCVUc6ICcqJywgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5icm93c2VyICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm9wdGlvbnMuYnJvd3NlciAhPT0gbnVsbCkge1xuICAgICAgZGVidWcoJ3VzZSBjdXN0b20gYnJvd3NlciBpbnN0YW5jZSBwcm92aWRlZCBpbiBvcHRpb25zJyk7XG4gICAgICB0aGlzLmJyb3dzZXIgPSB0aGlzLm9wdGlvbnMuYnJvd3NlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXhlY3V0YWJsZVBhdGggPSB0aGlzLm9wdGlvbnMuZXhlY3V0YWJsZVBhdGggfHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgYXJncyA9IHRoaXMub3B0aW9ucy5hcmdzIHx8IFtdO1xuICAgICAgY29uc3QgeyB0aW1lb3V0IH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIGNvbnN0IGhlYWRsZXNzID0gIXRoaXMub3B0aW9ucy5zaG93QnJvd3NlcjtcbiAgICAgIGRlYnVnKGBsYXVuY2ggYSBicm93c2VyIHdpdGggaGVhZGxlc3MgbW9kZSA9ICR7aGVhZGxlc3N9YCk7XG4gICAgICB0aGlzLmJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKHtcbiAgICAgICAgZW52LFxuICAgICAgICBoZWFkbGVzcyxcbiAgICAgICAgZXhlY3V0YWJsZVBhdGgsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHRpbWVvdXQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnByZXBhcmVCcm93c2VyKSB7XG4gICAgICBkZWJ1ZygnZXhlY3V0ZSBcXCdwcmVwYXJlQnJvd3NlclxcJyBpbnRlcmNlcHRvciBwcm92aWRlZCBpbiBvcHRpb25zJyk7XG4gICAgICBhd2FpdCB0aGlzLm9wdGlvbnMucHJlcGFyZUJyb3dzZXIodGhpcy5icm93c2VyKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYnJvd3Nlcikge1xuICAgICAgZGVidWcoJ2ZhaWxlZCB0byBpbml0aWF0ZSBhIGJyb3dzZXIsIGV4aXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlcyA9IGF3YWl0IHRoaXMuYnJvd3Nlci5wYWdlcygpO1xuICAgIGlmIChwYWdlcy5sZW5ndGgpIHtcbiAgICAgIGRlYnVnKCdicm93c2VyIGhhcyBhbHJlYWR5IHBhZ2VzIG9wZW4sIHVzZSB0aGUgZmlyc3Qgb25lJyk7XG4gICAgICBbdGhpcy5wYWdlXSA9IHBhZ2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1ZygnY3JlYXRlIGEgbmV3IGJyb3dzZXIgcGFnZScpO1xuICAgICAgdGhpcy5wYWdlID0gYXdhaXQgdGhpcy5icm93c2VyLm5ld1BhZ2UoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmRlZmF1bHRUaW1lb3V0KSB7XG4gICAgICB0aGlzLnBhZ2Uuc2V0RGVmYXVsdFRpbWVvdXQodGhpcy5vcHRpb25zLmRlZmF1bHRUaW1lb3V0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnByZXBhcmVQYWdlKSB7XG4gICAgICBkZWJ1ZygnZXhlY3V0ZSBcXCdwcmVwYXJlUGFnZVxcJyBpbnRlcmNlcHRvciBwcm92aWRlZCBpbiBvcHRpb25zJyk7XG4gICAgICBhd2FpdCB0aGlzLm9wdGlvbnMucHJlcGFyZVBhZ2UodGhpcy5wYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld1BvcnQoKTtcbiAgICBkZWJ1Zyhgc2V0IHZpZXdwb3J0IHRvIHdpZHRoICR7dmlld3BvcnQud2lkdGh9LCBoZWlnaHQgJHt2aWV3cG9ydC5oZWlnaHR9YCk7XG4gICAgYXdhaXQgdGhpcy5wYWdlLnNldFZpZXdwb3J0KHtcbiAgICAgIHdpZHRoOiB2aWV3cG9ydC53aWR0aCxcbiAgICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LFxuICAgIH0pO1xuXG4gICAgdGhpcy5wYWdlLm9uKCdyZXF1ZXN0ZmFpbGVkJywgKHJlcXVlc3QpID0+IHtcbiAgICAgIGRlYnVnKCdSZXF1ZXN0IGZhaWxlZDogJXMgJXMnLCByZXF1ZXN0LmZhaWx1cmUoKT8uZXJyb3JUZXh0LCByZXF1ZXN0LnVybCgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG5hdmlnYXRlVG8odXJsOiBzdHJpbmcsIHBhZ2U/OiBQYWdlLCB0aW1lb3V0PzogbnVtYmVyLCB3YWl0VW50aWw6IExvYWRFdmVudCB8IHVuZGVmaW5lZCA9ICdsb2FkJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhZ2VUb1VzZSA9IHBhZ2UgfHwgdGhpcy5wYWdlO1xuXG4gICAgaWYgKCFwYWdlVG9Vc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0geyAuLi4odGltZW91dCA9PT0gbnVsbCA/IG51bGwgOiB7IHRpbWVvdXQgfSksIHdhaXRVbnRpbCB9O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcGFnZVRvVXNlLmdvdG8odXJsLCBvcHRpb25zKTtcblxuICAgIC8vIG5vdGU6IHJlc3BvbnNlIHdpbGwgYmUgbnVsbCB3aGVuIG5hdmlnYXRpbmcgdG8gc2FtZSB1cmwgd2hpbGUgY2hhbmdpbmcgdGhlIGhhc2ggcGFydC4gdGhlIGNvbmRpdGlvbiBiZWxvdyB3aWxsIGFsd2F5cyBhY2NlcHQgbnVsbCBhcyB2YWxpZCByZXN1bHQuXG4gICAgaWYgKHJlc3BvbnNlICE9PSBudWxsICYmIChyZXNwb25zZSA9PT0gdW5kZWZpbmVkIHx8IHJlc3BvbnNlLnN0YXR1cygpICE9PSBPS19TVEFUVVMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIHRyeWluZyB0byBuYXZpZ2F0ZSB0byB1cmwgJHt1cmx9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBnZXRMb2dpbk9wdGlvbnMoX2NyZWRlbnRpYWxzOiBTY3JhcGVyQ3JlZGVudGlhbHMpOiBMb2dpbk9wdGlvbnMge1xuICAgIHRocm93IG5ldyBFcnJvcihgZ2V0TG9naW5PcHRpb25zKCkgaXMgbm90IGNyZWF0ZWQgaW4gJHt0aGlzLm9wdGlvbnMuY29tcGFueUlkfWApO1xuICB9XG5cbiAgYXN5bmMgZmlsbElucHV0cyhwYWdlT3JGcmFtZTogUGFnZSB8IEZyYW1lLCBmaWVsZHM6IHsgc2VsZWN0b3I6IHN0cmluZywgdmFsdWU6IHN0cmluZ31bXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1vZGlmaWVkID0gWy4uLmZpZWxkc107XG4gICAgY29uc3QgaW5wdXQgPSBtb2RpZmllZC5zaGlmdCgpO1xuXG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBmaWxsSW5wdXQocGFnZU9yRnJhbWUsIGlucHV0LnNlbGVjdG9yLCBpbnB1dC52YWx1ZSk7XG4gICAgaWYgKG1vZGlmaWVkLmxlbmd0aCkge1xuICAgICAgYXdhaXQgdGhpcy5maWxsSW5wdXRzKHBhZ2VPckZyYW1lLCBtb2RpZmllZCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9naW4oY3JlZGVudGlhbHM6IFNjcmFwZXJDcmVkZW50aWFscyk6IFByb21pc2U8U2NyYXBlclNjcmFwaW5nUmVzdWx0PiB7XG4gICAgaWYgKCFjcmVkZW50aWFscyB8fCAhdGhpcy5wYWdlKSB7XG4gICAgICByZXR1cm4gY3JlYXRlR2VuZXJhbEVycm9yKCk7XG4gICAgfVxuXG4gICAgZGVidWcoJ2V4ZWN1dGUgbG9naW4gcHJvY2VzcycpO1xuICAgIGNvbnN0IGxvZ2luT3B0aW9ucyA9IHRoaXMuZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzKTtcblxuICAgIGlmIChsb2dpbk9wdGlvbnMudXNlckFnZW50KSB7XG4gICAgICBkZWJ1Zygnc2V0IGN1c3RvbSB1c2VyIGFnZW50IHByb3ZpZGVkIGluIG9wdGlvbnMnKTtcbiAgICAgIGF3YWl0IHRoaXMucGFnZS5zZXRVc2VyQWdlbnQobG9naW5PcHRpb25zLnVzZXJBZ2VudCk7XG4gICAgfVxuXG4gICAgZGVidWcoJ25hdmlnYXRlIHRvIGxvZ2luIHVybCcpO1xuICAgIGF3YWl0IHRoaXMubmF2aWdhdGVUbyhsb2dpbk9wdGlvbnMubG9naW5VcmwsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBsb2dpbk9wdGlvbnMud2FpdFVudGlsKTtcbiAgICBpZiAobG9naW5PcHRpb25zLmNoZWNrUmVhZGluZXNzKSB7XG4gICAgICBkZWJ1ZygnZXhlY3V0ZSBcXCdjaGVja1JlYWRpbmVzc1xcJyBpbnRlcmNlcHRvciBwcm92aWRlZCBpbiBsb2dpbiBvcHRpb25zJyk7XG4gICAgICBhd2FpdCBsb2dpbk9wdGlvbnMuY2hlY2tSZWFkaW5lc3MoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBsb2dpbk9wdGlvbnMuc3VibWl0QnV0dG9uU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkZWJ1Zygnd2FpdCB1bnRpbCBzdWJtaXQgYnV0dG9uIGlzIGF2YWlsYWJsZScpO1xuICAgICAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHRoaXMucGFnZSwgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICBsZXQgbG9naW5GcmFtZU9yUGFnZTogKFBhZ2UgfCBGcmFtZSB8IG51bGwpID0gdGhpcy5wYWdlO1xuICAgIGlmIChsb2dpbk9wdGlvbnMucHJlQWN0aW9uKSB7XG4gICAgICBkZWJ1ZygnZXhlY3V0ZSBcXCdwcmVBY3Rpb25cXCcgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9ucycpO1xuICAgICAgbG9naW5GcmFtZU9yUGFnZSA9IGF3YWl0IGxvZ2luT3B0aW9ucy5wcmVBY3Rpb24oKSB8fCB0aGlzLnBhZ2U7XG4gICAgfVxuXG4gICAgZGVidWcoJ2ZpbGwgbG9naW4gY29tcG9uZW50cyBpbnB1dCB3aXRoIHJlbGV2YW50IHZhbHVlcycpO1xuICAgIGF3YWl0IHRoaXMuZmlsbElucHV0cyhsb2dpbkZyYW1lT3JQYWdlLCBsb2dpbk9wdGlvbnMuZmllbGRzKTtcbiAgICBkZWJ1ZygnY2xpY2sgb24gbG9naW4gc3VibWl0IGJ1dHRvbicpO1xuICAgIGlmICh0eXBlb2YgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgYXdhaXQgY2xpY2tCdXR0b24obG9naW5GcmFtZU9yUGFnZSwgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yKCk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2dpbmdJbik7XG5cbiAgICBpZiAobG9naW5PcHRpb25zLnBvc3RBY3Rpb24pIHtcbiAgICAgIGRlYnVnKCdleGVjdXRlIFxcJ3Bvc3RBY3Rpb25cXCcgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9ucycpO1xuICAgICAgYXdhaXQgbG9naW5PcHRpb25zLnBvc3RBY3Rpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoJ3dhaXQgZm9yIHBhZ2UgbmF2aWdhdGlvbicpO1xuICAgICAgYXdhaXQgd2FpdEZvck5hdmlnYXRpb24odGhpcy5wYWdlKTtcbiAgICB9XG5cbiAgICBkZWJ1ZygnY2hlY2sgbG9naW4gcmVzdWx0Jyk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGdldEN1cnJlbnRVcmwodGhpcy5wYWdlLCB0cnVlKTtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGF3YWl0IGdldEtleUJ5VmFsdWUobG9naW5PcHRpb25zLnBvc3NpYmxlUmVzdWx0cywgY3VycmVudCwgdGhpcy5wYWdlKTtcbiAgICBkZWJ1ZyhgaGFuZGxlIGxvZ2luIHJlc3VsdHMgJHtsb2dpblJlc3VsdH1gKTtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVMb2dpblJlc3VsdChsb2dpblJlc3VsdCk7XG4gIH1cblxuICBhc3luYyB0ZXJtaW5hdGUoX3N1Y2Nlc3M6IGJvb2xlYW4pIHtcbiAgICBkZWJ1ZyhgdGVybWluYXRpbmcgYnJvd3NlciB3aXRoIHN1Y2Nlc3MgPSAke19zdWNjZXNzfWApO1xuICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLlRlcm1pbmF0aW5nKTtcblxuICAgIGlmICghX3N1Y2Nlc3MgJiYgISF0aGlzLm9wdGlvbnMuc3RvcmVGYWlsdXJlU2NyZWVuU2hvdFBhdGgpIHtcbiAgICAgIGRlYnVnKGBjcmVhdGUgYSBzbmFwc2hvdCBiZWZvcmUgdGVybWluYXRlZCBpbiAke3RoaXMub3B0aW9ucy5zdG9yZUZhaWx1cmVTY3JlZW5TaG90UGF0aH1gKTtcbiAgICAgIGF3YWl0IHRoaXMucGFnZS5zY3JlZW5zaG90KHtcbiAgICAgICAgcGF0aDogdGhpcy5vcHRpb25zLnN0b3JlRmFpbHVyZVNjcmVlblNob3RQYXRoLFxuICAgICAgICBmdWxsUGFnZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5icm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5icm93c2VyLmNsb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUxvZ2luUmVzdWx0KGxvZ2luUmVzdWx0OiBMb2dpblJlc3VsdHMpIHtcbiAgICBzd2l0Y2ggKGxvZ2luUmVzdWx0KSB7XG4gICAgICBjYXNlIExvZ2luUmVzdWx0cy5TdWNjZXNzOlxuICAgICAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Mb2dpblN1Y2Nlc3MpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICBjYXNlIExvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmQ6XG4gICAgICBjYXNlIExvZ2luUmVzdWx0cy5Vbmtub3duRXJyb3I6XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2luRmFpbGVkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvclR5cGU6IGxvZ2luUmVzdWx0ID09PSBMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkID8gU2NyYXBlckVycm9yVHlwZXMuSW52YWxpZFBhc3N3b3JkIDpcbiAgICAgICAgICAgIFNjcmFwZXJFcnJvclR5cGVzLkdlbmVyYWwsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBgTG9naW4gZmFpbGVkIHdpdGggJHtsb2dpblJlc3VsdH0gZXJyb3JgLFxuICAgICAgICB9O1xuICAgICAgY2FzZSBMb2dpblJlc3VsdHMuQ2hhbmdlUGFzc3dvcmQ6XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkNoYW5nZVBhc3N3b3JkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvclR5cGU6IFNjcmFwZXJFcnJvclR5cGVzLkNoYW5nZVBhc3N3b3JkLFxuICAgICAgICB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIGxvZ2luIHJlc3VsdCBcIiR7bG9naW5SZXN1bHR9XCJgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciB9O1xuIl19
|
|
269
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcHVwcGV0ZWVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYmFzZVNjcmFwZXIiLCJfbmF2aWdhdGlvbiIsIl9lbGVtZW50c0ludGVyYWN0aW9ucyIsIl9kZWJ1ZyIsIl9lcnJvcnMiLCJfZGVmaW5pdGlvbnMiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIm93bktleXMiLCJvYmplY3QiLCJlbnVtZXJhYmxlT25seSIsImtleXMiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJzeW1ib2xzIiwiZmlsdGVyIiwic3ltIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJ0YXJnZXQiLCJpIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwiZm9yRWFjaCIsImtleSIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiZXhjbHVkZWQiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSIsInNvdXJjZVN5bWJvbEtleXMiLCJpbmRleE9mIiwicHJvdG90eXBlIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJjYWxsIiwic291cmNlS2V5cyIsIlZJRVdQT1JUX1dJRFRIIiwiVklFV1BPUlRfSEVJR0hUIiwiT0tfU1RBVFVTIiwiZGVidWciLCJnZXREZWJ1ZyIsIkxvZ2luQmFzZVJlc3VsdHMiLCJUaW1lb3V0IiwiR2VuZXJpYyIsIkdlbmVyYWwiLCJTY3JhcGVyRXJyb3JUeXBlcyIsInJlc3QiLCJMb2dpblJlc3VsdHMiLCJleHBvcnRzIiwiZ2V0S2V5QnlWYWx1ZSIsInBhZ2UiLCJjb25kaXRpb25zIiwiY29uZGl0aW9uIiwicmVzdWx0IiwiUmVnRXhwIiwidGVzdCIsInRvTG93ZXJDYXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJVbmtub3duRXJyb3IiLCJjcmVhdGVHZW5lcmFsRXJyb3IiLCJzdWNjZXNzIiwiZXJyb3JUeXBlIiwiQmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsIkJhc2VTY3JhcGVyIiwiY29uc3RydWN0b3IiLCJhcmdzIiwiZ2V0Vmlld1BvcnQiLCJ3aWR0aCIsImhlaWdodCIsImluaXRpYWxpemUiLCJlbWl0UHJvZ3Jlc3MiLCJTY3JhcGVyUHJvZ3Jlc3NUeXBlcyIsIkluaXRpYWxpemluZyIsImVudiIsIm9wdGlvbnMiLCJ2ZXJib3NlIiwiREVCVUciLCJwcm9jZXNzIiwiYnJvd3NlciIsImV4ZWN1dGFibGVQYXRoIiwidW5kZWZpbmVkIiwidGltZW91dCIsImhlYWRsZXNzIiwic2hvd0Jyb3dzZXIiLCJwdXBwZXRlZXIiLCJsYXVuY2giLCJwcmVwYXJlQnJvd3NlciIsInBhZ2VzIiwibmV3UGFnZSIsImRlZmF1bHRUaW1lb3V0Iiwic2V0RGVmYXVsdFRpbWVvdXQiLCJwcmVwYXJlUGFnZSIsInZpZXdwb3J0Iiwic2V0Vmlld3BvcnQiLCJvbiIsInJlcXVlc3QiLCJfcmVxdWVzdCRmYWlsdXJlIiwiZmFpbHVyZSIsImVycm9yVGV4dCIsInVybCIsIm5hdmlnYXRlVG8iLCJ3YWl0VW50aWwiLCJwYWdlVG9Vc2UiLCJyZXNwb25zZSIsImdvdG8iLCJzdGF0dXMiLCJFcnJvciIsImdldExvZ2luT3B0aW9ucyIsIl9jcmVkZW50aWFscyIsImNvbXBhbnlJZCIsImZpbGxJbnB1dHMiLCJwYWdlT3JGcmFtZSIsImZpZWxkcyIsIm1vZGlmaWVkIiwiaW5wdXQiLCJzaGlmdCIsImZpbGxJbnB1dCIsInNlbGVjdG9yIiwibG9naW4iLCJjcmVkZW50aWFscyIsImxvZ2luT3B0aW9ucyIsInVzZXJBZ2VudCIsInNldFVzZXJBZ2VudCIsImxvZ2luVXJsIiwiY2hlY2tSZWFkaW5lc3MiLCJzdWJtaXRCdXR0b25TZWxlY3RvciIsIndhaXRVbnRpbEVsZW1lbnRGb3VuZCIsImxvZ2luRnJhbWVPclBhZ2UiLCJwcmVBY3Rpb24iLCJjbGlja0J1dHRvbiIsIkxvZ2dpbmdJbiIsInBvc3RBY3Rpb24iLCJ3YWl0Rm9yTmF2aWdhdGlvbiIsImN1cnJlbnQiLCJnZXRDdXJyZW50VXJsIiwibG9naW5SZXN1bHQiLCJwb3NzaWJsZVJlc3VsdHMiLCJoYW5kbGVMb2dpblJlc3VsdCIsInRlcm1pbmF0ZSIsIl9zdWNjZXNzIiwiVGVybWluYXRpbmciLCJzdG9yZUZhaWx1cmVTY3JlZW5TaG90UGF0aCIsInNjcmVlbnNob3QiLCJwYXRoIiwiZnVsbFBhZ2UiLCJjbG9zZSIsIlN1Y2Nlc3MiLCJMb2dpblN1Y2Nlc3MiLCJJbnZhbGlkUGFzc3dvcmQiLCJMb2dpbkZhaWxlZCIsImVycm9yTWVzc2FnZSIsIkNoYW5nZVBhc3N3b3JkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHB1cHBldGVlciwge1xuICBCcm93c2VyLCBGcmFtZSwgUGFnZSwgTG9hZEV2ZW50LFxufSBmcm9tICdwdXBwZXRlZXInO1xuXG5pbXBvcnQge1xuICBCYXNlU2NyYXBlcixcblxufSBmcm9tICcuL2Jhc2Utc2NyYXBlcic7XG5pbXBvcnQgeyBnZXRDdXJyZW50VXJsLCB3YWl0Rm9yTmF2aWdhdGlvbiB9IGZyb20gJy4uL2hlbHBlcnMvbmF2aWdhdGlvbic7XG5pbXBvcnQgeyBjbGlja0J1dHRvbiwgZmlsbElucHV0LCB3YWl0VW50aWxFbGVtZW50Rm91bmQgfSBmcm9tICcuLi9oZWxwZXJzL2VsZW1lbnRzLWludGVyYWN0aW9ucyc7XG5pbXBvcnQgeyBnZXREZWJ1ZyB9IGZyb20gJy4uL2hlbHBlcnMvZGVidWcnO1xuaW1wb3J0IHsgU2NyYXBlckVycm9yVHlwZXMgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBTY3JhcGVyU2NyYXBpbmdSZXN1bHQsIFNjcmFwZXJDcmVkZW50aWFscyB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFNjcmFwZXJQcm9ncmVzc1R5cGVzIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMnO1xuXG5jb25zdCBWSUVXUE9SVF9XSURUSCA9IDEwMjQ7XG5jb25zdCBWSUVXUE9SVF9IRUlHSFQgPSA3Njg7XG5jb25zdCBPS19TVEFUVVMgPSAyMDA7XG5cbmNvbnN0IGRlYnVnID0gZ2V0RGVidWcoJ2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInKTtcblxuZW51bSBMb2dpbkJhc2VSZXN1bHRzIHtcbiAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgVW5rbm93bkVycm9yID0gJ1VOS05PV05fRVJST1InXG59XG5cbmNvbnN0IHtcbiAgVGltZW91dCwgR2VuZXJpYywgR2VuZXJhbCwgLi4ucmVzdFxufSA9IFNjcmFwZXJFcnJvclR5cGVzO1xuZXhwb3J0IGNvbnN0IExvZ2luUmVzdWx0cyA9IHtcbiAgLi4ucmVzdCxcbiAgLi4uTG9naW5CYXNlUmVzdWx0cyxcbn07XG5cbmV4cG9ydCB0eXBlIExvZ2luUmVzdWx0cyA9IEV4Y2x1ZGU8U2NyYXBlckVycm9yVHlwZXMsXG5TY3JhcGVyRXJyb3JUeXBlcy5UaW1lb3V0XG58IFNjcmFwZXJFcnJvclR5cGVzLkdlbmVyaWNcbnwgU2NyYXBlckVycm9yVHlwZXMuR2VuZXJhbD4gfCBMb2dpbkJhc2VSZXN1bHRzO1xuXG5leHBvcnQgdHlwZSBQb3NzaWJsZUxvZ2luUmVzdWx0cyA9IHtcbiAgW2tleSBpbiBMb2dpblJlc3VsdHNdPzogKHN0cmluZyB8IFJlZ0V4cCB8ICgob3B0aW9ucz86IHsgcGFnZT86IFBhZ2V9KSA9PiBQcm9taXNlPGJvb2xlYW4+KSlbXVxufTtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dpbk9wdGlvbnMge1xuICBsb2dpblVybDogc3RyaW5nO1xuICBjaGVja1JlYWRpbmVzcz86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIGZpZWxkczoge3NlbGVjdG9yOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmd9W107XG4gIHN1Ym1pdEJ1dHRvblNlbGVjdG9yOiBzdHJpbmcgfCAoKCkgPT4gUHJvbWlzZTx2b2lkPik7XG4gIHByZUFjdGlvbj86ICgpID0+IFByb21pc2U8RnJhbWUgfCB2b2lkPjtcbiAgcG9zdEFjdGlvbj86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHBvc3NpYmxlUmVzdWx0czogUG9zc2libGVMb2dpblJlc3VsdHM7XG4gIHVzZXJBZ2VudD86IHN0cmluZztcbiAgd2FpdFVudGlsPzogTG9hZEV2ZW50O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRLZXlCeVZhbHVlKG9iamVjdDogUG9zc2libGVMb2dpblJlc3VsdHMsIHZhbHVlOiBzdHJpbmcsIHBhZ2U6IFBhZ2UpOiBQcm9taXNlPExvZ2luUmVzdWx0cz4ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBjb25kaXRpb25zID0gb2JqZWN0W2tleV07XG5cbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgIGlmIChjb25kaXRpb24gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmVzdWx0ID0gY29uZGl0aW9uLnRlc3QodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29uZGl0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGNvbmRpdGlvbih7IHBhZ2UsIHZhbHVlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gY29uZGl0aW9uLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShMb2dpblJlc3VsdHMuVW5rbm93bkVycm9yKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlR2VuZXJhbEVycm9yKCk6IFNjcmFwZXJTY3JhcGluZ1Jlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgc3VjY2VzczogZmFsc2UsXG4gICAgZXJyb3JUeXBlOiBTY3JhcGVyRXJyb3JUeXBlcy5HZW5lcmFsLFxuICB9O1xufVxuXG5jbGFzcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFRDcmVkZW50aWFscyBleHRlbmRzIFNjcmFwZXJDcmVkZW50aWFscz4gZXh0ZW5kcyBCYXNlU2NyYXBlcjxUQ3JlZGVudGlhbHM+IHtcbiAgLy8gTk9USUNFIC0gaXQgaXMgZGlzY291cmFnZWQgdG8gdXNlIGJhbmcgKCEpIGluIGdlbmVyYWwuIEl0IGlzIHVzZWQgaGVyZSBiZWNhdXNlXG4gIC8vIGFsbCB0aGUgY2xhc3NlcyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIGJhc2UgYXNzdW1lIGlzIGl0IG1hbmRhdG9yeS5cbiAgcHJvdGVjdGVkIGJyb3dzZXIhOiBCcm93c2VyO1xuXG4gIC8vIE5PVElDRSAtIGl0IGlzIGRpc2NvdXJhZ2VkIHRvIHVzZSBiYW5nICghKSBpbiBnZW5lcmFsLiBJdCBpcyB1c2VkIGhlcmUgYmVjYXVzZVxuICAvLyBhbGwgdGhlIGNsYXNzZXMgdGhhdCBpbmhlcml0IGZyb20gdGhpcyBiYXNlIGFzc3VtZSBpcyBpdCBtYW5kYXRvcnkuXG4gIHByb3RlY3RlZCBwYWdlITogUGFnZTtcblxuICBwcm90ZWN0ZWQgZ2V0Vmlld1BvcnQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiBWSUVXUE9SVF9XSURUSCxcbiAgICAgIGhlaWdodDogVklFV1BPUlRfSEVJR0hULFxuICAgIH07XG4gIH1cblxuICBhc3luYyBpbml0aWFsaXplKCkge1xuICAgIGF3YWl0IHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICBkZWJ1ZygnaW5pdGlhbGl6ZSBzY3JhcGVyJyk7XG4gICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuSW5pdGlhbGl6aW5nKTtcblxuICAgIGxldCBlbnY6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMub3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICBlbnYgPSB7IERFQlVHOiAnKicsIC4uLnByb2Nlc3MuZW52IH07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuYnJvd3NlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5vcHRpb25zLmJyb3dzZXIgIT09IG51bGwpIHtcbiAgICAgIGRlYnVnKCd1c2UgY3VzdG9tIGJyb3dzZXIgaW5zdGFuY2UgcHJvdmlkZWQgaW4gb3B0aW9ucycpO1xuICAgICAgdGhpcy5icm93c2VyID0gdGhpcy5vcHRpb25zLmJyb3dzZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4ZWN1dGFibGVQYXRoID0gdGhpcy5vcHRpb25zLmV4ZWN1dGFibGVQYXRoIHx8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzLm9wdGlvbnMuYXJncyB8fCBbXTtcbiAgICAgIGNvbnN0IHsgdGltZW91dCB9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICBjb25zdCBoZWFkbGVzcyA9ICF0aGlzLm9wdGlvbnMuc2hvd0Jyb3dzZXI7XG4gICAgICBkZWJ1ZyhgbGF1bmNoIGEgYnJvd3NlciB3aXRoIGhlYWRsZXNzIG1vZGUgPSAke2hlYWRsZXNzfWApO1xuICAgICAgdGhpcy5icm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCh7XG4gICAgICAgIGVudixcbiAgICAgICAgaGVhZGxlc3MsXG4gICAgICAgIGV4ZWN1dGFibGVQYXRoLFxuICAgICAgICBhcmdzLFxuICAgICAgICB0aW1lb3V0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcmVwYXJlQnJvd3Nlcikge1xuICAgICAgZGVidWcoJ2V4ZWN1dGUgXFwncHJlcGFyZUJyb3dzZXJcXCcgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gb3B0aW9ucycpO1xuICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLnByZXBhcmVCcm93c2VyKHRoaXMuYnJvd3Nlcik7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmJyb3dzZXIpIHtcbiAgICAgIGRlYnVnKCdmYWlsZWQgdG8gaW5pdGlhdGUgYSBicm93c2VyLCBleGl0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZXMgPSBhd2FpdCB0aGlzLmJyb3dzZXIucGFnZXMoKTtcbiAgICBpZiAocGFnZXMubGVuZ3RoKSB7XG4gICAgICBkZWJ1ZygnYnJvd3NlciBoYXMgYWxyZWFkeSBwYWdlcyBvcGVuLCB1c2UgdGhlIGZpcnN0IG9uZScpO1xuICAgICAgW3RoaXMucGFnZV0gPSBwYWdlcztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoJ2NyZWF0ZSBhIG5ldyBicm93c2VyIHBhZ2UnKTtcbiAgICAgIHRoaXMucGFnZSA9IGF3YWl0IHRoaXMuYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kZWZhdWx0VGltZW91dCkge1xuICAgICAgdGhpcy5wYWdlLnNldERlZmF1bHRUaW1lb3V0KHRoaXMub3B0aW9ucy5kZWZhdWx0VGltZW91dCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcmVwYXJlUGFnZSkge1xuICAgICAgZGVidWcoJ2V4ZWN1dGUgXFwncHJlcGFyZVBhZ2VcXCcgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gb3B0aW9ucycpO1xuICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLnByZXBhcmVQYWdlKHRoaXMucGFnZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLmdldFZpZXdQb3J0KCk7XG4gICAgZGVidWcoYHNldCB2aWV3cG9ydCB0byB3aWR0aCAke3ZpZXdwb3J0LndpZHRofSwgaGVpZ2h0ICR7dmlld3BvcnQuaGVpZ2h0fWApO1xuICAgIGF3YWl0IHRoaXMucGFnZS5zZXRWaWV3cG9ydCh7XG4gICAgICB3aWR0aDogdmlld3BvcnQud2lkdGgsXG4gICAgICBoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCxcbiAgICB9KTtcblxuICAgIHRoaXMucGFnZS5vbigncmVxdWVzdGZhaWxlZCcsIChyZXF1ZXN0KSA9PiB7XG4gICAgICBkZWJ1ZygnUmVxdWVzdCBmYWlsZWQ6ICVzICVzJywgcmVxdWVzdC5mYWlsdXJlKCk/LmVycm9yVGV4dCwgcmVxdWVzdC51cmwoKSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBuYXZpZ2F0ZVRvKHVybDogc3RyaW5nLCBwYWdlPzogUGFnZSwgdGltZW91dD86IG51bWJlciwgd2FpdFVudGlsOiBMb2FkRXZlbnQgfCB1bmRlZmluZWQgPSAnbG9hZCcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYWdlVG9Vc2UgPSBwYWdlIHx8IHRoaXMucGFnZTtcblxuICAgIGlmICghcGFnZVRvVXNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4uKHRpbWVvdXQgPT09IG51bGwgPyBudWxsIDogeyB0aW1lb3V0IH0pLCB3YWl0VW50aWwgfTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBhZ2VUb1VzZS5nb3RvKHVybCwgb3B0aW9ucyk7XG5cbiAgICAvLyBub3RlOiByZXNwb25zZSB3aWxsIGJlIG51bGwgd2hlbiBuYXZpZ2F0aW5nIHRvIHNhbWUgdXJsIHdoaWxlIGNoYW5naW5nIHRoZSBoYXNoIHBhcnQuIHRoZSBjb25kaXRpb24gYmVsb3cgd2lsbCBhbHdheXMgYWNjZXB0IG51bGwgYXMgdmFsaWQgcmVzdWx0LlxuICAgIGlmIChyZXNwb25zZSAhPT0gbnVsbCAmJiAocmVzcG9uc2UgPT09IHVuZGVmaW5lZCB8fCByZXNwb25zZS5zdGF0dXMoKSAhPT0gT0tfU1RBVFVTKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSB0cnlpbmcgdG8gbmF2aWdhdGUgdG8gdXJsICR7dXJsfWApO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZ2V0TG9naW5PcHRpb25zKF9jcmVkZW50aWFsczogU2NyYXBlckNyZWRlbnRpYWxzKTogTG9naW5PcHRpb25zIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGdldExvZ2luT3B0aW9ucygpIGlzIG5vdCBjcmVhdGVkIGluICR7dGhpcy5vcHRpb25zLmNvbXBhbnlJZH1gKTtcbiAgfVxuXG4gIGFzeW5jIGZpbGxJbnB1dHMocGFnZU9yRnJhbWU6IFBhZ2UgfCBGcmFtZSwgZmllbGRzOiB7IHNlbGVjdG9yOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmd9W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtb2RpZmllZCA9IFsuLi5maWVsZHNdO1xuICAgIGNvbnN0IGlucHV0ID0gbW9kaWZpZWQuc2hpZnQoKTtcblxuICAgIGlmICghaW5wdXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZmlsbElucHV0KHBhZ2VPckZyYW1lLCBpbnB1dC5zZWxlY3RvciwgaW5wdXQudmFsdWUpO1xuICAgIGlmIChtb2RpZmllZC5sZW5ndGgpIHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsbElucHV0cyhwYWdlT3JGcmFtZSwgbW9kaWZpZWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxvZ2luKGNyZWRlbnRpYWxzOiBTY3JhcGVyQ3JlZGVudGlhbHMpOiBQcm9taXNlPFNjcmFwZXJTY3JhcGluZ1Jlc3VsdD4ge1xuICAgIGlmICghY3JlZGVudGlhbHMgfHwgIXRoaXMucGFnZSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUdlbmVyYWxFcnJvcigpO1xuICAgIH1cblxuICAgIGRlYnVnKCdleGVjdXRlIGxvZ2luIHByb2Nlc3MnKTtcbiAgICBjb25zdCBsb2dpbk9wdGlvbnMgPSB0aGlzLmdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFscyk7XG5cbiAgICBpZiAobG9naW5PcHRpb25zLnVzZXJBZ2VudCkge1xuICAgICAgZGVidWcoJ3NldCBjdXN0b20gdXNlciBhZ2VudCBwcm92aWRlZCBpbiBvcHRpb25zJyk7XG4gICAgICBhd2FpdCB0aGlzLnBhZ2Uuc2V0VXNlckFnZW50KGxvZ2luT3B0aW9ucy51c2VyQWdlbnQpO1xuICAgIH1cblxuICAgIGRlYnVnKCduYXZpZ2F0ZSB0byBsb2dpbiB1cmwnKTtcbiAgICBhd2FpdCB0aGlzLm5hdmlnYXRlVG8obG9naW5PcHRpb25zLmxvZ2luVXJsLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbG9naW5PcHRpb25zLndhaXRVbnRpbCk7XG4gICAgaWYgKGxvZ2luT3B0aW9ucy5jaGVja1JlYWRpbmVzcykge1xuICAgICAgZGVidWcoJ2V4ZWN1dGUgXFwnY2hlY2tSZWFkaW5lc3NcXCcgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9ucycpO1xuICAgICAgYXdhaXQgbG9naW5PcHRpb25zLmNoZWNrUmVhZGluZXNzKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgZGVidWcoJ3dhaXQgdW50aWwgc3VibWl0IGJ1dHRvbiBpcyBhdmFpbGFibGUnKTtcbiAgICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZCh0aGlzLnBhZ2UsIGxvZ2luT3B0aW9ucy5zdWJtaXRCdXR0b25TZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgbGV0IGxvZ2luRnJhbWVPclBhZ2U6IChQYWdlIHwgRnJhbWUgfCBudWxsKSA9IHRoaXMucGFnZTtcbiAgICBpZiAobG9naW5PcHRpb25zLnByZUFjdGlvbikge1xuICAgICAgZGVidWcoJ2V4ZWN1dGUgXFwncHJlQWN0aW9uXFwnIGludGVyY2VwdG9yIHByb3ZpZGVkIGluIGxvZ2luIG9wdGlvbnMnKTtcbiAgICAgIGxvZ2luRnJhbWVPclBhZ2UgPSBhd2FpdCBsb2dpbk9wdGlvbnMucHJlQWN0aW9uKCkgfHwgdGhpcy5wYWdlO1xuICAgIH1cblxuICAgIGRlYnVnKCdmaWxsIGxvZ2luIGNvbXBvbmVudHMgaW5wdXQgd2l0aCByZWxldmFudCB2YWx1ZXMnKTtcbiAgICBhd2FpdCB0aGlzLmZpbGxJbnB1dHMobG9naW5GcmFtZU9yUGFnZSwgbG9naW5PcHRpb25zLmZpZWxkcyk7XG4gICAgZGVidWcoJ2NsaWNrIG9uIGxvZ2luIHN1Ym1pdCBidXR0b24nKTtcbiAgICBpZiAodHlwZW9mIGxvZ2luT3B0aW9ucy5zdWJtaXRCdXR0b25TZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGF3YWl0IGNsaWNrQnV0dG9uKGxvZ2luRnJhbWVPclBhZ2UsIGxvZ2luT3B0aW9ucy5zdWJtaXRCdXR0b25TZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGxvZ2luT3B0aW9ucy5zdWJtaXRCdXR0b25TZWxlY3RvcigpO1xuICAgIH1cbiAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Mb2dnaW5nSW4pO1xuXG4gICAgaWYgKGxvZ2luT3B0aW9ucy5wb3N0QWN0aW9uKSB7XG4gICAgICBkZWJ1ZygnZXhlY3V0ZSBcXCdwb3N0QWN0aW9uXFwnIGludGVyY2VwdG9yIHByb3ZpZGVkIGluIGxvZ2luIG9wdGlvbnMnKTtcbiAgICAgIGF3YWl0IGxvZ2luT3B0aW9ucy5wb3N0QWN0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCd3YWl0IGZvciBwYWdlIG5hdmlnYXRpb24nKTtcbiAgICAgIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHRoaXMucGFnZSk7XG4gICAgfVxuXG4gICAgZGVidWcoJ2NoZWNrIGxvZ2luIHJlc3VsdCcpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBnZXRDdXJyZW50VXJsKHRoaXMucGFnZSwgdHJ1ZSk7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBnZXRLZXlCeVZhbHVlKGxvZ2luT3B0aW9ucy5wb3NzaWJsZVJlc3VsdHMsIGN1cnJlbnQsIHRoaXMucGFnZSk7XG4gICAgZGVidWcoYGhhbmRsZSBsb2dpbiByZXN1bHRzICR7bG9naW5SZXN1bHR9YCk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9naW5SZXN1bHQobG9naW5SZXN1bHQpO1xuICB9XG5cbiAgYXN5bmMgdGVybWluYXRlKF9zdWNjZXNzOiBib29sZWFuKSB7XG4gICAgZGVidWcoYHRlcm1pbmF0aW5nIGJyb3dzZXIgd2l0aCBzdWNjZXNzID0gJHtfc3VjY2Vzc31gKTtcbiAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5UZXJtaW5hdGluZyk7XG5cbiAgICBpZiAoIV9zdWNjZXNzICYmICEhdGhpcy5vcHRpb25zLnN0b3JlRmFpbHVyZVNjcmVlblNob3RQYXRoKSB7XG4gICAgICBkZWJ1ZyhgY3JlYXRlIGEgc25hcHNob3QgYmVmb3JlIHRlcm1pbmF0ZWQgaW4gJHt0aGlzLm9wdGlvbnMuc3RvcmVGYWlsdXJlU2NyZWVuU2hvdFBhdGh9YCk7XG4gICAgICBhd2FpdCB0aGlzLnBhZ2Uuc2NyZWVuc2hvdCh7XG4gICAgICAgIHBhdGg6IHRoaXMub3B0aW9ucy5zdG9yZUZhaWx1cmVTY3JlZW5TaG90UGF0aCxcbiAgICAgICAgZnVsbFBhZ2U6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVMb2dpblJlc3VsdChsb2dpblJlc3VsdDogTG9naW5SZXN1bHRzKSB7XG4gICAgc3dpdGNoIChsb2dpblJlc3VsdCkge1xuICAgICAgY2FzZSBMb2dpblJlc3VsdHMuU3VjY2VzczpcbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuTG9naW5TdWNjZXNzKTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgY2FzZSBMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkOlxuICAgICAgY2FzZSBMb2dpblJlc3VsdHMuVW5rbm93bkVycm9yOlxuICAgICAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Mb2dpbkZhaWxlZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3JUeXBlOiBsb2dpblJlc3VsdCA9PT0gTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZCA/IFNjcmFwZXJFcnJvclR5cGVzLkludmFsaWRQYXNzd29yZCA6XG4gICAgICAgICAgICBTY3JhcGVyRXJyb3JUeXBlcy5HZW5lcmFsLFxuICAgICAgICAgIGVycm9yTWVzc2FnZTogYExvZ2luIGZhaWxlZCB3aXRoICR7bG9naW5SZXN1bHR9IGVycm9yYCxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgTG9naW5SZXN1bHRzLkNoYW5nZVBhc3N3b3JkOlxuICAgICAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5DaGFuZ2VQYXNzd29yZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3JUeXBlOiBTY3JhcGVyRXJyb3JUeXBlcy5DaGFuZ2VQYXNzd29yZCxcbiAgICAgICAgfTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBsb2dpbiByZXN1bHQgXCIke2xvZ2luUmVzdWx0fVwiYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIgfTtcbiJdLCJt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
|
|
@@ -1,25 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
require("core-js/modules/es.promise");
|
|
4
|
-
|
|
5
4
|
var _testsUtils = require("../tests/tests-utils");
|
|
6
|
-
|
|
7
5
|
var _baseScraperWithBrowser = require("./base-scraper-with-browser");
|
|
8
|
-
|
|
9
6
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
10
|
-
|
|
11
7
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
12
|
-
|
|
13
8
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
14
|
-
|
|
15
9
|
const testsConfig = (0, _testsUtils.getTestsConfig)();
|
|
16
|
-
|
|
17
10
|
function isNoSandbox(browser) {
|
|
18
11
|
// eslint-disable-next-line no-underscore-dangle
|
|
19
12
|
const args = browser._process.spawnargs;
|
|
20
13
|
return args.includes('--no-sandbox');
|
|
21
14
|
}
|
|
22
|
-
|
|
23
15
|
describe('Base scraper with browser', () => {
|
|
24
16
|
beforeAll(() => {
|
|
25
17
|
(0, _testsUtils.extendAsyncTimeout)(); // The default timeout is 5 seconds per async test, this function extends the timeout value
|
|
@@ -29,32 +21,30 @@ describe('Base scraper with browser', () => {
|
|
|
29
21
|
companyId: 'test',
|
|
30
22
|
showBrowser: false,
|
|
31
23
|
args: []
|
|
32
|
-
});
|
|
33
|
-
|
|
24
|
+
});
|
|
34
25
|
|
|
26
|
+
// avoid false-positive result by confirming that --no-sandbox is not a default flag provided by puppeteer
|
|
35
27
|
let baseScraperWithBrowser = new _baseScraperWithBrowser.BaseScraperWithBrowser(options);
|
|
36
|
-
|
|
37
28
|
try {
|
|
38
|
-
await baseScraperWithBrowser.initialize();
|
|
39
|
-
|
|
40
|
-
expect(baseScraperWithBrowser.browser).toBeDefined();
|
|
41
|
-
|
|
29
|
+
await baseScraperWithBrowser.initialize();
|
|
30
|
+
// @ts-ignore
|
|
31
|
+
expect(baseScraperWithBrowser.browser).toBeDefined();
|
|
32
|
+
// @ts-ignore
|
|
42
33
|
expect(isNoSandbox(baseScraperWithBrowser.browser)).toBe(false);
|
|
43
34
|
await baseScraperWithBrowser.terminate(true);
|
|
44
35
|
} catch (e) {
|
|
45
36
|
await baseScraperWithBrowser.terminate(false);
|
|
46
37
|
throw e;
|
|
47
|
-
}
|
|
48
|
-
|
|
38
|
+
}
|
|
49
39
|
|
|
40
|
+
// set --no-sandbox flag and expect it to be passed by puppeteer.lunch to the new created browser instance
|
|
50
41
|
options.args = ['--no-sandbox', '--disable-gpu', '--window-size=1920x1080'];
|
|
51
42
|
baseScraperWithBrowser = new _baseScraperWithBrowser.BaseScraperWithBrowser(options);
|
|
52
|
-
|
|
53
43
|
try {
|
|
54
|
-
await baseScraperWithBrowser.initialize();
|
|
55
|
-
|
|
56
|
-
expect(baseScraperWithBrowser.browser).toBeDefined();
|
|
57
|
-
|
|
44
|
+
await baseScraperWithBrowser.initialize();
|
|
45
|
+
// @ts-ignore
|
|
46
|
+
expect(baseScraperWithBrowser.browser).toBeDefined();
|
|
47
|
+
// @ts-ignore
|
|
58
48
|
expect(isNoSandbox(baseScraperWithBrowser.browser)).toBe(true);
|
|
59
49
|
await baseScraperWithBrowser.terminate(true);
|
|
60
50
|
} catch (e) {
|
|
@@ -63,4 +53,4 @@ describe('Base scraper with browser', () => {
|
|
|
63
53
|
}
|
|
64
54
|
});
|
|
65
55
|
});
|
|
66
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
56
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdHNVdGlscyIsInJlcXVpcmUiLCJfYmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsIm93bktleXMiLCJvYmplY3QiLCJlbnVtZXJhYmxlT25seSIsImtleXMiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJzeW1ib2xzIiwiZmlsdGVyIiwic3ltIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJ0YXJnZXQiLCJpIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwiZm9yRWFjaCIsImtleSIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJvYmoiLCJ2YWx1ZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwidGVzdHNDb25maWciLCJnZXRUZXN0c0NvbmZpZyIsImlzTm9TYW5kYm94IiwiYnJvd3NlciIsImFyZ3MiLCJfcHJvY2VzcyIsInNwYXduYXJncyIsImluY2x1ZGVzIiwiZGVzY3JpYmUiLCJiZWZvcmVBbGwiLCJleHRlbmRBc3luY1RpbWVvdXQiLCJ4dGVzdCIsIm9wdGlvbnMiLCJjb21wYW55SWQiLCJzaG93QnJvd3NlciIsImJhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiaW5pdGlhbGl6ZSIsImV4cGVjdCIsInRvQmVEZWZpbmVkIiwidG9CZSIsInRlcm1pbmF0ZSIsImUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlci50ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGV4dGVuZEFzeW5jVGltZW91dCwgZ2V0VGVzdHNDb25maWcsXG59IGZyb20gJy4uL3Rlc3RzL3Rlc3RzLXV0aWxzJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIgfSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuXG5jb25zdCB0ZXN0c0NvbmZpZyA9IGdldFRlc3RzQ29uZmlnKCk7XG5cbmZ1bmN0aW9uIGlzTm9TYW5kYm94KGJyb3dzZXI6IGFueSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgY29uc3QgYXJncyA9IGJyb3dzZXIuX3Byb2Nlc3Muc3Bhd25hcmdzO1xuICByZXR1cm4gYXJncy5pbmNsdWRlcygnLS1uby1zYW5kYm94Jyk7XG59XG5cbmRlc2NyaWJlKCdCYXNlIHNjcmFwZXIgd2l0aCBicm93c2VyJywgKCkgPT4ge1xuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIGV4dGVuZEFzeW5jVGltZW91dCgpOyAvLyBUaGUgZGVmYXVsdCB0aW1lb3V0IGlzIDUgc2Vjb25kcyBwZXIgYXN5bmMgdGVzdCwgdGhpcyBmdW5jdGlvbiBleHRlbmRzIHRoZSB0aW1lb3V0IHZhbHVlXG4gIH0pO1xuXG4gIHh0ZXN0KCdzaG91bGQgcGFzcyBjdXN0b20gYXJncyB0byBzY3JhcGVyIGlmIHByb3ZpZGVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAuLi50ZXN0c0NvbmZpZy5vcHRpb25zLFxuICAgICAgY29tcGFueUlkOiAndGVzdCcsXG4gICAgICBzaG93QnJvd3NlcjogZmFsc2UsXG4gICAgICBhcmdzOiBbXSxcbiAgICB9O1xuXG4gICAgLy8gYXZvaWQgZmFsc2UtcG9zaXRpdmUgcmVzdWx0IGJ5IGNvbmZpcm1pbmcgdGhhdCAtLW5vLXNhbmRib3ggaXMgbm90IGEgZGVmYXVsdCBmbGFnIHByb3ZpZGVkIGJ5IHB1cHBldGVlclxuICAgIGxldCBiYXNlU2NyYXBlcldpdGhCcm93c2VyID0gbmV3IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIob3B0aW9ucyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZXhwZWN0KGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIuYnJvd3NlcikudG9CZURlZmluZWQoKTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGV4cGVjdChpc05vU2FuZGJveChiYXNlU2NyYXBlcldpdGhCcm93c2VyLmJyb3dzZXIpKS50b0JlKGZhbHNlKTtcbiAgICAgIGF3YWl0IGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIudGVybWluYXRlKHRydWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIudGVybWluYXRlKGZhbHNlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgLy8gc2V0IC0tbm8tc2FuZGJveCBmbGFnIGFuZCBleHBlY3QgaXQgdG8gYmUgcGFzc2VkIGJ5IHB1cHBldGVlci5sdW5jaCB0byB0aGUgbmV3IGNyZWF0ZWQgYnJvd3NlciBpbnN0YW5jZVxuICAgIG9wdGlvbnMuYXJncyA9IFtcbiAgICAgICctLW5vLXNhbmRib3gnLFxuICAgICAgJy0tZGlzYWJsZS1ncHUnLFxuICAgICAgJy0td2luZG93LXNpemU9MTkyMHgxMDgwJyxcbiAgICBdO1xuICAgIGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIgPSBuZXcgQmFzZVNjcmFwZXJXaXRoQnJvd3NlcihvcHRpb25zKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYmFzZVNjcmFwZXJXaXRoQnJvd3Nlci5pbml0aWFsaXplKCk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBleHBlY3QoYmFzZVNjcmFwZXJXaXRoQnJvd3Nlci5icm93c2VyKS50b0JlRGVmaW5lZCgpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZXhwZWN0KGlzTm9TYW5kYm94KGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIuYnJvd3NlcikpLnRvQmUodHJ1ZSk7XG4gICAgICBhd2FpdCBiYXNlU2NyYXBlcldpdGhCcm93c2VyLnRlcm1pbmF0ZSh0cnVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCBiYXNlU2NyYXBlcldpdGhCcm93c2VyLnRlcm1pbmF0ZShmYWxzZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsV0FBQSxHQUFBQyxPQUFBO0FBR0EsSUFBQUMsdUJBQUEsR0FBQUQsT0FBQTtBQUFxRSxTQUFBRSxRQUFBQyxNQUFBLEVBQUFDLGNBQUEsUUFBQUMsSUFBQSxHQUFBQyxNQUFBLENBQUFELElBQUEsQ0FBQUYsTUFBQSxPQUFBRyxNQUFBLENBQUFDLHFCQUFBLFFBQUFDLE9BQUEsR0FBQUYsTUFBQSxDQUFBQyxxQkFBQSxDQUFBSixNQUFBLE9BQUFDLGNBQUEsRUFBQUksT0FBQSxHQUFBQSxPQUFBLENBQUFDLE1BQUEsV0FBQUMsR0FBQSxXQUFBSixNQUFBLENBQUFLLHdCQUFBLENBQUFSLE1BQUEsRUFBQU8sR0FBQSxFQUFBRSxVQUFBLE1BQUFQLElBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULElBQUEsRUFBQUcsT0FBQSxZQUFBSCxJQUFBO0FBQUEsU0FBQVUsY0FBQUMsTUFBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLEVBQUFGLENBQUEsVUFBQUcsTUFBQSxHQUFBRixTQUFBLENBQUFELENBQUEsWUFBQUMsU0FBQSxDQUFBRCxDQUFBLFlBQUFBLENBQUEsUUFBQWYsT0FBQSxDQUFBSSxNQUFBLENBQUFjLE1BQUEsU0FBQUMsT0FBQSxXQUFBQyxHQUFBLElBQUFDLGVBQUEsQ0FBQVAsTUFBQSxFQUFBTSxHQUFBLEVBQUFGLE1BQUEsQ0FBQUUsR0FBQSxtQkFBQWhCLE1BQUEsQ0FBQWtCLHlCQUFBLElBQUFsQixNQUFBLENBQUFtQixnQkFBQSxDQUFBVCxNQUFBLEVBQUFWLE1BQUEsQ0FBQWtCLHlCQUFBLENBQUFKLE1BQUEsYUFBQWxCLE9BQUEsQ0FB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
|