israeli-bank-scrapers-core
Version:
Provide scrapers for all major Israeli banks and credit card companies
124 lines (123 loc) • 22.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _moment = _interopRequireDefault(require("moment"));
var _elementsInteractions = require("../helpers/elements-interactions");
var _fetch = require("../helpers/fetch");
var _navigation = require("../helpers/navigation");
var _transactions = require("../helpers/transactions");
var _transactions2 = require("../transactions");
var _baseScraperWithBrowser = require("./base-scraper-with-browser");
var _errors = require("./errors");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const BASE_URL = 'https://start.telebank.co.il';
const DATE_FORMAT = 'YYYYMMDD';
function convertTransactions(txns, txnStatus, options) {
if (!txns) {
return [];
}
return txns.map(txn => {
const result = {
type: _transactions2.TransactionTypes.Normal,
identifier: txn.OperationNumber,
date: (0, _moment.default)(txn.OperationDate, DATE_FORMAT).toISOString(),
processedDate: (0, _moment.default)(txn.ValueDate, DATE_FORMAT).toISOString(),
originalAmount: txn.OperationAmount,
originalCurrency: 'ILS',
chargedAmount: txn.OperationAmount,
description: txn.OperationDescriptionToDisplay,
status: txnStatus
};
if (options?.includeRawTransaction) {
result.rawTransaction = (0, _transactions.getRawTransaction)(txn);
}
return result;
});
}
async function fetchAccountData(page, options) {
const apiSiteUrl = `${BASE_URL}/Titan/gatewayAPI`;
const accountDataUrl = `${apiSiteUrl}/userAccountsData`;
const accountInfo = await (0, _fetch.fetchGetWithinPage)(page, accountDataUrl);
if (!accountInfo) {
return {
success: false,
errorType: _errors.ScraperErrorTypes.Generic,
errorMessage: 'failed to get account data'
};
}
const defaultStartMoment = (0, _moment.default)().subtract(1, 'years').add(2, 'day');
const startDate = options.startDate || defaultStartMoment.toDate();
const startMoment = _moment.default.max(defaultStartMoment, (0, _moment.default)(startDate));
const startDateStr = startMoment.format(DATE_FORMAT);
const accounts = accountInfo.UserAccountsData.UserAccounts.map(acc => acc.NewAccountInfo.AccountID);
const accountsData = [];
for (const accountNumber of accounts) {
const txnsUrl = `${apiSiteUrl}/lastTransactions/${accountNumber}/Date?IsCategoryDescCode=True&IsTransactionDetails=True&IsEventNames=True&IsFutureTransactionFlag=True&FromDate=${startDateStr}`;
const txnsResult = await (0, _fetch.fetchGetWithinPage)(page, txnsUrl);
if (!txnsResult || txnsResult.Error || !txnsResult.CurrentAccountLastTransactions) {
return {
success: false,
errorType: _errors.ScraperErrorTypes.Generic,
errorMessage: txnsResult && txnsResult.Error ? txnsResult.Error.MsgText : 'unknown error'
};
}
const accountCompletedTxns = convertTransactions(txnsResult.CurrentAccountLastTransactions.OperationEntry, _transactions2.TransactionStatuses.Completed, options);
const rawFutureTxns = txnsResult.CurrentAccountLastTransactions.FutureTransactionsBlock?.FutureTransactionEntry ?? [];
const accountPendingTxns = convertTransactions(rawFutureTxns, _transactions2.TransactionStatuses.Pending, options);
accountsData.push({
accountNumber,
balance: txnsResult.CurrentAccountLastTransactions.CurrentAccountInfo.AccountBalance,
txns: [...accountCompletedTxns, ...accountPendingTxns]
});
}
const accountData = {
success: true,
accounts: accountsData
};
return accountData;
}
async function navigateOrErrorLabel(page) {
try {
await (0, _navigation.waitForNavigation)(page);
} catch (e) {
await (0, _elementsInteractions.waitUntilElementFound)(page, '#general-error', false, 100);
}
}
function getPossibleLoginResults() {
const urls = {};
urls[_baseScraperWithBrowser.LoginResults.Success] = [`${BASE_URL}/apollo/retail/#/MY_ACCOUNT_HOMEPAGE`, `${BASE_URL}/apollo/retail2/#/MY_ACCOUNT_HOMEPAGE`, `${BASE_URL}/apollo/retail2/`, `${BASE_URL}/apollo/retail3/#/MY_ACCOUNT_HOMEPAGE`, `${BASE_URL}/apollo/retail3/`];
urls[_baseScraperWithBrowser.LoginResults.InvalidPassword] = [`${BASE_URL}/apollo/core/templates/lobby/masterPage.html#/LOGIN_PAGE`];
urls[_baseScraperWithBrowser.LoginResults.ChangePassword] = [`${BASE_URL}/apollo/core/templates/lobby/masterPage.html#/PWD_RENEW`];
return urls;
}
function createLoginFields(credentials) {
return [{
selector: '#tzId',
value: credentials.id
}, {
selector: '#tzPassword',
value: credentials.password
}, {
selector: '#aidnum',
value: credentials.num
}];
}
class DiscountScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
getLoginOptions(credentials) {
return {
loginUrl: `${BASE_URL}/login/#/LOGIN_PAGE`,
checkReadiness: async () => (0, _elementsInteractions.waitUntilElementFound)(this.page, '#tzId'),
fields: createLoginFields(credentials),
submitButtonSelector: '.sendBtn',
postAction: async () => navigateOrErrorLabel(this.page),
possibleResults: getPossibleLoginResults()
};
}
async fetchData() {
return fetchAccountData(this.page, this.options);
}
}
var _default = exports.default = DiscountScraper;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZWxlbWVudHNJbnRlcmFjdGlvbnMiLCJfZmV0Y2giLCJfbmF2aWdhdGlvbiIsIl90cmFuc2FjdGlvbnMiLCJfdHJhbnNhY3Rpb25zMiIsIl9iYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiX2Vycm9ycyIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIkJBU0VfVVJMIiwiREFURV9GT1JNQVQiLCJjb252ZXJ0VHJhbnNhY3Rpb25zIiwidHhucyIsInR4blN0YXR1cyIsIm9wdGlvbnMiLCJtYXAiLCJ0eG4iLCJyZXN1bHQiLCJ0eXBlIiwiVHJhbnNhY3Rpb25UeXBlcyIsIk5vcm1hbCIsImlkZW50aWZpZXIiLCJPcGVyYXRpb25OdW1iZXIiLCJkYXRlIiwibW9tZW50IiwiT3BlcmF0aW9uRGF0ZSIsInRvSVNPU3RyaW5nIiwicHJvY2Vzc2VkRGF0ZSIsIlZhbHVlRGF0ZSIsIm9yaWdpbmFsQW1vdW50IiwiT3BlcmF0aW9uQW1vdW50Iiwib3JpZ2luYWxDdXJyZW5jeSIsImNoYXJnZWRBbW91bnQiLCJkZXNjcmlwdGlvbiIsIk9wZXJhdGlvbkRlc2NyaXB0aW9uVG9EaXNwbGF5Iiwic3RhdHVzIiwiaW5jbHVkZVJhd1RyYW5zYWN0aW9uIiwicmF3VHJhbnNhY3Rpb24iLCJnZXRSYXdUcmFuc2FjdGlvbiIsImZldGNoQWNjb3VudERhdGEiLCJwYWdlIiwiYXBpU2l0ZVVybCIsImFjY291bnREYXRhVXJsIiwiYWNjb3VudEluZm8iLCJmZXRjaEdldFdpdGhpblBhZ2UiLCJzdWNjZXNzIiwiZXJyb3JUeXBlIiwiU2NyYXBlckVycm9yVHlwZXMiLCJHZW5lcmljIiwiZXJyb3JNZXNzYWdlIiwiZGVmYXVsdFN0YXJ0TW9tZW50Iiwic3VidHJhY3QiLCJhZGQiLCJzdGFydERhdGUiLCJ0b0RhdGUiLCJzdGFydE1vbWVudCIsIm1heCIsInN0YXJ0RGF0ZVN0ciIsImZvcm1hdCIsImFjY291bnRzIiwiVXNlckFjY291bnRzRGF0YSIsIlVzZXJBY2NvdW50cyIsImFjYyIsIk5ld0FjY291bnRJbmZvIiwiQWNjb3VudElEIiwiYWNjb3VudHNEYXRhIiwiYWNjb3VudE51bWJlciIsInR4bnNVcmwiLCJ0eG5zUmVzdWx0IiwiRXJyb3IiLCJDdXJyZW50QWNjb3VudExhc3RUcmFuc2FjdGlvbnMiLCJNc2dUZXh0IiwiYWNjb3VudENvbXBsZXRlZFR4bnMiLCJPcGVyYXRpb25FbnRyeSIsIlRyYW5zYWN0aW9uU3RhdHVzZXMiLCJDb21wbGV0ZWQiLCJyYXdGdXR1cmVUeG5zIiwiRnV0dXJlVHJhbnNhY3Rpb25zQmxvY2siLCJGdXR1cmVUcmFuc2FjdGlvbkVudHJ5IiwiYWNjb3VudFBlbmRpbmdUeG5zIiwiUGVuZGluZyIsInB1c2giLCJiYWxhbmNlIiwiQ3VycmVudEFjY291bnRJbmZvIiwiQWNjb3VudEJhbGFuY2UiLCJhY2NvdW50RGF0YSIsIm5hdmlnYXRlT3JFcnJvckxhYmVsIiwid2FpdEZvck5hdmlnYXRpb24iLCJ3YWl0VW50aWxFbGVtZW50Rm91bmQiLCJnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cyIsInVybHMiLCJMb2dpblJlc3VsdHMiLCJTdWNjZXNzIiwiSW52YWxpZFBhc3N3b3JkIiwiQ2hhbmdlUGFzc3dvcmQiLCJjcmVhdGVMb2dpbkZpZWxkcyIsImNyZWRlbnRpYWxzIiwic2VsZWN0b3IiLCJ2YWx1ZSIsImlkIiwicGFzc3dvcmQiLCJudW0iLCJEaXNjb3VudFNjcmFwZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiZ2V0TG9naW5PcHRpb25zIiwibG9naW5VcmwiLCJjaGVja1JlYWRpbmVzcyIsImZpZWxkcyIsInN1Ym1pdEJ1dHRvblNlbGVjdG9yIiwicG9zdEFjdGlvbiIsInBvc3NpYmxlUmVzdWx0cyIsImZldGNoRGF0YSIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9kaXNjb3VudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyB0eXBlIFBhZ2UgfSBmcm9tICdwdXBwZXRlZXItY29yZSc7XG5pbXBvcnQgeyB3YWl0VW50aWxFbGVtZW50Rm91bmQgfSBmcm9tICcuLi9oZWxwZXJzL2VsZW1lbnRzLWludGVyYWN0aW9ucyc7XG5pbXBvcnQgeyBmZXRjaEdldFdpdGhpblBhZ2UgfSBmcm9tICcuLi9oZWxwZXJzL2ZldGNoJztcbmltcG9ydCB7IHdhaXRGb3JOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IGdldFJhd1RyYW5zYWN0aW9uIH0gZnJvbSAnLi4vaGVscGVycy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgdHlwZSBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcyB9IGZyb20gJy4uL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBCYXNlU2NyYXBlcldpdGhCcm93c2VyLCBMb2dpblJlc3VsdHMsIHR5cGUgUG9zc2libGVMb2dpblJlc3VsdHMgfSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuaW1wb3J0IHsgU2NyYXBlckVycm9yVHlwZXMgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyB0eXBlIFNjcmFwZXJPcHRpb25zLCB0eXBlIFNjcmFwZXJTY3JhcGluZ1Jlc3VsdCB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly9zdGFydC50ZWxlYmFuay5jby5pbCc7XG5jb25zdCBEQVRFX0ZPUk1BVCA9ICdZWVlZTU1ERCc7XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBPcGVyYXRpb25OdW1iZXI6IG51bWJlcjtcbiAgT3BlcmF0aW9uRGF0ZTogc3RyaW5nO1xuICBWYWx1ZURhdGU6IHN0cmluZztcbiAgT3BlcmF0aW9uQW1vdW50OiBudW1iZXI7XG4gIE9wZXJhdGlvbkRlc2NyaXB0aW9uVG9EaXNwbGF5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDdXJyZW50QWNjb3VudEluZm8ge1xuICBBY2NvdW50QmFsYW5jZTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU2NyYXBlZEFjY291bnREYXRhIHtcbiAgVXNlckFjY291bnRzRGF0YToge1xuICAgIERlZmF1bHRBY2NvdW50TnVtYmVyOiBzdHJpbmc7XG4gICAgVXNlckFjY291bnRzOiBBcnJheTx7XG4gICAgICBOZXdBY2NvdW50SW5mbzoge1xuICAgICAgICBBY2NvdW50SUQ6IHN0cmluZztcbiAgICAgIH07XG4gICAgfT47XG4gIH07XG59XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb25EYXRhIHtcbiAgRXJyb3I/OiB7IE1zZ1RleHQ6IHN0cmluZyB9O1xuICBDdXJyZW50QWNjb3VudExhc3RUcmFuc2FjdGlvbnM/OiB7XG4gICAgT3BlcmF0aW9uRW50cnk6IFNjcmFwZWRUcmFuc2FjdGlvbltdO1xuICAgIEN1cnJlbnRBY2NvdW50SW5mbzogQ3VycmVudEFjY291bnRJbmZvO1xuICAgIEZ1dHVyZVRyYW5zYWN0aW9uc0Jsb2NrPzoge1xuICAgICAgRnV0dXJlVHJhbnNhY3Rpb25FbnRyeTogU2NyYXBlZFRyYW5zYWN0aW9uW107XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRyYW5zYWN0aW9ucyhcbiAgdHhuczogU2NyYXBlZFRyYW5zYWN0aW9uW10sXG4gIHR4blN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcyxcbiAgb3B0aW9ucz86IFNjcmFwZXJPcHRpb25zLFxuKTogVHJhbnNhY3Rpb25bXSB7XG4gIGlmICghdHhucykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gdHhucy5tYXAodHhuID0+IHtcbiAgICBjb25zdCByZXN1bHQ6IFRyYW5zYWN0aW9uID0ge1xuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWwsXG4gICAgICBpZGVudGlmaWVyOiB0eG4uT3BlcmF0aW9uTnVtYmVyLFxuICAgICAgZGF0ZTogbW9tZW50KHR4bi5PcGVyYXRpb25EYXRlLCBEQVRFX0ZPUk1BVCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHByb2Nlc3NlZERhdGU6IG1vbWVudCh0eG4uVmFsdWVEYXRlLCBEQVRFX0ZPUk1BVCkudG9JU09TdHJpbmcoKSxcbiAgICAgIG9yaWdpbmFsQW1vdW50OiB0eG4uT3BlcmF0aW9uQW1vdW50LFxuICAgICAgb3JpZ2luYWxDdXJyZW5jeTogJ0lMUycsXG4gICAgICBjaGFyZ2VkQW1vdW50OiB0eG4uT3BlcmF0aW9uQW1vdW50LFxuICAgICAgZGVzY3JpcHRpb246IHR4bi5PcGVyYXRpb25EZXNjcmlwdGlvblRvRGlzcGxheSxcbiAgICAgIHN0YXR1czogdHhuU3RhdHVzLFxuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucz8uaW5jbHVkZVJhd1RyYW5zYWN0aW9uKSB7XG4gICAgICByZXN1bHQucmF3VHJhbnNhY3Rpb24gPSBnZXRSYXdUcmFuc2FjdGlvbih0eG4pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFjY291bnREYXRhKHBhZ2U6IFBhZ2UsIG9wdGlvbnM6IFNjcmFwZXJPcHRpb25zKTogUHJvbWlzZTxTY3JhcGVyU2NyYXBpbmdSZXN1bHQ+IHtcbiAgY29uc3QgYXBpU2l0ZVVybCA9IGAke0JBU0VfVVJMfS9UaXRhbi9nYXRld2F5QVBJYDtcblxuICBjb25zdCBhY2NvdW50RGF0YVVybCA9IGAke2FwaVNpdGVVcmx9L3VzZXJBY2NvdW50c0RhdGFgO1xuICBjb25zdCBhY2NvdW50SW5mbyA9IGF3YWl0IGZldGNoR2V0V2l0aGluUGFnZTxTY3JhcGVkQWNjb3VudERhdGE+KHBhZ2UsIGFjY291bnREYXRhVXJsKTtcblxuICBpZiAoIWFjY291bnRJbmZvKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgZXJyb3JUeXBlOiBTY3JhcGVyRXJyb3JUeXBlcy5HZW5lcmljLFxuICAgICAgZXJyb3JNZXNzYWdlOiAnZmFpbGVkIHRvIGdldCBhY2NvdW50IGRhdGEnLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBkZWZhdWx0U3RhcnRNb21lbnQgPSBtb21lbnQoKS5zdWJ0cmFjdCgxLCAneWVhcnMnKS5hZGQoMiwgJ2RheScpO1xuICBjb25zdCBzdGFydERhdGUgPSBvcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gIGNvbnN0IHN0YXJ0TW9tZW50ID0gbW9tZW50Lm1heChkZWZhdWx0U3RhcnRNb21lbnQsIG1vbWVudChzdGFydERhdGUpKTtcblxuICBjb25zdCBzdGFydERhdGVTdHIgPSBzdGFydE1vbWVudC5mb3JtYXQoREFURV9GT1JNQVQpO1xuXG4gIGNvbnN0IGFjY291bnRzOiBzdHJpbmdbXSA9IGFjY291bnRJbmZvLlVzZXJBY2NvdW50c0RhdGEuVXNlckFjY291bnRzLm1hcChhY2MgPT4gYWNjLk5ld0FjY291bnRJbmZvLkFjY291bnRJRCk7XG4gIGNvbnN0IGFjY291bnRzRGF0YTogQXJyYXk8eyBhY2NvdW50TnVtYmVyOiBzdHJpbmc7IGJhbGFuY2U6IG51bWJlcjsgdHhuczogVHJhbnNhY3Rpb25bXSB9PiA9IFtdO1xuXG4gIGZvciAoY29uc3QgYWNjb3VudE51bWJlciBvZiBhY2NvdW50cykge1xuICAgIGNvbnN0IHR4bnNVcmwgPSBgJHthcGlTaXRlVXJsfS9sYXN0VHJhbnNhY3Rpb25zLyR7YWNjb3VudE51bWJlcn0vRGF0ZT9Jc0NhdGVnb3J5RGVzY0NvZGU9VHJ1ZSZJc1RyYW5zYWN0aW9uRGV0YWlscz1UcnVlJklzRXZlbnROYW1lcz1UcnVlJklzRnV0dXJlVHJhbnNhY3Rpb25GbGFnPVRydWUmRnJvbURhdGU9JHtzdGFydERhdGVTdHJ9YDtcbiAgICBjb25zdCB0eG5zUmVzdWx0ID0gYXdhaXQgZmV0Y2hHZXRXaXRoaW5QYWdlPFNjcmFwZWRUcmFuc2FjdGlvbkRhdGE+KHBhZ2UsIHR4bnNVcmwpO1xuICAgIGlmICghdHhuc1Jlc3VsdCB8fCB0eG5zUmVzdWx0LkVycm9yIHx8ICF0eG5zUmVzdWx0LkN1cnJlbnRBY2NvdW50TGFzdFRyYW5zYWN0aW9ucykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yVHlwZTogU2NyYXBlckVycm9yVHlwZXMuR2VuZXJpYyxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiB0eG5zUmVzdWx0ICYmIHR4bnNSZXN1bHQuRXJyb3IgPyB0eG5zUmVzdWx0LkVycm9yLk1zZ1RleHQgOiAndW5rbm93biBlcnJvcicsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGFjY291bnRDb21wbGV0ZWRUeG5zID0gY29udmVydFRyYW5zYWN0aW9ucyhcbiAgICAgIHR4bnNSZXN1bHQuQ3VycmVudEFjY291bnRMYXN0VHJhbnNhY3Rpb25zLk9wZXJhdGlvbkVudHJ5LFxuICAgICAgVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gICAgY29uc3QgcmF3RnV0dXJlVHhucyA9XG4gICAgICB0eG5zUmVzdWx0LkN1cnJlbnRBY2NvdW50TGFzdFRyYW5zYWN0aW9ucy5GdXR1cmVUcmFuc2FjdGlvbnNCbG9jaz8uRnV0dXJlVHJhbnNhY3Rpb25FbnRyeSA/PyBbXTtcbiAgICBjb25zdCBhY2NvdW50UGVuZGluZ1R4bnMgPSBjb252ZXJ0VHJhbnNhY3Rpb25zKHJhd0Z1dHVyZVR4bnMsIFRyYW5zYWN0aW9uU3RhdHVzZXMuUGVuZGluZywgb3B0aW9ucyk7XG5cbiAgICBhY2NvdW50c0RhdGEucHVzaCh7XG4gICAgICBhY2NvdW50TnVtYmVyLFxuICAgICAgYmFsYW5jZTogdHhuc1Jlc3VsdC5DdXJyZW50QWNjb3VudExhc3RUcmFuc2FjdGlvbnMuQ3VycmVudEFjY291bnRJbmZvLkFjY291bnRCYWxhbmNlLFxuICAgICAgdHhuczogWy4uLmFjY291bnRDb21wbGV0ZWRUeG5zLCAuLi5hY2NvdW50UGVuZGluZ1R4bnNdLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgYWNjb3VudERhdGEgPSB7XG4gICAgc3VjY2VzczogdHJ1ZSxcbiAgICBhY2NvdW50czogYWNjb3VudHNEYXRhLFxuICB9O1xuXG4gIHJldHVybiBhY2NvdW50RGF0YTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbmF2aWdhdGVPckVycm9yTGFiZWwocGFnZTogUGFnZSkge1xuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHBhZ2UpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjZ2VuZXJhbC1lcnJvcicsIGZhbHNlLCAxMDApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKCk6IFBvc3NpYmxlTG9naW5SZXN1bHRzIHtcbiAgY29uc3QgdXJsczogUG9zc2libGVMb2dpblJlc3VsdHMgPSB7fTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuU3VjY2Vzc10gPSBbXG4gICAgYCR7QkFTRV9VUkx9L2Fwb2xsby9yZXRhaWwvIy9NWV9BQ0NPVU5UX0hPTUVQQUdFYCxcbiAgICBgJHtCQVNFX1VSTH0vYXBvbGxvL3JldGFpbDIvIy9NWV9BQ0NPVU5UX0hPTUVQQUdFYCxcbiAgICBgJHtCQVNFX1VSTH0vYXBvbGxvL3JldGFpbDIvYCxcbiAgICBgJHtCQVNFX1VSTH0vYXBvbGxvL3JldGFpbDMvIy9NWV9BQ0NPVU5UX0hPTUVQQUdFYCxcbiAgICBgJHtCQVNFX1VSTH0vYXBvbGxvL3JldGFpbDMvYCxcbiAgXTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkXSA9IFtgJHtCQVNFX1VSTH0vYXBvbGxvL2NvcmUvdGVtcGxhdGVzL2xvYmJ5L21hc3RlclBhZ2UuaHRtbCMvTE9HSU5fUEFHRWBdO1xuICB1cmxzW0xvZ2luUmVzdWx0cy5DaGFuZ2VQYXNzd29yZF0gPSBbYCR7QkFTRV9VUkx9L2Fwb2xsby9jb3JlL3RlbXBsYXRlcy9sb2JieS9tYXN0ZXJQYWdlLmh0bWwjL1BXRF9SRU5FV2BdO1xuICByZXR1cm4gdXJscztcbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKSB7XG4gIHJldHVybiBbXG4gICAgeyBzZWxlY3RvcjogJyN0eklkJywgdmFsdWU6IGNyZWRlbnRpYWxzLmlkIH0sXG4gICAgeyBzZWxlY3RvcjogJyN0elBhc3N3b3JkJywgdmFsdWU6IGNyZWRlbnRpYWxzLnBhc3N3b3JkIH0sXG4gICAgeyBzZWxlY3RvcjogJyNhaWRudW0nLCB2YWx1ZTogY3JlZGVudGlhbHMubnVtIH0sXG4gIF07XG59XG5cbnR5cGUgU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMgPSB7IGlkOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmc7IG51bTogc3RyaW5nIH07XG5cbmNsYXNzIERpc2NvdW50U2NyYXBlciBleHRlbmRzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICAgIHJldHVybiB7XG4gICAgICBsb2dpblVybDogYCR7QkFTRV9VUkx9L2xvZ2luLyMvTE9HSU5fUEFHRWAsXG4gICAgICBjaGVja1JlYWRpbmVzczogYXN5bmMgKCkgPT4gd2FpdFVudGlsRWxlbWVudEZvdW5kKHRoaXMucGFnZSwgJyN0eklkJyksXG4gICAgICBmaWVsZHM6IGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzKSxcbiAgICAgIHN1Ym1pdEJ1dHRvblNlbGVjdG9yOiAnLnNlbmRCdG4nLFxuICAgICAgcG9zdEFjdGlvbjogYXN5bmMgKCkgPT4gbmF2aWdhdGVPckVycm9yTGFiZWwodGhpcy5wYWdlKSxcbiAgICAgIHBvc3NpYmxlUmVzdWx0czogZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIHJldHVybiBmZXRjaEFjY291bnREYXRhKHRoaXMucGFnZSwgdGhpcy5vcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEaXNjb3VudFNjcmFwZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLHFCQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxNQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxXQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxhQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxjQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSx1QkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sT0FBQSxHQUFBUCxPQUFBO0FBQTZDLFNBQUFELHVCQUFBUyxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRzdDLE1BQU1HLFFBQVEsR0FBRyw4QkFBOEI7QUFDL0MsTUFBTUMsV0FBVyxHQUFHLFVBQVU7QUFvQzlCLFNBQVNDLG1CQUFtQkEsQ0FDMUJDLElBQTBCLEVBQzFCQyxTQUE4QixFQUM5QkMsT0FBd0IsRUFDVDtFQUNmLElBQUksQ0FBQ0YsSUFBSSxFQUFFO0lBQ1QsT0FBTyxFQUFFO0VBQ1g7RUFDQSxPQUFPQSxJQUFJLENBQUNHLEdBQUcsQ0FBQ0MsR0FBRyxJQUFJO0lBQ3JCLE1BQU1DLE1BQW1CLEdBQUc7TUFDMUJDLElBQUksRUFBRUMsK0JBQWdCLENBQUNDLE1BQU07TUFDN0JDLFVBQVUsRUFBRUwsR0FBRyxDQUFDTSxlQUFlO01BQy9CQyxJQUFJLEVBQUUsSUFBQUMsZUFBTSxFQUFDUixHQUFHLENBQUNTLGFBQWEsRUFBRWYsV0FBVyxDQUFDLENBQUNnQixXQUFXLENBQUMsQ0FBQztNQUMx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