File: /home/cafsindia/snap.cafsinfotech.in/node_modules/@sentry/utils/cjs/requestdata.js.map
{"version":3,"file":"requestdata.js","sources":["../../src/requestdata.ts"],"sourcesContent":["// TODO: Remove this file once equivalent integration is used everywhere\n\n/* eslint-disable complexity */\n/**\n * The functions here, which enrich an event with request data, are mostly for use in Node, but are safe for use in a\n * browser context. They live here in `@sentry/utils` rather than in `@sentry/node` so that they can be used in\n * frameworks (like nextjs), which, because of SSR, run the same code in both Node and browser contexts.\n *\n * TODO (v8 / #5257): Remove the note below\n * Note that for now, the tests for this code have to live in `@sentry/node`, since they test both these functions and\n * the backwards-compatibility-preserving wrappers which still live in `handlers.ts` there.\n */\n\n/* eslint-disable max-lines */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n Event,\n ExtractedNodeRequestData,\n PolymorphicRequest,\n Transaction,\n TransactionSource,\n} from '@sentry/types';\n\nimport { isPlainObject, isString } from './is';\nimport { normalize } from './normalize';\nimport { stripUrlQueryAndFragment } from './url';\n\nconst DEFAULT_INCLUDES = {\n ip: false,\n request: true,\n transaction: true,\n user: true,\n};\nconst DEFAULT_REQUEST_INCLUDES = ['cookies', 'data', 'headers', 'method', 'query_string', 'url'];\nconst DEFAULT_USER_INCLUDES = ['id', 'username', 'email'];\n\ntype InjectedNodeDeps = {\n cookie: {\n parse: (cookieStr: string) => Record<string, string>;\n };\n url: {\n parse: (urlStr: string) => {\n query: string | null;\n };\n };\n};\n\n/**\n * Sets parameterized route as transaction name e.g.: `GET /users/:id`\n * Also adds more context data on the transaction from the request\n */\nexport function addRequestDataToTransaction(\n transaction: Transaction | undefined,\n req: PolymorphicRequest,\n deps?: InjectedNodeDeps,\n): void {\n if (!transaction) return;\n if (!transaction.metadata.source || transaction.metadata.source === 'url') {\n // Attempt to grab a parameterized route off of the request\n transaction.setName(...extractPathForTransaction(req, { path: true, method: true }));\n }\n transaction.setData('url', req.originalUrl || req.url);\n if (req.baseUrl) {\n transaction.setData('baseUrl', req.baseUrl);\n }\n transaction.setData('query', extractQueryParams(req, deps));\n}\n\n/**\n * Extracts a complete and parameterized path from the request object and uses it to construct transaction name.\n * If the parameterized transaction name cannot be extracted, we fall back to the raw URL.\n *\n * Additionally, this function determines and returns the transaction name source\n *\n * eg. GET /mountpoint/user/:id\n *\n * @param req A request object\n * @param options What to include in the transaction name (method, path, or a custom route name to be\n * used instead of the request's route)\n *\n * @returns A tuple of the fully constructed transaction name [0] and its source [1] (can be either 'route' or 'url')\n */\nexport function extractPathForTransaction(\n req: PolymorphicRequest,\n options: { path?: boolean; method?: boolean; customRoute?: string } = {},\n): [string, TransactionSource] {\n const method = req.method && req.method.toUpperCase();\n\n let path = '';\n let source: TransactionSource = 'url';\n\n // Check to see if there's a parameterized route we can use (as there is in Express)\n if (options.customRoute || req.route) {\n path = options.customRoute || `${req.baseUrl || ''}${req.route && req.route.path}`;\n source = 'route';\n }\n\n // Otherwise, just take the original URL\n else if (req.originalUrl || req.url) {\n path = stripUrlQueryAndFragment(req.originalUrl || req.url || '');\n }\n\n let name = '';\n if (options.method && method) {\n name += method;\n }\n if (options.method && options.path) {\n name += ' ';\n }\n if (options.path && path) {\n name += path;\n }\n\n return [name, source];\n}\n\ntype TransactionNamingScheme = 'path' | 'methodPath' | 'handler';\n\n/** JSDoc */\nfunction extractTransaction(req: PolymorphicRequest, type: boolean | TransactionNamingScheme): string {\n switch (type) {\n case 'path': {\n return extractPathForTransaction(req, { path: true })[0];\n }\n case 'handler': {\n return (req.route && req.route.stack && req.route.stack[0] && req.route.stack[0].name) || '<anonymous>';\n }\n case 'methodPath':\n default: {\n return extractPathForTransaction(req, { path: true, method: true })[0];\n }\n }\n}\n\n/** JSDoc */\nfunction extractUserData(\n user: {\n [key: string]: any;\n },\n keys: boolean | string[],\n): { [key: string]: any } {\n const extractedUser: { [key: string]: any } = {};\n const attributes = Array.isArray(keys) ? keys : DEFAULT_USER_INCLUDES;\n\n attributes.forEach(key => {\n if (user && key in user) {\n extractedUser[key] = user[key];\n }\n });\n\n return extractedUser;\n}\n\n/**\n * Normalize data from the request object, accounting for framework differences.\n *\n * @param req The request object from which to extract data\n * @param options.include An optional array of keys to include in the normalized data. Defaults to\n * DEFAULT_REQUEST_INCLUDES if not provided.\n * @param options.deps Injected, platform-specific dependencies\n * @returns An object containing normalized request data\n */\nexport function extractRequestData(\n req: PolymorphicRequest,\n options?: {\n include?: string[];\n deps?: InjectedNodeDeps;\n },\n): ExtractedNodeRequestData {\n const { include = DEFAULT_REQUEST_INCLUDES, deps } = options || {};\n const requestData: { [key: string]: any } = {};\n\n // headers:\n // node, express, koa, nextjs: req.headers\n const headers = (req.headers || {}) as {\n host?: string;\n cookie?: string;\n };\n // method:\n // node, express, koa, nextjs: req.method\n const method = req.method;\n // host:\n // express: req.hostname in > 4 and req.host in < 4\n // koa: req.host\n // node, nextjs: req.headers.host\n const host = req.hostname || req.host || headers.host || '<no host>';\n // protocol:\n // node, nextjs: <n/a>\n // express, koa: req.protocol\n const protocol = req.protocol === 'https' || (req.socket && req.socket.encrypted) ? 'https' : 'http';\n // url (including path and query string):\n // node, express: req.originalUrl\n // koa, nextjs: req.url\n const originalUrl = req.originalUrl || req.url || '';\n // absolute url\n const absoluteUrl = `${protocol}://${host}${originalUrl}`;\n include.forEach(key => {\n switch (key) {\n case 'headers': {\n requestData.headers = headers;\n break;\n }\n case 'method': {\n requestData.method = method;\n break;\n }\n case 'url': {\n requestData.url = absoluteUrl;\n break;\n }\n case 'cookies': {\n // cookies:\n // node, express, koa: req.headers.cookie\n // vercel, sails.js, express (w/ cookie middleware), nextjs: req.cookies\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n requestData.cookies =\n // TODO (v8 / #5257): We're only sending the empty object for backwards compatibility, so the last bit can\n // come off in v8\n req.cookies || (headers.cookie && deps && deps.cookie && deps.cookie.parse(headers.cookie)) || {};\n break;\n }\n case 'query_string': {\n // query string:\n // node: req.url (raw)\n // express, koa, nextjs: req.query\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n requestData.query_string = extractQueryParams(req, deps);\n break;\n }\n case 'data': {\n if (method === 'GET' || method === 'HEAD') {\n break;\n }\n // body data:\n // express, koa, nextjs: req.body\n //\n // when using node by itself, you have to read the incoming stream(see\n // https://nodejs.dev/learn/get-http-request-body-data-using-nodejs); if a user is doing that, we can't know\n // where they're going to store the final result, so they'll have to capture this data themselves\n if (req.body !== undefined) {\n requestData.data = isString(req.body) ? req.body : JSON.stringify(normalize(req.body));\n }\n break;\n }\n default: {\n if ({}.hasOwnProperty.call(req, key)) {\n requestData[key] = (req as { [key: string]: any })[key];\n }\n }\n }\n });\n\n return requestData;\n}\n\n/**\n * Options deciding what parts of the request to use when enhancing an event\n */\nexport interface AddRequestDataToEventOptions {\n /** Flags controlling whether each type of data should be added to the event */\n include?: {\n ip?: boolean;\n request?: boolean | string[];\n transaction?: boolean | TransactionNamingScheme;\n user?: boolean | string[];\n };\n\n /** Injected platform-specific dependencies */\n deps?: {\n cookie: {\n parse: (cookieStr: string) => Record<string, string>;\n };\n url: {\n parse: (urlStr: string) => {\n query: string | null;\n };\n };\n };\n}\n\n/**\n * Add data from the given request to the given event\n *\n * @param event The event to which the request data will be added\n * @param req Request object\n * @param options.include Flags to control what data is included\n * @param options.deps Injected platform-specific dependencies\n * @hidden\n */\nexport function addRequestDataToEvent(\n event: Event,\n req: PolymorphicRequest,\n options?: AddRequestDataToEventOptions,\n): Event {\n const include = {\n ...DEFAULT_INCLUDES,\n ...(options && options.include),\n };\n\n if (include.request) {\n const extractedRequestData = Array.isArray(include.request)\n ? extractRequestData(req, { include: include.request, deps: options && options.deps })\n : extractRequestData(req, { deps: options && options.deps });\n\n event.request = {\n ...event.request,\n ...extractedRequestData,\n };\n }\n\n if (include.user) {\n const extractedUser = req.user && isPlainObject(req.user) ? extractUserData(req.user, include.user) : {};\n\n if (Object.keys(extractedUser).length) {\n event.user = {\n ...event.user,\n ...extractedUser,\n };\n }\n }\n\n // client ip:\n // node, nextjs: req.socket.remoteAddress\n // express, koa: req.ip\n if (include.ip) {\n const ip = req.ip || (req.socket && req.socket.remoteAddress);\n if (ip) {\n event.user = {\n ...event.user,\n ip_address: ip,\n };\n }\n }\n\n if (include.transaction && !event.transaction) {\n // TODO do we even need this anymore?\n // TODO make this work for nextjs\n event.transaction = extractTransaction(req, include.transaction);\n }\n\n return event;\n}\n\nfunction extractQueryParams(\n req: PolymorphicRequest,\n deps?: InjectedNodeDeps,\n): string | Record<string, unknown> | undefined {\n // url (including path and query string):\n // node, express: req.originalUrl\n // koa, nextjs: req.url\n let originalUrl = req.originalUrl || req.url || '';\n\n if (!originalUrl) {\n return;\n }\n\n // The `URL` constructor can't handle internal URLs of the form `/some/path/here`, so stick a dummy protocol and\n // hostname on the beginning. Since the point here is just to grab the query string, it doesn't matter what we use.\n if (originalUrl.startsWith('/')) {\n originalUrl = `http://dogs.are.great${originalUrl}`;\n }\n\n return (\n req.query ||\n (typeof URL !== undefined && new URL(originalUrl).search.replace('?', '')) ||\n // In Node 8, `URL` isn't in the global scope, so we have to use the built-in module from Node\n (deps && deps.url && deps.url.parse(originalUrl).query) ||\n undefined\n );\n}\n"],"names":["stripUrlQueryAndFragment","isString","normalize","isPlainObject"],"mappings":";;;;;;AA4BA,MAAA,gBAAA,GAAA;AACA,EAAA,EAAA,EAAA,KAAA;AACA,EAAA,OAAA,EAAA,IAAA;AACA,EAAA,WAAA,EAAA,IAAA;AACA,EAAA,IAAA,EAAA,IAAA;AACA,CAAA,CAAA;AACA,MAAA,wBAAA,GAAA,CAAA,SAAA,EAAA,MAAA,EAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,KAAA,CAAA,CAAA;AACA,MAAA,qBAAA,GAAA,CAAA,IAAA,EAAA,UAAA,EAAA,OAAA,CAAA,CAAA;;AAaA;AACA;AACA;AACA;AACA,SAAA,2BAAA;AACA,EAAA,WAAA;AACA,EAAA,GAAA;AACA,EAAA,IAAA;AACA,EAAA;AACA,EAAA,IAAA,CAAA,WAAA,EAAA,OAAA;AACA,EAAA,IAAA,CAAA,WAAA,CAAA,QAAA,CAAA,MAAA,IAAA,WAAA,CAAA,QAAA,CAAA,MAAA,KAAA,KAAA,EAAA;AACA;AACA,IAAA,WAAA,CAAA,OAAA,CAAA,GAAA,yBAAA,CAAA,GAAA,EAAA,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,CAAA,CAAA;AACA,GAAA;AACA,EAAA,WAAA,CAAA,OAAA,CAAA,KAAA,EAAA,GAAA,CAAA,WAAA,IAAA,GAAA,CAAA,GAAA,CAAA,CAAA;AACA,EAAA,IAAA,GAAA,CAAA,OAAA,EAAA;AACA,IAAA,WAAA,CAAA,OAAA,CAAA,SAAA,EAAA,GAAA,CAAA,OAAA,CAAA,CAAA;AACA,GAAA;AACA,EAAA,WAAA,CAAA,OAAA,CAAA,OAAA,EAAA,kBAAA,CAAA,GAAA,EAAA,IAAA,CAAA,CAAA,CAAA;AACA,CAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,yBAAA;AACA,EAAA,GAAA;AACA,EAAA,OAAA,GAAA,EAAA;AACA,EAAA;AACA,EAAA,MAAA,MAAA,GAAA,GAAA,CAAA,MAAA,IAAA,GAAA,CAAA,MAAA,CAAA,WAAA,EAAA,CAAA;AACA;AACA,EAAA,IAAA,IAAA,GAAA,EAAA,CAAA;AACA,EAAA,IAAA,MAAA,GAAA,KAAA,CAAA;AACA;AACA;AACA,EAAA,IAAA,OAAA,CAAA,WAAA,IAAA,GAAA,CAAA,KAAA,EAAA;AACA,IAAA,IAAA,GAAA,OAAA,CAAA,WAAA,IAAA,CAAA,EAAA,GAAA,CAAA,OAAA,IAAA,EAAA,CAAA,EAAA,GAAA,CAAA,KAAA,IAAA,GAAA,CAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA;AACA,IAAA,MAAA,GAAA,OAAA,CAAA;AACA,GAAA;AACA;AACA;AACA,OAAA,IAAA,GAAA,CAAA,WAAA,IAAA,GAAA,CAAA,GAAA,EAAA;AACA,IAAA,IAAA,GAAAA,4BAAA,CAAA,GAAA,CAAA,WAAA,IAAA,GAAA,CAAA,GAAA,IAAA,EAAA,CAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,IAAA,IAAA,GAAA,EAAA,CAAA;AACA,EAAA,IAAA,OAAA,CAAA,MAAA,IAAA,MAAA,EAAA;AACA,IAAA,IAAA,IAAA,MAAA,CAAA;AACA,GAAA;AACA,EAAA,IAAA,OAAA,CAAA,MAAA,IAAA,OAAA,CAAA,IAAA,EAAA;AACA,IAAA,IAAA,IAAA,GAAA,CAAA;AACA,GAAA;AACA,EAAA,IAAA,OAAA,CAAA,IAAA,IAAA,IAAA,EAAA;AACA,IAAA,IAAA,IAAA,IAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,OAAA,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AACA,CAAA;;AAIA;AACA,SAAA,kBAAA,CAAA,GAAA,EAAA,IAAA,EAAA;AACA,EAAA,QAAA,IAAA;AACA,IAAA,KAAA,MAAA,EAAA;AACA,MAAA,OAAA,yBAAA,CAAA,GAAA,EAAA,EAAA,IAAA,EAAA,IAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,KAAA;AACA,IAAA,KAAA,SAAA,EAAA;AACA,MAAA,OAAA,CAAA,GAAA,CAAA,KAAA,IAAA,GAAA,CAAA,KAAA,CAAA,KAAA,IAAA,GAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA,CAAA,IAAA,GAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,IAAA,KAAA,aAAA,CAAA;AACA,KAAA;AACA,IAAA,KAAA,YAAA,CAAA;AACA,IAAA,SAAA;AACA,MAAA,OAAA,yBAAA,CAAA,GAAA,EAAA,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA,CAAA;AACA;AACA;AACA,SAAA,eAAA;AACA,EAAA,IAAA;AACA;AACA;AACA,EAAA,IAAA;AACA,EAAA;AACA,EAAA,MAAA,aAAA,GAAA,EAAA,CAAA;AACA,EAAA,MAAA,UAAA,GAAA,KAAA,CAAA,OAAA,CAAA,IAAA,CAAA,GAAA,IAAA,GAAA,qBAAA,CAAA;AACA;AACA,EAAA,UAAA,CAAA,OAAA,CAAA,GAAA,IAAA;AACA,IAAA,IAAA,IAAA,IAAA,GAAA,IAAA,IAAA,EAAA;AACA,MAAA,aAAA,CAAA,GAAA,CAAA,GAAA,IAAA,CAAA,GAAA,CAAA,CAAA;AACA,KAAA;AACA,GAAA,CAAA,CAAA;AACA;AACA,EAAA,OAAA,aAAA,CAAA;AACA,CAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,kBAAA;AACA,EAAA,GAAA;AACA,EAAA,OAAA;;AAGA;AACA,EAAA;AACA,EAAA,MAAA,EAAA,OAAA,GAAA,wBAAA,EAAA,IAAA,EAAA,GAAA,OAAA,IAAA,EAAA,CAAA;AACA,EAAA,MAAA,WAAA,GAAA,EAAA,CAAA;AACA;AACA;AACA;AACA,EAAA,MAAA,OAAA,IAAA,GAAA,CAAA,OAAA,IAAA,EAAA,CAAA;;AAGA,CAAA;AACA;AACA;AACA,EAAA,MAAA,MAAA,GAAA,GAAA,CAAA,MAAA,CAAA;AACA;AACA;AACA;AACA;AACA,EAAA,MAAA,IAAA,GAAA,GAAA,CAAA,QAAA,IAAA,GAAA,CAAA,IAAA,IAAA,OAAA,CAAA,IAAA,IAAA,WAAA,CAAA;AACA;AACA;AACA;AACA,EAAA,MAAA,QAAA,GAAA,GAAA,CAAA,QAAA,KAAA,OAAA,KAAA,GAAA,CAAA,MAAA,IAAA,GAAA,CAAA,MAAA,CAAA,SAAA,CAAA,GAAA,OAAA,GAAA,MAAA,CAAA;AACA;AACA;AACA;AACA,EAAA,MAAA,WAAA,GAAA,GAAA,CAAA,WAAA,IAAA,GAAA,CAAA,GAAA,IAAA,EAAA,CAAA;AACA;AACA,EAAA,MAAA,WAAA,GAAA,CAAA,EAAA,QAAA,CAAA,GAAA,EAAA,IAAA,CAAA,EAAA,WAAA,CAAA,CAAA,CAAA;AACA,EAAA,OAAA,CAAA,OAAA,CAAA,GAAA,IAAA;AACA,IAAA,QAAA,GAAA;AACA,MAAA,KAAA,SAAA,EAAA;AACA,QAAA,WAAA,CAAA,OAAA,GAAA,OAAA,CAAA;AACA,QAAA,MAAA;AACA,OAAA;AACA,MAAA,KAAA,QAAA,EAAA;AACA,QAAA,WAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AACA,QAAA,MAAA;AACA,OAAA;AACA,MAAA,KAAA,KAAA,EAAA;AACA,QAAA,WAAA,CAAA,GAAA,GAAA,WAAA,CAAA;AACA,QAAA,MAAA;AACA,OAAA;AACA,MAAA,KAAA,SAAA,EAAA;AACA;AACA;AACA;AACA;AACA,QAAA,WAAA,CAAA,OAAA;AACA;AACA;AACA,UAAA,GAAA,CAAA,OAAA,KAAA,OAAA,CAAA,MAAA,IAAA,IAAA,IAAA,IAAA,CAAA,MAAA,IAAA,IAAA,CAAA,MAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,CAAA,IAAA,EAAA,CAAA;AACA,QAAA,MAAA;AACA,OAAA;AACA,MAAA,KAAA,cAAA,EAAA;AACA;AACA;AACA;AACA;AACA,QAAA,WAAA,CAAA,YAAA,GAAA,kBAAA,CAAA,GAAA,EAAA,IAAA,CAAA,CAAA;AACA,QAAA,MAAA;AACA,OAAA;AACA,MAAA,KAAA,MAAA,EAAA;AACA,QAAA,IAAA,MAAA,KAAA,KAAA,IAAA,MAAA,KAAA,MAAA,EAAA;AACA,UAAA,MAAA;AACA,SAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAA,IAAA,GAAA,CAAA,IAAA,KAAA,SAAA,EAAA;AACA,UAAA,WAAA,CAAA,IAAA,GAAAC,WAAA,CAAA,GAAA,CAAA,IAAA,CAAA,GAAA,GAAA,CAAA,IAAA,GAAA,IAAA,CAAA,SAAA,CAAAC,mBAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,CAAA;AACA,SAAA;AACA,QAAA,MAAA;AACA,OAAA;AACA,MAAA,SAAA;AACA,QAAA,IAAA,EAAA,CAAA,cAAA,CAAA,IAAA,CAAA,GAAA,EAAA,GAAA,CAAA,EAAA;AACA,UAAA,WAAA,CAAA,GAAA,CAAA,GAAA,CAAA,GAAA,GAAA,GAAA,CAAA,CAAA;AACA,SAAA;AACA,OAAA;AACA,KAAA;AACA,GAAA,CAAA,CAAA;AACA;AACA,EAAA,OAAA,WAAA,CAAA;AACA,CAAA;AACA;AACA;AACA;AACA;;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,qBAAA;AACA,EAAA,KAAA;AACA,EAAA,GAAA;AACA,EAAA,OAAA;AACA,EAAA;AACA,EAAA,MAAA,OAAA,GAAA;AACA,IAAA,GAAA,gBAAA;AACA,IAAA,IAAA,OAAA,IAAA,OAAA,CAAA,OAAA,CAAA;AACA,GAAA,CAAA;AACA;AACA,EAAA,IAAA,OAAA,CAAA,OAAA,EAAA;AACA,IAAA,MAAA,oBAAA,GAAA,KAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA;AACA,QAAA,kBAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,OAAA,CAAA,OAAA,EAAA,IAAA,EAAA,OAAA,IAAA,OAAA,CAAA,IAAA,EAAA,CAAA;AACA,QAAA,kBAAA,CAAA,GAAA,EAAA,EAAA,IAAA,EAAA,OAAA,IAAA,OAAA,CAAA,IAAA,EAAA,CAAA,CAAA;AACA;AACA,IAAA,KAAA,CAAA,OAAA,GAAA;AACA,MAAA,GAAA,KAAA,CAAA,OAAA;AACA,MAAA,GAAA,oBAAA;AACA,KAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,IAAA,OAAA,CAAA,IAAA,EAAA;AACA,IAAA,MAAA,aAAA,GAAA,GAAA,CAAA,IAAA,IAAAC,gBAAA,CAAA,GAAA,CAAA,IAAA,CAAA,GAAA,eAAA,CAAA,GAAA,CAAA,IAAA,EAAA,OAAA,CAAA,IAAA,CAAA,GAAA,EAAA,CAAA;AACA;AACA,IAAA,IAAA,MAAA,CAAA,IAAA,CAAA,aAAA,CAAA,CAAA,MAAA,EAAA;AACA,MAAA,KAAA,CAAA,IAAA,GAAA;AACA,QAAA,GAAA,KAAA,CAAA,IAAA;AACA,QAAA,GAAA,aAAA;AACA,OAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA;AACA;AACA;AACA;AACA,EAAA,IAAA,OAAA,CAAA,EAAA,EAAA;AACA,IAAA,MAAA,EAAA,GAAA,GAAA,CAAA,EAAA,KAAA,GAAA,CAAA,MAAA,IAAA,GAAA,CAAA,MAAA,CAAA,aAAA,CAAA,CAAA;AACA,IAAA,IAAA,EAAA,EAAA;AACA,MAAA,KAAA,CAAA,IAAA,GAAA;AACA,QAAA,GAAA,KAAA,CAAA,IAAA;AACA,QAAA,UAAA,EAAA,EAAA;AACA,OAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA;AACA,EAAA,IAAA,OAAA,CAAA,WAAA,IAAA,CAAA,KAAA,CAAA,WAAA,EAAA;AACA;AACA;AACA,IAAA,KAAA,CAAA,WAAA,GAAA,kBAAA,CAAA,GAAA,EAAA,OAAA,CAAA,WAAA,CAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,OAAA,KAAA,CAAA;AACA,CAAA;AACA;AACA,SAAA,kBAAA;AACA,EAAA,GAAA;AACA,EAAA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA,IAAA,WAAA,GAAA,GAAA,CAAA,WAAA,IAAA,GAAA,CAAA,GAAA,IAAA,EAAA,CAAA;AACA;AACA,EAAA,IAAA,CAAA,WAAA,EAAA;AACA,IAAA,OAAA;AACA,GAAA;AACA;AACA;AACA;AACA,EAAA,IAAA,WAAA,CAAA,UAAA,CAAA,GAAA,CAAA,EAAA;AACA,IAAA,WAAA,GAAA,CAAA,qBAAA,EAAA,WAAA,CAAA,CAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA;AACA,IAAA,GAAA,CAAA,KAAA;AACA,KAAA,OAAA,GAAA,KAAA,SAAA,IAAA,IAAA,GAAA,CAAA,WAAA,CAAA,CAAA,MAAA,CAAA,OAAA,CAAA,GAAA,EAAA,EAAA,CAAA,CAAA;AACA;AACA,KAAA,IAAA,IAAA,IAAA,CAAA,GAAA,IAAA,IAAA,CAAA,GAAA,CAAA,KAAA,CAAA,WAAA,CAAA,CAAA,KAAA,CAAA;AACA,IAAA,SAAA;AACA,IAAA;AACA;;;;;;;"}