UNPKG

@vendasta/store

Version:

Components and data for Store

507 lines 44.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /** * @record */ export function SalesPackage() { } if (false) { /** @type {?} */ SalesPackage.prototype.formattedPrices; /** @type {?} */ SalesPackage.prototype.packageId; /** @type {?} */ SalesPackage.prototype.name; /** @type {?} */ SalesPackage.prototype.icon; /** @type {?} */ SalesPackage.prototype.productIds; /** @type {?} */ SalesPackage.prototype.products; /** @type {?} */ SalesPackage.prototype.addonsWithNoParent; /** @type {?} */ SalesPackage.prototype.totalAddons; /** @type {?|undefined} */ SalesPackage.prototype.activationStatus; } /** * @record */ export function SalesProduct() { } if (false) { /** @type {?} */ SalesProduct.prototype.formattedPrices; /** @type {?} */ SalesProduct.prototype.productId; /** @type {?} */ SalesProduct.prototype.name; /** @type {?} */ SalesProduct.prototype.icon; /** @type {?} */ SalesProduct.prototype.tagline; /** @type {?|undefined} */ SalesProduct.prototype.activationStatus; /** @type {?|undefined} */ SalesProduct.prototype.editionId; /** @type {?|undefined} */ SalesProduct.prototype.editionName; /** @type {?} */ SalesProduct.prototype.addons; } /** * @record */ export function SalesAddon() { } if (false) { /** @type {?} */ SalesAddon.prototype.parentId; /** @type {?} */ SalesAddon.prototype.addonId; /** @type {?} */ SalesAddon.prototype.name; /** @type {?} */ SalesAddon.prototype.icon; /** @type {?} */ SalesAddon.prototype.tagline; /** @type {?} */ SalesAddon.prototype.parentName; /** @type {?} */ SalesAddon.prototype.parentIcon; /** @type {?} */ SalesAddon.prototype.multipleActivations; /** @type {?|undefined} */ SalesAddon.prototype.activationStatus; } /** * @record */ export function PackageItemActivationStatus() { } if (false) { /** @type {?} */ PackageItemActivationStatus.prototype.packageItemId; /** @type {?} */ PackageItemActivationStatus.prototype.status; } /** @enum {number} */ var ActivationStatus = { SUCCESS: 0, WARNING: 1, ERROR: 2, }; export { ActivationStatus }; ActivationStatus[ActivationStatus.SUCCESS] = 'SUCCESS'; ActivationStatus[ActivationStatus.WARNING] = 'WARNING'; ActivationStatus[ActivationStatus.ERROR] = 'ERROR'; /** * @record */ export function StatusNotificationItem() { } if (false) { /** @type {?} */ StatusNotificationItem.prototype.icon; /** @type {?} */ StatusNotificationItem.prototype.text; /** @type {?} */ StatusNotificationItem.prototype.status; } /** * @param {?} packages * @param {?} products * @param {?} addons * @return {?} */ export function buildSalesPackages(packages, products, addons) { if (!packages || packages.length < 1) { return []; } return packages.map(function (pkg) { return buildSalesPackageFromPackage(pkg, products, addons); }); } /** * @param {?} pkg * @param {?} products * @param {?} addons * @return {?} */ function buildSalesPackageFromPackage(pkg, products, addons) { if (!pkg) { return null; } /** @type {?} */ var salesProducts = buildSalesProducts(pkg, products, addons); // Addons can be in a package even if the parent product is not, this will create salesAddons with no parent /** @type {?} */ var addonsWithNoParent = buildSalesAddonsWithNoParent(pkg, products, addons); return createSalesPackage(pkg, salesProducts, addonsWithNoParent); } /** * @param {?} pkg * @param {?} products * @param {?} addons * @return {?} */ export function buildSalesProducts(pkg, products, addons) { if (!(products && products.length && pkg.products && pkg.products.length)) { return []; } /** @type {?} */ var productMap = new Map(); products.forEach(function (product) { return productMap.set(product.productId, product); }); return pkg.products .map(function (productId) { /** @type {?} */ var productMatch = productMap.get(productId); /** @type {?} */ var addonsInPackage = coerceAddonsForAddonKeys(addons, pkg.addon_keys); return productMatch ? buildSalesProductFromProduct(productMatch, addonsInPackage) : null; }) .filter(function (productItem) { return productItem; }); } /** * @param {?} addons * @param {?} addonKeys * @return {?} */ export function coerceAddonsForAddonKeys(addons, addonKeys) { if (!addons || addons.length === 0 || !addonKeys || addonKeys.length === 0) { return []; } return addons.reduce(function (addonsArray, addon) { /** @type {?} */ var key = addonKeys.find(function (k) { return k.addonId === addon.addonId; }); if (key) { /** @type {?} */ var quantity = key.quantity || 1; for (var i = 0; i < quantity; i++) { addonsArray.push(addon); } } return addonsArray; }, []); } /** * @param {?} pkg * @param {?} products * @param {?} addons * @return {?} */ export function buildSalesAddonsWithNoParent(pkg, products, addons) { if (!addons || addons.length < 1 || !pkg.addon_keys) { return []; } /** @type {?} */ var productMap = new Map(); products.forEach(function (product) { return productMap.set(product.productId, product); }); /** @type {?} */ var addonsMap = new Map(); addons.forEach(function (addon) { return addonsMap.set(addon.addonId, addon); }); /** @type {?} */ var addonsWithNoParent = pkg.addon_keys.reduce(function (addonArray, addonKey) { if (pkg.products && pkg.products.some(function (productId) { return productId === addonKey.appId; })) { return addonArray || []; } /** @type {?} */ var parentProduct = productMap.get(addonKey.appId); /** @type {?} */ var parentName = parentProduct ? parentProduct.name : null; /** @type {?} */ var parentIcon = parentProduct ? parentProduct.iconUrl : null; /** @type {?} */ var quantity = addonKey.quantity || 1; /** @type {?} */ var addon = addonsMap.get(addonKey.addonId); for (var i = 0; i < quantity; i++) { addonArray.push(createSalesAddon(addon, parentName, parentIcon)); } return addonArray; }, []); return addonsWithNoParent; } /** * @param {?} product * @param {?} addons * @return {?} */ export function buildSalesProductFromProduct(product, addons) { if (!product) { return null; } if (!addons || addons.length < 1) { return createSalesProduct(product, null); } /** @type {?} */ var productAddons = addons.filter(function (addon) { return addon.appId === product.productId; }); /** @type {?} */ var salesAddons = createSalesAddons(productAddons); return createSalesProduct(product, salesAddons); } /** * @param {?} pkg * @param {?} salesProducts * @param {?} addonsWithNoParent * @return {?} */ function createSalesPackage(pkg, salesProducts, addonsWithNoParent) { var e_1, _a; /** @type {?} */ var totalAddons = 0; try { for (var _b = tslib_1.__values(pkg.addon_keys || []), _c = _b.next(); !_c.done; _c = _b.next()) { var key = _c.value; totalAddons += key.quantity || 1; } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } return { formattedPrices: pkg.formattedPricingList.join(', '), packageId: pkg.solution_id, name: pkg.name, icon: pkg.icon, productIds: pkg.products, products: salesProducts || [], addonsWithNoParent: addonsWithNoParent || [], totalAddons: totalAddons }; } /** * @param {?} product * @param {?} salesAddons * @return {?} */ function createSalesProduct(product, salesAddons) { return { formattedPrices: product.formattedPricingList.join(', '), productId: product.productId, name: product.name, tagline: product.tagline || '', icon: product.iconUrl, addons: salesAddons || [], editionId: product.editionId, editionName: product.editionName, }; } /** * @param {?} addons * @return {?} */ function createSalesAddons(addons) { return addons.map(function (addon) { return createSalesAddon(addon); }); } /** * @param {?} addon * @param {?=} parentName * @param {?=} parentIcon * @return {?} */ function createSalesAddon(addon, parentName, parentIcon) { return { parentId: addon.appId, addonId: addon.addonId, name: addon.title, tagline: addon.tagline || '', icon: addon.icon || '', multipleActivations: addon.multipleActivations, parentIcon: parentIcon || '', parentName: parentName || '' }; } /** * @param {?} pkg * @param {?} products * @param {?} addons * @param {?} activationStatus * @return {?} */ function createSalesPackageWithStatus(pkg, products, addons, activationStatus) { return { formattedPrices: pkg.formattedPrices, packageId: pkg.packageId, name: pkg.name, icon: pkg.icon, productIds: pkg.productIds, products: products || [], addonsWithNoParent: addons || [], activationStatus: activationStatus || null, totalAddons: pkg.totalAddons }; } /** * @param {?} product * @param {?} addons * @param {?} activationStatus * @return {?} */ function createSalesProductWithStatus(product, addons, activationStatus) { return { formattedPrices: product.formattedPrices, productId: product.productId, name: product.name, editionId: product.editionId, editionName: product.editionName, tagline: product.tagline, icon: product.icon, addons: addons || [], activationStatus: activationStatus || null }; } /** * @param {?} addon * @param {?} activationStatus * @return {?} */ function createSalesAddonWithStatus(addon, activationStatus) { return { parentId: addon.parentId, addonId: addon.addonId, name: addon.name, tagline: addon.tagline, icon: addon.icon, parentIcon: addon.parentIcon, parentName: addon.parentName, multipleActivations: addon.multipleActivations, activationStatus: activationStatus || null }; } /** * @param {?} salesPackages * @param {?} statuses * @return {?} */ export function addStatusesToSalesPackages(salesPackages, statuses) { if (!statuses || statuses.length === 0) { return salesPackages; } return salesPackages.map(function (salesPackage) { /** @type {?} */ var newProducts = salesPackage.products.map(function (product) { return addStatusesToSalesProduct(product, statuses); }); /** @type {?} */ var newAddonsWithNoParent = salesPackage.addonsWithNoParent.map(function (addon) { /** @type {?} */ var status = findStatus(statuses, addon.addonId, addon.multipleActivations); return addStatusesToSalesAddon(addon, status); }); /** @type {?} */ var productStatuses = newProducts .map(function (product) { return product.activationStatus.status; }); /** @type {?} */ var addonStatuses = newProducts .map(function (product) { return product.addons ? product.addons.map(function (addon) { return addon.activationStatus.status; }) : []; }) .reduce(function (statusList, reducedList) { return reducedList.concat(statusList); }, []); /** @type {?} */ var addonsWithNoParentStatuses = newAddonsWithNoParent .map(function (addon) { return addon.activationStatus ? addon.activationStatus.status : null; }); /** @type {?} */ var allStatuses = tslib_1.__spread(productStatuses, addonStatuses, addonsWithNoParentStatuses); /** @type {?} */ var packageStatus = convertNumberToActivationStatus(Math.max.apply(Math, tslib_1.__spread(allStatuses))); /** @type {?} */ var statusNotification = createStatusNotificationItemForPackage(packageStatus); return createSalesPackageWithStatus(salesPackage, newProducts, newAddonsWithNoParent, statusNotification); }); } /** * @param {?} product * @param {?} statuses * @return {?} */ export function addStatusesToSalesProduct(product, statuses) { /** @type {?} */ var productStatus = findStatus(statuses, product.productId, false); /** @type {?} */ var statusNotification = createStatusNotificationItemForPackageItem(productStatus); if (!product.addons) { return createSalesProductWithStatus(product, null, statusNotification); } /** @type {?} */ var newSalesAddons = product.addons.map(function (addon) { /** @type {?} */ var addonStatus = findStatus(statuses, addon.addonId, addon.multipleActivations); return addStatusesToSalesAddon(addon, addonStatus); }); return createSalesProductWithStatus(product, newSalesAddons, statusNotification); } /** * @param {?} addon * @param {?} status * @return {?} */ function addStatusesToSalesAddon(addon, status) { /** @type {?} */ var addonStatusNotification = createStatusNotificationItemForPackageItem(status); return createSalesAddonWithStatus(addon, addonStatusNotification); } /** * @param {?} statuses * @param {?} id * @param {?} removeIndex * @return {?} */ function findStatus(statuses, id, removeIndex) { if (!statuses || statuses.length <= 0) { return null; } /** @type {?} */ var statusIndex = statuses.findIndex(function (s) { return s.packageItemId === id; }); if (statusIndex < 0) { return null; } /** @type {?} */ var status = statuses[statusIndex].status; if (removeIndex) { statuses.splice(statusIndex, 1); } return status; } /** * @param {?} status * @return {?} */ function createStatusNotificationItemForPackageItem(status) { switch (status) { case ActivationStatus.SUCCESS: return { icon: 'check_circle', status: status, text: 'Activated' }; case ActivationStatus.WARNING: return { icon: 'warning', status: status, text: 'Already Activated' }; default: return { icon: 'error', status: status, text: 'Activation Errors' }; } } /** * @param {?} status * @return {?} */ function createStatusNotificationItemForPackage(status) { switch (status) { case ActivationStatus.SUCCESS: return { icon: 'check_circle', status: status, text: 'Activated' }; case ActivationStatus.WARNING: return { icon: 'warning', status: status, text: 'Activation Warnings' }; default: return { icon: 'error', status: status, text: 'Activation Errors Occured' }; } } /** * @param {?} number * @return {?} */ function convertNumberToActivationStatus(number) { switch (number) { case 0: return ActivationStatus.SUCCESS; case 1: return ActivationStatus.WARNING; default: return ActivationStatus.ERROR; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FsZXMtcGFja2FnZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B2ZW5kYXN0YS9zdG9yZS8iLCJzb3VyY2VzIjpbImxpYi9wYWNrYWdlLWRyb3Bkb3duL3NhbGVzLXBhY2thZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFHQSxrQ0FVQzs7O0lBVEMsdUNBQXdCOztJQUN4QixpQ0FBa0I7O0lBQ2xCLDRCQUFhOztJQUNiLDRCQUFhOztJQUNiLGtDQUFxQjs7SUFDckIsZ0NBQXlCOztJQUN6QiwwQ0FBaUM7O0lBQ2pDLG1DQUFvQjs7SUFDcEIsd0NBQTBDOzs7OztBQUc1QyxrQ0FVQzs7O0lBVEMsdUNBQXdCOztJQUN4QixpQ0FBa0I7O0lBQ2xCLDRCQUFhOztJQUNiLDRCQUFhOztJQUNiLCtCQUFnQjs7SUFDaEIsd0NBQTBDOztJQUMxQyxpQ0FBbUI7O0lBQ25CLG1DQUFxQjs7SUFDckIsOEJBQXFCOzs7OztBQUd2QixnQ0FVQzs7O0lBVEMsOEJBQWlCOztJQUNqQiw2QkFBZ0I7O0lBQ2hCLDBCQUFhOztJQUNiLDBCQUFhOztJQUNiLDZCQUFnQjs7SUFDaEIsZ0NBQW1COztJQUNuQixnQ0FBbUI7O0lBQ25CLHlDQUE2Qjs7SUFDN0Isc0NBQTBDOzs7OztBQUc1QyxpREFHQzs7O0lBRkMsb0RBQXNCOztJQUN0Qiw2Q0FBeUI7Ozs7SUFJekIsVUFBVztJQUNYLFVBQVc7SUFDWCxRQUFTOzs7Ozs7Ozs7QUFHWCw0Q0FJQzs7O0lBSEMsc0NBQWE7O0lBQ2Isc0NBQWE7O0lBQ2Isd0NBQXdCOzs7Ozs7OztBQUcxQixNQUFNLFVBQVUsa0JBQWtCLENBQUMsUUFBbUIsRUFBRSxRQUFtQixFQUFFLE1BQWU7SUFDMUYsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNwQyxPQUFPLEVBQUUsQ0FBQztLQUNYO0lBQ0QsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsNEJB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QVMsK0JBQStCLENBQUMsTUFBYztJQUNyRCxRQUFRLE1BQU0sRUFBRTtRQUNkLEtBQUssQ0FBQztZQUNKLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDO1FBQ2xDLEtBQUssQ0FBQztZQUNKLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDO1FBQ2xDO1lBQ0UsT0FBTyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7S0FDakM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJvZHVjdCwgUGFja2FnZSB9IGZyb20gJy4uLyc7XG5pbXBvcnQgeyBBZGRvbiwgQWRkb25LZXkgfSBmcm9tICdAdmVuZGFzdGEvY29yZS9tYXJrZXRwbGFjZS1wYWNrYWdlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2FsZXNQYWNrYWdlIHtcbiAgZm9ybWF0dGVkUHJpY2VzOiBzdHJpbmc7XG4gIHBhY2thZ2VJZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgcHJvZHVjdElkczogc3RyaW5nW107XG4gIHByb2R1Y3RzOiBTYWxlc1Byb2R1Y3RbXTtcbiAgYWRkb25zV2l0aE5vUGFyZW50OiBTYWxlc0FkZG9uW107XG4gIHRvdGFsQWRkb25zOiBudW1iZXI7XG4gIGFjdGl2YXRpb25TdGF0dXM/OiBTdGF0dXNOb3RpZmljYXRpb25JdGVtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhbGVzUHJvZHVjdCB7XG4gIGZvcm1hdHRlZFByaWNlczogc3RyaW5nO1xuICBwcm9kdWN0SWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG4gIHRhZ2xpbmU6IHN0cmluZztcbiAgYWN0aXZhdGlvblN0YXR1cz86IFN0YXR1c05vdGlmaWNhdGlvbkl0ZW07XG4gIGVkaXRpb25JZD86IHN0cmluZztcbiAgZWRpdGlvbk5hbWU/OiBzdHJpbmc7XG4gIGFkZG9uczogU2FsZXNBZGRvbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhbGVzQWRkb24ge1xuICBwYXJlbnRJZDogc3RyaW5nO1xuICBhZGRvbklkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgaWNvbjogc3RyaW5nO1xuICB0YWdsaW5lOiBzdHJpbmc7XG4gIHBhcmVudE5hbWU6IHN0cmluZztcbiAgcGFyZW50SWNvbjogc3RyaW5nO1xuICBtdWx0aXBsZUFjdGl2YXRpb25zOiBib29sZWFuO1xuICBhY3RpdmF0aW9uU3RhdHVzPzogU3RhdHVzTm90aWZpY2F0aW9uSXRlbTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlSXRlbUFjdGl2YXRpb25TdGF0dXMge1xuICBwYWNrYWdlSXRlbUlkOiBzdHJpbmc7XG4gIHN0YXR1czogQWN0aXZhdGlvblN0YXR1cztcbn1cblxuZXhwb3J0IGVudW0gQWN0aXZhdGlvblN0YXR1cyB7XG4gIFNVQ0NFU1MgPSAwLFxuICBXQVJOSU5HID0gMSxcbiAgRVJST1IgPSAyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzTm90aWZpY2F0aW9uSXRlbSB7XG4gIGljb246IHN0cmluZyxcbiAgdGV4dDogc3RyaW5nLFxuICBzdGF0dXM6IEFjdGl2YXRpb25TdGF0dXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2FsZXNQYWNrYWdlcyhwYWNrYWdlczogUGFja2FnZVtdLCBwcm9kdWN0czogUHJvZHVjdFtdLCBhZGRvbnM6IEFkZG9uW10pOiBTYWxlc1BhY2thZ2VbXSB7XG4gIGlmICghcGFja2FnZXMgfHwgcGFja2FnZXMubGVuZ3RoIDwgMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gcGFja2FnZXMubWFwKHBrZyA9PiBidWlsZFNhbGVzUGFja2FnZUZyb21QYWNrYWdlKHBrZywgcHJvZHVjdHMsIGFkZG9ucykpO1xufVxuXG5mdW5jdGlvbiBidWlsZFNhbGVzUGFja2FnZUZyb21QYWNrYWdlKHBrZzogUGFja2FnZSwgcHJvZHVjdHM6IFByb2R1Y3RbXSwgYWRkb25zOiBBZGRvbltdKTogU2FsZXNQYWNrYWdlIHtcbiAgaWYgKCFwa2cpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNhbGVzUHJvZHVjdHMgPSBidWlsZFNhbGVzUHJvZHVjdHMocGtnLCBwcm9kdWN0cywgYWRkb25zKTtcbiAgLy8gQWRkb25zIGNhbiBiZSBpbiBhIHBhY2thZ2UgZXZlbiBpZiB0aGUgcGFyZW50IHByb2R1Y3QgaXMgbm90LCB0aGlzIHdpbGwgY3JlYXRlIHNhbGVzQWRkb25zIHdpdGggbm8gcGFyZW50XG4gIGNvbnN0IGFkZG9uc1dpdGhOb1BhcmVudDogU2FsZXNBZGRvbltdID0gYnVpbGRTYWxlc0FkZG9uc1dpdGhOb1BhcmVudChwa2csIHByb2R1Y3RzLCBhZGRvbnMpO1xuXG4gIHJldHVybiBjcmVhdGVTYWxlc1BhY2thZ2UocGtnLCBzYWxlc1Byb2R1Y3RzLCBhZGRvbnNXaXRoTm9QYXJlbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTYWxlc1Byb2R1Y3RzKHBrZzogUGFja2FnZSwgcHJvZHVjdHM6IFByb2R1Y3RbXSwgYWRkb25zOiBBZGRvbltdKTogU2FsZXNQcm9kdWN0W10ge1xuICBpZiAoIShwcm9kdWN0cyAmJiBwcm9kdWN0cy5sZW5ndGggJiYgcGtnLnByb2R1Y3RzICYmIHBrZy5wcm9kdWN0cy5sZW5ndGgpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHByb2R1Y3RNYXA6IE1hcDxzdHJpbmcsIFByb2R1Y3Q+ID0gbmV3IE1hcDxzdHJpbmcsIFByb2R1Y3Q+KCk7XG4gIHByb2R1Y3RzLmZvckVhY2gocHJvZHVjdCA9PiBwcm9kdWN0TWFwLnNldChwcm9kdWN0LnByb2R1Y3RJZCwgcHJvZHVjdCkpO1xuICByZXR1cm4gcGtnLnByb2R1Y3RzXG4gICAgLm1hcChwcm9kdWN0SWQgPT4ge1xuICAgICAgY29uc3QgcHJvZHVjdE1hdGNoOiBQcm9kdWN0ID0gcHJvZHVjdE1hcC5nZXQocHJvZHVjdElkKTtcbiAgICAgIGNvbnN0IGFkZG9uc0luUGFja2FnZSA9IGNvZXJjZUFkZG9uc0ZvckFkZG9uS2V5cyhhZGRvbnMsIHBrZy5hZGRvbl9rZXlzKTtcbiAgICAgIHJldHVybiBwcm9kdWN0TWF0Y2ggPyBidWlsZFNhbGVzUHJvZHVjdEZyb21Qcm9kdWN0KHByb2R1Y3RNYXRjaCwgYWRkb25zSW5QYWNrYWdlKSA6IG51bGw7XG4gICAgfSlcbiAgICAuZmlsdGVyKHByb2R1Y3RJdGVtID0+IHByb2R1Y3RJdGVtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvZXJjZUFkZG9uc0ZvckFkZG9uS2V5cyhhZGRvbnM6IEFkZG9uW10sIGFkZG9uS2V5czogQWRkb25LZXlbXSk6IEFkZG9uW10ge1xuICBpZiAoIWFkZG9ucyB8fCBhZGRvbnMubGVuZ3RoID09PSAwIHx8ICFhZGRvbktleXMgfHwgYWRkb25LZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBhZGRvbnMucmVkdWNlKChhZGRvbnNBcnJheSwgYWRkb24pID0+IHtcbiAgICBjb25zdCBrZXkgPSBhZGRvbktleXMuZmluZChrID0+IGsuYWRkb25JZCA9PT0gYWRkb24uYWRkb25JZCk7XG4gICAgaWYgKGtleSkge1xuICAgICAgY29uc3QgcXVhbnRpdHkgPSBrZXkucXVhbnRpdHkgfHwgMTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVhbnRpdHk7IGkrKykge1xuICAgICAgICBhZGRvbnNBcnJheS5wdXNoKGFkZG9uKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWRkb25zQXJyYXk7XG4gIH0sIFtdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2FsZXNBZGRvbnNXaXRoTm9QYXJlbnQocGtnOiBQYWNrYWdlLCBwcm9kdWN0czogUHJvZHVjdFtdLCBhZGRvbnM6IEFkZG9uW10pOiBTYWxlc0FkZG9uW10ge1xuICBpZiAoIWFkZG9ucyB8fCBhZGRvbnMubGVuZ3RoIDwgMSB8fCAhcGtnLmFkZG9uX2tleXMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgcHJvZHVjdE1hcDogTWFwPHN0cmluZywgUHJvZHVjdD4gPSBuZXcgTWFwPHN0cmluZywgUHJvZHVjdD4oKTtcbiAgcHJvZHVjdHMuZm9yRWFjaChwcm9kdWN0ID0+IHByb2R1Y3RNYXAuc2V0KHByb2R1Y3QucHJvZHVjdElkLCBwcm9kdWN0KSk7XG4gIGNvbnN0IGFkZG9uc01hcDogTWFwPHN0cmluZywgQWRkb24+ID0gbmV3IE1hcDxzdHJpbmcsIEFkZG9uPigpO1xuICBhZGRvbnMuZm9yRWFjaChhZGRvbiA9PiBhZGRvbnNNYXAuc2V0KGFkZG9uLmFkZG9uSWQsIGFkZG9uKSk7XG5cbiAgY29uc3QgYWRkb25zV2l0aE5vUGFyZW50ID0gcGtnLmFkZG9uX2tleXMucmVkdWNlPFNhbGVzQWRkb25bXT4oKGFkZG9uQXJyYXk6IFNhbGVzQWRkb25bXSwgYWRkb25LZXk6IEFkZG9uS2V5KTogU2FsZXNBZGRvbltdID0+IHtcbiAgICBpZiAocGtnLnByb2R1Y3RzICYmIHBrZy5wcm9kdWN0cy5zb21lKHByb2R1Y3RJZCA9PiBwcm9kdWN0SWQgPT09IGFkZG9uS2V5LmFwcElkKSkge1xuICAgICAgcmV0dXJuIGFkZG9uQXJyYXkgfHwgW107XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudFByb2R1Y3QgPSBwcm9kdWN0TWFwLmdldChhZGRvbktleS5hcHBJZCk7XG4gICAgY29uc3QgcGFyZW50TmFtZSA9IHBhcmVudFByb2R1Y3QgPyBwYXJlbnRQcm9kdWN0Lm5hbWUgOiBudWxsO1xuICAgIGNvbnN0IHBhcmVudEljb24gPSBwYXJlbnRQcm9kdWN0ID8gcGFyZW50UHJvZHVjdC5pY29uVXJsIDogbnVsbDtcbiAgICBjb25zdCBxdWFudGl0eSA9IGFkZG9uS2V5LnF1YW50aXR5IHx8IDE7XG4gICAgY29uc3QgYWRkb246IEFkZG9uID0gYWRkb25zTWFwLmdldChhZGRvbktleS5hZGRvbklkKTsgLy8gY291bGQgYmUgdW5kZWZpbmVkXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWFudGl0eTsgaSsrKSB7XG4gICAgICBhZGRvbkFycmF5LnB1c2goY3JlYXRlU2FsZXNBZGRvbihhZGRvbiwgcGFyZW50TmFtZSwgcGFyZW50SWNvbikpO1xuICAgIH1cbiAgICByZXR1cm4gYWRkb25BcnJheTtcbiAgfSwgW10pO1xuICByZXR1cm4gYWRkb25zV2l0aE5vUGFyZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTYWxlc1Byb2R1Y3RGcm9tUHJvZHVjdChwcm9kdWN0OiBQcm9kdWN0LCBhZGRvbnM6IEFkZG9uW10pOiBTYWxlc1Byb2R1Y3Qge1xuICBpZiAoIXByb2R1Y3QpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoIWFkZG9ucyB8fCBhZGRvbnMubGVuZ3RoIDwgMSkge1xuICAgIHJldHVybiBjcmVhdGVTYWxlc1Byb2R1Y3QocHJvZHVjdCwgbnVsbCk7XG4gIH1cblxuICBjb25zdCBwcm9kdWN0QWRkb25zID0gYWRkb25zLmZpbHRlcihhZGRvbiA9PiBhZGRvbi5hcHBJZCA9PT0gcHJvZHVjdC5wcm9kdWN0SWQpO1xuICBjb25zdCBzYWxlc0FkZG9ucyA9IGNyZWF0ZVNhbGVzQWRkb25zKHByb2R1Y3RBZGRvbnMpO1xuICByZXR1cm4gY3JlYXRlU2FsZXNQcm9kdWN0KHByb2R1Y3QsIHNhbGVzQWRkb25zKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNQYWNrYWdlKHBrZzogUGFja2FnZSwgc2FsZXNQcm9kdWN0czogU2FsZXNQcm9kdWN0W10sIGFkZG9uc1dpdGhOb1BhcmVudDogU2FsZXNBZGRvbltdKTogU2FsZXNQYWNrYWdlIHtcbiAgbGV0IHRvdGFsQWRkb25zID0gMDtcbiAgZm9yIChjb25zdCBrZXkgb2YgcGtnLmFkZG9uX2tleXMgfHwgW10pIHtcbiAgICB0b3RhbEFkZG9ucyArPSBrZXkucXVhbnRpdHkgfHwgMTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0dGVkUHJpY2VzOiBwa2cuZm9ybWF0dGVkUHJpY2luZ0xpc3Quam9pbignLCAnKSxcbiAgICBwYWNrYWdlSWQ6IHBrZy5zb2x1dGlvbl9pZCxcbiAgICBuYW1lOiBwa2cubmFtZSxcbiAgICBpY29uOiBwa2cuaWNvbixcbiAgICBwcm9kdWN0SWRzOiBwa2cucHJvZHVjdHMsXG4gICAgcHJvZHVjdHM6IHNhbGVzUHJvZHVjdHMgfHwgW10sXG4gICAgYWRkb25zV2l0aE5vUGFyZW50OiBhZGRvbnNXaXRoTm9QYXJlbnQgfHwgW10sXG4gICAgdG90YWxBZGRvbnM6IHRvdGFsQWRkb25zXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNQcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QsIHNhbGVzQWRkb25zOiBTYWxlc0FkZG9uW10pOiBTYWxlc1Byb2R1Y3Qge1xuICByZXR1cm4ge1xuICAgIGZvcm1hdHRlZFByaWNlczogcHJvZHVjdC5mb3JtYXR0ZWRQcmljaW5nTGlzdC5qb2luKCcsICcpLFxuICAgIHByb2R1Y3RJZDogcHJvZHVjdC5wcm9kdWN0SWQsXG4gICAgbmFtZTogcHJvZHVjdC5uYW1lLFxuICAgIHRhZ2xpbmU6IHByb2R1Y3QudGFnbGluZSB8fCAnJyxcbiAgICBpY29uOiBwcm9kdWN0Lmljb25VcmwsXG4gICAgYWRkb25zOiBzYWxlc0FkZG9ucyB8fCBbXSxcbiAgICBlZGl0aW9uSWQ6IHByb2R1Y3QuZWRpdGlvbklkLFxuICAgIGVkaXRpb25OYW1lOiBwcm9kdWN0LmVkaXRpb25OYW1lLFxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNhbGVzQWRkb25zKGFkZG9uczogQWRkb25bXSk6IFNhbGVzQWRkb25bXSB7XG4gIHJldHVybiBhZGRvbnMubWFwKGFkZG9uID0+IGNyZWF0ZVNhbGVzQWRkb24oYWRkb24pKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNBZGRvbihhZGRvbjogQWRkb24sIHBhcmVudE5hbWU/OiBzdHJpbmcsIHBhcmVudEljb24/OiBzdHJpbmcpOiBTYWxlc0FkZG9uIHtcbiAgcmV0dXJuIHtcbiAgICBwYXJlbnRJZDogYWRkb24uYXBwSWQsXG4gICAgYWRkb25JZDogYWRkb24uYWRkb25JZCxcbiAgICBuYW1lOiBhZGRvbi50aXRsZSxcbiAgICB0YWdsaW5lOiBhZGRvbi50YWdsaW5lIHx8ICcnLFxuICAgIGljb246IGFkZG9uLmljb24gfHwgJycsXG4gICAgbXVsdGlwbGVBY3RpdmF0aW9uczogYWRkb24ubXVsdGlwbGVBY3RpdmF0aW9ucyxcbiAgICBwYXJlbnRJY29uOiBwYXJlbnRJY29uIHx8ICcnLFxuICAgIHBhcmVudE5hbWU6IHBhcmVudE5hbWUgfHwgJydcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTYWxlc1BhY2thZ2VXaXRoU3RhdHVzKHBrZzogU2FsZXNQYWNrYWdlLCBwcm9kdWN0czogU2FsZXNQcm9kdWN0W10sIGFkZG9uczogU2FsZXNBZGRvbltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0aW9uU3RhdHVzOiBTdGF0dXNOb3RpZmljYXRpb25JdGVtKTogU2FsZXNQYWNrYWdlIHtcblxuICByZXR1cm4ge1xuICAgIGZvcm1hdHRlZFByaWNlczogcGtnLmZvcm1hdHRlZFByaWNlcyxcbiAgICBwYWNrYWdlSWQ6IHBrZy5wYWNrYWdlSWQsXG4gICAgbmFtZTogcGtnLm5hbWUsXG4gICAgaWNvbjogcGtnLmljb24sXG4gICAgcHJvZHVjdElkczogcGtnLnByb2R1Y3RJZHMsXG4gICAgcHJvZHVjdHM6IHByb2R1Y3RzIHx8IFtdLFxuICAgIGFkZG9uc1dpdGhOb1BhcmVudDogYWRkb25zIHx8IFtdLFxuICAgIGFjdGl2YXRpb25TdGF0dXM6IGFjdGl2YXRpb25TdGF0dXMgfHwgbnVsbCxcbiAgICB0b3RhbEFkZG9uczogcGtnLnRvdGFsQWRkb25zXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNQcm9kdWN0V2l0aFN0YXR1cyhwcm9kdWN0OiBTYWxlc1Byb2R1Y3QsIGFkZG9uczogU2FsZXNBZGRvbltdLCBhY3RpdmF0aW9uU3RhdHVzOiBTdGF0dXNOb3RpZmljYXRpb25JdGVtKTogU2FsZXNQcm9kdWN0IHtcbiAgcmV0dXJuIHtcbiAgICBmb3JtYXR0ZWRQcmljZXM6IHByb2R1Y3QuZm9ybWF0dGVkUHJpY2VzLFxuICAgIHByb2R1Y3RJZDogcHJvZHVjdC5wcm9kdWN0SWQsXG4gICAgbmFtZTogcHJvZHVjdC5uYW1lLFxuICAgIGVkaXRpb25JZDogcHJvZHVjdC5lZGl0aW9uSWQsXG4gICAgZWRpdGlvbk5hbWU6IHByb2R1Y3QuZWRpdGlvbk5hbWUsXG4gICAgdGFnbGluZTogcHJvZHVjdC50YWdsaW5lLFxuICAgIGljb246IHByb2R1Y3QuaWNvbixcbiAgICBhZGRvbnM6IGFkZG9ucyB8fCBbXSxcbiAgICBhY3RpdmF0aW9uU3RhdHVzOiBhY3RpdmF0aW9uU3RhdHVzIHx8IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNBZGRvbldpdGhTdGF0dXMoYWRkb246IFNhbGVzQWRkb24sIGFjdGl2YXRpb25TdGF0dXM6IFN0YXR1c05vdGlmaWNhdGlvbkl0ZW0pOiBTYWxlc0FkZG9uIHtcbiAgcmV0dXJuIHtcbiAgICBwYXJlbnRJZDogYWRkb24ucGFyZW50SWQsXG4gICAgYWRkb25JZDogYWRkb24uYWRkb25JZCxcbiAgICBuYW1lOiBhZGRvbi5uYW1lLFxuICAgIHRhZ2xpbmU6IGFkZG9uLnRhZ2xpbmUsXG4gICAgaWNvbjogYWRkb24uaWNvbixcbiAgICBwYXJlbnRJY29uOiBhZGRvbi5wYXJlbnRJY29uLFxuICAgIHBhcmVudE5hbWU6IGFkZG9uLnBhcmVudE5hbWUsXG4gICAgbXVsdGlwbGVBY3RpdmF0aW9uczogYWRkb24ubXVsdGlwbGVBY3RpdmF0aW9ucyxcbiAgICBhY3RpdmF0aW9uU3RhdHVzOiBhY3RpdmF0aW9uU3RhdHVzIHx8IG51bGxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkU3RhdHVzZXNUb1NhbGVzUGFja2FnZXMoc2FsZXNQYWNrYWdlczogU2FsZXNQYWNrYWdlW10sIHN0YXR1c2VzOiBQYWNrYWdlSXRlbUFjdGl2YXRpb25TdGF0dXNbXSk6IFNhbGVzUGFja2FnZVtdIHtcbiAgaWYgKCFzdGF0dXNlcyB8fCBzdGF0dXNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc2FsZXNQYWNrYWdlcztcbiAgfVxuXG4gIHJldHVybiBzYWxlc1BhY2thZ2VzLm1hcChzYWxlc1BhY2thZ2UgPT4ge1xuICAgIGNvbnN0IG5ld1Byb2R1Y3RzID0gc2FsZXNQYWNrYWdlLnByb2R1Y3RzLm1hcChwcm9kdWN0ID0+IGFkZFN0YXR1c2VzVG9TYWxlc1Byb2R1Y3QocHJvZHVjdCwgc3RhdHVzZXMpKTtcblxuICAgIGNvbnN0IG5ld0FkZG9uc1dpdGhOb1BhcmVudCA9IHNhbGVzUGFja2FnZS5hZGRvbnNXaXRoTm9QYXJlbnQubWFwKGFkZG9uID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGZpbmRTdGF0dXMoc3RhdHVzZXMsIGFkZG9uLmFkZG9uSWQsIGFkZG9uLm11bHRpcGxlQWN0aXZhdGlvbnMpO1xuICAgICAgcmV0dXJuIGFkZFN0YXR1c2VzVG9TYWxlc0FkZG9uKGFkZG9uLCBzdGF0dXMpXG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9kdWN0U3RhdHVzZXMgPSBuZXdQcm9kdWN0c1xuICAgICAgLm1hcChwcm9kdWN0ID0+IHByb2R1Y3QuYWN0aXZhdGlvblN0YXR1cy5zdGF0dXMpO1xuICAgIGNvbnN0IGFkZG9uU3RhdHVzZXMgPSBuZXdQcm9kdWN0c1xuICAgICAgLm1hcChwcm9kdWN0ID0+IHByb2R1Y3QuYWRkb25zID8gcHJvZHVjdC5hZGRvbnMubWFwKGFkZG9uID0+IGFkZG9uLmFjdGl2YXRpb25TdGF0dXMuc3RhdHVzKSA6IFtdKVxuICAgICAgLnJlZHVjZSgoc3RhdHVzTGlzdCwgcmVkdWNlZExpc3QpID0+IHJlZHVjZWRMaXN0LmNvbmNhdChzdGF0dXNMaXN0KSwgW10pO1xuICAgIGNvbnN0IGFkZG9uc1dpdGhOb1BhcmVudFN0YXR1c2VzID0gbmV3QWRkb25zV2l0aE5vUGFyZW50XG4gICAgICAubWFwKGFkZG9uID0+IGFkZG9uLmFjdGl2YXRpb25TdGF0dXMgPyBhZGRvbi5hY3RpdmF0aW9uU3RhdHVzLnN0YXR1cyA6IG51bGwpO1xuICAgIGNvbnN0IGFsbFN0YXR1c2VzID0gWy4uLnByb2R1Y3RTdGF0dXNlcywgLi4uYWRkb25TdGF0dXNlcywgLi4uYWRkb25zV2l0aE5vUGFyZW50U3RhdHVzZXNdO1xuXG4gICAgY29uc3QgcGFja2FnZVN0YXR1cyA9IGNvbnZlcnROdW1iZXJUb0FjdGl2YXRpb25TdGF0dXMoTWF0aC5tYXgoLi4uYWxsU3RhdHVzZXMpKTtcbiAgICBjb25zdCBzdGF0dXNOb3RpZmljYXRpb24gPSBjcmVhdGVTdGF0dXNOb3RpZmljYXRpb25JdGVtRm9yUGFja2FnZShwYWNrYWdlU3RhdHVzKTtcblxuICAgIHJldHVybiBjcmVhdGVTYWxlc1BhY2thZ2VXaXRoU3RhdHVzKHNhbGVzUGFja2FnZSwgbmV3UHJvZHVjdHMsIG5ld0FkZG9uc1dpdGhOb1BhcmVudCwgc3RhdHVzTm90aWZpY2F0aW9uKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRTdGF0dXNlc1RvU2FsZXNQcm9kdWN0KHByb2R1Y3Q6IFNhbGVzUHJvZHVjdCwgc3RhdHVzZXM6IFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdKTogU2FsZXNQcm9kdWN0IHtcbiAgY29uc3QgcHJvZHVjdFN0YXR1cyA9IGZpbmRTdGF0dXMoc3RhdHVzZXMsIHByb2R1Y3QucHJvZHVjdElkLCBmYWxzZSk7XG4gIGNvbnN0IHN0YXR1c05vdGlmaWNhdGlvbiA9IGNyZWF0ZVN0YXR1c05vdGlmaWNhdGlvbkl0ZW1Gb3JQYWNrYWdlSXRlbShwcm9kdWN0U3RhdHVzKTtcbiAgaWYgKCFwcm9kdWN0LmFkZG9ucykge1xuICAgIHJldHVybiBjcmVhdGVTYWxlc1Byb2R1Y3RXaXRoU3RhdHVzKHByb2R1Y3QsIG51bGwsIHN0YXR1c05vdGlmaWNhdGlvbilcbiAgfVxuXG4gIGNvbnN0IG5ld1NhbGVzQWRkb25zID0gcHJvZHVjdC5hZGRvbnMubWFwKGFkZG9uID0+IHtcbiAgICBjb25zdCBhZGRvblN0YXR1cyA9IGZpbmRTdGF0dXMoc3RhdHVzZXMsIGFkZG9uLmFkZG9uSWQsIGFkZG9uLm11bHRpcGxlQWN0aXZhdGlvbnMpO1xuICAgIHJldHVybiBhZGRTdGF0dXNlc1RvU2FsZXNBZGRvbihhZGRvbiwgYWRkb25TdGF0dXMpXG4gIH0pO1xuXG4gIHJldHVybiBjcmVhdGVTYWxlc1Byb2R1Y3RXaXRoU3RhdHVzKHByb2R1Y3QsIG5ld1NhbGVzQWRkb25zLCBzdGF0dXNOb3RpZmljYXRpb24pO1xufVxuXG5mdW5jdGlvbiBhZGRTdGF0dXNlc1RvU2FsZXNBZGRvbihhZGRvbjogU2FsZXNBZGRvbiwgc3RhdHVzOiBBY3RpdmF0aW9uU3RhdHVzKTogU2FsZXNBZGRvbiB7XG4gIGNvbnN0IGFkZG9uU3RhdHVzTm90aWZpY2F0aW9uID0gY3JlYXRlU3RhdHVzTm90aWZpY2F0aW9uSXRlbUZvclBhY2thZ2VJdGVtKHN0YXR1cyk7XG4gIHJldHVybiBjcmVhdGVTYWxlc0FkZG9uV2l0aFN0YXR1cyhhZGRvbiwgYWRkb25TdGF0dXNOb3RpZmljYXRpb24pO1xufVxuXG5mdW5jdGlvbiBmaW5kU3RhdHVzKHN0YXR1c2VzOiBQYWNrYWdlSXRlbUFjdGl2YXRpb25TdGF0dXNbXSwgaWQ6IHN0cmluZywgcmVtb3ZlSW5kZXg6IGJvb2xlYW4pOiBBY3RpdmF0aW9uU3RhdHVzIHtcbiAgaWYgKCFzdGF0dXNlcyB8fCBzdGF0dXNlcy5sZW5ndGggPD0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3Qgc3RhdHVzSW5kZXggPSBzdGF0dXNlcy5maW5kSW5kZXgocyA9PiB7XG4gICAgcmV0dXJuIHMucGFja2FnZUl0ZW1JZCA9PT0gaWQ7XG4gIH0pO1xuICBpZiAoc3RhdHVzSW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgc3RhdHVzID0gc3RhdHVzZXNbc3RhdHVzSW5kZXhdLnN0YXR1cztcbiAgaWYgKHJlbW92ZUluZGV4KSB7XG4gICAgc3RhdHVzZXMuc3BsaWNlKHN0YXR1c0luZGV4LCAxKTtcbiAgfVxuICByZXR1cm4gc3RhdHVzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTdGF0dXNOb3RpZmljYXRpb25JdGVtRm9yUGFja2FnZUl0ZW0oc3RhdHVzOiBBY3RpdmF0aW9uU3RhdHVzKTogU3RhdHVzTm90aWZpY2F0aW9uSXRlbSB7XG4gIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgY2FzZSBBY3RpdmF0aW9uU3RhdHVzLlNVQ0NFU1M6XG4gICAgICByZXR1cm4ge2ljb246ICdjaGVja19jaXJjbGUnLCBzdGF0dXM6IHN0YXR1cywgdGV4dDogJ0FjdGl2YXRlZCd9O1xuICAgIGNhc2UgQWN0aXZhdGlvblN0YXR1cy5XQVJOSU5HOlxuICAgICAgcmV0dXJuIHtpY29uOiAnd2FybmluZycsIHN0YXR1czogc3RhdHVzLCB0ZXh0OiAnQWxyZWFkeSBBY3RpdmF0ZWQnfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtpY29uOiAnZXJyb3InLCBzdGF0dXM6IHN0YXR1cywgdGV4dDogJ0FjdGl2YXRpb24gRXJyb3JzJ307XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU3RhdHVzTm90aWZpY2F0aW9uSXRlbUZvclBhY2thZ2Uoc3RhdHVzOiBBY3RpdmF0aW9uU3RhdHVzKTogU3RhdHVzTm90aWZpY2F0aW9uSXRlbSB7XG4gIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgY2FzZSBBY3RpdmF0aW9uU3RhdHVzLlNVQ0NFU1M6XG4gICAgICByZXR1cm4ge2ljb246ICdjaGVja19jaXJjbGUnLCBzdGF0dXM6IHN0YXR1cywgdGV4dDogJ0FjdGl2YXRlZCd9O1xuICAgIGNhc2UgQWN0aXZhdGlvblN0YXR1cy5XQVJOSU5HOlxuICAgICAgcmV0dXJuIHtpY29uOiAnd2FybmluZycsIHN0YXR1czogc3RhdHVzLCB0ZXh0OiAnQWN0aXZhdGlvbiBXYXJuaW5ncyd9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge2ljb246ICdlcnJvcicsIHN0YXR1czogc3RhdHVzLCB0ZXh0OiAnQWN0aXZhdGlvbiBFcnJvcnMgT2NjdXJlZCd9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnROdW1iZXJUb0FjdGl2YXRpb25TdGF0dXMobnVtYmVyOiBOdW1iZXIpOiBBY3RpdmF0aW9uU3RhdHVzIHtcbiAgc3dpdGNoIChudW1iZXIpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gQWN0aXZhdGlvblN0YXR1cy5TVUNDRVNTO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBBY3RpdmF0aW9uU3RhdHVzLldBUk5JTkc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBBY3RpdmF0aW9uU3RhdHVzLkVSUk9SO1xuICB9XG59XG4iXX0=