israeli-bank-scrapers 6.1.0 → 6.1.1
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 +5 -7
- package/lib/constants.js +13 -16
- package/lib/definitions.js +109 -113
- package/lib/helpers/browser.js +9 -16
- package/lib/helpers/dates.js +18 -19
- package/lib/helpers/debug.js +9 -9
- package/lib/helpers/elements-interactions.js +78 -84
- package/lib/helpers/fetch.js +82 -89
- package/lib/helpers/navigation.js +24 -31
- package/lib/helpers/storage.js +10 -12
- package/lib/helpers/transactions.js +33 -35
- package/lib/helpers/waiting.js +45 -44
- package/lib/index.js +15 -82
- package/lib/scrapers/amex.js +11 -13
- package/lib/scrapers/base-beinleumi-group.js +233 -252
- package/lib/scrapers/base-isracard-amex.js +273 -286
- package/lib/scrapers/base-scraper-with-browser.js +240 -274
- package/lib/scrapers/base-scraper.js +82 -86
- package/lib/scrapers/behatsdaa.js +98 -107
- package/lib/scrapers/beinleumi.js +11 -20
- package/lib/scrapers/beyahad-bishvilha.js +132 -138
- package/lib/scrapers/discount.js +97 -103
- package/lib/scrapers/errors.js +22 -25
- package/lib/scrapers/factory.js +66 -67
- package/lib/scrapers/hapoalim.js +162 -182
- package/lib/scrapers/interface.js +2 -5
- package/lib/scrapers/isracard.js +11 -13
- package/lib/scrapers/leumi.js +167 -176
- package/lib/scrapers/massad.js +11 -20
- package/lib/scrapers/max.js +256 -268
- package/lib/scrapers/mercantile.js +14 -20
- package/lib/scrapers/mizrahi.js +158 -159
- package/lib/scrapers/one-zero-queries.js +4 -7
- package/lib/scrapers/one-zero.js +176 -240
- package/lib/scrapers/otsar-hahayal.js +11 -20
- package/lib/scrapers/pagi.js +11 -20
- package/lib/scrapers/union-bank.js +172 -179
- package/lib/scrapers/visa-cal.js +254 -263
- package/lib/scrapers/yahav.js +190 -211
- package/lib/transactions.js +13 -16
- package/package.json +12 -14
- package/lib/scrapers/amex.test.d.ts +0 -1
- package/lib/scrapers/amex.test.js +0 -54
- package/lib/scrapers/base-scraper-with-browser.test.d.ts +0 -1
- package/lib/scrapers/base-scraper-with-browser.test.js +0 -58
- package/lib/scrapers/behatsdaa.test.d.ts +0 -1
- package/lib/scrapers/behatsdaa.test.js +0 -50
- package/lib/scrapers/beinleumi.test.d.ts +0 -1
- package/lib/scrapers/beinleumi.test.js +0 -52
- package/lib/scrapers/beyahad-bishvilha.test.d.ts +0 -1
- package/lib/scrapers/beyahad-bishvilha.test.js +0 -52
- package/lib/scrapers/discount.test.d.ts +0 -1
- package/lib/scrapers/discount.test.js +0 -54
- package/lib/scrapers/factory.test.d.ts +0 -1
- package/lib/scrapers/factory.test.js +0 -19
- package/lib/scrapers/hapoalim.test.d.ts +0 -1
- package/lib/scrapers/hapoalim.test.js +0 -52
- package/lib/scrapers/isracard.test.d.ts +0 -1
- package/lib/scrapers/isracard.test.js +0 -54
- package/lib/scrapers/leumi.test.d.ts +0 -1
- package/lib/scrapers/leumi.test.js +0 -52
- package/lib/scrapers/max.test.d.ts +0 -1
- package/lib/scrapers/max.test.js +0 -71
- package/lib/scrapers/mercantile.test.d.ts +0 -1
- package/lib/scrapers/mercantile.test.js +0 -50
- package/lib/scrapers/mizrahi.test.d.ts +0 -1
- package/lib/scrapers/mizrahi.test.js +0 -58
- package/lib/scrapers/one-zero.test.d.ts +0 -1
- package/lib/scrapers/one-zero.test.js +0 -56
- package/lib/scrapers/otsar-hahayal.test.d.ts +0 -1
- package/lib/scrapers/otsar-hahayal.test.js +0 -52
- package/lib/scrapers/pagi.test.d.ts +0 -1
- package/lib/scrapers/pagi.test.js +0 -52
- package/lib/scrapers/union-bank.test.d.ts +0 -1
- package/lib/scrapers/union-bank.test.js +0 -52
- package/lib/scrapers/visa-cal.test.d.ts +0 -1
- package/lib/scrapers/visa-cal.test.js +0 -54
- package/lib/scrapers/yahav.test.d.ts +0 -1
- package/lib/scrapers/yahav.test.js +0 -54
package/lib/scrapers/max.js
CHANGED
|
@@ -1,311 +1,299 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
exports.
|
|
7
|
-
|
|
8
|
-
require("
|
|
9
|
-
require("
|
|
10
|
-
require("
|
|
11
|
-
require("
|
|
12
|
-
require("
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
var _fetch = require("../helpers/fetch");
|
|
20
|
-
var _navigation = require("../helpers/navigation");
|
|
21
|
-
var _transactions = require("../helpers/transactions");
|
|
22
|
-
var _transactions2 = require("../transactions");
|
|
23
|
-
var _baseScraperWithBrowser = require("./base-scraper-with-browser");
|
|
24
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
25
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
26
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
27
|
-
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
28
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
29
|
-
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
30
|
-
const debug = (0, _debug.getDebug)('max');
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getMemo = void 0;
|
|
7
|
+
const build_url_1 = __importDefault(require("build-url"));
|
|
8
|
+
const moment_1 = __importDefault(require("moment"));
|
|
9
|
+
const constants_1 = require("../constants");
|
|
10
|
+
const dates_1 = __importDefault(require("../helpers/dates"));
|
|
11
|
+
const debug_1 = require("../helpers/debug");
|
|
12
|
+
const elements_interactions_1 = require("../helpers/elements-interactions");
|
|
13
|
+
const fetch_1 = require("../helpers/fetch");
|
|
14
|
+
const navigation_1 = require("../helpers/navigation");
|
|
15
|
+
const transactions_1 = require("../helpers/transactions");
|
|
16
|
+
const transactions_2 = require("../transactions");
|
|
17
|
+
const base_scraper_with_browser_1 = require("./base-scraper-with-browser");
|
|
18
|
+
const debug = (0, debug_1.getDebug)('max');
|
|
31
19
|
const BASE_API_ACTIONS_URL = 'https://onlinelcapi.max.co.il';
|
|
32
20
|
const BASE_WELCOME_URL = 'https://www.max.co.il';
|
|
33
21
|
const LOGIN_URL = `${BASE_WELCOME_URL}/homepage/welcome`;
|
|
34
22
|
const PASSWORD_EXPIRED_URL = `${BASE_WELCOME_URL}/renew-password`;
|
|
35
23
|
const SUCCESS_URL = `${BASE_WELCOME_URL}/homepage/personal`;
|
|
36
|
-
var MaxPlanName
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}(MaxPlanName || {});
|
|
24
|
+
var MaxPlanName;
|
|
25
|
+
(function (MaxPlanName) {
|
|
26
|
+
MaxPlanName["Normal"] = "\u05E8\u05D2\u05D9\u05DC\u05D4";
|
|
27
|
+
MaxPlanName["ImmediateCharge"] = "\u05D7\u05D9\u05D5\u05D1 \u05E2\u05E1\u05E7\u05D5\u05EA \u05DE\u05D9\u05D9\u05D3\u05D9";
|
|
28
|
+
MaxPlanName["InternetShopping"] = "\u05D0\u05D9\u05E0\u05D8\u05E8\u05E0\u05D8/\u05D7\u05D5\"\u05DC";
|
|
29
|
+
MaxPlanName["Installments"] = "\u05EA\u05E9\u05DC\u05D5\u05DE\u05D9\u05DD";
|
|
30
|
+
MaxPlanName["MonthlyCharge"] = "\u05D7\u05D9\u05D5\u05D1 \u05D7\u05D5\u05D3\u05E9\u05D9";
|
|
31
|
+
MaxPlanName["OneMonthPostponed"] = "\u05D3\u05D7\u05D5\u05D9 \u05D7\u05D5\u05D3\u05E9";
|
|
32
|
+
MaxPlanName["MonthlyPostponed"] = "\u05D3\u05D7\u05D5\u05D9 \u05DC\u05D7\u05D9\u05D5\u05D1 \u05D4\u05D7\u05D5\u05D3\u05E9\u05D9";
|
|
33
|
+
MaxPlanName["MonthlyPayment"] = "\u05EA\u05E9\u05DC\u05D5\u05DD \u05D7\u05D5\u05D3\u05E9\u05D9";
|
|
34
|
+
MaxPlanName["FuturePurchaseFinancing"] = "\u05DE\u05D9\u05DE\u05D5\u05DF \u05DC\u05E8\u05DB\u05D9\u05E9\u05D4 \u05E2\u05EA\u05D9\u05D3\u05D9\u05EA";
|
|
35
|
+
MaxPlanName["MonthlyPostponedInstallments"] = "\u05D3\u05D7\u05D5\u05D9 \u05D7\u05D5\u05D3\u05E9 \u05EA\u05E9\u05DC\u05D5\u05DE\u05D9\u05DD";
|
|
36
|
+
MaxPlanName["ThirtyDaysPlus"] = "\u05E2\u05E1\u05E7\u05EA 30 \u05E4\u05DC\u05D5\u05E1";
|
|
37
|
+
MaxPlanName["TwoMonthsPostponed"] = "\u05D3\u05D7\u05D5\u05D9 \u05D7\u05D5\u05D3\u05E9\u05D9\u05D9\u05DD";
|
|
38
|
+
MaxPlanName["TwoMonthsPostponed2"] = "\u05D3\u05D7\u05D5\u05D9 2 \u05D7' \u05EA\u05E9\u05DC\u05D5\u05DE\u05D9\u05DD";
|
|
39
|
+
MaxPlanName["MonthlyChargePlusInterest"] = "\u05D7\u05D5\u05D3\u05E9\u05D9 + \u05E8\u05D9\u05D1\u05D9\u05EA";
|
|
40
|
+
MaxPlanName["Credit"] = "\u05E7\u05E8\u05D3\u05D9\u05D8";
|
|
41
|
+
MaxPlanName["CreditOutsideTheLimit"] = "\u05E7\u05E8\u05D3\u05D9\u05D8-\u05DE\u05D7\u05D5\u05E5 \u05DC\u05DE\u05E1\u05D2\u05E8\u05EA";
|
|
42
|
+
MaxPlanName["AccumulatingBasket"] = "\u05E1\u05DC \u05DE\u05E6\u05D8\u05D1\u05E8";
|
|
43
|
+
MaxPlanName["PostponedTransactionInstallments"] = "\u05E4\u05E8\u05D9\u05E1\u05EA \u05D4\u05E2\u05E1\u05E7\u05D4 \u05D4\u05D3\u05D7\u05D5\u05D9\u05D4";
|
|
44
|
+
MaxPlanName["ReplacementCard"] = "\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D7\u05DC\u05D9\u05E4\u05D9";
|
|
45
|
+
MaxPlanName["EarlyRepayment"] = "\u05E4\u05E8\u05E2\u05D5\u05DF \u05DE\u05D5\u05E7\u05D3\u05DD";
|
|
46
|
+
MaxPlanName["MonthlyCardFee"] = "\u05D3\u05DE\u05D9 \u05DB\u05E8\u05D8\u05D9\u05E1";
|
|
47
|
+
MaxPlanName["CurrencyPocket"] = "\u05D7\u05D9\u05D5\u05D1 \u05D0\u05E8\u05E0\u05E7 \u05DE\u05D8\u05D7";
|
|
48
|
+
})(MaxPlanName || (MaxPlanName = {}));
|
|
61
49
|
const INVALID_DETAILS_SELECTOR = '#popupWrongDetails';
|
|
62
50
|
const LOGIN_ERROR_SELECTOR = '#popupCardHoldersLoginError';
|
|
63
51
|
const categories = new Map();
|
|
64
52
|
function redirectOrDialog(page) {
|
|
65
|
-
|
|
53
|
+
return Promise.race([
|
|
54
|
+
(0, navigation_1.waitForRedirect)(page, 20000, false, [BASE_WELCOME_URL, `${BASE_WELCOME_URL}/`]),
|
|
55
|
+
(0, elements_interactions_1.waitUntilElementFound)(page, INVALID_DETAILS_SELECTOR, true),
|
|
56
|
+
(0, elements_interactions_1.waitUntilElementFound)(page, LOGIN_ERROR_SELECTOR, true),
|
|
57
|
+
]);
|
|
66
58
|
}
|
|
67
59
|
function getTransactionsUrl(monthMoment) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
/**
|
|
60
|
+
const month = monthMoment.month() + 1;
|
|
61
|
+
const year = monthMoment.year();
|
|
62
|
+
const date = `${year}-${month}-01`;
|
|
63
|
+
/**
|
|
73
64
|
* url explanation:
|
|
74
65
|
* userIndex: -1 for all account owners
|
|
75
66
|
* cardIndex: -1 for all cards under the account
|
|
76
67
|
* all other query params are static, beside the date which changes for request per month
|
|
77
68
|
*/
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
69
|
+
return (0, build_url_1.default)(BASE_API_ACTIONS_URL, {
|
|
70
|
+
path: `/api/registered/transactionDetails/getTransactionsAndGraphs?filterData={"userIndex":-1,"cardIndex":-1,"monthView":true,"date":"${date}","dates":{"startDate":"0","endDate":"0"},"bankAccount":{"bankAccountIndex":-1,"cards":null}}&firstCallCardIndex=-1`,
|
|
71
|
+
});
|
|
81
72
|
}
|
|
82
73
|
async function loadCategories(page) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
id,
|
|
90
|
-
name
|
|
91
|
-
}) => categories.set(id, name));
|
|
92
|
-
}
|
|
74
|
+
debug('Loading categories');
|
|
75
|
+
const res = await (0, fetch_1.fetchGetWithinPage)(page, `${BASE_API_ACTIONS_URL}/api/contents/getCategories`);
|
|
76
|
+
if (res && Array.isArray(res.result)) {
|
|
77
|
+
debug(`${res.result.length} categories loaded`);
|
|
78
|
+
res.result?.forEach(({ id, name }) => categories.set(id, name));
|
|
79
|
+
}
|
|
93
80
|
}
|
|
94
81
|
function getTransactionType(planName, planTypeId) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
default:
|
|
122
|
-
switch (planTypeId) {
|
|
123
|
-
case 2:
|
|
124
|
-
case 3:
|
|
125
|
-
return _transactions2.TransactionTypes.Installments;
|
|
126
|
-
case 5:
|
|
127
|
-
return _transactions2.TransactionTypes.Normal;
|
|
82
|
+
const cleanedUpTxnTypeStr = planName.replace('\t', ' ').trim();
|
|
83
|
+
switch (cleanedUpTxnTypeStr) {
|
|
84
|
+
case MaxPlanName.ImmediateCharge:
|
|
85
|
+
case MaxPlanName.Normal:
|
|
86
|
+
case MaxPlanName.MonthlyCharge:
|
|
87
|
+
case MaxPlanName.OneMonthPostponed:
|
|
88
|
+
case MaxPlanName.MonthlyPostponed:
|
|
89
|
+
case MaxPlanName.FuturePurchaseFinancing:
|
|
90
|
+
case MaxPlanName.MonthlyPayment:
|
|
91
|
+
case MaxPlanName.MonthlyPostponedInstallments:
|
|
92
|
+
case MaxPlanName.ThirtyDaysPlus:
|
|
93
|
+
case MaxPlanName.TwoMonthsPostponed:
|
|
94
|
+
case MaxPlanName.TwoMonthsPostponed2:
|
|
95
|
+
case MaxPlanName.AccumulatingBasket:
|
|
96
|
+
case MaxPlanName.InternetShopping:
|
|
97
|
+
case MaxPlanName.MonthlyChargePlusInterest:
|
|
98
|
+
case MaxPlanName.PostponedTransactionInstallments:
|
|
99
|
+
case MaxPlanName.ReplacementCard:
|
|
100
|
+
case MaxPlanName.EarlyRepayment:
|
|
101
|
+
case MaxPlanName.MonthlyCardFee:
|
|
102
|
+
case MaxPlanName.CurrencyPocket:
|
|
103
|
+
return transactions_2.TransactionTypes.Normal;
|
|
104
|
+
case MaxPlanName.Installments:
|
|
105
|
+
case MaxPlanName.Credit:
|
|
106
|
+
case MaxPlanName.CreditOutsideTheLimit:
|
|
107
|
+
return transactions_2.TransactionTypes.Installments;
|
|
128
108
|
default:
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
109
|
+
switch (planTypeId) {
|
|
110
|
+
case 2:
|
|
111
|
+
case 3:
|
|
112
|
+
return transactions_2.TransactionTypes.Installments;
|
|
113
|
+
case 5:
|
|
114
|
+
return transactions_2.TransactionTypes.Normal;
|
|
115
|
+
default:
|
|
116
|
+
throw new Error(`Unknown transaction type ${cleanedUpTxnTypeStr}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
132
119
|
}
|
|
133
120
|
function getInstallmentsInfo(comments) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
121
|
+
if (!comments) {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
const matches = comments.match(/\d+/g);
|
|
125
|
+
if (!matches || matches.length < 2) {
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
number: parseInt(matches[0], 10),
|
|
130
|
+
total: parseInt(matches[1], 10),
|
|
131
|
+
};
|
|
145
132
|
}
|
|
146
133
|
function getChargedCurrency(currencyId) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
134
|
+
switch (currencyId) {
|
|
135
|
+
case 376:
|
|
136
|
+
return constants_1.SHEKEL_CURRENCY;
|
|
137
|
+
case 840:
|
|
138
|
+
return constants_1.DOLLAR_CURRENCY;
|
|
139
|
+
case 978:
|
|
140
|
+
return constants_1.EURO_CURRENCY;
|
|
141
|
+
default:
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
157
144
|
}
|
|
158
|
-
function getMemo({
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const memo = comments ? `${comments} ${fundsTransferReceiverOrTransfer}` : fundsTransferReceiverOrTransfer;
|
|
165
|
-
return fundsTransferComment ? `${memo}: ${fundsTransferComment}` : memo;
|
|
166
|
-
}
|
|
167
|
-
return comments;
|
|
145
|
+
function getMemo({ comments, fundsTransferReceiverOrTransfer, fundsTransferComment, }) {
|
|
146
|
+
if (fundsTransferReceiverOrTransfer) {
|
|
147
|
+
const memo = comments ? `${comments} ${fundsTransferReceiverOrTransfer}` : fundsTransferReceiverOrTransfer;
|
|
148
|
+
return fundsTransferComment ? `${memo}: ${fundsTransferComment}` : memo;
|
|
149
|
+
}
|
|
150
|
+
return comments;
|
|
168
151
|
}
|
|
152
|
+
exports.getMemo = getMemo;
|
|
169
153
|
function mapTransaction(rawTransaction) {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
154
|
+
const isPending = rawTransaction.paymentDate === null;
|
|
155
|
+
const processedDate = (0, moment_1.default)(isPending ? rawTransaction.purchaseDate : rawTransaction.paymentDate).toISOString();
|
|
156
|
+
const status = isPending ? transactions_2.TransactionStatuses.Pending : transactions_2.TransactionStatuses.Completed;
|
|
157
|
+
const installments = getInstallmentsInfo(rawTransaction.comments);
|
|
158
|
+
const identifier = installments
|
|
159
|
+
? `${rawTransaction.dealData?.arn}_${installments.number}`
|
|
160
|
+
: rawTransaction.dealData?.arn;
|
|
161
|
+
return {
|
|
162
|
+
type: getTransactionType(rawTransaction.planName, rawTransaction.planTypeId),
|
|
163
|
+
date: (0, moment_1.default)(rawTransaction.purchaseDate).toISOString(),
|
|
164
|
+
processedDate,
|
|
165
|
+
originalAmount: -rawTransaction.originalAmount,
|
|
166
|
+
originalCurrency: rawTransaction.originalCurrency,
|
|
167
|
+
chargedAmount: -rawTransaction.actualPaymentAmount,
|
|
168
|
+
chargedCurrency: getChargedCurrency(rawTransaction.paymentCurrency),
|
|
169
|
+
description: rawTransaction.merchantName.trim(),
|
|
170
|
+
memo: getMemo(rawTransaction),
|
|
171
|
+
category: categories.get(rawTransaction?.categoryId),
|
|
172
|
+
installments,
|
|
173
|
+
identifier,
|
|
174
|
+
status,
|
|
175
|
+
};
|
|
191
176
|
}
|
|
192
177
|
async function fetchTransactionsForMonth(page, monthMoment) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
178
|
+
const url = getTransactionsUrl(monthMoment);
|
|
179
|
+
const data = await (0, fetch_1.fetchGetWithinPage)(page, url);
|
|
180
|
+
const transactionsByAccount = {};
|
|
181
|
+
if (!data || !data.result)
|
|
182
|
+
return transactionsByAccount;
|
|
183
|
+
data.result.transactions
|
|
184
|
+
// Filter out non-transactions without a plan type, e.g. summary rows
|
|
185
|
+
.filter(transaction => !!transaction.planName)
|
|
186
|
+
.forEach((transaction) => {
|
|
187
|
+
if (!transactionsByAccount[transaction.shortCardNumber]) {
|
|
188
|
+
transactionsByAccount[transaction.shortCardNumber] = [];
|
|
189
|
+
}
|
|
190
|
+
const mappedTransaction = mapTransaction(transaction);
|
|
191
|
+
transactionsByAccount[transaction.shortCardNumber].push(mappedTransaction);
|
|
192
|
+
});
|
|
193
|
+
return transactionsByAccount;
|
|
207
194
|
}
|
|
208
195
|
function addResult(allResults, result) {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
196
|
+
const clonedResults = { ...allResults };
|
|
197
|
+
Object.keys(result).forEach(accountNumber => {
|
|
198
|
+
if (!clonedResults[accountNumber]) {
|
|
199
|
+
clonedResults[accountNumber] = [];
|
|
200
|
+
}
|
|
201
|
+
clonedResults[accountNumber].push(...result[accountNumber]);
|
|
202
|
+
});
|
|
203
|
+
return clonedResults;
|
|
217
204
|
}
|
|
218
205
|
function prepareTransactions(txns, startMoment, combineInstallments, enableTransactionsFilterByDate) {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
206
|
+
let clonedTxns = Array.from(txns);
|
|
207
|
+
if (!combineInstallments) {
|
|
208
|
+
clonedTxns = (0, transactions_1.fixInstallments)(clonedTxns);
|
|
209
|
+
}
|
|
210
|
+
clonedTxns = (0, transactions_1.sortTransactionsByDate)(clonedTxns);
|
|
211
|
+
clonedTxns = enableTransactionsFilterByDate
|
|
212
|
+
? (0, transactions_1.filterOldTransactions)(clonedTxns, startMoment, combineInstallments || false)
|
|
213
|
+
: clonedTxns;
|
|
214
|
+
return clonedTxns;
|
|
226
215
|
}
|
|
227
216
|
async function fetchTransactions(page, options) {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
allResults
|
|
246
|
-
});
|
|
247
|
-
return allResults;
|
|
217
|
+
const futureMonthsToScrape = options.futureMonthsToScrape ?? 1;
|
|
218
|
+
const defaultStartMoment = (0, moment_1.default)().subtract(1, 'years');
|
|
219
|
+
const startMomentLimit = (0, moment_1.default)().subtract(4, 'years');
|
|
220
|
+
const startDate = options.startDate || defaultStartMoment.toDate();
|
|
221
|
+
const startMoment = moment_1.default.max(startMomentLimit, (0, moment_1.default)(startDate));
|
|
222
|
+
const allMonths = (0, dates_1.default)(startMoment, futureMonthsToScrape);
|
|
223
|
+
await loadCategories(page);
|
|
224
|
+
let allResults = {};
|
|
225
|
+
for (let i = 0; i < allMonths.length; i += 1) {
|
|
226
|
+
const result = await fetchTransactionsForMonth(page, allMonths[i]);
|
|
227
|
+
allResults = addResult(allResults, result);
|
|
228
|
+
}
|
|
229
|
+
Object.keys(allResults).forEach(accountNumber => {
|
|
230
|
+
let txns = allResults[accountNumber];
|
|
231
|
+
txns = prepareTransactions(txns, startMoment, options.combineInstallments || false, options.outputData?.enableTransactionsFilterByDate ?? true);
|
|
232
|
+
allResults[accountNumber] = txns;
|
|
233
|
+
});
|
|
234
|
+
return allResults;
|
|
248
235
|
}
|
|
249
236
|
function getPossibleLoginResults(page) {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
237
|
+
const urls = {};
|
|
238
|
+
urls[base_scraper_with_browser_1.LoginResults.Success] = [SUCCESS_URL];
|
|
239
|
+
urls[base_scraper_with_browser_1.LoginResults.ChangePassword] = [PASSWORD_EXPIRED_URL];
|
|
240
|
+
urls[base_scraper_with_browser_1.LoginResults.InvalidPassword] = [
|
|
241
|
+
async () => {
|
|
242
|
+
return (0, elements_interactions_1.elementPresentOnPage)(page, INVALID_DETAILS_SELECTOR);
|
|
243
|
+
},
|
|
244
|
+
];
|
|
245
|
+
urls[base_scraper_with_browser_1.LoginResults.UnknownError] = [
|
|
246
|
+
async () => {
|
|
247
|
+
return (0, elements_interactions_1.elementPresentOnPage)(page, LOGIN_ERROR_SELECTOR);
|
|
248
|
+
},
|
|
249
|
+
];
|
|
250
|
+
return urls;
|
|
260
251
|
}
|
|
261
252
|
function createLoginFields(credentials) {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
selector: '#password',
|
|
267
|
-
value: credentials.password
|
|
268
|
-
}];
|
|
253
|
+
return [
|
|
254
|
+
{ selector: '#user-name', value: credentials.username },
|
|
255
|
+
{ selector: '#password', value: credentials.password },
|
|
256
|
+
];
|
|
269
257
|
}
|
|
270
|
-
class MaxScraper extends
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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
|
-
|
|
258
|
+
class MaxScraper extends base_scraper_with_browser_1.BaseScraperWithBrowser {
|
|
259
|
+
getLoginOptions(credentials) {
|
|
260
|
+
return {
|
|
261
|
+
loginUrl: LOGIN_URL,
|
|
262
|
+
fields: createLoginFields(credentials),
|
|
263
|
+
submitButtonSelector: 'app-user-login-form .general-button.send-me-code',
|
|
264
|
+
preAction: async () => {
|
|
265
|
+
if (await (0, elements_interactions_1.elementPresentOnPage)(this.page, '#closePopup')) {
|
|
266
|
+
await (0, elements_interactions_1.clickButton)(this.page, '#closePopup');
|
|
267
|
+
}
|
|
268
|
+
await (0, elements_interactions_1.clickButton)(this.page, '.personal-area > a.go-to-personal-area');
|
|
269
|
+
if (await (0, elements_interactions_1.elementPresentOnPage)(this.page, '.login-link#private')) {
|
|
270
|
+
await (0, elements_interactions_1.clickButton)(this.page, '.login-link#private');
|
|
271
|
+
}
|
|
272
|
+
await (0, elements_interactions_1.waitUntilElementFound)(this.page, '#login-password-link', true);
|
|
273
|
+
await (0, elements_interactions_1.clickButton)(this.page, '#login-password-link');
|
|
274
|
+
await (0, elements_interactions_1.waitUntilElementFound)(this.page, '#login-password.tab-pane.active app-user-login-form', true);
|
|
275
|
+
},
|
|
276
|
+
checkReadiness: async () => {
|
|
277
|
+
await (0, elements_interactions_1.waitUntilElementFound)(this.page, '.personal-area > a.go-to-personal-area', true);
|
|
278
|
+
},
|
|
279
|
+
postAction: async () => redirectOrDialog(this.page),
|
|
280
|
+
possibleResults: getPossibleLoginResults(this.page),
|
|
281
|
+
waitUntil: 'domcontentloaded',
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
async fetchData() {
|
|
285
|
+
const results = await fetchTransactions(this.page, this.options);
|
|
286
|
+
const accounts = Object.keys(results).map(accountNumber => {
|
|
287
|
+
return {
|
|
288
|
+
accountNumber,
|
|
289
|
+
txns: results[accountNumber],
|
|
290
|
+
};
|
|
291
|
+
});
|
|
292
|
+
return {
|
|
293
|
+
success: true,
|
|
294
|
+
accounts,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
309
297
|
}
|
|
310
|
-
|
|
311
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYnVpbGRVcmwiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tb21lbnQiLCJfY29uc3RhbnRzIiwiX2RhdGVzIiwiX2RlYnVnIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX2ZldGNoIiwiX25hdmlnYXRpb24iLCJfdHJhbnNhY3Rpb25zIiwiX3RyYW5zYWN0aW9uczIiLCJfYmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIm93bktleXMiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl90b1Byb3BlcnR5S2V5IiwidmFsdWUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImkiLCJfdG9QcmltaXRpdmUiLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsImNhbGwiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJkZWJ1ZyIsImdldERlYnVnIiwiQkFTRV9BUElfQUNUSU9OU19VUkwiLCJCQVNFX1dFTENPTUVfVVJMIiwiTE9HSU5fVVJMIiwiUEFTU1dPUkRfRVhQSVJFRF9VUkwiLCJTVUNDRVNTX1VSTCIsIk1heFBsYW5OYW1lIiwiSU5WQUxJRF9ERVRBSUxTX1NFTEVDVE9SIiwiTE9HSU5fRVJST1JfU0VMRUNUT1IiLCJjYXRlZ29yaWVzIiwiTWFwIiwicmVkaXJlY3RPckRpYWxvZyIsInBhZ2UiLCJQcm9taXNlIiwicmFjZSIsIndhaXRGb3JSZWRpcmVjdCIsIndhaXRVbnRpbEVsZW1lbnRGb3VuZCIsImdldFRyYW5zYWN0aW9uc1VybCIsIm1vbnRoTW9tZW50IiwibW9udGgiLCJ5ZWFyIiwiZGF0ZSIsImJ1aWxkVXJsIiwicGF0aCIsImxvYWRDYXRlZ29yaWVzIiwicmVzIiwiZmV0Y2hHZXRXaXRoaW5QYWdlIiwiQXJyYXkiLCJpc0FycmF5IiwicmVzdWx0IiwiX3JlcyRyZXN1bHQiLCJpZCIsIm5hbWUiLCJzZXQiLCJnZXRUcmFuc2FjdGlvblR5cGUiLCJwbGFuTmFtZSIsInBsYW5UeXBlSWQiLCJjbGVhbmVkVXBUeG5UeXBlU3RyIiwicmVwbGFjZSIsInRyaW0iLCJJbW1lZGlhdGVDaGFyZ2UiLCJOb3JtYWwiLCJNb250aGx5Q2hhcmdlIiwiT25lTW9udGhQb3N0cG9uZWQiLCJNb250aGx5UG9zdHBvbmVkIiwiRnV0dXJlUHVyY2hhc2VGaW5hbmNpbmciLCJNb250aGx5UGF5bWVudCIsIk1vbnRobHlQb3N0cG9uZWRJbnN0YWxsbWVudHMiLCJUaGlydHlEYXlzUGx1cyIsIlR3b01vbnRoc1Bvc3Rwb25lZCIsIlR3b01vbnRoc1Bvc3Rwb25lZDIiLCJBY2N1bXVsYXRpbmdCYXNrZXQiLCJJbnRlcm5ldFNob3BwaW5nIiwiTW9udGhseUNoYXJnZVBsdXNJbnRlcmVzdCIsIlBvc3Rwb25lZFRyYW5zYWN0aW9uSW5zdGFsbG1lbnRzIiwiUmVwbGFjZW1lbnRDYXJkIiwiRWFybHlSZXBheW1lbnQiLCJNb250aGx5Q2FyZEZlZSIsIkN1cnJlbmN5UG9ja2V0IiwiVHJhbnNhY3Rpb25UeXBlcyIsIkluc3RhbGxtZW50cyIsIkNyZWRpdCIsIkNyZWRpdE91dHNpZGVUaGVMaW1pdCIsIkVycm9yIiwiZ2V0SW5zdGFsbG1lbnRzSW5mbyIsImNvbW1lbnRzIiwidW5kZWZpbmVkIiwibWF0Y2hlcyIsIm1hdGNoIiwibnVtYmVyIiwicGFyc2VJbnQiLCJ0b3RhbCIsImdldENoYXJnZWRDdXJyZW5jeSIsImN1cnJlbmN5SWQiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJET0xMQVJfQ1VSUkVOQ1kiLCJFVVJPX0NVUlJFTkNZIiwiZ2V0TWVtbyIsImZ1bmRzVHJhbnNmZXJSZWNlaXZlck9yVHJhbnNmZXIiLCJmdW5kc1RyYW5zZmVyQ29tbWVudCIsIm1lbW8iLCJtYXBUcmFuc2FjdGlvbiIsInJhd1RyYW5zYWN0aW9uIiwiX3Jhd1RyYW5zYWN0aW9uJGRlYWxEIiwiX3Jhd1RyYW5zYWN0aW9uJGRlYWxEMiIsImlzUGVuZGluZyIsInBheW1lbnREYXRlIiwicHJvY2Vzc2VkRGF0ZSIsIm1vbWVudCIsInB1cmNoYXNlRGF0ZSIsInRvSVNPU3RyaW5nIiwic3RhdHVzIiwiVHJhbnNhY3Rpb25TdGF0dXNlcyIsIlBlbmRpbmciLCJDb21wbGV0ZWQiLCJpbnN0YWxsbWVudHMiLCJpZGVudGlmaWVyIiwiZGVhbERhdGEiLCJhcm4iLCJ0eXBlIiwib3JpZ2luYWxBbW91bnQiLCJvcmlnaW5hbEN1cnJlbmN5IiwiY2hhcmdlZEFtb3VudCIsImFjdHVhbFBheW1lbnRBbW91bnQiLCJjaGFyZ2VkQ3VycmVuY3kiLCJwYXltZW50Q3VycmVuY3kiLCJkZXNjcmlwdGlvbiIsIm1lcmNoYW50TmFtZSIsImNhdGVnb3J5IiwiZ2V0IiwiY2F0ZWdvcnlJZCIsImZldGNoVHJhbnNhY3Rpb25zRm9yTW9udGgiLCJ1cmwiLCJkYXRhIiwidHJhbnNhY3Rpb25zQnlBY2NvdW50IiwidHJhbnNhY3Rpb25zIiwidHJhbnNhY3Rpb24iLCJzaG9ydENhcmROdW1iZXIiLCJtYXBwZWRUcmFuc2FjdGlvbiIsImFkZFJlc3VsdCIsImFsbFJlc3VsdHMiLCJjbG9uZWRSZXN1bHRzIiwiYWNjb3VudE51bWJlciIsInByZXBhcmVUcmFuc2FjdGlvbnMiLCJ0eG5zIiwic3RhcnRNb21lbnQiLCJjb21iaW5lSW5zdGFsbG1lbnRzIiwiZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlIiwiY2xvbmVkVHhucyIsImZyb20iLCJmaXhJbnN0YWxsbWVudHMiLCJzb3J0VHJhbnNhY3Rpb25zQnlEYXRlIiwiZmlsdGVyT2xkVHJhbnNhY3Rpb25zIiwiZmV0Y2hUcmFuc2FjdGlvbnMiLCJvcHRpb25zIiwiX29wdGlvbnMkZnV0dXJlTW9udGhzIiwiZnV0dXJlTW9udGhzVG9TY3JhcGUiLCJkZWZhdWx0U3RhcnRNb21lbnQiLCJzdWJ0cmFjdCIsInN0YXJ0TW9tZW50TGltaXQiLCJzdGFydERhdGUiLCJ0b0RhdGUiLCJtYXgiLCJhbGxNb250aHMiLCJnZXRBbGxNb250aE1vbWVudHMiLCJfb3B0aW9ucyRvdXRwdXREYXRhJGUiLCJfb3B0aW9ucyRvdXRwdXREYXRhIiwib3V0cHV0RGF0YSIsImdldFBvc3NpYmxlTG9naW5SZXN1bHRzIiwidXJscyIsIkxvZ2luUmVzdWx0cyIsIlN1Y2Nlc3MiLCJDaGFuZ2VQYXNzd29yZCIsIkludmFsaWRQYXNzd29yZCIsImVsZW1lbnRQcmVzZW50T25QYWdlIiwiVW5rbm93bkVycm9yIiwiY3JlYXRlTG9naW5GaWVsZHMiLCJjcmVkZW50aWFscyIsInNlbGVjdG9yIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsIk1heFNjcmFwZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiZ2V0TG9naW5PcHRpb25zIiwibG9naW5VcmwiLCJmaWVsZHMiLCJzdWJtaXRCdXR0b25TZWxlY3RvciIsInByZUFjdGlvbiIsImNsaWNrQnV0dG9uIiwiY2hlY2tSZWFkaW5lc3MiLCJwb3N0QWN0aW9uIiwicG9zc2libGVSZXN1bHRzIiwid2FpdFVudGlsIiwiZmV0Y2hEYXRhIiwicmVzdWx0cyIsImFjY291bnRzIiwibWFwIiwic3VjY2VzcyIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9tYXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGJ1aWxkVXJsIGZyb20gJ2J1aWxkLXVybCc7XG5pbXBvcnQgbW9tZW50LCB7IHR5cGUgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gJ3B1cHBldGVlcic7XG5pbXBvcnQgeyBET0xMQVJfQ1VSUkVOQ1ksIEVVUk9fQ1VSUkVOQ1ksIFNIRUtFTF9DVVJSRU5DWSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgZ2V0QWxsTW9udGhNb21lbnRzIGZyb20gJy4uL2hlbHBlcnMvZGF0ZXMnO1xuaW1wb3J0IHsgZ2V0RGVidWcgfSBmcm9tICcuLi9oZWxwZXJzL2RlYnVnJztcbmltcG9ydCB7IGNsaWNrQnV0dG9uLCBlbGVtZW50UHJlc2VudE9uUGFnZSwgd2FpdFVudGlsRWxlbWVudEZvdW5kIH0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgZmV0Y2hHZXRXaXRoaW5QYWdlIH0gZnJvbSAnLi4vaGVscGVycy9mZXRjaCc7XG5pbXBvcnQgeyB3YWl0Rm9yUmVkaXJlY3QgfSBmcm9tICcuLi9oZWxwZXJzL25hdmlnYXRpb24nO1xuaW1wb3J0IHsgZmlsdGVyT2xkVHJhbnNhY3Rpb25zLCBmaXhJbnN0YWxsbWVudHMsIHNvcnRUcmFuc2FjdGlvbnNCeURhdGUgfSBmcm9tICcuLi9oZWxwZXJzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblN0YXR1c2VzLCBUcmFuc2FjdGlvblR5cGVzLCB0eXBlIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7XG4gIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsXG4gIExvZ2luUmVzdWx0cyxcbiAgdHlwZSBMb2dpbk9wdGlvbnMsXG4gIHR5cGUgUG9zc2libGVMb2dpblJlc3VsdHMsXG59IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5pbXBvcnQgeyB0eXBlIFNjcmFwZXJPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKCdtYXgnKTtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBzaG9ydENhcmROdW1iZXI6IHN0cmluZztcbiAgcGF5bWVudERhdGU/OiBzdHJpbmc7XG4gIHB1cmNoYXNlRGF0ZTogc3RyaW5nO1xuICBhY3R1YWxQYXltZW50QW1vdW50OiBzdHJpbmc7XG4gIHBheW1lbnRDdXJyZW5jeTogbnVtYmVyIHwgbnVsbDtcbiAgb3JpZ2luYWxDdXJyZW5jeTogc3RyaW5nO1xuICBvcmlnaW5hbEFtb3VudDogbnVtYmVyO1xuICBwbGFuTmFtZTogc3RyaW5nO1xuICBwbGFuVHlwZUlkOiBudW1iZXI7XG4gIGNvbW1lbnRzOiBzdHJpbmc7XG4gIG1lcmNoYW50TmFtZTogc3RyaW5nO1xuICBjYXRlZ29yeUlkOiBudW1iZXI7XG4gIGZ1bmRzVHJhbnNmZXJDb21tZW50Pzogc3RyaW5nO1xuICBmdW5kc1RyYW5zZmVyUmVjZWl2ZXJPclRyYW5zZmVyPzogc3RyaW5nO1xuICBkZWFsRGF0YT86IHtcbiAgICBhcm46IHN0cmluZztcbiAgfTtcbn1cblxuY29uc3QgQkFTRV9BUElfQUNUSU9OU19VUkwgPSAnaHR0cHM6Ly9vbmxpbmVsY2FwaS5tYXguY28uaWwnO1xuY29uc3QgQkFTRV9XRUxDT01FX1VSTCA9ICdodHRwczovL3d3dy5tYXguY28uaWwnO1xuXG5jb25zdCBMT0dJTl9VUkwgPSBgJHtCQVNFX1dFTENPTUVfVVJMfS9ob21lcGFnZS93ZWxjb21lYDtcbmNvbnN0IFBBU1NXT1JEX0VYUElSRURfVVJMID0gYCR7QkFTRV9XRUxDT01FX1VSTH0vcmVuZXctcGFzc3dvcmRgO1xuY29uc3QgU1VDQ0VTU19VUkwgPSBgJHtCQVNFX1dFTENPTUVfVVJMfS9ob21lcGFnZS9wZXJzb25hbGA7XG5cbmVudW0gTWF4UGxhbk5hbWUge1xuICBOb3JtYWwgPSAn16jXkteZ15zXlCcsXG4gIEltbWVkaWF0ZUNoYXJnZSA9ICfXl9eZ15XXkSDXoteh16fXldeqINee15nXmdeT15knLFxuICBJbnRlcm5ldFNob3BwaW5nID0gJ9eQ15nXoNeY16jXoNeYL9eX15VcItecJyxcbiAgSW5zdGFsbG1lbnRzID0gJ9eq16nXnNeV157XmdedJyxcbiAgTW9udGhseUNoYXJnZSA9ICfXl9eZ15XXkSDXl9eV15PXqdeZJyxcbiAgT25lTW9udGhQb3N0cG9uZWQgPSAn15PXl9eV15kg15fXldeT16knLFxuICBNb250aGx5UG9zdHBvbmVkID0gJ9eT15fXldeZINec15fXmdeV15Eg15TXl9eV15PXqdeZJyxcbiAgTW9udGhseVBheW1lbnQgPSAn16rXqdec15XXnSDXl9eV15PXqdeZJyxcbiAgRnV0dXJlUHVyY2hhc2VGaW5hbmNpbmcgPSAn157Xmdee15XXnyDXnNeo15vXmdep15Qg16LXqteZ15PXmdeqJyxcbiAgTW9udGhseVBvc3Rwb25lZEluc3RhbGxtZW50cyA9ICfXk9eX15XXmSDXl9eV15PXqSDXqtep15zXldee15nXnScsXG4gIFRoaXJ0eURheXNQbHVzID0gJ9ei16HXp9eqIDMwINek15zXldehJyxcbiAgVHdvTW9udGhzUG9zdHBvbmVkID0gJ9eT15fXldeZINeX15XXk9ep15nXmdedJyxcbiAgVHdvTW9udGhzUG9zdHBvbmVkMiA9ICfXk9eX15XXmSAyINeXXFwnINeq16nXnNeV157XmdedJyxcbiAgTW9udGhseUNoYXJnZVBsdXNJbnRlcmVzdCA9ICfXl9eV15PXqdeZICsg16jXmdeR15nXqicsXG4gIENyZWRpdCA9ICfXp9eo15PXmdeYJyxcbiAgQ3JlZGl0T3V0c2lkZVRoZUxpbWl0ID0gJ9en16jXk9eZ15gt157Xl9eV16Ug15zXnteh15LXqNeqJyxcbiAgQWNjdW11bGF0aW5nQmFza2V0ID0gJ9eh15wg157XpteY15HXqCcsXG4gIFBvc3Rwb25lZFRyYW5zYWN0aW9uSW5zdGFsbG1lbnRzID0gJ9ek16jXmdeh16og15TXoteh16fXlCDXlNeT15fXldeZ15QnLFxuICBSZXBsYWNlbWVudENhcmQgPSAn15vXqNeY15nXoSDXl9ec15nXpNeZJyxcbiAgRWFybHlSZXBheW1lbnQgPSAn16TXqNei15XXnyDXnteV16fXk9edJyxcbiAgTW9udGhseUNhcmRGZWUgPSAn15PXnteZINeb16jXmNeZ16EnLFxuICBDdXJyZW5jeVBvY2tldCA9ICfXl9eZ15XXkSDXkNeo16DXpyDXnteY15cnLFxufVxuXG5jb25zdCBJTlZBTElEX0RFVEFJTFNfU0VMRUNUT1IgPSAnI3BvcHVwV3JvbmdEZXRhaWxzJztcbmNvbnN0IExPR0lOX0VSUk9SX1NFTEVDVE9SID0gJyNwb3B1cENhcmRIb2xkZXJzTG9naW5FcnJvcic7XG5cbmNvbnN0IGNhdGVnb3JpZXMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuXG5mdW5jdGlvbiByZWRpcmVjdE9yRGlhbG9nKHBhZ2U6IFBhZ2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmFjZShbXG4gICAgd2FpdEZvclJlZGlyZWN0KHBhZ2UsIDIwMDAwLCBmYWxzZSwgW0JBU0VfV0VMQ09NRV9VUkwsIGAke0JBU0VfV0VMQ09NRV9VUkx9L2BdKSxcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgSU5WQUxJRF9ERVRBSUxTX1NFTEVDVE9SLCB0cnVlKSxcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgTE9HSU5fRVJST1JfU0VMRUNUT1IsIHRydWUpLFxuICBdKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25zVXJsKG1vbnRoTW9tZW50OiBNb21lbnQpIHtcbiAgY29uc3QgbW9udGggPSBtb250aE1vbWVudC5tb250aCgpICsgMTtcbiAgY29uc3QgeWVhciA9IG1vbnRoTW9tZW50LnllYXIoKTtcbiAgY29uc3QgZGF0ZSA9IGAke3llYXJ9LSR7bW9udGh9LTAxYDtcblxuICAvKipcbiAgICAgKiB1cmwgZXhwbGFuYXRpb246XG4gICAgICogdXNlckluZGV4OiAtMSBmb3IgYWxsIGFjY291bnQgb3duZXJzXG4gICAgICogY2FyZEluZGV4OiAtMSBmb3IgYWxsIGNhcmRzIHVuZGVyIHRoZSBhY2NvdW50XG4gICAgICogYWxsIG90aGVyIHF1ZXJ5IHBhcmFtcyBhcmUgc3RhdGljLCBiZXNpZGUgdGhlIGRhdGUgd2hpY2ggY2hhbmdlcyBmb3IgcmVxdWVzdCBwZXIgbW9udGhcbiAgICAgKi9cbiAgcmV0dXJuIGJ1aWxkVXJsKEJBU0VfQVBJX0FDVElPTlNfVVJMLCB7XG4gICAgcGF0aDogYC9hcGkvcmVnaXN0ZXJlZC90cmFuc2FjdGlvbkRldGFpbHMvZ2V0VHJhbnNhY3Rpb25zQW5kR3JhcGhzP2ZpbHRlckRhdGE9e1widXNlckluZGV4XCI6LTEsXCJjYXJkSW5kZXhcIjotMSxcIm1vbnRoVmlld1wiOnRydWUsXCJkYXRlXCI6XCIke2RhdGV9XCIsXCJkYXRlc1wiOntcInN0YXJ0RGF0ZVwiOlwiMFwiLFwiZW5kRGF0ZVwiOlwiMFwifSxcImJhbmtBY2NvdW50XCI6e1wiYmFua0FjY291bnRJbmRleFwiOi0xLFwiY2FyZHNcIjpudWxsfX0mZmlyc3RDYWxsQ2FyZEluZGV4PS0xYCxcbiAgfSk7XG59XG5cbmludGVyZmFjZSBGZXRjaENhdGVnb3J5UmVzdWx0IHtcbiAgcmVzdWx0PyA6IEFycmF5PHtcbiAgICBpZDogbnVtYmVyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgfT47XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRDYXRlZ29yaWVzKHBhZ2U6IFBhZ2UpIHtcbiAgZGVidWcoJ0xvYWRpbmcgY2F0ZWdvcmllcycpO1xuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaEdldFdpdGhpblBhZ2U8RmV0Y2hDYXRlZ29yeVJlc3VsdD4ocGFnZSwgYCR7QkFTRV9BUElfQUNUSU9OU19VUkx9L2FwaS9jb250ZW50cy9nZXRDYXRlZ29yaWVzYCk7XG4gIGlmIChyZXMgJiYgQXJyYXkuaXNBcnJheShyZXMucmVzdWx0KSkge1xuICAgIGRlYnVnKGAke3Jlcy5yZXN1bHQubGVuZ3RofSBjYXRlZ29yaWVzIGxvYWRlZGApO1xuICAgIHJlcy5yZXN1bHQ/LmZvckVhY2goKHsgaWQsIG5hbWUgfSkgPT4gY2F0ZWdvcmllcy5zZXQoaWQsIG5hbWUpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvblR5cGUocGxhbk5hbWU6IHN0cmluZywgcGxhblR5cGVJZDogbnVtYmVyKSB7XG4gIGNvbnN0IGNsZWFuZWRVcFR4blR5cGVTdHIgPSBwbGFuTmFtZS5yZXBsYWNlKCdcXHQnLCAnICcpLnRyaW0oKSBhcyBNYXhQbGFuTmFtZTtcbiAgc3dpdGNoIChjbGVhbmVkVXBUeG5UeXBlU3RyKSB7XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5JbW1lZGlhdGVDaGFyZ2U6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5Ob3JtYWw6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5Nb250aGx5Q2hhcmdlOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuT25lTW9udGhQb3N0cG9uZWQ6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5Nb250aGx5UG9zdHBvbmVkOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuRnV0dXJlUHVyY2hhc2VGaW5hbmNpbmc6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5Nb250aGx5UGF5bWVudDpcbiAgICBjYXNlIE1heFBsYW5OYW1lLk1vbnRobHlQb3N0cG9uZWRJbnN0YWxsbWVudHM6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5UaGlydHlEYXlzUGx1czpcbiAgICBjYXNlIE1heFBsYW5OYW1lLlR3b01vbnRoc1Bvc3Rwb25lZDpcbiAgICBjYXNlIE1heFBsYW5OYW1lLlR3b01vbnRoc1Bvc3Rwb25lZDI6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5BY2N1bXVsYXRpbmdCYXNrZXQ6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5JbnRlcm5ldFNob3BwaW5nOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuTW9udGhseUNoYXJnZVBsdXNJbnRlcmVzdDpcbiAgICBjYXNlIE1heFBsYW5OYW1lLlBvc3Rwb25lZFRyYW5zYWN0aW9uSW5zdGFsbG1lbnRzOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuUmVwbGFjZW1lbnRDYXJkOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuRWFybHlSZXBheW1lbnQ6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5Nb250aGx5Q2FyZEZlZTpcbiAgICBjYXNlIE1heFBsYW5OYW1lLkN1cnJlbmN5UG9ja2V0OlxuICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZXMuTm9ybWFsO1xuICAgIGNhc2UgTWF4UGxhbk5hbWUuSW5zdGFsbG1lbnRzOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuQ3JlZGl0OlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuQ3JlZGl0T3V0c2lkZVRoZUxpbWl0OlxuICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZXMuSW5zdGFsbG1lbnRzO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzd2l0Y2ggKHBsYW5UeXBlSWQpIHtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZXMuSW5zdGFsbG1lbnRzO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZXMuTm9ybWFsO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0cmFuc2FjdGlvbiB0eXBlICR7Y2xlYW5lZFVwVHhuVHlwZVN0ciBhcyBzdHJpbmd9YCk7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SW5zdGFsbG1lbnRzSW5mbyhjb21tZW50czogc3RyaW5nKSB7XG4gIGlmICghY29tbWVudHMpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG1hdGNoZXMgPSBjb21tZW50cy5tYXRjaCgvXFxkKy9nKTtcbiAgaWYgKCFtYXRjaGVzIHx8IG1hdGNoZXMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG51bWJlcjogcGFyc2VJbnQobWF0Y2hlc1swXSwgMTApLFxuICAgIHRvdGFsOiBwYXJzZUludChtYXRjaGVzWzFdLCAxMCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldENoYXJnZWRDdXJyZW5jeShjdXJyZW5jeUlkOiBudW1iZXIgfCBudWxsKSB7XG4gIHN3aXRjaCAoY3VycmVuY3lJZCkge1xuICAgIGNhc2UgMzc2OlxuICAgICAgcmV0dXJuIFNIRUtFTF9DVVJSRU5DWTtcbiAgICBjYXNlIDg0MDpcbiAgICAgIHJldHVybiBET0xMQVJfQ1VSUkVOQ1k7XG4gICAgY2FzZSA5Nzg6XG4gICAgICByZXR1cm4gRVVST19DVVJSRU5DWTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVtbyh7XG4gIGNvbW1lbnRzLCBmdW5kc1RyYW5zZmVyUmVjZWl2ZXJPclRyYW5zZmVyLCBmdW5kc1RyYW5zZmVyQ29tbWVudCxcbn06IFBpY2s8U2NyYXBlZFRyYW5zYWN0aW9uLCAnY29tbWVudHMnIHwgJ2Z1bmRzVHJhbnNmZXJSZWNlaXZlck9yVHJhbnNmZXInIHwgJ2Z1bmRzVHJhbnNmZXJDb21tZW50Jz4pIHtcbiAgaWYgKGZ1bmRzVHJhbnNmZXJSZWNlaXZlck9yVHJhbnNmZXIpIHtcbiAgICBjb25zdCBtZW1vID0gY29tbWVudHMgPyBgJHtjb21tZW50c30gJHtmdW5kc1RyYW5zZmVyUmVjZWl2ZXJPclRyYW5zZmVyfWAgOiBmdW5kc1RyYW5zZmVyUmVjZWl2ZXJPclRyYW5zZmVyO1xuICAgIHJldHVybiBmdW5kc1RyYW5zZmVyQ29tbWVudCA/IGAke21lbW99OiAke2Z1bmRzVHJhbnNmZXJDb21tZW50fWAgOiBtZW1vO1xuICB9XG5cbiAgcmV0dXJuIGNvbW1lbnRzO1xufVxuXG5mdW5jdGlvbiBtYXBUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogU2NyYXBlZFRyYW5zYWN0aW9uKTogVHJhbnNhY3Rpb24ge1xuICBjb25zdCBpc1BlbmRpbmcgPSByYXdUcmFuc2FjdGlvbi5wYXltZW50RGF0ZSA9PT0gbnVsbDtcbiAgY29uc3QgcHJvY2Vzc2VkRGF0ZSA9IG1vbWVudChpc1BlbmRpbmcgP1xuICAgIHJhd1RyYW5zYWN0aW9uLnB1cmNoYXNlRGF0ZSA6XG4gICAgcmF3VHJhbnNhY3Rpb24ucGF5bWVudERhdGUpLnRvSVNPU3RyaW5nKCk7XG4gIGNvbnN0IHN0YXR1cyA9IGlzUGVuZGluZyA/IFRyYW5zYWN0aW9uU3RhdHVzZXMuUGVuZGluZyA6IFRyYW5zYWN0aW9uU3RhdHVzZXMuQ29tcGxldGVkO1xuXG4gIGNvbnN0IGluc3RhbGxtZW50cyA9IGdldEluc3RhbGxtZW50c0luZm8ocmF3VHJhbnNhY3Rpb24uY29tbWVudHMpO1xuICBjb25zdCBpZGVudGlmaWVyID0gaW5zdGFsbG1lbnRzID9cbiAgICBgJHtyYXdUcmFuc2FjdGlvbi5kZWFsRGF0YT8uYXJufV8ke2luc3RhbGxtZW50cy5udW1iZXJ9YCA6XG4gICAgcmF3VHJhbnNhY3Rpb24uZGVhbERhdGE/LmFybjtcblxuICByZXR1cm4ge1xuICAgIHR5cGU6IGdldFRyYW5zYWN0aW9uVHlwZShyYXdUcmFuc2FjdGlvbi5wbGFuTmFtZSwgcmF3VHJhbnNhY3Rpb24ucGxhblR5cGVJZCksXG4gICAgZGF0ZTogbW9tZW50KHJhd1RyYW5zYWN0aW9uLnB1cmNoYXNlRGF0ZSkudG9JU09TdHJpbmcoKSxcbiAgICBwcm9jZXNzZWREYXRlLFxuICAgIG9yaWdpbmFsQW1vdW50OiAtcmF3VHJhbnNhY3Rpb24ub3JpZ2luYWxBbW91bnQsXG4gICAgb3JpZ2luYWxDdXJyZW5jeTogcmF3VHJhbnNhY3Rpb24ub3JpZ2luYWxDdXJyZW5jeSxcbiAgICBjaGFyZ2VkQW1vdW50OiAtcmF3VHJhbnNhY3Rpb24uYWN0dWFsUGF5bWVudEFtb3VudCxcbiAgICBjaGFyZ2VkQ3VycmVuY3k6IGdldENoYXJnZWRDdXJyZW5jeShyYXdUcmFuc2FjdGlvbi5wYXltZW50Q3VycmVuY3kpLFxuICAgIGRlc2NyaXB0aW9uOiByYXdUcmFuc2FjdGlvbi5tZXJjaGFudE5hbWUudHJpbSgpLFxuICAgIG1lbW86IGdldE1lbW8ocmF3VHJhbnNhY3Rpb24pLFxuICAgIGNhdGVnb3J5OiBjYXRlZ29yaWVzLmdldChyYXdUcmFuc2FjdGlvbj8uY2F0ZWdvcnlJZCksXG4gICAgaW5zdGFsbG1lbnRzLFxuICAgIGlkZW50aWZpZXIsXG4gICAgc3RhdHVzLFxuICB9O1xufVxuaW50ZXJmYWNlIFNjcmFwZWRUcmFuc2FjdGlvbnNSZXN1bHQge1xuICByZXN1bHQ/OiB7XG4gICAgdHJhbnNhY3Rpb25zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXTtcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hUcmFuc2FjdGlvbnNGb3JNb250aChwYWdlOiBQYWdlLCBtb250aE1vbWVudDogTW9tZW50KSB7XG4gIGNvbnN0IHVybCA9IGdldFRyYW5zYWN0aW9uc1VybChtb250aE1vbWVudCk7XG5cbiAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoR2V0V2l0aGluUGFnZTxTY3JhcGVkVHJhbnNhY3Rpb25zUmVzdWx0PihwYWdlLCB1cmwpO1xuICBjb25zdCB0cmFuc2FjdGlvbnNCeUFjY291bnQ6IFJlY29yZDxzdHJpbmcsIFRyYW5zYWN0aW9uW10+ID0ge307XG5cbiAgaWYgKCFkYXRhIHx8ICFkYXRhLnJlc3VsdCkgcmV0dXJuIHRyYW5zYWN0aW9uc0J5QWNjb3VudDtcblxuICBkYXRhLnJlc3VsdC50cmFuc2FjdGlvbnNcbiAgICAvLyBGaWx0ZXIgb3V0IG5vbi10cmFuc2FjdGlvbnMgd2l0aG91dCBhIHBsYW4gdHlwZSwgZS5nLiBzdW1tYXJ5IHJvd3NcbiAgICAuZmlsdGVyKCh0cmFuc2FjdGlvbikgPT4gISF0cmFuc2FjdGlvbi5wbGFuTmFtZSlcbiAgICAuZm9yRWFjaCgodHJhbnNhY3Rpb246IFNjcmFwZWRUcmFuc2FjdGlvbikgPT4ge1xuICAgICAgaWYgKCF0cmFuc2FjdGlvbnNCeUFjY291bnRbdHJhbnNhY3Rpb24uc2hvcnRDYXJkTnVtYmVyXSkge1xuICAgICAgICB0cmFuc2FjdGlvbnNCeUFjY291bnRbdHJhbnNhY3Rpb24uc2hvcnRDYXJkTnVtYmVyXSA9IFtdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXBwZWRUcmFuc2FjdGlvbiA9IG1hcFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKTtcbiAgICAgIHRyYW5zYWN0aW9uc0J5QWNjb3VudFt0cmFuc2FjdGlvbi5zaG9ydENhcmROdW1iZXJdLnB1c2gobWFwcGVkVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuXG4gIHJldHVybiB0cmFuc2FjdGlvbnNCeUFjY291bnQ7XG59XG5cbmZ1bmN0aW9uIGFkZFJlc3VsdChhbGxSZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCBUcmFuc2FjdGlvbltdPiwgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBUcmFuc2FjdGlvbltdPikge1xuICBjb25zdCBjbG9uZWRSZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCBUcmFuc2FjdGlvbltdPiA9IHsgLi4uYWxsUmVzdWx0cyB9O1xuICBPYmplY3Qua2V5cyhyZXN1bHQpLmZvckVhY2goKGFjY291bnROdW1iZXIpID0+IHtcbiAgICBpZiAoIWNsb25lZFJlc3VsdHNbYWNjb3VudE51bWJlcl0pIHtcbiAgICAgIGNsb25lZFJlc3VsdHNbYWNjb3VudE51bWJlcl0gPSBbXTtcbiAgICB9XG4gICAgY2xvbmVkUmVzdWx0c1thY2NvdW50TnVtYmVyXS5wdXNoKC4uLnJlc3VsdFthY2NvdW50TnVtYmVyXSk7XG4gIH0pO1xuICByZXR1cm4gY2xvbmVkUmVzdWx0cztcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRyYW5zYWN0aW9ucyh0eG5zOiBUcmFuc2FjdGlvbltdLCBzdGFydE1vbWVudDogbW9tZW50Lk1vbWVudCwgY29tYmluZUluc3RhbGxtZW50czogYm9vbGVhbiwgZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlOiBib29sZWFuKSB7XG4gIGxldCBjbG9uZWRUeG5zID0gQXJyYXkuZnJvbSh0eG5zKTtcbiAgaWYgKCFjb21iaW5lSW5zdGFsbG1lbnRzKSB7XG4gICAgY2xvbmVkVHhucyA9IGZpeEluc3RhbGxtZW50cyhjbG9uZWRUeG5zKTtcbiAgfVxuICBjbG9uZWRUeG5zID0gc29ydFRyYW5zYWN0aW9uc0J5RGF0ZShjbG9uZWRUeG5zKTtcbiAgY2xvbmVkVHhucyA9IGVuYWJsZVRyYW5zYWN0aW9uc0ZpbHRlckJ5RGF0ZSA/XG4gICAgZmlsdGVyT2xkVHJhbnNhY3Rpb25zKGNsb25lZFR4bnMsIHN0YXJ0TW9tZW50LCBjb21iaW5lSW5zdGFsbG1lbnRzIHx8IGZhbHNlKSA6XG4gICAgY2xvbmVkVHhucztcbiAgcmV0dXJuIGNsb25lZFR4bnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoVHJhbnNhY3Rpb25zKHBhZ2U6IFBhZ2UsIG9wdGlvbnM6IFNjcmFwZXJPcHRpb25zKSB7XG4gIGNvbnN0IGZ1dHVyZU1vbnRoc1RvU2NyYXBlID0gb3B0aW9ucy5mdXR1cmVNb250aHNUb1NjcmFwZSA/PyAxO1xuICBjb25zdCBkZWZhdWx0U3RhcnRNb21lbnQgPSBtb21lbnQoKS5zdWJ0cmFjdCgxLCAneWVhcnMnKTtcbiAgY29uc3Qgc3RhcnRNb21lbnRMaW1pdCA9IG1vbWVudCgpLnN1YnRyYWN0KDQsICd5ZWFycycpO1xuICBjb25zdCBzdGFydERhdGUgPSBvcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gIGNvbnN0IHN0YXJ0TW9tZW50ID0gbW9tZW50Lm1heChzdGFydE1vbWVudExpbWl0LCBtb21lbnQoc3RhcnREYXRlKSk7XG4gIGNvbnN0IGFsbE1vbnRocyA9IGdldEFsbE1vbnRoTW9tZW50cyhzdGFydE1vbWVudCwgZnV0dXJlTW9udGhzVG9TY3JhcGUpO1xuXG4gIGF3YWl0IGxvYWRDYXRlZ29yaWVzKHBhZ2UpO1xuXG4gIGxldCBhbGxSZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCBUcmFuc2FjdGlvbltdPiA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbE1vbnRocy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoVHJhbnNhY3Rpb25zRm9yTW9udGgocGFnZSwgYWxsTW9udGhzW2ldKTtcbiAgICBhbGxSZXN1bHRzID0gYWRkUmVzdWx0KGFsbFJlc3VsdHMsIHJlc3VsdCk7XG4gIH1cblxuICBPYmplY3Qua2V5cyhhbGxSZXN1bHRzKS5mb3JFYWNoKChhY2NvdW50TnVtYmVyKSA9PiB7XG4gICAgbGV0IHR4bnMgPSBhbGxSZXN1bHRzW2FjY291bnROdW1iZXJdO1xuICAgIHR4bnMgPSBwcmVwYXJlVHJhbnNhY3Rpb25zKHR4bnMsIHN0YXJ0TW9tZW50LCBvcHRpb25zLmNvbWJpbmVJbnN0YWxsbWVudHMgfHwgZmFsc2UsXG4gICAgICAob3B0aW9ucy5vdXRwdXREYXRhPy5lbmFibGVUcmFuc2FjdGlvbnNGaWx0ZXJCeURhdGUgPz8gdHJ1ZSkpO1xuICAgIGFsbFJlc3VsdHNbYWNjb3VudE51bWJlcl0gPSB0eG5zO1xuICB9KTtcblxuICByZXR1cm4gYWxsUmVzdWx0cztcbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMocGFnZTogUGFnZSk6IFBvc3NpYmxlTG9naW5SZXN1bHRzIHtcbiAgY29uc3QgdXJsczogUG9zc2libGVMb2dpblJlc3VsdHMgPSB7fTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuU3VjY2Vzc10gPSBbU1VDQ0VTU19VUkxdO1xuICB1cmxzW0xvZ2luUmVzdWx0cy5DaGFuZ2VQYXNzd29yZF0gPSBbUEFTU1dPUkRfRVhQSVJFRF9VUkxdO1xuICB1cmxzW0xvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmRdID0gW2FzeW5jICgpID0+IHtcbiAgICByZXR1cm4gZWxlbWVudFByZXNlbnRPblBhZ2UocGFnZSwgSU5WQUxJRF9ERVRBSUxTX1NFTEVDVE9SKTtcbiAgfV07XG4gIHVybHNbTG9naW5SZXN1bHRzLlVua25vd25FcnJvcl0gPSBbYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybiBlbGVtZW50UHJlc2VudE9uUGFnZShwYWdlLCBMT0dJTl9FUlJPUl9TRUxFQ1RPUik7XG4gIH1dO1xuICByZXR1cm4gdXJscztcbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKSB7XG4gIHJldHVybiBbXG4gICAgeyBzZWxlY3RvcjogJyN1c2VyLW5hbWUnLCB2YWx1ZTogY3JlZGVudGlhbHMudXNlcm5hbWUgfSxcbiAgICB7IHNlbGVjdG9yOiAnI3Bhc3N3b3JkJywgdmFsdWU6IGNyZWRlbnRpYWxzLnBhc3N3b3JkIH0sXG4gIF07XG59XG5cbnR5cGUgU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMgPSB7IHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcgfTtcblxuY2xhc3MgTWF4U2NyYXBlciBleHRlbmRzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyk6IExvZ2luT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvZ2luVXJsOiBMT0dJTl9VUkwsXG4gICAgICBmaWVsZHM6IGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzKSxcbiAgICAgIHN1Ym1pdEJ1dHRvblNlbGVjdG9yOiAnYXBwLXVzZXItbG9naW4tZm9ybSAuZ2VuZXJhbC1idXR0b24uc2VuZC1tZS1jb2RlJyxcbiAgICAgIHByZUFjdGlvbjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoYXdhaXQgZWxlbWVudFByZXNlbnRPblBhZ2UodGhpcy5wYWdlLCAnI2Nsb3NlUG9wdXAnKSkge1xuICAgICAgICAgIGF3YWl0IGNsaWNrQnV0dG9uKHRoaXMucGFnZSwgJyNjbG9zZVBvcHVwJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgY2xpY2tCdXR0b24odGhpcy5wYWdlLCAnLnBlcnNvbmFsLWFyZWEgPiBhLmdvLXRvLXBlcnNvbmFsLWFyZWEnKTtcbiAgICAgICAgaWYgKGF3YWl0IGVsZW1lbnRQcmVzZW50T25QYWdlKHRoaXMucGFnZSwgJy5sb2dpbi1saW5rI3ByaXZhdGUnKSkge1xuICAgICAgICAgIGF3YWl0IGNsaWNrQnV0dG9uKHRoaXMucGFnZSwgJy5sb2dpbi1saW5rI3ByaXZhdGUnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQodGhpcy5wYWdlLCAnI2xvZ2luLXBhc3N3b3JkLWxpbmsnLCB0cnVlKTtcbiAgICAgICAgYXdhaXQgY2xpY2tCdXR0b24odGhpcy5wYWdlLCAnI2xvZ2luLXBhc3N3b3JkLWxpbmsnKTtcbiAgICAgICAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHRoaXMucGFnZSwgJyNsb2dpbi1wYXNzd29yZC50YWItcGFuZS5hY3RpdmUgYXBwLXVzZXItbG9naW4tZm9ybScsIHRydWUpO1xuICAgICAgfSxcbiAgICAgIGNoZWNrUmVhZGluZXNzOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZCh0aGlzLnBhZ2UsICcucGVyc29uYWwtYXJlYSA+IGEuZ28tdG8tcGVyc29uYWwtYXJlYScsIHRydWUpO1xuICAgICAgfSxcbiAgICAgIHBvc3RBY3Rpb246IGFzeW5jICgpID0+IHJlZGlyZWN0T3JEaWFsb2codGhpcy5wYWdlKSxcbiAgICAgIHBvc3NpYmxlUmVzdWx0czogZ2V0UG9zc2libGVMb2dpblJlc3VsdHModGhpcy5wYWdlKSxcbiAgICAgIHdhaXRVbnRpbDogJ2RvbWNvbnRlbnRsb2FkZWQnLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmZXRjaERhdGEoKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGZldGNoVHJhbnNhY3Rpb25zKHRoaXMucGFnZSwgdGhpcy5vcHRpb25zKTtcbiAgICBjb25zdCBhY2NvdW50cyA9IE9iamVjdC5rZXlzKHJlc3VsdHMpLm1hcCgoYWNjb3VudE51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWNjb3VudE51bWJlcixcbiAgICAgICAgdHhuczogcmVzdWx0c1thY2NvdW50TnVtYmVyXSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGFjY291bnRzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWF4U2NyYXBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsU0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUUsVUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUsscUJBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE1BQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFdBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLGFBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLGNBQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLHVCQUFBLEdBQUFWLE9BQUE7QUFLcUMsU0FBQUQsdUJBQUFZLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFBQSxTQUFBRyxRQUFBSCxDQUFBLEVBQUFJLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQVAsQ0FBQSxPQUFBTSxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBUixDQUFBLEdBQUFJLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFYLENBQUEsRUFBQUksQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQWYsQ0FBQSxhQUFBSSxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFB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
|
|
298
|
+
exports.default = MaxScraper;
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL21heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwREFBaUM7QUFDakMsb0RBQTZDO0FBRTdDLDRDQUErRTtBQUMvRSw2REFBa0Q7QUFDbEQsNENBQTRDO0FBQzVDLDRFQUE0RztBQUM1Ryw0Q0FBc0Q7QUFDdEQsc0RBQXdEO0FBQ3hELDBEQUF5RztBQUN6RyxrREFBMEY7QUFDMUYsMkVBS3FDO0FBR3JDLE1BQU0sS0FBSyxHQUFHLElBQUEsZ0JBQVEsRUFBQyxLQUFLLENBQUMsQ0FBQztBQXNCOUIsTUFBTSxvQkFBb0IsR0FBRywrQkFBK0IsQ0FBQztBQUM3RCxNQUFNLGdCQUFnQixHQUFHLHVCQUF1QixDQUFDO0FBRWpELE1BQU0sU0FBUyxHQUFHLEdBQUcsZ0JBQWdCLG1CQUFtQixDQUFDO0FBQ3pELE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxnQkFBZ0IsaUJBQWlCLENBQUM7QUFDbEUsTUFBTSxXQUFXLEdBQUcsR0FBRyxnQkFBZ0Isb0JBQW9CLENBQUM7QUFFNUQsSUFBSyxXQXVCSjtBQXZCRCxXQUFLLFdBQVc7SUFDZCx3REFBZ0IsQ0FBQTtJQUNoQix5SEFBb0MsQ0FBQTtJQUNwQyxtR0FBaUMsQ0FBQTtJQUNqQywwRUFBd0IsQ0FBQTtJQUN4Qix3RkFBNEIsQ0FBQTtJQUM1QixzRkFBK0IsQ0FBQTtJQUMvQixnSUFBc0MsQ0FBQTtJQUN0QywrRkFBOEIsQ0FBQTtJQUM5QixtSkFBK0MsQ0FBQTtJQUMvQyw0SUFBa0QsQ0FBQTtJQUNsRCxzRkFBK0IsQ0FBQTtJQUMvQix5R0FBbUMsQ0FBQTtJQUNuQyxvSEFBeUMsQ0FBQTtJQUN6Qyw0R0FBMkMsQ0FBQTtJQUMzQyx3REFBZ0IsQ0FBQTtJQUNoQixxSUFBMkMsQ0FBQTtJQUMzQyxpRkFBK0IsQ0FBQTtJQUMvQixzSkFBdUQsQ0FBQTtJQUN2RCxnR0FBK0IsQ0FBQTtJQUMvQiwrRkFB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LHNCQUFzQixDQUFDLENBQUM7Z0JBQ3JELE1BQU0sSUFBQSw2Q0FBcUIsRUFBQyxJQUFJLENBQUMsSUFBSSxFQUFFLHFEQUFxRCxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RHLENBQUM7WUFDRCxjQUFjLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pCLE1BQU0sSUFBQSw2Q0FBcUIsRUFBQyxJQUFJLENBQUMsSUFBSSxFQUFFLHdDQUF3QyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pGLENBQUM7WUFDRCxVQUFVLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25ELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25ELFNBQVMsRUFBRSxrQkFBa0I7U0FDOUIsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUztRQUNiLE1BQU0sT0FBTyxHQUFHLE1BQU0saUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDeEQsT0FBTztnQkFDTCxhQUFhO2dCQUNiLElBQUksRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDO2FBQzdCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVE7U0FDVCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsa0JBQWUsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGJ1aWxkVXJsIGZyb20gJ2J1aWxkLXVybCc7XG5pbXBvcnQgbW9tZW50LCB7IHR5cGUgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gJ3B1cHBldGVlcic7XG5pbXBvcnQgeyBET0xMQVJfQ1VSUkVOQ1ksIEVVUk9fQ1VSUkVOQ1ksIFNIRUtFTF9DVVJSRU5DWSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgZ2V0QWxsTW9udGhNb21lbnRzIGZyb20gJy4uL2hlbHBlcnMvZGF0ZXMnO1xuaW1wb3J0IHsgZ2V0RGVidWcgfSBmcm9tICcuLi9oZWxwZXJzL2RlYnVnJztcbmltcG9ydCB7IGNsaWNrQnV0dG9uLCBlbGVtZW50UHJlc2VudE9uUGFnZSwgd2FpdFVudGlsRWxlbWVudEZvdW5kIH0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgZmV0Y2hHZXRXaXRoaW5QYWdlIH0gZnJvbSAnLi4vaGVscGVycy9mZXRjaCc7XG5pbXBvcnQgeyB3YWl0Rm9yUmVkaXJlY3QgfSBmcm9tICcuLi9oZWxwZXJzL25hdmlnYXRpb24nO1xuaW1wb3J0IHsgZmlsdGVyT2xkVHJhbnNhY3Rpb25zLCBmaXhJbnN0YWxsbWVudHMsIHNvcnRUcmFuc2FjdGlvbnNCeURhdGUgfSBmcm9tICcuLi9oZWxwZXJzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblN0YXR1c2VzLCBUcmFuc2FjdGlvblR5cGVzLCB0eXBlIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7XG4gIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsXG4gIExvZ2luUmVzdWx0cyxcbiAgdHlwZSBMb2dpbk9wdGlvbnMsXG4gIHR5cGUgUG9zc2libGVMb2dpblJlc3VsdHMsXG59IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5pbXBvcnQgeyB0eXBlIFNjcmFwZXJPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKCdtYXgnKTtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBzaG9ydENhcmROdW1iZXI6IHN0cmluZztcbiAgcGF5bWVudERhdGU/OiBzdHJpbmc7XG4gIHB1cmNoYXNlRGF0ZTogc3RyaW5nO1xuICBhY3R1YWxQYXltZW50QW1vdW50OiBzdHJpbmc7XG4gIHBheW1lbnRDdXJyZW5jeTogbnVtYmVyIHwgbnVsbDtcbiAgb3JpZ2luYWxDdXJyZW5jeTogc3RyaW5nO1xuICBvcmlnaW5hbEFtb3VudDogbnVtYmVyO1xuICBwbGFuTmFtZTogc3RyaW5nO1xuICBwbGFuVHlwZUlkOiBudW1iZXI7XG4gIGNvbW1lbnRzOiBzdHJpbmc7XG4gIG1lcmNoYW50TmFtZTogc3RyaW5nO1xuICBjYXRlZ29yeUlkOiBudW1iZXI7XG4gIGZ1bmRzVHJhbnNmZXJDb21tZW50Pzogc3RyaW5nO1xuICBmdW5kc1RyYW5zZmVyUmVjZWl2ZXJPclRyYW5zZmVyPzogc3RyaW5nO1xuICBkZWFsRGF0YT86IHtcbiAgICBhcm46IHN0cmluZztcbiAgfTtcbn1cblxuY29uc3QgQkFTRV9BUElfQUNUSU9OU19VUkwgPSAnaHR0cHM6Ly9vbmxpbmVsY2FwaS5tYXguY28uaWwnO1xuY29uc3QgQkFTRV9XRUxDT01FX1VSTCA9ICdodHRwczovL3d3dy5tYXguY28uaWwnO1xuXG5jb25zdCBMT0dJTl9VUkwgPSBgJHtCQVNFX1dFTENPTUVfVVJMfS9ob21lcGFnZS93ZWxjb21lYDtcbmNvbnN0IFBBU1NXT1JEX0VYUElSRURfVVJMID0gYCR7QkFTRV9XRUxDT01FX1VSTH0vcmVuZXctcGFzc3dvcmRgO1xuY29uc3QgU1VDQ0VTU19VUkwgPSBgJHtCQVNFX1dFTENPTUVfVVJMfS9ob21lcGFnZS9wZXJzb25hbGA7XG5cbmVudW0gTWF4UGxhbk5hbWUge1xuICBOb3JtYWwgPSAn16jXkteZ15zXlCcsXG4gIEltbWVkaWF0ZUNoYXJnZSA9ICfXl9eZ15XXkSDXoteh16fXldeqINee15nXmdeT15knLFxuICBJbnRlcm5ldFNob3BwaW5nID0gJ9eQ15nXoNeY16jXoNeYL9eX15VcItecJyxcbiAgSW5zdGFsbG1lbnRzID0gJ9eq16nXnNeV157XmdedJyxcbiAgTW9udGhseUNoYXJnZSA9ICfXl9eZ15XXkSDXl9eV15PXqdeZJyxcbiAgT25lTW9udGhQb3N0cG9uZWQgPSAn15PXl9eV15kg15fXldeT16knLFxuICBNb250aGx5UG9zdHBvbmVkID0gJ9eT15fXldeZINec15fXmdeV15Eg15TXl9eV15PXqdeZJyxcbiAgTW9udGhseVBheW1lbnQgPSAn16rXqdec15XXnSDXl9eV15PXqdeZJyxcbiAgRnV0dXJlUHVyY2hhc2VGaW5hbmNpbmcgPSAn157Xmdee15XXnyDXnNeo15vXmdep15Qg16LXqteZ15PXmdeqJyxcbiAgTW9udGhseVBvc3Rwb25lZEluc3RhbGxtZW50cyA9ICfXk9eX15XXmSDXl9eV15PXqSDXqtep15zXldee15nXnScsXG4gIFRoaXJ0eURheXNQbHVzID0gJ9ei16HXp9eqIDMwINek15zXldehJyxcbiAgVHdvTW9udGhzUG9zdHBvbmVkID0gJ9eT15fXldeZINeX15XXk9ep15nXmdedJyxcbiAgVHdvTW9udGhzUG9zdHBvbmVkMiA9IFwi15PXl9eV15kgMiDXlycg16rXqdec15XXnteZ151cIixcbiAgTW9udGhseUNoYXJnZVBsdXNJbnRlcmVzdCA9ICfXl9eV15PXqdeZICsg16jXmdeR15nXqicsXG4gIENyZWRpdCA9ICfXp9eo15PXmdeYJyxcbiAgQ3JlZGl0T3V0c2lkZVRoZUxpbWl0ID0gJ9en16jXk9eZ15gt157Xl9eV16Ug15zXnteh15LXqNeqJyxcbiAgQWNjdW11bGF0aW5nQmFza2V0ID0gJ9eh15wg157XpteY15HXqCcsXG4gIFBvc3Rwb25lZFRyYW5zYWN0aW9uSW5zdGFsbG1lbnRzID0gJ9ek16jXmdeh16og15TXoteh16fXlCDXlNeT15fXldeZ15QnLFxuICBSZXBsYWNlbWVudENhcmQgPSAn15vXqNeY15nXoSDXl9ec15nXpNeZJyxcbiAgRWFybHlSZXBheW1lbnQgPSAn16TXqNei15XXnyDXnteV16fXk9edJyxcbiAgTW9udGhseUNhcmRGZWUgPSAn15PXnteZINeb16jXmNeZ16EnLFxuICBDdXJyZW5jeVBvY2tldCA9ICfXl9eZ15XXkSDXkNeo16DXpyDXnteY15cnLFxufVxuXG5jb25zdCBJTlZBTElEX0RFVEFJTFNfU0VMRUNUT1IgPSAnI3BvcHVwV3JvbmdEZXRhaWxzJztcbmNvbnN0IExPR0lOX0VSUk9SX1NFTEVDVE9SID0gJyNwb3B1cENhcmRIb2xkZXJzTG9naW5FcnJvcic7XG5cbmNvbnN0IGNhdGVnb3JpZXMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuXG5mdW5jdGlvbiByZWRpcmVjdE9yRGlhbG9nKHBhZ2U6IFBhZ2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmFjZShbXG4gICAgd2FpdEZvclJlZGlyZWN0KHBhZ2UsIDIwMDAwLCBmYWxzZSwgW0JBU0VfV0VMQ09NRV9VUkwsIGAke0JBU0VfV0VMQ09NRV9VUkx9L2BdKSxcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgSU5WQUxJRF9ERVRBSUxTX1NFTEVDVE9SLCB0cnVlKSxcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgTE9HSU5fRVJST1JfU0VMRUNUT1IsIHRydWUpLFxuICBdKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25zVXJsKG1vbnRoTW9tZW50OiBNb21lbnQpIHtcbiAgY29uc3QgbW9udGggPSBtb250aE1vbWVudC5tb250aCgpICsgMTtcbiAgY29uc3QgeWVhciA9IG1vbnRoTW9tZW50LnllYXIoKTtcbiAgY29uc3QgZGF0ZSA9IGAke3llYXJ9LSR7bW9udGh9LTAxYDtcblxuICAvKipcbiAgICogdXJsIGV4cGxhbmF0aW9uOlxuICAgKiB1c2VySW5kZXg6IC0xIGZvciBhbGwgYWNjb3VudCBvd25lcnNcbiAgICogY2FyZEluZGV4OiAtMSBmb3IgYWxsIGNhcmRzIHVuZGVyIHRoZSBhY2NvdW50XG4gICAqIGFsbCBvdGhlciBxdWVyeSBwYXJhbXMgYXJlIHN0YXRpYywgYmVzaWRlIHRoZSBkYXRlIHdoaWNoIGNoYW5nZXMgZm9yIHJlcXVlc3QgcGVyIG1vbnRoXG4gICAqL1xuICByZXR1cm4gYnVpbGRVcmwoQkFTRV9BUElfQUNUSU9OU19VUkwsIHtcbiAgICBwYXRoOiBgL2FwaS9yZWdpc3RlcmVkL3RyYW5zYWN0aW9uRGV0YWlscy9nZXRUcmFuc2FjdGlvbnNBbmRHcmFwaHM/ZmlsdGVyRGF0YT17XCJ1c2VySW5kZXhcIjotMSxcImNhcmRJbmRleFwiOi0xLFwibW9udGhWaWV3XCI6dHJ1ZSxcImRhdGVcIjpcIiR7ZGF0ZX1cIixcImRhdGVzXCI6e1wic3RhcnREYXRlXCI6XCIwXCIsXCJlbmREYXRlXCI6XCIwXCJ9LFwiYmFua0FjY291bnRcIjp7XCJiYW5rQWNjb3VudEluZGV4XCI6LTEsXCJjYXJkc1wiOm51bGx9fSZmaXJzdENhbGxDYXJkSW5kZXg9LTFgLFxuICB9KTtcbn1cblxuaW50ZXJmYWNlIEZldGNoQ2F0ZWdvcnlSZXN1bHQge1xuICByZXN1bHQ/OiBBcnJheTx7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gIH0+O1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkQ2F0ZWdvcmllcyhwYWdlOiBQYWdlKSB7XG4gIGRlYnVnKCdMb2FkaW5nIGNhdGVnb3JpZXMnKTtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hHZXRXaXRoaW5QYWdlPEZldGNoQ2F0ZWdvcnlSZXN1bHQ+KHBhZ2UsIGAke0JBU0VfQVBJX0FDVElPTlNfVVJMfS9hcGkvY29udGVudHMvZ2V0Q2F0ZWdvcmllc2ApO1xuICBpZiAocmVzICYmIEFycmF5LmlzQXJyYXkocmVzLnJlc3VsdCkpIHtcbiAgICBkZWJ1ZyhgJHtyZXMucmVzdWx0Lmxlbmd0aH0gY2F0ZWdvcmllcyBsb2FkZWRgKTtcbiAgICByZXMucmVzdWx0Py5mb3JFYWNoKCh7IGlkLCBuYW1lIH0pID0+IGNhdGVnb3JpZXMuc2V0KGlkLCBuYW1lKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25UeXBlKHBsYW5OYW1lOiBzdHJpbmcsIHBsYW5UeXBlSWQ6IG51bWJlcikge1xuICBjb25zdCBjbGVhbmVkVXBUeG5UeXBlU3RyID0gcGxhbk5hbWUucmVwbGFjZSgnXFx0JywgJyAnKS50cmltKCkgYXMgTWF4UGxhbk5hbWU7XG4gIHN3aXRjaCAoY2xlYW5lZFVwVHhuVHlwZVN0cikge1xuICAgIGNhc2UgTWF4UGxhbk5hbWUuSW1tZWRpYXRlQ2hhcmdlOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuTm9ybWFsOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuTW9udGhseUNoYXJnZTpcbiAgICBjYXNlIE1heFBsYW5OYW1lLk9uZU1vbnRoUG9zdHBvbmVkOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuTW9udGhseVBvc3Rwb25lZDpcbiAgICBjYXNlIE1heFBsYW5OYW1lLkZ1dHVyZVB1cmNoYXNlRmluYW5jaW5nOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuTW9udGhseVBheW1lbnQ6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5Nb250aGx5UG9zdHBvbmVkSW5zdGFsbG1lbnRzOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuVGhpcnR5RGF5c1BsdXM6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5Ud29Nb250aHNQb3N0cG9uZWQ6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5Ud29Nb250aHNQb3N0cG9uZWQyOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuQWNjdW11bGF0aW5nQmFza2V0OlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuSW50ZXJuZXRTaG9wcGluZzpcbiAgICBjYXNlIE1heFBsYW5OYW1lLk1vbnRobHlDaGFyZ2VQbHVzSW50ZXJlc3Q6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5Qb3N0cG9uZWRUcmFuc2FjdGlvbkluc3RhbGxtZW50czpcbiAgICBjYXNlIE1heFBsYW5OYW1lLlJlcGxhY2VtZW50Q2FyZDpcbiAgICBjYXNlIE1heFBsYW5OYW1lLkVhcmx5UmVwYXltZW50OlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuTW9udGhseUNhcmRGZWU6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5DdXJyZW5jeVBvY2tldDpcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbDtcbiAgICBjYXNlIE1heFBsYW5OYW1lLkluc3RhbGxtZW50czpcbiAgICBjYXNlIE1heFBsYW5OYW1lLkNyZWRpdDpcbiAgICBjYXNlIE1heFBsYW5OYW1lLkNyZWRpdE91dHNpZGVUaGVMaW1pdDpcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGVzLkluc3RhbGxtZW50cztcbiAgICBkZWZhdWx0OlxuICAgICAgc3dpdGNoIChwbGFuVHlwZUlkKSB7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGVzLkluc3RhbGxtZW50cztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHJhbnNhY3Rpb24gdHlwZSAke2NsZWFuZWRVcFR4blR5cGVTdHIgYXMgc3RyaW5nfWApO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxtZW50c0luZm8oY29tbWVudHM6IHN0cmluZykge1xuICBpZiAoIWNvbW1lbnRzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBtYXRjaGVzID0gY29tbWVudHMubWF0Y2goL1xcZCsvZyk7XG4gIGlmICghbWF0Y2hlcyB8fCBtYXRjaGVzLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBudW1iZXI6IHBhcnNlSW50KG1hdGNoZXNbMF0sIDEwKSxcbiAgICB0b3RhbDogcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTApLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDaGFyZ2VkQ3VycmVuY3koY3VycmVuY3lJZDogbnVtYmVyIHwgbnVsbCkge1xuICBzd2l0Y2ggKGN1cnJlbmN5SWQpIHtcbiAgICBjYXNlIDM3NjpcbiAgICAgIHJldHVybiBTSEVLRUxfQ1VSUkVOQ1k7XG4gICAgY2FzZSA4NDA6XG4gICAgICByZXR1cm4gRE9MTEFSX0NVUlJFTkNZO1xuICAgIGNhc2UgOTc4OlxuICAgICAgcmV0dXJuIEVVUk9fQ1VSUkVOQ1k7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1lbW8oe1xuICBjb21tZW50cyxcbiAgZnVuZHNUcmFuc2ZlclJlY2VpdmVyT3JUcmFuc2ZlcixcbiAgZnVuZHNUcmFuc2ZlckNvbW1lbnQsXG59OiBQaWNrPFNjcmFwZWRUcmFuc2FjdGlvbiwgJ2NvbW1lbnRzJyB8ICdmdW5kc1RyYW5zZmVyUmVjZWl2ZXJPclRyYW5zZmVyJyB8ICdmdW5kc1RyYW5zZmVyQ29tbWVudCc+KSB7XG4gIGlmIChmdW5kc1RyYW5zZmVyUmVjZWl2ZXJPclRyYW5zZmVyKSB7XG4gICAgY29uc3QgbWVtbyA9IGNvbW1lbnRzID8gYCR7Y29tbWVudHN9ICR7ZnVuZHNUcmFuc2ZlclJlY2VpdmVyT3JUcmFuc2Zlcn1gIDogZnVuZHNUcmFuc2ZlclJlY2VpdmVyT3JUcmFuc2ZlcjtcbiAgICByZXR1cm4gZnVuZHNUcmFuc2ZlckNvbW1lbnQgPyBgJHttZW1vfTogJHtmdW5kc1RyYW5zZmVyQ29tbWVudH1gIDogbWVtbztcbiAgfVxuXG4gIHJldHVybiBjb21tZW50cztcbn1cblxuZnVuY3Rpb24gbWFwVHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IFNjcmFwZWRUcmFuc2FjdGlvbik6IFRyYW5zYWN0aW9uIHtcbiAgY29uc3QgaXNQZW5kaW5nID0gcmF3VHJhbnNhY3Rpb24ucGF5bWVudERhdGUgPT09IG51bGw7XG4gIGNvbnN0IHByb2Nlc3NlZERhdGUgPSBtb21lbnQoaXNQZW5kaW5nID8gcmF3VHJhbnNhY3Rpb24ucHVyY2hhc2VEYXRlIDogcmF3VHJhbnNhY3Rpb24ucGF5bWVudERhdGUpLnRvSVNPU3RyaW5nKCk7XG4gIGNvbnN0IHN0YXR1cyA9IGlzUGVuZGluZyA/IFRyYW5zYWN0aW9uU3RhdHVzZXMuUGVuZGluZyA6IFRyYW5zYWN0aW9uU3RhdHVzZXMuQ29tcGxldGVkO1xuXG4gIGNvbnN0IGluc3RhbGxtZW50cyA9IGdldEluc3RhbGxtZW50c0luZm8ocmF3VHJhbnNhY3Rpb24uY29tbWVudHMpO1xuICBjb25zdCBpZGVudGlmaWVyID0gaW5zdGFsbG1lbnRzXG4gICAgPyBgJHtyYXdUcmFuc2FjdGlvbi5kZWFsRGF0YT8uYXJufV8ke2luc3RhbGxtZW50cy5udW1iZXJ9YFxuICAgIDogcmF3VHJhbnNhY3Rpb24uZGVhbERhdGE/LmFybjtcblxuICByZXR1cm4ge1xuICAgIHR5cGU6IGdldFRyYW5zYWN0aW9uVHlwZShyYXdUcmFuc2FjdGlvbi5wbGFuTmFtZSwgcmF3VHJhbnNhY3Rpb24ucGxhblR5cGVJZCksXG4gICAgZGF0ZTogbW9tZW50KHJhd1RyYW5zYWN0aW9uLnB1cmNoYXNlRGF0ZSkudG9JU09TdHJpbmcoKSxcbiAgICBwcm9jZXNzZWREYXRlLFxuICAgIG9yaWdpbmFsQW1vdW50OiAtcmF3VHJhbnNhY3Rpb24ub3JpZ2luYWxBbW91bnQsXG4gICAgb3JpZ2luYWxDdXJyZW5jeTogcmF3VHJhbnNhY3Rpb24ub3JpZ2luYWxDdXJyZW5jeSxcbiAgICBjaGFyZ2VkQW1vdW50OiAtcmF3VHJhbnNhY3Rpb24uYWN0dWFsUGF5bWVudEFtb3VudCxcbiAgICBjaGFyZ2VkQ3VycmVuY3k6IGdldENoYXJnZWRDdXJyZW5jeShyYXdUcmFuc2FjdGlvbi5wYXltZW50Q3VycmVuY3kpLFxuICAgIGRlc2NyaXB0aW9uOiByYXdUcmFuc2FjdGlvbi5tZXJjaGFudE5hbWUudHJpbSgpLFxuICAgIG1lbW86IGdldE1lbW8ocmF3VHJhbnNhY3Rpb24pLFxuICAgIGNhdGVnb3J5OiBjYXRlZ29yaWVzLmdldChyYXdUcmFuc2FjdGlvbj8uY2F0ZWdvcnlJZCksXG4gICAgaW5zdGFsbG1lbnRzLFxuICAgIGlkZW50aWZpZXIsXG4gICAgc3RhdHVzLFxuICB9O1xufVxuaW50ZXJmYWNlIFNjcmFwZWRUcmFuc2FjdGlvbnNSZXN1bHQge1xuICByZXN1bHQ/OiB7XG4gICAgdHJhbnNhY3Rpb25zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXTtcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hUcmFuc2FjdGlvbnNGb3JNb250aChwYWdlOiBQYWdlLCBtb250aE1vbWVudDogTW9tZW50KSB7XG4gIGNvbnN0IHVybCA9IGdldFRyYW5zYWN0aW9uc1VybChtb250aE1vbWVudCk7XG5cbiAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoR2V0V2l0aGluUGFnZTxTY3JhcGVkVHJhbnNhY3Rpb25zUmVzdWx0PihwYWdlLCB1cmwpO1xuICBjb25zdCB0cmFuc2FjdGlvbnNCeUFjY291bnQ6IFJlY29yZDxzdHJpbmcsIFRyYW5zYWN0aW9uW10+ID0ge307XG5cbiAgaWYgKCFkYXRhIHx8ICFkYXRhLnJlc3VsdCkgcmV0dXJuIHRyYW5zYWN0aW9uc0J5QWNjb3VudDtcblxuICBkYXRhLnJlc3VsdC50cmFuc2FjdGlvbnNcbiAgICAvLyBGaWx0ZXIgb3V0IG5vbi10cmFuc2FjdGlvbnMgd2l0aG91dCBhIHBsYW4gdHlwZSwgZS5nLiBzdW1tYXJ5IHJvd3NcbiAgICAuZmlsdGVyKHRyYW5zYWN0aW9uID0+ICEhdHJhbnNhY3Rpb24ucGxhbk5hbWUpXG4gICAgLmZvckVhY2goKHRyYW5zYWN0aW9uOiBTY3JhcGVkVHJhbnNhY3Rpb24pID0+IHtcbiAgICAgIGlmICghdHJhbnNhY3Rpb25zQnlBY2NvdW50W3RyYW5zYWN0aW9uLnNob3J0Q2FyZE51bWJlcl0pIHtcbiAgICAgICAgdHJhbnNhY3Rpb25zQnlBY2NvdW50W3RyYW5zYWN0aW9uLnNob3J0Q2FyZE51bWJlcl0gPSBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFwcGVkVHJhbnNhY3Rpb24gPSBtYXBUcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgICB0cmFuc2FjdGlvbnNCeUFjY291bnRbdHJhbnNhY3Rpb24uc2hvcnRDYXJkTnVtYmVyXS5wdXNoKG1hcHBlZFRyYW5zYWN0aW9uKTtcbiAgICB9KTtcblxuICByZXR1cm4gdHJhbnNhY3Rpb25zQnlBY2NvdW50O1xufVxuXG5mdW5jdGlvbiBhZGRSZXN1bHQoYWxsUmVzdWx0czogUmVjb3JkPHN0cmluZywgVHJhbnNhY3Rpb25bXT4sIHJlc3VsdDogUmVjb3JkPHN0cmluZywgVHJhbnNhY3Rpb25bXT4pIHtcbiAgY29uc3QgY2xvbmVkUmVzdWx0czogUmVjb3JkPHN0cmluZywgVHJhbnNhY3Rpb25bXT4gPSB7IC4uLmFsbFJlc3VsdHMgfTtcbiAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGFjY291bnROdW1iZXIgPT4ge1xuICAgIGlmICghY2xvbmVkUmVzdWx0c1thY2NvdW50TnVtYmVyXSkge1xuICAgICAgY2xvbmVkUmVzdWx0c1thY2NvdW50TnVtYmVyXSA9IFtdO1xuICAgIH1cbiAgICBjbG9uZWRSZXN1bHRzW2FjY291bnROdW1iZXJdLnB1c2goLi4ucmVzdWx0W2FjY291bnROdW1iZXJdKTtcbiAgfSk7XG4gIHJldHVybiBjbG9uZWRSZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVHJhbnNhY3Rpb25zKFxuICB0eG5zOiBUcmFuc2FjdGlvbltdLFxuICBzdGFydE1vbWVudDogbW9tZW50Lk1vbWVudCxcbiAgY29tYmluZUluc3RhbGxtZW50czogYm9vbGVhbixcbiAgZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlOiBib29sZWFuLFxuKSB7XG4gIGxldCBjbG9uZWRUeG5zID0gQXJyYXkuZnJvbSh0eG5zKTtcbiAgaWYgKCFjb21iaW5lSW5zdGFsbG1lbnRzKSB7XG4gICAgY2xvbmVkVHhucyA9IGZpeEluc3RhbGxtZW50cyhjbG9uZWRUeG5zKTtcbiAgfVxuICBjbG9uZWRUeG5zID0gc29ydFRyYW5zYWN0aW9uc0J5RGF0ZShjbG9uZWRUeG5zKTtcbiAgY2xvbmVkVHhucyA9IGVuYWJsZVRyYW5zYWN0aW9uc0ZpbHRlckJ5RGF0ZVxuICAgID8gZmlsdGVyT2xkVHJhbnNhY3Rpb25zKGNsb25lZFR4bnMsIHN0YXJ0TW9tZW50LCBjb21iaW5lSW5zdGFsbG1lbnRzIHx8IGZhbHNlKVxuICAgIDogY2xvbmVkVHhucztcbiAgcmV0dXJuIGNsb25lZFR4bnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoVHJhbnNhY3Rpb25zKHBhZ2U6IFBhZ2UsIG9wdGlvbnM6IFNjcmFwZXJPcHRpb25zKSB7XG4gIGNvbnN0IGZ1dHVyZU1vbnRoc1RvU2NyYXBlID0gb3B0aW9ucy5mdXR1cmVNb250aHNUb1NjcmFwZSA/PyAxO1xuICBjb25zdCBkZWZhdWx0U3RhcnRNb21lbnQgPSBtb21lbnQoKS5zdWJ0cmFjdCgxLCAneWVhcnMnKTtcbiAgY29uc3Qgc3RhcnRNb21lbnRMaW1pdCA9IG1vbWVudCgpLnN1YnRyYWN0KDQsICd5ZWFycycpO1xuICBjb25zdCBzdGFydERhdGUgPSBvcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gIGNvbnN0IHN0YXJ0TW9tZW50ID0gbW9tZW50Lm1heChzdGFydE1vbWVudExpbWl0LCBtb21lbnQoc3RhcnREYXRlKSk7XG4gIGNvbnN0IGFsbE1vbnRocyA9IGdldEFsbE1vbnRoTW9tZW50cyhzdGFydE1vbWVudCwgZnV0dXJlTW9udGhzVG9TY3JhcGUpO1xuXG4gIGF3YWl0IGxvYWRDYXRlZ29yaWVzKHBhZ2UpO1xuXG4gIGxldCBhbGxSZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCBUcmFuc2FjdGlvbltdPiA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbE1vbnRocy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoVHJhbnNhY3Rpb25zRm9yTW9udGgocGFnZSwgYWxsTW9udGhzW2ldKTtcbiAgICBhbGxSZXN1bHRzID0gYWRkUmVzdWx0KGFsbFJlc3VsdHMsIHJlc3VsdCk7XG4gIH1cblxuICBPYmplY3Qua2V5cyhhbGxSZXN1bHRzKS5mb3JFYWNoKGFjY291bnROdW1iZXIgPT4ge1xuICAgIGxldCB0eG5zID0gYWxsUmVzdWx0c1thY2NvdW50TnVtYmVyXTtcbiAgICB0eG5zID0gcHJlcGFyZVRyYW5zYWN0aW9ucyhcbiAgICAgIHR4bnMsXG4gICAgICBzdGFydE1vbWVudCxcbiAgICAgIG9wdGlvbnMuY29tYmluZUluc3RhbGxtZW50cyB8fCBmYWxzZSxcbiAgICAgIG9wdGlvbnMub3V0cHV0RGF0YT8uZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlID8/IHRydWUsXG4gICAgKTtcbiAgICBhbGxSZXN1bHRzW2FjY291bnROdW1iZXJdID0gdHhucztcbiAgfSk7XG5cbiAgcmV0dXJuIGFsbFJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKHBhZ2U6IFBhZ2UpOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyB7XG4gIGNvbnN0IHVybHM6IFBvc3NpYmxlTG9naW5SZXN1bHRzID0ge307XG4gIHVybHNbTG9naW5SZXN1bHRzLlN1Y2Nlc3NdID0gW1NVQ0NFU1NfVVJMXTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuQ2hhbmdlUGFzc3dvcmRdID0gW1BBU1NXT1JEX0VYUElSRURfVVJMXTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkXSA9IFtcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gZWxlbWVudFByZXNlbnRPblBhZ2UocGFnZSwgSU5WQUxJRF9ERVRBSUxTX1NFTEVDVE9SKTtcbiAgICB9LFxuICBdO1xuICB1cmxzW0xvZ2luUmVzdWx0cy5Vbmtub3duRXJyb3JdID0gW1xuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiBlbGVtZW50UHJlc2VudE9uUGFnZShwYWdlLCBMT0dJTl9FUlJPUl9TRUxFQ1RPUik7XG4gICAgfSxcbiAgXTtcbiAgcmV0dXJuIHVybHM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICByZXR1cm4gW1xuICAgIHsgc2VsZWN0b3I6ICcjdXNlci1uYW1lJywgdmFsdWU6IGNyZWRlbnRpYWxzLnVzZXJuYW1lIH0sXG4gICAgeyBzZWxlY3RvcjogJyNwYXNzd29yZCcsIHZhbHVlOiBjcmVkZW50aWFscy5wYXNzd29yZCB9LFxuICBdO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG5cbmNsYXNzIE1heFNjcmFwZXIgZXh0ZW5kcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzPiB7XG4gIGdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpOiBMb2dpbk9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBsb2dpblVybDogTE9HSU5fVVJMLFxuICAgICAgZmllbGRzOiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFscyksXG4gICAgICBzdWJtaXRCdXR0b25TZWxlY3RvcjogJ2FwcC11c2VyLWxvZ2luLWZvcm0gLmdlbmVyYWwtYnV0dG9uLnNlbmQtbWUtY29kZScsXG4gICAgICBwcmVBY3Rpb246IGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKGF3YWl0IGVsZW1lbnRQcmVzZW50T25QYWdlKHRoaXMucGFnZSwgJyNjbG9zZVBvcHVwJykpIHtcbiAgICAgICAgICBhd2FpdCBjbGlja0J1dHRvbih0aGlzLnBhZ2UsICcjY2xvc2VQb3B1cCcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNsaWNrQnV0dG9uKHRoaXMucGFnZSwgJy5wZXJzb25hbC1hcmVhID4gYS5nby10by1wZXJzb25hbC1hcmVhJyk7XG4gICAgICAgIGlmIChhd2FpdCBlbGVtZW50UHJlc2VudE9uUGFnZSh0aGlzLnBhZ2UsICcubG9naW4tbGluayNwcml2YXRlJykpIHtcbiAgICAgICAgICBhd2FpdCBjbGlja0J1dHRvbih0aGlzLnBhZ2UsICcubG9naW4tbGluayNwcml2YXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHRoaXMucGFnZSwgJyNsb2dpbi1wYXNzd29yZC1saW5rJywgdHJ1ZSk7XG4gICAgICAgIGF3YWl0IGNsaWNrQnV0dG9uKHRoaXMucGFnZSwgJyNsb2dpbi1wYXNzd29yZC1saW5rJyk7XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZCh0aGlzLnBhZ2UsICcjbG9naW4tcGFzc3dvcmQudGFiLXBhbmUuYWN0aXZlIGFwcC11c2VyLWxvZ2luLWZvcm0nLCB0cnVlKTtcbiAgICAgIH0sXG4gICAgICBjaGVja1JlYWRpbmVzczogYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQodGhpcy5wYWdlLCAnLnBlcnNvbmFsLWFyZWEgPiBhLmdvLXRvLXBlcnNvbmFsLWFyZWEnLCB0cnVlKTtcbiAgICAgIH0sXG4gICAgICBwb3N0QWN0aW9uOiBhc3luYyAoKSA9PiByZWRpcmVjdE9yRGlhbG9nKHRoaXMucGFnZSksXG4gICAgICBwb3NzaWJsZVJlc3VsdHM6IGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKHRoaXMucGFnZSksXG4gICAgICB3YWl0VW50aWw6ICdkb21jb250ZW50bG9hZGVkJyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBmZXRjaFRyYW5zYWN0aW9ucyh0aGlzLnBhZ2UsIHRoaXMub3B0aW9ucyk7XG4gICAgY29uc3QgYWNjb3VudHMgPSBPYmplY3Qua2V5cyhyZXN1bHRzKS5tYXAoYWNjb3VudE51bWJlciA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY2NvdW50TnVtYmVyLFxuICAgICAgICB0eG5zOiByZXN1bHRzW2FjY291bnROdW1iZXJdLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYWNjb3VudHMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXhTY3JhcGVyO1xuIl19
|