NeahNew/.next/server/app/api/redis/status/route.js
2025-05-03 14:17:46 +02:00

275 lines
68 KiB
JavaScript

/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
(() => {
var exports = {};
exports.id = "app/api/redis/status/route";
exports.ids = ["app/api/redis/status/route"];
exports.modules = {
/***/ "(rsc)/./app/api/redis/status/route.ts":
/*!***************************************!*\
!*** ./app/api/redis/status/route.ts ***!
\***************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GET: () => (/* binding */ GET)\n/* harmony export */ });\n/* harmony import */ var next_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next/server */ \"(rsc)/./node_modules/next/dist/api/server.js\");\n/* harmony import */ var _lib_redis__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/redis */ \"(rsc)/./lib/redis.ts\");\n\n\n/**\n * API route to check Redis connection status\n * Used for monitoring and debugging\n */ async function GET() {\n try {\n const status = await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_1__.getRedisStatus)();\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n ready: status.status === 'connected',\n status: status.status,\n ping: status.ping,\n error: status.error\n });\n } catch (error) {\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n ready: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n }, {\n status: 500\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9hcHAvYXBpL3JlZGlzL3N0YXR1cy9yb3V0ZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBMkM7QUFDRTtBQUU3Qzs7O0NBR0MsR0FDTSxlQUFlRTtJQUNwQixJQUFJO1FBQ0YsTUFBTUMsU0FBUyxNQUFNRiwwREFBY0E7UUFFbkMsT0FBT0QscURBQVlBLENBQUNJLElBQUksQ0FBQztZQUN2QkMsT0FBT0YsT0FBT0EsTUFBTSxLQUFLO1lBQ3pCQSxRQUFRQSxPQUFPQSxNQUFNO1lBQ3JCRyxNQUFNSCxPQUFPRyxJQUFJO1lBQ2pCQyxPQUFPSixPQUFPSSxLQUFLO1FBQ3JCO0lBQ0YsRUFBRSxPQUFPQSxPQUFPO1FBQ2QsT0FBT1AscURBQVlBLENBQUNJLElBQUksQ0FBQztZQUN2QkMsT0FBTztZQUNQRSxPQUFPQSxpQkFBaUJDLFFBQVFELE1BQU1FLE9BQU8sR0FBRztRQUNsRCxHQUFHO1lBQUVOLFFBQVE7UUFBSTtJQUNuQjtBQUNGIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL2FwcC9hcGkvcmVkaXMvc3RhdHVzL3JvdXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5leHRSZXNwb25zZSB9IGZyb20gJ25leHQvc2VydmVyJztcbmltcG9ydCB7IGdldFJlZGlzU3RhdHVzIH0gZnJvbSAnQC9saWIvcmVkaXMnO1xuXG4vKipcbiAqIEFQSSByb3V0ZSB0byBjaGVjayBSZWRpcyBjb25uZWN0aW9uIHN0YXR1c1xuICogVXNlZCBmb3IgbW9uaXRvcmluZyBhbmQgZGVidWdnaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBHRVQoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgZ2V0UmVkaXNTdGF0dXMoKTtcbiAgICBcbiAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oe1xuICAgICAgcmVhZHk6IHN0YXR1cy5zdGF0dXMgPT09ICdjb25uZWN0ZWQnLFxuICAgICAgc3RhdHVzOiBzdGF0dXMuc3RhdHVzLFxuICAgICAgcGluZzogc3RhdHVzLnBpbmcsXG4gICAgICBlcnJvcjogc3RhdHVzLmVycm9yXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHtcbiAgICAgIHJlYWR5OiBmYWxzZSxcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ1xuICAgIH0sIHsgc3RhdHVzOiA1MDAgfSk7XG4gIH1cbn0gIl0sIm5hbWVzIjpbIk5leHRSZXNwb25zZSIsImdldFJlZGlzU3RhdHVzIiwiR0VUIiwic3RhdHVzIiwianNvbiIsInJlYWR5IiwicGluZyIsImVycm9yIiwiRXJyb3IiLCJtZXNzYWdlIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./app/api/redis/status/route.ts\n");
/***/ }),
/***/ "(rsc)/./lib/redis.ts":
/*!**********************!*\
!*** ./lib/redis.ts ***!
\**********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ KEYS: () => (/* binding */ KEYS),\n/* harmony export */ TTL: () => (/* binding */ TTL),\n/* harmony export */ cacheEmailContent: () => (/* binding */ cacheEmailContent),\n/* harmony export */ cacheEmailCredentials: () => (/* binding */ cacheEmailCredentials),\n/* harmony export */ cacheEmailList: () => (/* binding */ cacheEmailList),\n/* harmony export */ cacheImapSession: () => (/* binding */ cacheImapSession),\n/* harmony export */ closeRedisConnection: () => (/* binding */ closeRedisConnection),\n/* harmony export */ decryptData: () => (/* binding */ decryptData),\n/* harmony export */ encryptData: () => (/* binding */ encryptData),\n/* harmony export */ getCachedEmailContent: () => (/* binding */ getCachedEmailContent),\n/* harmony export */ getCachedEmailCredentials: () => (/* binding */ getCachedEmailCredentials),\n/* harmony export */ getCachedEmailList: () => (/* binding */ getCachedEmailList),\n/* harmony export */ getCachedImapSession: () => (/* binding */ getCachedImapSession),\n/* harmony export */ getEmailCredentials: () => (/* binding */ getEmailCredentials),\n/* harmony export */ getRedisClient: () => (/* binding */ getRedisClient),\n/* harmony export */ getRedisStatus: () => (/* binding */ getRedisStatus),\n/* harmony export */ invalidateEmailContentCache: () => (/* binding */ invalidateEmailContentCache),\n/* harmony export */ invalidateFolderCache: () => (/* binding */ invalidateFolderCache),\n/* harmony export */ invalidateUserEmailCache: () => (/* binding */ invalidateUserEmailCache),\n/* harmony export */ warmupRedisCache: () => (/* binding */ warmupRedisCache)\n/* harmony export */ });\n/* harmony import */ var ioredis__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ioredis */ \"(rsc)/./node_modules/ioredis/built/index.js\");\n/* harmony import */ var ioredis__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ioredis__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var crypto_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! crypto-js */ \"(rsc)/./node_modules/crypto-js/index.js\");\n/* harmony import */ var crypto_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(crypto_js__WEBPACK_IMPORTED_MODULE_1__);\n\n\n// Initialize Redis client\nlet redisClient = null;\nlet isConnecting = false;\nlet connectionAttempts = 0;\nconst MAX_RECONNECT_ATTEMPTS = 5;\n/**\n * Get a Redis client instance (singleton pattern) with improved connection management\n */ function getRedisClient() {\n if (redisClient && redisClient.status === 'ready') {\n return redisClient;\n }\n if (isConnecting) {\n // If we're already trying to connect, return the existing client\n // This prevents multiple simultaneous connection attempts\n if (redisClient) return redisClient;\n // This is a fallback in case we're connecting but don't have a client yet\n console.warn('Redis connection in progress, creating temporary client');\n }\n if (!redisClient) {\n isConnecting = true;\n connectionAttempts = 0;\n // Set Redis connection parameters from environment variables only\n const redisOptions = {\n host: process.env.REDIS_HOST,\n port: process.env.REDIS_PORT ? parseInt(process.env.REDIS_PORT) : undefined,\n password: process.env.REDIS_PASSWORD,\n retryStrategy: (times)=>{\n connectionAttempts = times;\n if (times > MAX_RECONNECT_ATTEMPTS) {\n console.error(`Redis connection failed after ${times} attempts, giving up`);\n return null; // Stop trying to reconnect\n }\n const delay = Math.min(times * 100, 5000);\n console.log(`Redis reconnect attempt ${times}, retrying in ${delay}ms`);\n return delay;\n },\n maxRetriesPerRequest: 5,\n enableOfflineQueue: true,\n connectTimeout: 10000,\n disconnectTimeout: 2000,\n keepAlive: 10000,\n keyPrefix: '' // No prefix to keep keys clean\n };\n console.log('Connecting to Redis using environment variables');\n redisClient = new (ioredis__WEBPACK_IMPORTED_MODULE_0___default())(redisOptions);\n redisClient.on('error', (err)=>{\n console.error('Redis connection error:', err);\n // Only set to null if we've exceeded max attempts\n if (connectionAttempts > MAX_RECONNECT_ATTEMPTS) {\n console.error('Redis connection failed permanently, will create new client on next request');\n redisClient = null;\n isConnecting = false;\n }\n });\n redisClient.on('connect', ()=>{\n console.log('Successfully connected to Redis');\n isConnecting = false;\n connectionAttempts = 0;\n });\n redisClient.on('reconnecting', ()=>{\n console.log('Reconnecting to Redis...');\n isConnecting = true;\n });\n redisClient.on('ready', ()=>{\n console.log('Redis connection warmed up');\n isConnecting = false;\n });\n redisClient.on('end', ()=>{\n console.log('Redis connection ended');\n // Don't set to null here - let the error handler decide\n });\n }\n return redisClient;\n}\n/**\n * Close Redis connection (useful for serverless environments)\n */ async function closeRedisConnection() {\n if (redisClient) {\n await redisClient.quit();\n redisClient = null;\n }\n}\n// Encryption key from environment variable or fallback\nconst getEncryptionKey = ()=>{\n return process.env.REDIS_ENCRYPTION_KEY || 'default-encryption-key-change-in-production';\n};\n/**\n * Encrypt sensitive data before storing in Redis\n */ function encryptData(data) {\n return crypto_js__WEBPACK_IMPORTED_MODULE_1___default().AES.encrypt(data, getEncryptionKey()).toString();\n}\n/**\n * Decrypt sensitive data retrieved from Redis\n */ function decryptData(encryptedData) {\n const bytes = crypto_js__WEBPACK_IMPORTED_MODULE_1___default().AES.decrypt(encryptedData, getEncryptionKey());\n return bytes.toString((crypto_js__WEBPACK_IMPORTED_MODULE_1___default().enc).Utf8);\n}\n// Cache key definitions\nconst KEYS = {\n CREDENTIALS: (userId, accountId)=>`email:credentials:${userId}:${accountId}`,\n SESSION: (userId)=>`email:session:${userId}`,\n EMAIL_LIST: (userId, accountId, folder, page, perPage)=>`email:list:${userId}:${accountId}:${folder}:${page}:${perPage}`,\n EMAIL_CONTENT: (userId, accountId, emailId)=>`email:content:${userId}:${accountId}:${emailId}`\n};\n// TTL constants in seconds\nconst TTL = {\n CREDENTIALS: 60 * 60 * 24,\n SESSION: 60 * 60 * 4,\n EMAIL_LIST: 60 * 5,\n EMAIL_CONTENT: 60 * 15 // 15 minutes\n};\n/**\n * Cache email credentials in Redis\n */ async function cacheEmailCredentials(userId, accountId, credentials) {\n const redis = getRedisClient();\n const key = KEYS.CREDENTIALS(userId, accountId);\n // Validate credentials before caching\n if (!credentials.email || !credentials.host || !credentials.password && !credentials.useOAuth) {\n console.error(`Cannot cache incomplete credentials for user ${userId}`);\n return;\n }\n try {\n console.log(`Caching credentials for user ${userId}`);\n // Create a copy without the password to store\n const secureCredentials = {\n email: credentials.email,\n host: credentials.host,\n port: credentials.port,\n secure: credentials.secure ?? true,\n // Include the extended fields\n ...credentials.smtp_host && {\n smtp_host: credentials.smtp_host\n },\n ...credentials.smtp_port && {\n smtp_port: credentials.smtp_port\n },\n ...credentials.smtp_secure !== undefined && {\n smtp_secure: credentials.smtp_secure\n },\n ...credentials.display_name && {\n display_name: credentials.display_name\n },\n ...credentials.color && {\n color: credentials.color\n },\n // Include OAuth fields\n ...credentials.useOAuth !== undefined && {\n useOAuth: credentials.useOAuth\n },\n ...credentials.accessToken && {\n accessToken: credentials.accessToken\n },\n ...credentials.refreshToken && {\n refreshToken: credentials.refreshToken\n },\n ...credentials.tokenExpiry && {\n tokenExpiry: credentials.tokenExpiry\n }\n };\n // Encrypt password if provided\n if (credentials.password) {\n try {\n const encrypted = encryptData(credentials.password);\n console.log(`Successfully encrypted password for user ${userId}`);\n secureCredentials.encryptedPassword = encrypted;\n } catch (encryptError) {\n console.error(`Failed to encrypt password for user ${userId}:`, encryptError);\n // Continue anyway since we might have OAuth tokens\n }\n }\n await redis.set(key, JSON.stringify(secureCredentials), 'EX', TTL.CREDENTIALS);\n console.log(`Credentials cached for user ${userId}`);\n } catch (error) {\n console.error(`Error caching credentials for user ${userId}:`, error);\n }\n}\n/**\n * Get email credentials from Redis\n */ async function getEmailCredentials(userId, accountId) {\n const redis = getRedisClient();\n const key = KEYS.CREDENTIALS(userId, accountId);\n try {\n const credStr = await redis.get(key);\n if (!credStr) {\n return null;\n }\n const creds = JSON.parse(credStr);\n let password;\n // Handle OAuth accounts (they might not have a password)\n if (creds.encryptedPassword) {\n try {\n // Decrypt the password\n password = decryptData(creds.encryptedPassword);\n } catch (decryptError) {\n console.error(`Failed to decrypt password for user ${userId}:`, decryptError);\n // For OAuth accounts, we can continue without a password\n if (!creds.useOAuth) {\n return null;\n }\n }\n }\n // Return the full credentials with decrypted password if available\n const result = {\n email: creds.email,\n host: creds.host,\n port: creds.port,\n secure: creds.secure ?? true,\n ...password && {\n password\n },\n ...creds.smtp_host && {\n smtp_host: creds.smtp_host\n },\n ...creds.smtp_port && {\n smtp_port: creds.smtp_port\n },\n ...creds.smtp_secure !== undefined && {\n smtp_secure: creds.smtp_secure\n },\n ...creds.display_name && {\n display_name: creds.display_name\n },\n ...creds.color && {\n color: creds.color\n },\n // Include OAuth fields\n ...creds.useOAuth !== undefined && {\n useOAuth: creds.useOAuth\n },\n ...creds.accessToken && {\n accessToken: creds.accessToken\n },\n ...creds.refreshToken && {\n refreshToken: creds.refreshToken\n },\n ...creds.tokenExpiry && {\n tokenExpiry: creds.tokenExpiry\n }\n };\n return result;\n } catch (error) {\n console.error(`Error getting credentials for user ${userId}:`, error);\n return null;\n }\n}\n/**\n * Cache IMAP session data for quick reconnection\n */ async function cacheImapSession(userId, sessionData) {\n const redis = getRedisClient();\n const key = KEYS.SESSION(userId);\n // Always update the lastActive timestamp\n sessionData.lastActive = Date.now();\n await redis.set(key, JSON.stringify(sessionData), 'EX', TTL.SESSION);\n}\n/**\n * Get cached IMAP session data\n */ async function getCachedImapSession(userId) {\n const redis = getRedisClient();\n const key = KEYS.SESSION(userId);\n const cachedData = await redis.get(key);\n if (!cachedData) return null;\n return JSON.parse(cachedData);\n}\n/**\n * Cache email list in Redis\n */ async function cacheEmailList(userId, accountId, folder, page, perPage, data) {\n const redis = getRedisClient();\n const key = KEYS.EMAIL_LIST(userId, accountId, folder, page, perPage);\n await redis.set(key, JSON.stringify(data), 'EX', TTL.EMAIL_LIST);\n}\n/**\n * Get cached email list from Redis\n */ async function getCachedEmailList(userId, accountId, folder, page, perPage) {\n const redis = getRedisClient();\n const key = KEYS.EMAIL_LIST(userId, accountId, folder, page, perPage);\n const cachedData = await redis.get(key);\n if (!cachedData) return null;\n return JSON.parse(cachedData);\n}\n/**\n * Cache email content in Redis\n */ async function cacheEmailContent(userId, accountId, emailId, data) {\n const redis = getRedisClient();\n const key = KEYS.EMAIL_CONTENT(userId, accountId, emailId);\n await redis.set(key, JSON.stringify(data), 'EX', TTL.EMAIL_CONTENT);\n}\n/**\n * Get cached email content from Redis\n */ async function getCachedEmailContent(userId, accountId, emailId) {\n const redis = getRedisClient();\n const key = KEYS.EMAIL_CONTENT(userId, accountId, emailId);\n const cachedData = await redis.get(key);\n if (!cachedData) return null;\n return JSON.parse(cachedData);\n}\n/**\n * Invalidate all email caches for a folder\n */ async function invalidateFolderCache(userId, accountId, folder) {\n const redis = getRedisClient();\n const pattern = `email:list:${userId}:${accountId}:${folder}:*`;\n // Use SCAN to find and delete keys matching the pattern\n let cursor = '0';\n do {\n const [nextCursor, keys] = await redis.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n if (keys.length > 0) {\n await redis.del(...keys);\n }\n }while (cursor !== '0');\n}\n/**\n * Invalidate email content cache\n */ async function invalidateEmailContentCache(userId, accountId, emailId) {\n const redis = getRedisClient();\n const key = KEYS.EMAIL_CONTENT(userId, accountId, emailId);\n await redis.del(key);\n}\n/**\n * Warm up Redis connection to avoid cold starts\n */ async function warmupRedisCache() {\n try {\n // Ping Redis to establish connection early\n const redis = getRedisClient();\n await redis.ping();\n console.log('Redis connection warmed up');\n return true;\n } catch (error) {\n console.error('Error warming up Redis:', error);\n return false;\n }\n}\n/**\n * Get Redis connection status\n */ async function getRedisStatus() {\n try {\n const redis = getRedisClient();\n const pong = await redis.ping();\n return {\n status: 'connected',\n ping: pong\n };\n } catch (error) {\n return {\n status: 'error',\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n/**\n * Invalidate all user email caches (email lists and content)\n */ async function invalidateUserEmailCache(userId) {\n const redis = getRedisClient();\n // Patterns to delete\n const patterns = [\n `email:list:${userId}:*`,\n `email:content:${userId}:*`\n ];\n for (const pattern of patterns){\n let cursor = '0';\n do {\n const [nextCursor, keys] = await redis.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n if (keys.length > 0) {\n await redis.del(...keys);\n }\n }while (cursor !== '0');\n }\n}\n/**\n * Get cached email credentials from Redis\n * @deprecated Use getEmailCredentials instead\n */ async function getCachedEmailCredentials(userId, accountId) {\n return getEmailCredentials(userId, accountId);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEdBQUcsTUFBTTFDLE1BQU0yQyxJQUFJLENBQUNILFFBQVEsU0FBU0QsU0FBUyxTQUFTO1lBQy9FQyxTQUFTQztZQUVULElBQUlDLEtBQUtFLE1BQU0sR0FBRyxHQUFHO2dCQUNuQixNQUFNNUMsTUFBTTZDLEdBQUcsSUFBSUg7WUFDckI7UUFDRixRQUFTRixXQUFXLEtBQUs7SUFDM0I7QUFDRjtBQUVBOzs7Q0FHQyxHQUNNLGVBQWVnQiwwQkFDcEJwRSxNQUFjLEVBQ2RDLFNBQWlCO0lBRWpCLE9BQU8rQixvQkFBb0JoQyxRQUFRQztBQUNyQyIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9saWIvcmVkaXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlZGlzIGZyb20gJ2lvcmVkaXMnO1xuaW1wb3J0IENyeXB0b0pTIGZyb20gJ2NyeXB0by1qcyc7XG5cbi8vIEluaXRpYWxpemUgUmVkaXMgY2xpZW50XG5sZXQgcmVkaXNDbGllbnQ6IFJlZGlzIHwgbnVsbCA9IG51bGw7XG5sZXQgaXNDb25uZWN0aW5nID0gZmFsc2U7XG5sZXQgY29ubmVjdGlvbkF0dGVtcHRzID0gMDtcbmNvbnN0IE1BWF9SRUNPTk5FQ1RfQVRURU1QVFMgPSA1O1xuXG4vKipcbiAqIEdldCBhIFJlZGlzIGNsaWVudCBpbnN0YW5jZSAoc2luZ2xldG9uIHBhdHRlcm4pIHdpdGggaW1wcm92ZWQgY29ubmVjdGlvbiBtYW5hZ2VtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWRpc0NsaWVudCgpOiBSZWRpcyB7XG4gIGlmIChyZWRpc0NsaWVudCAmJiByZWRpc0NsaWVudC5zdGF0dXMgPT09ICdyZWFkeScpIHtcbiAgICByZXR1cm4gcmVkaXNDbGllbnQ7XG4gIH1cbiAgXG4gIGlmIChpc0Nvbm5lY3RpbmcpIHtcbiAgICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHRyeWluZyB0byBjb25uZWN0LCByZXR1cm4gdGhlIGV4aXN0aW5nIGNsaWVudFxuICAgIC8vIFRoaXMgcHJldmVudHMgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIGNvbm5lY3Rpb24gYXR0ZW1wdHNcbiAgICBpZiAocmVkaXNDbGllbnQpIHJldHVybiByZWRpc0NsaWVudDtcbiAgICBcbiAgICAvLyBUaGlzIGlzIGEgZmFsbGJhY2sgaW4gY2FzZSB3ZSdyZSBjb25uZWN0aW5nIGJ1dCBkb24ndCBoYXZlIGEgY2xpZW50IHlldFxuICAgIGNvbnNvbGUud2FybignUmVkaXMgY29ubmVjdGlvbiBpbiBwcm9ncmVzcywgY3JlYXRpbmcgdGVtcG9yYXJ5IGNsaWVudCcpO1xuICB9XG4gIFxuICBpZiAoIXJlZGlzQ2xpZW50KSB7XG4gICAgaXNDb25uZWN0aW5nID0gdHJ1ZTtcbiAgICBjb25uZWN0aW9uQXR0ZW1wdHMgPSAwO1xuICAgIFxuICAgIC8vIFNldCBSZWRpcyBjb25uZWN0aW9uIHBhcmFtZXRlcnMgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb25seVxuICAgIGNvbnN0IHJlZGlzT3B0aW9ucyA9IHtcbiAgICAgIGhvc3Q6IHByb2Nlc3MuZW52LlJFRElTX0hPU1QsXG4gICAgICBwb3J0OiBwcm9jZXNzLmVudi5SRURJU19QT1JUID8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuUkVESVNfUE9SVCkgOiB1bmRlZmluZWQsXG4gICAgICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuUkVESVNfUEFTU1dPUkQsXG4gICAgICByZXRyeVN0cmF0ZWd5OiAodGltZXM6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdHMgPSB0aW1lcztcbiAgICAgICAgaWYgKHRpbWVzID4gTUFYX1JFQ09OTkVDVF9BVFRFTVBUUykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlZGlzIGNvbm5lY3Rpb24gZmFpbGVkIGFmdGVyICR7dGltZXN9IGF0dGVtcHRzLCBnaXZpbmcgdXBgKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gU3RvcCB0cnlpbmcgdG8gcmVjb25uZWN0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVsYXkgPSBNYXRoLm1pbih0aW1lcyAqIDEwMCwgNTAwMCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZWRpcyByZWNvbm5lY3QgYXR0ZW1wdCAke3RpbWVzfSwgcmV0cnlpbmcgaW4gJHtkZWxheX1tc2ApO1xuICAgICAgICByZXR1cm4gZGVsYXk7XG4gICAgICB9LFxuICAgICAgbWF4UmV0cmllc1BlclJlcXVlc3Q6IDUsXG4gICAgICBlbmFibGVPZmZsaW5lUXVldWU6IHRydWUsXG4gICAgICBjb25uZWN0VGltZW91dDogMTAwMDAsIC8vIDEwIHNlY29uZHNcbiAgICAgIGRpc2Nvbm5lY3RUaW1lb3V0OiAyMDAwLCAvLyAyIHNlY29uZHNcbiAgICAgIGtlZXBBbGl2ZTogMTAwMDAsIC8vIDEwIHNlY29uZHNcbiAgICAgIGtleVByZWZpeDogJycgLy8gTm8gcHJlZml4IHRvIGtlZXAga2V5cyBjbGVhblxuICAgIH07XG4gICAgXG4gICAgY29uc29sZS5sb2coJ0Nvbm5lY3RpbmcgdG8gUmVkaXMgdXNpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzJyk7XG4gICAgcmVkaXNDbGllbnQgPSBuZXcgUmVkaXMocmVkaXNPcHRpb25zKTtcbiAgICBcbiAgICByZWRpc0NsaWVudC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdSZWRpcyBjb25uZWN0aW9uIGVycm9yOicsIGVycik7XG4gICAgICBcbiAgICAgIC8vIE9ubHkgc2V0IHRvIG51bGwgaWYgd2UndmUgZXhjZWVkZWQgbWF4IGF0dGVtcHRzXG4gICAgICBpZiAoY29ubmVjdGlvbkF0dGVtcHRzID4gTUFYX1JFQ09OTkVDVF9BVFRFTVBUUykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdSZWRpcyBjb25uZWN0aW9uIGZhaWxlZCBwZXJtYW5lbnRseSwgd2lsbCBjcmVhdGUgbmV3IGNsaWVudCBvbiBuZXh0IHJlcXVlc3QnKTtcbiAgICAgICAgcmVkaXNDbGllbnQgPSBudWxsO1xuICAgICAgICBpc0Nvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICByZWRpc0NsaWVudC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIFJlZGlzJyk7XG4gICAgICBpc0Nvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgIGNvbm5lY3Rpb25BdHRlbXB0cyA9IDA7XG4gICAgfSk7XG4gICAgXG4gICAgcmVkaXNDbGllbnQub24oJ3JlY29ubmVjdGluZycsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdSZWNvbm5lY3RpbmcgdG8gUmVkaXMuLi4nKTtcbiAgICAgIGlzQ29ubmVjdGluZyA9IHRydWU7XG4gICAgfSk7XG4gICAgXG4gICAgcmVkaXNDbGllbnQub24oJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ1JlZGlzIGNvbm5lY3Rpb24gd2FybWVkIHVwJyk7XG4gICAgICBpc0Nvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICB9KTtcbiAgICBcbiAgICByZWRpc0NsaWVudC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ1JlZGlzIGNvbm5lY3Rpb24gZW5kZWQnKTtcbiAgICAgIC8vIERvbid0IHNldCB0byBudWxsIGhlcmUgLSBsZXQgdGhlIGVycm9yIGhhbmRsZXIgZGVjaWRlXG4gICAgfSk7XG4gIH1cbiAgXG4gIHJldHVybiByZWRpc0NsaWVudDtcbn1cblxuLyoqXG4gKiBDbG9zZSBSZWRpcyBjb25uZWN0aW9uICh1c2VmdWwgZm9yIHNlcnZlcmxlc3MgZW52aXJvbm1lbnRzKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xvc2VSZWRpc0Nvbm5lY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChyZWRpc0NsaWVudCkge1xuICAgIGF3YWl0IHJlZGlzQ2xpZW50LnF1aXQoKTtcbiAgICByZWRpc0NsaWVudCA9IG51bGw7XG4gIH1cbn1cblxuLy8gRW5jcnlwdGlvbiBrZXkgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBmYWxsYmFja1xuY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9ICgpID0+IHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LlJFRElTX0VOQ1JZUFRJT05fS0VZIHx8ICdkZWZhdWx0LWVuY3J5cHRpb24ta2V5LWNoYW5nZS1pbi1wcm9kdWN0aW9uJztcbn07XG5cbi8qKlxuICogRW5jcnlwdCBzZW5zaXRpdmUgZGF0YSBiZWZvcmUgc3RvcmluZyBpbiBSZWRpc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jcnlwdERhdGEoZGF0YTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIENyeXB0b0pTLkFFUy5lbmNyeXB0KGRhdGEsIGdldEVuY3J5cHRpb25LZXkoKSkudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBEZWNyeXB0IHNlbnNpdGl2ZSBkYXRhIHJldHJpZXZlZCBmcm9tIFJlZGlzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNyeXB0RGF0YShlbmNyeXB0ZWREYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBieXRlcyA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KGVuY3J5cHRlZERhdGEsIGdldEVuY3J5cHRpb25LZXkoKSk7XG4gIHJldHVybiBieXRlcy50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XG59XG5cbi8vIENhY2hlIGtleSBkZWZpbml0aW9uc1xuZXhwb3J0IGNvbnN0IEtFWVMgPSB7XG4gIENSRURFTlRJQUxTOiAodXNlcklkOiBzdHJpbmcsIGFjY291bnRJZDogc3RyaW5nKSA9PiBgZW1haWw6Y3JlZGVudGlhbHM6JHt1c2VySWR9OiR7YWNjb3VudElkfWAsXG4gIFNFU1NJT046ICh1c2VySWQ6IHN0cmluZykgPT4gYGVtYWlsOnNlc3Npb246JHt1c2VySWR9YCxcbiAgRU1BSUxfTElTVDogKHVzZXJJZDogc3RyaW5nLCBhY2NvdW50SWQ6IHN0cmluZywgZm9sZGVyOiBzdHJpbmcsIHBhZ2U6IG51bWJlciwgcGVyUGFnZTogbnVtYmVyKSA9PiBcbiAgICBgZW1haWw6bGlzdDoke3VzZXJJZH06JHthY2NvdW50SWR9OiR7Zm9sZGVyfToke3BhZ2V9OiR7cGVyUGFnZX1gLFxuICBFTUFJTF9DT05URU5UOiAodXNlcklkOiBzdHJpbmcsIGFjY291bnRJZDogc3RyaW5nLCBlbWFpbElkOiBzdHJpbmcpID0+IFxuICAgIGBlbWFpbDpjb250ZW50OiR7dXNlcklkfToke2FjY291bnRJZH06JHtlbWFpbElkfWBcbn07XG5cbi8vIFRUTCBjb25zdGFudHMgaW4gc2Vjb25kc1xuZXhwb3J0IGNvbnN0IFRUTCA9IHtcbiAgQ1JFREVOVElBTFM6IDYwICogNjAgKiAyNCwgLy8gMjQgaG91cnNcbiAgU0VTU0lPTjogNjAgKiA2MCAqIDQsICAgICAgLy8gNCBob3VycyAoaW5jcmVhc2VkIGZyb20gMzAgbWludXRlcylcbiAgRU1BSUxfTElTVDogNjAgKiA1LCAgICAgICAgLy8gNSBtaW51dGVzXG4gIEVNQUlMX0NPTlRFTlQ6IDYwICogMTUgICAgIC8vIDE1IG1pbnV0ZXNcbn07XG5cbmludGVyZmFjZSBFbWFpbENyZWRlbnRpYWxzIHtcbiAgZW1haWw6IHN0cmluZztcbiAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xuICBzZWN1cmU/OiBib29sZWFuO1xuICBlbmNyeXB0ZWRQYXNzd29yZD86IHN0cmluZztcbiAgc210cF9ob3N0Pzogc3RyaW5nO1xuICBzbXRwX3BvcnQ/OiBudW1iZXI7XG4gIHNtdHBfc2VjdXJlPzogYm9vbGVhbjtcbiAgZGlzcGxheV9uYW1lPzogc3RyaW5nO1xuICBjb2xvcj86IHN0cmluZztcbiAgdXNlT0F1dGg/OiBib29sZWFuO1xuICBhY2Nlc3NUb2tlbj86IHN0cmluZztcbiAgcmVmcmVzaFRva2VuPzogc3RyaW5nO1xuICB0b2tlbkV4cGlyeT86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEltYXBTZXNzaW9uRGF0YSB7XG4gIGNvbm5lY3Rpb25JZD86IHN0cmluZztcbiAgbGFzdEFjdGl2ZTogbnVtYmVyO1xuICBtYWlsYm94ZXM/OiBzdHJpbmdbXTtcbiAgbGFzdFZpc2l0PzogbnVtYmVyO1xuICBkZWZhdWx0QWNjb3VudElkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENhY2hlIGVtYWlsIGNyZWRlbnRpYWxzIGluIFJlZGlzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWNoZUVtYWlsQ3JlZGVudGlhbHMoXG4gIHVzZXJJZDogc3RyaW5nLFxuICBhY2NvdW50SWQ6IHN0cmluZyxcbiAgY3JlZGVudGlhbHM6IEVtYWlsQ3JlZGVudGlhbHNcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWRpcyA9IGdldFJlZGlzQ2xpZW50KCk7XG4gIGNvbnN0IGtleSA9IEtFWVMuQ1JFREVOVElBTFModXNlcklkLCBhY2NvdW50SWQpO1xuICBcbiAgLy8gVmFsaWRhdGUgY3JlZGVudGlhbHMgYmVmb3JlIGNhY2hpbmdcbiAgaWYgKCFjcmVkZW50aWFscy5lbWFpbCB8fCAhY3JlZGVudGlhbHMuaG9zdCB8fCAoIWNyZWRlbnRpYWxzLnBhc3N3b3JkICYmICFjcmVkZW50aWFscy51c2VPQXV0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgY2FjaGUgaW5jb21wbGV0ZSBjcmVkZW50aWFscyBmb3IgdXNlciAke3VzZXJJZH1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coYENhY2hpbmcgY3JlZGVudGlhbHMgZm9yIHVzZXIgJHt1c2VySWR9YCk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGEgY29weSB3aXRob3V0IHRoZSBwYXNzd29yZCB0byBzdG9yZVxuICAgIGNvbnN0IHNlY3VyZUNyZWRlbnRpYWxzOiBFbWFpbENyZWRlbnRpYWxzID0ge1xuICAgICAgZW1haWw6IGNyZWRlbnRpYWxzLmVtYWlsLFxuICAgICAgaG9zdDogY3JlZGVudGlhbHMuaG9zdCxcbiAgICAgIHBvcnQ6IGNyZWRlbnRpYWxzLnBvcnQsXG4gICAgICBzZWN1cmU6IGNyZWRlbnRpYWxzLnNlY3VyZSA/PyB0cnVlLFxuICAgICAgLy8gSW5jbHVkZSB0aGUgZXh0ZW5kZWQgZmllbGRzXG4gICAgICAuLi4oY3JlZGVudGlhbHMuc210cF9ob3N0ICYmIHsgc210cF9ob3N0OiBjcmVkZW50aWFscy5zbXRwX2hvc3QgfSksXG4gICAgICAuLi4oY3JlZGVudGlhbHMuc210cF9wb3J0ICYmIHsgc210cF9wb3J0OiBjcmVkZW50aWFscy5zbXRwX3BvcnQgfSksXG4gICAgICAuLi4oY3JlZGVudGlhbHMuc210cF9zZWN1cmUgIT09IHVuZGVmaW5lZCAmJiB7IHNtdHBfc2VjdXJlOiBjcmVkZW50aWFscy5zbXRwX3NlY3VyZSB9KSxcbiAgICAgIC4uLihjcmVkZW50aWFscy5kaXNwbGF5X25hbWUgJiYgeyBkaXNwbGF5X25hbWU6IGNyZWRlbnRpYWxzLmRpc3BsYXlfbmFtZSB9KSxcbiAgICAgIC4uLihjcmVkZW50aWFscy5jb2xvciAmJiB7IGNvbG9yOiBjcmVkZW50aWFscy5jb2xvciB9KSxcbiAgICAgIC8vIEluY2x1ZGUgT0F1dGggZmllbGRzXG4gICAgICAuLi4oY3JlZGVudGlhbHMudXNlT0F1dGggIT09IHVuZGVmaW5lZCAmJiB7IHVzZU9BdXRoOiBjcmVkZW50aWFscy51c2VPQXV0aCB9KSxcbiAgICAgIC4uLihjcmVkZW50aWFscy5hY2Nlc3NUb2tlbiAmJiB7IGFjY2Vzc1Rva2VuOiBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbiB9KSxcbiAgICAgIC4uLihjcmVkZW50aWFscy5yZWZyZXNoVG9rZW4gJiYgeyByZWZyZXNoVG9rZW46IGNyZWRlbnRpYWxzLnJlZnJlc2hUb2tlbiB9KSxcbiAgICAgIC4uLihjcmVkZW50aWFscy50b2tlbkV4cGlyeSAmJiB7IHRva2VuRXhwaXJ5OiBjcmVkZW50aWFscy50b2tlbkV4cGlyeSB9KVxuICAgIH07XG4gICAgXG4gICAgLy8gRW5jcnlwdCBwYXNzd29yZCBpZiBwcm92aWRlZFxuICAgIGlmIChjcmVkZW50aWFscy5wYXNzd29yZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gZW5jcnlwdERhdGEoY3JlZGVudGlhbHMucGFzc3dvcmQpO1xuICAgICAgICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IGVuY3J5cHRlZCBwYXNzd29yZCBmb3IgdXNlciAke3VzZXJJZH1gKTtcbiAgICAgICAgc2VjdXJlQ3JlZGVudGlhbHMuZW5jcnlwdGVkUGFzc3dvcmQgPSBlbmNyeXB0ZWQ7XG4gICAgICB9IGNhdGNoIChlbmNyeXB0RXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGVuY3J5cHQgcGFzc3dvcmQgZm9yIHVzZXIgJHt1c2VySWR9OmAsIGVuY3J5cHRFcnJvcik7XG4gICAgICAgIC8vIENvbnRpbnVlIGFueXdheSBzaW5jZSB3ZSBtaWdodCBoYXZlIE9BdXRoIHRva2Vuc1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBhd2FpdCByZWRpcy5zZXQoa2V5LCBKU09OLnN0cmluZ2lmeShzZWN1cmVDcmVkZW50aWFscyksICdFWCcsIFRUTC5DUkVERU5USUFMUyk7XG4gICAgY29uc29sZS5sb2coYENyZWRlbnRpYWxzIGNhY2hlZCBmb3IgdXNlciAke3VzZXJJZH1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBFcnJvciBjYWNoaW5nIGNyZWRlbnRpYWxzIGZvciB1c2VyICR7dXNlcklkfTpgLCBlcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgZW1haWwgY3JlZGVudGlhbHMgZnJvbSBSZWRpc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxDcmVkZW50aWFscyhcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGFjY291bnRJZDogc3RyaW5nXG4pOiBQcm9taXNlPEVtYWlsQ3JlZGVudGlhbHMgfCBudWxsPiB7XG4gIGNvbnN0IHJlZGlzID0gZ2V0UmVkaXNDbGllbnQoKTtcbiAgY29uc3Qga2V5ID0gS0VZUy5DUkVERU5USUFMUyh1c2VySWQsIGFjY291bnRJZCk7XG4gIFxuICB0cnkge1xuICAgIGNvbnN0IGNyZWRTdHIgPSBhd2FpdCByZWRpcy5nZXQoa2V5KTtcbiAgICBcbiAgICBpZiAoIWNyZWRTdHIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBjcmVkcyA9IEpTT04ucGFyc2UoY3JlZFN0cikgYXMgRW1haWxDcmVkZW50aWFscztcbiAgICBcbiAgICBsZXQgcGFzc3dvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBcbiAgICAvLyBIYW5kbGUgT0F1dGggYWNjb3VudHMgKHRoZXkgbWlnaHQgbm90IGhhdmUgYSBwYXNzd29yZClcbiAgICBpZiAoY3JlZHMuZW5jcnlwdGVkUGFzc3dvcmQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIERlY3J5cHQgdGhlIHBhc3N3b3JkXG4gICAgICAgIHBhc3N3b3JkID0gZGVjcnlwdERhdGEoY3JlZHMuZW5jcnlwdGVkUGFzc3dvcmQpO1xuICAgICAgfSBjYXRjaCAoZGVjcnlwdEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBkZWNyeXB0IHBhc3N3b3JkIGZvciB1c2VyICR7dXNlcklkfTpgLCBkZWNyeXB0RXJyb3IpO1xuICAgICAgICAvLyBGb3IgT0F1dGggYWNjb3VudHMsIHdlIGNhbiBjb250aW51ZSB3aXRob3V0IGEgcGFzc3dvcmRcbiAgICAgICAgaWYgKCFjcmVkcy51c2VPQXV0aCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFJldHVybiB0aGUgZnVsbCBjcmVkZW50aWFscyB3aXRoIGRlY3J5cHRlZCBwYXNzd29yZCBpZiBhdmFpbGFibGVcbiAgICBjb25zdCByZXN1bHQ6IEVtYWlsQ3JlZGVudGlhbHMgPSB7XG4gICAgICBlbWFpbDogY3JlZHMuZW1haWwsXG4gICAgICBob3N0OiBjcmVkcy5ob3N0LFxuICAgICAgcG9ydDogY3JlZHMucG9ydCxcbiAgICAgIHNlY3VyZTogY3JlZHMuc2VjdXJlID8/IHRydWUsXG4gICAgICAuLi4ocGFzc3dvcmQgJiYgeyBwYXNzd29yZCB9KSxcbiAgICAgIC4uLihjcmVkcy5zbXRwX2hvc3QgJiYgeyBzbXRwX2hvc3Q6IGNyZWRzLnNtdHBfaG9zdCB9KSxcbiAgICAgIC4uLihjcmVkcy5zbXRwX3BvcnQgJiYgeyBzbXRwX3BvcnQ6IGNyZWRzLnNtdHBfcG9ydCB9KSxcbiAgICAgIC4uLihjcmVkcy5zbXRwX3NlY3VyZSAhPT0gdW5kZWZpbmVkICYmIHsgc210cF9zZWN1cmU6IGNyZWRzLnNtdHBfc2VjdXJlIH0pLFxuICAgICAgLi4uKGNyZWRzLmRpc3BsYXlfbmFtZSAmJiB7IGRpc3BsYXlfbmFtZTogY3JlZHMuZGlzcGxheV9uYW1lIH0pLFxuICAgICAgLi4uKGNyZWRzLmNvbG9yICYmIHsgY29sb3I6IGNyZWRzLmNvbG9yIH0pLFxuICAgICAgLy8gSW5jbHVkZSBPQXV0aCBmaWVsZHNcbiAgICAgIC4uLihjcmVkcy51c2VPQXV0aCAhPT0gdW5kZWZpbmVkICYmIHsgdXNlT0F1dGg6IGNyZWRzLnVzZU9BdXRoIH0pLFxuICAgICAgLi4uKGNyZWRzLmFjY2Vzc1Rva2VuICYmIHsgYWNjZXNzVG9rZW46IGNyZWRzLmFjY2Vzc1Rva2VuIH0pLFxuICAgICAgLi4uKGNyZWRzLnJlZnJlc2hUb2tlbiAmJiB7IHJlZnJlc2hUb2tlbjogY3JlZHMucmVmcmVzaFRva2VuIH0pLFxuICAgICAgLi4uKGNyZWRzLnRva2VuRXhwaXJ5ICYmIHsgdG9rZW5FeHBpcnk6IGNyZWRzLnRva2VuRXhwaXJ5IH0pXG4gICAgfTtcbiAgICBcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGdldHRpbmcgY3JlZGVudGlhbHMgZm9yIHVzZXIgJHt1c2VySWR9OmAsIGVycm9yKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIENhY2hlIElNQVAgc2Vzc2lvbiBkYXRhIGZvciBxdWljayByZWNvbm5lY3Rpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhY2hlSW1hcFNlc3Npb24oXG4gIHVzZXJJZDogc3RyaW5nLFxuICBzZXNzaW9uRGF0YTogSW1hcFNlc3Npb25EYXRhXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVkaXMgPSBnZXRSZWRpc0NsaWVudCgpO1xuICBjb25zdCBrZXkgPSBLRVlTLlNFU1NJT04odXNlcklkKTtcbiAgXG4gIC8vIEFsd2F5cyB1cGRhdGUgdGhlIGxhc3RBY3RpdmUgdGltZXN0YW1wXG4gIHNlc3Npb25EYXRhLmxhc3RBY3RpdmUgPSBEYXRlLm5vdygpO1xuICBcbiAgYXdhaXQgcmVkaXMuc2V0KGtleSwgSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbkRhdGEpLCAnRVgnLCBUVEwuU0VTU0lPTik7XG59XG5cbi8qKlxuICogR2V0IGNhY2hlZCBJTUFQIHNlc3Npb24gZGF0YVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVkSW1hcFNlc3Npb24oXG4gIHVzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPEltYXBTZXNzaW9uRGF0YSB8IG51bGw+IHtcbiAgY29uc3QgcmVkaXMgPSBnZXRSZWRpc0NsaWVudCgpO1xuICBjb25zdCBrZXkgPSBLRVlTLlNFU1NJT04odXNlcklkKTtcbiAgXG4gIGNvbnN0IGNhY2hlZERhdGEgPSBhd2FpdCByZWRpcy5nZXQoa2V5KTtcbiAgaWYgKCFjYWNoZWREYXRhKSByZXR1cm4gbnVsbDtcbiAgXG4gIHJldHVybiBKU09OLnBhcnNlKGNhY2hlZERhdGEpIGFzIEltYXBTZXNzaW9uRGF0YTtcbn1cblxuLyoqXG4gKiBDYWNoZSBlbWFpbCBsaXN0IGluIFJlZGlzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWNoZUVtYWlsTGlzdChcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGFjY291bnRJZDogc3RyaW5nLFxuICBmb2xkZXI6IHN0cmluZyxcbiAgcGFnZTogbnVtYmVyLFxuICBwZXJQYWdlOiBudW1iZXIsXG4gIGRhdGE6IGFueVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlZGlzID0gZ2V0UmVkaXNDbGllbnQoKTtcbiAgY29uc3Qga2V5ID0gS0VZUy5FTUFJTF9MSVNUKHVzZXJJZCwgYWNjb3VudElkLCBmb2xkZXIsIHBhZ2UsIHBlclBhZ2UpO1xuICBcbiAgYXdhaXQgcmVkaXMuc2V0KGtleSwgSlNPTi5zdHJpbmdpZnkoZGF0YSksICdFWCcsIFRUTC5FTUFJTF9MSVNUKTtcbn1cblxuLyoqXG4gKiBHZXQgY2FjaGVkIGVtYWlsIGxpc3QgZnJvbSBSZWRpc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVkRW1haWxMaXN0KFxuICB1c2VySWQ6IHN0cmluZyxcbiAgYWNjb3VudElkOiBzdHJpbmcsXG4gIGZvbGRlcjogc3RyaW5nLFxuICBwYWdlOiBudW1iZXIsXG4gIHBlclBhZ2U6IG51bWJlclxuKTogUHJvbWlzZTxhbnkgfCBudWxsPiB7XG4gIGNvbnN0IHJlZGlzID0gZ2V0UmVkaXNDbGllbnQoKTtcbiAgY29uc3Qga2V5ID0gS0VZUy5FTUFJTF9MSVNUKHVzZXJJZCwgYWNjb3VudElkLCBmb2xkZXIsIHBhZ2UsIHBlclBhZ2UpO1xuICBcbiAgY29uc3QgY2FjaGVkRGF0YSA9IGF3YWl0IHJlZGlzLmdldChrZXkpO1xuICBpZiAoIWNhY2hlZERhdGEpIHJldHVybiBudWxsO1xuICBcbiAgcmV0dXJuIEpTT04ucGFyc2UoY2FjaGVkRGF0YSk7XG59XG5cbi8qKlxuICogQ2FjaGUgZW1haWwgY29udGVudCBpbiBSZWRpc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FjaGVFbWFpbENvbnRlbnQoXG4gIHVzZXJJZDogc3RyaW5nLFxuICBhY2NvdW50SWQ6IHN0cmluZyxcbiAgZW1haWxJZDogc3RyaW5nLFxuICBkYXRhOiBhbnlcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWRpcyA9IGdldFJlZGlzQ2xpZW50KCk7XG4gIGNvbnN0IGtleSA9IEtFWVMuRU1BSUxfQ09OVEVOVCh1c2VySWQsIGFjY291bnRJZCwgZW1haWxJZCk7XG4gIFxuICBhd2FpdCByZWRpcy5zZXQoa2V5LCBKU09OLnN0cmluZ2lmeShkYXRhKSwgJ0VYJywgVFRMLkVNQUlMX0NPTlRFTlQpO1xufVxuXG4vKipcbiAqIEdldCBjYWNoZWQgZW1haWwgY29udGVudCBmcm9tIFJlZGlzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDYWNoZWRFbWFpbENvbnRlbnQoXG4gIHVzZXJJZDogc3RyaW5nLFxuICBhY2NvdW50SWQ6IHN0cmluZyxcbiAgZW1haWxJZDogc3RyaW5nXG4pOiBQcm9taXNlPGFueSB8IG51bGw+IHtcbiAgY29uc3QgcmVkaXMgPSBnZXRSZWRpc0NsaWVudCgpO1xuICBjb25zdCBrZXkgPSBLRVlTLkVNQUlMX0NPTlRFTlQodXNlcklkLCBhY2NvdW50SWQsIGVtYWlsSWQpO1xuICBcbiAgY29uc3QgY2FjaGVkRGF0YSA9IGF3YWl0IHJlZGlzLmdldChrZXkpO1xuICBpZiAoIWNhY2hlZERhdGEpIHJldHVybiBudWxsO1xuICBcbiAgcmV0dXJuIEpTT04ucGFyc2UoY2FjaGVkRGF0YSk7XG59XG5cbi8qKlxuICogSW52YWxpZGF0ZSBhbGwgZW1haWwgY2FjaGVzIGZvciBhIGZvbGRlclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW52YWxpZGF0ZUZvbGRlckNhY2hlKFxuICB1c2VySWQ6IHN0cmluZyxcbiAgYWNjb3VudElkOiBzdHJpbmcsXG4gIGZvbGRlcjogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVkaXMgPSBnZXRSZWRpc0NsaWVudCgpO1xuICBjb25zdCBwYXR0ZXJuID0gYGVtYWlsOmxpc3Q6JHt1c2VySWR9OiR7YWNjb3VudElkfToke2ZvbGRlcn06KmA7XG4gIFxuICAvLyBVc2UgU0NBTiB0byBmaW5kIGFuZCBkZWxldGUga2V5cyBtYXRjaGluZyB0aGUgcGF0dGVyblxuICBsZXQgY3Vyc29yID0gJzAnO1xuICBkbyB7XG4gICAgY29uc3QgW25leHRDdXJzb3IsIGtleXNdID0gYXdhaXQgcmVkaXMuc2NhbihjdXJzb3IsICdNQVRDSCcsIHBhdHRlcm4sICdDT1VOVCcsIDEwMCk7XG4gICAgY3Vyc29yID0gbmV4dEN1cnNvcjtcbiAgICBcbiAgICBpZiAoa2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCByZWRpcy5kZWwoLi4ua2V5cyk7XG4gICAgfVxuICB9IHdoaWxlIChjdXJzb3IgIT09ICcwJyk7XG59XG5cbi8qKlxuICogSW52YWxpZGF0ZSBlbWFpbCBjb250ZW50IGNhY2hlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnZhbGlkYXRlRW1haWxDb250ZW50Q2FjaGUoXG4gIHVzZXJJZDogc3RyaW5nLFxuICBhY2NvdW50SWQ6IHN0cmluZyxcbiAgZW1haWxJZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVkaXMgPSBnZXRSZWRpc0NsaWVudCgpO1xuICBjb25zdCBrZXkgPSBLRVlTLkVNQUlMX0NPTlRFTlQodXNlcklkLCBhY2NvdW50SWQsIGVtYWlsSWQpO1xuICBcbiAgYXdhaXQgcmVkaXMuZGVsKGtleSk7XG59XG5cbi8qKlxuICogV2FybSB1cCBSZWRpcyBjb25uZWN0aW9uIHRvIGF2b2lkIGNvbGQgc3RhcnRzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YXJtdXBSZWRpc0NhY2hlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIC8vIFBpbmcgUmVkaXMgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24gZWFybHlcbiAgICBjb25zdCByZWRpcyA9IGdldFJlZGlzQ2xpZW50KCk7XG4gICAgYXdhaXQgcmVkaXMucGluZygpO1xuICAgIGNvbnNvbGUubG9nKCdSZWRpcyBjb25uZWN0aW9uIHdhcm1lZCB1cCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdhcm1pbmcgdXAgUmVkaXM6JywgZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCBSZWRpcyBjb25uZWN0aW9uIHN0YXR1c1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVkaXNTdGF0dXMoKTogUHJvbWlzZTx7XG4gIHN0YXR1czogJ2Nvbm5lY3RlZCcgfCAnZXJyb3InO1xuICBwaW5nPzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbn0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZWRpcyA9IGdldFJlZGlzQ2xpZW50KCk7XG4gICAgY29uc3QgcG9uZyA9IGF3YWl0IHJlZGlzLnBpbmcoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiAnY29ubmVjdGVkJyxcbiAgICAgIHBpbmc6IHBvbmdcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEludmFsaWRhdGUgYWxsIHVzZXIgZW1haWwgY2FjaGVzIChlbWFpbCBsaXN0cyBhbmQgY29udGVudClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGludmFsaWRhdGVVc2VyRW1haWxDYWNoZShcbiAgdXNlcklkOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWRpcyA9IGdldFJlZGlzQ2xpZW50KCk7XG4gIFxuICAvLyBQYXR0ZXJucyB0byBkZWxldGVcbiAgY29uc3QgcGF0dGVybnMgPSBbXG4gICAgYGVtYWlsOmxpc3Q6JHt1c2VySWR9OipgLFxuICAgIGBlbWFpbDpjb250ZW50OiR7dXNlcklkfToqYFxuICBdO1xuICBcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgbGV0IGN1cnNvciA9ICcwJztcbiAgICBkbyB7XG4gICAgICBjb25zdCBbbmV4dEN1cnNvciwga2V5c10gPSBhd2FpdCByZWRpcy5zY2FuKGN1cnNvciwgJ01BVENIJywgcGF0dGVybiwgJ0NPVU5UJywgMTAwKTtcbiAgICAgIGN1cnNvciA9IG5leHRDdXJzb3I7XG4gICAgICBcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgcmVkaXMuZGVsKC4uLmtleXMpO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKGN1cnNvciAhPT0gJzAnKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCBjYWNoZWQgZW1haWwgY3JlZGVudGlhbHMgZnJvbSBSZWRpc1xuICogQGRlcHJlY2F0ZWQgVXNlIGdldEVtYWlsQ3JlZGVudGlhbHMgaW5zdGVhZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVkRW1haWxDcmVkZW50aWFscyhcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGFjY291bnRJZDogc3RyaW5nXG4pOiBQcm9taXNlPEVtYWlsQ3JlZGVudGlhbHMgfCBudWxsPiB7XG4gIHJldHVybiBnZXRFbWFpbENyZWRlbnRpYWxzKHVzZXJJZCwgYWNjb3VudElkKTtcbn0gIl0sIm5hbWVzIjpbIlJlZGlzIiwiQ3J5cHRvSlMiLCJyZWRpc0NsaWVudCIsImlzQ29ubmVjdGluZyIsImNvbm5lY3Rpb25BdHRlbXB0cyIsIk1BWF9SRUNPTk5FQ1RfQVRURU1QVFMiLCJnZXRSZWRpc0NsaWVudCIsInN0YXR1cyIsImNvbnNvbGUiLCJ3YXJuIiwicmVkaXNPcHRpb25zIiwiaG9zdCIsInByb2Nlc3MiLCJlbnYiLCJSRURJU19IT1NUIiwicG9ydCIsIlJFRElTX1BPUlQiLCJwYXJzZUludCIsInVuZGVmaW5lZCIsInBhc3N3b3JkIiwiUkVESVNfUEFTU1dPUkQiLCJyZXRyeVN0cmF0ZWd5IiwidGltZXMiLCJlcnJvciIsImRlbGF5IiwiTWF0aCIsIm1pbiIsImxvZyIsIm1heFJldHJpZXNQZXJSZXF1ZXN0IiwiZW5hYmxlT2ZmbGluZVF1ZXVlIiwiY29ubmVjdFRpbWVvdXQiLCJkaXNjb25uZWN0VGltZW91dCIsImtlZXBBbGl2ZSIsImtleVByZWZpeCIsIm9uIiwiZXJyIiwiY2xvc2VSZWRpc0Nvbm5lY3Rpb24iLCJxdWl0IiwiZ2V0RW5jcnlwdGlvbktleSIsIlJFRElTX0VOQ1JZUFRJT05fS0VZIiwiZW5jcnlwdERhdGEiLCJkYXRhIiwiQUVTIiwiZW5jcnlwdCIsInRvU3RyaW5nIiwiZGVjcnlwdERhdGEiLCJlbmNyeXB0ZWREYXRhIiwiYnl0ZXMiLCJkZWNyeXB0IiwiZW5jIiwiVXRmOCIsIktFWVMiLCJDUkVERU5USUFMUyIsInVzZXJJZCIsImFjY291bnRJZCIsIlNFU1NJT04iLCJFTUFJTF9MSVNUIiwiZm9sZGVyIiwicGFnZSIsInBlclBhZ2UiLCJFTUFJTF9DT05URU5UIiwiZW1haWxJZCIsIlRUTCIsImNhY2hlRW1haWxDcmVkZW50aWFscyIsImNyZWRlbnRpYWxzIiwicmVkaXMiLCJrZXkiLCJlbWFpbCIsInVzZU9BdXRoIiwic2VjdXJlQ3JlZGVudGlhbHMiLCJzZWN1cmUiLCJzbXRwX2hvc3QiLCJzbXRwX3BvcnQiLCJzbXRwX3NlY3VyZSIsImRpc3BsYXlfbmFtZSIsImNvbG9yIiwiYWNjZXNzVG9rZW4iLCJyZWZyZXNoVG9rZW4iLCJ0b2tlbkV4cGlyeSIsImVuY3J5cHRlZCIsImVuY3J5cHRlZFBhc3N3b3JkIiwiZW5jcnlwdEVycm9yIiwic2V0IiwiSlNPTiIsInN0cmluZ2lmeSIsImdldEVtYWlsQ3JlZGVudGlhbHMiLCJjcmVkU3RyIiwiZ2V0IiwiY3JlZHMiLCJwYXJzZSIsImRlY3J5cHRFcnJvciIsInJlc3VsdCIsImNhY2hlSW1hcFNlc3Npb24iLCJzZXNzaW9uRGF0YSIsImxhc3RBY3RpdmUiLCJEYXRlIiwibm93IiwiZ2V0Q2FjaGVkSW1hcFNlc3Npb24iLCJjYWNoZWREYXRhIiwiY2FjaGVFbWFpbExpc3QiLCJnZXRDYWNoZWRFbWFpbExpc3QiLCJjYWNoZUVtYWlsQ29udGVudCIsImdldENhY2hlZEVtYWlsQ29udGVudCIsImludmFsaWRhdGVGb2xkZXJDYWNoZSIsInBhdHRlcm4iLCJjdXJzb3IiLCJuZXh0Q3Vyc29yIiwia2V5cyIsInNjYW4iLCJsZW5ndGgiLCJkZWwiLCJpbnZhbGlkYXRlRW1haWxDb250ZW50Q2FjaGUiLCJ3YXJtdXBSZWRpc0NhY2hlIiwicGluZyIsImdldFJlZGlzU3RhdHVzIiwicG9uZyIsIkVycm9yIiwibWVzc2FnZSIsIlN0cmluZyIsImludmFsaWRhdGVVc2VyRW1haWxDYWNoZSIsInBhdHRlcm5zIiwiZ2V0Q2FjaGVkRW1haWxDcmVkZW50aWFscyJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./lib/redis.ts\n");
/***/ }),
/***/ "(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fredis%2Fstatus%2Froute&page=%2Fapi%2Fredis%2Fstatus%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fredis%2Fstatus%2Froute.ts&appDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!":
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fredis%2Fstatus%2Froute&page=%2Fapi%2Fredis%2Fstatus%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fredis%2Fstatus%2Froute.ts&appDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D! ***!
\****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ patchFetch: () => (/* binding */ patchFetch),\n/* harmony export */ routeModule: () => (/* binding */ routeModule),\n/* harmony export */ serverHooks: () => (/* binding */ serverHooks),\n/* harmony export */ workAsyncStorage: () => (/* binding */ workAsyncStorage),\n/* harmony export */ workUnitAsyncStorage: () => (/* binding */ workUnitAsyncStorage)\n/* harmony export */ });\n/* harmony import */ var next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next/dist/server/route-modules/app-route/module.compiled */ \"(rsc)/./node_modules/next/dist/server/route-modules/app-route/module.compiled.js\");\n/* harmony import */ var next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var next_dist_server_route_kind__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/dist/server/route-kind */ \"(rsc)/./node_modules/next/dist/server/route-kind.js\");\n/* harmony import */ var next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/dist/server/lib/patch-fetch */ \"(rsc)/./node_modules/next/dist/server/lib/patch-fetch.js\");\n/* harmony import */ var next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _home_alma_nextgen_Neah_mail_app_api_redis_status_route_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./app/api/redis/status/route.ts */ \"(rsc)/./app/api/redis/status/route.ts\");\n\n\n\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__.AppRouteRouteModule({\n definition: {\n kind: next_dist_server_route_kind__WEBPACK_IMPORTED_MODULE_1__.RouteKind.APP_ROUTE,\n page: \"/api/redis/status/route\",\n pathname: \"/api/redis/status\",\n filename: \"route\",\n bundlePath: \"app/api/redis/status/route\"\n },\n resolvedPagePath: \"/home/alma/nextgen/Neah-mail/app/api/redis/status/route.ts\",\n nextConfigOutput,\n userland: _home_alma_nextgen_Neah_mail_app_api_redis_status_route_ts__WEBPACK_IMPORTED_MODULE_3__\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return (0,next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__.patchFetch)({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\n\n\n//# sourceMappingURL=app-route.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2J1aWxkL3dlYnBhY2svbG9hZGVycy9uZXh0LWFwcC1sb2FkZXIvaW5kZXguanM/bmFtZT1hcHAlMkZhcGklMkZyZWRpcyUyRnN0YXR1cyUyRnJvdXRlJnBhZ2U9JTJGYXBpJTJGcmVkaXMlMkZzdGF0dXMlMkZyb3V0ZSZhcHBQYXRocz0mcGFnZVBhdGg9cHJpdmF0ZS1uZXh0LWFwcC1kaXIlMkZhcGklMkZyZWRpcyUyRnN0YXR1cyUyRnJvdXRlLnRzJmFwcERpcj0lMkZob21lJTJGYWxtYSUyRm5leHRnZW4lMkZOZWFoLW1haWwlMkZhcHAmcGFnZUV4dGVuc2lvbnM9dHN4JnBhZ2VFeHRlbnNpb25zPXRzJnBhZ2VFeHRlbnNpb25zPWpzeCZwYWdlRXh0ZW5zaW9ucz1qcyZyb290RGlyPSUyRmhvbWUlMkZhbG1hJTJGbmV4dGdlbiUyRk5lYWgtbWFpbCZpc0Rldj10cnVlJnRzY29uZmlnUGF0aD10c2NvbmZpZy5qc29uJmJhc2VQYXRoPSZhc3NldFByZWZpeD0mbmV4dENvbmZpZ091dHB1dD0mcHJlZmVycmVkUmVnaW9uPSZtaWRkbGV3YXJlQ29uZmlnPWUzMCUzRCEiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBK0Y7QUFDdkM7QUFDcUI7QUFDVTtBQUN2RjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IseUdBQW1CO0FBQzNDO0FBQ0EsY0FBYyxrRUFBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsWUFBWTtBQUNaLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxRQUFRLHNEQUFzRDtBQUM5RDtBQUNBLFdBQVcsNEVBQVc7QUFDdEI7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUMwRjs7QUFFMUYiLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBSb3V0ZVJvdXRlTW9kdWxlIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvcm91dGUtbW9kdWxlcy9hcHAtcm91dGUvbW9kdWxlLmNvbXBpbGVkXCI7XG5pbXBvcnQgeyBSb3V0ZUtpbmQgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9yb3V0ZS1raW5kXCI7XG5pbXBvcnQgeyBwYXRjaEZldGNoIGFzIF9wYXRjaEZldGNoIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL3BhdGNoLWZldGNoXCI7XG5pbXBvcnQgKiBhcyB1c2VybGFuZCBmcm9tIFwiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9hcHAvYXBpL3JlZGlzL3N0YXR1cy9yb3V0ZS50c1wiO1xuLy8gV2UgaW5qZWN0IHRoZSBuZXh0Q29uZmlnT3V0cHV0IGhlcmUgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0gaW4gdGhlIHJvdXRlXG4vLyBtb2R1bGUuXG5jb25zdCBuZXh0Q29uZmlnT3V0cHV0ID0gXCJcIlxuY29uc3Qgcm91dGVNb2R1bGUgPSBuZXcgQXBwUm91dGVSb3V0ZU1vZHVsZSh7XG4gICAgZGVmaW5pdGlvbjoge1xuICAgICAgICBraW5kOiBSb3V0ZUtpbmQuQVBQX1JPVVRFLFxuICAgICAgICBwYWdlOiBcIi9hcGkvcmVkaXMvc3RhdHVzL3JvdXRlXCIsXG4gICAgICAgIHBhdGhuYW1lOiBcIi9hcGkvcmVkaXMvc3RhdHVzXCIsXG4gICAgICAgIGZpbGVuYW1lOiBcInJvdXRlXCIsXG4gICAgICAgIGJ1bmRsZVBhdGg6IFwiYXBwL2FwaS9yZWRpcy9zdGF0dXMvcm91dGVcIlxuICAgIH0sXG4gICAgcmVzb2x2ZWRQYWdlUGF0aDogXCIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL2FwcC9hcGkvcmVkaXMvc3RhdHVzL3JvdXRlLnRzXCIsXG4gICAgbmV4dENvbmZpZ091dHB1dCxcbiAgICB1c2VybGFuZFxufSk7XG4vLyBQdWxsIG91dCB0aGUgZXhwb3J0cyB0aGF0IHdlIG5lZWQgdG8gZXhwb3NlIGZyb20gdGhlIG1vZHVsZS4gVGhpcyBzaG91bGRcbi8vIGJlIGVsaW1pbmF0ZWQgd2hlbiB3ZSd2ZSBtb3ZlZCB0aGUgb3RoZXIgcm91dGVzIHRvIHRoZSBuZXcgZm9ybWF0LiBUaGVzZVxuLy8gYXJlIHVzZWQgdG8gaG9vayBpbnRvIHRoZSByb3V0ZS5cbmNvbnN0IHsgd29ya0FzeW5jU3RvcmFnZSwgd29ya1VuaXRBc3luY1N0b3JhZ2UsIHNlcnZlckhvb2tzIH0gPSByb3V0ZU1vZHVsZTtcbmZ1bmN0aW9uIHBhdGNoRmV0Y2goKSB7XG4gICAgcmV0dXJuIF9wYXRjaEZldGNoKHtcbiAgICAgICAgd29ya0FzeW5jU3RvcmFnZSxcbiAgICAgICAgd29ya1VuaXRBc3luY1N0b3JhZ2VcbiAgICB9KTtcbn1cbmV4cG9ydCB7IHJvdXRlTW9kdWxlLCB3b3JrQXN5bmNTdG9yYWdlLCB3b3JrVW5pdEFzeW5jU3RvcmFnZSwgc2VydmVySG9va3MsIHBhdGNoRmV0Y2gsICB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcHAtcm91dGUuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fredis%2Fstatus%2Froute&page=%2Fapi%2Fredis%2Fstatus%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fredis%2Fstatus%2Froute.ts&appDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!\n");
/***/ }),
/***/ "(rsc)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true!":
/*!******************************************************************************************************!*\
!*** ./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true! ***!
\******************************************************************************************************/
/***/ (() => {
/***/ }),
/***/ "(ssr)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true!":
/*!******************************************************************************************************!*\
!*** ./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true! ***!
\******************************************************************************************************/
/***/ (() => {
/***/ }),
/***/ "../app-render/after-task-async-storage.external":
/*!***********************************************************************************!*\
!*** external "next/dist/server/app-render/after-task-async-storage.external.js" ***!
\***********************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/server/app-render/after-task-async-storage.external.js");
/***/ }),
/***/ "../app-render/work-async-storage.external":
/*!*****************************************************************************!*\
!*** external "next/dist/server/app-render/work-async-storage.external.js" ***!
\*****************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/server/app-render/work-async-storage.external.js");
/***/ }),
/***/ "./work-unit-async-storage.external":
/*!**********************************************************************************!*\
!*** external "next/dist/server/app-render/work-unit-async-storage.external.js" ***!
\**********************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/server/app-render/work-unit-async-storage.external.js");
/***/ }),
/***/ "?d272":
/*!********************************!*\
!*** supports-color (ignored) ***!
\********************************/
/***/ (() => {
/* (ignored) */
/***/ }),
/***/ "assert":
/*!*************************!*\
!*** external "assert" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = require("assert");
/***/ }),
/***/ "buffer":
/*!*************************!*\
!*** external "buffer" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = require("buffer");
/***/ }),
/***/ "crypto":
/*!*************************!*\
!*** external "crypto" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = require("crypto");
/***/ }),
/***/ "dns":
/*!**********************!*\
!*** external "dns" ***!
\**********************/
/***/ ((module) => {
"use strict";
module.exports = require("dns");
/***/ }),
/***/ "events":
/*!*************************!*\
!*** external "events" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = require("events");
/***/ }),
/***/ "net":
/*!**********************!*\
!*** external "net" ***!
\**********************/
/***/ ((module) => {
"use strict";
module.exports = require("net");
/***/ }),
/***/ "next/dist/compiled/next-server/app-page.runtime.dev.js":
/*!*************************************************************************!*\
!*** external "next/dist/compiled/next-server/app-page.runtime.dev.js" ***!
\*************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/compiled/next-server/app-page.runtime.dev.js");
/***/ }),
/***/ "next/dist/compiled/next-server/app-route.runtime.dev.js":
/*!**************************************************************************!*\
!*** external "next/dist/compiled/next-server/app-route.runtime.dev.js" ***!
\**************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/compiled/next-server/app-route.runtime.dev.js");
/***/ }),
/***/ "stream":
/*!*************************!*\
!*** external "stream" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = require("stream");
/***/ }),
/***/ "string_decoder":
/*!*********************************!*\
!*** external "string_decoder" ***!
\*********************************/
/***/ ((module) => {
"use strict";
module.exports = require("string_decoder");
/***/ }),
/***/ "tls":
/*!**********************!*\
!*** external "tls" ***!
\**********************/
/***/ ((module) => {
"use strict";
module.exports = require("tls");
/***/ }),
/***/ "tty":
/*!**********************!*\
!*** external "tty" ***!
\**********************/
/***/ ((module) => {
"use strict";
module.exports = require("tty");
/***/ }),
/***/ "url":
/*!**********************!*\
!*** external "url" ***!
\**********************/
/***/ ((module) => {
"use strict";
module.exports = require("url");
/***/ }),
/***/ "util":
/*!***********************!*\
!*** external "util" ***!
\***********************/
/***/ ((module) => {
"use strict";
module.exports = require("util");
/***/ })
};
;
// load runtime
var __webpack_require__ = require("../../../../webpack-runtime.js");
__webpack_require__.C(exports);
var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
var __webpack_exports__ = __webpack_require__.X(0, ["vendor-chunks/next","vendor-chunks/crypto-js","vendor-chunks/ioredis","vendor-chunks/@ioredis","vendor-chunks/debug","vendor-chunks/lodash.defaults","vendor-chunks/redis-parser","vendor-chunks/denque","vendor-chunks/cluster-key-slot","vendor-chunks/lodash.isarguments","vendor-chunks/redis-errors","vendor-chunks/ms","vendor-chunks/standard-as-callback"], () => (__webpack_exec__("(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fredis%2Fstatus%2Froute&page=%2Fapi%2Fredis%2Fstatus%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fredis%2Fstatus%2Froute.ts&appDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!")));
module.exports = __webpack_exports__;
})();