israeli-bank-scrapers 6.1.1 → 6.1.2
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/lib/assertNever.js +7 -5
- package/lib/constants.js +16 -13
- package/lib/definitions.js +113 -109
- package/lib/helpers/browser.js +13 -9
- package/lib/helpers/dates.js +19 -18
- package/lib/helpers/debug.js +9 -9
- package/lib/helpers/elements-interactions.js +82 -78
- package/lib/helpers/fetch.js +85 -82
- package/lib/helpers/navigation.js +28 -24
- package/lib/helpers/storage.js +11 -10
- package/lib/helpers/transactions.js +32 -33
- package/lib/helpers/waiting.js +42 -45
- package/lib/index.js +82 -15
- package/lib/scrapers/amex.js +13 -11
- package/lib/scrapers/amex.test.d.ts +1 -0
- package/lib/scrapers/amex.test.js +49 -0
- package/lib/scrapers/base-beinleumi-group.js +239 -233
- package/lib/scrapers/base-isracard-amex.js +273 -273
- package/lib/scrapers/base-scraper-with-browser.js +263 -241
- package/lib/scrapers/base-scraper-with-browser.test.d.ts +1 -0
- package/lib/scrapers/base-scraper-with-browser.test.js +53 -0
- package/lib/scrapers/base-scraper.js +82 -82
- package/lib/scrapers/behatsdaa.js +103 -98
- package/lib/scrapers/behatsdaa.test.d.ts +1 -0
- package/lib/scrapers/behatsdaa.test.js +46 -0
- package/lib/scrapers/beinleumi.js +13 -11
- package/lib/scrapers/beinleumi.test.d.ts +1 -0
- package/lib/scrapers/beinleumi.test.js +47 -0
- package/lib/scrapers/beyahad-bishvilha.js +132 -132
- package/lib/scrapers/beyahad-bishvilha.test.d.ts +1 -0
- package/lib/scrapers/beyahad-bishvilha.test.js +47 -0
- package/lib/scrapers/discount.js +101 -97
- package/lib/scrapers/discount.test.d.ts +1 -0
- package/lib/scrapers/discount.test.js +49 -0
- package/lib/scrapers/errors.js +25 -22
- package/lib/scrapers/factory.js +67 -66
- package/lib/scrapers/factory.test.d.ts +1 -0
- package/lib/scrapers/factory.test.js +19 -0
- package/lib/scrapers/hapoalim.js +175 -162
- package/lib/scrapers/hapoalim.test.d.ts +1 -0
- package/lib/scrapers/hapoalim.test.js +47 -0
- package/lib/scrapers/interface.js +5 -2
- package/lib/scrapers/isracard.js +13 -11
- package/lib/scrapers/isracard.test.d.ts +1 -0
- package/lib/scrapers/isracard.test.js +49 -0
- package/lib/scrapers/leumi.js +170 -167
- package/lib/scrapers/leumi.test.d.ts +1 -0
- package/lib/scrapers/leumi.test.js +47 -0
- package/lib/scrapers/massad.js +13 -11
- package/lib/scrapers/max.js +261 -261
- package/lib/scrapers/max.test.d.ts +1 -0
- package/lib/scrapers/max.test.js +65 -0
- package/lib/scrapers/mercantile.js +16 -14
- package/lib/scrapers/mercantile.test.d.ts +1 -0
- package/lib/scrapers/mercantile.test.js +45 -0
- package/lib/scrapers/mizrahi.js +154 -158
- package/lib/scrapers/mizrahi.test.d.ts +1 -0
- package/lib/scrapers/mizrahi.test.js +53 -0
- package/lib/scrapers/one-zero-queries.js +7 -4
- package/lib/scrapers/one-zero.js +221 -176
- package/lib/scrapers/one-zero.test.d.ts +1 -0
- package/lib/scrapers/one-zero.test.js +51 -0
- package/lib/scrapers/otsar-hahayal.js +13 -11
- package/lib/scrapers/otsar-hahayal.test.d.ts +1 -0
- package/lib/scrapers/otsar-hahayal.test.js +47 -0
- package/lib/scrapers/pagi.js +13 -11
- package/lib/scrapers/pagi.test.d.ts +1 -0
- package/lib/scrapers/pagi.test.js +47 -0
- package/lib/scrapers/union-bank.js +173 -172
- package/lib/scrapers/union-bank.test.d.ts +1 -0
- package/lib/scrapers/union-bank.test.js +47 -0
- package/lib/scrapers/visa-cal.js +250 -254
- package/lib/scrapers/visa-cal.test.d.ts +1 -0
- package/lib/scrapers/visa-cal.test.js +49 -0
- package/lib/scrapers/yahav.js +206 -190
- package/lib/scrapers/yahav.test.d.ts +1 -0
- package/lib/scrapers/yahav.test.js +49 -0
- package/lib/transactions.js +16 -13
- package/package.json +8 -3
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
exports.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createLoginFields = createLoginFields;
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
exports.getPossibleLoginResults = getPossibleLoginResults;
|
|
9
|
+
exports.waitForPostLogin = waitForPostLogin;
|
|
10
|
+
var _moment = _interopRequireDefault(require("moment"));
|
|
11
|
+
var _constants = require("../constants");
|
|
12
|
+
var _elementsInteractions = require("../helpers/elements-interactions");
|
|
13
|
+
var _navigation = require("../helpers/navigation");
|
|
14
|
+
var _waiting = require("../helpers/waiting");
|
|
15
|
+
var _transactions = require("../transactions");
|
|
16
|
+
var _baseScraperWithBrowser = require("./base-scraper-with-browser");
|
|
17
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
18
|
const DATE_FORMAT = 'DD/MM/YYYY';
|
|
15
19
|
const NO_TRANSACTION_IN_DATE_RANGE_TEXT = 'לא נמצאו נתונים בנושא המבוקש';
|
|
16
20
|
const DATE_COLUMN_CLASS_COMPLETED = 'date first';
|
|
@@ -30,286 +34,288 @@ const NEXT_PAGE_LINK = 'a#Npage.paging';
|
|
|
30
34
|
const CURRENT_BALANCE = '.main_balance';
|
|
31
35
|
const IFRAME_NAME = 'iframe-old-pages';
|
|
32
36
|
function getPossibleLoginResults() {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
const urls = {};
|
|
38
|
+
urls[_baseScraperWithBrowser.LoginResults.Success] = [/fibi.*accountSummary/,
|
|
39
|
+
// New UI pattern
|
|
40
|
+
/FibiMenu\/Online/ // Old UI pattern
|
|
41
|
+
];
|
|
42
|
+
urls[_baseScraperWithBrowser.LoginResults.InvalidPassword] = [/FibiMenu\/Marketing\/Private\/Home/];
|
|
43
|
+
return urls;
|
|
40
44
|
}
|
|
41
|
-
exports.getPossibleLoginResults = getPossibleLoginResults;
|
|
42
45
|
function createLoginFields(credentials) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
return [{
|
|
47
|
+
selector: '#username',
|
|
48
|
+
value: credentials.username
|
|
49
|
+
}, {
|
|
50
|
+
selector: '#password',
|
|
51
|
+
value: credentials.password
|
|
52
|
+
}];
|
|
47
53
|
}
|
|
48
|
-
exports.createLoginFields = createLoginFields;
|
|
49
54
|
function getAmountData(amountStr) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
let amountStrCopy = amountStr.replace(_constants.SHEKEL_CURRENCY_SYMBOL, '');
|
|
56
|
+
amountStrCopy = amountStrCopy.replaceAll(',', '');
|
|
57
|
+
return parseFloat(amountStrCopy);
|
|
53
58
|
}
|
|
54
59
|
function getTxnAmount(txn) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
60
|
+
const credit = getAmountData(txn.credit);
|
|
61
|
+
const debit = getAmountData(txn.debit);
|
|
62
|
+
return (Number.isNaN(credit) ? 0 : credit) - (Number.isNaN(debit) ? 0 : debit);
|
|
58
63
|
}
|
|
59
64
|
function convertTransactions(txns) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
65
|
+
return txns.map(txn => {
|
|
66
|
+
const convertedDate = (0, _moment.default)(txn.date, DATE_FORMAT).toISOString();
|
|
67
|
+
const convertedAmount = getTxnAmount(txn);
|
|
68
|
+
return {
|
|
69
|
+
type: _transactions.TransactionTypes.Normal,
|
|
70
|
+
identifier: txn.reference ? parseInt(txn.reference, 10) : undefined,
|
|
71
|
+
date: convertedDate,
|
|
72
|
+
processedDate: convertedDate,
|
|
73
|
+
originalAmount: convertedAmount,
|
|
74
|
+
originalCurrency: _constants.SHEKEL_CURRENCY,
|
|
75
|
+
chargedAmount: convertedAmount,
|
|
76
|
+
status: txn.status,
|
|
77
|
+
description: txn.description,
|
|
78
|
+
memo: txn.memo
|
|
79
|
+
};
|
|
80
|
+
});
|
|
76
81
|
}
|
|
77
82
|
function getTransactionDate(tds, transactionType, transactionsColsTypes) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
83
|
+
if (transactionType === 'completed') {
|
|
84
|
+
return (tds[transactionsColsTypes[DATE_COLUMN_CLASS_COMPLETED]] || '').trim();
|
|
85
|
+
}
|
|
86
|
+
return (tds[transactionsColsTypes[DATE_COLUMN_CLASS_PENDING]] || '').trim();
|
|
82
87
|
}
|
|
83
88
|
function getTransactionDescription(tds, transactionType, transactionsColsTypes) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
89
|
+
if (transactionType === 'completed') {
|
|
90
|
+
return (tds[transactionsColsTypes[DESCRIPTION_COLUMN_CLASS_COMPLETED]] || '').trim();
|
|
91
|
+
}
|
|
92
|
+
return (tds[transactionsColsTypes[DESCRIPTION_COLUMN_CLASS_PENDING]] || '').trim();
|
|
88
93
|
}
|
|
89
94
|
function getTransactionReference(tds, transactionsColsTypes) {
|
|
90
|
-
|
|
95
|
+
return (tds[transactionsColsTypes[REFERENCE_COLUMN_CLASS]] || '').trim();
|
|
91
96
|
}
|
|
92
97
|
function getTransactionDebit(tds, transactionsColsTypes) {
|
|
93
|
-
|
|
98
|
+
return (tds[transactionsColsTypes[DEBIT_COLUMN_CLASS]] || '').trim();
|
|
94
99
|
}
|
|
95
100
|
function getTransactionCredit(tds, transactionsColsTypes) {
|
|
96
|
-
|
|
101
|
+
return (tds[transactionsColsTypes[CREDIT_COLUMN_CLASS]] || '').trim();
|
|
97
102
|
}
|
|
98
103
|
function extractTransactionDetails(txnRow, transactionStatus, transactionsColsTypes) {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
104
|
+
const tds = txnRow.innerTds;
|
|
105
|
+
const item = {
|
|
106
|
+
status: transactionStatus,
|
|
107
|
+
date: getTransactionDate(tds, transactionStatus, transactionsColsTypes),
|
|
108
|
+
description: getTransactionDescription(tds, transactionStatus, transactionsColsTypes),
|
|
109
|
+
reference: getTransactionReference(tds, transactionsColsTypes),
|
|
110
|
+
debit: getTransactionDebit(tds, transactionsColsTypes),
|
|
111
|
+
credit: getTransactionCredit(tds, transactionsColsTypes)
|
|
112
|
+
};
|
|
113
|
+
return item;
|
|
109
114
|
}
|
|
110
115
|
async function getTransactionsColsTypeClasses(page, tableLocator) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
116
|
+
const result = {};
|
|
117
|
+
const typeClassesObjs = await (0, _elementsInteractions.pageEvalAll)(page, `${tableLocator} tbody tr:first-of-type td`, null, tds => {
|
|
118
|
+
return tds.map((td, index) => ({
|
|
119
|
+
colClass: td.getAttribute('class'),
|
|
120
|
+
index
|
|
121
|
+
}));
|
|
122
|
+
});
|
|
123
|
+
for (const typeClassObj of typeClassesObjs) {
|
|
124
|
+
if (typeClassObj.colClass) {
|
|
125
|
+
result[typeClassObj.colClass] = typeClassObj.index;
|
|
122
126
|
}
|
|
123
|
-
|
|
127
|
+
}
|
|
128
|
+
return result;
|
|
124
129
|
}
|
|
125
130
|
function extractTransaction(txns, transactionStatus, txnRow, transactionsColsTypes) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
131
|
+
const txn = extractTransactionDetails(txnRow, transactionStatus, transactionsColsTypes);
|
|
132
|
+
if (txn.date !== '') {
|
|
133
|
+
txns.push(txn);
|
|
134
|
+
}
|
|
130
135
|
}
|
|
131
136
|
async function extractTransactions(page, tableLocator, transactionStatus) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
137
|
+
const txns = [];
|
|
138
|
+
const transactionsColsTypes = await getTransactionsColsTypeClasses(page, tableLocator);
|
|
139
|
+
const transactionsRows = await (0, _elementsInteractions.pageEvalAll)(page, `${tableLocator} tbody tr`, [], trs => {
|
|
140
|
+
return trs.map(tr => ({
|
|
141
|
+
innerTds: Array.from(tr.getElementsByTagName('td')).map(td => td.innerText)
|
|
142
|
+
}));
|
|
143
|
+
});
|
|
144
|
+
for (const txnRow of transactionsRows) {
|
|
145
|
+
extractTransaction(txns, transactionStatus, txnRow, transactionsColsTypes);
|
|
146
|
+
}
|
|
147
|
+
return txns;
|
|
143
148
|
}
|
|
144
149
|
async function isNoTransactionInDateRangeError(page) {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
150
|
+
const hasErrorInfoElement = await (0, _elementsInteractions.elementPresentOnPage)(page, `.${ERROR_MESSAGE_CLASS}`);
|
|
151
|
+
if (hasErrorInfoElement) {
|
|
152
|
+
const errorText = await page.$eval(`.${ERROR_MESSAGE_CLASS}`, errorElement => {
|
|
153
|
+
return errorElement.innerText;
|
|
154
|
+
});
|
|
155
|
+
return errorText.trim() === NO_TRANSACTION_IN_DATE_RANGE_TEXT;
|
|
156
|
+
}
|
|
157
|
+
return false;
|
|
153
158
|
}
|
|
154
159
|
async function searchByDates(page, startDate) {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
160
|
+
await (0, _elementsInteractions.clickButton)(page, 'a#tabHeader4');
|
|
161
|
+
await (0, _elementsInteractions.waitUntilElementFound)(page, 'div#fibi_dates');
|
|
162
|
+
await (0, _elementsInteractions.fillInput)(page, 'input#fromDate', startDate.format(DATE_FORMAT));
|
|
163
|
+
await (0, _elementsInteractions.clickButton)(page, `button[class*=${CLOSE_SEARCH_BY_DATES_BUTTON_CLASS}]`);
|
|
164
|
+
await (0, _elementsInteractions.clickButton)(page, `input[value=${SHOW_SEARCH_BY_DATES_BUTTON_VALUE}]`);
|
|
165
|
+
await (0, _navigation.waitForNavigation)(page);
|
|
161
166
|
}
|
|
162
167
|
async function getAccountNumber(page) {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
168
|
+
const selectedSnifAccount = await page.$eval(ACCOUNTS_NUMBER, option => {
|
|
169
|
+
return option.innerText;
|
|
170
|
+
});
|
|
171
|
+
return selectedSnifAccount.replace('/', '_').trim();
|
|
167
172
|
}
|
|
168
173
|
async function checkIfHasNextPage(page) {
|
|
169
|
-
|
|
174
|
+
return (0, _elementsInteractions.elementPresentOnPage)(page, NEXT_PAGE_LINK);
|
|
170
175
|
}
|
|
171
176
|
async function navigateToNextPage(page) {
|
|
172
|
-
|
|
173
|
-
|
|
177
|
+
await (0, _elementsInteractions.clickButton)(page, NEXT_PAGE_LINK);
|
|
178
|
+
await (0, _navigation.waitForNavigation)(page);
|
|
174
179
|
}
|
|
180
|
+
|
|
175
181
|
/* Couldn't reproduce scenario with multiple pages of pending transactions - Should support if exists such case.
|
|
176
182
|
needToPaginate is false if scraping pending transactions */
|
|
177
183
|
async function scrapeTransactions(page, tableLocator, transactionStatus, needToPaginate) {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
184
|
+
const txns = [];
|
|
185
|
+
let hasNextPage = false;
|
|
186
|
+
do {
|
|
187
|
+
const currentPageTxns = await extractTransactions(page, tableLocator, transactionStatus);
|
|
188
|
+
txns.push(...currentPageTxns);
|
|
189
|
+
if (needToPaginate) {
|
|
190
|
+
hasNextPage = await checkIfHasNextPage(page);
|
|
191
|
+
if (hasNextPage) {
|
|
192
|
+
await navigateToNextPage(page);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
} while (hasNextPage);
|
|
196
|
+
return convertTransactions(txns);
|
|
191
197
|
}
|
|
192
198
|
async function getAccountTransactions(page) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
]
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
const completedTxns = await scrapeTransactions(page, COMPLETED_TRANSACTIONS_TABLE, transactions_1.TransactionStatuses.Completed, true);
|
|
203
|
-
const txns = [...pendingTxns, ...completedTxns];
|
|
204
|
-
return txns;
|
|
199
|
+
await Promise.race([(0, _elementsInteractions.waitUntilElementFound)(page, "div[id*='divTable']", false), (0, _elementsInteractions.waitUntilElementFound)(page, `.${ERROR_MESSAGE_CLASS}`, false)]);
|
|
200
|
+
const noTransactionInRangeError = await isNoTransactionInDateRangeError(page);
|
|
201
|
+
if (noTransactionInRangeError) {
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
const pendingTxns = await scrapeTransactions(page, PENDING_TRANSACTIONS_TABLE, _transactions.TransactionStatuses.Pending, false);
|
|
205
|
+
const completedTxns = await scrapeTransactions(page, COMPLETED_TRANSACTIONS_TABLE, _transactions.TransactionStatuses.Completed, true);
|
|
206
|
+
const txns = [...pendingTxns, ...completedTxns];
|
|
207
|
+
return txns;
|
|
205
208
|
}
|
|
206
209
|
async function getCurrentBalance(page) {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
210
|
+
const balanceElement = await page.$(CURRENT_BALANCE);
|
|
211
|
+
if (!balanceElement) {
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
const balanceStr = await balanceElement.evaluate(option => {
|
|
215
|
+
return option.innerText;
|
|
216
|
+
});
|
|
217
|
+
return getAmountData(balanceStr);
|
|
215
218
|
}
|
|
216
219
|
async function waitForPostLogin(page) {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
220
|
+
return Promise.race([(0, _elementsInteractions.waitUntilElementFound)(page, '#card-header', true),
|
|
221
|
+
// New UI
|
|
222
|
+
(0, _elementsInteractions.waitUntilElementFound)(page, '#account_num', true),
|
|
223
|
+
// New UI
|
|
224
|
+
(0, _elementsInteractions.waitUntilElementFound)(page, '#matafLogoutLink', true),
|
|
225
|
+
// Old UI
|
|
226
|
+
(0, _elementsInteractions.waitUntilElementFound)(page, '#validationMsg', true) // Old UI
|
|
227
|
+
]);
|
|
223
228
|
}
|
|
224
|
-
exports.waitForPostLogin = waitForPostLogin;
|
|
225
229
|
async function fetchAccountData(page, startDate) {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
230
|
+
await searchByDates(page, startDate);
|
|
231
|
+
const accountNumber = await getAccountNumber(page);
|
|
232
|
+
const balance = await getCurrentBalance(page);
|
|
233
|
+
const txns = await getAccountTransactions(page);
|
|
234
|
+
return {
|
|
235
|
+
accountNumber,
|
|
236
|
+
txns,
|
|
237
|
+
balance
|
|
238
|
+
};
|
|
235
239
|
}
|
|
236
240
|
async function getAccountIdsBySelector(page) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
return accountsIds;
|
|
241
|
+
const accountsIds = await page.evaluate(() => {
|
|
242
|
+
const selectElement = document.getElementById('account_num_select');
|
|
243
|
+
const options = selectElement ? selectElement.querySelectorAll('option') : [];
|
|
244
|
+
if (!options) return [];
|
|
245
|
+
return Array.from(options, option => option.value);
|
|
246
|
+
});
|
|
247
|
+
return accountsIds;
|
|
245
248
|
}
|
|
246
249
|
async function getTransactionsFrame(page) {
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
}
|
|
250
|
+
// Try a few times to find the iframe, as it might not be immediately available
|
|
251
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
252
|
+
await (0, _waiting.sleep)(2000);
|
|
253
|
+
const frames = page.frames();
|
|
254
|
+
const targetFrame = frames.find(f => f.name() === IFRAME_NAME);
|
|
255
|
+
if (targetFrame) {
|
|
256
|
+
return targetFrame;
|
|
255
257
|
}
|
|
256
|
-
|
|
258
|
+
}
|
|
259
|
+
return null;
|
|
257
260
|
}
|
|
258
261
|
async function selectAccount(page, accountId) {
|
|
259
|
-
|
|
260
|
-
|
|
262
|
+
await page.select('#account_num_select', accountId);
|
|
263
|
+
await (0, _elementsInteractions.waitUntilElementFound)(page, '#account_num_select', true);
|
|
261
264
|
}
|
|
262
265
|
async function fetchAccountDataBothUIs(page, startDate) {
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
266
|
+
// Try to get the iframe for the new UI
|
|
267
|
+
const frame = await getTransactionsFrame(page);
|
|
268
|
+
|
|
269
|
+
// Use the frame if available (new UI), otherwise use the page directly (old UI)
|
|
270
|
+
const targetPage = frame || page;
|
|
271
|
+
return fetchAccountData(targetPage, startDate);
|
|
268
272
|
}
|
|
269
273
|
async function fetchAccounts(page, startDate) {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
274
|
+
const accountsIds = await getAccountIdsBySelector(page);
|
|
275
|
+
if (accountsIds.length <= 1) {
|
|
276
|
+
const accountData = await fetchAccountDataBothUIs(page, startDate);
|
|
277
|
+
return [accountData];
|
|
278
|
+
}
|
|
279
|
+
const accounts = [];
|
|
280
|
+
for (const accountId of accountsIds) {
|
|
281
|
+
await selectAccount(page, accountId);
|
|
282
|
+
const accountData = await fetchAccountDataBothUIs(page, startDate);
|
|
283
|
+
accounts.push(accountData);
|
|
284
|
+
}
|
|
285
|
+
return accounts;
|
|
282
286
|
}
|
|
283
|
-
class BeinleumiGroupBaseScraper extends
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
287
|
+
class BeinleumiGroupBaseScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
|
|
288
|
+
BASE_URL = '';
|
|
289
|
+
LOGIN_URL = '';
|
|
290
|
+
TRANSACTIONS_URL = '';
|
|
291
|
+
getLoginOptions(credentials) {
|
|
292
|
+
return {
|
|
293
|
+
loginUrl: `${this.LOGIN_URL}`,
|
|
294
|
+
fields: createLoginFields(credentials),
|
|
295
|
+
submitButtonSelector: '#continueBtn',
|
|
296
|
+
postAction: async () => waitForPostLogin(this.page),
|
|
297
|
+
possibleResults: getPossibleLoginResults(),
|
|
298
|
+
// HACK: For some reason, though the login button (#continueBtn) is present and visible, the click action does not perform.
|
|
299
|
+
// Adding this delay fixes the issue.
|
|
300
|
+
preAction: async () => {
|
|
301
|
+
await (0, _waiting.sleep)(1000);
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
async fetchData() {
|
|
306
|
+
const defaultStartMoment = (0, _moment.default)().subtract(1, 'years').add(1, 'day');
|
|
307
|
+
const startMomentLimit = (0, _moment.default)({
|
|
308
|
+
year: 1600
|
|
309
|
+
});
|
|
310
|
+
const startDate = this.options.startDate || defaultStartMoment.toDate();
|
|
311
|
+
const startMoment = _moment.default.max(startMomentLimit, (0, _moment.default)(startDate));
|
|
312
|
+
await this.navigateTo(this.TRANSACTIONS_URL);
|
|
313
|
+
const accounts = await fetchAccounts(this.page, startMoment);
|
|
314
|
+
return {
|
|
315
|
+
success: true,
|
|
316
|
+
accounts
|
|
317
|
+
};
|
|
318
|
+
}
|
|
313
319
|
}
|
|
314
|
-
exports.default = BeinleumiGroupBaseScraper;
|
|
315
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1iZWlubGV1bWktZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvYmFzZS1iZWlubGV1bWktZ3JvdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsb0RBQTZDO0FBRTdDLDRDQUF1RTtBQUN2RSw0RUFNMEM7QUFDMUMsc0RBQTBEO0FBQzFELGdEQUEyQztBQUMzQyxrREFBb0g7QUFDcEgsMkVBQThHO0FBRTlHLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQztBQUNqQyxNQUFNLGlDQUFpQyxHQUFHLDhCQUE4QixDQUFDO0FBQ3pFLE1BQU0sMkJBQTJCLEdBQUcsWUFBWSxDQUFDO0FBQ2pELE1BQU0seUJBQXlCLEdBQUcsWUFBWSxDQUFDO0FBQy9DLE1BQU0sa0NBQWtDLEdBQUcsdUJBQXVCLENBQUM7QUFDbkUsTUFBTSxnQ0FBZ0MsR0FBRyxxQkFBcUIsQ0FBQztBQUMvRCxNQUFNLHNCQUFzQixHQUFHLFNBQVMsQ0FBQztBQUN6QyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztBQUNuQyxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQztBQUNyQyxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztBQUN0QyxNQUFNLGVBQWUsR0FBRywrQkFBK0IsQ0FBQztBQUN4RCxNQUFNLGtDQUFrQyxHQUFHLHFCQUFxQixDQUFDO0FBQ2pFLE1BQU0saUNBQWlDLEdBQUcsS0FBSyxDQUFDO0FBQ2hELE1BQU0sNEJBQTRCLEdBQUcsb0JBQW9CLENBQUM7QUFDMUQsTUFBTSwwQkFBMEIsR0FBRyxvQkFBb0IsQ0FBQztBQUN4RCxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQztBQUN4QyxNQUFNLGVBQWUsR0FBRyxlQUFlLENBQUM7QUFDeEMsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUM7QUFnQnZDLFNBQWdCLHVCQUF1QjtJQUNyQyxNQUFNLElBQUksR0FBeUIsRUFBRSxDQUFDO0lBQ3RDLElB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QU0sZ0JBQWdCLEdBQUcsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEUsTUFBTSxXQUFXLEdBQUcsZ0JBQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBQSxnQkFBTSxFQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFcEUsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTdDLE1BQU0sUUFBUSxHQUFHLE1BQU0sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFN0QsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJO1lBQ2IsUUFBUTtTQUNULENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxrQkFBZSx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQsIHsgdHlwZSBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgdHlwZSBGcmFtZSwgdHlwZSBQYWdlIH0gZnJvbSAncHVwcGV0ZWVyJztcbmltcG9ydCB7IFNIRUtFTF9DVVJSRU5DWSwgU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBjbGlja0J1dHRvbixcbiAgZWxlbWVudFByZXNlbnRPblBhZ2UsXG4gIGZpbGxJbnB1dCxcbiAgcGFnZUV2YWxBbGwsXG4gIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCxcbn0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgd2FpdEZvck5hdmlnYXRpb24gfSBmcm9tICcuLi9oZWxwZXJzL25hdmlnYXRpb24nO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuLi9oZWxwZXJzL3dhaXRpbmcnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcywgdHlwZSBUcmFuc2FjdGlvbiwgdHlwZSBUcmFuc2FjdGlvbnNBY2NvdW50IH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsIExvZ2luUmVzdWx0cywgdHlwZSBQb3NzaWJsZUxvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5cbmNvbnN0IERBVEVfRk9STUFUID0gJ0REL01NL1lZWVknO1xuY29uc3QgTk9fVFJBTlNBQ1RJT05fSU5fREFURV9SQU5HRV9URVhUID0gJ9ec15Ag16DXntem15DXlSDXoNeq15XXoNeZ150g15HXoNeV16nXkCDXlNee15HXlden16knO1xuY29uc3QgREFURV9DT0xVTU5fQ0xBU1NfQ09NUExFVEVEID0gJ2RhdGUgZmlyc3QnO1xuY29uc3QgREFURV9DT0xVTU5fQ0xBU1NfUEVORElORyA9ICdmaXJzdCBkYXRlJztcbmNvbnN0IERFU0NSSVBUSU9OX0NPTFVNTl9DTEFTU19DT01QTEVURUQgPSAncmVmZXJlbmNlIHdyYXBfbm9ybWFsJztcbmNvbnN0IERFU0NSSVBUSU9OX0NPTFVNTl9DTEFTU19QRU5ESU5HID0gJ2RldGFpbHMgd3JhcF9ub3JtYWwnO1xuY29uc3QgUkVGRVJFTkNFX0NPTFVNTl9DTEFTUyA9ICdkZXRhaWxzJztcbmNvbnN0IERFQklUX0NPTFVNTl9DTEFTUyA9ICdkZWJpdCc7XG5jb25zdCBDUkVESVRfQ09MVU1OX0NMQVNTID0gJ2NyZWRpdCc7XG5jb25zdCBFUlJPUl9NRVNTQUdFX0NMQVNTID0gJ05PX0RBVEEnO1xuY29uc3QgQUNDT1VOVFNfTlVNQkVSID0gJ2Rpdi5maWJpX2FjY291bnQgc3Bhbi5hY2NfbnVtJztcbmNvbnN0IENMT1NFX1NFQVJDSF9CWV9EQVRFU19CVVRUT05fQ0xBU1MgPSAndWktZGF0ZXBpY2tlci1jbG9zZSc7XG5jb25zdCBTSE9XX1NFQVJDSF9CWV9EQVRFU19CVVRUT05fVkFMVUUgPSAn15TXpteSJztcbmNvbnN0IENPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEUgPSAndGFibGUjZGF0YVRhYmxlMDc3JztcbmNvbnN0IFBFTkRJTkdfVFJBTlNBQ1RJT05TX1RBQkxFID0gJ3RhYmxlI2RhdGFUYWJsZTAyMyc7XG5jb25zdCBORVhUX1BBR0VfTElOSyA9ICdhI05wYWdlLnBhZ2luZyc7XG5jb25zdCBDVVJSRU5UX0JBTEFOQ0UgPSAnLm1haW5fYmFsYW5jZSc7XG5jb25zdCBJRlJBTUVfTkFNRSA9ICdpZnJhbWUtb2xkLXBhZ2VzJztcblxudHlwZSBUcmFuc2FjdGlvbnNDb2xzVHlwZXMgPSBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xudHlwZSBUcmFuc2FjdGlvbnNUclRkcyA9IHN0cmluZ1tdO1xudHlwZSBUcmFuc2FjdGlvbnNUciA9IHsgaW5uZXJUZHM6IFRyYW5zYWN0aW9uc1RyVGRzIH07XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICByZWZlcmVuY2U6IHN0cmluZztcbiAgZGF0ZTogc3RyaW5nO1xuICBjcmVkaXQ6IHN0cmluZztcbiAgZGViaXQ6IHN0cmluZztcbiAgbWVtbz86IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKTogUG9zc2libGVMb2dpblJlc3VsdHMge1xuICBjb25zdCB1cmxzOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyA9IHt9O1xuICB1cmxzW0xvZ2luUmVzdWx0cy5TdWNjZXNzXSA9IFtcbiAgICAvZmliaS4qYWNjb3VudFN1bW1hcnkvLCAvLyBOZXcgVUkgcGF0dGVyblxuICAgIC9GaWJpTWVudVxcL09ubGluZS8sIC8vIE9sZCBVSSBwYXR0ZXJuXG4gIF07XG4gIHVybHNbTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZF0gPSBbL0ZpYmlNZW51XFwvTWFya2V0aW5nXFwvUHJpdmF0ZVxcL0hvbWUvXTtcbiAgcmV0dXJuIHVybHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgcmV0dXJuIFtcbiAgICB7IHNlbGVjdG9yOiAnI3VzZXJuYW1lJywgdmFsdWU6IGNyZWRlbnRpYWxzLnVzZXJuYW1lIH0sXG4gICAgeyBzZWxlY3RvcjogJyNwYXNzd29yZCcsIHZhbHVlOiBjcmVkZW50aWFscy5wYXNzd29yZCB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBnZXRBbW91bnREYXRhKGFtb3VudFN0cjogc3RyaW5nKSB7XG4gIGxldCBhbW91bnRTdHJDb3B5ID0gYW1vdW50U3RyLnJlcGxhY2UoU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCwgJycpO1xuICBhbW91bnRTdHJDb3B5ID0gYW1vdW50U3RyQ29weS5yZXBsYWNlQWxsKCcsJywgJycpO1xuICByZXR1cm4gcGFyc2VGbG9hdChhbW91bnRTdHJDb3B5KTtcbn1cblxuZnVuY3Rpb24gZ2V0VHhuQW1vdW50KHR4bjogU2NyYXBlZFRyYW5zYWN0aW9uKSB7XG4gIGNvbnN0IGNyZWRpdCA9IGdldEFtb3VudERhdGEodHhuLmNyZWRpdCk7XG4gIGNvbnN0IGRlYml0ID0gZ2V0QW1vdW50RGF0YSh0eG4uZGViaXQpO1xuICByZXR1cm4gKE51bWJlci5pc05hTihjcmVkaXQpID8gMCA6IGNyZWRpdCkgLSAoTnVtYmVyLmlzTmFOKGRlYml0KSA/IDAgOiBkZWJpdCk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRUcmFuc2FjdGlvbnModHhuczogU2NyYXBlZFRyYW5zYWN0aW9uW10pOiBUcmFuc2FjdGlvbltdIHtcbiAgcmV0dXJuIHR4bnMubWFwKCh0eG4pOiBUcmFuc2FjdGlvbiA9PiB7XG4gICAgY29uc3QgY29udmVydGVkRGF0ZSA9IG1vbWVudCh0eG4uZGF0ZSwgREFURV9GT1JNQVQpLnRvSVNPU3RyaW5nKCk7XG4gICAgY29uc3QgY29udmVydGVkQW1vdW50ID0gZ2V0VHhuQW1vdW50KHR4bik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZXMuTm9ybWFsLFxuICAgICAgaWRlbnRpZmllcjogdHhuLnJlZmVyZW5jZSA/IHBhcnNlSW50KHR4bi5yZWZlcmVuY2UsIDEwKSA6IHVuZGVmaW5lZCxcbiAgICAgIGRhdGU6IGNvbnZlcnRlZERhdGUsXG4gICAgICBwcm9jZXNzZWREYXRlOiBjb252ZXJ0ZWREYXRlLFxuICAgICAgb3JpZ2luYWxBbW91bnQ6IGNvbnZlcnRlZEFtb3VudCxcbiAgICAgIG9yaWdpbmFsQ3VycmVuY3k6IFNIRUtFTF9DVVJSRU5DWSxcbiAgICAgIGNoYXJnZWRBbW91bnQ6IGNvbnZlcnRlZEFtb3VudCxcbiAgICAgIHN0YXR1czogdHhuLnN0YXR1cyxcbiAgICAgIGRlc2NyaXB0aW9uOiB0eG4uZGVzY3JpcHRpb24sXG4gICAgICBtZW1vOiB0eG4ubWVtbyxcbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25EYXRlKFxuICB0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLFxuICB0cmFuc2FjdGlvblR5cGU6IHN0cmluZyxcbiAgdHJhbnNhY3Rpb25zQ29sc1R5cGVzOiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMsXG4pIHtcbiAgaWYgKHRyYW5zYWN0aW9uVHlwZSA9PT0gJ2NvbXBsZXRlZCcpIHtcbiAgICByZXR1cm4gKHRkc1t0cmFuc2FjdGlvbnNDb2xzVHlwZXNbREFURV9DT0xVTU5fQ0xBU1NfQ09NUExFVEVEXV0gfHwgJycpLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gKHRkc1t0cmFuc2FjdGlvbnNDb2xzVHlwZXNbREFURV9DT0xVTU5fQ0xBU1NfUEVORElOR11dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24oXG4gIHRkczogVHJhbnNhY3Rpb25zVHJUZHMsXG4gIHRyYW5zYWN0aW9uVHlwZTogc3RyaW5nLFxuICB0cmFuc2FjdGlvbnNDb2xzVHlwZXM6IFRyYW5zYWN0aW9uc0NvbHNUeXBlcyxcbikge1xuICBpZiAodHJhbnNhY3Rpb25UeXBlID09PSAnY29tcGxldGVkJykge1xuICAgIHJldHVybiAodGRzW3RyYW5zYWN0aW9uc0NvbHNUeXBlc1tERVNDUklQVElPTl9DT0xVTU5fQ0xBU1NfQ09NUExFVEVEXV0gfHwgJycpLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gKHRkc1t0cmFuc2FjdGlvbnNDb2xzVHlwZXNbREVTQ1JJUFRJT05fQ09MVU1OX0NMQVNTX1BFTkRJTkddXSB8fCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvblJlZmVyZW5jZSh0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLCB0cmFuc2FjdGlvbnNDb2xzVHlwZXM6IFRyYW5zYWN0aW9uc0NvbHNUeXBlcykge1xuICByZXR1cm4gKHRkc1t0cmFuc2FjdGlvbnNDb2xzVHlwZXNbUkVGRVJFTkNFX0NPTFVNTl9DTEFTU11dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRGViaXQodGRzOiBUcmFuc2FjdGlvbnNUclRkcywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzOiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMpIHtcbiAgcmV0dXJuICh0ZHNbdHJhbnNhY3Rpb25zQ29sc1R5cGVzW0RFQklUX0NPTFVNTl9DTEFTU11dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uQ3JlZGl0KHRkczogVHJhbnNhY3Rpb25zVHJUZHMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlczogVHJhbnNhY3Rpb25zQ29sc1R5cGVzKSB7XG4gIHJldHVybiAodGRzW3RyYW5zYWN0aW9uc0NvbHNUeXBlc1tDUkVESVRfQ09MVU1OX0NMQVNTXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFRyYW5zYWN0aW9uRGV0YWlscyhcbiAgdHhuUm93OiBUcmFuc2FjdGlvbnNUcixcbiAgdHJhbnNhY3Rpb25TdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXMsXG4gIHRyYW5zYWN0aW9uc0NvbHNUeXBlczogVHJhbnNhY3Rpb25zQ29sc1R5cGVzLFxuKTogU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgY29uc3QgdGRzID0gdHhuUm93LmlubmVyVGRzO1xuICBjb25zdCBpdGVtID0ge1xuICAgIHN0YXR1czogdHJhbnNhY3Rpb25TdGF0dXMsXG4gICAgZGF0ZTogZ2V0VHJhbnNhY3Rpb25EYXRlKHRkcywgdHJhbnNhY3Rpb25TdGF0dXMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlcyksXG4gICAgZGVzY3JpcHRpb246IGdldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24odGRzLCB0cmFuc2FjdGlvblN0YXR1cywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzKSxcbiAgICByZWZlcmVuY2U6IGdldFRyYW5zYWN0aW9uUmVmZXJlbmNlKHRkcywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzKSxcbiAgICBkZWJpdDogZ2V0VHJhbnNhY3Rpb25EZWJpdCh0ZHMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlcyksXG4gICAgY3JlZGl0OiBnZXRUcmFuc2FjdGlvbkNyZWRpdCh0ZHMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlcyksXG4gIH07XG5cbiAgcmV0dXJuIGl0ZW07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uc0NvbHNUeXBlQ2xhc3NlcyhcbiAgcGFnZTogUGFnZSB8IEZyYW1lLFxuICB0YWJsZUxvY2F0b3I6IHN0cmluZyxcbik6IFByb21pc2U8VHJhbnNhY3Rpb25zQ29sc1R5cGVzPiB7XG4gIGNvbnN0IHJlc3VsdDogVHJhbnNhY3Rpb25zQ29sc1R5cGVzID0ge307XG4gIGNvbnN0IHR5cGVDbGFzc2VzT2JqcyA9IGF3YWl0IHBhZ2VFdmFsQWxsKHBhZ2UsIGAke3RhYmxlTG9jYXRvcn0gdGJvZHkgdHI6Zmlyc3Qtb2YtdHlwZSB0ZGAsIG51bGwsIHRkcyA9PiB7XG4gICAgcmV0dXJuIHRkcy5tYXAoKHRkLCBpbmRleCkgPT4gKHtcbiAgICAgIGNvbENsYXNzOiB0ZC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJyksXG4gICAgICBpbmRleCxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgdHlwZUNsYXNzT2JqIG9mIHR5cGVDbGFzc2VzT2Jqcykge1xuICAgIGlmICh0eXBlQ2xhc3NPYmouY29sQ2xhc3MpIHtcbiAgICAgIHJlc3VsdFt0eXBlQ2xhc3NPYmouY29sQ2xhc3NdID0gdHlwZUNsYXNzT2JqLmluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBleHRyYWN0VHJhbnNhY3Rpb24oXG4gIHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdLFxuICB0cmFuc2FjdGlvblN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcyxcbiAgdHhuUm93OiBUcmFuc2FjdGlvbnNUcixcbiAgdHJhbnNhY3Rpb25zQ29sc1R5cGVzOiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMsXG4pIHtcbiAgY29uc3QgdHhuID0gZXh0cmFjdFRyYW5zYWN0aW9uRGV0YWlscyh0eG5Sb3csIHRyYW5zYWN0aW9uU3RhdHVzLCB0cmFuc2FjdGlvbnNDb2xzVHlwZXMpO1xuICBpZiAodHhuLmRhdGUgIT09ICcnKSB7XG4gICAgdHhucy5wdXNoKHR4bik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFRyYW5zYWN0aW9ucyhwYWdlOiBQYWdlIHwgRnJhbWUsIHRhYmxlTG9jYXRvcjogc3RyaW5nLCB0cmFuc2FjdGlvblN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcykge1xuICBjb25zdCB0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSA9IFtdO1xuICBjb25zdCB0cmFuc2FjdGlvbnNDb2xzVHlwZXMgPSBhd2FpdCBnZXRUcmFuc2FjdGlvbnNDb2xzVHlwZUNsYXNzZXMocGFnZSwgdGFibGVMb2NhdG9yKTtcblxuICBjb25zdCB0cmFuc2FjdGlvbnNSb3dzID0gYXdhaXQgcGFnZUV2YWxBbGw8VHJhbnNhY3Rpb25zVHJbXT4ocGFnZSwgYCR7dGFibGVMb2NhdG9yfSB0Ym9keSB0cmAsIFtdLCB0cnMgPT4ge1xuICAgIHJldHVybiB0cnMubWFwKHRyID0+ICh7XG4gICAgICBpbm5lclRkczogQXJyYXkuZnJvbSh0ci5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGQnKSkubWFwKHRkID0+IHRkLmlubmVyVGV4dCksXG4gICAgfSkpO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IHR4blJvdyBvZiB0cmFuc2FjdGlvbnNSb3dzKSB7XG4gICAgZXh0cmFjdFRyYW5zYWN0aW9uKHR4bnMsIHRyYW5zYWN0aW9uU3RhdHVzLCB0eG5Sb3csIHRyYW5zYWN0aW9uc0NvbHNUeXBlcyk7XG4gIH1cbiAgcmV0dXJuIHR4bnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzTm9UcmFuc2FjdGlvbkluRGF0ZVJhbmdlRXJyb3IocGFnZTogUGFnZSB8IEZyYW1lKSB7XG4gIGNvbnN0IGhhc0Vycm9ySW5mb0VsZW1lbnQgPSBhd2FpdCBlbGVtZW50UHJlc2VudE9uUGFnZShwYWdlLCBgLiR7RVJST1JfTUVTU0FHRV9DTEFTU31gKTtcbiAgaWYgKGhhc0Vycm9ySW5mb0VsZW1lbnQpIHtcbiAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCBwYWdlLiRldmFsKGAuJHtFUlJPUl9NRVNTQUdFX0NMQVNTfWAsIGVycm9yRWxlbWVudCA9PiB7XG4gICAgICByZXR1cm4gKGVycm9yRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgIH0pO1xuICAgIHJldHVybiBlcnJvclRleHQudHJpbSgpID09PSBOT19UUkFOU0FDVElPTl9JTl9EQVRFX1JBTkdFX1RFWFQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZWFyY2hCeURhdGVzKHBhZ2U6IFBhZ2UgfCBGcmFtZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgJ2EjdGFiSGVhZGVyNCcpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJ2RpdiNmaWJpX2RhdGVzJyk7XG4gIGF3YWl0IGZpbGxJbnB1dChwYWdlLCAnaW5wdXQjZnJvbURhdGUnLCBzdGFydERhdGUuZm9ybWF0KERBVEVfRk9STUFUKSk7XG4gIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsIGBidXR0b25bY2xhc3MqPSR7Q0xPU0VfU0VBUkNIX0JZX0RBVEVTX0JVVFRPTl9DTEFTU31dYCk7XG4gIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsIGBpbnB1dFt2YWx1ZT0ke1NIT1dfU0VBUkNIX0JZX0RBVEVTX0JVVFRPTl9WQUxVRX1dYCk7XG4gIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHBhZ2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50TnVtYmVyKHBhZ2U6IFBhZ2UgfCBGcmFtZSkge1xuICBjb25zdCBzZWxlY3RlZFNuaWZBY2NvdW50ID0gYXdhaXQgcGFnZS4kZXZhbChBQ0NPVU5UU19OVU1CRVIsIG9wdGlvbiA9PiB7XG4gICAgcmV0dXJuIChvcHRpb24gYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dDtcbiAgfSk7XG5cbiAgcmV0dXJuIHNlbGVjdGVkU25pZkFjY291bnQucmVwbGFjZSgnLycsICdfJykudHJpbSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja0lmSGFzTmV4dFBhZ2UocGFnZTogUGFnZSB8IEZyYW1lKSB7XG4gIHJldHVybiBlbGVtZW50UHJlc2VudE9uUGFnZShwYWdlLCBORVhUX1BBR0VfTElOSyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5hdmlnYXRlVG9OZXh0UGFnZShwYWdlOiBQYWdlIHwgRnJhbWUpIHtcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgTkVYVF9QQUdFX0xJTkspO1xuICBhd2FpdCB3YWl0Rm9yTmF2aWdhdGlvbihwYWdlKTtcbn1cblxuLyogQ291bGRuJ3QgcmVwcm9kdWNlIHNjZW5hcmlvIHdpdGggbXVsdGlwbGUgcGFnZXMgb2YgcGVuZGluZyB0cmFuc2FjdGlvbnMgLSBTaG91bGQgc3VwcG9ydCBpZiBleGlzdHMgc3VjaCBjYXNlLlxuICAgbmVlZFRvUGFnaW5hdGUgaXMgZmFsc2UgaWYgc2NyYXBpbmcgcGVuZGluZyB0cmFuc2FjdGlvbnMgKi9cbmFzeW5jIGZ1bmN0aW9uIHNjcmFwZVRyYW5zYWN0aW9ucyhcbiAgcGFnZTogUGFnZSB8IEZyYW1lLFxuICB0YWJsZUxvY2F0b3I6IHN0cmluZyxcbiAgdHJhbnNhY3Rpb25TdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXMsXG4gIG5lZWRUb1BhZ2luYXRlOiBib29sZWFuLFxuKSB7XG4gIGNvbnN0IHR4bnMgPSBbXTtcbiAgbGV0IGhhc05leHRQYWdlID0gZmFsc2U7XG5cbiAgZG8ge1xuICAgIGNvbnN0IGN1cnJlbnRQYWdlVHhucyA9IGF3YWl0IGV4dHJhY3RUcmFuc2FjdGlvbnMocGFnZSwgdGFibGVMb2NhdG9yLCB0cmFuc2FjdGlvblN0YXR1cyk7XG4gICAgdHhucy5wdXNoKC4uLmN1cnJlbnRQYWdlVHhucyk7XG4gICAgaWYgKG5lZWRUb1BhZ2luYXRlKSB7XG4gICAgICBoYXNOZXh0UGFnZSA9IGF3YWl0IGNoZWNrSWZIYXNOZXh0UGFnZShwYWdlKTtcbiAgICAgIGlmIChoYXNOZXh0UGFnZSkge1xuICAgICAgICBhd2FpdCBuYXZpZ2F0ZVRvTmV4dFBhZ2UocGFnZSk7XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlIChoYXNOZXh0UGFnZSk7XG5cbiAgcmV0dXJuIGNvbnZlcnRUcmFuc2FjdGlvbnModHhucyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnRUcmFuc2FjdGlvbnMocGFnZTogUGFnZSB8IEZyYW1lKSB7XG4gIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIFwiZGl2W2lkKj0nZGl2VGFibGUnXVwiLCBmYWxzZSksXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIGAuJHtFUlJPUl9NRVNTQUdFX0NMQVNTfWAsIGZhbHNlKSxcbiAgXSk7XG5cbiAgY29uc3Qgbm9UcmFuc2FjdGlvbkluUmFuZ2VFcnJvciA9IGF3YWl0IGlzTm9UcmFuc2FjdGlvbkluRGF0ZVJhbmdlRXJyb3IocGFnZSk7XG4gIGlmIChub1RyYW5zYWN0aW9uSW5SYW5nZUVycm9yKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgcGVuZGluZ1R4bnMgPSBhd2FpdCBzY3JhcGVUcmFuc2FjdGlvbnMocGFnZSwgUEVORElOR19UUkFOU0FDVElPTlNfVEFCTEUsIFRyYW5zYWN0aW9uU3RhdHVzZXMuUGVuZGluZywgZmFsc2UpO1xuICBjb25zdCBjb21wbGV0ZWRUeG5zID0gYXdhaXQgc2NyYXBlVHJhbnNhY3Rpb25zKFxuICAgIHBhZ2UsXG4gICAgQ09NUExFVEVEX1RSQU5TQUNUSU9OU19UQUJMRSxcbiAgICBUcmFuc2FjdGlvblN0YXR1c2VzLkNvbXBsZXRlZCxcbiAgICB0cnVlLFxuICApO1xuICBjb25zdCB0eG5zID0gWy4uLnBlbmRpbmdUeG5zLCAuLi5jb21wbGV0ZWRUeG5zXTtcbiAgcmV0dXJuIHR4bnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRCYWxhbmNlKHBhZ2U6IFBhZ2UgfCBGcmFtZSkge1xuICBjb25zdCBiYWxhbmNlRWxlbWVudCA9IGF3YWl0IHBhZ2UuJChDVVJSRU5UX0JBTEFOQ0UpO1xuICBpZiAoIWJhbGFuY2VFbGVtZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBiYWxhbmNlU3RyID0gYXdhaXQgYmFsYW5jZUVsZW1lbnQuZXZhbHVhdGUob3B0aW9uID0+IHtcbiAgICByZXR1cm4gKG9wdGlvbiBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICB9KTtcbiAgcmV0dXJuIGdldEFtb3VudERhdGEoYmFsYW5jZVN0cik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yUG9zdExvZ2luKHBhZ2U6IFBhZ2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmFjZShbXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjY2FyZC1oZWFkZXInLCB0cnVlKSwgLy8gTmV3IFVJXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjYWNjb3VudF9udW0nLCB0cnVlKSwgLy8gTmV3IFVJXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjbWF0YWZMb2dvdXRMaW5rJywgdHJ1ZSksIC8vIE9sZCBVSVxuICAgIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnI3ZhbGlkYXRpb25Nc2cnLCB0cnVlKSwgLy8gT2xkIFVJXG4gIF0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFjY291bnREYXRhKHBhZ2U6IFBhZ2UgfCBGcmFtZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgYXdhaXQgc2VhcmNoQnlEYXRlcyhwYWdlLCBzdGFydERhdGUpO1xuICBjb25zdCBhY2NvdW50TnVtYmVyID0gYXdhaXQgZ2V0QWNjb3VudE51bWJlcihwYWdlKTtcbiAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGdldEN1cnJlbnRCYWxhbmNlKHBhZ2UpO1xuICBjb25zdCB0eG5zID0gYXdhaXQgZ2V0QWNjb3VudFRyYW5zYWN0aW9ucyhwYWdlKTtcblxuICByZXR1cm4ge1xuICAgIGFjY291bnROdW1iZXIsXG4gICAgdHhucyxcbiAgICBiYWxhbmNlLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50SWRzQnlTZWxlY3RvcihwYWdlOiBQYWdlKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBhY2NvdW50c0lkcyA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNjb3VudF9udW1fc2VsZWN0Jyk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHNlbGVjdEVsZW1lbnQgPyBzZWxlY3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbicpIDogW107XG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm4gW107XG4gICAgcmV0dXJuIEFycmF5LmZyb20ob3B0aW9ucywgb3B0aW9uID0+IG9wdGlvbi52YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gYWNjb3VudHNJZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uc0ZyYW1lKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPEZyYW1lIHwgbnVsbD4ge1xuICAvLyBUcnkgYSBmZXcgdGltZXMgdG8gZmluZCB0aGUgaWZyYW1lLCBhcyBpdCBtaWdodCBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgMzsgYXR0ZW1wdCsrKSB7XG4gICAgYXdhaXQgc2xlZXAoMjAwMCk7XG4gICAgY29uc3QgZnJhbWVzID0gcGFnZS5mcmFtZXMoKTtcbiAgICBjb25zdCB0YXJnZXRGcmFtZSA9IGZyYW1lcy5maW5kKGYgPT4gZi5uYW1lKCkgPT09IElGUkFNRV9OQU1FKTtcblxuICAgIGlmICh0YXJnZXRGcmFtZSkge1xuICAgICAgcmV0dXJuIHRhcmdldEZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZWxlY3RBY2NvdW50KHBhZ2U6IFBhZ2UsIGFjY291bnRJZDogc3RyaW5nKSB7XG4gIGF3YWl0IHBhZ2Uuc2VsZWN0KCcjYWNjb3VudF9udW1fc2VsZWN0JywgYWNjb3VudElkKTtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjYWNjb3VudF9udW1fc2VsZWN0JywgdHJ1ZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWNjb3VudERhdGFCb3RoVUlzKHBhZ2U6IFBhZ2UsIHN0YXJ0RGF0ZTogTW9tZW50KSB7XG4gIC8vIFRyeSB0byBnZXQgdGhlIGlmcmFtZSBmb3IgdGhlIG5ldyBVSVxuICBjb25zdCBmcmFtZSA9IGF3YWl0IGdldFRyYW5zYWN0aW9uc0ZyYW1lKHBhZ2UpO1xuXG4gIC8vIFVzZSB0aGUgZnJhbWUgaWYgYXZhaWxhYmxlIChuZXcgVUkpLCBvdGhlcndpc2UgdXNlIHRoZSBwYWdlIGRpcmVjdGx5IChvbGQgVUkpXG4gIGNvbnN0IHRhcmdldFBhZ2UgPSBmcmFtZSB8fCBwYWdlO1xuICByZXR1cm4gZmV0Y2hBY2NvdW50RGF0YSh0YXJnZXRQYWdlLCBzdGFydERhdGUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFjY291bnRzKHBhZ2U6IFBhZ2UsIHN0YXJ0RGF0ZTogTW9tZW50KTogUHJvbWlzZTxUcmFuc2FjdGlvbnNBY2NvdW50W10+IHtcbiAgY29uc3QgYWNjb3VudHNJZHMgPSBhd2FpdCBnZXRBY2NvdW50SWRzQnlTZWxlY3RvcihwYWdlKTtcblxuICBpZiAoYWNjb3VudHNJZHMubGVuZ3RoIDw9IDEpIHtcbiAgICBjb25zdCBhY2NvdW50RGF0YSA9IGF3YWl0IGZldGNoQWNjb3VudERhdGFCb3RoVUlzKHBhZ2UsIHN0YXJ0RGF0ZSk7XG4gICAgcmV0dXJuIFthY2NvdW50RGF0YV07XG4gIH1cblxuICBjb25zdCBhY2NvdW50czogVHJhbnNhY3Rpb25zQWNjb3VudFtdID0gW107XG4gIGZvciAoY29uc3QgYWNjb3VudElkIG9mIGFjY291bnRzSWRzKSB7XG4gICAgYXdhaXQgc2VsZWN0QWNjb3VudChwYWdlLCBhY2NvdW50SWQpO1xuXG4gICAgY29uc3QgYWNjb3VudERhdGEgPSBhd2FpdCBmZXRjaEFjY291bnREYXRhQm90aFVJcyhwYWdlLCBzdGFydERhdGUpO1xuICAgIGFjY291bnRzLnB1c2goYWNjb3VudERhdGEpO1xuICB9XG5cbiAgcmV0dXJuIGFjY291bnRzO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG5cbmNsYXNzIEJlaW5sZXVtaUdyb3VwQmFzZVNjcmFwZXIgZXh0ZW5kcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzPiB7XG4gIEJBU0VfVVJMID0gJyc7XG5cbiAgTE9HSU5fVVJMID0gJyc7XG5cbiAgVFJBTlNBQ1RJT05TX1VSTCA9ICcnO1xuXG4gIGdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9naW5Vcmw6IGAke3RoaXMuTE9HSU5fVVJMfWAsXG4gICAgICBmaWVsZHM6IGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzKSxcbiAgICAgIHN1Ym1pdEJ1dHRvblNlbGVjdG9yOiAnI2NvbnRpbnVlQnRuJyxcbiAgICAgIHBvc3RBY3Rpb246IGFzeW5jICgpID0+IHdhaXRGb3JQb3N0TG9naW4odGhpcy5wYWdlKSxcbiAgICAgIHBvc3NpYmxlUmVzdWx0czogZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSxcbiAgICAgIC8vIEhBQ0s6IEZvciBzb21lIHJlYXNvbiwgdGhvdWdoIHRoZSBsb2dpbiBidXR0b24gKCNjb250aW51ZUJ0bikgaXMgcHJlc2VudCBhbmQgdmlzaWJsZSwgdGhlIGNsaWNrIGFjdGlvbiBkb2VzIG5vdCBwZXJmb3JtLlxuICAgICAgLy8gQWRkaW5nIHRoaXMgZGVsYXkgZml4ZXMgdGhlIGlzc3VlLlxuICAgICAgcHJlQWN0aW9uOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHNsZWVwKDEwMDApO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydE1vbWVudCA9IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFycycpLmFkZCgxLCAnZGF5Jyk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnRMaW1pdCA9IG1vbWVudCh7IHllYXI6IDE2MDAgfSk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KHN0YXJ0TW9tZW50TGltaXQsIG1vbWVudChzdGFydERhdGUpKTtcblxuICAgIGF3YWl0IHRoaXMubmF2aWdhdGVUbyh0aGlzLlRSQU5TQUNUSU9OU19VUkwpO1xuXG4gICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBmZXRjaEFjY291bnRzKHRoaXMucGFnZSwgc3RhcnRNb21lbnQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhY2NvdW50cyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJlaW5sZXVtaUdyb3VwQmFzZVNjcmFwZXI7XG4iXX0=
|
|
320
|
+
var _default = exports.default = BeinleumiGroupBaseScraper;
|
|
321
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX25hdmlnYXRpb24iLCJfd2FpdGluZyIsIl90cmFuc2FjdGlvbnMiLCJfYmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIkRBVEVfRk9STUFUIiwiTk9fVFJBTlNBQ1RJT05fSU5fREFURV9SQU5HRV9URVhUIiwiREFURV9DT0xVTU5fQ0xBU1NfQ09NUExFVEVEIiwiREFURV9DT0xVTU5fQ0xBU1NfUEVORElORyIsIkRFU0NSSVBUSU9OX0NPTFVNTl9DTEFTU19DT01QTEVURUQiLCJERVNDUklQVElPTl9DT0xVTU5fQ0xBU1NfUEVORElORyIsIlJFRkVSRU5DRV9DT0xVTU5fQ0xBU1MiLCJERUJJVF9DT0xVTU5fQ0xBU1MiLCJDUkVESVRfQ09MVU1OX0NMQVNTIiwiRVJST1JfTUVTU0FHRV9DTEFTUyIsIkFDQ09VTlRTX05VTUJFUiIsIkNMT1NFX1NFQVJDSF9CWV9EQVRFU19CVVRUT05fQ0xBU1MiLCJTSE9XX1NFQVJDSF9CWV9EQVRFU19CVVRUT05fVkFMVUUiLCJDT01QTEVURURfVFJBTlNBQ1RJT05TX1RBQkxFIiwiUEVORElOR19UUkFOU0FDVElPTlNfVEFCTEUiLCJORVhUX1BBR0VfTElOSyIsIkNVUlJFTlRfQkFMQU5DRSIsIklGUkFNRV9OQU1FIiwiZ2V0UG9zc2libGVMb2dpblJlc3VsdHMiLCJ1cmxzIiwiTG9naW5SZXN1bHRzIiwiU3VjY2VzcyIsIkludmFsaWRQYXNzd29yZCIsImNyZWF0ZUxvZ2luRmllbGRzIiwiY3JlZGVudGlhbHMiLCJzZWxlY3RvciIsInZhbHVlIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImdldEFtb3VudERhdGEiLCJhbW91bnRTdHIiLCJhbW91bnRTdHJDb3B5IiwicmVwbGFjZSIsIlNIRUtFTF9DVVJSRU5DWV9TWU1CT0wiLCJyZXBsYWNlQWxsIiwicGFyc2VGbG9hdCIsImdldFR4bkFtb3VudCIsInR4biIsImNyZWRpdCIsImRlYml0IiwiTnVtYmVyIiwiaXNOYU4iLCJjb252ZXJ0VHJhbnNhY3Rpb25zIiwidHhucyIsIm1hcCIsImNvbnZlcnRlZERhdGUiLCJtb21lbnQiLCJkYXRlIiwidG9JU09TdHJpbmciLCJjb252ZXJ0ZWRBbW91bnQiLCJ0eXBlIiwiVHJhbnNhY3Rpb25UeXBlcyIsIk5vcm1hbCIsImlkZW50aWZpZXIiLCJyZWZlcmVuY2UiLCJwYXJzZUludCIsInVuZGVmaW5lZCIsInByb2Nlc3NlZERhdGUiLCJvcmlnaW5hbEFtb3VudCIsIm9yaWdpbmFsQ3VycmVuY3kiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJjaGFyZ2VkQW1vdW50Iiwic3RhdHVzIiwiZGVzY3JpcHRpb24iLCJtZW1vIiwiZ2V0VHJhbnNhY3Rpb25EYXRlIiwidGRzIiwidHJhbnNhY3Rpb25UeXBlIiwidHJhbnNhY3Rpb25zQ29sc1R5cGVzIiwidHJpbSIsImdldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24iLCJnZXRUcmFuc2FjdGlvblJlZmVyZW5jZSIsImdldFRyYW5zYWN0aW9uRGViaXQiLCJnZXRUcmFuc2FjdGlvbkNyZWRpdCIsImV4dHJhY3RUcmFuc2FjdGlvbkRldGFpbHMiLCJ0eG5Sb3ciLCJ0cmFuc2FjdGlvblN0YXR1cyIsImlubmVyVGRzIiwiaXRlbSIsImdldFRyYW5zYWN0aW9uc0NvbHNUeXBlQ2xhc3NlcyIsInBhZ2UiLCJ0YWJsZUxvY2F0b3IiLCJyZXN1bHQiLCJ0eXBlQ2xhc3Nlc09ianMiLCJwYWdlRXZhbEFsbCIsInRkIiwiaW5kZXgiLCJjb2xDbGFzcyIsImdldEF0dHJpYnV0ZSIsInR5cGVDbGFzc09iaiIsImV4dHJhY3RUcmFuc2FjdGlvbiIsInB1c2giLCJleHRyYWN0VHJhbnNhY3Rpb25zIiwidHJhbnNhY3Rpb25zUm93cyIsInRycyIsInRyIiwiQXJyYXkiLCJmcm9tIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJpbm5lclRleHQiLCJpc05vVHJhbnNhY3Rpb25JbkRhdGVSYW5nZUVycm9yIiwiaGFzRXJyb3JJbmZvRWxlbWVudCIsImVsZW1lbnRQcmVzZW50T25QYWdlIiwiZXJyb3JUZXh0IiwiJGV2YWwiLCJlcnJvckVsZW1lbnQiLCJzZWFyY2hCeURhdGVzIiwic3RhcnREYXRlIiwiY2xpY2tCdXR0b24iLCJ3YWl0VW50aWxFbGVtZW50Rm91bmQiLCJmaWxsSW5wdXQiLCJmb3JtYXQiLCJ3YWl0Rm9yTmF2aWdhdGlvbiIsImdldEFjY291bnROdW1iZXIiLCJzZWxlY3RlZFNuaWZBY2NvdW50Iiwib3B0aW9uIiwiY2hlY2tJZkhhc05leHRQYWdlIiwibmF2aWdhdGVUb05leHRQYWdlIiwic2NyYXBlVHJhbnNhY3Rpb25zIiwibmVlZFRvUGFnaW5hdGUiLCJoYXNOZXh0UGFnZSIsImN1cnJlbnRQYWdlVHhucyIsImdldEFjY291bnRUcmFuc2FjdGlvbnMiLCJQcm9taXNlIiwicmFjZSIsIm5vVHJhbnNhY3Rpb25JblJhbmdlRXJyb3IiLCJwZW5kaW5nVHhucyIsIlRyYW5zYWN0aW9uU3RhdHVzZXMiLCJQZW5kaW5nIiwiY29tcGxldGVkVHhucyIsIkNvbXBsZXRlZCIsImdldEN1cnJlbnRCYWxhbmNlIiwiYmFsYW5jZUVsZW1lbnQiLCIkIiwiYmFsYW5jZVN0ciIsImV2YWx1YXRlIiwid2FpdEZvclBvc3RMb2dpbiIsImZldGNoQWNjb3VudERhdGEiLCJhY2NvdW50TnVtYmVyIiwiYmFsYW5jZSIsImdldEFjY291bnRJZHNCeVNlbGVjdG9yIiwiYWNjb3VudHNJZHMiLCJzZWxlY3RFbGVtZW50IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsIm9wdGlvbnMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZ2V0VHJhbnNhY3Rpb25zRnJhbWUiLCJhdHRlbXB0Iiwic2xlZXAiLCJmcmFtZXMiLCJ0YXJnZXRGcmFtZSIsImZpbmQiLCJmIiwibmFtZSIsInNlbGVjdEFjY291bnQiLCJhY2NvdW50SWQiLCJzZWxlY3QiLCJmZXRjaEFjY291bnREYXRhQm90aFVJcyIsImZyYW1lIiwidGFyZ2V0UGFnZSIsImZldGNoQWNjb3VudHMiLCJsZW5ndGgiLCJhY2NvdW50RGF0YSIsImFjY291bnRzIiwiQmVpbmxldW1pR3JvdXBCYXNlU2NyYXBlciIsIkJhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJCQVNFX1VSTCIsIkxPR0lOX1VSTCIsIlRSQU5TQUNUSU9OU19VUkwiLCJnZXRMb2dpbk9wdGlvbnMiLCJsb2dpblVybCIsImZpZWxkcyIsInN1Ym1pdEJ1dHRvblNlbGVjdG9yIiwicG9zdEFjdGlvbiIsInBvc3NpYmxlUmVzdWx0cyIsInByZUFjdGlvbiIsImZldGNoRGF0YSIsImRlZmF1bHRTdGFydE1vbWVudCIsInN1YnRyYWN0IiwiYWRkIiwic3RhcnRNb21lbnRMaW1pdCIsInllYXIiLCJ0b0RhdGUiLCJzdGFydE1vbWVudCIsIm1heCIsIm5hdmlnYXRlVG8iLCJzdWNjZXNzIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL2Jhc2UtYmVpbmxldW1pLWdyb3VwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQsIHsgdHlwZSBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgdHlwZSBGcmFtZSwgdHlwZSBQYWdlIH0gZnJvbSAncHVwcGV0ZWVyJztcbmltcG9ydCB7IFNIRUtFTF9DVVJSRU5DWSwgU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBjbGlja0J1dHRvbixcbiAgZWxlbWVudFByZXNlbnRPblBhZ2UsXG4gIGZpbGxJbnB1dCxcbiAgcGFnZUV2YWxBbGwsXG4gIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCxcbn0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgd2FpdEZvck5hdmlnYXRpb24gfSBmcm9tICcuLi9oZWxwZXJzL25hdmlnYXRpb24nO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuLi9oZWxwZXJzL3dhaXRpbmcnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcywgdHlwZSBUcmFuc2FjdGlvbiwgdHlwZSBUcmFuc2FjdGlvbnNBY2NvdW50IH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsIExvZ2luUmVzdWx0cywgdHlwZSBQb3NzaWJsZUxvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5cbmNvbnN0IERBVEVfRk9STUFUID0gJ0REL01NL1lZWVknO1xuY29uc3QgTk9fVFJBTlNBQ1RJT05fSU5fREFURV9SQU5HRV9URVhUID0gJ9ec15Ag16DXntem15DXlSDXoNeq15XXoNeZ150g15HXoNeV16nXkCDXlNee15HXlden16knO1xuY29uc3QgREFURV9DT0xVTU5fQ0xBU1NfQ09NUExFVEVEID0gJ2RhdGUgZmlyc3QnO1xuY29uc3QgREFURV9DT0xVTU5fQ0xBU1NfUEVORElORyA9ICdmaXJzdCBkYXRlJztcbmNvbnN0IERFU0NSSVBUSU9OX0NPTFVNTl9DTEFTU19DT01QTEVURUQgPSAncmVmZXJlbmNlIHdyYXBfbm9ybWFsJztcbmNvbnN0IERFU0NSSVBUSU9OX0NPTFVNTl9DTEFTU19QRU5ESU5HID0gJ2RldGFpbHMgd3JhcF9ub3JtYWwnO1xuY29uc3QgUkVGRVJFTkNFX0NPTFVNTl9DTEFTUyA9ICdkZXRhaWxzJztcbmNvbnN0IERFQklUX0NPTFVNTl9DTEFTUyA9ICdkZWJpdCc7XG5jb25zdCBDUkVESVRfQ09MVU1OX0NMQVNTID0gJ2NyZWRpdCc7XG5jb25zdCBFUlJPUl9NRVNTQUdFX0NMQVNTID0gJ05PX0RBVEEnO1xuY29uc3QgQUNDT1VOVFNfTlVNQkVSID0gJ2Rpdi5maWJpX2FjY291bnQgc3Bhbi5hY2NfbnVtJztcbmNvbnN0IENMT1NFX1NFQVJDSF9CWV9EQVRFU19CVVRUT05fQ0xBU1MgPSAndWktZGF0ZXBpY2tlci1jbG9zZSc7XG5jb25zdCBTSE9XX1NFQVJDSF9CWV9EQVRFU19CVVRUT05fVkFMVUUgPSAn15TXpteSJztcbmNvbnN0IENPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEUgPSAndGFibGUjZGF0YVRhYmxlMDc3JztcbmNvbnN0IFBFTkRJTkdfVFJBTlNBQ1RJT05TX1RBQkxFID0gJ3RhYmxlI2RhdGFUYWJsZTAyMyc7XG5jb25zdCBORVhUX1BBR0VfTElOSyA9ICdhI05wYWdlLnBhZ2luZyc7XG5jb25zdCBDVVJSRU5UX0JBTEFOQ0UgPSAnLm1haW5fYmFsYW5jZSc7XG5jb25zdCBJRlJBTUVfTkFNRSA9ICdpZnJhbWUtb2xkLXBhZ2VzJztcblxudHlwZSBUcmFuc2FjdGlvbnNDb2xzVHlwZXMgPSBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xudHlwZSBUcmFuc2FjdGlvbnNUclRkcyA9IHN0cmluZ1tdO1xudHlwZSBUcmFuc2FjdGlvbnNUciA9IHsgaW5uZXJUZHM6IFRyYW5zYWN0aW9uc1RyVGRzIH07XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICByZWZlcmVuY2U6IHN0cmluZztcbiAgZGF0ZTogc3RyaW5nO1xuICBjcmVkaXQ6IHN0cmluZztcbiAgZGViaXQ6IHN0cmluZztcbiAgbWVtbz86IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKTogUG9zc2libGVMb2dpblJlc3VsdHMge1xuICBjb25zdCB1cmxzOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyA9IHt9O1xuICB1cmxzW0xvZ2luUmVzdWx0cy5TdWNjZXNzXSA9IFtcbiAgICAvZmliaS4qYWNjb3VudFN1bW1hcnkvLCAvLyBOZXcgVUkgcGF0dGVyblxuICAgIC9GaWJpTWVudVxcL09ubGluZS8sIC8vIE9sZCBVSSBwYXR0ZXJuXG4gIF07XG4gIHVybHNbTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZF0gPSBbL0ZpYmlNZW51XFwvTWFya2V0aW5nXFwvUHJpdmF0ZVxcL0hvbWUvXTtcbiAgcmV0dXJuIHVybHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgcmV0dXJuIFtcbiAgICB7IHNlbGVjdG9yOiAnI3VzZXJuYW1lJywgdmFsdWU6IGNyZWRlbnRpYWxzLnVzZXJuYW1lIH0sXG4gICAgeyBzZWxlY3RvcjogJyNwYXNzd29yZCcsIHZhbHVlOiBjcmVkZW50aWFscy5wYXNzd29yZCB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBnZXRBbW91bnREYXRhKGFtb3VudFN0cjogc3RyaW5nKSB7XG4gIGxldCBhbW91bnRTdHJDb3B5ID0gYW1vdW50U3RyLnJlcGxhY2UoU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCwgJycpO1xuICBhbW91bnRTdHJDb3B5ID0gYW1vdW50U3RyQ29weS5yZXBsYWNlQWxsKCcsJywgJycpO1xuICByZXR1cm4gcGFyc2VGbG9hdChhbW91bnRTdHJDb3B5KTtcbn1cblxuZnVuY3Rpb24gZ2V0VHhuQW1vdW50KHR4bjogU2NyYXBlZFRyYW5zYWN0aW9uKSB7XG4gIGNvbnN0IGNyZWRpdCA9IGdldEFtb3VudERhdGEodHhuLmNyZWRpdCk7XG4gIGNvbnN0IGRlYml0ID0gZ2V0QW1vdW50RGF0YSh0eG4uZGViaXQpO1xuICByZXR1cm4gKE51bWJlci5pc05hTihjcmVkaXQpID8gMCA6IGNyZWRpdCkgLSAoTnVtYmVyLmlzTmFOKGRlYml0KSA/IDAgOiBkZWJpdCk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRUcmFuc2FjdGlvbnModHhuczogU2NyYXBlZFRyYW5zYWN0aW9uW10pOiBUcmFuc2FjdGlvbltdIHtcbiAgcmV0dXJuIHR4bnMubWFwKCh0eG4pOiBUcmFuc2FjdGlvbiA9PiB7XG4gICAgY29uc3QgY29udmVydGVkRGF0ZSA9IG1vbWVudCh0eG4uZGF0ZSwgREFURV9GT1JNQVQpLnRvSVNPU3RyaW5nKCk7XG4gICAgY29uc3QgY29udmVydGVkQW1vdW50ID0gZ2V0VHhuQW1vdW50KHR4bik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZXMuTm9ybWFsLFxuICAgICAgaWRlbnRpZmllcjogdHhuLnJlZmVyZW5jZSA/IHBhcnNlSW50KHR4bi5yZWZlcmVuY2UsIDEwKSA6IHVuZGVmaW5lZCxcbiAgICAgIGRhdGU6IGNvbnZlcnRlZERhdGUsXG4gICAgICBwcm9jZXNzZWREYXRlOiBjb252ZXJ0ZWREYXRlLFxuICAgICAgb3JpZ2luYWxBbW91bnQ6IGNvbnZlcnRlZEFtb3VudCxcbiAgICAgIG9yaWdpbmFsQ3VycmVuY3k6IFNIRUtFTF9DVVJSRU5DWSxcbiAgICAgIGNoYXJnZWRBbW91bnQ6IGNvbnZlcnRlZEFtb3VudCxcbiAgICAgIHN0YXR1czogdHhuLnN0YXR1cyxcbiAgICAgIGRlc2NyaXB0aW9uOiB0eG4uZGVzY3JpcHRpb24sXG4gICAgICBtZW1vOiB0eG4ubWVtbyxcbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25EYXRlKFxuICB0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLFxuICB0cmFuc2FjdGlvblR5cGU6IHN0cmluZyxcbiAgdHJhbnNhY3Rpb25zQ29sc1R5cGVzOiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMsXG4pIHtcbiAgaWYgKHRyYW5zYWN0aW9uVHlwZSA9PT0gJ2NvbXBsZXRlZCcpIHtcbiAgICByZXR1cm4gKHRkc1t0cmFuc2FjdGlvbnNDb2xzVHlwZXNbREFURV9DT0xVTU5fQ0xBU1NfQ09NUExFVEVEXV0gfHwgJycpLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gKHRkc1t0cmFuc2FjdGlvbnNDb2xzVHlwZXNbREFURV9DT0xVTU5fQ0xBU1NfUEVORElOR11dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24oXG4gIHRkczogVHJhbnNhY3Rpb25zVHJUZHMsXG4gIHRyYW5zYWN0aW9uVHlwZTogc3RyaW5nLFxuICB0cmFuc2FjdGlvbnNDb2xzVHlwZXM6IFRyYW5zYWN0aW9uc0NvbHNUeXBlcyxcbikge1xuICBpZiAodHJhbnNhY3Rpb25UeXBlID09PSAnY29tcGxldGVkJykge1xuICAgIHJldHVybiAodGRzW3RyYW5zYWN0aW9uc0NvbHNUeXBlc1tERVNDUklQVElPTl9DT0xVTU5fQ0xBU1NfQ09NUExFVEVEXV0gfHwgJycpLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gKHRkc1t0cmFuc2FjdGlvbnNDb2xzVHlwZXNbREVTQ1JJUFRJT05fQ09MVU1OX0NMQVNTX1BFTkRJTkddXSB8fCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvblJlZmVyZW5jZSh0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLCB0cmFuc2FjdGlvbnNDb2xzVHlwZXM6IFRyYW5zYWN0aW9uc0NvbHNUeXBlcykge1xuICByZXR1cm4gKHRkc1t0cmFuc2FjdGlvbnNDb2xzVHlwZXNbUkVGRVJFTkNFX0NPTFVNTl9DTEFTU11dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRGViaXQodGRzOiBUcmFuc2FjdGlvbnNUclRkcywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzOiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMpIHtcbiAgcmV0dXJuICh0ZHNbdHJhbnNhY3Rpb25zQ29sc1R5cGVzW0RFQklUX0NPTFVNTl9DTEFTU11dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uQ3JlZGl0KHRkczogVHJhbnNhY3Rpb25zVHJUZHMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlczogVHJhbnNhY3Rpb25zQ29sc1R5cGVzKSB7XG4gIHJldHVybiAodGRzW3RyYW5zYWN0aW9uc0NvbHNUeXBlc1tDUkVESVRfQ09MVU1OX0NMQVNTXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFRyYW5zYWN0aW9uRGV0YWlscyhcbiAgdHhuUm93OiBUcmFuc2FjdGlvbnNUcixcbiAgdHJhbnNhY3Rpb25TdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXMsXG4gIHRyYW5zYWN0aW9uc0NvbHNUeXBlczogVHJhbnNhY3Rpb25zQ29sc1R5cGVzLFxuKTogU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgY29uc3QgdGRzID0gdHhuUm93LmlubmVyVGRzO1xuICBjb25zdCBpdGVtID0ge1xuICAgIHN0YXR1czogdHJhbnNhY3Rpb25TdGF0dXMsXG4gICAgZGF0ZTogZ2V0VHJhbnNhY3Rpb25EYXRlKHRkcywgdHJhbnNhY3Rpb25TdGF0dXMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlcyksXG4gICAgZGVzY3JpcHRpb246IGdldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24odGRzLCB0cmFuc2FjdGlvblN0YXR1cywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzKSxcbiAgICByZWZlcmVuY2U6IGdldFRyYW5zYWN0aW9uUmVmZXJlbmNlKHRkcywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzKSxcbiAgICBkZWJpdDogZ2V0VHJhbnNhY3Rpb25EZWJpdCh0ZHMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlcyksXG4gICAgY3JlZGl0OiBnZXRUcmFuc2FjdGlvbkNyZWRpdCh0ZHMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlcyksXG4gIH07XG5cbiAgcmV0dXJuIGl0ZW07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uc0NvbHNUeXBlQ2xhc3NlcyhcbiAgcGFnZTogUGFnZSB8IEZyYW1lLFxuICB0YWJsZUxvY2F0b3I6IHN0cmluZyxcbik6IFByb21pc2U8VHJhbnNhY3Rpb25zQ29sc1R5cGVzPiB7XG4gIGNvbnN0IHJlc3VsdDogVHJhbnNhY3Rpb25zQ29sc1R5cGVzID0ge307XG4gIGNvbnN0IHR5cGVDbGFzc2VzT2JqcyA9IGF3YWl0IHBhZ2VFdmFsQWxsKHBhZ2UsIGAke3RhYmxlTG9jYXRvcn0gdGJvZHkgdHI6Zmlyc3Qtb2YtdHlwZSB0ZGAsIG51bGwsIHRkcyA9PiB7XG4gICAgcmV0dXJuIHRkcy5tYXAoKHRkLCBpbmRleCkgPT4gKHtcbiAgICAgIGNvbENsYXNzOiB0ZC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJyksXG4gICAgICBpbmRleCxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgdHlwZUNsYXNzT2JqIG9mIHR5cGVDbGFzc2VzT2Jqcykge1xuICAgIGlmICh0eXBlQ2xhc3NPYmouY29sQ2xhc3MpIHtcbiAgICAgIHJlc3VsdFt0eXBlQ2xhc3NPYmouY29sQ2xhc3NdID0gdHlwZUNsYXNzT2JqLmluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBleHRyYWN0VHJhbnNhY3Rpb24oXG4gIHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdLFxuICB0cmFuc2FjdGlvblN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcyxcbiAgdHhuUm93OiBUcmFuc2FjdGlvbnNUcixcbiAgdHJhbnNhY3Rpb25zQ29sc1R5cGVzOiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMsXG4pIHtcbiAgY29uc3QgdHhuID0gZXh0cmFjdFRyYW5zYWN0aW9uRGV0YWlscyh0eG5Sb3csIHRyYW5zYWN0aW9uU3RhdHVzLCB0cmFuc2FjdGlvbnNDb2xzVHlwZXMpO1xuICBpZiAodHhuLmRhdGUgIT09ICcnKSB7XG4gICAgdHhucy5wdXNoKHR4bik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFRyYW5zYWN0aW9ucyhwYWdlOiBQYWdlIHwgRnJhbWUsIHRhYmxlTG9jYXRvcjogc3RyaW5nLCB0cmFuc2FjdGlvblN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcykge1xuICBjb25zdCB0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSA9IFtdO1xuICBjb25zdCB0cmFuc2FjdGlvbnNDb2xzVHlwZXMgPSBhd2FpdCBnZXRUcmFuc2FjdGlvbnNDb2xzVHlwZUNsYXNzZXMocGFnZSwgdGFibGVMb2NhdG9yKTtcblxuICBjb25zdCB0cmFuc2FjdGlvbnNSb3dzID0gYXdhaXQgcGFnZUV2YWxBbGw8VHJhbnNhY3Rpb25zVHJbXT4ocGFnZSwgYCR7dGFibGVMb2NhdG9yfSB0Ym9keSB0cmAsIFtdLCB0cnMgPT4ge1xuICAgIHJldHVybiB0cnMubWFwKHRyID0+ICh7XG4gICAgICBpbm5lclRkczogQXJyYXkuZnJvbSh0ci5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGQnKSkubWFwKHRkID0+IHRkLmlubmVyVGV4dCksXG4gICAgfSkpO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IHR4blJvdyBvZiB0cmFuc2FjdGlvbnNSb3dzKSB7XG4gICAgZXh0cmFjdFRyYW5zYWN0aW9uKHR4bnMsIHRyYW5zYWN0aW9uU3RhdHVzLCB0eG5Sb3csIHRyYW5zYWN0aW9uc0NvbHNUeXBlcyk7XG4gIH1cbiAgcmV0dXJuIHR4bnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzTm9UcmFuc2FjdGlvbkluRGF0ZVJhbmdlRXJyb3IocGFnZTogUGFnZSB8IEZyYW1lKSB7XG4gIGNvbnN0IGhhc0Vycm9ySW5mb0VsZW1lbnQgPSBhd2FpdCBlbGVtZW50UHJlc2VudE9uUGFnZShwYWdlLCBgLiR7RVJST1JfTUVTU0FHRV9DTEFTU31gKTtcbiAgaWYgKGhhc0Vycm9ySW5mb0VsZW1lbnQpIHtcbiAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCBwYWdlLiRldmFsKGAuJHtFUlJPUl9NRVNTQUdFX0NMQVNTfWAsIGVycm9yRWxlbWVudCA9PiB7XG4gICAgICByZXR1cm4gKGVycm9yRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgIH0pO1xuICAgIHJldHVybiBlcnJvclRleHQudHJpbSgpID09PSBOT19UUkFOU0FDVElPTl9JTl9EQVRFX1JBTkdFX1RFWFQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZWFyY2hCeURhdGVzKHBhZ2U6IFBhZ2UgfCBGcmFtZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgJ2EjdGFiSGVhZGVyNCcpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJ2RpdiNmaWJpX2RhdGVzJyk7XG4gIGF3YWl0IGZpbGxJbnB1dChwYWdlLCAnaW5wdXQjZnJvbURhdGUnLCBzdGFydERhdGUuZm9ybWF0KERBVEVfRk9STUFUKSk7XG4gIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsIGBidXR0b25bY2xhc3MqPSR7Q0xPU0VfU0VBUkNIX0JZX0RBVEVTX0JVVFRPTl9DTEFTU31dYCk7XG4gIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsIGBpbnB1dFt2YWx1ZT0ke1NIT1dfU0VBUkNIX0JZX0RBVEVTX0JVVFRPTl9WQUxVRX1dYCk7XG4gIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHBhZ2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50TnVtYmVyKHBhZ2U6IFBhZ2UgfCBGcmFtZSkge1xuICBjb25zdCBzZWxlY3RlZFNuaWZBY2NvdW50ID0gYXdhaXQgcGFnZS4kZXZhbChBQ0NPVU5UU19OVU1CRVIsIG9wdGlvbiA9PiB7XG4gICAgcmV0dXJuIChvcHRpb24gYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dDtcbiAgfSk7XG5cbiAgcmV0dXJuIHNlbGVjdGVkU25pZkFjY291bnQucmVwbGFjZSgnLycsICdfJykudHJpbSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja0lmSGFzTmV4dFBhZ2UocGFnZTogUGFnZSB8IEZyYW1lKSB7XG4gIHJldHVybiBlbGVtZW50UHJlc2VudE9uUGFnZShwYWdlLCBORVhUX1BBR0VfTElOSyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5hdmlnYXRlVG9OZXh0UGFnZShwYWdlOiBQYWdlIHwgRnJhbWUpIHtcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgTkVYVF9QQUdFX0xJTkspO1xuICBhd2FpdCB3YWl0Rm9yTmF2aWdhdGlvbihwYWdlKTtcbn1cblxuLyogQ291bGRuJ3QgcmVwcm9kdWNlIHNjZW5hcmlvIHdpdGggbXVsdGlwbGUgcGFnZXMgb2YgcGVuZGluZyB0cmFuc2FjdGlvbnMgLSBTaG91bGQgc3VwcG9ydCBpZiBleGlzdHMgc3VjaCBjYXNlLlxuICAgbmVlZFRvUGFnaW5hdGUgaXMgZmFsc2UgaWYgc2NyYXBpbmcgcGVuZGluZyB0cmFuc2FjdGlvbnMgKi9cbmFzeW5jIGZ1bmN0aW9uIHNjcmFwZVRyYW5zYWN0aW9ucyhcbiAgcGFnZTogUGFnZSB8IEZyYW1lLFxuICB0YWJsZUxvY2F0b3I6IHN0cmluZyxcbiAgdHJhbnNhY3Rpb25TdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXMsXG4gIG5lZWRUb1BhZ2luYXRlOiBib29sZWFuLFxuKSB7XG4gIGNvbnN0IHR4bnMgPSBbXTtcbiAgbGV0IGhhc05leHRQYWdlID0gZmFsc2U7XG5cbiAgZG8ge1xuICAgIGNvbnN0IGN1cnJlbnRQYWdlVHhucyA9IGF3YWl0IGV4dHJhY3RUcmFuc2FjdGlvbnMocGFnZSwgdGFibGVMb2NhdG9yLCB0cmFuc2FjdGlvblN0YXR1cyk7XG4gICAgdHhucy5wdXNoKC4uLmN1cnJlbnRQYWdlVHhucyk7XG4gICAgaWYgKG5lZWRUb1BhZ2luYXRlKSB7XG4gICAgICBoYXNOZXh0UGFnZSA9IGF3YWl0IGNoZWNrSWZIYXNOZXh0UGFnZShwYWdlKTtcbiAgICAgIGlmIChoYXNOZXh0UGFnZSkge1xuICAgICAgICBhd2FpdCBuYXZpZ2F0ZVRvTmV4dFBhZ2UocGFnZSk7XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlIChoYXNOZXh0UGFnZSk7XG5cbiAgcmV0dXJuIGNvbnZlcnRUcmFuc2FjdGlvbnModHhucyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnRUcmFuc2FjdGlvbnMocGFnZTogUGFnZSB8IEZyYW1lKSB7XG4gIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIFwiZGl2W2lkKj0nZGl2VGFibGUnXVwiLCBmYWxzZSksXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIGAuJHtFUlJPUl9NRVNTQUdFX0NMQVNTfWAsIGZhbHNlKSxcbiAgXSk7XG5cbiAgY29uc3Qgbm9UcmFuc2FjdGlvbkluUmFuZ2VFcnJvciA9IGF3YWl0IGlzTm9UcmFuc2FjdGlvbkluRGF0ZVJhbmdlRXJyb3IocGFnZSk7XG4gIGlmIChub1RyYW5zYWN0aW9uSW5SYW5nZUVycm9yKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgcGVuZGluZ1R4bnMgPSBhd2FpdCBzY3JhcGVUcmFuc2FjdGlvbnMocGFnZSwgUEVORElOR19UUkFOU0FDVElPTlNfVEFCTEUsIFRyYW5zYWN0aW9uU3RhdHVzZXMuUGVuZGluZywgZmFsc2UpO1xuICBjb25zdCBjb21wbGV0ZWRUeG5zID0gYXdhaXQgc2NyYXBlVHJhbnNhY3Rpb25zKFxuICAgIHBhZ2UsXG4gICAgQ09NUExFVEVEX1RSQU5TQUNUSU9OU19UQUJMRSxcbiAgICBUcmFuc2FjdGlvblN0YXR1c2VzLkNvbXBsZXRlZCxcbiAgICB0cnVlLFxuICApO1xuICBjb25zdCB0eG5zID0gWy4uLnBlbmRpbmdUeG5zLCAuLi5jb21wbGV0ZWRUeG5zXTtcbiAgcmV0dXJuIHR4bnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRCYWxhbmNlKHBhZ2U6IFBhZ2UgfCBGcmFtZSkge1xuICBjb25zdCBiYWxhbmNlRWxlbWVudCA9IGF3YWl0IHBhZ2UuJChDVVJSRU5UX0JBTEFOQ0UpO1xuICBpZiAoIWJhbGFuY2VFbGVtZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBiYWxhbmNlU3RyID0gYXdhaXQgYmFsYW5jZUVsZW1lbnQuZXZhbHVhdGUob3B0aW9uID0+IHtcbiAgICByZXR1cm4gKG9wdGlvbiBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICB9KTtcbiAgcmV0dXJuIGdldEFtb3VudERhdGEoYmFsYW5jZVN0cik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yUG9zdExvZ2luKHBhZ2U6IFBhZ2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmFjZShbXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjY2FyZC1oZWFkZXInLCB0cnVlKSwgLy8gTmV3IFVJXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjYWNjb3VudF9udW0nLCB0cnVlKSwgLy8gTmV3IFVJXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjbWF0YWZMb2dvdXRMaW5rJywgdHJ1ZSksIC8vIE9sZCBVSVxuICAgIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnI3ZhbGlkYXRpb25Nc2cnLCB0cnVlKSwgLy8gT2xkIFVJXG4gIF0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFjY291bnREYXRhKHBhZ2U6IFBhZ2UgfCBGcmFtZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgYXdhaXQgc2VhcmNoQnlEYXRlcyhwYWdlLCBzdGFydERhdGUpO1xuICBjb25zdCBhY2NvdW50TnVtYmVyID0gYXdhaXQgZ2V0QWNjb3VudE51bWJlcihwYWdlKTtcbiAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGdldEN1cnJlbnRCYWxhbmNlKHBhZ2UpO1xuICBjb25zdCB0eG5zID0gYXdhaXQgZ2V0QWNjb3VudFRyYW5zYWN0aW9ucyhwYWdlKTtcblxuICByZXR1cm4ge1xuICAgIGFjY291bnROdW1iZXIsXG4gICAgdHhucyxcbiAgICBiYWxhbmNlLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50SWRzQnlTZWxlY3RvcihwYWdlOiBQYWdlKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBhY2NvdW50c0lkcyA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNjb3VudF9udW1fc2VsZWN0Jyk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHNlbGVjdEVsZW1lbnQgPyBzZWxlY3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbicpIDogW107XG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm4gW107XG4gICAgcmV0dXJuIEFycmF5LmZyb20ob3B0aW9ucywgb3B0aW9uID0+IG9wdGlvbi52YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gYWNjb3VudHNJZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uc0ZyYW1lKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPEZyYW1lIHwgbnVsbD4ge1xuICAvLyBUcnkgYSBmZXcgdGltZXMgdG8gZmluZCB0aGUgaWZyYW1lLCBhcyBpdCBtaWdodCBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgMzsgYXR0ZW1wdCsrKSB7XG4gICAgYXdhaXQgc2xlZXAoMjAwMCk7XG4gICAgY29uc3QgZnJhbWVzID0gcGFnZS5mcmFtZXMoKTtcbiAgICBjb25zdCB0YXJnZXRGcmFtZSA9IGZyYW1lcy5maW5kKGYgPT4gZi5uYW1lKCkgPT09IElGUkFNRV9OQU1FKTtcblxuICAgIGlmICh0YXJnZXRGcmFtZSkge1xuICAgICAgcmV0dXJuIHRhcmdldEZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZWxlY3RBY2NvdW50KHBhZ2U6IFBhZ2UsIGFjY291bnRJZDogc3RyaW5nKSB7XG4gIGF3YWl0IHBhZ2Uuc2VsZWN0KCcjYWNjb3VudF9udW1fc2VsZWN0JywgYWNjb3VudElkKTtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjYWNjb3VudF9udW1fc2VsZWN0JywgdHJ1ZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWNjb3VudERhdGFCb3RoVUlzKHBhZ2U6IFBhZ2UsIHN0YXJ0RGF0ZTogTW9tZW50KSB7XG4gIC8vIFRyeSB0byBnZXQgdGhlIGlmcmFtZSBmb3IgdGhlIG5ldyBVSVxuICBjb25zdCBmcmFtZSA9IGF3YWl0IGdldFRyYW5zYWN0aW9uc0ZyYW1lKHBhZ2UpO1xuXG4gIC8vIFVzZSB0aGUgZnJhbWUgaWYgYXZhaWxhYmxlIChuZXcgVUkpLCBvdGhlcndpc2UgdXNlIHRoZSBwYWdlIGRpcmVjdGx5IChvbGQgVUkpXG4gIGNvbnN0IHRhcmdldFBhZ2UgPSBmcmFtZSB8fCBwYWdlO1xuICByZXR1cm4gZmV0Y2hBY2NvdW50RGF0YSh0YXJnZXRQYWdlLCBzdGFydERhdGUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFjY291bnRzKHBhZ2U6IFBhZ2UsIHN0YXJ0RGF0ZTogTW9tZW50KTogUHJvbWlzZTxUcmFuc2FjdGlvbnNBY2NvdW50W10+IHtcbiAgY29uc3QgYWNjb3VudHNJZHMgPSBhd2FpdCBnZXRBY2NvdW50SWRzQnlTZWxlY3RvcihwYWdlKTtcblxuICBpZiAoYWNjb3VudHNJZHMubGVuZ3RoIDw9IDEpIHtcbiAgICBjb25zdCBhY2NvdW50RGF0YSA9IGF3YWl0IGZldGNoQWNjb3VudERhdGFCb3RoVUlzKHBhZ2UsIHN0YXJ0RGF0ZSk7XG4gICAgcmV0dXJuIFthY2NvdW50RGF0YV07XG4gIH1cblxuICBjb25zdCBhY2NvdW50czogVHJhbnNhY3Rpb25zQWNjb3VudFtdID0gW107XG4gIGZvciAoY29uc3QgYWNjb3VudElkIG9mIGFjY291bnRzSWRzKSB7XG4gICAgYXdhaXQgc2VsZWN0QWNjb3VudChwYWdlLCBhY2NvdW50SWQpO1xuXG4gICAgY29uc3QgYWNjb3VudERhdGEgPSBhd2FpdCBmZXRjaEFjY291bnREYXRhQm90aFVJcyhwYWdlLCBzdGFydERhdGUpO1xuICAgIGFjY291bnRzLnB1c2goYWNjb3VudERhdGEpO1xuICB9XG5cbiAgcmV0dXJuIGFjY291bnRzO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG5cbmNsYXNzIEJlaW5sZXVtaUdyb3VwQmFzZVNjcmFwZXIgZXh0ZW5kcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzPiB7XG4gIEJBU0VfVVJMID0gJyc7XG5cbiAgTE9HSU5fVVJMID0gJyc7XG5cbiAgVFJBTlNBQ1RJT05TX1VSTCA9ICcnO1xuXG4gIGdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9naW5Vcmw6IGAke3RoaXMuTE9HSU5fVVJMfWAsXG4gICAgICBmaWVsZHM6IGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzKSxcbiAgICAgIHN1Ym1pdEJ1dHRvblNlbGVjdG9yOiAnI2NvbnRpbnVlQnRuJyxcbiAgICAgIHBvc3RBY3Rpb246IGFzeW5jICgpID0+IHdhaXRGb3JQb3N0TG9naW4odGhpcy5wYWdlKSxcbiAgICAgIHBvc3NpYmxlUmVzdWx0czogZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSxcbiAgICAgIC8vIEhBQ0s6IEZvciBzb21lIHJlYXNvbiwgdGhvdWdoIHRoZSBsb2dpbiBidXR0b24gKCNjb250aW51ZUJ0bikgaXMgcHJlc2VudCBhbmQgdmlzaWJsZSwgdGhlIGNsaWNrIGFjdGlvbiBkb2VzIG5vdCBwZXJmb3JtLlxuICAgICAgLy8gQWRkaW5nIHRoaXMgZGVsYXkgZml4ZXMgdGhlIGlzc3VlLlxuICAgICAgcHJlQWN0aW9uOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHNsZWVwKDEwMDApO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydE1vbWVudCA9IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFycycpLmFkZCgxLCAnZGF5Jyk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnRMaW1pdCA9IG1vbWVudCh7IHllYXI6IDE2MDAgfSk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KHN0YXJ0TW9tZW50TGltaXQsIG1vbWVudChzdGFydERhdGUpKTtcblxuICAgIGF3YWl0IHRoaXMubmF2aWdhdGVUbyh0aGlzLlRSQU5TQUNUSU9OU19VUkwpO1xuXG4gICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBmZXRjaEFjY291bnRzKHRoaXMucGFnZSwgc3RhcnRNb21lbnQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhY2NvdW50cyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJlaW5sZXVtaUdyb3VwQmFzZVNjcmFwZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLHFCQUFBLEdBQUFGLE9BQUE7QUFPQSxJQUFBRyxXQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxRQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxhQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSx1QkFBQSxHQUFBTixPQUFBO0FBQThHLFNBQUFELHVCQUFBUSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRTlHLE1BQU1HLFdBQVcsR0FBRyxZQUFZO0FBQ2hDLE1BQU1DLGlDQUFpQyxHQUFHLDhCQUE4QjtBQUN4RSxNQUFNQywyQkFBMkIsR0FBRyxZQUFZO0FBQ2hELE1BQU1DLHlCQUF5QixHQUFHLFlBQVk7QUFDOUMsTUFBTUMsa0NBQWtDLEdBQUcsdUJBQXVCO0FBQ2xFLE1BQU1DLGdDQUFnQyxHQUFH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
|