/******/ (() => { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ "./src/app/background.ts": /*!*******************************!*\ !*** ./src/app/background.ts ***! \*******************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); /* Background process for the Ichigo extension. * This module should be used to process async work. * Handle failures in a robust manner and avoid the fail-fast pattern, unless in debug mode. */ const chromeApi_1 = __webpack_require__(/*! ../utils/chromeApi */ "./src/utils/chromeApi.ts"); const appConfig_1 = __webpack_require__(/*! ../utils/appConfig */ "./src/utils/appConfig.ts"); const ichigoApi_1 = __webpack_require__(/*! ../utils/ichigoApi */ "./src/utils/ichigoApi.ts"); const translateWithScaling_1 = __webpack_require__(/*! ./translateWithScaling */ "./src/app/translateWithScaling.ts"); const contextMenus_1 = __webpack_require__(/*! ./background/contextMenus */ "./src/app/background/contextMenus.ts"); const fastHash_1 = __webpack_require__(/*! ./utils/fastHash */ "./src/app/utils/fastHash.ts"); (0, contextMenus_1.initContextMenus)(); chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) { handleMessages(message, sender).then(sendResponse); return true; }); const outgoingTranslationRequests = new Set(); function handleMessages(message, sender) { return __awaiter(this, void 0, void 0, function* () { if (!message) { (0, ichigoApi_1.debug)(`Message must not be empty.\n sender:\n ${JSON.stringify(sender)}`); return; } switch (message.kind) { case 'translateImage': const translateErrorMessage = validateImageMessage(message); if (translateErrorMessage) { (0, ichigoApi_1.debug)(`${translateErrorMessage}\n message:\n ${JSON.stringify(message)}`); return; } const imageIdentity = message.translateTo + (0, fastHash_1.fastHash)(message.image.src || message.image.base64Data); // Already translating the image. if (outgoingTranslationRequests.has(imageIdentity)) { return 'FullQueue'; } if (outgoingTranslationRequests.size >= 4) { return 'FullQueue'; } try { outgoingTranslationRequests.add(imageIdentity); const translation = yield (0, translateWithScaling_1.translate)(message.image, message.translateTo, message.includeBase64Data); return translation; } finally { outgoingTranslationRequests.delete(imageIdentity); } case 'translateSnapshot': const snapshotErrorMessage = validateSnapshotMessage(message); if (snapshotErrorMessage) { (0, ichigoApi_1.debug)(`${snapshotErrorMessage}\n message:\n ${JSON.stringify(message)}`); return; } const snapshot = yield takeSnapshot(message.dimensions, sender.tab); if (!snapshot) { return; } const image = { src: snapshot.dataUrl, width: message.dimensions.width, height: message.dimensions.height }; const snapshotTranslation = yield (0, translateWithScaling_1.translate)(image, message.translateTo); // Possibly free up memory. May not have any impact at all, but (probably) doesn't hurt. delete snapshot.dataUrl; return { translations: snapshotTranslation.translations, zoomFactor: snapshot.zoomFactor }; case 'setExtensionIcon': yield doSetExtensionIcon(); return; case 'openLoginPopup': const currentTab = yield (0, chromeApi_1.getCurrentTab)(); chrome.windows.create({ focused: true, width: 376, height: 440, type: 'popup', url: `loginPopup.html?refreshOnCompleteTabId=${currentTab.id}`, top: 0, left: 0 }, () => { }); return; case 'openSettings': chrome.tabs.create({ url: `chrome://extensions/?id=${chrome.runtime.id}` }); return; default: (0, ichigoApi_1.debug)(`Unsupported message kind.\n sender:\n ${JSON.stringify(sender)}\n Received message: \n ${JSON.stringify(message)}`); } }); } // Returns an error message string on error. // undefined means there are no errors. function validateImageMessage(message) { let errorMessage = ''; const image = message.image; if (!image) { return 'translateImage message must set image.'; } if (!image.src && !image.base64Data) { errorMessage += 'translateImage message must set image.src or image.base64Data\n'; } if (!image.height) { errorMessage += 'translateImage message must set image.height\n'; } if (!image.width) { errorMessage += 'translateImage message must set image.width\n'; } if (!message.translateTo) { errorMessage += 'translateImage message must set translateTo\n'; } return errorMessage === '' ? undefined : errorMessage; } // Returns an error message string on error. // undefined means there are no errors. function validateSnapshotMessage(message) { let errorMessage = ''; if (!message.translateTo) { errorMessage += 'Must supply translateTo.\n'; } if (message.dimensions == null) { errorMessage += 'Must supply dimensions of top, left, width, and height.\n'; } else { const dimensions = message.dimensions; if (!Number.isInteger(dimensions.top)) { errorMessage += 'top must be an integer.'; } if (!Number.isInteger(dimensions.left)) { errorMessage += 'left must be an integer.'; } if (!Number.isInteger(dimensions.width)) { errorMessage += 'width must be an integer.'; } if (!Number.isInteger(dimensions.height)) { errorMessage += 'height must be an integer.'; } } return errorMessage === '' ? undefined : errorMessage; } function doSetExtensionIcon() { return __awaiter(this, void 0, void 0, function* () { // Calculate if Manga Translator is active on the current tab. const activeTab = yield (0, chromeApi_1.getCurrentTab)(); const activeUrls = yield appConfig_1.appConfig.getActiveUrls(); if (activeTab && activeUrls.includes(activeTab.getHostName())) { yield (0, chromeApi_1.setExtensionIcon)({ path: chrome.runtime.getURL('icons/128x128.png'), tabId: activeTab.id }); } }); } function takeSnapshot(_a, tab_1) { return __awaiter(this, arguments, void 0, function* ({ top, left, height, width }, tab) { if (tab == null) { return; } const dataUrl = yield (0, chromeApi_1.captureVisibleTab)(tab.windowId); // Something went wrong. Possibly closed tab or refreshed. if (!dataUrl) { return; } const zoomFactor = yield (0, chromeApi_1.getZoomFactor)(tab.id); const dataUrlFetch = yield fetch(dataUrl); const visibleTabBlob = yield dataUrlFetch.blob(); const canvas = new OffscreenCanvas(width, height); const context = canvas.getContext('bitmaprenderer'); const bitmap = yield createImageBitmap(visibleTabBlob, zoomFactor * left, zoomFactor * top, zoomFactor * width, zoomFactor * height); context.transferFromImageBitmap(bitmap); const snippetBlob = yield canvas.convertToBlob(); // WebP is faster than PNG and still lossless. return { dataUrl: yield blobToBase64(snippetBlob), zoomFactor }; }); } function blobToBase64(blob) { return new Promise((resolve, _) => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.readAsDataURL(blob); }); } // Workaround: // https://stackoverflow.com/questions/71724980/chrome-extension-always-show-service-worker-inactive-after-browser-restart-if chrome.runtime.onStartup.addListener(function () { console.log('ichigo-extension-startup'); }); /***/ }), /***/ "./src/app/background/contextMenus.ts": /*!********************************************!*\ !*** ./src/app/background/contextMenus.ts ***! \********************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.initContextMenus = initContextMenus; const chromeApi_1 = __webpack_require__(/*! ../../utils/chromeApi */ "./src/utils/chromeApi.ts"); const appConfig_1 = __webpack_require__(/*! ../../utils/appConfig */ "./src/utils/appConfig.ts"); const m = chrome.i18n.getMessage; const translatedPageMenuId = 'ichigo-translate-page'; function initContextMenus() { return __awaiter(this, void 0, void 0, function* () { // Clear previous context menu to prevent "duplicate context menu" error. yield removeContextMenu(translatedPageMenuId); chrome.contextMenus.create({ id: translatedPageMenuId, title: m('toggleTranslationsContextMenu'), type: 'normal', contexts: ['all'] }); chrome.contextMenus.onClicked.addListener((context) => __awaiter(this, void 0, void 0, function* () { if ((context === null || context === void 0 ? void 0 : context.menuItemId) !== translatedPageMenuId) { return; } const tab = yield (0, chromeApi_1.getCurrentTab)(); if (!tab) { return; } const configActiveUrls = yield appConfig_1.appConfig.getActiveUrls(); const isToggledOn = configActiveUrls.includes(tab.getHostName()); if (isToggledOn) { // Toggle off. yield appConfig_1.appConfig.removeActiveUrl(tab.getHostName()); yield (0, chromeApi_1.setExtensionIcon)({ path: chrome.runtime.getURL('icons/128x128-disabled.png'), tabId: tab.id }); yield (0, chromeApi_1.executeScript)(tab.id, 'js/clearTranslations.js'); } else { // Toggle on. yield appConfig_1.appConfig.addActiveUrl(tab.getHostName()); yield (0, chromeApi_1.setExtensionIcon)({ path: chrome.runtime.getURL('icons/128x128.png'), tabId: tab.id }); } })); }); } function removeContextMenu(menuId) { return new Promise(resolve => { chrome.contextMenus.remove(menuId, () => { if (chrome.runtime.lastError) { // Do nothing if an error occurs. Can happen if menu item doesn't exist. } resolve(undefined); }); }); } /***/ }), /***/ "./src/app/translateWithScaling.ts": /*!*****************************************!*\ !*** ./src/app/translateWithScaling.ts ***! \*****************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.translate = translate; const ichigoApi_1 = __webpack_require__(/*! ../utils/ichigoApi */ "./src/utils/ichigoApi.ts"); const imageUtils_1 = __webpack_require__(/*! ./utils/imageUtils */ "./src/app/utils/imageUtils.ts"); const translation_1 = __webpack_require__(/*! ../utils/translation */ "./src/utils/translation.ts"); const fastHash_1 = __webpack_require__(/*! ./utils/fastHash */ "./src/app/utils/fastHash.ts"); const translationCache = {}; // Note this can only be called from contexts which can make HTTP requests. // For example, `background.ts`. function translate(originalImage, translateTo, includeBase64Data) { return __awaiter(this, void 0, void 0, function* () { let imageToTranslate = originalImage; if (imageToTranslate.base64Data === undefined && originalImage.src) { const fetchedImage = yield fetchImageWithScaling(originalImage); const failed = fetchedImage === 'FetchError' || fetchedImage === 'SiteAccessError'; if (failed) { return fetchedImage; } imageToTranslate = fetchedImage; } // If we couldn't get base64 data from the original image or `fetchImageWithScaling`, return failure. if (imageToTranslate.base64Data === undefined) { return 'FetchError'; } // Cache translations on the MD5 hash of the image data. // The URL is not used as the key because it may return different results depending on various factors. const imageIdentity = translateTo + (0, fastHash_1.fastHash)(imageToTranslate.base64Data); const cachedTranslation = translationCache[imageIdentity]; const result = cachedTranslation || (yield (0, ichigoApi_1.translateImage)(translateTo, imageToTranslate.base64Data)); translationCache[imageIdentity] = result; const base64Data = includeBase64Data && imageToTranslate.base64Data; return { image: { width: imageToTranslate.width, height: imageToTranslate.height }, translations: result.translations, base64Data }; }); } function fetchImageWithScaling(image) { return __awaiter(this, void 0, void 0, function* () { // Downscale extra large images. Helps prevent processing timeouts. const [resizedWidth, resizedHeight] = (0, translation_1.calculateResizedAspectRatio)({ width: image.width, height: image.height, heightMaxPx: 1800, widthMaxPx: 1800 }); (0, ichigoApi_1.debug)(`h:${resizedHeight} w:${resizedWidth}`); const resizedImage = Object.assign(Object.assign({}, image), { originalWidth: image.width, originalHeight: image.height, resizedWidth, resizedHeight }); const encodedImage = yield (0, imageUtils_1.getBase64Data)(resizedImage); return encodedImage; }); } /***/ }), /***/ "./src/app/utils/fastHash.ts": /*!***********************************!*\ !*** ./src/app/utils/fastHash.ts ***! \***********************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.fastHash = fastHash; function fastHash(str) { let hash = ''; const len = str.length; const selectCount = 150; // Select the first 150 characters. for (let i = 0; i < selectCount && i < len; i++) { hash += str.charCodeAt(i); } // Select the last 150 characters. for (let i = len - selectCount; i < len; i++) { if (i >= 0) { hash += str.charCodeAt(i); } } // Loop through the entire string, increasing the index by a slice of 1/1000th the total length const step = Math.ceil(len / 1000) + 1; for (let i = 0; i < len; i += step) { hash += str.charCodeAt(i); } return hash; } /***/ }), /***/ "./src/app/utils/imageUtils.ts": /*!*************************************!*\ !*** ./src/app/utils/imageUtils.ts ***! \*************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getBase64Data = getBase64Data; const ichigoApi_1 = __webpack_require__(/*! ../../utils/ichigoApi */ "./src/utils/ichigoApi.ts"); const utils_1 = __webpack_require__(/*! ./utils */ "./src/app/utils/utils.ts"); function getBase64Data(_a) { return __awaiter(this, arguments, void 0, function* ({ src, resizedWidth, resizedHeight, originalHeight, originalWidth }) { let imageData; try { imageData = yield (0, utils_1.getImage)(src); } catch (error) { // This can happen if the users sets Manga Translator's "Site Access" to "On click", // instead of "On all sites", due to CORS. It can also happen if referer is not properly set, on some domains. return 'SiteAccessError'; } if (!validStatusCode(imageData.status)) { return 'FetchError'; } const blob = yield imageData.blob(); const shouldResize = resizedWidth != originalWidth || resizedHeight != originalHeight; if (shouldResize) { (0, ichigoApi_1.debug)(`resized: ${resizedWidth}/${originalWidth} : ${resizedHeight}/${originalHeight}`); const canvas = new OffscreenCanvas(resizedWidth, resizedHeight); const context = canvas.getContext('bitmaprenderer'); const bitmap = yield createImageBitmap(blob, { resizeWidth: resizedWidth, resizeHeight: resizedHeight, resizeQuality: 'high' }); context.transferFromImageBitmap(bitmap); const resizedBlob = yield canvas.convertToBlob(); const base64Data = yield blobToBase64(resizedBlob); return { base64Data, width: resizedWidth, height: resizedHeight }; } else { const base64Data = yield blobToBase64(blob); return { base64Data, width: originalWidth, height: originalHeight }; } }); } function blobToBase64(blob) { return new Promise((resolve, _) => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.readAsDataURL(blob); }); } function validStatusCode(statusCode) { // See: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes return statusCode >= 200 && statusCode < 400; } /***/ }), /***/ "./src/app/utils/utils.ts": /*!********************************!*\ !*** ./src/app/utils/utils.ts ***! \********************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.sleepMs = sleepMs; exports.getImage = getImage; const chromeApi_1 = __webpack_require__(/*! ../../utils/chromeApi */ "./src/utils/chromeApi.ts"); // A set of common functions that aren't worth grouping alone. // Break module into multiple modules when it grows too large (800+ LOC). function sleepMs(milliseconds) { return new Promise(resolve => setTimeout(resolve, milliseconds)); } const ModifyHeaders = 'modifyHeaders'; const SetHeader = 'set'; const Request = 'xmlhttprequest'; let id = 1; function getId() { return id++; } function getImage(src) { return __awaiter(this, void 0, void 0, function* () { let hostname; try { hostname = new URL(src).hostname; } catch (_a) { hostname = ''; } // Check if hostname matches any of the referer header rule ids. const ruleValues = Object.values(rules); for (const rule of ruleValues) { if (hostname.includes(rule.condition.urlFilter)) { const clonedRule = Object.assign(Object.assign({}, rule), { id: getId() }); (0, chromeApi_1.updateSessionHeaders)({ addRules: [clonedRule] }); const result = yield fetch(src); (0, chromeApi_1.updateSessionHeaders)({ removeRuleIds: [clonedRule.id] }); return result; } } // Otherwise, return regular fetch request. return yield fetch(src); }); } const rules = { pixiv: { id: getId(), priority: 1, action: { type: ModifyHeaders, requestHeaders: [ { header: 'referer', operation: SetHeader, value: 'https://www.pixiv.net/' } ] }, condition: { urlFilter: 'pximg.net', resourceTypes: [Request] } }, manhuagui: { id: getId(), priority: 1, action: { type: ModifyHeaders, requestHeaders: [ { header: 'referer', operation: SetHeader, value: 'https://www.manhuagui.com/' } ] }, condition: { urlFilter: 'i.hamreus.com', resourceTypes: [Request] } }, hitomi: { id: getId(), priority: 1, action: { type: ModifyHeaders, requestHeaders: [ { header: 'referer', operation: SetHeader, value: 'https://hitomi.la/' } ] }, condition: { urlFilter: 'hitomi.la', resourceTypes: [Request] } }, klmanga: { id: getId(), priority: 1, action: { type: ModifyHeaders, requestHeaders: [ { header: 'referer', operation: SetHeader, value: 'https://klmanga.com/' } ] }, condition: { urlFilter: 'klimv1.xyz', resourceTypes: [Request] } } }; /***/ }), /***/ "./src/utils/appConfig.ts": /*!********************************!*\ !*** ./src/utils/appConfig.ts ***! \********************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.appConfig = exports.defaults = void 0; const locales_1 = __webpack_require__(/*! ./locales */ "./src/utils/locales.ts"); const chromeApi_1 = __webpack_require__(/*! ./chromeApi */ "./src/utils/chromeApi.ts"); const uuid_1 = __webpack_require__(/*! uuid */ "./node_modules/uuid/dist/esm-browser/index.js"); var Keys; (function (Keys) { Keys["Email"] = "email"; Keys["FontFamily"] = "fontFamily"; Keys["FontColor"] = "fontColor"; Keys["FontWeight"] = "fontWeight"; Keys["ActiveUrls"] = "activeUrls"; Keys["ClientUuid"] = "clientUuid"; Keys["TranslateToLanguage"] = "translateToLanguage"; })(Keys || (Keys = {})); exports.defaults = Object.freeze({ email: '', fontFamily: 'CC Wild Words', fontColor: '#000000', fontWeight: 'initial', translateToLanguage: (0, locales_1.getDefaultLanguage)() }); // Used to check if any of the activeUrl appConfig properties have been accessed. // This is so defaults can be initialized. // This cannot be done in chrome.runtime.onInstalled due to that event being triggered on chrome updates, // and on app updates. const hasInitActiveUrlDefaults = '_isActiveUrlInitKey'; const commonMangaSites = []; exports.appConfig = Object.freeze({ getClientUuid: () => __awaiter(void 0, void 0, void 0, function* () { const clientUuid = yield (0, chromeApi_1.getStorageItem)(Keys.ClientUuid); if (clientUuid) { return clientUuid; } // Initialize client uuid. // If storage is full, this could fail repeatedly, but client uuids are not crucial. const newUuid = (0, uuid_1.v4)(); yield (0, chromeApi_1.setStorageItem)(Keys.ClientUuid, newUuid); return newUuid; }), getEmail: () => __awaiter(void 0, void 0, void 0, function* () { var _a; return (_a = (yield (0, chromeApi_1.getStorageItem)(Keys.Email))) !== null && _a !== void 0 ? _a : exports.defaults.email; }), setEmail: (email) => __awaiter(void 0, void 0, void 0, function* () { return yield (0, chromeApi_1.setStorageItem)(Keys.Email, email); }), // Returns the language code of the language to translate to. Eg 'en', 'ja', 'zh-CN', .. getTranslateToLanguage: () => __awaiter(void 0, void 0, void 0, function* () { const translateToLanguage = yield (0, chromeApi_1.getStorageItem)(Keys.TranslateToLanguage); if (!translateToLanguage) { return (0, locales_1.getDefaultLanguage)(); } return translateToLanguage; }), setTranslateToLanguage: (languageCode) => __awaiter(void 0, void 0, void 0, function* () { if (!locales_1.languageCodes.includes(languageCode)) { console.warn(`Invalid language code: ${languageCode}. Overwriting with default.`); languageCode = (0, locales_1.getDefaultLanguage)(); } return yield (0, chromeApi_1.setStorageItem)(Keys.TranslateToLanguage, languageCode); }), getUIFontFamily: () => { const language = navigator.language.split('-')[0]; switch (language) { // No font file at the moment for these: use whatever the default font is. case 'hi': case 'th': case 'ja': case 'ko': case 'zh': case 'vi': case 'ar': return 'system-default'; default: return 'PatrickHand-Regular'; } }, getFontFamily: () => __awaiter(void 0, void 0, void 0, function* () { var _a; const fontFamily = (_a = (yield (0, chromeApi_1.getStorageItem)(Keys.FontFamily))) !== null && _a !== void 0 ? _a : exports.defaults.fontFamily; const language = yield exports.appConfig.getTranslateToLanguage(); switch (language) { // These languages are unsupported for the usual font options. case 'hi': case 'th': case 'ja': case 'ko': case 'zh-CN': case 'zh-TW': case 'vi': case 'ar': return 'system-default'; default: return fontFamily; } }), setFontFamily: (fontFamily) => __awaiter(void 0, void 0, void 0, function* () { return yield (0, chromeApi_1.setStorageItem)(Keys.FontFamily, fontFamily); }), getFontColor: () => __awaiter(void 0, void 0, void 0, function* () { var _a; return (_a = (yield (0, chromeApi_1.getStorageItem)(Keys.FontColor))) !== null && _a !== void 0 ? _a : exports.defaults.fontColor; }), setFontColor: (fontColor) => __awaiter(void 0, void 0, void 0, function* () { return yield (0, chromeApi_1.setStorageItem)(Keys.FontColor, fontColor); }), getFontWeight: () => __awaiter(void 0, void 0, void 0, function* () { var _a; return (_a = (yield (0, chromeApi_1.getStorageItem)(Keys.FontWeight))) !== null && _a !== void 0 ? _a : exports.defaults.fontWeight; }), setFontWeight: (fontWeight) => __awaiter(void 0, void 0, void 0, function* () { return yield (0, chromeApi_1.setStorageItem)(Keys.FontWeight, fontWeight); }), getActiveUrls: () => __awaiter(void 0, void 0, void 0, function* () { var _a; const hasInitDefaults = yield (0, chromeApi_1.getStorageItem)(hasInitActiveUrlDefaults); if (!hasInitDefaults) { yield (0, chromeApi_1.setStorageItem)(Keys.ActiveUrls, commonMangaSites); yield (0, chromeApi_1.setStorageItem)(hasInitActiveUrlDefaults, true); } return (_a = (yield (0, chromeApi_1.getStorageItem)(Keys.ActiveUrls))) !== null && _a !== void 0 ? _a : []; }), addActiveUrl: (activeUrl) => __awaiter(void 0, void 0, void 0, function* () { var _a; const hasInitDefaults = yield (0, chromeApi_1.getStorageItem)(hasInitActiveUrlDefaults); if (!hasInitDefaults) { yield (0, chromeApi_1.setStorageItem)(Keys.ActiveUrls, commonMangaSites); yield (0, chromeApi_1.setStorageItem)(hasInitActiveUrlDefaults, true); } const activeUrls = (_a = (yield (0, chromeApi_1.getStorageItem)(Keys.ActiveUrls))) !== null && _a !== void 0 ? _a : []; return yield (0, chromeApi_1.setStorageItem)(Keys.ActiveUrls, [...activeUrls, activeUrl]); }), removeActiveUrl: (activeUrl) => __awaiter(void 0, void 0, void 0, function* () { var _a; const hasInitDefaults = yield (0, chromeApi_1.getStorageItem)(hasInitActiveUrlDefaults); if (!hasInitDefaults) { yield (0, chromeApi_1.setStorageItem)(Keys.ActiveUrls, commonMangaSites); yield (0, chromeApi_1.setStorageItem)(hasInitActiveUrlDefaults, true); } const activeUrls = (_a = (yield (0, chromeApi_1.getStorageItem)(Keys.ActiveUrls))) !== null && _a !== void 0 ? _a : []; return yield (0, chromeApi_1.setStorageItem)(Keys.ActiveUrls, activeUrls.filter(url => url !== activeUrl)); }) }); /***/ }), /***/ "./src/utils/chromeApi.ts": /*!********************************!*\ !*** ./src/utils/chromeApi.ts ***! \********************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getCurrentTab = getCurrentTab; exports.updateSessionHeaders = updateSessionHeaders; exports.captureVisibleTab = captureVisibleTab; exports.getZoomFactor = getZoomFactor; exports.setExtensionIcon = setExtensionIcon; exports.executeScript = executeScript; exports.isAllowedFileSchemeAccess = isAllowedFileSchemeAccess; exports.postBackgroundMessage = postBackgroundMessage; exports.getStorageItem = getStorageItem; exports.setStorageItem = setStorageItem; // Module for making working with the Chrome API easier. // This may include making the API async, simplifying the interface, or more. function getCurrentTab() { return new Promise(resolve => { chrome.tabs.query({ currentWindow: true, active: true }, function (tabs) { if (chrome.runtime.lastError) { resolve(undefined); return; } const currentTab = tabs[0]; if (!(currentTab === null || currentTab === void 0 ? void 0 : currentTab.url)) { resolve(undefined); return; } currentTab.getHostName = () => { try { return new URL(currentTab.url).hostname; } catch (_a) { return ''; } }; resolve(currentTab); }); }); } function updateSessionHeaders(ruleOptions) { return new Promise(resolve => { chrome.declarativeNetRequest.updateSessionRules(ruleOptions, resolve); }); } // Window ID of tab to capture, eg getCurrentTab().windowId; function captureVisibleTab(windowId) { return new Promise(resolve => chrome.tabs.captureVisibleTab(windowId, { format: 'png' }, resolve)); } function getZoomFactor(tabId) { return new Promise(resolve => chrome.tabs.getZoom(tabId, resolve)); } function setExtensionIcon(icon) { return new Promise(resolve => { chrome.action.setIcon(icon, () => { resolve(true); }); }); } function executeScript(tabId, filePath, allFrames) { return new Promise(resolve => { chrome.scripting.executeScript({ target: { tabId, allFrames: allFrames !== null && allFrames !== void 0 ? allFrames : true }, files: [filePath] }, () => { resolve(true); }); }); } function isAllowedFileSchemeAccess() { return new Promise(resolve => { chrome.extension.isAllowedFileSchemeAccess(resolve); }); } function postBackgroundMessage(message) { const extensionId = undefined; // undefined means send to self, instead of another extension. const options = undefined; return new Promise(resolve => { chrome.runtime.sendMessage(extensionId, message, options, resolve); }); } function getStorageItem(key) { const formattedKey = formatKey(key); return new Promise(resolve => { try { chrome.storage.local.get([formattedKey], function (result) { resolve(result[formattedKey]); }); } catch (_a) { // Do nothing if cache fails. resolve(undefined); } }); } function setStorageItem(key, value) { const formattedKey = formatKey(key); return new Promise(resolve => { try { chrome.storage.local.set({ [formattedKey]: value }, () => { resolve(true); }); } catch (_a) { // Do nothing if cache fails. resolve(false); } }); } function formatKey(key) { const keyPrefix = 'app'; return `${keyPrefix}-${key}`; } /***/ }), /***/ "./src/utils/ichigoApi.ts": /*!********************************!*\ !*** ./src/utils/ichigoApi.ts ***! \********************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SignupStatus = exports.LoginStatus = exports.baseUrl = void 0; exports.getCurrentUser = getCurrentUser; exports.login = login; exports.logout = logout; exports.signup = signup; exports.submitFeedback = submitFeedback; exports.translateImage = translateImage; exports.debug = debug; const appConfig_1 = __webpack_require__(/*! ./appConfig */ "./src/utils/appConfig.ts"); // If set to true, use local implementations and turn on logging. const isDebug = false; exports.baseUrl = isDebug ? 'http://localhost:8080' : 'https://ichigoreader.com'; var StatusCode; (function (StatusCode) { StatusCode[StatusCode["Ok"] = 200] = "Ok"; StatusCode[StatusCode["Created"] = 201] = "Created"; StatusCode[StatusCode["NoContent"] = 204] = "NoContent"; StatusCode[StatusCode["Forbidden"] = 403] = "Forbidden"; StatusCode[StatusCode["NotFound"] = 404] = "NotFound"; StatusCode[StatusCode["TooManyRequests"] = 429] = "TooManyRequests"; StatusCode[StatusCode["InternalServerError"] = 500] = "InternalServerError"; })(StatusCode || (StatusCode = {})); function getCurrentUser() { return __awaiter(this, void 0, void 0, function* () { const clientUuid = yield appConfig_1.appConfig.getClientUuid(); const request = yield fetch(`${exports.baseUrl}/metrics?clientUuid=${clientUuid}&fingerprint=${getFingerprint()}`, { method: 'GET', headers: { 'Content-Type': 'application/json' } }); if (request.status !== StatusCode.Ok) { throw new Error('Failed to retrieve user.'); } return (yield request.json()); }); } var LoginStatus; (function (LoginStatus) { LoginStatus[LoginStatus["Unknown"] = 0] = "Unknown"; LoginStatus[LoginStatus["UnknownEmail"] = 1] = "UnknownEmail"; LoginStatus[LoginStatus["BadPassword"] = 2] = "BadPassword"; LoginStatus[LoginStatus["Success"] = 3] = "Success"; })(LoginStatus || (exports.LoginStatus = LoginStatus = {})); function login(email, password) { return __awaiter(this, void 0, void 0, function* () { const request = yield fetch(`${exports.baseUrl}/auth/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, password }) }); if (request.status === StatusCode.NotFound) { return LoginStatus.UnknownEmail; } if (request.status === StatusCode.Forbidden) { return LoginStatus.BadPassword; } return request.status === StatusCode.Ok ? LoginStatus.Success : LoginStatus.Unknown; }); } function logout() { return __awaiter(this, void 0, void 0, function* () { const request = yield fetch(`${exports.baseUrl}/auth/logout`, { method: 'POST', headers: { 'Content-Type': 'application/json' } }); return request.status === StatusCode.NoContent; }); } var SignupStatus; (function (SignupStatus) { SignupStatus[SignupStatus["Unknown"] = 0] = "Unknown"; SignupStatus[SignupStatus["Success"] = 1] = "Success"; SignupStatus[SignupStatus["EmailTaken"] = 2] = "EmailTaken"; })(SignupStatus || (exports.SignupStatus = SignupStatus = {})); function signup(email, password) { return __awaiter(this, void 0, void 0, function* () { const request = yield fetch(`${exports.baseUrl}/signup`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, password }) }); if (request.status === StatusCode.Forbidden) { return SignupStatus.EmailTaken; } return request.status === StatusCode.Created ? SignupStatus.Success : SignupStatus.Unknown; }); } function submitFeedback(text) { return __awaiter(this, void 0, void 0, function* () { const request = yield fetch(`${exports.baseUrl}/feedback`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text }) }); return request.status === StatusCode.Created; }); } function translateImage(translateTo, base64Image) { return __awaiter(this, void 0, void 0, function* () { const clientUuid = yield appConfig_1.appConfig.getClientUuid(); const request = yield fetch(`${exports.baseUrl}/translate`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ base64Images: [base64Image], clientUuid: clientUuid, targetLangCode: translateTo, fingerprint: getFingerprint() }) }); if (request.status === StatusCode.InternalServerError) { const errorMessage = 'Server is down or experiencing issues. Sorry for the inconvenience.'; return { errorMessage, translations: [ { originalLanguage: 'Unknown', translatedText: errorMessage, minX: 0, minY: 0, maxX: 200, maxY: 200 } ] }; } if (request.status === StatusCode.TooManyRequests) { const errorMessage = 'Out of translations. Server costs are expensive. Upgrade for more!'; return { errorMessage, translations: [ { originalLanguage: 'Unknown', translatedText: errorMessage, minX: 0, minY: 0, maxX: 200, maxY: 200 } ] }; } const results = yield request.json(); return { translations: results.images[0] }; }); } function debug(message) { if (isDebug) { console.log(message); } } let fingerprint = null; // Do not access this directly, use getFingerprint(). function getFingerprint() { if (fingerprint) { return fingerprint; } // Initialize fingerprint. const webGlRenderer = getWebGlRenderer(); const hardware = getHardware(); const connectionString = getConnectionString(); const timezoneCode = new Date().getTimezoneOffset(); fingerprint = btoa(`${webGlRenderer}-${hardware}-${connectionString}-${timezoneCode}`); return fingerprint; } function getWebGlRenderer() { const gl = new OffscreenCanvas(0, 0).getContext('webgl'); if (!gl) { return 'none'; } const debugInfo = gl.getExtension('WEBGL_debug_renderer_info'); return debugInfo ? gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) : 'unknown'; } function getHardware() { const hardwareConcurrency = navigator === null || navigator === void 0 ? void 0 : navigator.hardwareConcurrency; const deviceMemory = navigator['deviceMemory']; return `${hardwareConcurrency}-${deviceMemory}`; } function getConnectionString() { var _a, _b, _c, _d, _e; const type = (_a = navigator['connection']) === null || _a === void 0 ? void 0 : _a.type; const rtt = (_b = navigator['connection']) === null || _b === void 0 ? void 0 : _b.rtt; const downlinkMax = (_c = navigator['connection']) === null || _c === void 0 ? void 0 : _c.downlinkMax; const effectiveType = (_d = navigator['connection']) === null || _d === void 0 ? void 0 : _d.effectiveType; const saveData = (_e = navigator['connection']) === null || _e === void 0 ? void 0 : _e.saveData; return `${type}-${rtt}-${downlinkMax}-${effectiveType}-${saveData}`; } /***/ }), /***/ "./src/utils/locales.ts": /*!******************************!*\ !*** ./src/utils/locales.ts ***! \******************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.languageCodes = void 0; exports.getDefaultLanguage = getDefaultLanguage; exports.getDisplayString = getDisplayString; const m = chrome.i18n.getMessage; exports.languageCodes = [ 'ar', 'de', 'en', 'es', 'fr', 'hi', 'id', 'it', 'ja', 'ko', 'pt-BR', 'pt-PT', 'th', 'vi', 'zh-CN', 'zh-TW' ]; function getDefaultLanguage() { const fullLang = navigator.language; const shortLang = navigator.language.split('-')[0]; const firstShortLang = exports.languageCodes.find(lang => lang.startsWith(shortLang)); if (exports.languageCodes.includes(fullLang)) { return fullLang; } else if (firstShortLang) { return firstShortLang; } else { return 'en'; } } function getDisplayString(languageCode) { switch (languageCode) { case 'ar': return m('translateToArabicLabel'); case 'de': return m('translateToGermanLabel'); case 'en': return m('translateToEnglishLabel'); case 'es': return m('translateToSpanishLabel'); case 'fr': return m('translateToFrenchLabel'); case 'hi': return m('translateToHindiLabel'); case 'id': return m('translateToIndonesianLabel'); case 'it': return m('translateToItalianLabel'); case 'ja': return m('translateToJapaneseLabel'); case 'ko': return m('translateToKoreanLabel'); case 'pt-BR': return m('translateToBrazilianPortugueseLabel'); case 'pt-PT': return m('translateToPortugueseLabel'); case 'th': return m('translateToThaiLabel'); case 'vi': return m('translateToVietnameseLabel'); case 'zh-CN': return m('translateToChineseSimplifiedLabel'); case 'zh-TW': return m('translateToChineseTraditionalLabel'); default: return 'Unknown'; } } /***/ }), /***/ "./src/utils/translation.ts": /*!**********************************!*\ !*** ./src/utils/translation.ts ***! \**********************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.scaleTranslation = scaleTranslation; exports.calculateResizedAspectRatio = calculateResizedAspectRatio; function scaleTranslation(targetWidth, targetHeight, originalWidth, originalHeight, result) { const scaleX = targetWidth / originalWidth; const scaleY = targetHeight / originalHeight; return Object.assign(Object.assign({}, result), { minX: Math.round(scaleX * result.minX), minY: Math.round(scaleY * result.minY), maxX: Math.round(scaleX * result.maxX), maxY: Math.round(scaleY * result.maxY) }); } function calculateResizedAspectRatio(params) { const { width, height, widthMaxPx, heightMaxPx } = params; // `alreadyWithinBounds` intentionally uses `||` instead of `&&`, // so that images slightly over bounds are likely not touched. // Although experimenting with `&&` instead of `|| may be viable. const alreadyWithinBounds = width <= widthMaxPx || height <= heightMaxPx; if (alreadyWithinBounds) { return [width, height]; } // `Math.max` (vs `Math.min`) is intentionally used to favor larger images. const resizedAspectRatio = Math.max(heightMaxPx / height, widthMaxPx / width); return [Math.round(width * resizedAspectRatio), Math.round(height * resizedAspectRatio)]; } /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/index.js": /*!*****************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/index.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ NIL: () => (/* reexport safe */ _nil_js__WEBPACK_IMPORTED_MODULE_4__["default"]), /* harmony export */ parse: () => (/* reexport safe */ _parse_js__WEBPACK_IMPORTED_MODULE_8__["default"]), /* harmony export */ stringify: () => (/* reexport safe */ _stringify_js__WEBPACK_IMPORTED_MODULE_7__["default"]), /* harmony export */ v1: () => (/* reexport safe */ _v1_js__WEBPACK_IMPORTED_MODULE_0__["default"]), /* harmony export */ v3: () => (/* reexport safe */ _v3_js__WEBPACK_IMPORTED_MODULE_1__["default"]), /* harmony export */ v4: () => (/* reexport safe */ _v4_js__WEBPACK_IMPORTED_MODULE_2__["default"]), /* harmony export */ v5: () => (/* reexport safe */ _v5_js__WEBPACK_IMPORTED_MODULE_3__["default"]), /* harmony export */ validate: () => (/* reexport safe */ _validate_js__WEBPACK_IMPORTED_MODULE_6__["default"]), /* harmony export */ version: () => (/* reexport safe */ _version_js__WEBPACK_IMPORTED_MODULE_5__["default"]) /* harmony export */ }); /* harmony import */ var _v1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v1.js */ "./node_modules/uuid/dist/esm-browser/v1.js"); /* harmony import */ var _v3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v3.js */ "./node_modules/uuid/dist/esm-browser/v3.js"); /* harmony import */ var _v4_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v4.js */ "./node_modules/uuid/dist/esm-browser/v4.js"); /* harmony import */ var _v5_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v5.js */ "./node_modules/uuid/dist/esm-browser/v5.js"); /* harmony import */ var _nil_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./nil.js */ "./node_modules/uuid/dist/esm-browser/nil.js"); /* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./version.js */ "./node_modules/uuid/dist/esm-browser/version.js"); /* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./validate.js */ "./node_modules/uuid/dist/esm-browser/validate.js"); /* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./stringify.js */ "./node_modules/uuid/dist/esm-browser/stringify.js"); /* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./parse.js */ "./node_modules/uuid/dist/esm-browser/parse.js"); /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/md5.js": /*!***************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/md5.js ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* * Browser-compatible JavaScript MD5 * * Modification of JavaScript MD5 * https://github.com/blueimp/JavaScript-MD5 * * Copyright 2011, Sebastian Tschan * https://blueimp.net * * Licensed under the MIT license: * https://opensource.org/licenses/MIT * * Based on * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algorithm, as defined in RFC 1321. * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * Distributed under the BSD License * See http://pajhome.org.uk/crypt/md5 for more info. */ function md5(bytes) { if (typeof bytes === 'string') { var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape bytes = new Uint8Array(msg.length); for (var i = 0; i < msg.length; ++i) { bytes[i] = msg.charCodeAt(i); } } return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8)); } /* * Convert an array of little-endian words to an array of bytes */ function md5ToHexEncodedArray(input) { var output = []; var length32 = input.length * 32; var hexTab = '0123456789abcdef'; for (var i = 0; i < length32; i += 8) { var x = input[i >> 5] >>> i % 32 & 0xff; var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16); output.push(hex); } return output; } /** * Calculate output length with padding and bit length */ function getOutputLength(inputLength8) { return (inputLength8 + 64 >>> 9 << 4) + 14 + 1; } /* * Calculate the MD5 of an array of little-endian words, and a bit length. */ function wordsToMd5(x, len) { /* append padding */ x[len >> 5] |= 0x80 << len % 32; x[getOutputLength(len) - 1] = len; var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; for (var i = 0; i < x.length; i += 16) { var olda = a; var oldb = b; var oldc = c; var oldd = d; a = md5ff(a, b, c, d, x[i], 7, -680876936); d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); c = md5ff(c, d, a, b, x[i + 10], 17, -42063); b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); b = md5gg(b, c, d, a, x[i], 20, -373897302); a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); a = md5hh(a, b, c, d, x[i + 5], 4, -378558); d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); d = md5hh(d, a, b, c, x[i], 11, -358537222); c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); a = md5ii(a, b, c, d, x[i], 6, -198630844); d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); a = safeAdd(a, olda); b = safeAdd(b, oldb); c = safeAdd(c, oldc); d = safeAdd(d, oldd); } return [a, b, c, d]; } /* * Convert an array bytes to an array of little-endian words * Characters >255 have their high-byte silently ignored. */ function bytesToWords(input) { if (input.length === 0) { return []; } var length8 = input.length * 8; var output = new Uint32Array(getOutputLength(length8)); for (var i = 0; i < length8; i += 8) { output[i >> 5] |= (input[i / 8] & 0xff) << i % 32; } return output; } /* * Add integers, wrapping at 2^32. This uses 16-bit operations internally * to work around bugs in some JS interpreters. */ function safeAdd(x, y) { var lsw = (x & 0xffff) + (y & 0xffff); var msw = (x >> 16) + (y >> 16) + (lsw >> 16); return msw << 16 | lsw & 0xffff; } /* * Bitwise rotate a 32-bit number to the left. */ function bitRotateLeft(num, cnt) { return num << cnt | num >>> 32 - cnt; } /* * These functions implement the four basic operations the algorithm uses. */ function md5cmn(q, a, b, x, s, t) { return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); } function md5ff(a, b, c, d, x, s, t) { return md5cmn(b & c | ~b & d, a, b, x, s, t); } function md5gg(a, b, c, d, x, s, t) { return md5cmn(b & d | c & ~d, a, b, x, s, t); } function md5hh(a, b, c, d, x, s, t) { return md5cmn(b ^ c ^ d, a, b, x, s, t); } function md5ii(a, b, c, d, x, s, t) { return md5cmn(c ^ (b | ~d), a, b, x, s, t); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (md5); /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/nil.js": /*!***************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/nil.js ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ('00000000-0000-0000-0000-000000000000'); /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/parse.js": /*!*****************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/parse.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "./node_modules/uuid/dist/esm-browser/validate.js"); function parse(uuid) { if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { throw TypeError('Invalid UUID'); } var v; var arr = new Uint8Array(16); // Parse ########-....-....-....-............ arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; arr[1] = v >>> 16 & 0xff; arr[2] = v >>> 8 & 0xff; arr[3] = v & 0xff; // Parse ........-####-....-....-............ arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; arr[5] = v & 0xff; // Parse ........-....-####-....-............ arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; arr[7] = v & 0xff; // Parse ........-....-....-####-............ arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; arr[9] = v & 0xff; // Parse ........-....-....-....-############ // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes) arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff; arr[11] = v / 0x100000000 & 0xff; arr[12] = v >>> 24 & 0xff; arr[13] = v >>> 16 & 0xff; arr[14] = v >>> 8 & 0xff; arr[15] = v & 0xff; return arr; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (parse); /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/regex.js": /*!*****************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/regex.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i); /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/rng.js": /*!***************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/rng.js ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ rng) /* harmony export */ }); // Unique ID creation requires a high quality random # generator. In the browser we therefore // require the crypto API and do not support built-in fallback to lower quality random number // generators (like Math.random()). var getRandomValues; var rnds8 = new Uint8Array(16); function rng() { // lazy load so that environments that need to polyfill have a chance to do so if (!getRandomValues) { // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also, // find the complete implementation of crypto (msCrypto) on IE11. getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto); if (!getRandomValues) { throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); } } return getRandomValues(rnds8); } /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/sha1.js": /*!****************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/sha1.js ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); // Adapted from Chris Veness' SHA1 code at // http://www.movable-type.co.uk/scripts/sha1.html function f(s, x, y, z) { switch (s) { case 0: return x & y ^ ~x & z; case 1: return x ^ y ^ z; case 2: return x & y ^ x & z ^ y & z; case 3: return x ^ y ^ z; } } function ROTL(x, n) { return x << n | x >>> 32 - n; } function sha1(bytes) { var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; if (typeof bytes === 'string') { var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape bytes = []; for (var i = 0; i < msg.length; ++i) { bytes.push(msg.charCodeAt(i)); } } else if (!Array.isArray(bytes)) { // Convert Array-like to Array bytes = Array.prototype.slice.call(bytes); } bytes.push(0x80); var l = bytes.length / 4 + 2; var N = Math.ceil(l / 16); var M = new Array(N); for (var _i = 0; _i < N; ++_i) { var arr = new Uint32Array(16); for (var j = 0; j < 16; ++j) { arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3]; } M[_i] = arr; } M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32); M[N - 1][14] = Math.floor(M[N - 1][14]); M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff; for (var _i2 = 0; _i2 < N; ++_i2) { var W = new Uint32Array(80); for (var t = 0; t < 16; ++t) { W[t] = M[_i2][t]; } for (var _t = 16; _t < 80; ++_t) { W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1); } var a = H[0]; var b = H[1]; var c = H[2]; var d = H[3]; var e = H[4]; for (var _t2 = 0; _t2 < 80; ++_t2) { var s = Math.floor(_t2 / 20); var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0; e = d; d = c; c = ROTL(b, 30) >>> 0; b = a; a = T; } H[0] = H[0] + a >>> 0; H[1] = H[1] + b >>> 0; H[2] = H[2] + c >>> 0; H[3] = H[3] + d >>> 0; H[4] = H[4] + e >>> 0; } return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff]; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (sha1); /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/stringify.js": /*!*********************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/stringify.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "./node_modules/uuid/dist/esm-browser/validate.js"); /** * Convert array of 16 byte values to UUID string format of the form: * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX */ var byteToHex = []; for (var i = 0; i < 256; ++i) { byteToHex.push((i + 0x100).toString(16).substr(1)); } function stringify(arr) { var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; // Note: Be careful editing this code! It's been tuned for performance // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one // of the following: // - One or more input array values don't map to a hex octet (leading to // "undefined" in the uuid) // - Invalid input values for the RFC `version` or `variant` fields if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { throw TypeError('Stringified UUID is invalid'); } return uuid; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (stringify); /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/v1.js": /*!**************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/v1.js ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ "./node_modules/uuid/dist/esm-browser/rng.js"); /* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "./node_modules/uuid/dist/esm-browser/stringify.js"); // **`v1()` - Generate time-based UUID** // // Inspired by https://github.com/LiosK/UUID.js // and http://docs.python.org/library/uuid.html var _nodeId; var _clockseq; // Previous uuid creation time var _lastMSecs = 0; var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details function v1(options, buf, offset) { var i = buf && offset || 0; var b = buf || new Array(16); options = options || {}; var node = options.node || _nodeId; var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not // specified. We do this lazily to minimize issues related to insufficient // system entropy. See #189 if (node == null || clockseq == null) { var seedBytes = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); if (node == null) { // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]]; } if (clockseq == null) { // Per 4.2.2, randomize (14 bit) clockseq clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; } } // UUID timestamps are 100 nano-second units since the Gregorian epoch, // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock // cycle to simulate higher resolution clock var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression if (dt < 0 && options.clockseq === undefined) { clockseq = clockseq + 1 & 0x3fff; } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new // time interval if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { nsecs = 0; } // Per 4.2.1.2 Throw error if too many uuids are requested if (nsecs >= 10000) { throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); } _lastMSecs = msecs; _lastNSecs = nsecs; _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch msecs += 12219292800000; // `time_low` var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; b[i++] = tl >>> 24 & 0xff; b[i++] = tl >>> 16 & 0xff; b[i++] = tl >>> 8 & 0xff; b[i++] = tl & 0xff; // `time_mid` var tmh = msecs / 0x100000000 * 10000 & 0xfffffff; b[i++] = tmh >>> 8 & 0xff; b[i++] = tmh & 0xff; // `time_high_and_version` b[i++] = tmh >>> 24 & 0xf | 0x10; // include version b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` b[i++] = clockseq & 0xff; // `node` for (var n = 0; n < 6; ++n) { b[i + n] = node[n]; } return buf || (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v1); /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/v3.js": /*!**************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/v3.js ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ "./node_modules/uuid/dist/esm-browser/v35.js"); /* harmony import */ var _md5_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./md5.js */ "./node_modules/uuid/dist/esm-browser/md5.js"); var v3 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__["default"])('v3', 0x30, _md5_js__WEBPACK_IMPORTED_MODULE_1__["default"]); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v3); /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/v35.js": /*!***************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/v35.js ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DNS: () => (/* binding */ DNS), /* harmony export */ URL: () => (/* binding */ URL), /* harmony export */ "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "./node_modules/uuid/dist/esm-browser/stringify.js"); /* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./parse.js */ "./node_modules/uuid/dist/esm-browser/parse.js"); function stringToBytes(str) { str = unescape(encodeURIComponent(str)); // UTF8 escape var bytes = []; for (var i = 0; i < str.length; ++i) { bytes.push(str.charCodeAt(i)); } return bytes; } var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(name, version, hashfunc) { function generateUUID(value, namespace, buf, offset) { if (typeof value === 'string') { value = stringToBytes(value); } if (typeof namespace === 'string') { namespace = (0,_parse_js__WEBPACK_IMPORTED_MODULE_0__["default"])(namespace); } if (namespace.length !== 16) { throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); } // Compute hash of namespace and value, Per 4.3 // Future: Use spread syntax when supported on all platforms, e.g. `bytes = // hashfunc([...namespace, ... value])` var bytes = new Uint8Array(16 + value.length); bytes.set(namespace); bytes.set(value, namespace.length); bytes = hashfunc(bytes); bytes[6] = bytes[6] & 0x0f | version; bytes[8] = bytes[8] & 0x3f | 0x80; if (buf) { offset = offset || 0; for (var i = 0; i < 16; ++i) { buf[offset + i] = bytes[i]; } return buf; } return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bytes); } // Function#name is not settable on some platforms (#270) try { generateUUID.name = name; // eslint-disable-next-line no-empty } catch (err) {} // For CommonJS default export support generateUUID.DNS = DNS; generateUUID.URL = URL; return generateUUID; } /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/v4.js": /*!**************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/v4.js ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ "./node_modules/uuid/dist/esm-browser/rng.js"); /* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "./node_modules/uuid/dist/esm-browser/stringify.js"); function v4(options, buf, offset) { options = options || {}; var rnds = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` rnds[6] = rnds[6] & 0x0f | 0x40; rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided if (buf) { offset = offset || 0; for (var i = 0; i < 16; ++i) { buf[offset + i] = rnds[i]; } return buf; } return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(rnds); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v4); /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/v5.js": /*!**************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/v5.js ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ "./node_modules/uuid/dist/esm-browser/v35.js"); /* harmony import */ var _sha1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sha1.js */ "./node_modules/uuid/dist/esm-browser/sha1.js"); var v5 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__["default"])('v5', 0x50, _sha1_js__WEBPACK_IMPORTED_MODULE_1__["default"]); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v5); /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/validate.js": /*!********************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/validate.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _regex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./regex.js */ "./node_modules/uuid/dist/esm-browser/regex.js"); function validate(uuid) { return typeof uuid === 'string' && _regex_js__WEBPACK_IMPORTED_MODULE_0__["default"].test(uuid); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (validate); /***/ }), /***/ "./node_modules/uuid/dist/esm-browser/version.js": /*!*******************************************************!*\ !*** ./node_modules/uuid/dist/esm-browser/version.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "./node_modules/uuid/dist/esm-browser/validate.js"); function version(uuid) { if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { throw TypeError('Invalid UUID'); } return parseInt(uuid.substr(14, 1), 16); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (version); /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ (() => { /******/ // define __esModule on exports /******/ __webpack_require__.r = (exports) => { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ })(); /******/ /************************************************************************/ /******/ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module is referenced by other modules so it can't be inlined /******/ var __webpack_exports__ = __webpack_require__("./src/app/background.ts"); /******/ /******/ })() ; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7K0ZBRStGO0FBQy9GLDhGQUs0QjtBQUM1Qiw4RkFBK0M7QUFDL0MsOEZBQTJDO0FBQzNDLHNIQUFtRDtBQUNuRCxvSEFBNkQ7QUFDN0QsOEZBQTRDO0FBRTVDLG1DQUFnQixHQUFFLENBQUM7QUFFbkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZO0lBQzNFLGNBQWMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ25ELE9BQU8sSUFBSSxDQUFDO0FBQ2IsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLDJCQUEyQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFFdEQsU0FBZSxjQUFjLENBQUMsT0FBTyxFQUFFLE1BQW9DOztRQUMxRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZCxxQkFBSyxFQUFDLDBDQUEwQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxRSxPQUFPO1FBQ1IsQ0FBQztRQUVELFFBQVEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3RCLEtBQUssZ0JBQWdCO2dCQUNwQixNQUFNLHFCQUFxQixHQUFHLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLHFCQUFxQixFQUFFLENBQUM7b0JBQzNCLHFCQUFLLEVBQUMsR0FBRyxxQkFBcUIsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMxRSxPQUFPO2dCQUNSLENBQUM7Z0JBRUQsTUFBTSxhQUFhLEdBQ2xCLE9BQU8sQ0FBQyxXQUFXLEdBQUcsdUJBQVEsRUFBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUUvRSxpQ0FBaUM7Z0JBQ2pDLElBQUksMkJBQTJCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7b0JBQ3BELE9BQU8sV0FBVyxDQUFDO2dCQUNwQixDQUFDO2dCQUVELElBQUksMkJBQTJCLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUMzQyxPQUFPLFdBQVcsQ0FBQztnQkFDcEIsQ0FBQztnQkFFRCxJQUFJLENBQUM7b0JBQ0osMkJBQTJCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUMvQyxNQUFNLFdBQVcsR0FBRyxNQUFNLG9DQUFTLEVBQ2xDLE9BQU8sQ0FBQyxLQUFLLEVBQ2IsT0FBTyxDQUFDLFdBQVcsRUFDbkIsT0FBTyxDQUFDLGlCQUFpQixDQUN6QixDQUFDO29CQUNGLE9BQU8sV0FBVyxDQUFDO2dCQUNwQixDQUFDO3dCQUFTLENBQUM7b0JBQ1YsMkJBQTJCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO1lBRUYsS0FBSyxtQkFBbUI7Z0JBQ3ZCLE1BQU0sb0JBQW9CLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzlELElBQUksb0JBQW9CLEVBQUUsQ0FBQztvQkFDMUIscUJBQUssRUFBQyxHQUFHLG9CQUFvQixpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3pFLE9BQU87Z0JBQ1IsQ0FBQztnQkFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNmLE9BQU87Z0JBQ1IsQ0FBQztnQkFFRCxNQUFNLEtBQUssR0FBRztvQkFDYixHQUFHLEVBQUUsUUFBUSxDQUFDLE9BQU87b0JBQ3JCLEtBQUssRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUs7b0JBQy9CLE1BQU0sRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU07aUJBQ2pDLENBQUM7Z0JBQ0YsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLG9DQUFTLEVBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFFeEUsd0ZBQXdGO2dCQUN4RixPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUM7Z0JBRXhCLE9BQU87b0JBQ04sWUFBWSxFQUFHLG1CQUEyQixDQUFDLFlBQVk7b0JBQ3ZELFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtpQkFDL0IsQ0FBQztZQUVILEtBQUssa0JBQWtCO2dCQUN0QixNQUFNLGtCQUFrQixFQUFFLENBQUM7Z0JBQzNCLE9BQU87WUFFUixLQUFLLGdCQUFnQjtnQkFDcEIsTUFBTSxVQUFVLEdBQUcsTUFBTSw2QkFBYSxHQUFFLENBQUM7Z0JBQ3pDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUNwQjtvQkFDQyxPQUFPLEVBQUUsSUFBSTtvQkFDYixLQUFLLEVBQUUsR0FBRztvQkFDVixNQUFNLEVBQUUsR0FBRztvQkFDWCxJQUFJLEVBQUUsT0FBTztvQkFDYixHQUFHLEVBQUUsMENBQTBDLFVBQVUsQ0FBQyxFQUFFLEVBQUU7b0JBQzlELEdBQUcsRUFBRSxDQUFDO29CQUNOLElBQUksRUFBRSxDQUFDO2lCQUNQLEVBQ0QsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUNSLENBQUM7Z0JBQ0YsT0FBTztZQUVSLEtBQUssY0FBYztnQkFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBQ2xCLEdBQUcsRUFBRSwyQkFBMkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUU7aUJBQ25ELENBQUMsQ0FBQztnQkFDSCxPQUFPO1lBRVI7Z0JBQ0MscUJBQUssRUFDSix5Q0FBeUMsSUFBSSxDQUFDLFNBQVMsQ0FDdEQsTUFBTSxDQUNOLDJCQUEyQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQ3JELENBQUM7UUFDSixDQUFDO0lBQ0YsQ0FBQztDQUFBO0FBRUQsNENBQTRDO0FBQzVDLHVDQUF1QztBQUN2QyxTQUFTLG9CQUFvQixDQUFDLE9BQVk7SUFDekMsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBRXRCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDNUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1osT0FBTyx3Q0FBd0MsQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDckMsWUFBWSxJQUFJLGlFQUFpRSxDQUFDO0lBQ25GLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25CLFlBQVksSUFBSSxnREFBZ0QsQ0FBQztJQUNsRSxDQUFDO0lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixZQUFZLElBQUksK0NBQStDLENBQUM7SUFDakUsQ0FBQztJQUVELElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUIsWUFBWSxJQUFJLCtDQUErQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxPQUFPLFlBQVksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO0FBQ3ZELENBQUM7QUFFRCw0Q0FBNEM7QUFDNUMsdUNBQXVDO0FBQ3ZDLFNBQVMsdUJBQXVCLENBQUMsT0FBWTtJQUM1QyxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7SUFFdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQixZQUFZLElBQUksNEJBQTRCLENBQUM7SUFDOUMsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNoQyxZQUFZLElBQUksMkRBQTJELENBQUM7SUFDN0UsQ0FBQztTQUFNLENBQUM7UUFDUCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLFlBQVksSUFBSSx5QkFBeUIsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEMsWUFBWSxJQUFJLDBCQUEwQixDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxZQUFZLElBQUksMkJBQTJCLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFDLFlBQVksSUFBSSw0QkFBNEIsQ0FBQztRQUM5QyxDQUFDO0lBQ0YsQ0FBQztJQUVELE9BQU8sWUFBWSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7QUFDdkQsQ0FBQztBQUVELFNBQWUsa0JBQWtCOztRQUNoQyw4REFBOEQ7UUFDOUQsTUFBTSxTQUFTLEdBQUcsTUFBTSw2QkFBYSxHQUFFLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxxQkFBUyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRW5ELElBQUksU0FBUyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMvRCxNQUFNLGdDQUFnQixFQUFDO2dCQUN0QixJQUFJLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUM7Z0JBQ2hELEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRTthQUNuQixDQUFDLENBQUM7UUFDSixDQUFDO0lBQ0YsQ0FBQztDQUFBO0FBRUQsU0FBZSxZQUFZO3lEQUMxQixFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUM1QixHQUFxQjtRQUVyQixJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNqQixPQUFPO1FBQ1IsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0saUNBQWlCLEVBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXRELDBEQUEwRDtRQUMxRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZCxPQUFPO1FBQ1IsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sNkJBQWEsRUFBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFakQsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGlCQUFpQixDQUNyQyxjQUFjLEVBQ2QsVUFBVSxHQUFHLElBQUksRUFDakIsVUFBVSxHQUFHLEdBQUcsRUFDaEIsVUFBVSxHQUFHLEtBQUssRUFDbEIsVUFBVSxHQUFHLE1BQU0sQ0FDbkIsQ0FBQztRQUNGLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV4QyxNQUFNLFdBQVcsR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVqRCw4Q0FBOEM7UUFDOUMsT0FBTztZQUNOLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUM7WUFDeEMsVUFBVTtTQUNWLENBQUM7SUFDSCxDQUFDO0NBQUE7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUFVO0lBQy9CLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBZ0IsQ0FBQyxDQUFDO1FBQzFELE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsY0FBYztBQUNkLDZIQUE2SDtBQUM3SCxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7SUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBQ3pDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDalBILDRDQXdDQztBQTlDRCxpR0FBdUY7QUFDdkYsaUdBQWtEO0FBRWxELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0FBQ2pDLE1BQU0sb0JBQW9CLEdBQUcsdUJBQXVCLENBQUM7QUFFckQsU0FBc0IsZ0JBQWdCOztRQUNyQyx5RUFBeUU7UUFDekUsTUFBTSxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRTlDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQzFCLEVBQUUsRUFBRSxvQkFBb0I7WUFDeEIsS0FBSyxFQUFFLENBQUMsQ0FBQywrQkFBK0IsQ0FBQztZQUN6QyxJQUFJLEVBQUUsUUFBUTtZQUNkLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQztTQUNqQixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBTyxPQUF3QyxFQUFFLEVBQUU7WUFDNUYsSUFBSSxRQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsVUFBVSxNQUFLLG9CQUFvQixFQUFFLENBQUM7Z0JBQ2xELE9BQU87WUFDUixDQUFDO1lBQ0QsTUFBTSxHQUFHLEdBQUcsTUFBTSw2QkFBYSxHQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNWLE9BQU87WUFDUixDQUFDO1lBQ0QsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLHFCQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekQsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBRWpFLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2pCLGNBQWM7Z0JBQ2QsTUFBTSxxQkFBUyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDbkQsTUFBTSxnQ0FBZ0IsRUFBQztvQkFDdEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLDRCQUE0QixDQUFDO29CQUN6RCxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7aUJBQ2IsQ0FBQyxDQUFDO2dCQUVILE1BQU0sNkJBQWEsRUFBQyxHQUFHLENBQUMsRUFBRSxFQUFFLHlCQUF5QixDQUFDLENBQUM7WUFDeEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNQLGFBQWE7Z0JBQ2IsTUFBTSxxQkFBUyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDaEQsTUFBTSxnQ0FBZ0IsRUFBQztvQkFDdEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDO29CQUNoRCxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7aUJBQ2IsQ0FBQyxDQUFDO1lBQ0osQ0FBQztRQUNGLENBQUMsRUFBQyxDQUFDO0lBQ0osQ0FBQztDQUFBO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxNQUFjO0lBQ3hDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDNUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtZQUN2QyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzlCLHdFQUF3RTtZQUN6RSxDQUFDO1lBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckNELDhCQXFDQztBQXpERCw4RkFBMkQ7QUFDM0Qsb0dBQW1EO0FBQ25ELG9HQUF1RjtBQUN2Riw4RkFBNEM7QUFHNUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFZNUIsMkVBQTJFO0FBQzNFLGdDQUFnQztBQUNoQyxTQUFzQixTQUFTLENBQzlCLGFBQW9CLEVBQ3BCLFdBQXlCLEVBQ3pCLGlCQUEyQjs7UUFFM0IsSUFBSSxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7UUFFckMsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNwRSxNQUFNLFlBQVksR0FBRyxNQUFNLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sTUFBTSxHQUFHLFlBQVksS0FBSyxZQUFZLElBQUksWUFBWSxLQUFLLGlCQUFpQixDQUFDO1lBQ25GLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1osT0FBTyxZQUFZLENBQUM7WUFDckIsQ0FBQztZQUVELGdCQUFnQixHQUFHLFlBQVksQ0FBQztRQUNqQyxDQUFDO1FBRUQscUdBQXFHO1FBQ3JHLElBQUksZ0JBQWdCLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLE9BQU8sWUFBWSxDQUFDO1FBQ3JCLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsdUdBQXVHO1FBQ3ZHLE1BQU0sYUFBYSxHQUFHLFdBQVcsR0FBRyx1QkFBUSxFQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFFLE1BQU0saUJBQWlCLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQ1gsaUJBQWlCLElBQUksQ0FBQyxNQUFNLDhCQUFjLEVBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDdkYsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBRXpDLE1BQU0sVUFBVSxHQUFHLGlCQUFpQixJQUFJLGdCQUFnQixDQUFDLFVBQVUsQ0FBQztRQUVwRSxPQUFPO1lBQ04sS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO1lBQ3pFLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtZQUNqQyxVQUFVO1NBQ1YsQ0FBQztJQUNILENBQUM7Q0FBQTtBQUVELFNBQWUscUJBQXFCLENBQUMsS0FBWTs7UUFDaEQsbUVBQW1FO1FBQ25FLE1BQU0sQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLEdBQUcsNkNBQTJCLEVBQUM7WUFDakUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1lBQ2xCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNwQixXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsSUFBSTtTQUNoQixDQUFDLENBQUM7UUFFSCxxQkFBSyxFQUFDLEtBQUssYUFBYSxNQUFNLFlBQVksRUFBRSxDQUFDLENBQUM7UUFFOUMsTUFBTSxZQUFZLG1DQUNkLEtBQUssS0FDUixhQUFhLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFDMUIsY0FBYyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQzVCLFlBQVk7WUFDWixhQUFhLEdBQ2IsQ0FBQztRQUVGLE1BQU0sWUFBWSxHQUFHLE1BQU0sOEJBQWEsRUFBQyxZQUFtQixDQUFDLENBQUM7UUFDOUQsT0FBTyxZQUFZLENBQUM7SUFDckIsQ0FBQztDQUFBOzs7Ozs7Ozs7Ozs7O0FDaEZELDRCQXdCQztBQXhCRCxTQUFnQixRQUFRLENBQUMsR0FBVztJQUNuQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7SUFDZCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQztJQUV4QixtQ0FBbUM7SUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ1osSUFBSSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNGLENBQUM7SUFFRCwrRkFBK0Y7SUFDL0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3BDLElBQUksSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNiLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQkQsc0NBbURDO0FBeERELGlHQUE4QztBQUM5QywrRUFBbUM7QUFJbkMsU0FBc0IsYUFBYTt5REFBQyxFQUNuQyxHQUFHLEVBQ0gsWUFBWSxFQUNaLGFBQWEsRUFDYixjQUFjLEVBQ2QsYUFBYSxFQVFiO1FBR0EsSUFBSSxTQUFTLENBQUM7UUFDZCxJQUFJLENBQUM7WUFDSixTQUFTLEdBQUcsTUFBTSxvQkFBUSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2hCLG9GQUFvRjtZQUNwRiw4R0FBOEc7WUFDOUcsT0FBTyxpQkFBaUIsQ0FBQztRQUMxQixDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxPQUFPLFlBQVksQ0FBQztRQUNyQixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEMsTUFBTSxZQUFZLEdBQUcsWUFBWSxJQUFJLGFBQWEsSUFBSSxhQUFhLElBQUksY0FBYyxDQUFDO1FBRXRGLElBQUksWUFBWSxFQUFFLENBQUM7WUFDbEIscUJBQUssRUFBQyxZQUFZLFlBQVksSUFBSSxhQUFhLE1BQU0sYUFBYSxJQUFJLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDeEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNwRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGlCQUFpQixDQUFDLElBQUksRUFBRTtnQkFDNUMsV0FBVyxFQUFFLFlBQVk7Z0JBQ3pCLFlBQVksRUFBRSxhQUFhO2dCQUMzQixhQUFhLEVBQUUsTUFBTTthQUNyQixDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFeEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDakQsTUFBTSxVQUFVLEdBQUcsTUFBTSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQztRQUNuRSxDQUFDO2FBQU0sQ0FBQztZQUNQLE1BQU0sVUFBVSxHQUFHLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDckUsQ0FBQztJQUNGLENBQUM7Q0FBQTtBQUVELFNBQVMsWUFBWSxDQUFDLElBQVU7SUFDL0IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFnQixDQUFDLENBQUM7UUFDMUQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxVQUFrQjtJQUMxQywrREFBK0Q7SUFDL0QsT0FBTyxVQUFVLElBQUksR0FBRyxJQUFJLFVBQVUsR0FBRyxHQUFHLENBQUM7QUFDOUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pFRCwwQkFFQztBQVdELDRCQXdCQztBQXpDRCxpR0FBNkQ7QUFFN0QsOERBQThEO0FBQzlELHlFQUF5RTtBQUN6RSxTQUFnQixPQUFPLENBQUMsWUFBWTtJQUNuQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxNQUFNLGFBQWEsR0FBRyxlQUE2RSxDQUFDO0FBQ3BHLE1BQU0sU0FBUyxHQUFHLEtBQXlELENBQUM7QUFDNUUsTUFBTSxPQUFPLEdBQUcsZ0JBQTRFLENBQUM7QUFFN0YsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsU0FBUyxLQUFLO0lBQ2IsT0FBTyxFQUFFLEVBQUUsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFzQixRQUFRLENBQUMsR0FBVzs7UUFDekMsSUFBSSxRQUFRLENBQUM7UUFDYixJQUFJLENBQUM7WUFDSixRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ2xDLENBQUM7UUFBQyxXQUFNLENBQUM7WUFDUixRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2YsQ0FBQztRQUVELGdFQUFnRTtRQUNoRSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLEtBQUssTUFBTSxJQUFJLElBQUksVUFBVSxFQUFFLENBQUM7WUFDL0IsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxVQUFVLG1DQUFRLElBQUksS0FBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUUsQ0FBQztnQkFDNUMsb0NBQW9CLEVBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRWpELE1BQU0sTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUVoQyxvQ0FBb0IsRUFBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3pELE9BQU8sTUFBTSxDQUFDO1lBQ2YsQ0FBQztRQUNGLENBQUM7UUFFRCwyQ0FBMkM7UUFDM0MsT0FBTyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0NBQUE7QUFFRCxNQUFNLEtBQUssR0FBRztJQUNiLEtBQUssRUFBRTtRQUNOLEVBQUUsRUFBRSxLQUFLLEVBQUU7UUFDWCxRQUFRLEVBQUUsQ0FBQztRQUNYLE1BQU0sRUFBRTtZQUNQLElBQUksRUFBRSxhQUFhO1lBQ25CLGNBQWMsRUFBRTtnQkFDZixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsd0JBQXdCLEVBQUU7YUFDNUU7U0FDRDtRQUNELFNBQVMsRUFBRTtZQUNWLFNBQVMsRUFBRSxXQUFXO1lBQ3RCLGFBQWEsRUFBRSxDQUFDLE9BQU8sQ0FBQztTQUN4QjtLQUNEO0lBQ0QsU0FBUyxFQUFFO1FBQ1YsRUFBRSxFQUFFLEtBQUssRUFBRTtRQUNYLFFBQVEsRUFBRSxDQUFDO1FBQ1gsTUFBTSxFQUFFO1lBQ1AsSUFBSSxFQUFFLGFBQWE7WUFDbkIsY0FBYyxFQUFFO2dCQUNmO29CQUNDLE1BQU0sRUFBRSxTQUFTO29CQUNqQixTQUFTLEVBQUUsU0FBUztvQkFDcEIsS0FBSyxFQUFFLDRCQUE0QjtpQkFDbkM7YUFDRDtTQUNEO1FBQ0QsU0FBUyxFQUFFO1lBQ1YsU0FBUyxFQUFFLGVBQWU7WUFDMUIsYUFBYSxFQUFFLENBQUMsT0FBTyxDQUFDO1NBQ3hCO0tBQ0Q7SUFDRCxNQUFNLEVBQUU7UUFDUCxFQUFFLEVBQUUsS0FBSyxFQUFFO1FBQ1gsUUFBUSxFQUFFLENBQUM7UUFDWCxNQUFNLEVBQUU7WUFDUCxJQUFJLEVBQUUsYUFBYTtZQUNuQixjQUFjLEVBQUU7Z0JBQ2Y7b0JBQ0MsTUFBTSxFQUFFLFNBQVM7b0JBQ2pCLFNBQVMsRUFBRSxTQUFTO29CQUNwQixLQUFLLEVBQUUsb0JBQW9CO2lCQUMzQjthQUNEO1NBQ0Q7UUFDRCxTQUFTLEVBQUU7WUFDVixTQUFTLEVBQUUsV0FBVztZQUN0QixhQUFhLEVBQUUsQ0FBQyxPQUFPLENBQUM7U0FDeEI7S0FDRDtJQUNELE9BQU8sRUFBRTtRQUNSLEVBQUUsRUFBRSxLQUFLLEVBQUU7UUFDWCxRQUFRLEVBQUUsQ0FBQztRQUNYLE1BQU0sRUFBRTtZQUNQLElBQUksRUFBRSxhQUFhO1lBQ25CLGNBQWMsRUFBRTtnQkFDZjtvQkFDQyxNQUFNLEVBQUUsU0FBUztvQkFDakIsU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLEtBQUssRUFBRSxzQkFBc0I7aUJBQzdCO2FBQ0Q7U0FDRDtRQUNELFNBQVMsRUFBRTtZQUNWLFNBQVMsRUFBRSxZQUFZO1lBQ3ZCLGFBQWEsRUFBRSxDQUFDLE9BQU8sQ0FBQztTQUN4QjtLQUNEO0NBQ0QsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoSEYsaUZBQTRFO0FBQzVFLHVGQUE2RDtBQUM3RCxnR0FBb0M7QUFzQ3BDLElBQUssSUFRSjtBQVJELFdBQUssSUFBSTtJQUNSLHVCQUFlO0lBQ2YsaUNBQXlCO0lBQ3pCLCtCQUF1QjtJQUN2QixpQ0FBeUI7SUFDekIsaUNBQXlCO0lBQ3pCLGlDQUF5QjtJQUN6QixtREFBMkM7QUFDNUMsQ0FBQyxFQVJJLElBQUksS0FBSixJQUFJLFFBUVI7QUFFWSxnQkFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDckMsS0FBSyxFQUFFLEVBQUU7SUFDVCxVQUFVLEVBQUUsZUFBZTtJQUMzQixTQUFTLEVBQUUsU0FBUztJQUNwQixVQUFVLEVBQUUsU0FBUztJQUNyQixtQkFBbUIsRUFBRSxnQ0FBa0IsR0FBRTtDQUN6QyxDQUFDLENBQUM7QUFFSCxpRkFBaUY7QUFDakYsMENBQTBDO0FBQzFDLHlHQUF5RztBQUN6RyxzQkFBc0I7QUFDdEIsTUFBTSx3QkFBd0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN2RCxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUVmLGlCQUFTLEdBQWMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNqRCxhQUFhLEVBQUUsR0FBUyxFQUFFO1FBQ3pCLE1BQU0sVUFBVSxHQUFHLE1BQU0sOEJBQWMsRUFBUyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakUsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQixPQUFPLFVBQVUsQ0FBQztRQUNuQixDQUFDO1FBRUQsMEJBQTBCO1FBQzFCLG9GQUFvRjtRQUNwRixNQUFNLE9BQU8sR0FBRyxhQUFNLEdBQUUsQ0FBQztRQUN6QixNQUFNLDhCQUFjLEVBQVMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2RCxPQUFPLE9BQU8sQ0FBQztJQUNoQixDQUFDO0lBRUQsUUFBUSxFQUFFLEdBQVMsRUFBRSwwREFBQyxjQUFDLE1BQU0sOEJBQWMsRUFBUyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsbUNBQUksZ0JBQVEsQ0FBQyxLQUFLO0lBQ2xGLFFBQVEsRUFBRSxDQUFPLEtBQWEsRUFBRSxFQUFFLGtEQUFDLGFBQU0sOEJBQWMsRUFBUyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztJQUVsRix3RkFBd0Y7SUFDeEYsc0JBQXNCLEVBQUUsR0FBUyxFQUFFO1FBQ2xDLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSw4QkFBYyxFQUFlLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRXpGLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzFCLE9BQU8sZ0NBQWtCLEdBQUUsQ0FBQztRQUM3QixDQUFDO1FBRUQsT0FBTyxtQkFBbUIsQ0FBQztJQUM1QixDQUFDO0lBQ0Qsc0JBQXNCLEVBQUUsQ0FBTyxZQUEwQixFQUFFLEVBQUU7UUFDNUQsSUFBSSxDQUFDLHVCQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQywwQkFBMEIsWUFBWSw2QkFBNkIsQ0FBQyxDQUFDO1lBQ2xGLFlBQVksR0FBRyxnQ0FBa0IsR0FBRSxDQUFDO1FBQ3JDLENBQUM7UUFFRCxPQUFPLE1BQU0sOEJBQWMsRUFBZSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUNELGVBQWUsRUFBRSxHQUFHLEVBQUU7UUFDckIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsUUFBUSxRQUFRLEVBQUUsQ0FBQztZQUNsQiwwRUFBMEU7WUFDMUUsS0FBSyxJQUFJLENBQUM7WUFDVixLQUFLLElBQUksQ0FBQztZQUNWLEtBQUssSUFBSSxDQUFDO1lBQ1YsS0FBSyxJQUFJLENBQUM7WUFDVixLQUFLLElBQUksQ0FBQztZQUNWLEtBQUssSUFBSSxDQUFDO1lBQ1YsS0FBSyxJQUFJO2dCQUNSLE9BQU8sZ0JBQWdCLENBQUM7WUFDekI7Z0JBQ0MsT0FBTyxxQkFBcUIsQ0FBQztRQUMvQixDQUFDO0lBQ0YsQ0FBQztJQUVELGFBQWEsRUFBRSxHQUFTLEVBQUU7O1FBQ3pCLE1BQU0sVUFBVSxHQUFHLE9BQUMsTUFBTSw4QkFBYyxFQUFTLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxtQ0FBSSxnQkFBUSxDQUFDLFVBQVUsQ0FBQztRQUMxRixNQUFNLFFBQVEsR0FBRyxNQUFNLGlCQUFTLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUMxRCxRQUFRLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLDhEQUE4RDtZQUM5RCxLQUFLLElBQUksQ0FBQztZQUNWLEtBQUssSUFBSSxDQUFDO1lBQ1YsS0FBSyxJQUFJLENBQUM7WUFDVixLQUFLLElBQUksQ0FBQztZQUNWLEtBQUssT0FBTyxDQUFDO1lBQ2IsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLElBQUksQ0FBQztZQUNWLEtBQUssSUFBSTtnQkFDUixPQUFPLGdCQUFnQixDQUFDO1lBQ3pCO2dCQUNDLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7SUFDRixDQUFDO0lBQ0QsYUFBYSxFQUFFLENBQU8sVUFBa0IsRUFBRSxFQUFFLGtEQUMzQyxhQUFNLDhCQUFjLEVBQVMsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7SUFFMUQsWUFBWSxFQUFFLEdBQVMsRUFBRSwwREFBQyxjQUFDLE1BQU0sOEJBQWMsRUFBUyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsbUNBQUksZ0JBQVEsQ0FBQyxTQUFTO0lBQzlGLFlBQVksRUFBRSxDQUFPLFNBQWlCLEVBQUUsRUFBRSxrREFDekMsYUFBTSw4QkFBYyxFQUFTLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO0lBRXhELGFBQWEsRUFBRSxHQUFTLEVBQUUsMERBQ3pCLGNBQUMsTUFBTSw4QkFBYyxFQUFTLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxtQ0FBSSxnQkFBUSxDQUFDLFVBQVU7SUFDdkUsYUFBYSxFQUFFLENBQU8sVUFBa0IsRUFBRSxFQUFFLGtEQUMzQyxhQUFNLDhCQUFjLEVBQVMsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7SUFFMUQsYUFBYSxFQUFFLEdBQVMsRUFBRTs7UUFDekIsTUFBTSxlQUFlLEdBQUcsTUFBTSw4QkFBYyxFQUFVLHdCQUF3QixDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sOEJBQWMsRUFBVyxJQUFJLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDbEUsTUFBTSw4QkFBYyxFQUFVLHdCQUF3QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFRCxPQUFPLE9BQUMsTUFBTSw4QkFBYyxFQUFXLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxtQ0FBSSxFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUNELFlBQVksRUFBRSxDQUFPLFNBQWlCLEVBQUUsRUFBRTs7UUFDekMsTUFBTSxlQUFlLEdBQUcsTUFBTSw4QkFBYyxFQUFVLHdCQUF3QixDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sOEJBQWMsRUFBVyxJQUFJLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDbEUsTUFBTSw4QkFBYyxFQUFVLHdCQUF3QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxPQUFDLE1BQU0sOEJBQWMsRUFBVyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsbUNBQUksRUFBRSxDQUFDO1FBQzNFLE9BQU8sTUFBTSw4QkFBYyxFQUFXLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFDRCxlQUFlLEVBQUUsQ0FBTyxTQUFpQixFQUFFLEVBQUU7O1FBQzVDLE1BQU0sZUFBZSxHQUFHLE1BQU0sOEJBQWMsRUFBVSx3QkFBd0IsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN0QixNQUFNLDhCQUFjLEVBQVcsSUFBSSxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sOEJBQWMsRUFBVSx3QkFBd0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsT0FBQyxNQUFNLDhCQUFjLEVBQVcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG1DQUFJLEVBQUUsQ0FBQztRQUMzRSxPQUFPLE1BQU0sOEJBQWMsRUFDMUIsSUFBSSxDQUFDLFVBQVUsRUFDZixVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUMzQyxDQUFDO0lBQ0gsQ0FBQztDQUNELENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ2pMSCxzQ0EwQkM7QUFFRCxvREFJQztBQUdELDhDQUlDO0FBRUQsc0NBRUM7QUFFRCw0Q0FNQztBQUVELHNDQWFDO0FBRUQsOERBSUM7QUFFRCxzREFPQztBQUVELHdDQVlDO0FBRUQsd0NBWUM7QUEvR0Qsd0RBQXdEO0FBQ3hELDZFQUE2RTtBQUM3RSxTQUFnQixhQUFhO0lBRzVCLE9BQU8sSUFBSSxPQUFPLENBQWdFLE9BQU8sQ0FBQyxFQUFFO1FBQzNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsVUFBVSxJQUFJO1lBQ3RFLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNuQixPQUFPO1lBQ1IsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsV0FBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLEdBQUcsR0FBRSxDQUFDO2dCQUN0QixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ25CLE9BQU87WUFDUixDQUFDO1lBRUQsVUFBVSxDQUFDLFdBQVcsR0FBRyxHQUFHLEVBQUU7Z0JBQzdCLElBQUksQ0FBQztvQkFDSixPQUFPLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQ3pDLENBQUM7Z0JBQUMsV0FBTSxDQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDO2dCQUNYLENBQUM7WUFDRixDQUFDLENBQUM7WUFDRixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBQyxXQUEyRDtJQUMvRixPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzVCLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsNERBQTREO0FBQzVELFNBQWdCLGlCQUFpQixDQUFDLFFBQWdCO0lBQ2pELE9BQU8sSUFBSSxPQUFPLENBQVMsT0FBTyxDQUFDLEVBQUUsQ0FDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQ25FLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLEtBQWE7SUFDMUMsT0FBTyxJQUFJLE9BQU8sQ0FBUyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzVFLENBQUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxJQUF5QztJQUN6RSxPQUFPLElBQUksT0FBTyxDQUFVLE9BQU8sQ0FBQyxFQUFFO1FBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7WUFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQixhQUFhLENBQzVCLEtBQWEsRUFDYixRQUFnQixFQUNoQixTQUFtQjtJQUVuQixPQUFPLElBQUksT0FBTyxDQUFVLE9BQU8sQ0FBQyxFQUFFO1FBQ3JDLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUM3QixFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxhQUFULFNBQVMsY0FBVCxTQUFTLEdBQUksSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFDdEUsR0FBRyxFQUFFO1lBQ0osT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2YsQ0FBQyxDQUNELENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQix5QkFBeUI7SUFDeEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUM1QixNQUFNLENBQUMsU0FBUyxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLHFCQUFxQixDQUFDLE9BQVk7SUFDakQsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLENBQUMsOERBQThEO0lBQzdGLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUUxQixPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzVCLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BFLENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLGNBQWMsQ0FBSSxHQUFXO0lBQzVDLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzVCLElBQUksQ0FBQztZQUNKLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLFVBQVUsTUFBTTtnQkFDeEQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQy9CLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQztRQUFDLFdBQU0sQ0FBQztZQUNSLDZCQUE2QjtZQUM3QixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEIsQ0FBQztJQUNGLENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLGNBQWMsQ0FBSSxHQUFXLEVBQUUsS0FBUTtJQUN0RCxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUM1QixJQUFJLENBQUM7WUFDSixNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRTtnQkFDeEQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2YsQ0FBQyxDQUFDLENBQUM7UUFDSixDQUFDO1FBQUMsV0FBTSxDQUFDO1lBQ1IsNkJBQTZCO1lBQzdCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQixDQUFDO0lBQ0YsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsR0FBVztJQUM3QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDeEIsT0FBTyxHQUFHLFNBQVMsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUM5QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdGRCx3Q0FvQkM7QUFTRCxzQkFrQkM7QUFFRCx3QkFTQztBQVFELHdCQWNDO0FBRUQsd0NBVUM7QUFFRCx3Q0F5REM7QUFFRCxzQkFJQztBQW5MRCx1RkFBd0M7QUFHeEMsaUVBQWlFO0FBQ2pFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQztBQUNULGVBQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztBQUV0RixJQUFLLFVBUUo7QUFSRCxXQUFLLFVBQVU7SUFDZCx5Q0FBUTtJQUNSLG1EQUFhO0lBQ2IsdURBQWU7SUFDZix1REFBZTtJQUNmLHFEQUFjO0lBQ2QsbUVBQXFCO0lBQ3JCLDJFQUF5QjtBQUMxQixDQUFDLEVBUkksVUFBVSxLQUFWLFVBQVUsUUFRZDtBQU9ELFNBQXNCLGNBQWM7O1FBQ25DLE1BQU0sVUFBVSxHQUFHLE1BQU0scUJBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuRCxNQUFNLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FDMUIsR0FBRyxlQUFPLHVCQUF1QixVQUFVLGdCQUFnQixjQUFjLEVBQUUsRUFBRSxFQUM3RTtZQUNDLE1BQU0sRUFBRSxLQUFLO1lBQ2IsT0FBTyxFQUFFO2dCQUNSLGNBQWMsRUFBRSxrQkFBa0I7YUFDbEM7U0FDRCxDQUNELENBQUM7UUFFRixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUczQixDQUFDO0lBQ0gsQ0FBQztDQUFBO0FBRUQsSUFBWSxXQUtYO0FBTEQsV0FBWSxXQUFXO0lBQ3RCLG1EQUFPO0lBQ1AsNkRBQVk7SUFDWiwyREFBVztJQUNYLG1EQUFPO0FBQ1IsQ0FBQyxFQUxXLFdBQVcsMkJBQVgsV0FBVyxRQUt0QjtBQUVELFNBQXNCLEtBQUssQ0FBQyxLQUFhLEVBQUUsUUFBZ0I7O1FBQzFELE1BQU0sT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsZUFBTyxhQUFhLEVBQUU7WUFDcEQsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUU7Z0JBQ1IsY0FBYyxFQUFFLGtCQUFrQjthQUNsQztZQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO1NBQ3pDLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDNUMsT0FBTyxXQUFXLENBQUMsWUFBWSxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzdDLE9BQU8sV0FBVyxDQUFDLFdBQVcsQ0FBQztRQUNoQyxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7SUFDckYsQ0FBQztDQUFBO0FBRUQsU0FBc0IsTUFBTTs7UUFDM0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxlQUFPLGNBQWMsRUFBRTtZQUNyRCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRTtnQkFDUixjQUFjLEVBQUUsa0JBQWtCO2FBQ2xDO1NBQ0QsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDaEQsQ0FBQztDQUFBO0FBRUQsSUFBWSxZQUlYO0FBSkQsV0FBWSxZQUFZO0lBQ3ZCLHFEQUFPO0lBQ1AscURBQU87SUFDUCwyREFBVTtBQUNYLENBQUMsRUFKVyxZQUFZLDRCQUFaLFlBQVksUUFJdkI7QUFFRCxTQUFzQixNQUFNLENBQUMsS0FBYSxFQUFFLFFBQWdCOztRQUMzRCxNQUFNLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLGVBQU8sU0FBUyxFQUFFO1lBQ2hELE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFO2dCQUNSLGNBQWMsRUFBRSxrQkFBa0I7YUFDbEM7WUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQztTQUN6QyxDQUFDLENBQUM7UUFFSCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzdDLE9BQU8sWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUNoQyxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7SUFDNUYsQ0FBQztDQUFBO0FBRUQsU0FBc0IsY0FBYyxDQUFDLElBQVk7O1FBQ2hELE1BQU0sT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsZUFBTyxXQUFXLEVBQUU7WUFDbEQsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUU7Z0JBQ1IsY0FBYyxFQUFFLGtCQUFrQjthQUNsQztZQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDOUIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxPQUFPLENBQUM7SUFDOUMsQ0FBQztDQUFBO0FBRUQsU0FBc0IsY0FBYyxDQUNuQyxXQUF5QixFQUN6QixXQUFtQjs7UUFFbkIsTUFBTSxVQUFVLEdBQUcsTUFBTSxxQkFBUyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25ELE1BQU0sT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsZUFBTyxZQUFZLEVBQUU7WUFDbkQsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUU7Z0JBQ1IsY0FBYyxFQUFFLGtCQUFrQjthQUNsQztZQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNwQixZQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUM7Z0JBQzNCLFVBQVUsRUFBRSxVQUFVO2dCQUN0QixjQUFjLEVBQUUsV0FBVztnQkFDM0IsV0FBVyxFQUFFLGNBQWMsRUFBRTthQUM3QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sWUFBWSxHQUFHLHFFQUFxRSxDQUFDO1lBQzNGLE9BQU87Z0JBQ04sWUFBWTtnQkFDWixZQUFZLEVBQUU7b0JBQ2I7d0JBQ0MsZ0JBQWdCLEVBQUUsU0FBUzt3QkFDM0IsY0FBYyxFQUFFLFlBQVk7d0JBQzVCLElBQUksRUFBRSxDQUFDO3dCQUNQLElBQUksRUFBRSxDQUFDO3dCQUNQLElBQUksRUFBRSxHQUFHO3dCQUNULElBQUksRUFBRSxHQUFHO3FCQUNUO2lCQUNEO2FBQ0QsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ25ELE1BQU0sWUFBWSxHQUFHLG9FQUFvRSxDQUFDO1lBQzFGLE9BQU87Z0JBQ04sWUFBWTtnQkFDWixZQUFZLEVBQUU7b0JBQ2I7d0JBQ0MsZ0JBQWdCLEVBQUUsU0FBUzt3QkFDM0IsY0FBYyxFQUFFLFlBQVk7d0JBQzVCLElBQUksRUFBRSxDQUFDO3dCQUNQLElBQUksRUFBRSxDQUFDO3dCQUNQLElBQUksRUFBRSxHQUFHO3dCQUNULElBQUksRUFBRSxHQUFHO3FCQUNUO2lCQUNEO2FBQ0QsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVyQyxPQUFPO1lBQ04sWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUF3QjtTQUN0RCxDQUFDO0lBQ0gsQ0FBQztDQUFBO0FBRUQsU0FBZ0IsS0FBSyxDQUFDLE9BQU87SUFDNUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEIsQ0FBQztBQUNGLENBQUM7QUFFRCxJQUFJLFdBQVcsR0FBVyxJQUFJLENBQUMsQ0FBQyxxREFBcUQ7QUFDckYsU0FBUyxjQUFjO0lBQ3RCLElBQUksV0FBVyxFQUFFLENBQUM7UUFDakIsT0FBTyxXQUFXLENBQUM7SUFDcEIsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sUUFBUSxHQUFHLFdBQVcsRUFBRSxDQUFDO0lBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztJQUMvQyxNQUFNLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDcEQsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLGFBQWEsSUFBSSxRQUFRLElBQUksZ0JBQWdCLElBQUksWUFBWSxFQUFFLENBQUMsQ0FBQztJQUV2RixPQUFPLFdBQVcsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBUyxnQkFBZ0I7SUFDeEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6RCxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDVCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDL0QsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNuRixDQUFDO0FBRUQsU0FBUyxXQUFXO0lBQ25CLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxhQUFULFNBQVMsdUJBQVQsU0FBUyxDQUFFLG1CQUFtQixDQUFDO0lBQzNELE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQyxPQUFPLEdBQUcsbUJBQW1CLElBQUksWUFBWSxFQUFFLENBQUM7QUFDakQsQ0FBQztBQUVELFNBQVMsbUJBQW1COztJQUMzQixNQUFNLElBQUksR0FBRyxlQUFTLENBQUMsWUFBWSxDQUFDLDBDQUFFLElBQUksQ0FBQztJQUMzQyxNQUFNLEdBQUcsR0FBRyxlQUFTLENBQUMsWUFBWSxDQUFDLDBDQUFFLEdBQUcsQ0FBQztJQUN6QyxNQUFNLFdBQVcsR0FBRyxlQUFTLENBQUMsWUFBWSxDQUFDLDBDQUFFLFdBQVcsQ0FBQztJQUN6RCxNQUFNLGFBQWEsR0FBRyxlQUFTLENBQUMsWUFBWSxDQUFDLDBDQUFFLGFBQWEsQ0FBQztJQUM3RCxNQUFNLFFBQVEsR0FBRyxlQUFTLENBQUMsWUFBWSxDQUFDLDBDQUFFLFFBQVEsQ0FBQztJQUNuRCxPQUFPLEdBQUcsSUFBSSxJQUFJLEdBQUcsSUFBSSxXQUFXLElBQUksYUFBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO0FBQ3JFLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FDcExELGdEQWFDO0FBRUQsNENBcUNDO0FBNUZELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0FBcUJwQixxQkFBYSxHQUFtQjtJQUM1QyxJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7SUFDSixJQUFJO0lBQ0osT0FBTztJQUNQLE9BQU87SUFDUCxJQUFJO0lBQ0osSUFBSTtJQUNKLE9BQU87SUFDUCxPQUFPO0NBQ1AsQ0FBQztBQUVGLFNBQWdCLGtCQUFrQjtJQUNqQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO0lBRXBDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sY0FBYyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRTlFLElBQUkscUJBQWEsQ0FBQyxRQUFRLENBQUMsUUFBd0IsQ0FBQyxFQUFFLENBQUM7UUFDdEQsT0FBTyxRQUF3QixDQUFDO0lBQ2pDLENBQUM7U0FBTSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQzNCLE9BQU8sY0FBYyxDQUFDO0lBQ3ZCLENBQUM7U0FBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0FBQ0YsQ0FBQztBQUVELFNBQWdCLGdCQUFnQixDQUFDLFlBQTBCO0lBQzFELFFBQVEsWUFBWSxFQUFFLENBQUM7UUFDdEIsS0FBSyxJQUFJO1lBQ1IsT0FBTyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNwQyxLQUFLLElBQUk7WUFDUixPQUFPLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3BDLEtBQUssSUFBSTtZQUNSLE9BQU8sQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDckMsS0FBSyxJQUFJO1lBQ1IsT0FBTyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNyQyxLQUFLLElBQUk7WUFDUixPQUFPLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3BDLEtBQUssSUFBSTtZQUNSLE9BQU8sQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDbkMsS0FBSyxJQUFJO1lBQ1IsT0FBTyxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUN4QyxLQUFLLElBQUk7WUFDUixPQUFPLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3JDLEtBQUssSUFBSTtZQUNSLE9BQU8sQ0FBQyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDdEMsS0FBSyxJQUFJO1lBQ1IsT0FBTyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNwQyxLQUFLLE9BQU87WUFDWCxPQUFPLENBQUMsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ2pELEtBQUssT0FBTztZQUNYLE9BQU8sQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDeEMsS0FBSyxJQUFJO1lBQ1IsT0FBTyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNsQyxLQUFLLElBQUk7WUFDUixPQUFPLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ3hDLEtBQUssT0FBTztZQUNYLE9BQU8sQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDL0MsS0FBSyxPQUFPO1lBQ1gsT0FBTyxDQUFDLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUNoRDtZQUNDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7O0FDdEVELDRDQWlCQztBQUtELGtFQWtCQztBQXhDRCxTQUFnQixnQkFBZ0IsQ0FDL0IsV0FBbUIsRUFDbkIsWUFBb0IsRUFDcEIsYUFBcUIsRUFDckIsY0FBc0IsRUFDdEIsTUFBeUI7SUFFekIsTUFBTSxNQUFNLEdBQUcsV0FBVyxHQUFHLGFBQWEsQ0FBQztJQUMzQyxNQUFNLE1BQU0sR0FBRyxZQUFZLEdBQUcsY0FBYyxDQUFDO0lBRTdDLHVDQUNJLE1BQU0sS0FDVCxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUN0QyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUN0QyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUN0QyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUNyQztBQUNILENBQUM7QUFLRCxTQUFnQiwyQkFBMkIsQ0FBQyxNQUszQztJQUNBLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDMUQsaUVBQWlFO0lBQ2pFLDhEQUE4RDtJQUM5RCxpRUFBaUU7SUFDakUsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLElBQUksVUFBVSxJQUFJLE1BQU0sSUFBSSxXQUFXLENBQUM7SUFDekUsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLE1BQU0sRUFBRSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDOUUsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0FBQzFGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUR1QztBQUNBO0FBQ0E7QUFDQTtBQUNFO0FBQ1E7QUFDRTtBQUNFOzs7Ozs7Ozs7Ozs7Ozs7QUNQdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7O0FBRW5EOztBQUVBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsY0FBYztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCLGFBQWE7QUFDL0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpRUFBZSxHQUFHOzs7Ozs7Ozs7Ozs7OztBQ3RObEIsaUVBQWUsc0NBQXNDOzs7Ozs7Ozs7Ozs7Ozs7QUNBaEI7O0FBRXJDO0FBQ0EsT0FBTyx3REFBUTtBQUNmO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlFQUFlLEtBQUs7Ozs7Ozs7Ozs7Ozs7O0FDbENwQixpRUFBZSxjQUFjLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEdBQUcseUNBQXlDOzs7Ozs7Ozs7Ozs7OztBQ0FwSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2U7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1EQUFtRDs7QUFFbkQ7O0FBRUEsb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsUUFBUTtBQUMzQjs7QUFFQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCOztBQUVBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7O0FBRUEsc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixVQUFVO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUVBQWUsSUFBSTs7Ozs7Ozs7Ozs7Ozs7O0FDL0ZrQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxnQkFBZ0IsU0FBUztBQUN6QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMGdCQUEwZ0I7QUFDMWdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU8sd0RBQVE7QUFDZjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUVBQWUsU0FBUzs7Ozs7Ozs7Ozs7Ozs7OztBQzdCRztBQUNZLENBQUM7QUFDeEM7QUFDQTtBQUNBOztBQUVBOztBQUVBLGVBQWU7OztBQUdmO0FBQ0Esb0JBQW9COztBQUVwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0ZBQWdGO0FBQ2hGO0FBQ0E7O0FBRUE7QUFDQSxzREFBc0QsK0NBQUc7O0FBRXpEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7O0FBR0Esd0VBQXdFO0FBQ3hFOztBQUVBLDRFQUE0RTs7QUFFNUUsOERBQThEOztBQUU5RDtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCLDJCQUEyQjs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCLG9DQUFvQzs7QUFFcEMsOEJBQThCOztBQUU5QixrQ0FBa0M7O0FBRWxDLDRCQUE0Qjs7QUFFNUIsa0JBQWtCLE9BQU87QUFDekI7QUFDQTs7QUFFQSxnQkFBZ0IseURBQVM7QUFDekI7O0FBRUEsaUVBQWUsRUFBRTs7Ozs7Ozs7Ozs7Ozs7OztBQzlGVTtBQUNBO0FBQzNCLFNBQVMsbURBQUcsYUFBYSwrQ0FBRztBQUM1QixpRUFBZSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNIc0I7QUFDUjs7QUFFL0I7QUFDQSwyQ0FBMkM7O0FBRTNDOztBQUVBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTs7QUFFQTtBQUNBOztBQUVPO0FBQ0E7QUFDUCw2QkFBZSxvQ0FBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixxREFBSztBQUN2Qjs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHNCQUFzQixRQUFRO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxXQUFXLHlEQUFTO0FBQ3BCLElBQUk7OztBQUdKO0FBQ0EsOEJBQThCO0FBQzlCLElBQUksZUFBZTs7O0FBR25CO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDL0QyQjtBQUNZOztBQUV2QztBQUNBO0FBQ0EsK0NBQStDLCtDQUFHLEtBQUs7O0FBRXZEO0FBQ0EsbUNBQW1DOztBQUVuQztBQUNBOztBQUVBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxTQUFTLHlEQUFTO0FBQ2xCOztBQUVBLGlFQUFlLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2QlU7QUFDRTtBQUM3QixTQUFTLG1EQUFHLGFBQWEsZ0RBQUk7QUFDN0IsaUVBQWUsRUFBRTs7Ozs7Ozs7Ozs7Ozs7O0FDSGM7O0FBRS9CO0FBQ0EscUNBQXFDLGlEQUFLO0FBQzFDOztBQUVBLGlFQUFlLFFBQVE7Ozs7Ozs7Ozs7Ozs7OztBQ05jOztBQUVyQztBQUNBLE9BQU8sd0RBQVE7QUFDZjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUVBQWUsT0FBTzs7Ozs7O1VDVnRCO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7O1dDdEJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EseUNBQXlDLHdDQUF3QztXQUNqRjtXQUNBO1dBQ0E7Ozs7O1dDUEE7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7OztVRU5BO1VBQ0E7VUFDQTtVQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaWNoaWdvLXJlYWRlci8uL3NyYy9hcHAvYmFja2dyb3VuZC50cyIsIndlYnBhY2s6Ly9pY2hpZ28tcmVhZGVyLy4vc3JjL2FwcC9iYWNrZ3JvdW5kL2NvbnRleHRNZW51cy50cyIsIndlYnBhY2s6Ly9pY2hpZ28tcmVhZGVyLy4vc3JjL2FwcC90cmFuc2xhdGVXaXRoU2NhbGluZy50cyIsIndlYnBhY2s6Ly9pY2hpZ28tcmVhZGVyLy4vc3JjL2FwcC91dGlscy9mYXN0SGFzaC50cyIsIndlYnBhY2s6Ly9pY2hpZ28tcmVhZGVyLy4vc3JjL2FwcC91dGlscy9pbWFnZVV0aWxzLnRzIiwid2VicGFjazovL2ljaGlnby1yZWFkZXIvLi9zcmMvYXBwL3V0aWxzL3V0aWxzLnRzIiwid2VicGFjazovL2ljaGlnby1yZWFkZXIvLi9zcmMvdXRpbHMvYXBwQ29uZmlnLnRzIiwid2VicGFjazovL2ljaGlnby1yZWFkZXIvLi9zcmMvdXRpbHMvY2hyb21lQXBpLnRzIiwid2VicGFjazovL2ljaGlnby1yZWFkZXIvLi9zcmMvdXRpbHMvaWNoaWdvQXBpLnRzIiwid2VicGFjazovL2ljaGlnby1yZWFkZXIvLi9zcmMvdXRpbHMvbG9jYWxlcy50cyIsIndlYnBhY2s6Ly9pY2hpZ28tcmVhZGVyLy4vc3JjL3V0aWxzL3RyYW5zbGF0aW9uLnRzIiwid2VicGFjazovL2ljaGlnby1yZWFkZXIvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL2luZGV4LmpzIiwid2VicGFjazovL2ljaGlnby1yZWFkZXIvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL21kNS5qcyIsIndlYnBhY2s6Ly9pY2hpZ28tcmVhZGVyLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9uaWwuanMiLCJ3ZWJwYWNrOi8vaWNoaWdvLXJlYWRlci8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcGFyc2UuanMiLCJ3ZWJwYWNrOi8vaWNoaWdvLXJlYWRlci8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vaWNoaWdvLXJlYWRlci8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcm5nLmpzIiwid2VicGFjazovL2ljaGlnby1yZWFkZXIvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3NoYTEuanMiLCJ3ZWJwYWNrOi8vaWNoaWdvLXJlYWRlci8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL2ljaGlnby1yZWFkZXIvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YxLmpzIiwid2VicGFjazovL2ljaGlnby1yZWFkZXIvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YzLmpzIiwid2VicGFjazovL2ljaGlnby1yZWFkZXIvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YzNS5qcyIsIndlYnBhY2s6Ly9pY2hpZ28tcmVhZGVyLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NC5qcyIsIndlYnBhY2s6Ly9pY2hpZ28tcmVhZGVyLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NS5qcyIsIndlYnBhY2s6Ly9pY2hpZ28tcmVhZGVyLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92YWxpZGF0ZS5qcyIsIndlYnBhY2s6Ly9pY2hpZ28tcmVhZGVyLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92ZXJzaW9uLmpzIiwid2VicGFjazovL2ljaGlnby1yZWFkZXIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vaWNoaWdvLXJlYWRlci93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vaWNoaWdvLXJlYWRlci93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2ljaGlnby1yZWFkZXIvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9pY2hpZ28tcmVhZGVyL3dlYnBhY2svYmVmb3JlLXN0YXJ0dXAiLCJ3ZWJwYWNrOi8vaWNoaWdvLXJlYWRlci93ZWJwYWNrL3N0YXJ0dXAiLCJ3ZWJwYWNrOi8vaWNoaWdvLXJlYWRlci93ZWJwYWNrL2FmdGVyLXN0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsiLyogQmFja2dyb3VuZCBwcm9jZXNzIGZvciB0aGUgSWNoaWdvIGV4dGVuc2lvbi5cbiAqIFRoaXMgbW9kdWxlIHNob3VsZCBiZSB1c2VkIHRvIHByb2Nlc3MgYXN5bmMgd29yay5cbiAqIEhhbmRsZSBmYWlsdXJlcyBpbiBhIHJvYnVzdCBtYW5uZXIgYW5kIGF2b2lkIHRoZSBmYWlsLWZhc3QgcGF0dGVybiwgdW5sZXNzIGluIGRlYnVnIG1vZGUuICovXG5pbXBvcnQge1xuXHRjYXB0dXJlVmlzaWJsZVRhYixcblx0Z2V0Q3VycmVudFRhYixcblx0Z2V0Wm9vbUZhY3Rvcixcblx0c2V0RXh0ZW5zaW9uSWNvblxufSBmcm9tICcuLi91dGlscy9jaHJvbWVBcGknO1xuaW1wb3J0IHsgYXBwQ29uZmlnIH0gZnJvbSAnLi4vdXRpbHMvYXBwQ29uZmlnJztcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSAnLi4vdXRpbHMvaWNoaWdvQXBpJztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4vdHJhbnNsYXRlV2l0aFNjYWxpbmcnO1xuaW1wb3J0IHsgaW5pdENvbnRleHRNZW51cyB9IGZyb20gJy4vYmFja2dyb3VuZC9jb250ZXh0TWVudXMnO1xuaW1wb3J0IHsgZmFzdEhhc2ggfSBmcm9tICcuL3V0aWxzL2Zhc3RIYXNoJztcblxuaW5pdENvbnRleHRNZW51cygpO1xuXG5jaHJvbWUucnVudGltZS5vbk1lc3NhZ2UuYWRkTGlzdGVuZXIoZnVuY3Rpb24gKG1lc3NhZ2UsIHNlbmRlciwgc2VuZFJlc3BvbnNlKSB7XG5cdGhhbmRsZU1lc3NhZ2VzKG1lc3NhZ2UsIHNlbmRlcikudGhlbihzZW5kUmVzcG9uc2UpO1xuXHRyZXR1cm4gdHJ1ZTtcbn0pO1xuXG5jb25zdCBvdXRnb2luZ1RyYW5zbGF0aW9uUmVxdWVzdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlTWVzc2FnZXMobWVzc2FnZSwgc2VuZGVyOiBjaHJvbWUucnVudGltZS5NZXNzYWdlU2VuZGVyKSB7XG5cdGlmICghbWVzc2FnZSkge1xuXHRcdGRlYnVnKGBNZXNzYWdlIG11c3Qgbm90IGJlIGVtcHR5LlxcbiBzZW5kZXI6XFxuICR7SlNPTi5zdHJpbmdpZnkoc2VuZGVyKX1gKTtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRzd2l0Y2ggKG1lc3NhZ2Uua2luZCkge1xuXHRcdGNhc2UgJ3RyYW5zbGF0ZUltYWdlJzpcblx0XHRcdGNvbnN0IHRyYW5zbGF0ZUVycm9yTWVzc2FnZSA9IHZhbGlkYXRlSW1hZ2VNZXNzYWdlKG1lc3NhZ2UpO1xuXHRcdFx0aWYgKHRyYW5zbGF0ZUVycm9yTWVzc2FnZSkge1xuXHRcdFx0XHRkZWJ1ZyhgJHt0cmFuc2xhdGVFcnJvck1lc3NhZ2V9XFxuIG1lc3NhZ2U6XFxuICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSl9YCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaW1hZ2VJZGVudGl0eSA9XG5cdFx0XHRcdG1lc3NhZ2UudHJhbnNsYXRlVG8gKyBmYXN0SGFzaChtZXNzYWdlLmltYWdlLnNyYyB8fCBtZXNzYWdlLmltYWdlLmJhc2U2NERhdGEpO1xuXG5cdFx0XHQvLyBBbHJlYWR5IHRyYW5zbGF0aW5nIHRoZSBpbWFnZS5cblx0XHRcdGlmIChvdXRnb2luZ1RyYW5zbGF0aW9uUmVxdWVzdHMuaGFzKGltYWdlSWRlbnRpdHkpKSB7XG5cdFx0XHRcdHJldHVybiAnRnVsbFF1ZXVlJztcblx0XHRcdH1cblxuXHRcdFx0aWYgKG91dGdvaW5nVHJhbnNsYXRpb25SZXF1ZXN0cy5zaXplID49IDQpIHtcblx0XHRcdFx0cmV0dXJuICdGdWxsUXVldWUnO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRvdXRnb2luZ1RyYW5zbGF0aW9uUmVxdWVzdHMuYWRkKGltYWdlSWRlbnRpdHkpO1xuXHRcdFx0XHRjb25zdCB0cmFuc2xhdGlvbiA9IGF3YWl0IHRyYW5zbGF0ZShcblx0XHRcdFx0XHRtZXNzYWdlLmltYWdlLFxuXHRcdFx0XHRcdG1lc3NhZ2UudHJhbnNsYXRlVG8sXG5cdFx0XHRcdFx0bWVzc2FnZS5pbmNsdWRlQmFzZTY0RGF0YVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXR1cm4gdHJhbnNsYXRpb247XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRvdXRnb2luZ1RyYW5zbGF0aW9uUmVxdWVzdHMuZGVsZXRlKGltYWdlSWRlbnRpdHkpO1xuXHRcdFx0fVxuXG5cdFx0Y2FzZSAndHJhbnNsYXRlU25hcHNob3QnOlxuXHRcdFx0Y29uc3Qgc25hcHNob3RFcnJvck1lc3NhZ2UgPSB2YWxpZGF0ZVNuYXBzaG90TWVzc2FnZShtZXNzYWdlKTtcblx0XHRcdGlmIChzbmFwc2hvdEVycm9yTWVzc2FnZSkge1xuXHRcdFx0XHRkZWJ1ZyhgJHtzbmFwc2hvdEVycm9yTWVzc2FnZX1cXG4gbWVzc2FnZTpcXG4gJHtKU09OLnN0cmluZ2lmeShtZXNzYWdlKX1gKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRha2VTbmFwc2hvdChtZXNzYWdlLmRpbWVuc2lvbnMsIHNlbmRlci50YWIpO1xuXHRcdFx0aWYgKCFzbmFwc2hvdCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGltYWdlID0ge1xuXHRcdFx0XHRzcmM6IHNuYXBzaG90LmRhdGFVcmwsXG5cdFx0XHRcdHdpZHRoOiBtZXNzYWdlLmRpbWVuc2lvbnMud2lkdGgsXG5cdFx0XHRcdGhlaWdodDogbWVzc2FnZS5kaW1lbnNpb25zLmhlaWdodFxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHNuYXBzaG90VHJhbnNsYXRpb24gPSBhd2FpdCB0cmFuc2xhdGUoaW1hZ2UsIG1lc3NhZ2UudHJhbnNsYXRlVG8pO1xuXG5cdFx0XHQvLyBQb3NzaWJseSBmcmVlIHVwIG1lbW9yeS4gTWF5IG5vdCBoYXZlIGFueSBpbXBhY3QgYXQgYWxsLCBidXQgKHByb2JhYmx5KSBkb2Vzbid0IGh1cnQuXG5cdFx0XHRkZWxldGUgc25hcHNob3QuZGF0YVVybDtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dHJhbnNsYXRpb25zOiAoc25hcHNob3RUcmFuc2xhdGlvbiBhcyBhbnkpLnRyYW5zbGF0aW9ucyxcblx0XHRcdFx0em9vbUZhY3Rvcjogc25hcHNob3Quem9vbUZhY3RvclxuXHRcdFx0fTtcblxuXHRcdGNhc2UgJ3NldEV4dGVuc2lvbkljb24nOlxuXHRcdFx0YXdhaXQgZG9TZXRFeHRlbnNpb25JY29uKCk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHRjYXNlICdvcGVuTG9naW5Qb3B1cCc6XG5cdFx0XHRjb25zdCBjdXJyZW50VGFiID0gYXdhaXQgZ2V0Q3VycmVudFRhYigpO1xuXHRcdFx0Y2hyb21lLndpbmRvd3MuY3JlYXRlKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Zm9jdXNlZDogdHJ1ZSxcblx0XHRcdFx0XHR3aWR0aDogMzc2LFxuXHRcdFx0XHRcdGhlaWdodDogNDQwLFxuXHRcdFx0XHRcdHR5cGU6ICdwb3B1cCcsXG5cdFx0XHRcdFx0dXJsOiBgbG9naW5Qb3B1cC5odG1sP3JlZnJlc2hPbkNvbXBsZXRlVGFiSWQ9JHtjdXJyZW50VGFiLmlkfWAsXG5cdFx0XHRcdFx0dG9wOiAwLFxuXHRcdFx0XHRcdGxlZnQ6IDBcblx0XHRcdFx0fSxcblx0XHRcdFx0KCkgPT4ge31cblx0XHRcdCk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHRjYXNlICdvcGVuU2V0dGluZ3MnOlxuXHRcdFx0Y2hyb21lLnRhYnMuY3JlYXRlKHtcblx0XHRcdFx0dXJsOiBgY2hyb21lOi8vZXh0ZW5zaW9ucy8/aWQ9JHtjaHJvbWUucnVudGltZS5pZH1gXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybjtcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRkZWJ1Zyhcblx0XHRcdFx0YFVuc3VwcG9ydGVkIG1lc3NhZ2Uga2luZC5cXG4gc2VuZGVyOlxcbiAke0pTT04uc3RyaW5naWZ5KFxuXHRcdFx0XHRcdHNlbmRlclxuXHRcdFx0XHQpfVxcbiBSZWNlaXZlZCBtZXNzYWdlOiBcXG4gJHtKU09OLnN0cmluZ2lmeShtZXNzYWdlKX1gXG5cdFx0XHQpO1xuXHR9XG59XG5cbi8vIFJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSBzdHJpbmcgb24gZXJyb3IuXG4vLyB1bmRlZmluZWQgbWVhbnMgdGhlcmUgYXJlIG5vIGVycm9ycy5cbmZ1bmN0aW9uIHZhbGlkYXRlSW1hZ2VNZXNzYWdlKG1lc3NhZ2U6IGFueSkge1xuXHRsZXQgZXJyb3JNZXNzYWdlID0gJyc7XG5cblx0Y29uc3QgaW1hZ2UgPSBtZXNzYWdlLmltYWdlO1xuXHRpZiAoIWltYWdlKSB7XG5cdFx0cmV0dXJuICd0cmFuc2xhdGVJbWFnZSBtZXNzYWdlIG11c3Qgc2V0IGltYWdlLic7XG5cdH1cblxuXHRpZiAoIWltYWdlLnNyYyAmJiAhaW1hZ2UuYmFzZTY0RGF0YSkge1xuXHRcdGVycm9yTWVzc2FnZSArPSAndHJhbnNsYXRlSW1hZ2UgbWVzc2FnZSBtdXN0IHNldCBpbWFnZS5zcmMgb3IgaW1hZ2UuYmFzZTY0RGF0YVxcbic7XG5cdH1cblxuXHRpZiAoIWltYWdlLmhlaWdodCkge1xuXHRcdGVycm9yTWVzc2FnZSArPSAndHJhbnNsYXRlSW1hZ2UgbWVzc2FnZSBtdXN0IHNldCBpbWFnZS5oZWlnaHRcXG4nO1xuXHR9XG5cblx0aWYgKCFpbWFnZS53aWR0aCkge1xuXHRcdGVycm9yTWVzc2FnZSArPSAndHJhbnNsYXRlSW1hZ2UgbWVzc2FnZSBtdXN0IHNldCBpbWFnZS53aWR0aFxcbic7XG5cdH1cblxuXHRpZiAoIW1lc3NhZ2UudHJhbnNsYXRlVG8pIHtcblx0XHRlcnJvck1lc3NhZ2UgKz0gJ3RyYW5zbGF0ZUltYWdlIG1lc3NhZ2UgbXVzdCBzZXQgdHJhbnNsYXRlVG9cXG4nO1xuXHR9XG5cblx0cmV0dXJuIGVycm9yTWVzc2FnZSA9PT0gJycgPyB1bmRlZmluZWQgOiBlcnJvck1lc3NhZ2U7XG59XG5cbi8vIFJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSBzdHJpbmcgb24gZXJyb3IuXG4vLyB1bmRlZmluZWQgbWVhbnMgdGhlcmUgYXJlIG5vIGVycm9ycy5cbmZ1bmN0aW9uIHZhbGlkYXRlU25hcHNob3RNZXNzYWdlKG1lc3NhZ2U6IGFueSkge1xuXHRsZXQgZXJyb3JNZXNzYWdlID0gJyc7XG5cblx0aWYgKCFtZXNzYWdlLnRyYW5zbGF0ZVRvKSB7XG5cdFx0ZXJyb3JNZXNzYWdlICs9ICdNdXN0IHN1cHBseSB0cmFuc2xhdGVUby5cXG4nO1xuXHR9XG5cblx0aWYgKG1lc3NhZ2UuZGltZW5zaW9ucyA9PSBudWxsKSB7XG5cdFx0ZXJyb3JNZXNzYWdlICs9ICdNdXN0IHN1cHBseSBkaW1lbnNpb25zIG9mIHRvcCwgbGVmdCwgd2lkdGgsIGFuZCBoZWlnaHQuXFxuJztcblx0fSBlbHNlIHtcblx0XHRjb25zdCBkaW1lbnNpb25zID0gbWVzc2FnZS5kaW1lbnNpb25zO1xuXHRcdGlmICghTnVtYmVyLmlzSW50ZWdlcihkaW1lbnNpb25zLnRvcCkpIHtcblx0XHRcdGVycm9yTWVzc2FnZSArPSAndG9wIG11c3QgYmUgYW4gaW50ZWdlci4nO1xuXHRcdH1cblx0XHRpZiAoIU51bWJlci5pc0ludGVnZXIoZGltZW5zaW9ucy5sZWZ0KSkge1xuXHRcdFx0ZXJyb3JNZXNzYWdlICs9ICdsZWZ0IG11c3QgYmUgYW4gaW50ZWdlci4nO1xuXHRcdH1cblx0XHRpZiAoIU51bWJlci5pc0ludGVnZXIoZGltZW5zaW9ucy53aWR0aCkpIHtcblx0XHRcdGVycm9yTWVzc2FnZSArPSAnd2lkdGggbXVzdCBiZSBhbiBpbnRlZ2VyLic7XG5cdFx0fVxuXHRcdGlmICghTnVtYmVyLmlzSW50ZWdlcihkaW1lbnNpb25zLmhlaWdodCkpIHtcblx0XHRcdGVycm9yTWVzc2FnZSArPSAnaGVpZ2h0IG11c3QgYmUgYW4gaW50ZWdlci4nO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlcnJvck1lc3NhZ2UgPT09ICcnID8gdW5kZWZpbmVkIDogZXJyb3JNZXNzYWdlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb1NldEV4dGVuc2lvbkljb24oKSB7XG5cdC8vIENhbGN1bGF0ZSBpZiBNYW5nYSBUcmFuc2xhdG9yIGlzIGFjdGl2ZSBvbiB0aGUgY3VycmVudCB0YWIuXG5cdGNvbnN0IGFjdGl2ZVRhYiA9IGF3YWl0IGdldEN1cnJlbnRUYWIoKTtcblx0Y29uc3QgYWN0aXZlVXJscyA9IGF3YWl0IGFwcENvbmZpZy5nZXRBY3RpdmVVcmxzKCk7XG5cblx0aWYgKGFjdGl2ZVRhYiAmJiBhY3RpdmVVcmxzLmluY2x1ZGVzKGFjdGl2ZVRhYi5nZXRIb3N0TmFtZSgpKSkge1xuXHRcdGF3YWl0IHNldEV4dGVuc2lvbkljb24oe1xuXHRcdFx0cGF0aDogY2hyb21lLnJ1bnRpbWUuZ2V0VVJMKCdpY29ucy8xMjh4MTI4LnBuZycpLFxuXHRcdFx0dGFiSWQ6IGFjdGl2ZVRhYi5pZFxuXHRcdH0pO1xuXHR9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRha2VTbmFwc2hvdChcblx0eyB0b3AsIGxlZnQsIGhlaWdodCwgd2lkdGggfSxcblx0dGFiPzogY2hyb21lLnRhYnMuVGFiXG4pOiBQcm9taXNlPHsgZGF0YVVybDogc3RyaW5nOyB6b29tRmFjdG9yOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuXHRpZiAodGFiID09IG51bGwpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBkYXRhVXJsID0gYXdhaXQgY2FwdHVyZVZpc2libGVUYWIodGFiLndpbmRvd0lkKTtcblxuXHQvLyBTb21ldGhpbmcgd2VudCB3cm9uZy4gUG9zc2libHkgY2xvc2VkIHRhYiBvciByZWZyZXNoZWQuXG5cdGlmICghZGF0YVVybCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IHpvb21GYWN0b3IgPSBhd2FpdCBnZXRab29tRmFjdG9yKHRhYi5pZCk7XG5cdGNvbnN0IGRhdGFVcmxGZXRjaCA9IGF3YWl0IGZldGNoKGRhdGFVcmwpO1xuXHRjb25zdCB2aXNpYmxlVGFiQmxvYiA9IGF3YWl0IGRhdGFVcmxGZXRjaC5ibG9iKCk7XG5cblx0Y29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcblx0Y29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCdiaXRtYXByZW5kZXJlcicpO1xuXHRjb25zdCBiaXRtYXAgPSBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChcblx0XHR2aXNpYmxlVGFiQmxvYixcblx0XHR6b29tRmFjdG9yICogbGVmdCxcblx0XHR6b29tRmFjdG9yICogdG9wLFxuXHRcdHpvb21GYWN0b3IgKiB3aWR0aCxcblx0XHR6b29tRmFjdG9yICogaGVpZ2h0XG5cdCk7XG5cdGNvbnRleHQudHJhbnNmZXJGcm9tSW1hZ2VCaXRtYXAoYml0bWFwKTtcblxuXHRjb25zdCBzbmlwcGV0QmxvYiA9IGF3YWl0IGNhbnZhcy5jb252ZXJ0VG9CbG9iKCk7XG5cblx0Ly8gV2ViUCBpcyBmYXN0ZXIgdGhhbiBQTkcgYW5kIHN0aWxsIGxvc3NsZXNzLlxuXHRyZXR1cm4ge1xuXHRcdGRhdGFVcmw6IGF3YWl0IGJsb2JUb0Jhc2U2NChzbmlwcGV0QmxvYiksXG5cdFx0em9vbUZhY3RvclxuXHR9O1xufVxuXG5mdW5jdGlvbiBibG9iVG9CYXNlNjQoYmxvYjogQmxvYik6IFByb21pc2U8c3RyaW5nPiB7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgXykgPT4ge1xuXHRcdGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cdFx0cmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpO1xuXHRcdHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuXHR9KTtcbn1cblxuLy8gV29ya2Fyb3VuZDpcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzcxNzI0OTgwL2Nocm9tZS1leHRlbnNpb24tYWx3YXlzLXNob3ctc2VydmljZS13b3JrZXItaW5hY3RpdmUtYWZ0ZXItYnJvd3Nlci1yZXN0YXJ0LWlmXG5jaHJvbWUucnVudGltZS5vblN0YXJ0dXAuYWRkTGlzdGVuZXIoZnVuY3Rpb24gKCkge1xuXHRjb25zb2xlLmxvZygnaWNoaWdvLWV4dGVuc2lvbi1zdGFydHVwJyk7XG59KTtcbiIsImltcG9ydCB7IGV4ZWN1dGVTY3JpcHQsIGdldEN1cnJlbnRUYWIsIHNldEV4dGVuc2lvbkljb24gfSBmcm9tICcuLi8uLi91dGlscy9jaHJvbWVBcGknO1xuaW1wb3J0IHsgYXBwQ29uZmlnIH0gZnJvbSAnLi4vLi4vdXRpbHMvYXBwQ29uZmlnJztcblxuY29uc3QgbSA9IGNocm9tZS5pMThuLmdldE1lc3NhZ2U7XG5jb25zdCB0cmFuc2xhdGVkUGFnZU1lbnVJZCA9ICdpY2hpZ28tdHJhbnNsYXRlLXBhZ2UnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdENvbnRleHRNZW51cygpIHtcblx0Ly8gQ2xlYXIgcHJldmlvdXMgY29udGV4dCBtZW51IHRvIHByZXZlbnQgXCJkdXBsaWNhdGUgY29udGV4dCBtZW51XCIgZXJyb3IuXG5cdGF3YWl0IHJlbW92ZUNvbnRleHRNZW51KHRyYW5zbGF0ZWRQYWdlTWVudUlkKTtcblxuXHRjaHJvbWUuY29udGV4dE1lbnVzLmNyZWF0ZSh7XG5cdFx0aWQ6IHRyYW5zbGF0ZWRQYWdlTWVudUlkLFxuXHRcdHRpdGxlOiBtKCd0b2dnbGVUcmFuc2xhdGlvbnNDb250ZXh0TWVudScpLFxuXHRcdHR5cGU6ICdub3JtYWwnLFxuXHRcdGNvbnRleHRzOiBbJ2FsbCddXG5cdH0pO1xuXG5cdGNocm9tZS5jb250ZXh0TWVudXMub25DbGlja2VkLmFkZExpc3RlbmVyKGFzeW5jIChjb250ZXh0OiBjaHJvbWUuY29udGV4dE1lbnVzLk9uQ2xpY2tEYXRhKSA9PiB7XG5cdFx0aWYgKGNvbnRleHQ/Lm1lbnVJdGVtSWQgIT09IHRyYW5zbGF0ZWRQYWdlTWVudUlkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHRhYiA9IGF3YWl0IGdldEN1cnJlbnRUYWIoKTtcblx0XHRpZiAoIXRhYikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBjb25maWdBY3RpdmVVcmxzID0gYXdhaXQgYXBwQ29uZmlnLmdldEFjdGl2ZVVybHMoKTtcblx0XHRjb25zdCBpc1RvZ2dsZWRPbiA9IGNvbmZpZ0FjdGl2ZVVybHMuaW5jbHVkZXModGFiLmdldEhvc3ROYW1lKCkpO1xuXG5cdFx0aWYgKGlzVG9nZ2xlZE9uKSB7XG5cdFx0XHQvLyBUb2dnbGUgb2ZmLlxuXHRcdFx0YXdhaXQgYXBwQ29uZmlnLnJlbW92ZUFjdGl2ZVVybCh0YWIuZ2V0SG9zdE5hbWUoKSk7XG5cdFx0XHRhd2FpdCBzZXRFeHRlbnNpb25JY29uKHtcblx0XHRcdFx0cGF0aDogY2hyb21lLnJ1bnRpbWUuZ2V0VVJMKCdpY29ucy8xMjh4MTI4LWRpc2FibGVkLnBuZycpLFxuXHRcdFx0XHR0YWJJZDogdGFiLmlkXG5cdFx0XHR9KTtcblxuXHRcdFx0YXdhaXQgZXhlY3V0ZVNjcmlwdCh0YWIuaWQsICdqcy9jbGVhclRyYW5zbGF0aW9ucy5qcycpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUb2dnbGUgb24uXG5cdFx0XHRhd2FpdCBhcHBDb25maWcuYWRkQWN0aXZlVXJsKHRhYi5nZXRIb3N0TmFtZSgpKTtcblx0XHRcdGF3YWl0IHNldEV4dGVuc2lvbkljb24oe1xuXHRcdFx0XHRwYXRoOiBjaHJvbWUucnVudGltZS5nZXRVUkwoJ2ljb25zLzEyOHgxMjgucG5nJyksXG5cdFx0XHRcdHRhYklkOiB0YWIuaWRcblx0XHRcdH0pO1xuXHRcdH1cblx0fSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNvbnRleHRNZW51KG1lbnVJZDogc3RyaW5nKSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcblx0XHRjaHJvbWUuY29udGV4dE1lbnVzLnJlbW92ZShtZW51SWQsICgpID0+IHtcblx0XHRcdGlmIChjaHJvbWUucnVudGltZS5sYXN0RXJyb3IpIHtcblx0XHRcdFx0Ly8gRG8gbm90aGluZyBpZiBhbiBlcnJvciBvY2N1cnMuIENhbiBoYXBwZW4gaWYgbWVudSBpdGVtIGRvZXNuJ3QgZXhpc3QuXG5cdFx0XHR9XG5cdFx0XHRyZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fSk7XG5cdH0pO1xufVxuIiwiaW1wb3J0IHsgZGVidWcsIHRyYW5zbGF0ZUltYWdlIH0gZnJvbSAnLi4vdXRpbHMvaWNoaWdvQXBpJztcbmltcG9ydCB7IGdldEJhc2U2NERhdGEgfSBmcm9tICcuL3V0aWxzL2ltYWdlVXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25SZXN1bHRzLCBjYWxjdWxhdGVSZXNpemVkQXNwZWN0UmF0aW8gfSBmcm9tICcuLi91dGlscy90cmFuc2xhdGlvbic7XG5pbXBvcnQgeyBmYXN0SGFzaCB9IGZyb20gJy4vdXRpbHMvZmFzdEhhc2gnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VDb2RlIH0gZnJvbSAnLi4vdXRpbHMvbG9jYWxlcyc7XG5cbmNvbnN0IHRyYW5zbGF0aW9uQ2FjaGUgPSB7fTtcblxuaW50ZXJmYWNlIEltYWdlIHtcblx0d2lkdGg6IG51bWJlcjtcblx0aGVpZ2h0OiBudW1iZXI7XG5cdGJhc2U2NERhdGE/OiBzdHJpbmc7XG5cblx0Ly8gVVJMIG9mIHRoZSBpbWFnZSB0byB0cmFuc2xhdGUuIE1heSBiZSBiYXNlNjQgZGF0YS5cblx0Ly8gRWl0aGVyIGBzcmNgIG9yIGBiYXNlNjREYXRhYCBtdXN0IGJlIHNldC5cblx0c3JjPzogc3RyaW5nO1xufVxuXG4vLyBOb3RlIHRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gY29udGV4dHMgd2hpY2ggY2FuIG1ha2UgSFRUUCByZXF1ZXN0cy5cbi8vIEZvciBleGFtcGxlLCBgYmFja2dyb3VuZC50c2AuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNsYXRlKFxuXHRvcmlnaW5hbEltYWdlOiBJbWFnZSxcblx0dHJhbnNsYXRlVG86IExhbmd1YWdlQ29kZSxcblx0aW5jbHVkZUJhc2U2NERhdGE/OiBib29sZWFuXG4pOiBQcm9taXNlPFRyYW5zbGF0aW9uUmVzdWx0cyB8ICdGZXRjaEVycm9yJyB8ICdTaXRlQWNjZXNzRXJyb3InPiB7XG5cdGxldCBpbWFnZVRvVHJhbnNsYXRlID0gb3JpZ2luYWxJbWFnZTtcblxuXHRpZiAoaW1hZ2VUb1RyYW5zbGF0ZS5iYXNlNjREYXRhID09PSB1bmRlZmluZWQgJiYgb3JpZ2luYWxJbWFnZS5zcmMpIHtcblx0XHRjb25zdCBmZXRjaGVkSW1hZ2UgPSBhd2FpdCBmZXRjaEltYWdlV2l0aFNjYWxpbmcob3JpZ2luYWxJbWFnZSk7XG5cdFx0Y29uc3QgZmFpbGVkID0gZmV0Y2hlZEltYWdlID09PSAnRmV0Y2hFcnJvcicgfHwgZmV0Y2hlZEltYWdlID09PSAnU2l0ZUFjY2Vzc0Vycm9yJztcblx0XHRpZiAoZmFpbGVkKSB7XG5cdFx0XHRyZXR1cm4gZmV0Y2hlZEltYWdlO1xuXHRcdH1cblxuXHRcdGltYWdlVG9UcmFuc2xhdGUgPSBmZXRjaGVkSW1hZ2U7XG5cdH1cblxuXHQvLyBJZiB3ZSBjb3VsZG4ndCBnZXQgYmFzZTY0IGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgaW1hZ2Ugb3IgYGZldGNoSW1hZ2VXaXRoU2NhbGluZ2AsIHJldHVybiBmYWlsdXJlLlxuXHRpZiAoaW1hZ2VUb1RyYW5zbGF0ZS5iYXNlNjREYXRhID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gJ0ZldGNoRXJyb3InO1xuXHR9XG5cblx0Ly8gQ2FjaGUgdHJhbnNsYXRpb25zIG9uIHRoZSBNRDUgaGFzaCBvZiB0aGUgaW1hZ2UgZGF0YS5cblx0Ly8gVGhlIFVSTCBpcyBub3QgdXNlZCBhcyB0aGUga2V5IGJlY2F1c2UgaXQgbWF5IHJldHVybiBkaWZmZXJlbnQgcmVzdWx0cyBkZXBlbmRpbmcgb24gdmFyaW91cyBmYWN0b3JzLlxuXHRjb25zdCBpbWFnZUlkZW50aXR5ID0gdHJhbnNsYXRlVG8gKyBmYXN0SGFzaChpbWFnZVRvVHJhbnNsYXRlLmJhc2U2NERhdGEpO1xuXHRjb25zdCBjYWNoZWRUcmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uQ2FjaGVbaW1hZ2VJZGVudGl0eV07XG5cdGNvbnN0IHJlc3VsdCA9XG5cdFx0Y2FjaGVkVHJhbnNsYXRpb24gfHwgKGF3YWl0IHRyYW5zbGF0ZUltYWdlKHRyYW5zbGF0ZVRvLCBpbWFnZVRvVHJhbnNsYXRlLmJhc2U2NERhdGEpKTtcblx0dHJhbnNsYXRpb25DYWNoZVtpbWFnZUlkZW50aXR5XSA9IHJlc3VsdDtcblxuXHRjb25zdCBiYXNlNjREYXRhID0gaW5jbHVkZUJhc2U2NERhdGEgJiYgaW1hZ2VUb1RyYW5zbGF0ZS5iYXNlNjREYXRhO1xuXG5cdHJldHVybiB7XG5cdFx0aW1hZ2U6IHsgd2lkdGg6IGltYWdlVG9UcmFuc2xhdGUud2lkdGgsIGhlaWdodDogaW1hZ2VUb1RyYW5zbGF0ZS5oZWlnaHQgfSxcblx0XHR0cmFuc2xhdGlvbnM6IHJlc3VsdC50cmFuc2xhdGlvbnMsXG5cdFx0YmFzZTY0RGF0YVxuXHR9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEltYWdlV2l0aFNjYWxpbmcoaW1hZ2U6IEltYWdlKSB7XG5cdC8vIERvd25zY2FsZSBleHRyYSBsYXJnZSBpbWFnZXMuIEhlbHBzIHByZXZlbnQgcHJvY2Vzc2luZyB0aW1lb3V0cy5cblx0Y29uc3QgW3Jlc2l6ZWRXaWR0aCwgcmVzaXplZEhlaWdodF0gPSBjYWxjdWxhdGVSZXNpemVkQXNwZWN0UmF0aW8oe1xuXHRcdHdpZHRoOiBpbWFnZS53aWR0aCxcblx0XHRoZWlnaHQ6IGltYWdlLmhlaWdodCxcblx0XHRoZWlnaHRNYXhQeDogMTgwMCxcblx0XHR3aWR0aE1heFB4OiAxODAwXG5cdH0pO1xuXG5cdGRlYnVnKGBoOiR7cmVzaXplZEhlaWdodH0gdzoke3Jlc2l6ZWRXaWR0aH1gKTtcblxuXHRjb25zdCByZXNpemVkSW1hZ2UgPSB7XG5cdFx0Li4uaW1hZ2UsXG5cdFx0b3JpZ2luYWxXaWR0aDogaW1hZ2Uud2lkdGgsXG5cdFx0b3JpZ2luYWxIZWlnaHQ6IGltYWdlLmhlaWdodCxcblx0XHRyZXNpemVkV2lkdGgsXG5cdFx0cmVzaXplZEhlaWdodFxuXHR9O1xuXG5cdGNvbnN0IGVuY29kZWRJbWFnZSA9IGF3YWl0IGdldEJhc2U2NERhdGEocmVzaXplZEltYWdlIGFzIGFueSk7XG5cdHJldHVybiBlbmNvZGVkSW1hZ2U7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZmFzdEhhc2goc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRsZXQgaGFzaCA9ICcnO1xuXHRjb25zdCBsZW4gPSBzdHIubGVuZ3RoO1xuXHRjb25zdCBzZWxlY3RDb3VudCA9IDE1MDtcblxuXHQvLyBTZWxlY3QgdGhlIGZpcnN0IDE1MCBjaGFyYWN0ZXJzLlxuXHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdENvdW50ICYmIGkgPCBsZW47IGkrKykge1xuXHRcdGhhc2ggKz0gc3RyLmNoYXJDb2RlQXQoaSk7XG5cdH1cblxuXHQvLyBTZWxlY3QgdGhlIGxhc3QgMTUwIGNoYXJhY3RlcnMuXG5cdGZvciAobGV0IGkgPSBsZW4gLSBzZWxlY3RDb3VudDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0aWYgKGkgPj0gMCkge1xuXHRcdFx0aGFzaCArPSBzdHIuY2hhckNvZGVBdChpKTtcblx0XHR9XG5cdH1cblxuXHQvLyBMb29wIHRocm91Z2ggdGhlIGVudGlyZSBzdHJpbmcsIGluY3JlYXNpbmcgdGhlIGluZGV4IGJ5IGEgc2xpY2Ugb2YgMS8xMDAwdGggdGhlIHRvdGFsIGxlbmd0aFxuXHRjb25zdCBzdGVwID0gTWF0aC5jZWlsKGxlbiAvIDEwMDApICsgMTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gc3RlcCkge1xuXHRcdGhhc2ggKz0gc3RyLmNoYXJDb2RlQXQoaSk7XG5cdH1cblxuXHRyZXR1cm4gaGFzaDtcbn1cbiIsImltcG9ydCB7IGRlYnVnIH0gZnJvbSAnLi4vLi4vdXRpbHMvaWNoaWdvQXBpJztcbmltcG9ydCB7IGdldEltYWdlIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIEltYWdlQmFzZTY0ID0gc3RyaW5nOyAvLyBFZyAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvLi4uJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QmFzZTY0RGF0YSh7XG5cdHNyYyxcblx0cmVzaXplZFdpZHRoLFxuXHRyZXNpemVkSGVpZ2h0LFxuXHRvcmlnaW5hbEhlaWdodCxcblx0b3JpZ2luYWxXaWR0aFxufToge1xuXHRzcmM6IHN0cmluZztcblx0cmVzaXplZFdpZHRoOiBudW1iZXI7XG5cdHJlc2l6ZWRIZWlnaHQ6IG51bWJlcjtcblx0b3JpZ2luYWxXaWR0aDogbnVtYmVyO1xuXHRvcmlnaW5hbEhlaWdodDogbnVtYmVyO1xuXHRiYXNlNjREYXRhPzogSW1hZ2VCYXNlNjQ7XG59KTogUHJvbWlzZTxcblx0eyBiYXNlNjREYXRhOiBJbWFnZUJhc2U2NDsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8ICdGZXRjaEVycm9yJyB8ICdTaXRlQWNjZXNzRXJyb3InXG4+IHtcblx0bGV0IGltYWdlRGF0YTtcblx0dHJ5IHtcblx0XHRpbWFnZURhdGEgPSBhd2FpdCBnZXRJbWFnZShzcmMpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgdXNlcnMgc2V0cyBNYW5nYSBUcmFuc2xhdG9yJ3MgXCJTaXRlIEFjY2Vzc1wiIHRvIFwiT24gY2xpY2tcIixcblx0XHQvLyBpbnN0ZWFkIG9mIFwiT24gYWxsIHNpdGVzXCIsIGR1ZSB0byBDT1JTLiBJdCBjYW4gYWxzbyBoYXBwZW4gaWYgcmVmZXJlciBpcyBub3QgcHJvcGVybHkgc2V0LCBvbiBzb21lIGRvbWFpbnMuXG5cdFx0cmV0dXJuICdTaXRlQWNjZXNzRXJyb3InO1xuXHR9XG5cblx0aWYgKCF2YWxpZFN0YXR1c0NvZGUoaW1hZ2VEYXRhLnN0YXR1cykpIHtcblx0XHRyZXR1cm4gJ0ZldGNoRXJyb3InO1xuXHR9XG5cblx0Y29uc3QgYmxvYiA9IGF3YWl0IGltYWdlRGF0YS5ibG9iKCk7XG5cdGNvbnN0IHNob3VsZFJlc2l6ZSA9IHJlc2l6ZWRXaWR0aCAhPSBvcmlnaW5hbFdpZHRoIHx8IHJlc2l6ZWRIZWlnaHQgIT0gb3JpZ2luYWxIZWlnaHQ7XG5cblx0aWYgKHNob3VsZFJlc2l6ZSkge1xuXHRcdGRlYnVnKGByZXNpemVkOiAke3Jlc2l6ZWRXaWR0aH0vJHtvcmlnaW5hbFdpZHRofSA6ICR7cmVzaXplZEhlaWdodH0vJHtvcmlnaW5hbEhlaWdodH1gKTtcblx0XHRjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHJlc2l6ZWRXaWR0aCwgcmVzaXplZEhlaWdodCk7XG5cdFx0Y29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCdiaXRtYXByZW5kZXJlcicpO1xuXHRcdGNvbnN0IGJpdG1hcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGJsb2IsIHtcblx0XHRcdHJlc2l6ZVdpZHRoOiByZXNpemVkV2lkdGgsXG5cdFx0XHRyZXNpemVIZWlnaHQ6IHJlc2l6ZWRIZWlnaHQsXG5cdFx0XHRyZXNpemVRdWFsaXR5OiAnaGlnaCdcblx0XHR9KTtcblx0XHRjb250ZXh0LnRyYW5zZmVyRnJvbUltYWdlQml0bWFwKGJpdG1hcCk7XG5cblx0XHRjb25zdCByZXNpemVkQmxvYiA9IGF3YWl0IGNhbnZhcy5jb252ZXJ0VG9CbG9iKCk7XG5cdFx0Y29uc3QgYmFzZTY0RGF0YSA9IGF3YWl0IGJsb2JUb0Jhc2U2NChyZXNpemVkQmxvYik7XG5cblx0XHRyZXR1cm4geyBiYXNlNjREYXRhLCB3aWR0aDogcmVzaXplZFdpZHRoLCBoZWlnaHQ6IHJlc2l6ZWRIZWlnaHQgfTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCBiYXNlNjREYXRhID0gYXdhaXQgYmxvYlRvQmFzZTY0KGJsb2IpO1xuXHRcdHJldHVybiB7IGJhc2U2NERhdGEsIHdpZHRoOiBvcmlnaW5hbFdpZHRoLCBoZWlnaHQ6IG9yaWdpbmFsSGVpZ2h0IH07XG5cdH1cbn1cblxuZnVuY3Rpb24gYmxvYlRvQmFzZTY0KGJsb2I6IEJsb2IpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIF8pID0+IHtcblx0XHRjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXHRcdHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcblx0XHRyZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkU3RhdHVzQ29kZShzdGF0dXNDb2RlOiBudW1iZXIpOiBib29sZWFuIHtcblx0Ly8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX0hUVFBfc3RhdHVzX2NvZGVzXG5cdHJldHVybiBzdGF0dXNDb2RlID49IDIwMCAmJiBzdGF0dXNDb2RlIDwgNDAwO1xufVxuIiwiaW1wb3J0IHsgdXBkYXRlU2Vzc2lvbkhlYWRlcnMgfSBmcm9tICcuLi8uLi91dGlscy9jaHJvbWVBcGknO1xuXG4vLyBBIHNldCBvZiBjb21tb24gZnVuY3Rpb25zIHRoYXQgYXJlbid0IHdvcnRoIGdyb3VwaW5nIGFsb25lLlxuLy8gQnJlYWsgbW9kdWxlIGludG8gbXVsdGlwbGUgbW9kdWxlcyB3aGVuIGl0IGdyb3dzIHRvbyBsYXJnZSAoODAwKyBMT0MpLlxuZXhwb3J0IGZ1bmN0aW9uIHNsZWVwTXMobWlsbGlzZWNvbmRzKSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG5cbmNvbnN0IE1vZGlmeUhlYWRlcnMgPSAnbW9kaWZ5SGVhZGVycycgYXMgY2hyb21lLmRlY2xhcmF0aXZlTmV0UmVxdWVzdC5SdWxlQWN0aW9uVHlwZS5NT0RJRllfSEVBREVSUztcbmNvbnN0IFNldEhlYWRlciA9ICdzZXQnIGFzIGNocm9tZS5kZWNsYXJhdGl2ZU5ldFJlcXVlc3QuSGVhZGVyT3BlcmF0aW9uLlNFVDtcbmNvbnN0IFJlcXVlc3QgPSAneG1saHR0cHJlcXVlc3QnIGFzIGNocm9tZS5kZWNsYXJhdGl2ZU5ldFJlcXVlc3QuUmVzb3VyY2VUeXBlLlhNTEhUVFBSRVFVRVNUO1xuXG5sZXQgaWQgPSAxO1xuZnVuY3Rpb24gZ2V0SWQoKSB7XG5cdHJldHVybiBpZCsrO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SW1hZ2Uoc3JjOiBzdHJpbmcpIHtcblx0bGV0IGhvc3RuYW1lO1xuXHR0cnkge1xuXHRcdGhvc3RuYW1lID0gbmV3IFVSTChzcmMpLmhvc3RuYW1lO1xuXHR9IGNhdGNoIHtcblx0XHRob3N0bmFtZSA9ICcnO1xuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgaG9zdG5hbWUgbWF0Y2hlcyBhbnkgb2YgdGhlIHJlZmVyZXIgaGVhZGVyIHJ1bGUgaWRzLlxuXHRjb25zdCBydWxlVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhydWxlcyk7XG5cdGZvciAoY29uc3QgcnVsZSBvZiBydWxlVmFsdWVzKSB7XG5cdFx0aWYgKGhvc3RuYW1lLmluY2x1ZGVzKHJ1bGUuY29uZGl0aW9uLnVybEZpbHRlcikpIHtcblx0XHRcdGNvbnN0IGNsb25lZFJ1bGUgPSB7IC4uLnJ1bGUsIGlkOiBnZXRJZCgpIH07XG5cdFx0XHR1cGRhdGVTZXNzaW9uSGVhZGVycyh7IGFkZFJ1bGVzOiBbY2xvbmVkUnVsZV0gfSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoKHNyYyk7XG5cblx0XHRcdHVwZGF0ZVNlc3Npb25IZWFkZXJzKHsgcmVtb3ZlUnVsZUlkczogW2Nsb25lZFJ1bGUuaWRdIH0pO1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cdH1cblxuXHQvLyBPdGhlcndpc2UsIHJldHVybiByZWd1bGFyIGZldGNoIHJlcXVlc3QuXG5cdHJldHVybiBhd2FpdCBmZXRjaChzcmMpO1xufVxuXG5jb25zdCBydWxlcyA9IHtcblx0cGl4aXY6IHtcblx0XHRpZDogZ2V0SWQoKSxcblx0XHRwcmlvcml0eTogMSxcblx0XHRhY3Rpb246IHtcblx0XHRcdHR5cGU6IE1vZGlmeUhlYWRlcnMsXG5cdFx0XHRyZXF1ZXN0SGVhZGVyczogW1xuXHRcdFx0XHR7IGhlYWRlcjogJ3JlZmVyZXInLCBvcGVyYXRpb246IFNldEhlYWRlciwgdmFsdWU6ICdodHRwczovL3d3dy5waXhpdi5uZXQvJyB9XG5cdFx0XHRdXG5cdFx0fSxcblx0XHRjb25kaXRpb246IHtcblx0XHRcdHVybEZpbHRlcjogJ3B4aW1nLm5ldCcsXG5cdFx0XHRyZXNvdXJjZVR5cGVzOiBbUmVxdWVzdF1cblx0XHR9XG5cdH0sXG5cdG1hbmh1YWd1aToge1xuXHRcdGlkOiBnZXRJZCgpLFxuXHRcdHByaW9yaXR5OiAxLFxuXHRcdGFjdGlvbjoge1xuXHRcdFx0dHlwZTogTW9kaWZ5SGVhZGVycyxcblx0XHRcdHJlcXVlc3RIZWFkZXJzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRoZWFkZXI6ICdyZWZlcmVyJyxcblx0XHRcdFx0XHRvcGVyYXRpb246IFNldEhlYWRlcixcblx0XHRcdFx0XHR2YWx1ZTogJ2h0dHBzOi8vd3d3Lm1hbmh1YWd1aS5jb20vJ1xuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fSxcblx0XHRjb25kaXRpb246IHtcblx0XHRcdHVybEZpbHRlcjogJ2kuaGFtcmV1cy5jb20nLFxuXHRcdFx0cmVzb3VyY2VUeXBlczogW1JlcXVlc3RdXG5cdFx0fVxuXHR9LFxuXHRoaXRvbWk6IHtcblx0XHRpZDogZ2V0SWQoKSxcblx0XHRwcmlvcml0eTogMSxcblx0XHRhY3Rpb246IHtcblx0XHRcdHR5cGU6IE1vZGlmeUhlYWRlcnMsXG5cdFx0XHRyZXF1ZXN0SGVhZGVyczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aGVhZGVyOiAncmVmZXJlcicsXG5cdFx0XHRcdFx0b3BlcmF0aW9uOiBTZXRIZWFkZXIsXG5cdFx0XHRcdFx0dmFsdWU6ICdodHRwczovL2hpdG9taS5sYS8nXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9LFxuXHRcdGNvbmRpdGlvbjoge1xuXHRcdFx0dXJsRmlsdGVyOiAnaGl0b21pLmxhJyxcblx0XHRcdHJlc291cmNlVHlwZXM6IFtSZXF1ZXN0XVxuXHRcdH1cblx0fSxcblx0a2xtYW5nYToge1xuXHRcdGlkOiBnZXRJZCgpLFxuXHRcdHByaW9yaXR5OiAxLFxuXHRcdGFjdGlvbjoge1xuXHRcdFx0dHlwZTogTW9kaWZ5SGVhZGVycyxcblx0XHRcdHJlcXVlc3RIZWFkZXJzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRoZWFkZXI6ICdyZWZlcmVyJyxcblx0XHRcdFx0XHRvcGVyYXRpb246IFNldEhlYWRlcixcblx0XHRcdFx0XHR2YWx1ZTogJ2h0dHBzOi8va2xtYW5nYS5jb20vJ1xuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fSxcblx0XHRjb25kaXRpb246IHtcblx0XHRcdHVybEZpbHRlcjogJ2tsaW12MS54eXonLFxuXHRcdFx0cmVzb3VyY2VUeXBlczogW1JlcXVlc3RdXG5cdFx0fVxuXHR9XG59O1xuIiwiaW1wb3J0IHsgZ2V0RGVmYXVsdExhbmd1YWdlLCBMYW5ndWFnZUNvZGUsIGxhbmd1YWdlQ29kZXMgfSBmcm9tICcuL2xvY2FsZXMnO1xuaW1wb3J0IHsgZ2V0U3RvcmFnZUl0ZW0sIHNldFN0b3JhZ2VJdGVtIH0gZnJvbSAnLi9jaHJvbWVBcGknO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQ29uZmlnIHtcblx0Ly8gR2V0cyB0aGUgY2xpZW50IHV1aWQuXG5cdGdldENsaWVudFV1aWQ6ICgpID0+IFByb21pc2U8c3RyaW5nPjtcblxuXHQvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBmb250IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIFVJIHN0cmluZ3MuXG5cdC8vIGVnIGB0ZXh0LnN0eWxlLmZvbnRGYW1pbHkgPSBhcHBDb25maWcuZ2V0VUlGb250TmFtZSgpO2Bcblx0Ly8gcmV0dXJucyBgc3lzdGVtLWRlZmF1bHRgIGZvciBsYW5ndWFnZXMgdGhhdCBkb24ndCBoYXZlIGEgZm9udCBmaWxlLlxuXHRnZXRVSUZvbnRGYW1pbHk6ICgpID0+IHN0cmluZztcblxuXHQvLyBTZXQvZ2V0IHRoZSBsYW5ndWFnZSBjb2RlIG9mIHRoZSBsYW5ndWFnZSB0byB0cmFuc2xhdGUgdG8uXG5cdGdldFRyYW5zbGF0ZVRvTGFuZ3VhZ2U6ICgpID0+IFByb21pc2U8TGFuZ3VhZ2VDb2RlPjtcblx0c2V0VHJhbnNsYXRlVG9MYW5ndWFnZTogKGxhbmd1YWdlQ29kZTogTGFuZ3VhZ2VDb2RlKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuXG5cdC8vIFNldC9nZXQgY3VycmVudCB1c2VyIGVtYWlsLlxuXHRnZXRFbWFpbDogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuXHRzZXRFbWFpbDogKGVtYWlsOiBzdHJpbmcpID0+IFByb21pc2U8Ym9vbGVhbj47XG5cblx0Ly8gU2V0L2dldCBjb25maWd1cmVkIG1hbmdhIGZvbnQgZmFtaWx5LlxuXHRnZXRGb250RmFtaWx5OiAoKSA9PiBQcm9taXNlPHN0cmluZz47XG5cdHNldEZvbnRGYW1pbHk6IChmb250RmFtaWx5OiBzdHJpbmcpID0+IFByb21pc2U8Ym9vbGVhbj47XG5cblx0Ly8gU2V0L2dldCBjb25maWd1cmVkIG1hbmdhIGZvbnQgY29sb3IuXG5cdGdldEZvbnRDb2xvcjogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuXHRzZXRGb250Q29sb3I6IChmb250Q29sb3I6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcblxuXHQvLyBTZXQvZ2V0IGNvbmZpZ3VyZWQgbWFuZ2EgZm9udCB3ZWlnaHQuXG5cdGdldEZvbnRXZWlnaHQ6ICgpID0+IFByb21pc2U8c3RyaW5nPjtcblx0c2V0Rm9udFdlaWdodDogKGZvbnRXZWlnaHQ6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcblxuXHQvLyBhZGQvcmVtb3ZlL2dldCBhY3RpdmUgdHJhbnNsYXRpb24gdXJscy5cblx0Ly8gQW4gYWN0aXZlIHVybCBpcyBhIHNpdGUgdGhlIGV4dGVuc2lvbiB3aWxsIHNjYW4gZm9yIHRyYW5zbGF0aW9uIG9wcG9ydHVuaXRpZXMuXG5cdGdldEFjdGl2ZVVybHM6ICgpID0+IFByb21pc2U8c3RyaW5nW10+O1xuXHRhZGRBY3RpdmVVcmw6IChhY3RpdmVVcmw6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcblx0cmVtb3ZlQWN0aXZlVXJsOiAoYWN0aXZlVXJsOiBzdHJpbmcpID0+IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbmVudW0gS2V5cyB7XG5cdEVtYWlsID0gJ2VtYWlsJyxcblx0Rm9udEZhbWlseSA9ICdmb250RmFtaWx5Jyxcblx0Rm9udENvbG9yID0gJ2ZvbnRDb2xvcicsXG5cdEZvbnRXZWlnaHQgPSAnZm9udFdlaWdodCcsXG5cdEFjdGl2ZVVybHMgPSAnYWN0aXZlVXJscycsXG5cdENsaWVudFV1aWQgPSAnY2xpZW50VXVpZCcsXG5cdFRyYW5zbGF0ZVRvTGFuZ3VhZ2UgPSAndHJhbnNsYXRlVG9MYW5ndWFnZSdcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRzID0gT2JqZWN0LmZyZWV6ZSh7XG5cdGVtYWlsOiAnJyxcblx0Zm9udEZhbWlseTogJ0NDIFdpbGQgV29yZHMnLFxuXHRmb250Q29sb3I6ICcjMDAwMDAwJyxcblx0Zm9udFdlaWdodDogJ2luaXRpYWwnLFxuXHR0cmFuc2xhdGVUb0xhbmd1YWdlOiBnZXREZWZhdWx0TGFuZ3VhZ2UoKVxufSk7XG5cbi8vIFVzZWQgdG8gY2hlY2sgaWYgYW55IG9mIHRoZSBhY3RpdmVVcmwgYXBwQ29uZmlnIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGFjY2Vzc2VkLlxuLy8gVGhpcyBpcyBzbyBkZWZhdWx0cyBjYW4gYmUgaW5pdGlhbGl6ZWQuXG4vLyBUaGlzIGNhbm5vdCBiZSBkb25lIGluIGNocm9tZS5ydW50aW1lLm9uSW5zdGFsbGVkIGR1ZSB0byB0aGF0IGV2ZW50IGJlaW5nIHRyaWdnZXJlZCBvbiBjaHJvbWUgdXBkYXRlcyxcbi8vIGFuZCBvbiBhcHAgdXBkYXRlcy5cbmNvbnN0IGhhc0luaXRBY3RpdmVVcmxEZWZhdWx0cyA9ICdfaXNBY3RpdmVVcmxJbml0S2V5JztcbmNvbnN0IGNvbW1vbk1hbmdhU2l0ZXMgPSBbXTtcblxuZXhwb3J0IGNvbnN0IGFwcENvbmZpZzogQXBwQ29uZmlnID0gT2JqZWN0LmZyZWV6ZSh7XG5cdGdldENsaWVudFV1aWQ6IGFzeW5jICgpID0+IHtcblx0XHRjb25zdCBjbGllbnRVdWlkID0gYXdhaXQgZ2V0U3RvcmFnZUl0ZW08c3RyaW5nPihLZXlzLkNsaWVudFV1aWQpO1xuXHRcdGlmIChjbGllbnRVdWlkKSB7XG5cdFx0XHRyZXR1cm4gY2xpZW50VXVpZDtcblx0XHR9XG5cblx0XHQvLyBJbml0aWFsaXplIGNsaWVudCB1dWlkLlxuXHRcdC8vIElmIHN0b3JhZ2UgaXMgZnVsbCwgdGhpcyBjb3VsZCBmYWlsIHJlcGVhdGVkbHksIGJ1dCBjbGllbnQgdXVpZHMgYXJlIG5vdCBjcnVjaWFsLlxuXHRcdGNvbnN0IG5ld1V1aWQgPSB1dWlkdjQoKTtcblx0XHRhd2FpdCBzZXRTdG9yYWdlSXRlbTxzdHJpbmc+KEtleXMuQ2xpZW50VXVpZCwgbmV3VXVpZCk7XG5cdFx0cmV0dXJuIG5ld1V1aWQ7XG5cdH0sXG5cblx0Z2V0RW1haWw6IGFzeW5jICgpID0+IChhd2FpdCBnZXRTdG9yYWdlSXRlbTxzdHJpbmc+KEtleXMuRW1haWwpKSA/PyBkZWZhdWx0cy5lbWFpbCxcblx0c2V0RW1haWw6IGFzeW5jIChlbWFpbDogc3RyaW5nKSA9PiBhd2FpdCBzZXRTdG9yYWdlSXRlbTxzdHJpbmc+KEtleXMuRW1haWwsIGVtYWlsKSxcblxuXHQvLyBSZXR1cm5zIHRoZSBsYW5ndWFnZSBjb2RlIG9mIHRoZSBsYW5ndWFnZSB0byB0cmFuc2xhdGUgdG8uIEVnICdlbicsICdqYScsICd6aC1DTicsIC4uXG5cdGdldFRyYW5zbGF0ZVRvTGFuZ3VhZ2U6IGFzeW5jICgpID0+IHtcblx0XHRjb25zdCB0cmFuc2xhdGVUb0xhbmd1YWdlID0gYXdhaXQgZ2V0U3RvcmFnZUl0ZW08TGFuZ3VhZ2VDb2RlPihLZXlzLlRyYW5zbGF0ZVRvTGFuZ3VhZ2UpO1xuXG5cdFx0aWYgKCF0cmFuc2xhdGVUb0xhbmd1YWdlKSB7XG5cdFx0XHRyZXR1cm4gZ2V0RGVmYXVsdExhbmd1YWdlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRyYW5zbGF0ZVRvTGFuZ3VhZ2U7XG5cdH0sXG5cdHNldFRyYW5zbGF0ZVRvTGFuZ3VhZ2U6IGFzeW5jIChsYW5ndWFnZUNvZGU6IExhbmd1YWdlQ29kZSkgPT4ge1xuXHRcdGlmICghbGFuZ3VhZ2VDb2Rlcy5pbmNsdWRlcyhsYW5ndWFnZUNvZGUpKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oYEludmFsaWQgbGFuZ3VhZ2UgY29kZTogJHtsYW5ndWFnZUNvZGV9LiBPdmVyd3JpdGluZyB3aXRoIGRlZmF1bHQuYCk7XG5cdFx0XHRsYW5ndWFnZUNvZGUgPSBnZXREZWZhdWx0TGFuZ3VhZ2UoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYXdhaXQgc2V0U3RvcmFnZUl0ZW08TGFuZ3VhZ2VDb2RlPihLZXlzLlRyYW5zbGF0ZVRvTGFuZ3VhZ2UsIGxhbmd1YWdlQ29kZSk7XG5cdH0sXG5cdGdldFVJRm9udEZhbWlseTogKCkgPT4ge1xuXHRcdGNvbnN0IGxhbmd1YWdlID0gbmF2aWdhdG9yLmxhbmd1YWdlLnNwbGl0KCctJylbMF07XG5cdFx0c3dpdGNoIChsYW5ndWFnZSkge1xuXHRcdFx0Ly8gTm8gZm9udCBmaWxlIGF0IHRoZSBtb21lbnQgZm9yIHRoZXNlOiB1c2Ugd2hhdGV2ZXIgdGhlIGRlZmF1bHQgZm9udCBpcy5cblx0XHRcdGNhc2UgJ2hpJzpcblx0XHRcdGNhc2UgJ3RoJzpcblx0XHRcdGNhc2UgJ2phJzpcblx0XHRcdGNhc2UgJ2tvJzpcblx0XHRcdGNhc2UgJ3poJzpcblx0XHRcdGNhc2UgJ3ZpJzpcblx0XHRcdGNhc2UgJ2FyJzpcblx0XHRcdFx0cmV0dXJuICdzeXN0ZW0tZGVmYXVsdCc7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gJ1BhdHJpY2tIYW5kLVJlZ3VsYXInO1xuXHRcdH1cblx0fSxcblxuXHRnZXRGb250RmFtaWx5OiBhc3luYyAoKSA9PiB7XG5cdFx0Y29uc3QgZm9udEZhbWlseSA9IChhd2FpdCBnZXRTdG9yYWdlSXRlbTxzdHJpbmc+KEtleXMuRm9udEZhbWlseSkpID8/IGRlZmF1bHRzLmZvbnRGYW1pbHk7XG5cdFx0Y29uc3QgbGFuZ3VhZ2UgPSBhd2FpdCBhcHBDb25maWcuZ2V0VHJhbnNsYXRlVG9MYW5ndWFnZSgpO1xuXHRcdHN3aXRjaCAobGFuZ3VhZ2UpIHtcblx0XHRcdC8vIFRoZXNlIGxhbmd1YWdlcyBhcmUgdW5zdXBwb3J0ZWQgZm9yIHRoZSB1c3VhbCBmb250IG9wdGlvbnMuXG5cdFx0XHRjYXNlICdoaSc6XG5cdFx0XHRjYXNlICd0aCc6XG5cdFx0XHRjYXNlICdqYSc6XG5cdFx0XHRjYXNlICdrbyc6XG5cdFx0XHRjYXNlICd6aC1DTic6XG5cdFx0XHRjYXNlICd6aC1UVyc6XG5cdFx0XHRjYXNlICd2aSc6XG5cdFx0XHRjYXNlICdhcic6XG5cdFx0XHRcdHJldHVybiAnc3lzdGVtLWRlZmF1bHQnO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZvbnRGYW1pbHk7XG5cdFx0fVxuXHR9LFxuXHRzZXRGb250RmFtaWx5OiBhc3luYyAoZm9udEZhbWlseTogc3RyaW5nKSA9PlxuXHRcdGF3YWl0IHNldFN0b3JhZ2VJdGVtPHN0cmluZz4oS2V5cy5Gb250RmFtaWx5LCBmb250RmFtaWx5KSxcblxuXHRnZXRGb250Q29sb3I6IGFzeW5jICgpID0+IChhd2FpdCBnZXRTdG9yYWdlSXRlbTxzdHJpbmc+KEtleXMuRm9udENvbG9yKSkgPz8gZGVmYXVsdHMuZm9udENvbG9yLFxuXHRzZXRGb250Q29sb3I6IGFzeW5jIChmb250Q29sb3I6IHN0cmluZykgPT5cblx0XHRhd2FpdCBzZXRTdG9yYWdlSXRlbTxzdHJpbmc+KEtleXMuRm9udENvbG9yLCBmb250Q29sb3IpLFxuXG5cdGdldEZvbnRXZWlnaHQ6IGFzeW5jICgpID0+XG5cdFx0KGF3YWl0IGdldFN0b3JhZ2VJdGVtPHN0cmluZz4oS2V5cy5Gb250V2VpZ2h0KSkgPz8gZGVmYXVsdHMuZm9udFdlaWdodCxcblx0c2V0Rm9udFdlaWdodDogYXN5bmMgKGZvbnRXZWlnaHQ6IHN0cmluZykgPT5cblx0XHRhd2FpdCBzZXRTdG9yYWdlSXRlbTxzdHJpbmc+KEtleXMuRm9udFdlaWdodCwgZm9udFdlaWdodCksXG5cblx0Z2V0QWN0aXZlVXJsczogYXN5bmMgKCkgPT4ge1xuXHRcdGNvbnN0IGhhc0luaXREZWZhdWx0cyA9IGF3YWl0IGdldFN0b3JhZ2VJdGVtPGJvb2xlYW4+KGhhc0luaXRBY3RpdmVVcmxEZWZhdWx0cyk7XG5cdFx0aWYgKCFoYXNJbml0RGVmYXVsdHMpIHtcblx0XHRcdGF3YWl0IHNldFN0b3JhZ2VJdGVtPHN0cmluZ1tdPihLZXlzLkFjdGl2ZVVybHMsIGNvbW1vbk1hbmdhU2l0ZXMpO1xuXHRcdFx0YXdhaXQgc2V0U3RvcmFnZUl0ZW08Ym9vbGVhbj4oaGFzSW5pdEFjdGl2ZVVybERlZmF1bHRzLCB0cnVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKGF3YWl0IGdldFN0b3JhZ2VJdGVtPHN0cmluZ1tdPihLZXlzLkFjdGl2ZVVybHMpKSA/PyBbXTtcblx0fSxcblx0YWRkQWN0aXZlVXJsOiBhc3luYyAoYWN0aXZlVXJsOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCBoYXNJbml0RGVmYXVsdHMgPSBhd2FpdCBnZXRTdG9yYWdlSXRlbTxib29sZWFuPihoYXNJbml0QWN0aXZlVXJsRGVmYXVsdHMpO1xuXHRcdGlmICghaGFzSW5pdERlZmF1bHRzKSB7XG5cdFx0XHRhd2FpdCBzZXRTdG9yYWdlSXRlbTxzdHJpbmdbXT4oS2V5cy5BY3RpdmVVcmxzLCBjb21tb25NYW5nYVNpdGVzKTtcblx0XHRcdGF3YWl0IHNldFN0b3JhZ2VJdGVtPGJvb2xlYW4+KGhhc0luaXRBY3RpdmVVcmxEZWZhdWx0cywgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWN0aXZlVXJscyA9IChhd2FpdCBnZXRTdG9yYWdlSXRlbTxzdHJpbmdbXT4oS2V5cy5BY3RpdmVVcmxzKSkgPz8gW107XG5cdFx0cmV0dXJuIGF3YWl0IHNldFN0b3JhZ2VJdGVtPHN0cmluZ1tdPihLZXlzLkFjdGl2ZVVybHMsIFsuLi5hY3RpdmVVcmxzLCBhY3RpdmVVcmxdKTtcblx0fSxcblx0cmVtb3ZlQWN0aXZlVXJsOiBhc3luYyAoYWN0aXZlVXJsOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCBoYXNJbml0RGVmYXVsdHMgPSBhd2FpdCBnZXRTdG9yYWdlSXRlbTxib29sZWFuPihoYXNJbml0QWN0aXZlVXJsRGVmYXVsdHMpO1xuXHRcdGlmICghaGFzSW5pdERlZmF1bHRzKSB7XG5cdFx0XHRhd2FpdCBzZXRTdG9yYWdlSXRlbTxzdHJpbmdbXT4oS2V5cy5BY3RpdmVVcmxzLCBjb21tb25NYW5nYVNpdGVzKTtcblx0XHRcdGF3YWl0IHNldFN0b3JhZ2VJdGVtPGJvb2xlYW4+KGhhc0luaXRBY3RpdmVVcmxEZWZhdWx0cywgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWN0aXZlVXJscyA9IChhd2FpdCBnZXRTdG9yYWdlSXRlbTxzdHJpbmdbXT4oS2V5cy5BY3RpdmVVcmxzKSkgPz8gW107XG5cdFx0cmV0dXJuIGF3YWl0IHNldFN0b3JhZ2VJdGVtPHN0cmluZ1tdPihcblx0XHRcdEtleXMuQWN0aXZlVXJscyxcblx0XHRcdGFjdGl2ZVVybHMuZmlsdGVyKHVybCA9PiB1cmwgIT09IGFjdGl2ZVVybClcblx0XHQpO1xuXHR9XG59KTtcbiIsIi8vIE1vZHVsZSBmb3IgbWFraW5nIHdvcmtpbmcgd2l0aCB0aGUgQ2hyb21lIEFQSSBlYXNpZXIuXG4vLyBUaGlzIG1heSBpbmNsdWRlIG1ha2luZyB0aGUgQVBJIGFzeW5jLCBzaW1wbGlmeWluZyB0aGUgaW50ZXJmYWNlLCBvciBtb3JlLlxuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRUYWIoKTogUHJvbWlzZTxcblx0KGNocm9tZS50YWJzLlRhYiAmIHsgZ2V0SG9zdE5hbWU6ICgpID0+IHN0cmluZyB9KSB8IHVuZGVmaW5lZFxuPiB7XG5cdHJldHVybiBuZXcgUHJvbWlzZTwoY2hyb21lLnRhYnMuVGFiICYgeyBnZXRIb3N0TmFtZTogKCkgPT4gc3RyaW5nIH0pIHwgdW5kZWZpbmVkPihyZXNvbHZlID0+IHtcblx0XHRjaHJvbWUudGFicy5xdWVyeSh7IGN1cnJlbnRXaW5kb3c6IHRydWUsIGFjdGl2ZTogdHJ1ZSB9LCBmdW5jdGlvbiAodGFicykge1xuXHRcdFx0aWYgKGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcikge1xuXHRcdFx0XHRyZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY3VycmVudFRhYjogYW55ID0gdGFic1swXTtcblx0XHRcdGlmICghY3VycmVudFRhYj8udXJsKSB7XG5cdFx0XHRcdHJlc29sdmUodW5kZWZpbmVkKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50VGFiLmdldEhvc3ROYW1lID0gKCkgPT4ge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgVVJMKGN1cnJlbnRUYWIudXJsKS5ob3N0bmFtZTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0cmVzb2x2ZShjdXJyZW50VGFiKTtcblx0XHR9KTtcblx0fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTZXNzaW9uSGVhZGVycyhydWxlT3B0aW9uczogY2hyb21lLmRlY2xhcmF0aXZlTmV0UmVxdWVzdC5VcGRhdGVSdWxlT3B0aW9ucykge1xuXHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0Y2hyb21lLmRlY2xhcmF0aXZlTmV0UmVxdWVzdC51cGRhdGVTZXNzaW9uUnVsZXMocnVsZU9wdGlvbnMsIHJlc29sdmUpO1xuXHR9KTtcbn1cblxuLy8gV2luZG93IElEIG9mIHRhYiB0byBjYXB0dXJlLCBlZyBnZXRDdXJyZW50VGFiKCkud2luZG93SWQ7XG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZVZpc2libGVUYWIod2luZG93SWQ6IG51bWJlcikge1xuXHRyZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPihyZXNvbHZlID0+XG5cdFx0Y2hyb21lLnRhYnMuY2FwdHVyZVZpc2libGVUYWIod2luZG93SWQsIHsgZm9ybWF0OiAncG5nJyB9LCByZXNvbHZlKVxuXHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Wm9vbUZhY3Rvcih0YWJJZDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlPG51bWJlcj4ocmVzb2x2ZSA9PiBjaHJvbWUudGFicy5nZXRab29tKHRhYklkLCByZXNvbHZlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRFeHRlbnNpb25JY29uKGljb246IGNocm9tZS5icm93c2VyQWN0aW9uLlRhYkljb25EZXRhaWxzKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihyZXNvbHZlID0+IHtcblx0XHRjaHJvbWUuYWN0aW9uLnNldEljb24oaWNvbiwgKCkgPT4ge1xuXHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHR9KTtcblx0fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlU2NyaXB0KFxuXHR0YWJJZDogbnVtYmVyLFxuXHRmaWxlUGF0aDogc3RyaW5nLFxuXHRhbGxGcmFtZXM/OiBib29sZWFuXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KHJlc29sdmUgPT4ge1xuXHRcdGNocm9tZS5zY3JpcHRpbmcuZXhlY3V0ZVNjcmlwdChcblx0XHRcdHsgdGFyZ2V0OiB7IHRhYklkLCBhbGxGcmFtZXM6IGFsbEZyYW1lcyA/PyB0cnVlIH0sIGZpbGVzOiBbZmlsZVBhdGhdIH0sXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0KTtcblx0fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FsbG93ZWRGaWxlU2NoZW1lQWNjZXNzKCkge1xuXHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0Y2hyb21lLmV4dGVuc2lvbi5pc0FsbG93ZWRGaWxlU2NoZW1lQWNjZXNzKHJlc29sdmUpO1xuXHR9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvc3RCYWNrZ3JvdW5kTWVzc2FnZShtZXNzYWdlOiBhbnkpOiBhbnkge1xuXHRjb25zdCBleHRlbnNpb25JZCA9IHVuZGVmaW5lZDsgLy8gdW5kZWZpbmVkIG1lYW5zIHNlbmQgdG8gc2VsZiwgaW5zdGVhZCBvZiBhbm90aGVyIGV4dGVuc2lvbi5cblx0Y29uc3Qgb3B0aW9ucyA9IHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0Y2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoZXh0ZW5zaW9uSWQsIG1lc3NhZ2UsIG9wdGlvbnMsIHJlc29sdmUpO1xuXHR9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JhZ2VJdGVtPFQ+KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG5cdGNvbnN0IGZvcm1hdHRlZEtleSA9IGZvcm1hdEtleShrZXkpO1xuXHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLmdldChbZm9ybWF0dGVkS2V5XSwgZnVuY3Rpb24gKHJlc3VsdCkge1xuXHRcdFx0XHRyZXNvbHZlKHJlc3VsdFtmb3JtYXR0ZWRLZXldKTtcblx0XHRcdH0pO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0Ly8gRG8gbm90aGluZyBpZiBjYWNoZSBmYWlscy5cblx0XHRcdHJlc29sdmUodW5kZWZpbmVkKTtcblx0XHR9XG5cdH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0U3RvcmFnZUl0ZW08VD4oa2V5OiBzdHJpbmcsIHZhbHVlOiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGNvbnN0IGZvcm1hdHRlZEtleSA9IGZvcm1hdEtleShrZXkpO1xuXHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7IFtmb3JtYXR0ZWRLZXldOiB2YWx1ZSB9LCAoKSA9PiB7XG5cdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9KTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8vIERvIG5vdGhpbmcgaWYgY2FjaGUgZmFpbHMuXG5cdFx0XHRyZXNvbHZlKGZhbHNlKTtcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRLZXkoa2V5OiBzdHJpbmcpIHtcblx0Y29uc3Qga2V5UHJlZml4ID0gJ2FwcCc7XG5cdHJldHVybiBgJHtrZXlQcmVmaXh9LSR7a2V5fWA7XG59XG4iLCJpbXBvcnQgeyBUcmFuc2xhdGlvblJlc3VsdCB9IGZyb20gJy4vdHJhbnNsYXRpb24nO1xuaW1wb3J0IHsgYXBwQ29uZmlnIH0gZnJvbSAnLi9hcHBDb25maWcnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VDb2RlIH0gZnJvbSAnLi9sb2NhbGVzJztcblxuLy8gSWYgc2V0IHRvIHRydWUsIHVzZSBsb2NhbCBpbXBsZW1lbnRhdGlvbnMgYW5kIHR1cm4gb24gbG9nZ2luZy5cbmNvbnN0IGlzRGVidWcgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBiYXNlVXJsID0gaXNEZWJ1ZyA/ICdodHRwOi8vbG9jYWxob3N0OjgwODAnIDogJ2h0dHBzOi8vaWNoaWdvcmVhZGVyLmNvbSc7XG5cbmVudW0gU3RhdHVzQ29kZSB7XG5cdE9rID0gMjAwLFxuXHRDcmVhdGVkID0gMjAxLFxuXHROb0NvbnRlbnQgPSAyMDQsXG5cdEZvcmJpZGRlbiA9IDQwMyxcblx0Tm90Rm91bmQgPSA0MDQsXG5cdFRvb01hbnlSZXF1ZXN0cyA9IDQyOSxcblx0SW50ZXJuYWxTZXJ2ZXJFcnJvciA9IDUwMFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXIge1xuXHRlbWFpbD86IHN0cmluZzsgLy8gVW5yZWdpc3RlcmVkIHVzZXJzIGhhdmUgbm8gZW1haWwuIFRoZXkgYXJlIHRyYWNrZWQgYnkgSVAuXG5cdHN1YnNjcmlwdGlvblRpZXI6ICdmcmVlJyB8ICdwYWlkJztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyKCk6IFByb21pc2U8VXNlcj4ge1xuXHRjb25zdCBjbGllbnRVdWlkID0gYXdhaXQgYXBwQ29uZmlnLmdldENsaWVudFV1aWQoKTtcblx0Y29uc3QgcmVxdWVzdCA9IGF3YWl0IGZldGNoKFxuXHRcdGAke2Jhc2VVcmx9L21ldHJpY3M/Y2xpZW50VXVpZD0ke2NsaWVudFV1aWR9JmZpbmdlcnByaW50PSR7Z2V0RmluZ2VycHJpbnQoKX1gLFxuXHRcdHtcblx0XHRcdG1ldGhvZDogJ0dFVCcsXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdCdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcblx0XHRcdH1cblx0XHR9XG5cdCk7XG5cblx0aWYgKHJlcXVlc3Quc3RhdHVzICE9PSBTdGF0dXNDb2RlLk9rKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcmV0cmlldmUgdXNlci4nKTtcblx0fVxuXG5cdHJldHVybiAoYXdhaXQgcmVxdWVzdC5qc29uKCkpIGFzIHtcblx0XHRlbWFpbD86IHN0cmluZztcblx0XHRzdWJzY3JpcHRpb25UaWVyOiAnZnJlZScgfCAncGFpZCc7XG5cdH07XG59XG5cbmV4cG9ydCBlbnVtIExvZ2luU3RhdHVzIHtcblx0VW5rbm93biwgLy8gVmFyaW91cyBuZXR3b3JrIGVycm9ycywgaWYgc2VydmVyIGlzIG9uIGhpZ2ggbG9hZCwgZXRjLiBOb3Qgd29ydGggaGFuZGxpbmcgYXQgdGhpcyB0aW1lLlxuXHRVbmtub3duRW1haWwsXG5cdEJhZFBhc3N3b3JkLFxuXHRTdWNjZXNzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dpbihlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxMb2dpblN0YXR1cz4ge1xuXHRjb25zdCByZXF1ZXN0ID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vYXV0aC9sb2dpbmAsIHtcblx0XHRtZXRob2Q6ICdQT1NUJyxcblx0XHRoZWFkZXJzOiB7XG5cdFx0XHQnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG5cdFx0fSxcblx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVtYWlsLCBwYXNzd29yZCB9KVxuXHR9KTtcblxuXHRpZiAocmVxdWVzdC5zdGF0dXMgPT09IFN0YXR1c0NvZGUuTm90Rm91bmQpIHtcblx0XHRyZXR1cm4gTG9naW5TdGF0dXMuVW5rbm93bkVtYWlsO1xuXHR9XG5cblx0aWYgKHJlcXVlc3Quc3RhdHVzID09PSBTdGF0dXNDb2RlLkZvcmJpZGRlbikge1xuXHRcdHJldHVybiBMb2dpblN0YXR1cy5CYWRQYXNzd29yZDtcblx0fVxuXG5cdHJldHVybiByZXF1ZXN0LnN0YXR1cyA9PT0gU3RhdHVzQ29kZS5PayA/IExvZ2luU3RhdHVzLlN1Y2Nlc3MgOiBMb2dpblN0YXR1cy5Vbmtub3duO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9nb3V0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRjb25zdCByZXF1ZXN0ID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vYXV0aC9sb2dvdXRgLCB7XG5cdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0aGVhZGVyczoge1xuXHRcdFx0J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIHJlcXVlc3Quc3RhdHVzID09PSBTdGF0dXNDb2RlLk5vQ29udGVudDtcbn1cblxuZXhwb3J0IGVudW0gU2lnbnVwU3RhdHVzIHtcblx0VW5rbm93biwgLy8gVmFyaW91cyBuZXR3b3JrIGVycm9ycywgaWYgc2VydmVyIGlzIG9uIGhpZ2ggbG9hZCwgZXRjLiBOb3Qgd29ydGggaGFuZGxpbmcgYXQgdGhpcyB0aW1lLlxuXHRTdWNjZXNzLFxuXHRFbWFpbFRha2VuXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWdudXAoZW1haWw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8U2lnbnVwU3RhdHVzPiB7XG5cdGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS9zaWdudXBgLCB7XG5cdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0aGVhZGVyczoge1xuXHRcdFx0J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuXHRcdH0sXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoeyBlbWFpbCwgcGFzc3dvcmQgfSlcblx0fSk7XG5cblx0aWYgKHJlcXVlc3Quc3RhdHVzID09PSBTdGF0dXNDb2RlLkZvcmJpZGRlbikge1xuXHRcdHJldHVybiBTaWdudXBTdGF0dXMuRW1haWxUYWtlbjtcblx0fVxuXG5cdHJldHVybiByZXF1ZXN0LnN0YXR1cyA9PT0gU3RhdHVzQ29kZS5DcmVhdGVkID8gU2lnbnVwU3RhdHVzLlN1Y2Nlc3MgOiBTaWdudXBTdGF0dXMuVW5rbm93bjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEZlZWRiYWNrKHRleHQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRjb25zdCByZXF1ZXN0ID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vZmVlZGJhY2tgLCB7XG5cdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0aGVhZGVyczoge1xuXHRcdFx0J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuXHRcdH0sXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoeyB0ZXh0IH0pXG5cdH0pO1xuXG5cdHJldHVybiByZXF1ZXN0LnN0YXR1cyA9PT0gU3RhdHVzQ29kZS5DcmVhdGVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNsYXRlSW1hZ2UoXG5cdHRyYW5zbGF0ZVRvOiBMYW5ndWFnZUNvZGUsXG5cdGJhc2U2NEltYWdlOiBzdHJpbmdcbik6IFByb21pc2U8eyB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uUmVzdWx0W107IGVycm9yTWVzc2FnZT86IHN0cmluZyB9PiB7XG5cdGNvbnN0IGNsaWVudFV1aWQgPSBhd2FpdCBhcHBDb25maWcuZ2V0Q2xpZW50VXVpZCgpO1xuXHRjb25zdCByZXF1ZXN0ID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vdHJhbnNsYXRlYCwge1xuXHRcdG1ldGhvZDogJ1BPU1QnLFxuXHRcdGhlYWRlcnM6IHtcblx0XHRcdCdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcblx0XHR9LFxuXHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdGJhc2U2NEltYWdlczogW2Jhc2U2NEltYWdlXSxcblx0XHRcdGNsaWVudFV1aWQ6IGNsaWVudFV1aWQsXG5cdFx0XHR0YXJnZXRMYW5nQ29kZTogdHJhbnNsYXRlVG8sXG5cdFx0XHRmaW5nZXJwcmludDogZ2V0RmluZ2VycHJpbnQoKVxuXHRcdH0pXG5cdH0pO1xuXG5cdGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gU3RhdHVzQ29kZS5JbnRlcm5hbFNlcnZlckVycm9yKSB7XG5cdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gJ1NlcnZlciBpcyBkb3duIG9yIGV4cGVyaWVuY2luZyBpc3N1ZXMuIFNvcnJ5IGZvciB0aGUgaW5jb252ZW5pZW5jZS4nO1xuXHRcdHJldHVybiB7XG5cdFx0XHRlcnJvck1lc3NhZ2UsXG5cdFx0XHR0cmFuc2xhdGlvbnM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9yaWdpbmFsTGFuZ3VhZ2U6ICdVbmtub3duJyxcblx0XHRcdFx0XHR0cmFuc2xhdGVkVGV4dDogZXJyb3JNZXNzYWdlLFxuXHRcdFx0XHRcdG1pblg6IDAsXG5cdFx0XHRcdFx0bWluWTogMCxcblx0XHRcdFx0XHRtYXhYOiAyMDAsXG5cdFx0XHRcdFx0bWF4WTogMjAwXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9O1xuXHR9XG5cblx0aWYgKHJlcXVlc3Quc3RhdHVzID09PSBTdGF0dXNDb2RlLlRvb01hbnlSZXF1ZXN0cykge1xuXHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9ICdPdXQgb2YgdHJhbnNsYXRpb25zLiBTZXJ2ZXIgY29zdHMgYXJlIGV4cGVuc2l2ZS4gVXBncmFkZSBmb3IgbW9yZSEnO1xuXHRcdHJldHVybiB7XG5cdFx0XHRlcnJvck1lc3NhZ2UsXG5cdFx0XHR0cmFuc2xhdGlvbnM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9yaWdpbmFsTGFuZ3VhZ2U6ICdVbmtub3duJyxcblx0XHRcdFx0XHR0cmFuc2xhdGVkVGV4dDogZXJyb3JNZXNzYWdlLFxuXHRcdFx0XHRcdG1pblg6IDAsXG5cdFx0XHRcdFx0bWluWTogMCxcblx0XHRcdFx0XHRtYXhYOiAyMDAsXG5cdFx0XHRcdFx0bWF4WTogMjAwXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9O1xuXHR9XG5cblx0Y29uc3QgcmVzdWx0cyA9IGF3YWl0IHJlcXVlc3QuanNvbigpO1xuXG5cdHJldHVybiB7XG5cdFx0dHJhbnNsYXRpb25zOiByZXN1bHRzLmltYWdlc1swXSBhcyBUcmFuc2xhdGlvblJlc3VsdFtdXG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1ZyhtZXNzYWdlKSB7XG5cdGlmIChpc0RlYnVnKSB7XG5cdFx0Y29uc29sZS5sb2cobWVzc2FnZSk7XG5cdH1cbn1cblxubGV0IGZpbmdlcnByaW50OiBzdHJpbmcgPSBudWxsOyAvLyBEbyBub3QgYWNjZXNzIHRoaXMgZGlyZWN0bHksIHVzZSBnZXRGaW5nZXJwcmludCgpLlxuZnVuY3Rpb24gZ2V0RmluZ2VycHJpbnQoKSB7XG5cdGlmIChmaW5nZXJwcmludCkge1xuXHRcdHJldHVybiBmaW5nZXJwcmludDtcblx0fVxuXG5cdC8vIEluaXRpYWxpemUgZmluZ2VycHJpbnQuXG5cdGNvbnN0IHdlYkdsUmVuZGVyZXIgPSBnZXRXZWJHbFJlbmRlcmVyKCk7XG5cdGNvbnN0IGhhcmR3YXJlID0gZ2V0SGFyZHdhcmUoKTtcblx0Y29uc3QgY29ubmVjdGlvblN0cmluZyA9IGdldENvbm5lY3Rpb25TdHJpbmcoKTtcblx0Y29uc3QgdGltZXpvbmVDb2RlID0gbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXHRmaW5nZXJwcmludCA9IGJ0b2EoYCR7d2ViR2xSZW5kZXJlcn0tJHtoYXJkd2FyZX0tJHtjb25uZWN0aW9uU3RyaW5nfS0ke3RpbWV6b25lQ29kZX1gKTtcblxuXHRyZXR1cm4gZmluZ2VycHJpbnQ7XG59XG5cbmZ1bmN0aW9uIGdldFdlYkdsUmVuZGVyZXIoKSB7XG5cdGNvbnN0IGdsID0gbmV3IE9mZnNjcmVlbkNhbnZhcygwLCAwKS5nZXRDb250ZXh0KCd3ZWJnbCcpO1xuXHRpZiAoIWdsKSB7XG5cdFx0cmV0dXJuICdub25lJztcblx0fVxuXHRjb25zdCBkZWJ1Z0luZm8gPSBnbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2RlYnVnX3JlbmRlcmVyX2luZm8nKTtcblx0cmV0dXJuIGRlYnVnSW5mbyA/IGdsLmdldFBhcmFtZXRlcihkZWJ1Z0luZm8uVU5NQVNLRURfUkVOREVSRVJfV0VCR0wpIDogJ3Vua25vd24nO1xufVxuXG5mdW5jdGlvbiBnZXRIYXJkd2FyZSgpIHtcblx0Y29uc3QgaGFyZHdhcmVDb25jdXJyZW5jeSA9IG5hdmlnYXRvcj8uaGFyZHdhcmVDb25jdXJyZW5jeTtcblx0Y29uc3QgZGV2aWNlTWVtb3J5ID0gbmF2aWdhdG9yWydkZXZpY2VNZW1vcnknXTtcblx0cmV0dXJuIGAke2hhcmR3YXJlQ29uY3VycmVuY3l9LSR7ZGV2aWNlTWVtb3J5fWA7XG59XG5cbmZ1bmN0aW9uIGdldENvbm5lY3Rpb25TdHJpbmcoKSB7XG5cdGNvbnN0IHR5cGUgPSBuYXZpZ2F0b3JbJ2Nvbm5lY3Rpb24nXT8udHlwZTtcblx0Y29uc3QgcnR0ID0gbmF2aWdhdG9yWydjb25uZWN0aW9uJ10/LnJ0dDtcblx0Y29uc3QgZG93bmxpbmtNYXggPSBuYXZpZ2F0b3JbJ2Nvbm5lY3Rpb24nXT8uZG93bmxpbmtNYXg7XG5cdGNvbnN0IGVmZmVjdGl2ZVR5cGUgPSBuYXZpZ2F0b3JbJ2Nvbm5lY3Rpb24nXT8uZWZmZWN0aXZlVHlwZTtcblx0Y29uc3Qgc2F2ZURhdGEgPSBuYXZpZ2F0b3JbJ2Nvbm5lY3Rpb24nXT8uc2F2ZURhdGE7XG5cdHJldHVybiBgJHt0eXBlfS0ke3J0dH0tJHtkb3dubGlua01heH0tJHtlZmZlY3RpdmVUeXBlfS0ke3NhdmVEYXRhfWA7XG59XG4iLCJjb25zdCBtID0gY2hyb21lLmkxOG4uZ2V0TWVzc2FnZTtcblxuLy8gU3VwcG9ydGVkIGxhbmd1YWdlIGNvZGVzLlxuZXhwb3J0IHR5cGUgTGFuZ3VhZ2VDb2RlID1cblx0fCAnYXInXG5cdHwgJ2RlJ1xuXHR8ICdlbidcblx0fCAnZXMnXG5cdHwgJ2ZyJ1xuXHR8ICdoaSdcblx0fCAnaWQnXG5cdHwgJ2l0J1xuXHR8ICdqYSdcblx0fCAna28nXG5cdHwgJ3B0LUJSJ1xuXHR8ICdwdC1QVCdcblx0fCAndGgnXG5cdHwgJ3ZpJ1xuXHR8ICd6aC1DTidcblx0fCAnemgtVFcnO1xuXG5leHBvcnQgY29uc3QgbGFuZ3VhZ2VDb2RlczogTGFuZ3VhZ2VDb2RlW10gPSBbXG5cdCdhcicsXG5cdCdkZScsXG5cdCdlbicsXG5cdCdlcycsXG5cdCdmcicsXG5cdCdoaScsXG5cdCdpZCcsXG5cdCdpdCcsXG5cdCdqYScsXG5cdCdrbycsXG5cdCdwdC1CUicsXG5cdCdwdC1QVCcsXG5cdCd0aCcsXG5cdCd2aScsXG5cdCd6aC1DTicsXG5cdCd6aC1UVydcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0TGFuZ3VhZ2UoKTogTGFuZ3VhZ2VDb2RlIHtcblx0Y29uc3QgZnVsbExhbmcgPSBuYXZpZ2F0b3IubGFuZ3VhZ2U7XG5cblx0Y29uc3Qgc2hvcnRMYW5nID0gbmF2aWdhdG9yLmxhbmd1YWdlLnNwbGl0KCctJylbMF07XG5cdGNvbnN0IGZpcnN0U2hvcnRMYW5nID0gbGFuZ3VhZ2VDb2Rlcy5maW5kKGxhbmcgPT4gbGFuZy5zdGFydHNXaXRoKHNob3J0TGFuZykpO1xuXG5cdGlmIChsYW5ndWFnZUNvZGVzLmluY2x1ZGVzKGZ1bGxMYW5nIGFzIExhbmd1YWdlQ29kZSkpIHtcblx0XHRyZXR1cm4gZnVsbExhbmcgYXMgTGFuZ3VhZ2VDb2RlO1xuXHR9IGVsc2UgaWYgKGZpcnN0U2hvcnRMYW5nKSB7XG5cdFx0cmV0dXJuIGZpcnN0U2hvcnRMYW5nO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiAnZW4nO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXNwbGF5U3RyaW5nKGxhbmd1YWdlQ29kZTogTGFuZ3VhZ2VDb2RlKTogc3RyaW5nIHtcblx0c3dpdGNoIChsYW5ndWFnZUNvZGUpIHtcblx0XHRjYXNlICdhcic6XG5cdFx0XHRyZXR1cm4gbSgndHJhbnNsYXRlVG9BcmFiaWNMYWJlbCcpO1xuXHRcdGNhc2UgJ2RlJzpcblx0XHRcdHJldHVybiBtKCd0cmFuc2xhdGVUb0dlcm1hbkxhYmVsJyk7XG5cdFx0Y2FzZSAnZW4nOlxuXHRcdFx0cmV0dXJuIG0oJ3RyYW5zbGF0ZVRvRW5nbGlzaExhYmVsJyk7XG5cdFx0Y2FzZSAnZXMnOlxuXHRcdFx0cmV0dXJuIG0oJ3RyYW5zbGF0ZVRvU3BhbmlzaExhYmVsJyk7XG5cdFx0Y2FzZSAnZnInOlxuXHRcdFx0cmV0dXJuIG0oJ3RyYW5zbGF0ZVRvRnJlbmNoTGFiZWwnKTtcblx0XHRjYXNlICdoaSc6XG5cdFx0XHRyZXR1cm4gbSgndHJhbnNsYXRlVG9IaW5kaUxhYmVsJyk7XG5cdFx0Y2FzZSAnaWQnOlxuXHRcdFx0cmV0dXJuIG0oJ3RyYW5zbGF0ZVRvSW5kb25lc2lhbkxhYmVsJyk7XG5cdFx0Y2FzZSAnaXQnOlxuXHRcdFx0cmV0dXJuIG0oJ3RyYW5zbGF0ZVRvSXRhbGlhbkxhYmVsJyk7XG5cdFx0Y2FzZSAnamEnOlxuXHRcdFx0cmV0dXJuIG0oJ3RyYW5zbGF0ZVRvSmFwYW5lc2VMYWJlbCcpO1xuXHRcdGNhc2UgJ2tvJzpcblx0XHRcdHJldHVybiBtKCd0cmFuc2xhdGVUb0tvcmVhbkxhYmVsJyk7XG5cdFx0Y2FzZSAncHQtQlInOlxuXHRcdFx0cmV0dXJuIG0oJ3RyYW5zbGF0ZVRvQnJhemlsaWFuUG9ydHVndWVzZUxhYmVsJyk7XG5cdFx0Y2FzZSAncHQtUFQnOlxuXHRcdFx0cmV0dXJuIG0oJ3RyYW5zbGF0ZVRvUG9ydHVndWVzZUxhYmVsJyk7XG5cdFx0Y2FzZSAndGgnOlxuXHRcdFx0cmV0dXJuIG0oJ3RyYW5zbGF0ZVRvVGhhaUxhYmVsJyk7XG5cdFx0Y2FzZSAndmknOlxuXHRcdFx0cmV0dXJuIG0oJ3RyYW5zbGF0ZVRvVmlldG5hbWVzZUxhYmVsJyk7XG5cdFx0Y2FzZSAnemgtQ04nOlxuXHRcdFx0cmV0dXJuIG0oJ3RyYW5zbGF0ZVRvQ2hpbmVzZVNpbXBsaWZpZWRMYWJlbCcpO1xuXHRcdGNhc2UgJ3poLVRXJzpcblx0XHRcdHJldHVybiBtKCd0cmFuc2xhdGVUb0NoaW5lc2VUcmFkaXRpb25hbExhYmVsJyk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiAnVW5rbm93bic7XG5cdH1cbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb25SZXN1bHQge1xuXHRvcmlnaW5hbExhbmd1YWdlOiBzdHJpbmc7XG5cdHRyYW5zbGF0ZWRUZXh0OiBzdHJpbmc7XG5cdG1pblg6IG51bWJlcjtcblx0bWluWTogbnVtYmVyO1xuXHRtYXhYOiBudW1iZXI7XG5cdG1heFk6IG51bWJlcjtcblx0Zm9udEhlaWdodFB4PzogbnVtYmVyO1xuXHRmb250Q29sb3I/OiBzdHJpbmc7XG5cdHpJbmRleD86IG51bWJlcjtcblx0YmFja2dyb3VuZD86IHN0cmluZzsgLy8gQmFzZTY0IGVuY29kZWQgc3RyaW5nIHdpdGggdGhlIG9yaWdpbmFsIHRleHQgcmVtb3ZlZC5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvblJlc3VsdHMge1xuXHRpbWFnZTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9O1xuXHR0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uUmVzdWx0W107XG5cblx0Ly8gT3B0aW9uYWwgY29udmVuaWVuY2UgcmV0dXJuLlxuXHQvLyBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgb2YgdGhlIGltYWdlLlxuXHRiYXNlNjREYXRhPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVUcmFuc2xhdGlvbihcblx0dGFyZ2V0V2lkdGg6IG51bWJlcixcblx0dGFyZ2V0SGVpZ2h0OiBudW1iZXIsXG5cdG9yaWdpbmFsV2lkdGg6IG51bWJlcixcblx0b3JpZ2luYWxIZWlnaHQ6IG51bWJlcixcblx0cmVzdWx0OiBUcmFuc2xhdGlvblJlc3VsdFxuKTogVHJhbnNsYXRpb25SZXN1bHQge1xuXHRjb25zdCBzY2FsZVggPSB0YXJnZXRXaWR0aCAvIG9yaWdpbmFsV2lkdGg7XG5cdGNvbnN0IHNjYWxlWSA9IHRhcmdldEhlaWdodCAvIG9yaWdpbmFsSGVpZ2h0O1xuXG5cdHJldHVybiB7XG5cdFx0Li4ucmVzdWx0LFxuXHRcdG1pblg6IE1hdGgucm91bmQoc2NhbGVYICogcmVzdWx0Lm1pblgpLFxuXHRcdG1pblk6IE1hdGgucm91bmQoc2NhbGVZICogcmVzdWx0Lm1pblkpLFxuXHRcdG1heFg6IE1hdGgucm91bmQoc2NhbGVYICogcmVzdWx0Lm1heFgpLFxuXHRcdG1heFk6IE1hdGgucm91bmQoc2NhbGVZICogcmVzdWx0Lm1heFkpXG5cdH07XG59XG5cbnR5cGUgV2lkdGggPSBudW1iZXI7XG50eXBlIEhlaWdodCA9IG51bWJlcjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVJlc2l6ZWRBc3BlY3RSYXRpbyhwYXJhbXM6IHtcblx0d2lkdGg6IG51bWJlcjtcblx0aGVpZ2h0OiBudW1iZXI7XG5cdHdpZHRoTWF4UHg6IG51bWJlcjtcblx0aGVpZ2h0TWF4UHg6IG51bWJlcjtcbn0pOiBbV2lkdGgsIEhlaWdodF0ge1xuXHRjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHdpZHRoTWF4UHgsIGhlaWdodE1heFB4IH0gPSBwYXJhbXM7XG5cdC8vIGBhbHJlYWR5V2l0aGluQm91bmRzYCBpbnRlbnRpb25hbGx5IHVzZXMgYHx8YCBpbnN0ZWFkIG9mIGAmJmAsXG5cdC8vIHNvIHRoYXQgaW1hZ2VzIHNsaWdodGx5IG92ZXIgYm91bmRzIGFyZSBsaWtlbHkgbm90IHRvdWNoZWQuXG5cdC8vIEFsdGhvdWdoIGV4cGVyaW1lbnRpbmcgd2l0aCBgJiZgIGluc3RlYWQgb2YgYHx8IG1heSBiZSB2aWFibGUuXG5cdGNvbnN0IGFscmVhZHlXaXRoaW5Cb3VuZHMgPSB3aWR0aCA8PSB3aWR0aE1heFB4IHx8IGhlaWdodCA8PSBoZWlnaHRNYXhQeDtcblx0aWYgKGFscmVhZHlXaXRoaW5Cb3VuZHMpIHtcblx0XHRyZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xuXHR9XG5cblx0Ly8gYE1hdGgubWF4YCAodnMgYE1hdGgubWluYCkgaXMgaW50ZW50aW9uYWxseSB1c2VkIHRvIGZhdm9yIGxhcmdlciBpbWFnZXMuXG5cdGNvbnN0IHJlc2l6ZWRBc3BlY3RSYXRpbyA9IE1hdGgubWF4KGhlaWdodE1heFB4IC8gaGVpZ2h0LCB3aWR0aE1heFB4IC8gd2lkdGgpO1xuXHRyZXR1cm4gW01hdGgucm91bmQod2lkdGggKiByZXNpemVkQXNwZWN0UmF0aW8pLCBNYXRoLnJvdW5kKGhlaWdodCAqIHJlc2l6ZWRBc3BlY3RSYXRpbyldO1xufVxuIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyB2MSB9IGZyb20gJy4vdjEuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2MyB9IGZyb20gJy4vdjMuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2NCB9IGZyb20gJy4vdjQuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2NSB9IGZyb20gJy4vdjUuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOSUwgfSBmcm9tICcuL25pbC5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb24uanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWxpZGF0ZSB9IGZyb20gJy4vdmFsaWRhdGUuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBhcnNlIH0gZnJvbSAnLi9wYXJzZS5qcyc7IiwiLypcbiAqIEJyb3dzZXItY29tcGF0aWJsZSBKYXZhU2NyaXB0IE1ENVxuICpcbiAqIE1vZGlmaWNhdGlvbiBvZiBKYXZhU2NyaXB0IE1ENVxuICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvSmF2YVNjcmlwdC1NRDVcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhblxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogQmFzZWQgb25cbiAqIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2VcbiAqIERpZ2VzdCBBbGdvcml0aG0sIGFzIGRlZmluZWQgaW4gUkZDIDEzMjEuXG4gKiBWZXJzaW9uIDIuMiBDb3B5cmlnaHQgKEMpIFBhdWwgSm9obnN0b24gMTk5OSAtIDIwMDlcbiAqIE90aGVyIGNvbnRyaWJ1dG9yczogR3JlZyBIb2x0LCBBbmRyZXcgS2VwZXJ0LCBZZG5hciwgTG9zdGluZXRcbiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZVxuICogU2VlIGh0dHA6Ly9wYWpob21lLm9yZy51ay9jcnlwdC9tZDUgZm9yIG1vcmUgaW5mby5cbiAqL1xuZnVuY3Rpb24gbWQ1KGJ5dGVzKSB7XG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheShtc2cubGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlc1tpXSA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZDVUb0hleEVuY29kZWRBcnJheSh3b3Jkc1RvTWQ1KGJ5dGVzVG9Xb3JkcyhieXRlcyksIGJ5dGVzLmxlbmd0aCAqIDgpKTtcbn1cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMgdG8gYW4gYXJyYXkgb2YgYnl0ZXNcbiAqL1xuXG5cbmZ1bmN0aW9uIG1kNVRvSGV4RW5jb2RlZEFycmF5KGlucHV0KSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgdmFyIGxlbmd0aDMyID0gaW5wdXQubGVuZ3RoICogMzI7XG4gIHZhciBoZXhUYWIgPSAnMDEyMzQ1Njc4OWFiY2RlZic7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGgzMjsgaSArPSA4KSB7XG4gICAgdmFyIHggPSBpbnB1dFtpID4+IDVdID4+PiBpICUgMzIgJiAweGZmO1xuICAgIHZhciBoZXggPSBwYXJzZUludChoZXhUYWIuY2hhckF0KHggPj4+IDQgJiAweDBmKSArIGhleFRhYi5jaGFyQXQoeCAmIDB4MGYpLCAxNik7XG4gICAgb3V0cHV0LnB1c2goaGV4KTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZSBvdXRwdXQgbGVuZ3RoIHdpdGggcGFkZGluZyBhbmQgYml0IGxlbmd0aFxuICovXG5cblxuZnVuY3Rpb24gZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoOCkge1xuICByZXR1cm4gKGlucHV0TGVuZ3RoOCArIDY0ID4+PiA5IDw8IDQpICsgMTQgKyAxO1xufVxuLypcbiAqIENhbGN1bGF0ZSB0aGUgTUQ1IG9mIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMsIGFuZCBhIGJpdCBsZW5ndGguXG4gKi9cblxuXG5mdW5jdGlvbiB3b3Jkc1RvTWQ1KHgsIGxlbikge1xuICAvKiBhcHBlbmQgcGFkZGluZyAqL1xuICB4W2xlbiA+PiA1XSB8PSAweDgwIDw8IGxlbiAlIDMyO1xuICB4W2dldE91dHB1dExlbmd0aChsZW4pIC0gMV0gPSBsZW47XG4gIHZhciBhID0gMTczMjU4NDE5MztcbiAgdmFyIGIgPSAtMjcxNzMzODc5O1xuICB2YXIgYyA9IC0xNzMyNTg0MTk0O1xuICB2YXIgZCA9IDI3MTczMzg3ODtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgdmFyIG9sZGEgPSBhO1xuICAgIHZhciBvbGRiID0gYjtcbiAgICB2YXIgb2xkYyA9IGM7XG4gICAgdmFyIG9sZGQgPSBkO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2ldLCA3LCAtNjgwODc2OTM2KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgMV0sIDEyLCAtMzg5NTY0NTg2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE3LCA2MDYxMDU4MTkpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAzXSwgMjIsIC0xMDQ0NTI1MzMwKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgNF0sIDcsIC0xNzY0MTg4OTcpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA1XSwgMTIsIDEyMDAwODA0MjYpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTcsIC0xNDczMjMxMzQxKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgN10sIDIyLCAtNDU3MDU5ODMpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNywgMTc3MDAzNTQxNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDldLCAxMiwgLTE5NTg0MTQ0MTcpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE3LCAtNDIwNjMpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAxMV0sIDIyLCAtMTk5MDQwNDE2Mik7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNywgMTgwNDYwMzY4Mik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDEzXSwgMTIsIC00MDM0MTEwMSk7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTcsIC0xNTAyMDAyMjkwKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTVdLCAyMiwgMTIzNjUzNTMyOSk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA1LCAtMTY1Nzk2NTEwKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgNl0sIDksIC0xMDY5NTAxNjMyKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNCwgNjQzNzE3NzEzKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpXSwgMjAsIC0zNzM4OTczMDIpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNSwgLTcwMTU1ODY5MSk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDEwXSwgOSwgMzgwMTYwODMpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE0LCAtNjYwNDc4MzM1KTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgNF0sIDIwLCAtNDA1NTM3ODQ4KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgOV0sIDUsIDU2ODQ0NjQzOCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDE0XSwgOSwgLTEwMTk4MDM2OTApO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTQsIC0xODczNjM5NjEpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA4XSwgMjAsIDExNjM1MzE1MDEpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDUsIC0xNDQ0NjgxNDY3KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMl0sIDksIC01MTQwMzc4NCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNCwgMTczNTMyODQ3Myk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgNV0sIDQsIC0zNzg1NTgpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA4XSwgMTEsIC0yMDIyNTc0NDYzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNiwgMTgzOTAzMDU2Mik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDE0XSwgMjMsIC0zNTMwOTU1Nik7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA0LCAtMTUzMDk5MjA2MCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDRdLCAxMSwgMTI3Mjg5MzM1Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNiwgLTE1NTQ5NzYzMik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMTNdLCA0LCA2ODEyNzkxNzQpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2ldLCAxMSwgLTM1ODUzNzIyMik7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNiwgLTcyMjUyMTk3OSk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDZdLCAyMywgNzYwMjkxODkpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNCwgLTY0MDM2NDQ4Nyk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDEyXSwgMTEsIC00MjE4MTU4MzUpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE2LCA1MzA3NDI1MjApO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAyXSwgMjMsIC05OTUzMzg2NTEpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2ldLCA2LCAtMTk4NjMwODQ0KTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgN10sIDEwLCAxMTI2ODkxNDE1KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNSwgLTE0MTYzNTQ5MDUpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyA1XSwgMjEsIC01NzQzNDA1NSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNiwgMTcwMDQ4NTU3MSk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDNdLCAxMCwgLTE4OTQ5ODY2MDYpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE1LCAtMTA1MTUyMyk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDFdLCAyMSwgLTIwNTQ5MjI3OTkpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNiwgMTg3MzMxMzM1OSk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDE1XSwgMTAsIC0zMDYxMTc0NCk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNSwgLTE1NjAxOTgzODApO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxM10sIDIxLCAxMzA5MTUxNjQ5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgNF0sIDYsIC0xNDU1MjMwNzApO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxMV0sIDEwLCAtMTEyMDIxMDM3OSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNSwgNzE4Nzg3MjU5KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgOV0sIDIxLCAtMzQzNDg1NTUxKTtcbiAgICBhID0gc2FmZUFkZChhLCBvbGRhKTtcbiAgICBiID0gc2FmZUFkZChiLCBvbGRiKTtcbiAgICBjID0gc2FmZUFkZChjLCBvbGRjKTtcbiAgICBkID0gc2FmZUFkZChkLCBvbGRkKTtcbiAgfVxuXG4gIHJldHVybiBbYSwgYiwgYywgZF07XG59XG4vKlxuICogQ29udmVydCBhbiBhcnJheSBieXRlcyB0byBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzXG4gKiBDaGFyYWN0ZXJzID4yNTUgaGF2ZSB0aGVpciBoaWdoLWJ5dGUgc2lsZW50bHkgaWdub3JlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGJ5dGVzVG9Xb3JkcyhpbnB1dCkge1xuICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIGxlbmd0aDggPSBpbnB1dC5sZW5ndGggKiA4O1xuICB2YXIgb3V0cHV0ID0gbmV3IFVpbnQzMkFycmF5KGdldE91dHB1dExlbmd0aChsZW5ndGg4KSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg4OyBpICs9IDgpIHtcbiAgICBvdXRwdXRbaSA+PiA1XSB8PSAoaW5wdXRbaSAvIDhdICYgMHhmZikgPDwgaSAlIDMyO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cbi8qXG4gKiBBZGQgaW50ZWdlcnMsIHdyYXBwaW5nIGF0IDJeMzIuIFRoaXMgdXNlcyAxNi1iaXQgb3BlcmF0aW9ucyBpbnRlcm5hbGx5XG4gKiB0byB3b3JrIGFyb3VuZCBidWdzIGluIHNvbWUgSlMgaW50ZXJwcmV0ZXJzLlxuICovXG5cblxuZnVuY3Rpb24gc2FmZUFkZCh4LCB5KSB7XG4gIHZhciBsc3cgPSAoeCAmIDB4ZmZmZikgKyAoeSAmIDB4ZmZmZik7XG4gIHZhciBtc3cgPSAoeCA+PiAxNikgKyAoeSA+PiAxNikgKyAobHN3ID4+IDE2KTtcbiAgcmV0dXJuIG1zdyA8PCAxNiB8IGxzdyAmIDB4ZmZmZjtcbn1cbi8qXG4gKiBCaXR3aXNlIHJvdGF0ZSBhIDMyLWJpdCBudW1iZXIgdG8gdGhlIGxlZnQuXG4gKi9cblxuXG5mdW5jdGlvbiBiaXRSb3RhdGVMZWZ0KG51bSwgY250KSB7XG4gIHJldHVybiBudW0gPDwgY250IHwgbnVtID4+PiAzMiAtIGNudDtcbn1cbi8qXG4gKiBUaGVzZSBmdW5jdGlvbnMgaW1wbGVtZW50IHRoZSBmb3VyIGJhc2ljIG9wZXJhdGlvbnMgdGhlIGFsZ29yaXRobSB1c2VzLlxuICovXG5cblxuZnVuY3Rpb24gbWQ1Y21uKHEsIGEsIGIsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIHNhZmVBZGQoYml0Um90YXRlTGVmdChzYWZlQWRkKHNhZmVBZGQoYSwgcSksIHNhZmVBZGQoeCwgdCkpLCBzKSwgYik7XG59XG5cbmZ1bmN0aW9uIG1kNWZmKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiICYgYyB8IH5iICYgZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWdnKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiICYgZCB8IGMgJiB+ZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWhoKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVpaShhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYyBeIChiIHwgfmQpLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWQ1OyIsImV4cG9ydCBkZWZhdWx0ICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gcGFyc2UodXVpZCkge1xuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbnZhbGlkIFVVSUQnKTtcbiAgfVxuXG4gIHZhciB2O1xuICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMTYpOyAvLyBQYXJzZSAjIyMjIyMjIy0uLi4uLS4uLi4tLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMCwgOCksIDE2KSkgPj4+IDI0O1xuICBhcnJbMV0gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsyXSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbM10gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tIyMjIy0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzRdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDksIDEzKSwgMTYpKSA+Pj4gODtcbiAgYXJyWzVdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tIyMjIy0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls2XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTgpLCAxNikpID4+PiA4O1xuICBhcnJbN10gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLSMjIyMtLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzhdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDE5LCAyMyksIDE2KSkgPj4+IDg7XG4gIGFycls5XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLS4uLi4tLi4uLi0jIyMjIyMjIyMjIyNcbiAgLy8gKFVzZSBcIi9cIiB0byBhdm9pZCAzMi1iaXQgdHJ1bmNhdGlvbiB3aGVuIGJpdC1zaGlmdGluZyBoaWdoLW9yZGVyIGJ5dGVzKVxuXG4gIGFyclsxMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMjQsIDM2KSwgMTYpKSAvIDB4MTAwMDAwMDAwMDAgJiAweGZmO1xuICBhcnJbMTFdID0gdiAvIDB4MTAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzEyXSA9IHYgPj4+IDI0ICYgMHhmZjtcbiAgYXJyWzEzXSA9IHYgPj4+IDE2ICYgMHhmZjtcbiAgYXJyWzE0XSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbMTVdID0gdiAmIDB4ZmY7XG4gIHJldHVybiBhcnI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBhcnNlOyIsImV4cG9ydCBkZWZhdWx0IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTsiLCIvLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cbnZhciBnZXRSYW5kb21WYWx1ZXM7XG52YXIgcm5kczggPSBuZXcgVWludDhBcnJheSgxNik7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBybmcoKSB7XG4gIC8vIGxhenkgbG9hZCBzbyB0aGF0IGVudmlyb25tZW50cyB0aGF0IG5lZWQgdG8gcG9seWZpbGwgaGF2ZSBhIGNoYW5jZSB0byBkbyBzb1xuICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIGdldFJhbmRvbVZhbHVlcyBuZWVkcyB0byBiZSBpbnZva2VkIGluIGEgY29udGV4dCB3aGVyZSBcInRoaXNcIiBpcyBhIENyeXB0byBpbXBsZW1lbnRhdGlvbi4gQWxzbyxcbiAgICAvLyBmaW5kIHRoZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBjcnlwdG8gKG1zQ3J5cHRvKSBvbiBJRTExLlxuICAgIGdldFJhbmRvbVZhbHVlcyA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0bykgfHwgdHlwZW9mIG1zQ3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nICYmIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKTtcblxuICAgIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdldFJhbmRvbVZhbHVlcyhybmRzOCk7XG59IiwiLy8gQWRhcHRlZCBmcm9tIENocmlzIFZlbmVzcycgU0hBMSBjb2RlIGF0XG4vLyBodHRwOi8vd3d3Lm1vdmFibGUtdHlwZS5jby51ay9zY3JpcHRzL3NoYTEuaHRtbFxuZnVuY3Rpb24gZihzLCB4LCB5LCB6KSB7XG4gIHN3aXRjaCAocykge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiB4ICYgeSBeIH54ICYgejtcblxuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG5cbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4geCAmIHkgXiB4ICYgeiBeIHkgJiB6O1xuXG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIHggXiB5IF4gejtcbiAgfVxufVxuXG5mdW5jdGlvbiBST1RMKHgsIG4pIHtcbiAgcmV0dXJuIHggPDwgbiB8IHggPj4+IDMyIC0gbjtcbn1cblxuZnVuY3Rpb24gc2hhMShieXRlcykge1xuICB2YXIgSyA9IFsweDVhODI3OTk5LCAweDZlZDllYmExLCAweDhmMWJiY2RjLCAweGNhNjJjMWQ2XTtcbiAgdmFyIEggPSBbMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMF07XG5cbiAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbXNnID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGJ5dGVzKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgICBieXRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ5dGVzLnB1c2gobXNnLmNoYXJDb2RlQXQoaSkpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShieXRlcykpIHtcbiAgICAvLyBDb252ZXJ0IEFycmF5LWxpa2UgdG8gQXJyYXlcbiAgICBieXRlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGJ5dGVzKTtcbiAgfVxuXG4gIGJ5dGVzLnB1c2goMHg4MCk7XG4gIHZhciBsID0gYnl0ZXMubGVuZ3RoIC8gNCArIDI7XG4gIHZhciBOID0gTWF0aC5jZWlsKGwgLyAxNik7XG4gIHZhciBNID0gbmV3IEFycmF5KE4pO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBOOyArK19pKSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50MzJBcnJheSgxNik7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIGFycltqXSA9IGJ5dGVzW19pICogNjQgKyBqICogNF0gPDwgMjQgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAxXSA8PCAxNiB8IGJ5dGVzW19pICogNjQgKyBqICogNCArIDJdIDw8IDggfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAzXTtcbiAgICB9XG5cbiAgICBNW19pXSA9IGFycjtcbiAgfVxuXG4gIE1bTiAtIDFdWzE0XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggLyBNYXRoLnBvdygyLCAzMik7XG4gIE1bTiAtIDFdWzE0XSA9IE1hdGguZmxvb3IoTVtOIC0gMV1bMTRdKTtcbiAgTVtOIC0gMV1bMTVdID0gKGJ5dGVzLmxlbmd0aCAtIDEpICogOCAmIDB4ZmZmZmZmZmY7XG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgTjsgKytfaTIpIHtcbiAgICB2YXIgVyA9IG5ldyBVaW50MzJBcnJheSg4MCk7XG5cbiAgICBmb3IgKHZhciB0ID0gMDsgdCA8IDE2OyArK3QpIHtcbiAgICAgIFdbdF0gPSBNW19pMl1bdF07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX3QgPSAxNjsgX3QgPCA4MDsgKytfdCkge1xuICAgICAgV1tfdF0gPSBST1RMKFdbX3QgLSAzXSBeIFdbX3QgLSA4XSBeIFdbX3QgLSAxNF0gXiBXW190IC0gMTZdLCAxKTtcbiAgICB9XG5cbiAgICB2YXIgYSA9IEhbMF07XG4gICAgdmFyIGIgPSBIWzFdO1xuICAgIHZhciBjID0gSFsyXTtcbiAgICB2YXIgZCA9IEhbM107XG4gICAgdmFyIGUgPSBIWzRdO1xuXG4gICAgZm9yICh2YXIgX3QyID0gMDsgX3QyIDwgODA7ICsrX3QyKSB7XG4gICAgICB2YXIgcyA9IE1hdGguZmxvb3IoX3QyIC8gMjApO1xuICAgICAgdmFyIFQgPSBST1RMKGEsIDUpICsgZihzLCBiLCBjLCBkKSArIGUgKyBLW3NdICsgV1tfdDJdID4+PiAwO1xuICAgICAgZSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIGMgPSBST1RMKGIsIDMwKSA+Pj4gMDtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IFQ7XG4gICAgfVxuXG4gICAgSFswXSA9IEhbMF0gKyBhID4+PiAwO1xuICAgIEhbMV0gPSBIWzFdICsgYiA+Pj4gMDtcbiAgICBIWzJdID0gSFsyXSArIGMgPj4+IDA7XG4gICAgSFszXSA9IEhbM10gKyBkID4+PiAwO1xuICAgIEhbNF0gPSBIWzRdICsgZSA+Pj4gMDtcbiAgfVxuXG4gIHJldHVybiBbSFswXSA+PiAyNCAmIDB4ZmYsIEhbMF0gPj4gMTYgJiAweGZmLCBIWzBdID4+IDggJiAweGZmLCBIWzBdICYgMHhmZiwgSFsxXSA+PiAyNCAmIDB4ZmYsIEhbMV0gPj4gMTYgJiAweGZmLCBIWzFdID4+IDggJiAweGZmLCBIWzFdICYgMHhmZiwgSFsyXSA+PiAyNCAmIDB4ZmYsIEhbMl0gPj4gMTYgJiAweGZmLCBIWzJdID4+IDggJiAweGZmLCBIWzJdICYgMHhmZiwgSFszXSA+PiAyNCAmIDB4ZmYsIEhbM10gPj4gMTYgJiAweGZmLCBIWzNdID4+IDggJiAweGZmLCBIWzNdICYgMHhmZiwgSFs0XSA+PiAyNCAmIDB4ZmYsIEhbNF0gPj4gMTYgJiAweGZmLCBIWzRdID4+IDggJiAweGZmLCBIWzRdICYgMHhmZl07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNoYTE7IiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIHRvIFVVSUQgc3RyaW5nIGZvcm1hdCBvZiB0aGUgZm9ybTpcbiAqIFhYWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFhYWFhYWFhYWFxuICovXG5cbnZhciBieXRlVG9IZXggPSBbXTtcblxuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXgucHVzaCgoaSArIDB4MTAwKS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5KGFycikge1xuICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICAvLyBOb3RlOiBCZSBjYXJlZnVsIGVkaXRpbmcgdGhpcyBjb2RlISAgSXQncyBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZVxuICAvLyBhbmQgd29ya3MgaW4gd2F5cyB5b3UgbWF5IG5vdCBleHBlY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC80MzRcbiAgdmFyIHV1aWQgPSAoYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAzXV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA2XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDddXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA5XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDExXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEzXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE1XV0pLnRvTG93ZXJDYXNlKCk7IC8vIENvbnNpc3RlbmN5IGNoZWNrIGZvciB2YWxpZCBVVUlELiAgSWYgdGhpcyB0aHJvd3MsIGl0J3MgbGlrZWx5IGR1ZSB0byBvbmVcbiAgLy8gb2YgdGhlIGZvbGxvd2luZzpcbiAgLy8gLSBPbmUgb3IgbW9yZSBpbnB1dCBhcnJheSB2YWx1ZXMgZG9uJ3QgbWFwIHRvIGEgaGV4IG9jdGV0IChsZWFkaW5nIHRvXG4gIC8vIFwidW5kZWZpbmVkXCIgaW4gdGhlIHV1aWQpXG4gIC8vIC0gSW52YWxpZCBpbnB1dCB2YWx1ZXMgZm9yIHRoZSBSRkMgYHZlcnNpb25gIG9yIGB2YXJpYW50YCBmaWVsZHNcblxuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHJldHVybiB1dWlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHJpbmdpZnk7IiwiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJzsgLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcblxudmFyIF9jbG9ja3NlcTsgLy8gUHJldmlvdXMgdXVpZCBjcmVhdGlvbiB0aW1lXG5cblxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkIGZvciBBUEkgZGV0YWlsc1xuXG5mdW5jdGlvbiB2MShvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICB2YXIgaSA9IGJ1ZiAmJiBvZmZzZXQgfHwgMDtcbiAgdmFyIGIgPSBidWYgfHwgbmV3IEFycmF5KDE2KTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBub2RlID0gb3B0aW9ucy5ub2RlIHx8IF9ub2RlSWQ7XG4gIHZhciBjbG9ja3NlcSA9IG9wdGlvbnMuY2xvY2tzZXEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xvY2tzZXEgOiBfY2xvY2tzZXE7IC8vIG5vZGUgYW5kIGNsb2Nrc2VxIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gcmFuZG9tIHZhbHVlcyBpZiB0aGV5J3JlIG5vdFxuICAvLyBzcGVjaWZpZWQuICBXZSBkbyB0aGlzIGxhemlseSB0byBtaW5pbWl6ZSBpc3N1ZXMgcmVsYXRlZCB0byBpbnN1ZmZpY2llbnRcbiAgLy8gc3lzdGVtIGVudHJvcHkuICBTZWUgIzE4OVxuXG4gIGlmIChub2RlID09IG51bGwgfHwgY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgIHZhciBzZWVkQnl0ZXMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpO1xuXG4gICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuNSwgY3JlYXRlIGFuZCA0OC1iaXQgbm9kZSBpZCwgKDQ3IHJhbmRvbSBiaXRzICsgbXVsdGljYXN0IGJpdCA9IDEpXG4gICAgICBub2RlID0gX25vZGVJZCA9IFtzZWVkQnl0ZXNbMF0gfCAweDAxLCBzZWVkQnl0ZXNbMV0sIHNlZWRCeXRlc1syXSwgc2VlZEJ5dGVzWzNdLCBzZWVkQnl0ZXNbNF0sIHNlZWRCeXRlc1s1XV07XG4gICAgfVxuXG4gICAgaWYgKGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjIuMiwgcmFuZG9taXplICgxNCBiaXQpIGNsb2Nrc2VxXG4gICAgICBjbG9ja3NlcSA9IF9jbG9ja3NlcSA9IChzZWVkQnl0ZXNbNl0gPDwgOCB8IHNlZWRCeXRlc1s3XSkgJiAweDNmZmY7XG4gICAgfVxuICB9IC8vIFVVSUQgdGltZXN0YW1wcyBhcmUgMTAwIG5hbm8tc2Vjb25kIHVuaXRzIHNpbmNlIHRoZSBHcmVnb3JpYW4gZXBvY2gsXG4gIC8vICgxNTgyLTEwLTE1IDAwOjAwKS4gIEpTTnVtYmVycyBhcmVuJ3QgcHJlY2lzZSBlbm91Z2ggZm9yIHRoaXMsIHNvXG4gIC8vIHRpbWUgaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGFzICdtc2VjcycgKGludGVnZXIgbWlsbGlzZWNvbmRzKSBhbmQgJ25zZWNzJ1xuICAvLyAoMTAwLW5hbm9zZWNvbmRzIG9mZnNldCBmcm9tIG1zZWNzKSBzaW5jZSB1bml4IGVwb2NoLCAxOTcwLTAxLTAxIDAwOjAwLlxuXG5cbiAgdmFyIG1zZWNzID0gb3B0aW9ucy5tc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tc2VjcyA6IERhdGUubm93KCk7IC8vIFBlciA0LjIuMS4yLCB1c2UgY291bnQgb2YgdXVpZCdzIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgY2xvY2tcbiAgLy8gY3ljbGUgdG8gc2ltdWxhdGUgaGlnaGVyIHJlc29sdXRpb24gY2xvY2tcblxuICB2YXIgbnNlY3MgPSBvcHRpb25zLm5zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5zZWNzIDogX2xhc3ROU2VjcyArIDE7IC8vIFRpbWUgc2luY2UgbGFzdCB1dWlkIGNyZWF0aW9uIChpbiBtc2VjcylcblxuICB2YXIgZHQgPSBtc2VjcyAtIF9sYXN0TVNlY3MgKyAobnNlY3MgLSBfbGFzdE5TZWNzKSAvIDEwMDAwOyAvLyBQZXIgNC4yLjEuMiwgQnVtcCBjbG9ja3NlcSBvbiBjbG9jayByZWdyZXNzaW9uXG5cbiAgaWYgKGR0IDwgMCAmJiBvcHRpb25zLmNsb2Nrc2VxID09PSB1bmRlZmluZWQpIHtcbiAgICBjbG9ja3NlcSA9IGNsb2Nrc2VxICsgMSAmIDB4M2ZmZjtcbiAgfSAvLyBSZXNldCBuc2VjcyBpZiBjbG9jayByZWdyZXNzZXMgKG5ldyBjbG9ja3NlcSkgb3Igd2UndmUgbW92ZWQgb250byBhIG5ld1xuICAvLyB0aW1lIGludGVydmFsXG5cblxuICBpZiAoKGR0IDwgMCB8fCBtc2VjcyA+IF9sYXN0TVNlY3MpICYmIG9wdGlvbnMubnNlY3MgPT09IHVuZGVmaW5lZCkge1xuICAgIG5zZWNzID0gMDtcbiAgfSAvLyBQZXIgNC4yLjEuMiBUaHJvdyBlcnJvciBpZiB0b28gbWFueSB1dWlkcyBhcmUgcmVxdWVzdGVkXG5cblxuICBpZiAobnNlY3MgPj0gMTAwMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1dWlkLnYxKCk6IENhbid0IGNyZWF0ZSBtb3JlIHRoYW4gMTBNIHV1aWRzL3NlY1wiKTtcbiAgfVxuXG4gIF9sYXN0TVNlY3MgPSBtc2VjcztcbiAgX2xhc3ROU2VjcyA9IG5zZWNzO1xuICBfY2xvY2tzZXEgPSBjbG9ja3NlcTsgLy8gUGVyIDQuMS40IC0gQ29udmVydCBmcm9tIHVuaXggZXBvY2ggdG8gR3JlZ29yaWFuIGVwb2NoXG5cbiAgbXNlY3MgKz0gMTIyMTkyOTI4MDAwMDA7IC8vIGB0aW1lX2xvd2BcblxuICB2YXIgdGwgPSAoKG1zZWNzICYgMHhmZmZmZmZmKSAqIDEwMDAwICsgbnNlY3MpICUgMHgxMDAwMDAwMDA7XG4gIGJbaSsrXSA9IHRsID4+PiAyNCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsID4+PiAxNiAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdGwgJiAweGZmOyAvLyBgdGltZV9taWRgXG5cbiAgdmFyIHRtaCA9IG1zZWNzIC8gMHgxMDAwMDAwMDAgKiAxMDAwMCAmIDB4ZmZmZmZmZjtcbiAgYltpKytdID0gdG1oID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdG1oICYgMHhmZjsgLy8gYHRpbWVfaGlnaF9hbmRfdmVyc2lvbmBcblxuICBiW2krK10gPSB0bWggPj4+IDI0ICYgMHhmIHwgMHgxMDsgLy8gaW5jbHVkZSB2ZXJzaW9uXG5cbiAgYltpKytdID0gdG1oID4+PiAxNiAmIDB4ZmY7IC8vIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYCAoUGVyIDQuMi4yIC0gaW5jbHVkZSB2YXJpYW50KVxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxID4+PiA4IHwgMHg4MDsgLy8gYGNsb2NrX3NlcV9sb3dgXG5cbiAgYltpKytdID0gY2xvY2tzZXEgJiAweGZmOyAvLyBgbm9kZWBcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IDY7ICsrbikge1xuICAgIGJbaSArIG5dID0gbm9kZVtuXTtcbiAgfVxuXG4gIHJldHVybiBidWYgfHwgc3RyaW5naWZ5KGIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2MTsiLCJpbXBvcnQgdjM1IGZyb20gJy4vdjM1LmpzJztcbmltcG9ydCBtZDUgZnJvbSAnLi9tZDUuanMnO1xudmFyIHYzID0gdjM1KCd2MycsIDB4MzAsIG1kNSk7XG5leHBvcnQgZGVmYXVsdCB2MzsiLCJpbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCBwYXJzZSBmcm9tICcuL3BhcnNlLmpzJztcblxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOyAvLyBVVEY4IGVzY2FwZVxuXG4gIHZhciBieXRlcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXMucHVzaChzdHIuY2hhckNvZGVBdChpKSk7XG4gIH1cblxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmV4cG9ydCB2YXIgRE5TID0gJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnQgdmFyIFVSTCA9ICc2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKG5hbWUsIHZlcnNpb24sIGhhc2hmdW5jKSB7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCh2YWx1ZSwgbmFtZXNwYWNlLCBidWYsIG9mZnNldCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHN0cmluZ1RvQnl0ZXModmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZXNwYWNlID0gcGFyc2UobmFtZXNwYWNlKTtcbiAgICB9XG5cbiAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCAhPT0gMTYpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignTmFtZXNwYWNlIG11c3QgYmUgYXJyYXktbGlrZSAoMTYgaXRlcmFibGUgaW50ZWdlciB2YWx1ZXMsIDAtMjU1KScpO1xuICAgIH0gLy8gQ29tcHV0ZSBoYXNoIG9mIG5hbWVzcGFjZSBhbmQgdmFsdWUsIFBlciA0LjNcbiAgICAvLyBGdXR1cmU6IFVzZSBzcHJlYWQgc3ludGF4IHdoZW4gc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMsIGUuZy4gYGJ5dGVzID1cbiAgICAvLyBoYXNoZnVuYyhbLi4ubmFtZXNwYWNlLCAuLi4gdmFsdWVdKWBcblxuXG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyB2YWx1ZS5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldChuYW1lc3BhY2UpO1xuICAgIGJ5dGVzLnNldCh2YWx1ZSwgbmFtZXNwYWNlLmxlbmd0aCk7XG4gICAgYnl0ZXMgPSBoYXNoZnVuYyhieXRlcyk7XG4gICAgYnl0ZXNbNl0gPSBieXRlc1s2XSAmIDB4MGYgfCB2ZXJzaW9uO1xuICAgIGJ5dGVzWzhdID0gYnl0ZXNbOF0gJiAweDNmIHwgMHg4MDtcblxuICAgIGlmIChidWYpIHtcbiAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZ2lmeShieXRlcyk7XG4gIH0gLy8gRnVuY3Rpb24jbmFtZSBpcyBub3Qgc2V0dGFibGUgb24gc29tZSBwbGF0Zm9ybXMgKCMyNzApXG5cblxuICB0cnkge1xuICAgIGdlbmVyYXRlVVVJRC5uYW1lID0gbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gIH0gY2F0Y2ggKGVycikge30gLy8gRm9yIENvbW1vbkpTIGRlZmF1bHQgZXhwb3J0IHN1cHBvcnRcblxuXG4gIGdlbmVyYXRlVVVJRC5ETlMgPSBETlM7XG4gIGdlbmVyYXRlVVVJRC5VUkwgPSBVUkw7XG4gIHJldHVybiBnZW5lcmF0ZVVVSUQ7XG59IiwiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTsgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuXG4gIHJuZHNbNl0gPSBybmRzWzZdICYgMHgwZiB8IDB4NDA7XG4gIHJuZHNbOF0gPSBybmRzWzhdICYgMHgzZiB8IDB4ODA7IC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuXG4gIGlmIChidWYpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcmV0dXJuIHN0cmluZ2lmeShybmRzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjQ7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgc2hhMSBmcm9tICcuL3NoYTEuanMnO1xudmFyIHY1ID0gdjM1KCd2NScsIDB4NTAsIHNoYTEpO1xuZXhwb3J0IGRlZmF1bHQgdjU7IiwiaW1wb3J0IFJFR0VYIGZyb20gJy4vcmVnZXguanMnO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZSh1dWlkKSB7XG4gIHJldHVybiB0eXBlb2YgdXVpZCA9PT0gJ3N0cmluZycgJiYgUkVHRVgudGVzdCh1dWlkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdGU7IiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuXG5mdW5jdGlvbiB2ZXJzaW9uKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICByZXR1cm4gcGFyc2VJbnQodXVpZC5zdWJzdHIoMTQsIDEpLCAxNik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZlcnNpb247IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIiLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oXCIuL3NyYy9hcHAvYmFja2dyb3VuZC50c1wiKTtcbiIsIiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==