UNPKG

israeli-bank-scrapers-core

Version:

Provide scrapers for all major Israeli banks and credit card companies

152 lines (151 loc) 24.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _moment = _interopRequireDefault(require("moment")); var _constants = require("../constants"); var _debug = require("../helpers/debug"); var _elementsInteractions = require("../helpers/elements-interactions"); var _transactions = require("../helpers/transactions"); var _transactions2 = require("../transactions"); var _baseScraperWithBrowser = require("./base-scraper-with-browser"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const debug = (0, _debug.getDebug)('beyahadBishvilha'); const DATE_FORMAT = 'DD/MM/YY'; const LOGIN_URL = 'https://www.hist.org.il/login'; const SUCCESS_URL = 'https://www.hist.org.il/'; const CARD_URL = 'https://www.hist.org.il/card/balanceAndUses'; function getAmountData(amountStr) { const amountStrCln = amountStr.replace(',', ''); let currency = null; let amount = null; if (amountStrCln.includes(_constants.SHEKEL_CURRENCY_SYMBOL)) { amount = parseFloat(amountStrCln.replace(_constants.SHEKEL_CURRENCY_SYMBOL, '')); currency = _constants.SHEKEL_CURRENCY; } else if (amountStrCln.includes(_constants.DOLLAR_CURRENCY_SYMBOL)) { amount = parseFloat(amountStrCln.replace(_constants.DOLLAR_CURRENCY_SYMBOL, '')); currency = _constants.DOLLAR_CURRENCY; } else if (amountStrCln.includes(_constants.EURO_CURRENCY_SYMBOL)) { amount = parseFloat(amountStrCln.replace(_constants.EURO_CURRENCY_SYMBOL, '')); currency = _constants.EURO_CURRENCY; } else { const parts = amountStrCln.split(' '); [currency] = parts; amount = parseFloat(parts[1]); } return { amount, currency }; } function convertTransactions(txns, options) { debug(`convert ${txns.length} raw transactions to official Transaction structure`); return txns.map(txn => { const chargedAmountTuple = getAmountData(txn.chargedAmount || ''); const txnProcessedDate = (0, _moment.default)(txn.date, DATE_FORMAT); const result = { type: _transactions2.TransactionTypes.Normal, status: _transactions2.TransactionStatuses.Completed, date: txnProcessedDate.toISOString(), processedDate: txnProcessedDate.toISOString(), originalAmount: chargedAmountTuple.amount, originalCurrency: chargedAmountTuple.currency, chargedAmount: chargedAmountTuple.amount, chargedCurrency: chargedAmountTuple.currency, description: txn.description || '', memo: '', identifier: txn.identifier }; if (options?.includeRawTransaction) { result.rawTransaction = (0, _transactions.getRawTransaction)(txn); } return result; }); } async function fetchTransactions(page, options) { await page.goto(CARD_URL); await (0, _elementsInteractions.waitUntilElementFound)(page, '.react-loading.hide', false); const defaultStartMoment = (0, _moment.default)().subtract(1, 'years'); const startDate = options.startDate || defaultStartMoment.toDate(); const startMoment = _moment.default.max(defaultStartMoment, (0, _moment.default)(startDate)); const accountNumber = await (0, _elementsInteractions.pageEval)(page, '.wallet-details div:nth-of-type(2)', null, element => { return element.innerText.replace('מספר כרטיס ', ''); }); const balance = await (0, _elementsInteractions.pageEval)(page, '.wallet-details div:nth-of-type(4) > span:nth-of-type(2)', null, element => { return element.innerText; }); debug('fetch raw transactions from page'); const rawTransactions = await (0, _elementsInteractions.pageEvalAll)(page, '.transaction-container, .transaction-component-container', [], items => { return items.map(el => { const columns = el.querySelectorAll('.transaction-item > span'); if (columns.length === 7) { return { date: columns[0].innerText, identifier: columns[1].innerText, description: columns[3].innerText, type: columns[5].innerText, chargedAmount: columns[6].innerText }; } return null; }); }); debug(`fetched ${rawTransactions.length} raw transactions from page`); const accountTransactions = convertTransactions(rawTransactions.filter(item => !!item), options); debug('filer out old transactions'); const txns = options.outputData?.enableTransactionsFilterByDate ?? true ? (0, _transactions.filterOldTransactions)(accountTransactions, startMoment, false) : accountTransactions; debug(`found ${txns.length} valid transactions out of ${accountTransactions.length} transactions for account ending with ${accountNumber.substring(accountNumber.length - 2)}`); return { accountNumber, balance: getAmountData(balance).amount, txns }; } function getPossibleLoginResults() { const urls = {}; urls[_baseScraperWithBrowser.LoginResults.Success] = [SUCCESS_URL]; urls[_baseScraperWithBrowser.LoginResults.ChangePassword] = []; // TODO urls[_baseScraperWithBrowser.LoginResults.InvalidPassword] = []; // TODO urls[_baseScraperWithBrowser.LoginResults.UnknownError] = []; // TODO return urls; } function createLoginFields(credentials) { return [{ selector: '#loginId', value: credentials.id }, { selector: '#loginPassword', value: credentials.password }]; } class BeyahadBishvilhaScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser { getViewPort() { return { width: 1500, height: 800 }; } getLoginOptions(credentials) { return { loginUrl: LOGIN_URL, fields: createLoginFields(credentials), submitButtonSelector: async () => { const button = await this.page.$('xpath//button[contains(., "התחבר")]'); if (button) { await button.click(); } }, possibleResults: getPossibleLoginResults() }; } async fetchData() { const account = await fetchTransactions(this.page, this.options); return { success: true, accounts: [account] }; } } var _default = exports.default = BeyahadBishvilhaScraper; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2RlYnVnIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX3RyYW5zYWN0aW9ucyIsIl90cmFuc2FjdGlvbnMyIiwiX2Jhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJkZWJ1ZyIsImdldERlYnVnIiwiREFURV9GT1JNQVQiLCJMT0dJTl9VUkwiLCJTVUNDRVNTX1VSTCIsIkNBUkRfVVJMIiwiZ2V0QW1vdW50RGF0YSIsImFtb3VudFN0ciIsImFtb3VudFN0ckNsbiIsInJlcGxhY2UiLCJjdXJyZW5jeSIsImFtb3VudCIsImluY2x1ZGVzIiwiU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCIsInBhcnNlRmxvYXQiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJET0xMQVJfQ1VSUkVOQ1lfU1lNQk9MIiwiRE9MTEFSX0NVUlJFTkNZIiwiRVVST19DVVJSRU5DWV9TWU1CT0wiLCJFVVJPX0NVUlJFTkNZIiwicGFydHMiLCJzcGxpdCIsImNvbnZlcnRUcmFuc2FjdGlvbnMiLCJ0eG5zIiwib3B0aW9ucyIsImxlbmd0aCIsIm1hcCIsInR4biIsImNoYXJnZWRBbW91bnRUdXBsZSIsImNoYXJnZWRBbW91bnQiLCJ0eG5Qcm9jZXNzZWREYXRlIiwibW9tZW50IiwiZGF0ZSIsInJlc3VsdCIsInR5cGUiLCJUcmFuc2FjdGlvblR5cGVzIiwiTm9ybWFsIiwic3RhdHVzIiwiVHJhbnNhY3Rpb25TdGF0dXNlcyIsIkNvbXBsZXRlZCIsInRvSVNPU3RyaW5nIiwicHJvY2Vzc2VkRGF0ZSIsIm9yaWdpbmFsQW1vdW50Iiwib3JpZ2luYWxDdXJyZW5jeSIsImNoYXJnZWRDdXJyZW5jeSIsImRlc2NyaXB0aW9uIiwibWVtbyIsImlkZW50aWZpZXIiLCJpbmNsdWRlUmF3VHJhbnNhY3Rpb24iLCJyYXdUcmFuc2FjdGlvbiIsImdldFJhd1RyYW5zYWN0aW9uIiwiZmV0Y2hUcmFuc2FjdGlvbnMiLCJwYWdlIiwiZ290byIsIndhaXRVbnRpbEVsZW1lbnRGb3VuZCIsImRlZmF1bHRTdGFydE1vbWVudCIsInN1YnRyYWN0Iiwic3RhcnREYXRlIiwidG9EYXRlIiwic3RhcnRNb21lbnQiLCJtYXgiLCJhY2NvdW50TnVtYmVyIiwicGFnZUV2YWwiLCJlbGVtZW50IiwiaW5uZXJUZXh0IiwiYmFsYW5jZSIsInJhd1RyYW5zYWN0aW9ucyIsInBhZ2VFdmFsQWxsIiwiaXRlbXMiLCJlbCIsImNvbHVtbnMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiYWNjb3VudFRyYW5zYWN0aW9ucyIsImZpbHRlciIsIml0ZW0iLCJvdXRwdXREYXRhIiwiZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlIiwiZmlsdGVyT2xkVHJhbnNhY3Rpb25zIiwic3Vic3RyaW5nIiwiZ2V0UG9zc2libGVMb2dpblJlc3VsdHMiLCJ1cmxzIiwiTG9naW5SZXN1bHRzIiwiU3VjY2VzcyIsIkNoYW5nZVBhc3N3b3JkIiwiSW52YWxpZFBhc3N3b3JkIiwiVW5rbm93bkVycm9yIiwiY3JlYXRlTG9naW5GaWVsZHMiLCJjcmVkZW50aWFscyIsInNlbGVjdG9yIiwidmFsdWUiLCJpZCIsInBhc3N3b3JkIiwiQmV5YWhhZEJpc2h2aWxoYVNjcmFwZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiZ2V0Vmlld1BvcnQiLCJ3aWR0aCIsImhlaWdodCIsImdldExvZ2luT3B0aW9ucyIsImxvZ2luVXJsIiwiZmllbGRzIiwic3VibWl0QnV0dG9uU2VsZWN0b3IiLCJidXR0b24iLCIkIiwiY2xpY2siLCJwb3NzaWJsZVJlc3VsdHMiLCJmZXRjaERhdGEiLCJhY2NvdW50Iiwic3VjY2VzcyIsImFjY291bnRzIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL2JleWFoYWQtYmlzaHZpbGhhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gJ3B1cHBldGVlci1jb3JlJztcbmltcG9ydCB7XG4gIERPTExBUl9DVVJSRU5DWSxcbiAgRE9MTEFSX0NVUlJFTkNZX1NZTUJPTCxcbiAgRVVST19DVVJSRU5DWSxcbiAgRVVST19DVVJSRU5DWV9TWU1CT0wsXG4gIFNIRUtFTF9DVVJSRU5DWSxcbiAgU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCxcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGdldERlYnVnIH0gZnJvbSAnLi4vaGVscGVycy9kZWJ1Zyc7XG5pbXBvcnQgeyBwYWdlRXZhbCwgcGFnZUV2YWxBbGwsIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCB9IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IGdldFJhd1RyYW5zYWN0aW9uLCBmaWx0ZXJPbGRUcmFuc2FjdGlvbnMgfSBmcm9tICcuLi9oZWxwZXJzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblN0YXR1c2VzLCBUcmFuc2FjdGlvblR5cGVzLCB0eXBlIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsIExvZ2luUmVzdWx0cywgdHlwZSBQb3NzaWJsZUxvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5pbXBvcnQgeyB0eXBlIFNjcmFwZXJPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKCdiZXlhaGFkQmlzaHZpbGhhJyk7XG5cbmNvbnN0IERBVEVfRk9STUFUID0gJ0REL01NL1lZJztcbmNvbnN0IExPR0lOX1VSTCA9ICdodHRwczovL3d3dy5oaXN0Lm9yZy5pbC9sb2dpbic7XG5jb25zdCBTVUNDRVNTX1VSTCA9ICdodHRwczovL3d3dy5oaXN0Lm9yZy5pbC8nO1xuY29uc3QgQ0FSRF9VUkwgPSAnaHR0cHM6Ly93d3cuaGlzdC5vcmcuaWwvY2FyZC9iYWxhbmNlQW5kVXNlcyc7XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBkYXRlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgY2hhcmdlZEFtb3VudDogc3RyaW5nO1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGdldEFtb3VudERhdGEoYW1vdW50U3RyOiBzdHJpbmcpIHtcbiAgY29uc3QgYW1vdW50U3RyQ2xuID0gYW1vdW50U3RyLnJlcGxhY2UoJywnLCAnJyk7XG4gIGxldCBjdXJyZW5jeTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGxldCBhbW91bnQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBpZiAoYW1vdW50U3RyQ2xuLmluY2x1ZGVzKFNIRUtFTF9DVVJSRU5DWV9TWU1CT0wpKSB7XG4gICAgYW1vdW50ID0gcGFyc2VGbG9hdChhbW91bnRTdHJDbG4ucmVwbGFjZShTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MLCAnJykpO1xuICAgIGN1cnJlbmN5ID0gU0hFS0VMX0NVUlJFTkNZO1xuICB9IGVsc2UgaWYgKGFtb3VudFN0ckNsbi5pbmNsdWRlcyhET0xMQVJfQ1VSUkVOQ1lfU1lNQk9MKSkge1xuICAgIGFtb3VudCA9IHBhcnNlRmxvYXQoYW1vdW50U3RyQ2xuLnJlcGxhY2UoRE9MTEFSX0NVUlJFTkNZX1NZTUJPTCwgJycpKTtcbiAgICBjdXJyZW5jeSA9IERPTExBUl9DVVJSRU5DWTtcbiAgfSBlbHNlIGlmIChhbW91bnRTdHJDbG4uaW5jbHVkZXMoRVVST19DVVJSRU5DWV9TWU1CT0wpKSB7XG4gICAgYW1vdW50ID0gcGFyc2VGbG9hdChhbW91bnRTdHJDbG4ucmVwbGFjZShFVVJPX0NVUlJFTkNZX1NZTUJPTCwgJycpKTtcbiAgICBjdXJyZW5jeSA9IEVVUk9fQ1VSUkVOQ1k7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcGFydHMgPSBhbW91bnRTdHJDbG4uc3BsaXQoJyAnKTtcbiAgICBbY3VycmVuY3ldID0gcGFydHM7XG4gICAgYW1vdW50ID0gcGFyc2VGbG9hdChwYXJ0c1sxXSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFtb3VudCxcbiAgICBjdXJyZW5jeSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRyYW5zYWN0aW9ucyh0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSwgb3B0aW9ucz86IFNjcmFwZXJPcHRpb25zKTogVHJhbnNhY3Rpb25bXSB7XG4gIGRlYnVnKGBjb252ZXJ0ICR7dHhucy5sZW5ndGh9IHJhdyB0cmFuc2FjdGlvbnMgdG8gb2ZmaWNpYWwgVHJhbnNhY3Rpb24gc3RydWN0dXJlYCk7XG4gIHJldHVybiB0eG5zLm1hcCh0eG4gPT4ge1xuICAgIGNvbnN0IGNoYXJnZWRBbW91bnRUdXBsZSA9IGdldEFtb3VudERhdGEodHhuLmNoYXJnZWRBbW91bnQgfHwgJycpO1xuICAgIGNvbnN0IHR4blByb2Nlc3NlZERhdGUgPSBtb21lbnQodHhuLmRhdGUsIERBVEVfRk9STUFUKTtcblxuICAgIGNvbnN0IHJlc3VsdDogVHJhbnNhY3Rpb24gPSB7XG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbCxcbiAgICAgIHN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQsXG4gICAgICBkYXRlOiB0eG5Qcm9jZXNzZWREYXRlLnRvSVNPU3RyaW5nKCksXG4gICAgICBwcm9jZXNzZWREYXRlOiB0eG5Qcm9jZXNzZWREYXRlLnRvSVNPU3RyaW5nKCksXG4gICAgICBvcmlnaW5hbEFtb3VudDogY2hhcmdlZEFtb3VudFR1cGxlLmFtb3VudCxcbiAgICAgIG9yaWdpbmFsQ3VycmVuY3k6IGNoYXJnZWRBbW91bnRUdXBsZS5jdXJyZW5jeSxcbiAgICAgIGNoYXJnZWRBbW91bnQ6IGNoYXJnZWRBbW91bnRUdXBsZS5hbW91bnQsXG4gICAgICBjaGFyZ2VkQ3VycmVuY3k6IGNoYXJnZWRBbW91bnRUdXBsZS5jdXJyZW5jeSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0eG4uZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICBtZW1vOiAnJyxcbiAgICAgIGlkZW50aWZpZXI6IHR4bi5pZGVudGlmaWVyLFxuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucz8uaW5jbHVkZVJhd1RyYW5zYWN0aW9uKSB7XG4gICAgICByZXN1bHQucmF3VHJhbnNhY3Rpb24gPSBnZXRSYXdUcmFuc2FjdGlvbih0eG4pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFRyYW5zYWN0aW9ucyhwYWdlOiBQYWdlLCBvcHRpb25zOiBTY3JhcGVyT3B0aW9ucykge1xuICBhd2FpdCBwYWdlLmdvdG8oQ0FSRF9VUkwpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJy5yZWFjdC1sb2FkaW5nLmhpZGUnLCBmYWxzZSk7XG4gIGNvbnN0IGRlZmF1bHRTdGFydE1vbWVudCA9IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFycycpO1xuICBjb25zdCBzdGFydERhdGUgPSBvcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gIGNvbnN0IHN0YXJ0TW9tZW50ID0gbW9tZW50Lm1heChkZWZhdWx0U3RhcnRNb21lbnQsIG1vbWVudChzdGFydERhdGUpKTtcblxuICBjb25zdCBhY2NvdW50TnVtYmVyID0gYXdhaXQgcGFnZUV2YWwocGFnZSwgJy53YWxsZXQtZGV0YWlscyBkaXY6bnRoLW9mLXR5cGUoMiknLCBudWxsLCBlbGVtZW50ID0+IHtcbiAgICByZXR1cm4gKGVsZW1lbnQgYXMgYW55KS5pbm5lclRleHQucmVwbGFjZSgn157Xodek16gg15vXqNeY15nXoSAnLCAnJyk7XG4gIH0pO1xuXG4gIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCBwYWdlRXZhbChwYWdlLCAnLndhbGxldC1kZXRhaWxzIGRpdjpudGgtb2YtdHlwZSg0KSA+IHNwYW46bnRoLW9mLXR5cGUoMiknLCBudWxsLCBlbGVtZW50ID0+IHtcbiAgICByZXR1cm4gKGVsZW1lbnQgYXMgYW55KS5pbm5lclRleHQ7XG4gIH0pO1xuXG4gIGRlYnVnKCdmZXRjaCByYXcgdHJhbnNhY3Rpb25zIGZyb20gcGFnZScpO1xuXG4gIGNvbnN0IHJhd1RyYW5zYWN0aW9uczogKFNjcmFwZWRUcmFuc2FjdGlvbiB8IG51bGwpW10gPSBhd2FpdCBwYWdlRXZhbEFsbDwoU2NyYXBlZFRyYW5zYWN0aW9uIHwgbnVsbClbXT4oXG4gICAgcGFnZSxcbiAgICAnLnRyYW5zYWN0aW9uLWNvbnRhaW5lciwgLnRyYW5zYWN0aW9uLWNvbXBvbmVudC1jb250YWluZXInLFxuICAgIFtdLFxuICAgIGl0ZW1zID0+IHtcbiAgICAgIHJldHVybiBpdGVtcy5tYXAoZWwgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW5zOiBOb2RlTGlzdE9mPEhUTUxTcGFuRWxlbWVudD4gPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCcudHJhbnNhY3Rpb24taXRlbSA+IHNwYW4nKTtcbiAgICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSA3KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGU6IGNvbHVtbnNbMF0uaW5uZXJUZXh0LFxuICAgICAgICAgICAgaWRlbnRpZmllcjogY29sdW1uc1sxXS5pbm5lclRleHQsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogY29sdW1uc1szXS5pbm5lclRleHQsXG4gICAgICAgICAgICB0eXBlOiBjb2x1bW5zWzVdLmlubmVyVGV4dCxcbiAgICAgICAgICAgIGNoYXJnZWRBbW91bnQ6IGNvbHVtbnNbNl0uaW5uZXJUZXh0LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9LFxuICApO1xuICBkZWJ1ZyhgZmV0Y2hlZCAke3Jhd1RyYW5zYWN0aW9ucy5sZW5ndGh9IHJhdyB0cmFuc2FjdGlvbnMgZnJvbSBwYWdlYCk7XG5cbiAgY29uc3QgYWNjb3VudFRyYW5zYWN0aW9ucyA9IGNvbnZlcnRUcmFuc2FjdGlvbnMoXG4gICAgcmF3VHJhbnNhY3Rpb25zLmZpbHRlcihpdGVtID0+ICEhaXRlbSkgYXMgU2NyYXBlZFRyYW5zYWN0aW9uW10sXG4gICAgb3B0aW9ucyxcbiAgKTtcblxuICBkZWJ1ZygnZmlsZXIgb3V0IG9sZCB0cmFuc2FjdGlvbnMnKTtcbiAgY29uc3QgdHhucyA9XG4gICAgKG9wdGlvbnMub3V0cHV0RGF0YT8uZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlID8/IHRydWUpXG4gICAgICA/IGZpbHRlck9sZFRyYW5zYWN0aW9ucyhhY2NvdW50VHJhbnNhY3Rpb25zLCBzdGFydE1vbWVudCwgZmFsc2UpXG4gICAgICA6IGFjY291bnRUcmFuc2FjdGlvbnM7XG4gIGRlYnVnKFxuICAgIGBmb3VuZCAke3R4bnMubGVuZ3RofSB2YWxpZCB0cmFuc2FjdGlvbnMgb3V0IG9mICR7YWNjb3VudFRyYW5zYWN0aW9ucy5sZW5ndGh9IHRyYW5zYWN0aW9ucyBmb3IgYWNjb3VudCBlbmRpbmcgd2l0aCAke2FjY291bnROdW1iZXIuc3Vic3RyaW5nKGFjY291bnROdW1iZXIubGVuZ3RoIC0gMil9YCxcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIGFjY291bnROdW1iZXIsXG4gICAgYmFsYW5jZTogZ2V0QW1vdW50RGF0YShiYWxhbmNlKS5hbW91bnQsXG4gICAgdHhucyxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKTogUG9zc2libGVMb2dpblJlc3VsdHMge1xuICBjb25zdCB1cmxzOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyA9IHt9O1xuICB1cmxzW0xvZ2luUmVzdWx0cy5TdWNjZXNzXSA9IFtTVUNDRVNTX1VSTF07XG4gIHVybHNbTG9naW5SZXN1bHRzLkNoYW5nZVBhc3N3b3JkXSA9IFtdOyAvLyBUT0RPXG4gIHVybHNbTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZF0gPSBbXTsgLy8gVE9ET1xuICB1cmxzW0xvZ2luUmVzdWx0cy5Vbmtub3duRXJyb3JdID0gW107IC8vIFRPRE9cbiAgcmV0dXJuIHVybHM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICByZXR1cm4gW1xuICAgIHsgc2VsZWN0b3I6ICcjbG9naW5JZCcsIHZhbHVlOiBjcmVkZW50aWFscy5pZCB9LFxuICAgIHsgc2VsZWN0b3I6ICcjbG9naW5QYXNzd29yZCcsIHZhbHVlOiBjcmVkZW50aWFscy5wYXNzd29yZCB9LFxuICBdO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyBpZDogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG5cbmNsYXNzIEJleWFoYWRCaXNodmlsaGFTY3JhcGVyIGV4dGVuZHMgQmFzZVNjcmFwZXJXaXRoQnJvd3NlcjxTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscz4ge1xuICBwcm90ZWN0ZWQgZ2V0Vmlld1BvcnQoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IDE1MDAsXG4gICAgICBoZWlnaHQ6IDgwMCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICAgIHJldHVybiB7XG4gICAgICBsb2dpblVybDogTE9HSU5fVVJMLFxuICAgICAgZmllbGRzOiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFscyksXG4gICAgICBzdWJtaXRCdXR0b25TZWxlY3RvcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidXR0b24gPSBhd2FpdCB0aGlzLnBhZ2UuJCgneHBhdGgvL2J1dHRvbltjb250YWlucyguLCBcIteU16rXl9eR16hcIildJyk7XG4gICAgICAgIGlmIChidXR0b24pIHtcbiAgICAgICAgICBhd2FpdCBidXR0b24uY2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBvc3NpYmxlUmVzdWx0czogZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCBmZXRjaFRyYW5zYWN0aW9ucyh0aGlzLnBhZ2UsIHRoaXMub3B0aW9ucyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhY2NvdW50czogW2FjY291bnRdLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQmV5YWhhZEJpc2h2aWxoYVNjcmFwZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQVFBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLHFCQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxhQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxjQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSx1QkFBQSxHQUFBTixPQUFBO0FBQThHLFNBQUFELHVCQUFBUSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRzlHLE1BQU1HLEtBQUssR0FBRyxJQUFBQyxlQUFRLEVBQUMsa0JBQWtCLENBQUM7QUFFMUMsTUFBTUMsV0FBVyxHQUFHLFVBQVU7QUFDOUIsTUFBTUMsU0FBUyxHQUFHLCtCQUErQjtBQUNqRCxNQUFNQyxXQUFXLEdBQUcsMEJBQTBCO0FBQzlDLE1BQU1DLFFBQVEsR0FBRyw2Q0FBNkM7QUFVOUQsU0FBU0MsYUFBYUEsQ0FBQ0MsU0FBaUIsRUFBRTtFQUN4QyxNQUFNQyxZ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