@tomerh2001/israeli-bank-scrapers 6.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +425 -0
- package/lib/assertNever.d.ts +1 -0
- package/lib/assertNever.js +10 -0
- package/lib/constants.d.ts +10 -0
- package/lib/constants.js +17 -0
- package/lib/definitions.d.ts +105 -0
- package/lib/definitions.js +116 -0
- package/lib/helpers/browser.d.ts +10 -0
- package/lib/helpers/browser.js +21 -0
- package/lib/helpers/dates.d.ts +2 -0
- package/lib/helpers/dates.js +22 -0
- package/lib/helpers/debug.d.ts +2 -0
- package/lib/helpers/debug.js +12 -0
- package/lib/helpers/elements-interactions.d.ts +17 -0
- package/lib/helpers/elements-interactions.js +111 -0
- package/lib/helpers/fetch.d.ts +6 -0
- package/lib/helpers/fetch.js +111 -0
- package/lib/helpers/navigation.d.ts +6 -0
- package/lib/helpers/navigation.js +39 -0
- package/lib/helpers/storage.d.ts +2 -0
- package/lib/helpers/storage.js +14 -0
- package/lib/helpers/transactions.d.ts +5 -0
- package/lib/helpers/transactions.js +47 -0
- package/lib/helpers/waiting.d.ts +13 -0
- package/lib/helpers/waiting.js +58 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +85 -0
- package/lib/scrapers/amex.d.ts +6 -0
- package/lib/scrapers/amex.js +17 -0
- package/lib/scrapers/amex.test.d.ts +1 -0
- package/lib/scrapers/amex.test.js +49 -0
- package/lib/scrapers/base-beinleumi-group.d.ts +66 -0
- package/lib/scrapers/base-beinleumi-group.js +428 -0
- package/lib/scrapers/base-isracard-amex.d.ts +23 -0
- package/lib/scrapers/base-isracard-amex.js +324 -0
- package/lib/scrapers/base-scraper-with-browser.d.ts +57 -0
- package/lib/scrapers/base-scraper-with-browser.js +291 -0
- 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.d.ts +19 -0
- package/lib/scrapers/base-scraper.js +91 -0
- package/lib/scrapers/behatsdaa.d.ts +11 -0
- package/lib/scrapers/behatsdaa.js +113 -0
- package/lib/scrapers/behatsdaa.test.d.ts +1 -0
- package/lib/scrapers/behatsdaa.test.js +46 -0
- package/lib/scrapers/beinleumi.d.ts +7 -0
- package/lib/scrapers/beinleumi.js +15 -0
- package/lib/scrapers/beinleumi.test.d.ts +1 -0
- package/lib/scrapers/beinleumi.test.js +47 -0
- package/lib/scrapers/beyahad-bishvilha.d.ts +30 -0
- package/lib/scrapers/beyahad-bishvilha.js +149 -0
- package/lib/scrapers/beyahad-bishvilha.test.d.ts +1 -0
- package/lib/scrapers/beyahad-bishvilha.test.js +47 -0
- package/lib/scrapers/discount.d.ts +22 -0
- package/lib/scrapers/discount.js +120 -0
- package/lib/scrapers/discount.test.d.ts +1 -0
- package/lib/scrapers/discount.test.js +49 -0
- package/lib/scrapers/errors.d.ts +16 -0
- package/lib/scrapers/errors.js +32 -0
- package/lib/scrapers/factory.d.ts +2 -0
- package/lib/scrapers/factory.js +70 -0
- package/lib/scrapers/factory.test.d.ts +1 -0
- package/lib/scrapers/factory.test.js +19 -0
- package/lib/scrapers/hapoalim.d.ts +24 -0
- package/lib/scrapers/hapoalim.js +198 -0
- package/lib/scrapers/hapoalim.test.d.ts +1 -0
- package/lib/scrapers/hapoalim.test.js +47 -0
- package/lib/scrapers/interface.d.ts +186 -0
- package/lib/scrapers/interface.js +6 -0
- package/lib/scrapers/isracard.d.ts +6 -0
- package/lib/scrapers/isracard.js +17 -0
- package/lib/scrapers/isracard.test.d.ts +1 -0
- package/lib/scrapers/isracard.test.js +49 -0
- package/lib/scrapers/leumi.d.ts +21 -0
- package/lib/scrapers/leumi.js +200 -0
- package/lib/scrapers/leumi.test.d.ts +1 -0
- package/lib/scrapers/leumi.test.js +47 -0
- package/lib/scrapers/massad.d.ts +7 -0
- package/lib/scrapers/massad.js +15 -0
- package/lib/scrapers/max.d.ts +37 -0
- package/lib/scrapers/max.js +299 -0
- package/lib/scrapers/max.test.d.ts +1 -0
- package/lib/scrapers/max.test.js +64 -0
- package/lib/scrapers/mercantile.d.ts +20 -0
- package/lib/scrapers/mercantile.js +18 -0
- package/lib/scrapers/mercantile.test.d.ts +1 -0
- package/lib/scrapers/mercantile.test.js +45 -0
- package/lib/scrapers/mizrahi.d.ts +35 -0
- package/lib/scrapers/mizrahi.js +265 -0
- package/lib/scrapers/mizrahi.test.d.ts +1 -0
- package/lib/scrapers/mizrahi.test.js +56 -0
- package/lib/scrapers/one-zero-queries.d.ts +2 -0
- package/lib/scrapers/one-zero-queries.js +560 -0
- package/lib/scrapers/one-zero.d.ts +36 -0
- package/lib/scrapers/one-zero.js +238 -0
- package/lib/scrapers/one-zero.test.d.ts +1 -0
- package/lib/scrapers/one-zero.test.js +51 -0
- package/lib/scrapers/otsar-hahayal.d.ts +7 -0
- package/lib/scrapers/otsar-hahayal.js +15 -0
- package/lib/scrapers/otsar-hahayal.test.d.ts +1 -0
- package/lib/scrapers/otsar-hahayal.test.js +47 -0
- package/lib/scrapers/pagi.d.ts +7 -0
- package/lib/scrapers/pagi.js +15 -0
- package/lib/scrapers/pagi.test.d.ts +1 -0
- package/lib/scrapers/pagi.test.js +47 -0
- package/lib/scrapers/union-bank.d.ts +23 -0
- package/lib/scrapers/union-bank.js +242 -0
- package/lib/scrapers/union-bank.test.d.ts +1 -0
- package/lib/scrapers/union-bank.test.js +47 -0
- package/lib/scrapers/visa-cal.d.ts +20 -0
- package/lib/scrapers/visa-cal.js +318 -0
- package/lib/scrapers/visa-cal.test.d.ts +1 -0
- package/lib/scrapers/visa-cal.test.js +49 -0
- package/lib/scrapers/yahav.d.ts +25 -0
- package/lib/scrapers/yahav.js +247 -0
- package/lib/scrapers/yahav.test.d.ts +1 -0
- package/lib/scrapers/yahav.test.js +49 -0
- package/lib/transactions.d.ts +47 -0
- package/lib/transactions.js +17 -0
- package/package.json +91 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
8
|
+
var _moment = _interopRequireDefault(require("moment"));
|
|
9
|
+
var _constants = require("../constants");
|
|
10
|
+
var _definitions = require("../definitions");
|
|
11
|
+
var _dates = _interopRequireDefault(require("../helpers/dates"));
|
|
12
|
+
var _debug = require("../helpers/debug");
|
|
13
|
+
var _fetch = require("../helpers/fetch");
|
|
14
|
+
var _transactions = require("../helpers/transactions");
|
|
15
|
+
var _waiting = require("../helpers/waiting");
|
|
16
|
+
var _transactions2 = require("../transactions");
|
|
17
|
+
var _baseScraperWithBrowser = require("./base-scraper-with-browser");
|
|
18
|
+
var _errors = require("./errors");
|
|
19
|
+
var _browser = require("../helpers/browser");
|
|
20
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
21
|
+
const RATE_LIMIT = {
|
|
22
|
+
SLEEP_BETWEEN: 1000,
|
|
23
|
+
TRANSACTIONS_BATCH_SIZE: 10
|
|
24
|
+
};
|
|
25
|
+
const COUNTRY_CODE = '212';
|
|
26
|
+
const ID_TYPE = '1';
|
|
27
|
+
const INSTALLMENTS_KEYWORD = 'תשלום';
|
|
28
|
+
const DATE_FORMAT = 'DD/MM/YYYY';
|
|
29
|
+
const debug = (0, _debug.getDebug)('base-isracard-amex');
|
|
30
|
+
function getAccountsUrl(servicesUrl, monthMoment) {
|
|
31
|
+
const billingDate = monthMoment.format('YYYY-MM-DD');
|
|
32
|
+
const url = new URL(servicesUrl);
|
|
33
|
+
url.searchParams.set('reqName', 'DashboardMonth');
|
|
34
|
+
url.searchParams.set('actionCode', '0');
|
|
35
|
+
url.searchParams.set('billingDate', billingDate);
|
|
36
|
+
url.searchParams.set('format', 'Json');
|
|
37
|
+
return url.toString();
|
|
38
|
+
}
|
|
39
|
+
async function fetchAccounts(page, servicesUrl, monthMoment) {
|
|
40
|
+
const dataUrl = getAccountsUrl(servicesUrl, monthMoment);
|
|
41
|
+
debug(`fetching accounts from ${dataUrl}`);
|
|
42
|
+
const dataResult = await (0, _fetch.fetchGetWithinPage)(page, dataUrl);
|
|
43
|
+
if (dataResult && _lodash.default.get(dataResult, 'Header.Status') === '1' && dataResult.DashboardMonthBean) {
|
|
44
|
+
const {
|
|
45
|
+
cardsCharges
|
|
46
|
+
} = dataResult.DashboardMonthBean;
|
|
47
|
+
if (cardsCharges) {
|
|
48
|
+
return cardsCharges.map(cardCharge => {
|
|
49
|
+
return {
|
|
50
|
+
index: parseInt(cardCharge.cardIndex, 10),
|
|
51
|
+
accountNumber: cardCharge.cardNumber,
|
|
52
|
+
processedDate: (0, _moment.default)(cardCharge.billingDate, DATE_FORMAT).toISOString()
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
function getTransactionsUrl(servicesUrl, monthMoment) {
|
|
60
|
+
const month = monthMoment.month() + 1;
|
|
61
|
+
const year = monthMoment.year();
|
|
62
|
+
const monthStr = month < 10 ? `0${month}` : month.toString();
|
|
63
|
+
const url = new URL(servicesUrl);
|
|
64
|
+
url.searchParams.set('reqName', 'CardsTransactionsList');
|
|
65
|
+
url.searchParams.set('month', monthStr);
|
|
66
|
+
url.searchParams.set('year', `${year}`);
|
|
67
|
+
url.searchParams.set('requiredDate', 'N');
|
|
68
|
+
return url.toString();
|
|
69
|
+
}
|
|
70
|
+
function convertCurrency(currencyStr) {
|
|
71
|
+
if (currencyStr === _constants.SHEKEL_CURRENCY_KEYWORD || currencyStr === _constants.ALT_SHEKEL_CURRENCY) {
|
|
72
|
+
return _constants.SHEKEL_CURRENCY;
|
|
73
|
+
}
|
|
74
|
+
return currencyStr;
|
|
75
|
+
}
|
|
76
|
+
function getInstallmentsInfo(txn) {
|
|
77
|
+
if (!txn.moreInfo || !txn.moreInfo.includes(INSTALLMENTS_KEYWORD)) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
const matches = txn.moreInfo.match(/\d+/g);
|
|
81
|
+
if (!matches || matches.length < 2) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
number: parseInt(matches[0], 10),
|
|
86
|
+
total: parseInt(matches[1], 10)
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function getTransactionType(txn) {
|
|
90
|
+
return getInstallmentsInfo(txn) ? _transactions2.TransactionTypes.Installments : _transactions2.TransactionTypes.Normal;
|
|
91
|
+
}
|
|
92
|
+
function convertTransactions(txns, processedDate) {
|
|
93
|
+
const filteredTxns = txns.filter(txn => txn.dealSumType !== '1' && txn.voucherNumberRatz !== '000000000' && txn.voucherNumberRatzOutbound !== '000000000');
|
|
94
|
+
return filteredTxns.map(txn => {
|
|
95
|
+
const isOutbound = txn.dealSumOutbound;
|
|
96
|
+
const txnDateStr = isOutbound ? txn.fullPurchaseDateOutbound : txn.fullPurchaseDate;
|
|
97
|
+
const txnMoment = (0, _moment.default)(txnDateStr, DATE_FORMAT);
|
|
98
|
+
const currentProcessedDate = txn.fullPaymentDate ? (0, _moment.default)(txn.fullPaymentDate, DATE_FORMAT).toISOString() : processedDate;
|
|
99
|
+
const result = {
|
|
100
|
+
type: getTransactionType(txn),
|
|
101
|
+
identifier: parseInt(isOutbound ? txn.voucherNumberRatzOutbound : txn.voucherNumberRatz, 10),
|
|
102
|
+
date: txnMoment.toISOString(),
|
|
103
|
+
processedDate: currentProcessedDate,
|
|
104
|
+
originalAmount: isOutbound ? -txn.dealSumOutbound : -txn.dealSum,
|
|
105
|
+
originalCurrency: convertCurrency(txn.currentPaymentCurrency ?? txn.currencyId),
|
|
106
|
+
chargedAmount: isOutbound ? -txn.paymentSumOutbound : -txn.paymentSum,
|
|
107
|
+
chargedCurrency: convertCurrency(txn.currencyId),
|
|
108
|
+
description: isOutbound ? txn.fullSupplierNameOutbound : txn.fullSupplierNameHeb,
|
|
109
|
+
memo: txn.moreInfo || '',
|
|
110
|
+
installments: getInstallmentsInfo(txn) || undefined,
|
|
111
|
+
status: _transactions2.TransactionStatuses.Completed
|
|
112
|
+
};
|
|
113
|
+
return result;
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
async function fetchTransactions(page, options, companyServiceOptions, startMoment, monthMoment) {
|
|
117
|
+
const accounts = await fetchAccounts(page, companyServiceOptions.servicesUrl, monthMoment);
|
|
118
|
+
const dataUrl = getTransactionsUrl(companyServiceOptions.servicesUrl, monthMoment);
|
|
119
|
+
await (0, _waiting.sleep)(RATE_LIMIT.SLEEP_BETWEEN);
|
|
120
|
+
debug(`fetching transactions from ${dataUrl} for month ${monthMoment.format('YYYY-MM')}`);
|
|
121
|
+
const dataResult = await (0, _fetch.fetchGetWithinPage)(page, dataUrl);
|
|
122
|
+
if (dataResult && _lodash.default.get(dataResult, 'Header.Status') === '1' && dataResult.CardsTransactionsListBean) {
|
|
123
|
+
const accountTxns = {};
|
|
124
|
+
accounts.forEach(account => {
|
|
125
|
+
const txnGroups = _lodash.default.get(dataResult, `CardsTransactionsListBean.Index${account.index}.CurrentCardTransactions`);
|
|
126
|
+
if (txnGroups) {
|
|
127
|
+
let allTxns = [];
|
|
128
|
+
txnGroups.forEach(txnGroup => {
|
|
129
|
+
if (txnGroup.txnIsrael) {
|
|
130
|
+
const txns = convertTransactions(txnGroup.txnIsrael, account.processedDate);
|
|
131
|
+
allTxns.push(...txns);
|
|
132
|
+
}
|
|
133
|
+
if (txnGroup.txnAbroad) {
|
|
134
|
+
const txns = convertTransactions(txnGroup.txnAbroad, account.processedDate);
|
|
135
|
+
allTxns.push(...txns);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
if (!options.combineInstallments) {
|
|
139
|
+
allTxns = (0, _transactions.fixInstallments)(allTxns);
|
|
140
|
+
}
|
|
141
|
+
if (options.outputData?.enableTransactionsFilterByDate ?? true) {
|
|
142
|
+
allTxns = (0, _transactions.filterOldTransactions)(allTxns, startMoment, options.combineInstallments || false);
|
|
143
|
+
}
|
|
144
|
+
accountTxns[account.accountNumber] = {
|
|
145
|
+
accountNumber: account.accountNumber,
|
|
146
|
+
index: account.index,
|
|
147
|
+
txns: allTxns
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
return accountTxns;
|
|
152
|
+
}
|
|
153
|
+
return {};
|
|
154
|
+
}
|
|
155
|
+
async function getExtraScrapTransaction(page, options, month, accountIndex, transaction) {
|
|
156
|
+
const url = new URL(options.servicesUrl);
|
|
157
|
+
url.searchParams.set('reqName', 'PirteyIska_204');
|
|
158
|
+
url.searchParams.set('CardIndex', accountIndex.toString());
|
|
159
|
+
url.searchParams.set('shovarRatz', transaction.identifier.toString());
|
|
160
|
+
url.searchParams.set('moedChiuv', month.format('MMYYYY'));
|
|
161
|
+
debug(`fetching extra scrap for transaction ${transaction.identifier} for month ${month.format('YYYY-MM')}`);
|
|
162
|
+
const data = await (0, _fetch.fetchGetWithinPage)(page, url.toString());
|
|
163
|
+
if (!data) {
|
|
164
|
+
return transaction;
|
|
165
|
+
}
|
|
166
|
+
const rawCategory = _lodash.default.get(data, 'PirteyIska_204Bean.sector') ?? '';
|
|
167
|
+
return {
|
|
168
|
+
...transaction,
|
|
169
|
+
category: rawCategory.trim()
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
async function getExtraScrapAccount(page, options, accountMap, month) {
|
|
173
|
+
const accounts = [];
|
|
174
|
+
for (const account of Object.values(accountMap)) {
|
|
175
|
+
debug(`get extra scrap for ${account.accountNumber} with ${account.txns.length} transactions`, month.format('YYYY-MM'));
|
|
176
|
+
const txns = [];
|
|
177
|
+
for (const txnsChunk of _lodash.default.chunk(account.txns, RATE_LIMIT.TRANSACTIONS_BATCH_SIZE)) {
|
|
178
|
+
debug(`processing chunk of ${txnsChunk.length} transactions for account ${account.accountNumber}`);
|
|
179
|
+
const updatedTxns = await Promise.all(txnsChunk.map(t => getExtraScrapTransaction(page, options, month, account.index, t)));
|
|
180
|
+
await (0, _waiting.sleep)(RATE_LIMIT.SLEEP_BETWEEN);
|
|
181
|
+
txns.push(...updatedTxns);
|
|
182
|
+
}
|
|
183
|
+
accounts.push({
|
|
184
|
+
...account,
|
|
185
|
+
txns
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
return accounts.reduce((m, x) => ({
|
|
189
|
+
...m,
|
|
190
|
+
[x.accountNumber]: x
|
|
191
|
+
}), {});
|
|
192
|
+
}
|
|
193
|
+
async function getAdditionalTransactionInformation(scraperOptions, accountsWithIndex, page, options, allMonths) {
|
|
194
|
+
if (!scraperOptions.additionalTransactionInformation || scraperOptions.optInFeatures?.includes('isracard-amex:skipAdditionalTransactionInformation')) {
|
|
195
|
+
return accountsWithIndex;
|
|
196
|
+
}
|
|
197
|
+
return (0, _waiting.runSerial)(accountsWithIndex.map((a, i) => () => getExtraScrapAccount(page, options, a, allMonths[i])));
|
|
198
|
+
}
|
|
199
|
+
async function fetchAllTransactions(page, options, companyServiceOptions, startMoment) {
|
|
200
|
+
const futureMonthsToScrape = options.futureMonthsToScrape ?? 1;
|
|
201
|
+
const allMonths = (0, _dates.default)(startMoment, futureMonthsToScrape);
|
|
202
|
+
const results = await (0, _waiting.runSerial)(allMonths.map(monthMoment => () => {
|
|
203
|
+
return fetchTransactions(page, options, companyServiceOptions, startMoment, monthMoment);
|
|
204
|
+
}));
|
|
205
|
+
const finalResult = await getAdditionalTransactionInformation(options, results, page, companyServiceOptions, allMonths);
|
|
206
|
+
const combinedTxns = {};
|
|
207
|
+
finalResult.forEach(result => {
|
|
208
|
+
Object.keys(result).forEach(accountNumber => {
|
|
209
|
+
let txnsForAccount = combinedTxns[accountNumber];
|
|
210
|
+
if (!txnsForAccount) {
|
|
211
|
+
txnsForAccount = [];
|
|
212
|
+
combinedTxns[accountNumber] = txnsForAccount;
|
|
213
|
+
}
|
|
214
|
+
const toBeAddedTxns = result[accountNumber].txns;
|
|
215
|
+
combinedTxns[accountNumber].push(...toBeAddedTxns);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
const accounts = Object.keys(combinedTxns).map(accountNumber => {
|
|
219
|
+
return {
|
|
220
|
+
accountNumber,
|
|
221
|
+
txns: combinedTxns[accountNumber]
|
|
222
|
+
};
|
|
223
|
+
});
|
|
224
|
+
return {
|
|
225
|
+
success: true,
|
|
226
|
+
accounts
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
class IsracardAmexBaseScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
|
|
230
|
+
constructor(options, baseUrl, companyCode) {
|
|
231
|
+
super(options);
|
|
232
|
+
this.baseUrl = baseUrl;
|
|
233
|
+
this.companyCode = companyCode;
|
|
234
|
+
this.servicesUrl = `${baseUrl}/services/ProxyRequestHandler.ashx`;
|
|
235
|
+
}
|
|
236
|
+
async login(credentials) {
|
|
237
|
+
await this.page.setRequestInterception(true);
|
|
238
|
+
this.page.on('request', request => {
|
|
239
|
+
if (request.url().includes('detector-dom.min.js')) {
|
|
240
|
+
debug('force abort for request do download detector-dom.min.js resource');
|
|
241
|
+
void request.abort(undefined, _browser.interceptionPriorities.abort);
|
|
242
|
+
} else {
|
|
243
|
+
void request.continue(undefined, _browser.interceptionPriorities.continue);
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
await (0, _browser.maskHeadlessUserAgent)(this.page);
|
|
247
|
+
await this.navigateTo(`${this.baseUrl}/personalarea/Login`);
|
|
248
|
+
this.emitProgress(_definitions.ScraperProgressTypes.LoggingIn);
|
|
249
|
+
const validateUrl = `${this.servicesUrl}?reqName=ValidateIdData`;
|
|
250
|
+
const validateRequest = {
|
|
251
|
+
id: credentials.id,
|
|
252
|
+
cardSuffix: credentials.card6Digits,
|
|
253
|
+
countryCode: COUNTRY_CODE,
|
|
254
|
+
idType: ID_TYPE,
|
|
255
|
+
checkLevel: '1',
|
|
256
|
+
companyCode: this.companyCode
|
|
257
|
+
};
|
|
258
|
+
debug('logging in with validate request');
|
|
259
|
+
const validateResult = await (0, _fetch.fetchPostWithinPage)(this.page, validateUrl, validateRequest);
|
|
260
|
+
if (!validateResult || !validateResult.Header || validateResult.Header.Status !== '1' || !validateResult.ValidateIdDataBean) {
|
|
261
|
+
throw new Error('unknown error during login');
|
|
262
|
+
}
|
|
263
|
+
const validateReturnCode = validateResult.ValidateIdDataBean.returnCode;
|
|
264
|
+
debug(`user validate with return code '${validateReturnCode}'`);
|
|
265
|
+
if (validateReturnCode === '1') {
|
|
266
|
+
const {
|
|
267
|
+
userName
|
|
268
|
+
} = validateResult.ValidateIdDataBean;
|
|
269
|
+
const loginUrl = `${this.servicesUrl}?reqName=performLogonI`;
|
|
270
|
+
const request = {
|
|
271
|
+
KodMishtamesh: userName,
|
|
272
|
+
MisparZihuy: credentials.id,
|
|
273
|
+
Sisma: credentials.password,
|
|
274
|
+
cardSuffix: credentials.card6Digits,
|
|
275
|
+
countryCode: COUNTRY_CODE,
|
|
276
|
+
idType: ID_TYPE
|
|
277
|
+
};
|
|
278
|
+
debug('user login started');
|
|
279
|
+
const loginResult = await (0, _fetch.fetchPostWithinPage)(this.page, loginUrl, request);
|
|
280
|
+
debug(`user login with status '${loginResult?.status}'`, loginResult);
|
|
281
|
+
if (loginResult && loginResult.status === '1') {
|
|
282
|
+
this.emitProgress(_definitions.ScraperProgressTypes.LoginSuccess);
|
|
283
|
+
return {
|
|
284
|
+
success: true
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
if (loginResult && loginResult.status === '3') {
|
|
288
|
+
this.emitProgress(_definitions.ScraperProgressTypes.ChangePassword);
|
|
289
|
+
return {
|
|
290
|
+
success: false,
|
|
291
|
+
errorType: _errors.ScraperErrorTypes.ChangePassword
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
this.emitProgress(_definitions.ScraperProgressTypes.LoginFailed);
|
|
295
|
+
return {
|
|
296
|
+
success: false,
|
|
297
|
+
errorType: _errors.ScraperErrorTypes.InvalidPassword
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
if (validateReturnCode === '4') {
|
|
301
|
+
this.emitProgress(_definitions.ScraperProgressTypes.ChangePassword);
|
|
302
|
+
return {
|
|
303
|
+
success: false,
|
|
304
|
+
errorType: _errors.ScraperErrorTypes.ChangePassword
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
this.emitProgress(_definitions.ScraperProgressTypes.LoginFailed);
|
|
308
|
+
return {
|
|
309
|
+
success: false,
|
|
310
|
+
errorType: _errors.ScraperErrorTypes.InvalidPassword
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
async fetchData() {
|
|
314
|
+
const defaultStartMoment = (0, _moment.default)().subtract(1, 'years');
|
|
315
|
+
const startDate = this.options.startDate || defaultStartMoment.toDate();
|
|
316
|
+
const startMoment = _moment.default.max(defaultStartMoment, (0, _moment.default)(startDate));
|
|
317
|
+
return fetchAllTransactions(this.page, this.options, {
|
|
318
|
+
servicesUrl: this.servicesUrl,
|
|
319
|
+
companyCode: this.companyCode
|
|
320
|
+
}, startMoment);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
var _default = exports.default = IsracardAmexBaseScraper;
|
|
324
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbW9tZW50IiwiX2NvbnN0YW50cyIsIl9kZWZpbml0aW9ucyIsIl9kYXRlcyIsIl9kZWJ1ZyIsIl9mZXRjaCIsIl90cmFuc2FjdGlvbnMiLCJfd2FpdGluZyIsIl90cmFuc2FjdGlvbnMyIiwiX2Jhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJfZXJyb3JzIiwiX2Jyb3dzZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJSQVRFX0xJTUlUIiwiU0xFRVBfQkVUV0VFTiIsIlRSQU5TQUNUSU9OU19CQVRDSF9TSVpFIiwiQ09VTlRSWV9DT0RFIiwiSURfVFlQRSIsIklOU1RBTExNRU5UU19LRVlXT1JEIiwiREFURV9GT1JNQVQiLCJkZWJ1ZyIsImdldERlYnVnIiwiZ2V0QWNjb3VudHNVcmwiLCJzZXJ2aWNlc1VybCIsIm1vbnRoTW9tZW50IiwiYmlsbGluZ0RhdGUiLCJmb3JtYXQiLCJ1cmwiLCJVUkwiLCJzZWFyY2hQYXJhbXMiLCJzZXQiLCJ0b1N0cmluZyIsImZldGNoQWNjb3VudHMiLCJwYWdlIiwiZGF0YVVybCIsImRhdGFSZXN1bHQiLCJmZXRjaEdldFdpdGhpblBhZ2UiLCJfIiwiZ2V0IiwiRGFzaGJvYXJkTW9udGhCZWFuIiwiY2FyZHNDaGFyZ2VzIiwibWFwIiwiY2FyZENoYXJnZSIsImluZGV4IiwicGFyc2VJbnQiLCJjYXJkSW5kZXgiLCJhY2NvdW50TnVtYmVyIiwiY2FyZE51bWJlciIsInByb2Nlc3NlZERhdGUiLCJtb21lbnQiLCJ0b0lTT1N0cmluZyIsImdldFRyYW5zYWN0aW9uc1VybCIsIm1vbnRoIiwieWVhciIsIm1vbnRoU3RyIiwiY29udmVydEN1cnJlbmN5IiwiY3VycmVuY3lTdHIiLCJTSEVLRUxfQ1VSUkVOQ1lfS0VZV09SRCIsIkFMVF9TSEVLRUxfQ1VSUkVOQ1kiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJnZXRJbnN0YWxsbWVudHNJbmZvIiwidHhuIiwibW9yZUluZm8iLCJpbmNsdWRlcyIsInVuZGVmaW5lZCIsIm1hdGNoZXMiLCJtYXRjaCIsImxlbmd0aCIsIm51bWJlciIsInRvdGFsIiwiZ2V0VHJhbnNhY3Rpb25UeXBlIiwiVHJhbnNhY3Rpb25UeXBlcyIsIkluc3RhbGxtZW50cyIsIk5vcm1hbCIsImNvbnZlcnRUcmFuc2FjdGlvbnMiLCJ0eG5zIiwiZmlsdGVyZWRUeG5zIiwiZmlsdGVyIiwiZGVhbFN1bVR5cGUiLCJ2b3VjaGVyTnVtYmVyUmF0eiIsInZvdWNoZXJOdW1iZXJSYXR6T3V0Ym91bmQiLCJpc091dGJvdW5kIiwiZGVhbFN1bU91dGJvdW5kIiwidHhuRGF0ZVN0ciIsImZ1bGxQdXJjaGFzZURhdGVPdXRib3VuZCIsImZ1bGxQdXJjaGFzZURhdGUiLCJ0eG5Nb21lbnQiLCJjdXJyZW50UHJvY2Vzc2VkRGF0ZSIsImZ1bGxQYXltZW50RGF0ZSIsInJlc3VsdCIsInR5cGUiLCJpZGVudGlmaWVyIiwiZGF0ZSIsIm9yaWdpbmFsQW1vdW50IiwiZGVhbFN1bSIsIm9yaWdpbmFsQ3VycmVuY3kiLCJjdXJyZW50UGF5bWVudEN1cnJlbmN5IiwiY3VycmVuY3lJZCIsImNoYXJnZWRBbW91bnQiLCJwYXltZW50U3VtT3V0Ym91bmQiLCJwYXltZW50U3VtIiwiY2hhcmdlZEN1cnJlbmN5IiwiZGVzY3JpcHRpb24iLCJmdWxsU3VwcGxpZXJOYW1lT3V0Ym91bmQiLCJmdWxsU3VwcGxpZXJOYW1lSGViIiwibWVtbyIsImluc3RhbGxtZW50cyIsInN0YXR1cyIsIlRyYW5zYWN0aW9uU3RhdHVzZXMiLCJDb21wbGV0ZWQiLCJmZXRjaFRyYW5zYWN0aW9ucyIsIm9wdGlvbnMiLCJjb21wYW55U2VydmljZU9wdGlvbnMiLCJzdGFydE1vbWVudCIsImFjY291bnRzIiwic2xlZXAiLCJDYXJkc1RyYW5zYWN0aW9uc0xpc3RCZWFuIiwiYWNjb3VudFR4bnMiLCJmb3JFYWNoIiwiYWNjb3VudCIsInR4bkdyb3VwcyIsImFsbFR4bnMiLCJ0eG5Hcm91cCIsInR4bklzcmFlbCIsInB1c2giLCJ0eG5BYnJvYWQiLCJjb21iaW5lSW5zdGFsbG1lbnRzIiwiZml4SW5zdGFsbG1lbnRzIiwib3V0cHV0RGF0YSIsImVuYWJsZVRyYW5zYWN0aW9uc0ZpbHRlckJ5RGF0ZSIsImZpbHRlck9sZFRyYW5zYWN0aW9ucyIsImdldEV4dHJhU2NyYXBUcmFuc2FjdGlvbiIsImFjY291bnRJbmRleCIsInRyYW5zYWN0aW9uIiwiZGF0YSIsInJhd0NhdGVnb3J5IiwiY2F0ZWdvcnkiLCJ0cmltIiwiZ2V0RXh0cmFTY3JhcEFjY291bnQiLCJhY2NvdW50TWFwIiwiT2JqZWN0IiwidmFsdWVzIiwidHhuc0NodW5rIiwiY2h1bmsiLCJ1cGRhdGVkVHhucyIsIlByb21pc2UiLCJhbGwiLCJ0IiwicmVkdWNlIiwibSIsIngiLCJnZXRBZGRpdGlvbmFsVHJhbnNhY3Rpb25JbmZvcm1hdGlvbiIsInNjcmFwZXJPcHRpb25zIiwiYWNjb3VudHNXaXRoSW5kZXgiLCJhbGxNb250aHMiLCJhZGRpdGlvbmFsVHJhbnNhY3Rpb25JbmZvcm1hdGlvbiIsIm9wdEluRmVhdHVyZXMiLCJydW5TZXJpYWwiLCJhIiwiaSIsImZldGNoQWxsVHJhbnNhY3Rpb25zIiwiZnV0dXJlTW9udGhzVG9TY3JhcGUiLCJnZXRBbGxNb250aE1vbWVudHMiLCJyZXN1bHRzIiwiZmluYWxSZXN1bHQiLCJjb21iaW5lZFR4bnMiLCJrZXlzIiwidHhuc0ZvckFjY291bnQiLCJ0b0JlQWRkZWRUeG5zIiwic3VjY2VzcyIsIklzcmFjYXJkQW1leEJhc2VTY3JhcGVyIiwiQmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsImNvbnN0cnVjdG9yIiwiYmFzZVVybCIsImNvbXBhbnlDb2RlIiwibG9naW4iLCJjcmVkZW50aWFscyIsInNldFJlcXVlc3RJbnRlcmNlcHRpb24iLCJvbiIsInJlcXVlc3QiLCJhYm9ydCIsImludGVyY2VwdGlvblByaW9yaXRpZXMiLCJjb250aW51ZSIsIm1hc2tIZWFkbGVzc1VzZXJBZ2VudCIsIm5hdmlnYXRlVG8iLCJlbWl0UHJvZ3Jlc3MiLCJTY3JhcGVyUHJvZ3Jlc3NUeXBlcyIsIkxvZ2dpbmdJbiIsInZhbGlkYXRlVXJsIiwidmFsaWRhdGVSZXF1ZXN0IiwiaWQiLCJjYXJkU3VmZml4IiwiY2FyZDZEaWdpdHMiLCJjb3VudHJ5Q29kZSIsImlkVHlwZSIsImNoZWNrTGV2ZWwiLCJ2YWxpZGF0ZVJlc3VsdCIsImZldGNoUG9zdFdpdGhpblBhZ2UiLCJIZWFkZXIiLCJTdGF0dXMiLCJWYWxpZGF0ZUlkRGF0YUJlYW4iLCJFcnJvciIsInZhbGlkYXRlUmV0dXJuQ29kZSIsInJldHVybkNvZGUiLCJ1c2VyTmFtZSIsImxvZ2luVXJsIiwiS29kTWlzaHRhbWVzaCIsIk1pc3BhclppaHV5IiwiU2lzbWEiLCJwYXNzd29yZCIsImxvZ2luUmVzdWx0IiwiTG9naW5TdWNjZXNzIiwiQ2hhbmdlUGFzc3dvcmQiLCJlcnJvclR5cGUiLCJTY3JhcGVyRXJyb3JUeXBlcyIsIkxvZ2luRmFpbGVkIiwiSW52YWxpZFBhc3N3b3JkIiwiZmV0Y2hEYXRhIiwiZGVmYXVsdFN0YXJ0TW9tZW50Iiwic3VidHJhY3QiLCJzdGFydERhdGUiLCJ0b0RhdGUiLCJtYXgiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvYmFzZS1pc3JhY2FyZC1hbWV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbW9tZW50LCB7IHR5cGUgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gJ3B1cHBldGVlcic7XG5pbXBvcnQgeyBBTFRfU0hFS0VMX0NVUlJFTkNZLCBTSEVLRUxfQ1VSUkVOQ1ksIFNIRUtFTF9DVVJSRU5DWV9LRVlXT1JEIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFNjcmFwZXJQcm9ncmVzc1R5cGVzIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IGdldEFsbE1vbnRoTW9tZW50cyBmcm9tICcuLi9oZWxwZXJzL2RhdGVzJztcbmltcG9ydCB7IGdldERlYnVnIH0gZnJvbSAnLi4vaGVscGVycy9kZWJ1Zyc7XG5pbXBvcnQgeyBmZXRjaEdldFdpdGhpblBhZ2UsIGZldGNoUG9zdFdpdGhpblBhZ2UgfSBmcm9tICcuLi9oZWxwZXJzL2ZldGNoJztcbmltcG9ydCB7IGZpbHRlck9sZFRyYW5zYWN0aW9ucywgZml4SW5zdGFsbG1lbnRzIH0gZnJvbSAnLi4vaGVscGVycy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgcnVuU2VyaWFsLCBzbGVlcCB9IGZyb20gJy4uL2hlbHBlcnMvd2FpdGluZyc7XG5pbXBvcnQge1xuICBUcmFuc2FjdGlvblN0YXR1c2VzLFxuICBUcmFuc2FjdGlvblR5cGVzLFxuICB0eXBlIFRyYW5zYWN0aW9uLFxuICB0eXBlIFRyYW5zYWN0aW9uSW5zdGFsbG1lbnRzLFxuICB0eXBlIFRyYW5zYWN0aW9uc0FjY291bnQsXG59IGZyb20gJy4uL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBCYXNlU2NyYXBlcldpdGhCcm93c2VyIH0gZnJvbSAnLi9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyJztcbmltcG9ydCB7IFNjcmFwZXJFcnJvclR5cGVzIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgdHlwZSBTY3JhcGVyT3B0aW9ucywgdHlwZSBTY3JhcGVyU2NyYXBpbmdSZXN1bHQgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBpbnRlcmNlcHRpb25Qcmlvcml0aWVzLCBtYXNrSGVhZGxlc3NVc2VyQWdlbnQgfSBmcm9tICcuLi9oZWxwZXJzL2Jyb3dzZXInO1xuXG5jb25zdCBSQVRFX0xJTUlUID0ge1xuICBTTEVFUF9CRVRXRUVOOiAxMDAwLFxuICBUUkFOU0FDVElPTlNfQkFUQ0hfU0laRTogMTAsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBDT1VOVFJZX0NPREUgPSAnMjEyJztcbmNvbnN0IElEX1RZUEUgPSAnMSc7XG5jb25zdCBJTlNUQUxMTUVOVFNfS0VZV09SRCA9ICfXqtep15zXldedJztcblxuY29uc3QgREFURV9GT1JNQVQgPSAnREQvTU0vWVlZWSc7XG5cbmNvbnN0IGRlYnVnID0gZ2V0RGVidWcoJ2Jhc2UtaXNyYWNhcmQtYW1leCcpO1xuXG50eXBlIENvbXBhbnlTZXJ2aWNlT3B0aW9ucyA9IHtcbiAgc2VydmljZXNVcmw6IHN0cmluZztcbiAgY29tcGFueUNvZGU6IHN0cmluZztcbn07XG5cbnR5cGUgU2NyYXBlZEFjY291bnRzV2l0aEluZGV4ID0gUmVjb3JkPHN0cmluZywgVHJhbnNhY3Rpb25zQWNjb3VudCAmIHsgaW5kZXg6IG51bWJlciB9PjtcblxuaW50ZXJmYWNlIFNjcmFwZWRUcmFuc2FjdGlvbiB7XG4gIGRlYWxTdW1UeXBlOiBzdHJpbmc7XG4gIHZvdWNoZXJOdW1iZXJSYXR6T3V0Ym91bmQ6IHN0cmluZztcbiAgdm91Y2hlck51bWJlclJhdHo6IHN0cmluZztcbiAgbW9yZUluZm8/OiBzdHJpbmc7XG4gIGRlYWxTdW1PdXRib3VuZDogYm9vbGVhbjtcbiAgY3VycmVuY3lJZDogc3RyaW5nO1xuICBjdXJyZW50UGF5bWVudEN1cnJlbmN5OiBzdHJpbmc7XG4gIGRlYWxTdW06IG51bWJlcjtcbiAgZnVsbFBheW1lbnREYXRlPzogc3RyaW5nO1xuICBmdWxsUHVyY2hhc2VEYXRlPzogc3RyaW5nO1xuICBmdWxsUHVyY2hhc2VEYXRlT3V0Ym91bmQ/OiBzdHJpbmc7XG4gIGZ1bGxTdXBwbGllck5hbWVIZWI6IHN0cmluZztcbiAgZnVsbFN1cHBsaWVyTmFtZU91dGJvdW5kOiBzdHJpbmc7XG4gIHBheW1lbnRTdW06IG51bWJlcjtcbiAgcGF5bWVudFN1bU91dGJvdW5kOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTY3JhcGVkQWNjb3VudCB7XG4gIGluZGV4OiBudW1iZXI7XG4gIGFjY291bnROdW1iZXI6IHN0cmluZztcbiAgcHJvY2Vzc2VkRGF0ZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU2NyYXBlZExvZ2luVmFsaWRhdGlvbiB7XG4gIEhlYWRlcjoge1xuICAgIFN0YXR1czogc3RyaW5nO1xuICB9O1xuICBWYWxpZGF0ZUlkRGF0YUJlYW4/OiB7XG4gICAgdXNlck5hbWU/OiBzdHJpbmc7XG4gICAgcmV0dXJuQ29kZTogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgU2NyYXBlZEFjY291bnRzV2l0aGluUGFnZVJlc3BvbnNlIHtcbiAgSGVhZGVyOiB7XG4gICAgU3RhdHVzOiBzdHJpbmc7XG4gIH07XG4gIERhc2hib2FyZE1vbnRoQmVhbj86IHtcbiAgICBjYXJkc0NoYXJnZXM6IHtcbiAgICAgIGNhcmRJbmRleDogc3RyaW5nO1xuICAgICAgY2FyZE51bWJlcjogc3RyaW5nO1xuICAgICAgYmlsbGluZ0RhdGU6IHN0cmluZztcbiAgICB9W107XG4gIH07XG59XG5cbmludGVyZmFjZSBTY3JhcGVkQ3VycmVudENhcmRUcmFuc2FjdGlvbnMge1xuICB0eG5Jc3JhZWw/OiBTY3JhcGVkVHJhbnNhY3Rpb25bXTtcbiAgdHhuQWJyb2FkPzogU2NyYXBlZFRyYW5zYWN0aW9uW107XG59XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb25EYXRhIHtcbiAgSGVhZGVyPzoge1xuICAgIFN0YXR1czogc3RyaW5nO1xuICB9O1xuICBQaXJ0ZXlJc2thXzIwNEJlYW4/OiB7XG4gICAgc2VjdG9yOiBzdHJpbmc7XG4gIH07XG5cbiAgQ2FyZHNUcmFuc2FjdGlvbnNMaXN0QmVhbj86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgQ3VycmVudENhcmRUcmFuc2FjdGlvbnM6IFNjcmFwZWRDdXJyZW50Q2FyZFRyYW5zYWN0aW9uc1tdO1xuICAgIH1cbiAgPjtcbn1cblxuZnVuY3Rpb24gZ2V0QWNjb3VudHNVcmwoc2VydmljZXNVcmw6IHN0cmluZywgbW9udGhNb21lbnQ6IE1vbWVudCkge1xuICBjb25zdCBiaWxsaW5nRGF0ZSA9IG1vbnRoTW9tZW50LmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHNlcnZpY2VzVXJsKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3JlcU5hbWUnLCAnRGFzaGJvYXJkTW9udGgnKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2FjdGlvbkNvZGUnLCAnMCcpO1xuICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnYmlsbGluZ0RhdGUnLCBiaWxsaW5nRGF0ZSk7XG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdmb3JtYXQnLCAnSnNvbicpO1xuICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWNjb3VudHMocGFnZTogUGFnZSwgc2VydmljZXNVcmw6IHN0cmluZywgbW9udGhNb21lbnQ6IE1vbWVudCk6IFByb21pc2U8U2NyYXBlZEFjY291bnRbXT4ge1xuICBjb25zdCBkYXRhVXJsID0gZ2V0QWNjb3VudHNVcmwoc2VydmljZXNVcmwsIG1vbnRoTW9tZW50KTtcbiAgZGVidWcoYGZldGNoaW5nIGFjY291bnRzIGZyb20gJHtkYXRhVXJsfWApO1xuICBjb25zdCBkYXRhUmVzdWx0ID0gYXdhaXQgZmV0Y2hHZXRXaXRoaW5QYWdlPFNjcmFwZWRBY2NvdW50c1dpdGhpblBhZ2VSZXNwb25zZT4ocGFnZSwgZGF0YVVybCk7XG4gIGlmIChkYXRhUmVzdWx0ICYmIF8uZ2V0KGRhdGFSZXN1bHQsICdIZWFkZXIuU3RhdHVzJykgPT09ICcxJyAmJiBkYXRhUmVzdWx0LkRhc2hib2FyZE1vbnRoQmVhbikge1xuICAgIGNvbnN0IHsgY2FyZHNDaGFyZ2VzIH0gPSBkYXRhUmVzdWx0LkRhc2hib2FyZE1vbnRoQmVhbjtcbiAgICBpZiAoY2FyZHNDaGFyZ2VzKSB7XG4gICAgICByZXR1cm4gY2FyZHNDaGFyZ2VzLm1hcChjYXJkQ2hhcmdlID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpbmRleDogcGFyc2VJbnQoY2FyZENoYXJnZS5jYXJkSW5kZXgsIDEwKSxcbiAgICAgICAgICBhY2NvdW50TnVtYmVyOiBjYXJkQ2hhcmdlLmNhcmROdW1iZXIsXG4gICAgICAgICAgcHJvY2Vzc2VkRGF0ZTogbW9tZW50KGNhcmRDaGFyZ2UuYmlsbGluZ0RhdGUsIERBVEVfRk9STUFUKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25zVXJsKHNlcnZpY2VzVXJsOiBzdHJpbmcsIG1vbnRoTW9tZW50OiBNb21lbnQpIHtcbiAgY29uc3QgbW9udGggPSBtb250aE1vbWVudC5tb250aCgpICsgMTtcbiAgY29uc3QgeWVhciA9IG1vbnRoTW9tZW50LnllYXIoKTtcbiAgY29uc3QgbW9udGhTdHIgPSBtb250aCA8IDEwID8gYDAke21vbnRofWAgOiBtb250aC50b1N0cmluZygpO1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHNlcnZpY2VzVXJsKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3JlcU5hbWUnLCAnQ2FyZHNUcmFuc2FjdGlvbnNMaXN0Jyk7XG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdtb250aCcsIG1vbnRoU3RyKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3llYXInLCBgJHt5ZWFyfWApO1xuICB1cmwuc2VhcmNoUGFyYW1zLnNldCgncmVxdWlyZWREYXRlJywgJ04nKTtcbiAgcmV0dXJuIHVybC50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0Q3VycmVuY3koY3VycmVuY3lTdHI6IHN0cmluZykge1xuICBpZiAoY3VycmVuY3lTdHIgPT09IFNIRUtFTF9DVVJSRU5DWV9LRVlXT1JEIHx8IGN1cnJlbmN5U3RyID09PSBBTFRfU0hFS0VMX0NVUlJFTkNZKSB7XG4gICAgcmV0dXJuIFNIRUtFTF9DVVJSRU5DWTtcbiAgfVxuICByZXR1cm4gY3VycmVuY3lTdHI7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxtZW50c0luZm8odHhuOiBTY3JhcGVkVHJhbnNhY3Rpb24pOiBUcmFuc2FjdGlvbkluc3RhbGxtZW50cyB8IHVuZGVmaW5lZCB7XG4gIGlmICghdHhuLm1vcmVJbmZvIHx8ICF0eG4ubW9yZUluZm8uaW5jbHVkZXMoSU5TVEFMTE1FTlRTX0tFWVdPUkQpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBtYXRjaGVzID0gdHhuLm1vcmVJbmZvLm1hdGNoKC9cXGQrL2cpO1xuICBpZiAoIW1hdGNoZXMgfHwgbWF0Y2hlcy5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbnVtYmVyOiBwYXJzZUludChtYXRjaGVzWzBdLCAxMCksXG4gICAgdG90YWw6IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25UeXBlKHR4bjogU2NyYXBlZFRyYW5zYWN0aW9uKSB7XG4gIHJldHVybiBnZXRJbnN0YWxsbWVudHNJbmZvKHR4bikgPyBUcmFuc2FjdGlvblR5cGVzLkluc3RhbGxtZW50cyA6IFRyYW5zYWN0aW9uVHlwZXMuTm9ybWFsO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdLCBwcm9jZXNzZWREYXRlOiBzdHJpbmcpOiBUcmFuc2FjdGlvbltdIHtcbiAgY29uc3QgZmlsdGVyZWRUeG5zID0gdHhucy5maWx0ZXIoXG4gICAgdHhuID0+XG4gICAgICB0eG4uZGVhbFN1bVR5cGUgIT09ICcxJyAmJiB0eG4udm91Y2hlck51bWJlclJhdHogIT09ICcwMDAwMDAwMDAnICYmIHR4bi52b3VjaGVyTnVtYmVyUmF0ek91dGJvdW5kICE9PSAnMDAwMDAwMDAwJyxcbiAgKTtcblxuICByZXR1cm4gZmlsdGVyZWRUeG5zLm1hcCh0eG4gPT4ge1xuICAgIGNvbnN0IGlzT3V0Ym91bmQgPSB0eG4uZGVhbFN1bU91dGJvdW5kO1xuICAgIGNvbnN0IHR4bkRhdGVTdHIgPSBpc091dGJvdW5kID8gdHhuLmZ1bGxQdXJjaGFzZURhdGVPdXRib3VuZCA6IHR4bi5mdWxsUHVyY2hhc2VEYXRlO1xuICAgIGNvbnN0IHR4bk1vbWVudCA9IG1vbWVudCh0eG5EYXRlU3RyLCBEQVRFX0ZPUk1BVCk7XG5cbiAgICBjb25zdCBjdXJyZW50UHJvY2Vzc2VkRGF0ZSA9IHR4bi5mdWxsUGF5bWVudERhdGVcbiAgICAgID8gbW9tZW50KHR4bi5mdWxsUGF5bWVudERhdGUsIERBVEVfRk9STUFUKS50b0lTT1N0cmluZygpXG4gICAgICA6IHByb2Nlc3NlZERhdGU7XG4gICAgY29uc3QgcmVzdWx0OiBUcmFuc2FjdGlvbiA9IHtcbiAgICAgIHR5cGU6IGdldFRyYW5zYWN0aW9uVHlwZSh0eG4pLFxuICAgICAgaWRlbnRpZmllcjogcGFyc2VJbnQoaXNPdXRib3VuZCA/IHR4bi52b3VjaGVyTnVtYmVyUmF0ek91dGJvdW5kIDogdHhuLnZvdWNoZXJOdW1iZXJSYXR6LCAxMCksXG4gICAgICBkYXRlOiB0eG5Nb21lbnQudG9JU09TdHJpbmcoKSxcbiAgICAgIHByb2Nlc3NlZERhdGU6IGN1cnJlbnRQcm9jZXNzZWREYXRlLFxuICAgICAgb3JpZ2luYWxBbW91bnQ6IGlzT3V0Ym91bmQgPyAtdHhuLmRlYWxTdW1PdXRib3VuZCA6IC10eG4uZGVhbFN1bSxcbiAgICAgIG9yaWdpbmFsQ3VycmVuY3k6IGNvbnZlcnRDdXJyZW5jeSh0eG4uY3VycmVudFBheW1lbnRDdXJyZW5jeSA/PyB0eG4uY3VycmVuY3lJZCksXG4gICAgICBjaGFyZ2VkQW1vdW50OiBpc091dGJvdW5kID8gLXR4bi5wYXltZW50U3VtT3V0Ym91bmQgOiAtdHhuLnBheW1lbnRTdW0sXG4gICAgICBjaGFyZ2VkQ3VycmVuY3k6IGNvbnZlcnRDdXJyZW5jeSh0eG4uY3VycmVuY3lJZCksXG4gICAgICBkZXNjcmlwdGlvbjogaXNPdXRib3VuZCA/IHR4bi5mdWxsU3VwcGxpZXJOYW1lT3V0Ym91bmQgOiB0eG4uZnVsbFN1cHBsaWVyTmFtZUhlYixcbiAgICAgIG1lbW86IHR4bi5tb3JlSW5mbyB8fCAnJyxcbiAgICAgIGluc3RhbGxtZW50czogZ2V0SW5zdGFsbG1lbnRzSW5mbyh0eG4pIHx8IHVuZGVmaW5lZCxcbiAgICAgIHN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQsXG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFRyYW5zYWN0aW9ucyhcbiAgcGFnZTogUGFnZSxcbiAgb3B0aW9uczogU2NyYXBlck9wdGlvbnMsXG4gIGNvbXBhbnlTZXJ2aWNlT3B0aW9uczogQ29tcGFueVNlcnZpY2VPcHRpb25zLFxuICBzdGFydE1vbWVudDogTW9tZW50LFxuICBtb250aE1vbWVudDogTW9tZW50LFxuKTogUHJvbWlzZTxTY3JhcGVkQWNjb3VudHNXaXRoSW5kZXg+IHtcbiAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBmZXRjaEFjY291bnRzKHBhZ2UsIGNvbXBhbnlTZXJ2aWNlT3B0aW9ucy5zZXJ2aWNlc1VybCwgbW9udGhNb21lbnQpO1xuICBjb25zdCBkYXRhVXJsID0gZ2V0VHJhbnNhY3Rpb25zVXJsKGNvbXBhbnlTZXJ2aWNlT3B0aW9ucy5zZXJ2aWNlc1VybCwgbW9udGhNb21lbnQpO1xuICBhd2FpdCBzbGVlcChSQVRFX0xJTUlULlNMRUVQX0JFVFdFRU4pO1xuICBkZWJ1ZyhgZmV0Y2hpbmcgdHJhbnNhY3Rpb25zIGZyb20gJHtkYXRhVXJsfSBmb3IgbW9udGggJHttb250aE1vbWVudC5mb3JtYXQoJ1lZWVktTU0nKX1gKTtcbiAgY29uc3QgZGF0YVJlc3VsdCA9IGF3YWl0IGZldGNoR2V0V2l0aGluUGFnZTxTY3JhcGVkVHJhbnNhY3Rpb25EYXRhPihwYWdlLCBkYXRhVXJsKTtcbiAgaWYgKGRhdGFSZXN1bHQgJiYgXy5nZXQoZGF0YVJlc3VsdCwgJ0hlYWRlci5TdGF0dXMnKSA9PT0gJzEnICYmIGRhdGFSZXN1bHQuQ2FyZHNUcmFuc2FjdGlvbnNMaXN0QmVhbikge1xuICAgIGNvbnN0IGFjY291bnRUeG5zOiBTY3JhcGVkQWNjb3VudHNXaXRoSW5kZXggPSB7fTtcbiAgICBhY2NvdW50cy5mb3JFYWNoKGFjY291bnQgPT4ge1xuICAgICAgY29uc3QgdHhuR3JvdXBzOiBTY3JhcGVkQ3VycmVudENhcmRUcmFuc2FjdGlvbnNbXSB8IHVuZGVmaW5lZCA9IF8uZ2V0KFxuICAgICAgICBkYXRhUmVzdWx0LFxuICAgICAgICBgQ2FyZHNUcmFuc2FjdGlvbnNMaXN0QmVhbi5JbmRleCR7YWNjb3VudC5pbmRleH0uQ3VycmVudENhcmRUcmFuc2FjdGlvbnNgLFxuICAgICAgKTtcbiAgICAgIGlmICh0eG5Hcm91cHMpIHtcbiAgICAgICAgbGV0IGFsbFR4bnM6IFRyYW5zYWN0aW9uW10gPSBbXTtcbiAgICAgICAgdHhuR3JvdXBzLmZvckVhY2godHhuR3JvdXAgPT4ge1xuICAgICAgICAgIGlmICh0eG5Hcm91cC50eG5Jc3JhZWwpIHtcbiAgICAgICAgICAgIGNvbnN0IHR4bnMgPSBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bkdyb3VwLnR4bklzcmFlbCwgYWNjb3VudC5wcm9jZXNzZWREYXRlKTtcbiAgICAgICAgICAgIGFsbFR4bnMucHVzaCguLi50eG5zKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR4bkdyb3VwLnR4bkFicm9hZCkge1xuICAgICAgICAgICAgY29uc3QgdHhucyA9IGNvbnZlcnRUcmFuc2FjdGlvbnModHhuR3JvdXAudHhuQWJyb2FkLCBhY2NvdW50LnByb2Nlc3NlZERhdGUpO1xuICAgICAgICAgICAgYWxsVHhucy5wdXNoKC4uLnR4bnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmNvbWJpbmVJbnN0YWxsbWVudHMpIHtcbiAgICAgICAgICBhbGxUeG5zID0gZml4SW5zdGFsbG1lbnRzKGFsbFR4bnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLm91dHB1dERhdGE/LmVuYWJsZVRyYW5zYWN0aW9uc0ZpbHRlckJ5RGF0ZSA/PyB0cnVlKSB7XG4gICAgICAgICAgYWxsVHhucyA9IGZpbHRlck9sZFRyYW5zYWN0aW9ucyhhbGxUeG5zLCBzdGFydE1vbWVudCwgb3B0aW9ucy5jb21iaW5lSW5zdGFsbG1lbnRzIHx8IGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBhY2NvdW50VHhuc1thY2NvdW50LmFjY291bnROdW1iZXJdID0ge1xuICAgICAgICAgIGFjY291bnROdW1iZXI6IGFjY291bnQuYWNjb3VudE51bWJlcixcbiAgICAgICAgICBpbmRleDogYWNjb3VudC5pbmRleCxcbiAgICAgICAgICB0eG5zOiBhbGxUeG5zLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhY2NvdW50VHhucztcbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RXh0cmFTY3JhcFRyYW5zYWN0aW9uKFxuICBwYWdlOiBQYWdlLFxuICBvcHRpb25zOiBDb21wYW55U2VydmljZU9wdGlvbnMsXG4gIG1vbnRoOiBNb21lbnQsXG4gIGFjY291bnRJbmRleDogbnVtYmVyLFxuICB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24sXG4pOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5zZXJ2aWNlc1VybCk7XG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdyZXFOYW1lJywgJ1BpcnRleUlza2FfMjA0Jyk7XG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdDYXJkSW5kZXgnLCBhY2NvdW50SW5kZXgudG9TdHJpbmcoKSk7XG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdzaG92YXJSYXR6JywgdHJhbnNhY3Rpb24uaWRlbnRpZmllciEudG9TdHJpbmcoKSk7XG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdtb2VkQ2hpdXYnLCBtb250aC5mb3JtYXQoJ01NWVlZWScpKTtcblxuICBkZWJ1ZyhgZmV0Y2hpbmcgZXh0cmEgc2NyYXAgZm9yIHRyYW5zYWN0aW9uICR7dHJhbnNhY3Rpb24uaWRlbnRpZmllcn0gZm9yIG1vbnRoICR7bW9udGguZm9ybWF0KCdZWVlZLU1NJyl9YCk7XG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaEdldFdpdGhpblBhZ2U8U2NyYXBlZFRyYW5zYWN0aW9uRGF0YT4ocGFnZSwgdXJsLnRvU3RyaW5nKCkpO1xuICBpZiAoIWRhdGEpIHtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb247XG4gIH1cblxuICBjb25zdCByYXdDYXRlZ29yeSA9IF8uZ2V0KGRhdGEsICdQaXJ0ZXlJc2thXzIwNEJlYW4uc2VjdG9yJykgPz8gJyc7XG4gIHJldHVybiB7XG4gICAgLi4udHJhbnNhY3Rpb24sXG4gICAgY2F0ZWdvcnk6IHJhd0NhdGVnb3J5LnRyaW0oKSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RXh0cmFTY3JhcEFjY291bnQoXG4gIHBhZ2U6IFBhZ2UsXG4gIG9wdGlvbnM6IENvbXBhbnlTZXJ2aWNlT3B0aW9ucyxcbiAgYWNjb3VudE1hcDogU2NyYXBlZEFjY291bnRzV2l0aEluZGV4LFxuICBtb250aDogbW9tZW50Lk1vbWVudCxcbik6IFByb21pc2U8U2NyYXBlZEFjY291bnRzV2l0aEluZGV4PiB7XG4gIGNvbnN0IGFjY291bnRzOiBTY3JhcGVkQWNjb3VudHNXaXRoSW5kZXhbc3RyaW5nXVtdID0gW107XG4gIGZvciAoY29uc3QgYWNjb3VudCBvZiBPYmplY3QudmFsdWVzKGFjY291bnRNYXApKSB7XG4gICAgZGVidWcoXG4gICAgICBgZ2V0IGV4dHJhIHNjcmFwIGZvciAke2FjY291bnQuYWNjb3VudE51bWJlcn0gd2l0aCAke2FjY291bnQudHhucy5sZW5ndGh9IHRyYW5zYWN0aW9uc2AsXG4gICAgICBtb250aC5mb3JtYXQoJ1lZWVktTU0nKSxcbiAgICApO1xuICAgIGNvbnN0IHR4bnM6IFRyYW5zYWN0aW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHR4bnNDaHVuayBvZiBfLmNodW5rKGFjY291bnQudHhucywgUkFURV9MSU1JVC5UUkFOU0FDVElPTlNfQkFUQ0hfU0laRSkpIHtcbiAgICAgIGRlYnVnKGBwcm9jZXNzaW5nIGNodW5rIG9mICR7dHhuc0NodW5rLmxlbmd0aH0gdHJhbnNhY3Rpb25zIGZvciBhY2NvdW50ICR7YWNjb3VudC5hY2NvdW50TnVtYmVyfWApO1xuICAgICAgY29uc3QgdXBkYXRlZFR4bnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdHhuc0NodW5rLm1hcCh0ID0+IGdldEV4dHJhU2NyYXBUcmFuc2FjdGlvbihwYWdlLCBvcHRpb25zLCBtb250aCwgYWNjb3VudC5pbmRleCwgdCkpLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHNsZWVwKFJBVEVfTElNSVQuU0xFRVBfQkVUV0VFTik7XG4gICAgICB0eG5zLnB1c2goLi4udXBkYXRlZFR4bnMpO1xuICAgIH1cbiAgICBhY2NvdW50cy5wdXNoKHsgLi4uYWNjb3VudCwgdHhucyB9KTtcbiAgfVxuXG4gIHJldHVybiBhY2NvdW50cy5yZWR1Y2UoKG0sIHgpID0+ICh7IC4uLm0sIFt4LmFjY291bnROdW1iZXJdOiB4IH0pLCB7fSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFkZGl0aW9uYWxUcmFuc2FjdGlvbkluZm9ybWF0aW9uKFxuICBzY3JhcGVyT3B0aW9uczogU2NyYXBlck9wdGlvbnMsXG4gIGFjY291bnRzV2l0aEluZGV4OiBTY3JhcGVkQWNjb3VudHNXaXRoSW5kZXhbXSxcbiAgcGFnZTogUGFnZSxcbiAgb3B0aW9uczogQ29tcGFueVNlcnZpY2VPcHRpb25zLFxuICBhbGxNb250aHM6IG1vbWVudC5Nb21lbnRbXSxcbik6IFByb21pc2U8U2NyYXBlZEFjY291bnRzV2l0aEluZGV4W10+IHtcbiAgaWYgKFxuICAgICFzY3JhcGVyT3B0aW9ucy5hZGRpdGlvbmFsVHJhbnNhY3Rpb25JbmZvcm1hdGlvbiB8fFxuICAgIHNjcmFwZXJPcHRpb25zLm9wdEluRmVhdHVyZXM/LmluY2x1ZGVzKCdpc3JhY2FyZC1hbWV4OnNraXBBZGRpdGlvbmFsVHJhbnNhY3Rpb25JbmZvcm1hdGlvbicpXG4gICkge1xuICAgIHJldHVybiBhY2NvdW50c1dpdGhJbmRleDtcbiAgfVxuICByZXR1cm4gcnVuU2VyaWFsKGFjY291bnRzV2l0aEluZGV4Lm1hcCgoYSwgaSkgPT4gKCkgPT4gZ2V0RXh0cmFTY3JhcEFjY291bnQocGFnZSwgb3B0aW9ucywgYSwgYWxsTW9udGhzW2ldKSkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFsbFRyYW5zYWN0aW9ucyhcbiAgcGFnZTogUGFnZSxcbiAgb3B0aW9uczogU2NyYXBlck9wdGlvbnMsXG4gIGNvbXBhbnlTZXJ2aWNlT3B0aW9uczogQ29tcGFueVNlcnZpY2VPcHRpb25zLFxuICBzdGFydE1vbWVudDogTW9tZW50LFxuKSB7XG4gIGNvbnN0IGZ1dHVyZU1vbnRoc1RvU2NyYXBlID0gb3B0aW9ucy5mdXR1cmVNb250aHNUb1NjcmFwZSA/PyAxO1xuICBjb25zdCBhbGxNb250aHMgPSBnZXRBbGxNb250aE1vbWVudHMoc3RhcnRNb21lbnQsIGZ1dHVyZU1vbnRoc1RvU2NyYXBlKTtcbiAgY29uc3QgcmVzdWx0czogU2NyYXBlZEFjY291bnRzV2l0aEluZGV4W10gPSBhd2FpdCBydW5TZXJpYWwoXG4gICAgYWxsTW9udGhzLm1hcChtb250aE1vbWVudCA9PiAoKSA9PiB7XG4gICAgICByZXR1cm4gZmV0Y2hUcmFuc2FjdGlvbnMocGFnZSwgb3B0aW9ucywgY29tcGFueVNlcnZpY2VPcHRpb25zLCBzdGFydE1vbWVudCwgbW9udGhNb21lbnQpO1xuICAgIH0pLFxuICApO1xuXG4gIGNvbnN0IGZpbmFsUmVzdWx0ID0gYXdhaXQgZ2V0QWRkaXRpb25hbFRyYW5zYWN0aW9uSW5mb3JtYXRpb24oXG4gICAgb3B0aW9ucyxcbiAgICByZXN1bHRzLFxuICAgIHBhZ2UsXG4gICAgY29tcGFueVNlcnZpY2VPcHRpb25zLFxuICAgIGFsbE1vbnRocyxcbiAgKTtcbiAgY29uc3QgY29tYmluZWRUeG5zOiBSZWNvcmQ8c3RyaW5nLCBUcmFuc2FjdGlvbltdPiA9IHt9O1xuXG4gIGZpbmFsUmVzdWx0LmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmZvckVhY2goYWNjb3VudE51bWJlciA9PiB7XG4gICAgICBsZXQgdHhuc0ZvckFjY291bnQgPSBjb21iaW5lZFR4bnNbYWNjb3VudE51bWJlcl07XG4gICAgICBpZiAoIXR4bnNGb3JBY2NvdW50KSB7XG4gICAgICAgIHR4bnNGb3JBY2NvdW50ID0gW107XG4gICAgICAgIGNvbWJpbmVkVHhuc1thY2NvdW50TnVtYmVyXSA9IHR4bnNGb3JBY2NvdW50O1xuICAgICAgfVxuICAgICAgY29uc3QgdG9CZUFkZGVkVHhucyA9IHJlc3VsdFthY2NvdW50TnVtYmVyXS50eG5zO1xuICAgICAgY29tYmluZWRUeG5zW2FjY291bnROdW1iZXJdLnB1c2goLi4udG9CZUFkZGVkVHhucyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IGFjY291bnRzID0gT2JqZWN0LmtleXMoY29tYmluZWRUeG5zKS5tYXAoYWNjb3VudE51bWJlciA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY291bnROdW1iZXIsXG4gICAgICB0eG5zOiBjb21iaW5lZFR4bnNbYWNjb3VudE51bWJlcl0sXG4gICAgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdWNjZXNzOiB0cnVlLFxuICAgIGFjY291bnRzLFxuICB9O1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyBpZDogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nOyBjYXJkNkRpZ2l0czogc3RyaW5nIH07XG5jbGFzcyBJc3JhY2FyZEFtZXhCYXNlU2NyYXBlciBleHRlbmRzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb21wYW55Q29kZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgc2VydmljZXNVcmw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTY3JhcGVyT3B0aW9ucywgYmFzZVVybDogc3RyaW5nLCBjb21wYW55Q29kZTogc3RyaW5nKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuICAgIHRoaXMuY29tcGFueUNvZGUgPSBjb21wYW55Q29kZTtcbiAgICB0aGlzLnNlcnZpY2VzVXJsID0gYCR7YmFzZVVybH0vc2VydmljZXMvUHJveHlSZXF1ZXN0SGFuZGxlci5hc2h4YDtcbiAgfVxuXG4gIGFzeW5jIGxvZ2luKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyk6IFByb21pc2U8U2NyYXBlclNjcmFwaW5nUmVzdWx0PiB7XG4gICAgYXdhaXQgdGhpcy5wYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb24odHJ1ZSk7XG4gICAgdGhpcy5wYWdlLm9uKCdyZXF1ZXN0JywgcmVxdWVzdCA9PiB7XG4gICAgICBpZiAocmVxdWVzdC51cmwoKS5pbmNsdWRlcygnZGV0ZWN0b3ItZG9tLm1pbi5qcycpKSB7XG4gICAgICAgIGRlYnVnKCdmb3JjZSBhYm9ydCBmb3IgcmVxdWVzdCBkbyBkb3dubG9hZCBkZXRlY3Rvci1kb20ubWluLmpzIHJlc291cmNlJyk7XG4gICAgICAgIHZvaWQgcmVxdWVzdC5hYm9ydCh1bmRlZmluZWQsIGludGVyY2VwdGlvblByaW9yaXRpZXMuYWJvcnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm9pZCByZXF1ZXN0LmNvbnRpbnVlKHVuZGVmaW5lZCwgaW50ZXJjZXB0aW9uUHJpb3JpdGllcy5jb250aW51ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhd2FpdCBtYXNrSGVhZGxlc3NVc2VyQWdlbnQodGhpcy5wYWdlKTtcblxuICAgIGF3YWl0IHRoaXMubmF2aWdhdGVUbyhgJHt0aGlzLmJhc2VVcmx9L3BlcnNvbmFsYXJlYS9Mb2dpbmApO1xuXG4gICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuTG9nZ2luZ0luKTtcblxuICAgIGNvbnN0IHZhbGlkYXRlVXJsID0gYCR7dGhpcy5zZXJ2aWNlc1VybH0/cmVxTmFtZT1WYWxpZGF0ZUlkRGF0YWA7XG4gICAgY29uc3QgdmFsaWRhdGVSZXF1ZXN0ID0ge1xuICAgICAgaWQ6IGNyZWRlbnRpYWxzLmlkLFxuICAgICAgY2FyZFN1ZmZpeDogY3JlZGVudGlhbHMuY2FyZDZEaWdpdHMsXG4gICAgICBjb3VudHJ5Q29kZTogQ09VTlRSWV9DT0RFLFxuICAgICAgaWRUeXBlOiBJRF9UWVBFLFxuICAgICAgY2hlY2tMZXZlbDogJzEnLFxuICAgICAgY29tcGFueUNvZGU6IHRoaXMuY29tcGFueUNvZGUsXG4gICAgfTtcbiAgICBkZWJ1ZygnbG9nZ2luZyBpbiB3aXRoIHZhbGlkYXRlIHJlcXVlc3QnKTtcbiAgICBjb25zdCB2YWxpZGF0ZVJlc3VsdCA9IGF3YWl0IGZldGNoUG9zdFdpdGhpblBhZ2U8U2NyYXBlZExvZ2luVmFsaWRhdGlvbj4odGhpcy5wYWdlLCB2YWxpZGF0ZVVybCwgdmFsaWRhdGVSZXF1ZXN0KTtcbiAgICBpZiAoXG4gICAgICAhdmFsaWRhdGVSZXN1bHQgfHxcbiAgICAgICF2YWxpZGF0ZVJlc3VsdC5IZWFkZXIgfHxcbiAgICAgIHZhbGlkYXRlUmVzdWx0LkhlYWRlci5TdGF0dXMgIT09ICcxJyB8fFxuICAgICAgIXZhbGlkYXRlUmVzdWx0LlZhbGlkYXRlSWREYXRhQmVhblxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGVycm9yIGR1cmluZyBsb2dpbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlUmV0dXJuQ29kZSA9IHZhbGlkYXRlUmVzdWx0LlZhbGlkYXRlSWREYXRhQmVhbi5yZXR1cm5Db2RlO1xuICAgIGRlYnVnKGB1c2VyIHZhbGlkYXRlIHdpdGggcmV0dXJuIGNvZGUgJyR7dmFsaWRhdGVSZXR1cm5Db2RlfSdgKTtcbiAgICBpZiAodmFsaWRhdGVSZXR1cm5Db2RlID09PSAnMScpIHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IHZhbGlkYXRlUmVzdWx0LlZhbGlkYXRlSWREYXRhQmVhbjtcblxuICAgICAgY29uc3QgbG9naW5VcmwgPSBgJHt0aGlzLnNlcnZpY2VzVXJsfT9yZXFOYW1lPXBlcmZvcm1Mb2dvbklgO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgICAgS29kTWlzaHRhbWVzaDogdXNlck5hbWUsXG4gICAgICAgIE1pc3BhclppaHV5OiBjcmVkZW50aWFscy5pZCxcbiAgICAgICAgU2lzbWE6IGNyZWRlbnRpYWxzLnBhc3N3b3JkLFxuICAgICAgICBjYXJkU3VmZml4OiBjcmVkZW50aWFscy5jYXJkNkRpZ2l0cyxcbiAgICAgICAgY291bnRyeUNvZGU6IENPVU5UUllfQ09ERSxcbiAgICAgICAgaWRUeXBlOiBJRF9UWVBFLFxuICAgICAgfTtcbiAgICAgIGRlYnVnKCd1c2VyIGxvZ2luIHN0YXJ0ZWQnKTtcbiAgICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gYXdhaXQgZmV0Y2hQb3N0V2l0aGluUGFnZTx7IHN0YXR1czogc3RyaW5nIH0+KHRoaXMucGFnZSwgbG9naW5VcmwsIHJlcXVlc3QpO1xuICAgICAgZGVidWcoYHVzZXIgbG9naW4gd2l0aCBzdGF0dXMgJyR7bG9naW5SZXN1bHQ/LnN0YXR1c30nYCwgbG9naW5SZXN1bHQpO1xuXG4gICAgICBpZiAobG9naW5SZXN1bHQgJiYgbG9naW5SZXN1bHQuc3RhdHVzID09PSAnMScpIHtcbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuTG9naW5TdWNjZXNzKTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobG9naW5SZXN1bHQgJiYgbG9naW5SZXN1bHQuc3RhdHVzID09PSAnMycpIHtcbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuQ2hhbmdlUGFzc3dvcmQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yVHlwZTogU2NyYXBlckVycm9yVHlwZXMuQ2hhbmdlUGFzc3dvcmQsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2luRmFpbGVkKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvclR5cGU6IFNjcmFwZXJFcnJvclR5cGVzLkludmFsaWRQYXNzd29yZCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlUmV0dXJuQ29kZSA9PT0gJzQnKSB7XG4gICAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5DaGFuZ2VQYXNzd29yZCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3JUeXBlOiBTY3JhcGVyRXJyb3JUeXBlcy5DaGFuZ2VQYXNzd29yZCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuTG9naW5GYWlsZWQpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yVHlwZTogU2NyYXBlckVycm9yVHlwZXMuSW52YWxpZFBhc3N3b3JkLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmZXRjaERhdGEoKSB7XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXJzJyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KGRlZmF1bHRTdGFydE1vbWVudCwgbW9tZW50KHN0YXJ0RGF0ZSkpO1xuXG4gICAgcmV0dXJuIGZldGNoQWxsVHJhbnNhY3Rpb25zKFxuICAgICAgdGhpcy5wYWdlLFxuICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlc1VybDogdGhpcy5zZXJ2aWNlc1VybCxcbiAgICAgICAgY29tcGFueUNvZGU6IHRoaXMuY29tcGFueUNvZGUsXG4gICAgICB9LFxuICAgICAgc3RhcnRNb21lbnQsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJc3JhY2FyZEFtZXhCYXNlU2NyYXBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUUsVUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsWUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sYUFBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsUUFBQSxHQUFBUixPQUFBO0FBQ0EsSUFBQVMsY0FBQSxHQUFBVCxPQUFBO0FBT0EsSUFBQVUsdUJBQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFXLE9BQUEsR0FBQVgsT0FBQTtBQUVBLElBQUFZLFFBQUEsR0FBQVosT0FBQTtBQUFtRixTQUFBRCx1QkFBQWMsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUVuRixNQUFNRyxVQUFVLEdBQUc7RUFDakJDLGFB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
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type Frame, type Page, type PuppeteerLifeCycleEvent } from 'puppeteer';
|
|
2
|
+
import { BaseScraper } from './base-scraper';
|
|
3
|
+
import { ScraperErrorTypes } from './errors';
|
|
4
|
+
import { type ScraperCredentials, type ScraperScrapingResult } from './interface';
|
|
5
|
+
declare enum LoginBaseResults {
|
|
6
|
+
Success = "SUCCESS",
|
|
7
|
+
UnknownError = "UNKNOWN_ERROR"
|
|
8
|
+
}
|
|
9
|
+
export declare const LoginResults: {
|
|
10
|
+
Success: LoginBaseResults.Success;
|
|
11
|
+
UnknownError: LoginBaseResults.UnknownError;
|
|
12
|
+
TwoFactorRetrieverMissing: ScraperErrorTypes.TwoFactorRetrieverMissing;
|
|
13
|
+
InvalidPassword: ScraperErrorTypes.InvalidPassword;
|
|
14
|
+
ChangePassword: ScraperErrorTypes.ChangePassword;
|
|
15
|
+
AccountBlocked: ScraperErrorTypes.AccountBlocked;
|
|
16
|
+
};
|
|
17
|
+
export type LoginResults = Exclude<ScraperErrorTypes, ScraperErrorTypes.Timeout | ScraperErrorTypes.Generic | ScraperErrorTypes.General> | LoginBaseResults;
|
|
18
|
+
export type PossibleLoginResults = {
|
|
19
|
+
[key in LoginResults]?: (string | RegExp | ((options?: {
|
|
20
|
+
page?: Page;
|
|
21
|
+
}) => Promise<boolean>))[];
|
|
22
|
+
};
|
|
23
|
+
export interface LoginOptions {
|
|
24
|
+
loginUrl: string;
|
|
25
|
+
checkReadiness?: () => Promise<void>;
|
|
26
|
+
fields: {
|
|
27
|
+
selector: string;
|
|
28
|
+
value: string;
|
|
29
|
+
}[];
|
|
30
|
+
submitButtonSelector: string | (() => Promise<void>);
|
|
31
|
+
preAction?: () => Promise<Frame | void>;
|
|
32
|
+
postAction?: () => Promise<void>;
|
|
33
|
+
possibleResults: PossibleLoginResults;
|
|
34
|
+
userAgent?: string;
|
|
35
|
+
waitUntil?: PuppeteerLifeCycleEvent;
|
|
36
|
+
}
|
|
37
|
+
declare class BaseScraperWithBrowser<TCredentials extends ScraperCredentials> extends BaseScraper<TCredentials> {
|
|
38
|
+
private cleanups;
|
|
39
|
+
private defaultViewportSize;
|
|
40
|
+
protected page: Page;
|
|
41
|
+
protected getViewPort(): {
|
|
42
|
+
width: number;
|
|
43
|
+
height: number;
|
|
44
|
+
};
|
|
45
|
+
initialize(): Promise<void>;
|
|
46
|
+
private initializePage;
|
|
47
|
+
navigateTo(url: string, waitUntil?: PuppeteerLifeCycleEvent | undefined, retries?: number): Promise<void>;
|
|
48
|
+
getLoginOptions(_credentials: ScraperCredentials): LoginOptions;
|
|
49
|
+
fillInputs(pageOrFrame: Page | Frame, fields: {
|
|
50
|
+
selector: string;
|
|
51
|
+
value: string;
|
|
52
|
+
}[]): Promise<void>;
|
|
53
|
+
login(credentials: ScraperCredentials): Promise<ScraperScrapingResult>;
|
|
54
|
+
terminate(_success: boolean): Promise<void>;
|
|
55
|
+
private handleLoginResult;
|
|
56
|
+
}
|
|
57
|
+
export { BaseScraperWithBrowser };
|