UNPKG

eslint-plugin-jsdoc

Version:
1 lines 36.2 kB
{"version":3,"file":"requireParam.cjs","names":["iterateJsdoc"],"sources":["../../src/rules/requireParam.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\n/**\n * @typedef {[string, boolean, () => RootNamerReturn]} RootNamerReturn\n */\n\n/**\n * @param {string[]} desiredRoots\n * @param {number} currentIndex\n * @returns {RootNamerReturn}\n */\nconst rootNamer = (desiredRoots, currentIndex) => {\n /** @type {string} */\n let name;\n let idx = currentIndex;\n const incremented = desiredRoots.length <= 1;\n if (incremented) {\n const base = desiredRoots[0];\n const suffix = idx++;\n name = `${base}${suffix}`;\n } else {\n name = /** @type {string} */ (desiredRoots.shift());\n }\n\n return [\n name,\n incremented,\n () => {\n return rootNamer(desiredRoots, idx);\n },\n ];\n};\n\n/* eslint-disable complexity -- Temporary */\nexport default iterateJsdoc(({\n context,\n jsdoc,\n node,\n utils,\n}) => {\n /* eslint-enable complexity -- Temporary */\n if (utils.avoidDocs()) {\n return;\n }\n\n // Param type is specified by type in @type\n if (utils.hasTag('type')) {\n return;\n }\n\n const {\n autoIncrementBase = 0,\n checkDestructured = true,\n checkDestructuredRoots = true,\n checkRestProperty = false,\n checkTypesPattern = '/^(?:[oO]bject|[aA]rray|PlainObject|Generic(?:Object|Array))$/',\n enableFixer = true,\n enableRestElementFixer = true,\n enableRootFixer = true,\n ignoreWhenAllParamsMissing = false,\n interfaceExemptsParamsCheck = false,\n unnamedRootBase = [\n 'root',\n ],\n useDefaultObjectProperties = false,\n } = context.options[0] || {};\n\n if (interfaceExemptsParamsCheck && node &&\n node.parent?.type === 'VariableDeclarator' &&\n 'typeAnnotation' in node.parent.id && node.parent.id.typeAnnotation) {\n return;\n }\n\n const preferredTagName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'param',\n }));\n if (!preferredTagName) {\n return;\n }\n\n const functionParameterNames = utils.getFunctionParameterNames(useDefaultObjectProperties, interfaceExemptsParamsCheck);\n if (!functionParameterNames.length) {\n return;\n }\n\n const jsdocParameterNames =\n /**\n * @type {{\n * idx: import('../iterateJsdoc.js').Integer;\n * name: string;\n * type: string;\n * }[]}\n */ (utils.getJsdocTagsDeep(preferredTagName));\n\n if (ignoreWhenAllParamsMissing && !jsdocParameterNames.length) {\n return;\n }\n\n const shallowJsdocParameterNames = jsdocParameterNames.filter((tag) => {\n return !tag.name.includes('.');\n }).map((tag, idx) => {\n return {\n ...tag,\n idx,\n };\n });\n\n const checkTypesRegex = utils.getRegexFromString(checkTypesPattern);\n\n /**\n * @type {{\n * functionParameterIdx: import('../iterateJsdoc.js').Integer,\n * functionParameterName: string,\n * inc: boolean|undefined,\n * remove?: true,\n * type?: string|undefined\n * }[]}\n */\n const missingTags = [];\n const flattenedRoots = utils.flattenRoots(functionParameterNames).names;\n\n /**\n * @type {{\n * [key: string]: import('../iterateJsdoc.js').Integer\n * }}\n */\n const paramIndex = {};\n\n /**\n * @param {string} cur\n * @returns {boolean}\n */\n const hasParamIndex = (cur) => {\n return utils.dropPathSegmentQuotes(String(cur)) in paramIndex;\n };\n\n /**\n *\n * @param {string|number|undefined} cur\n * @returns {import('../iterateJsdoc.js').Integer}\n */\n const getParamIndex = (cur) => {\n return paramIndex[utils.dropPathSegmentQuotes(String(cur))];\n };\n\n /**\n *\n * @param {string} cur\n * @param {import('../iterateJsdoc.js').Integer} idx\n * @returns {void}\n */\n const setParamIndex = (cur, idx) => {\n paramIndex[utils.dropPathSegmentQuotes(String(cur))] = idx;\n };\n\n for (const [\n idx,\n cur,\n ] of flattenedRoots.entries()) {\n setParamIndex(cur, idx);\n }\n\n /**\n *\n * @param {(import('@es-joy/jsdoccomment').JsdocTagWithInline & {\n * newAdd?: boolean\n * })[]} jsdocTags\n * @param {import('../iterateJsdoc.js').Integer} indexAtFunctionParams\n * @returns {{\n * foundIndex: import('../iterateJsdoc.js').Integer,\n * tagLineCount: import('../iterateJsdoc.js').Integer,\n * }}\n */\n const findExpectedIndex = (jsdocTags, indexAtFunctionParams) => {\n // Get the parameters that come after the current index in the flattened order\n const remainingFlattenedRoots = flattenedRoots.slice((indexAtFunctionParams || 0) + 1);\n\n // Find the first existing tag that comes after the current parameter in the flattened order\n const foundIndex = jsdocTags.findIndex(({\n name,\n newAdd,\n }) => {\n if (newAdd) {\n return false;\n }\n\n // Check if the tag name matches any of the remaining flattened roots\n return remainingFlattenedRoots.some((flattenedRoot) => {\n // The flattened roots don't have the root prefix (e.g., \"bar\", \"bar.baz\")\n // but JSDoc tags do (e.g., \"root0\", \"root0.bar\", \"root0.bar.baz\")\n // So we need to check if the tag name ends with the flattened root\n\n // Check if tag name ends with \".<flattenedRoot>\"\n if (name.endsWith(`.${flattenedRoot}`)) {\n return true;\n }\n\n // Also check if tag name exactly matches the flattenedRoot\n // (for single-level params)\n if (name === flattenedRoot) {\n return true;\n }\n\n return false;\n });\n });\n\n const tags = foundIndex > -1 ?\n jsdocTags.slice(0, foundIndex) :\n jsdocTags.filter(({\n tag,\n }) => {\n return tag === preferredTagName;\n });\n\n let tagLineCount = 0;\n for (const {\n source,\n } of tags) {\n for (const {\n tokens: {\n end,\n },\n } of source) {\n if (!end) {\n tagLineCount++;\n }\n }\n }\n\n return {\n foundIndex,\n tagLineCount,\n };\n };\n\n let [\n nextRootName,\n incremented,\n namer,\n ] = rootNamer([\n ...unnamedRootBase,\n ], autoIncrementBase);\n\n const thisOffset = functionParameterNames[0] === 'this' ? 1 : 0;\n\n for (const [\n functionParameterIdx,\n functionParameterName,\n ] of functionParameterNames.entries()) {\n let inc;\n if (Array.isArray(functionParameterName)) {\n const matchedJsdoc = shallowJsdocParameterNames[functionParameterIdx - thisOffset];\n\n /** @type {string} */\n let rootName;\n if (functionParameterName[0]) {\n rootName = functionParameterName[0];\n } else if (matchedJsdoc && matchedJsdoc.name) {\n rootName = matchedJsdoc.name;\n if (matchedJsdoc.type && matchedJsdoc.type.search(checkTypesRegex) === -1) {\n continue;\n }\n } else {\n rootName = nextRootName;\n inc = incremented;\n }\n\n [\n nextRootName,\n incremented,\n namer,\n ] = namer();\n\n const {\n hasPropertyRest,\n hasRestElement,\n names,\n rests,\n } = /**\n * @type {import('../jsdocUtils.js').FlattendRootInfo & {\n * annotationParamName?: string | undefined;\n * }}\n */ (functionParameterName[1]);\n const notCheckingNames = [];\n if (!enableRestElementFixer && hasRestElement) {\n continue;\n }\n\n if (!checkDestructuredRoots) {\n continue;\n }\n\n for (const [\n idx,\n paramName,\n ] of names.entries()) {\n // Add root if the root name is not in the docs (and is not already\n // in the tags to be fixed)\n if (!jsdocParameterNames.find(({\n name,\n }) => {\n return name === rootName;\n }) && !missingTags.find(({\n functionParameterName: fpn,\n }) => {\n return fpn === rootName;\n })) {\n const emptyParamIdx = jsdocParameterNames.findIndex(({\n name,\n }) => {\n return !name;\n });\n\n if (emptyParamIdx > -1) {\n missingTags.push({\n functionParameterIdx: emptyParamIdx,\n functionParameterName: rootName,\n inc,\n remove: true,\n });\n } else {\n missingTags.push({\n functionParameterIdx: hasParamIndex(rootName) ?\n getParamIndex(rootName) :\n getParamIndex(paramName),\n functionParameterName: rootName,\n inc,\n });\n }\n }\n\n if (!checkDestructured) {\n continue;\n }\n\n if (!checkRestProperty && rests[idx]) {\n continue;\n }\n\n const fullParamName = `${rootName}.${paramName}`;\n\n const notCheckingName = jsdocParameterNames.find(({\n name,\n type: paramType,\n }) => {\n return utils.comparePaths(name)(fullParamName) && paramType.search(checkTypesRegex) === -1 && paramType !== '';\n });\n\n if (notCheckingName !== undefined) {\n notCheckingNames.push(notCheckingName.name);\n }\n\n if (notCheckingNames.find((name) => {\n return fullParamName.startsWith(name);\n })) {\n continue;\n }\n\n if (jsdocParameterNames && !jsdocParameterNames.find(({\n name,\n }) => {\n return utils.comparePaths(name)(fullParamName);\n })) {\n missingTags.push({\n functionParameterIdx: getParamIndex(\n functionParameterName[0] ? fullParamName : paramName,\n ),\n functionParameterName: fullParamName,\n inc,\n type: hasRestElement && !hasPropertyRest ? '{...any}' : undefined,\n });\n }\n }\n\n continue;\n }\n\n /** @type {string} */\n let funcParamName;\n let type;\n if (typeof functionParameterName === 'object') {\n if (!enableRestElementFixer && functionParameterName.restElement) {\n continue;\n }\n\n funcParamName = /** @type {string} */ (functionParameterName.name);\n type = '{...any}';\n } else {\n funcParamName = /** @type {string} */ (functionParameterName);\n }\n\n if (jsdocParameterNames && !jsdocParameterNames.find(({\n name,\n }) => {\n return name === funcParamName;\n }) && funcParamName !== 'this') {\n missingTags.push({\n functionParameterIdx: getParamIndex(funcParamName),\n functionParameterName: funcParamName,\n inc,\n type,\n });\n }\n }\n\n /**\n *\n * @param {{\n * functionParameterIdx: import('../iterateJsdoc.js').Integer,\n * functionParameterName: string,\n * remove?: true,\n * inc?: boolean,\n * type?: string\n * }} cfg\n */\n const fix = ({\n functionParameterIdx,\n functionParameterName,\n inc,\n remove,\n type,\n }) => {\n if (inc && !enableRootFixer) {\n return;\n }\n\n /**\n *\n * @param {import('../iterateJsdoc.js').Integer} tagIndex\n * @param {import('../iterateJsdoc.js').Integer} sourceIndex\n * @param {import('../iterateJsdoc.js').Integer} spliceCount\n * @returns {void}\n */\n const createTokens = (tagIndex, sourceIndex, spliceCount) => {\n // console.log(sourceIndex, tagIndex, jsdoc.tags, jsdoc.source);\n const tokens = {\n number: sourceIndex + 1,\n source: '',\n tokens: {\n delimiter: '*',\n description: '',\n end: '',\n lineEnd: '',\n name: functionParameterName,\n newAdd: true,\n postDelimiter: ' ',\n postName: '',\n postTag: ' ',\n postType: type ? ' ' : '',\n start: jsdoc.source[sourceIndex].tokens.start,\n tag: `@${preferredTagName}`,\n type: type ?? '',\n },\n };\n\n /**\n * @type {(import('@es-joy/jsdoccomment').JsdocTagWithInline & {\n * newAdd?: true\n * })[]}\n */ (jsdoc.tags).splice(tagIndex, spliceCount, {\n description: '',\n inlineTags: [],\n name: functionParameterName,\n newAdd: true,\n optional: false,\n problems: [],\n source: [\n tokens,\n ],\n tag: preferredTagName,\n type: type ?? '',\n });\n const firstNumber = jsdoc.source[0].number;\n jsdoc.source.splice(sourceIndex, spliceCount, tokens);\n for (const [\n idx,\n src,\n ] of jsdoc.source.slice(sourceIndex).entries()) {\n src.number = firstNumber + sourceIndex + idx;\n }\n };\n\n const offset = jsdoc.source.findIndex(({\n tokens: {\n end,\n tag,\n },\n }) => {\n return tag || end;\n });\n if (remove) {\n createTokens(functionParameterIdx, offset + functionParameterIdx, 1);\n } else {\n const {\n foundIndex,\n tagLineCount: expectedIdx,\n } =\n findExpectedIndex(jsdoc.tags, functionParameterIdx);\n\n const firstParamLine = jsdoc.source.findIndex(({\n tokens,\n }) => {\n return tokens.tag === `@${preferredTagName}`;\n });\n const baseOffset = foundIndex > -1 || firstParamLine === -1 ?\n offset :\n firstParamLine;\n\n createTokens(expectedIdx, baseOffset + expectedIdx, 0);\n }\n };\n\n /**\n * @returns {void}\n */\n const fixer = () => {\n for (const missingTag of missingTags) {\n fix(missingTag);\n }\n };\n\n if (missingTags.length && jsdoc.source.length === 1) {\n utils.makeMultiline();\n }\n\n for (const {\n functionParameterName,\n } of missingTags) {\n utils.reportJSDoc(\n `Missing JSDoc @${preferredTagName} \"${functionParameterName}\" declaration.`,\n null,\n enableFixer ? fixer : null,\n );\n }\n}, {\n contextDefaults: true,\n meta: {\n docs: {\n description: 'Requires that all function parameters are documented with a `@param` tag.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-param.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n autoIncrementBase: {\n default: 0,\n description: `Numeric to indicate the number at which to begin auto-incrementing roots.\nDefaults to \\`0\\`.`,\n type: 'integer',\n },\n checkConstructors: {\n default: true,\n description: `A value indicating whether \\`constructor\\`s should be checked. Defaults to\n\\`true\\`.`,\n type: 'boolean',\n },\n checkDestructured: {\n default: true,\n description: 'Whether to require destructured properties. Defaults to `true`.',\n type: 'boolean',\n },\n checkDestructuredRoots: {\n default: true,\n description: `Whether to check the existence of a corresponding \\`@param\\` for root objects\nof destructured properties (e.g., that for \\`function ({a, b}) {}\\`, that there\nis something like \\`@param myRootObj\\` defined that can correspond to\nthe \\`{a, b}\\` object parameter).\n\nIf \\`checkDestructuredRoots\\` is \\`false\\`, \\`checkDestructured\\` will also be\nimplied to be \\`false\\` (i.e., the inside of the roots will not be checked\neither, e.g., it will also not complain if \\`a\\` or \\`b\\` do not have their own\ndocumentation). Defaults to \\`true\\`.`,\n type: 'boolean',\n },\n checkGetters: {\n default: false,\n description: 'A value indicating whether getters should be checked. Defaults to `false`.',\n type: 'boolean',\n },\n checkRestProperty: {\n default: false,\n description: `If set to \\`true\\`, will report (and add fixer insertions) for missing rest\nproperties. Defaults to \\`false\\`.\n\nIf set to \\`true\\`, note that you can still document the subproperties of the\nrest property using other jsdoc features, e.g., \\`@typedef\\`:\n\n\\`\\`\\`js\n/**\n * @typedef ExtraOptions\n * @property innerProp1\n * @property innerProp2\n */\n\n/**\n * @param cfg\n * @param cfg.num\n * @param {ExtraOptions} extra\n */\nfunction quux ({num, ...extra}) {\n}\n\\`\\`\\`\n\nSetting this option to \\`false\\` (the default) may be useful in cases where\nyou already have separate \\`@param\\` definitions for each of the properties\nwithin the rest property.\n\nFor example, with the option disabled, this will not give an error despite\n\\`extra\\` not having any definition:\n\n\\`\\`\\`js\n/**\n * @param cfg\n * @param cfg.num\n */\nfunction quux ({num, ...extra}) {\n}\n\\`\\`\\`\n\nNor will this:\n\n\\`\\`\\`js\n/**\n * @param cfg\n * @param cfg.num\n * @param cfg.innerProp1\n * @param cfg.innerProp2\n */\nfunction quux ({num, ...extra}) {\n}\n\\`\\`\\``,\n type: 'boolean',\n },\n checkSetters: {\n default: false,\n description: 'A value indicating whether setters should be checked. Defaults to `false`.',\n type: 'boolean',\n },\n checkTypesPattern: {\n description: `When one specifies a type, unless it is of a generic type, like \\`object\\`\nor \\`array\\`, it may be considered unnecessary to have that object's\ndestructured components required, especially where generated docs will\nlink back to the specified type. For example:\n\n\\`\\`\\`js\n/**\n * @param {SVGRect} bbox - a SVGRect\n */\nexport const bboxToObj = function ({x, y, width, height}) {\n return {x, y, width, height};\n};\n\\`\\`\\`\n\nBy default \\`checkTypesPattern\\` is set to\n\\`/^(?:[oO]bject|[aA]rray|PlainObject|Generic(?:Object|Array))$/v\\`,\nmeaning that destructuring will be required only if the type of the \\`@param\\`\n(the text between curly brackets) is a match for \"Object\" or \"Array\" (with or\nwithout initial caps), \"PlainObject\", or \"GenericObject\", \"GenericArray\" (or\nif no type is present). So in the above example, the lack of a match will\nmean that no complaint will be given about the undocumented destructured\nparameters.\n\nNote that the \\`/\\` delimiters are optional, but necessary to add flags.\n\nDefaults to using (only) the \\`v\\` flag, so to add your own flags, encapsulate\nyour expression as a string, but like a literal, e.g., \\`/^object$/vi\\`.\n\nYou could set this regular expression to a more expansive list, or you\ncould restrict it such that even types matching those strings would not\nneed destructuring.`,\n type: 'string',\n },\n contexts: {\n description: `Set this to an array of strings representing the AST context (or an object with\noptional \\`context\\` and \\`comment\\` properties) where you wish the rule to be applied.\n\n\\`context\\` defaults to \\`any\\` and \\`comment\\` defaults to no specific comment context.\n\nOverrides the default contexts (\\`ArrowFunctionExpression\\`, \\`FunctionDeclaration\\`,\n\\`FunctionExpression\\`). May be useful for adding such as\n\\`TSMethodSignature\\` in TypeScript or restricting the contexts\nwhich are checked.\n\nSee the [\"AST and Selectors\"](../advanced.md#ast-and-selectors)\nsection of our Advanced docs for more on the expected format.`,\n items: {\n anyOf: [\n {\n type: 'string',\n },\n {\n additionalProperties: false,\n properties: {\n comment: {\n type: 'string',\n },\n context: {\n type: 'string',\n },\n },\n type: 'object',\n },\n ],\n },\n type: 'array',\n },\n enableFixer: {\n description: 'Whether to enable the fixer. Defaults to `true`.',\n type: 'boolean',\n },\n enableRestElementFixer: {\n description: `Whether to enable the rest element fixer.\n\nThe fixer will automatically report/insert\n[JSDoc repeatable parameters](https://jsdoc.app/tags-param.html#multiple-types-and-repeatable-parameters)\nif missing.\n\n\\`\\`\\`js\n/**\n * @param {GenericArray} cfg\n * @param {number} cfg.\"0\"\n */\nfunction baar ([a, ...extra]) {\n //\n}\n\\`\\`\\`\n\n...becomes:\n\n\\`\\`\\`js\n/**\n * @param {GenericArray} cfg\n * @param {number} cfg.\"0\"\n * @param {...any} cfg.\"1\"\n */\nfunction baar ([a, ...extra]) {\n //\n}\n\\`\\`\\`\n\nNote that the type \\`any\\` is included since we don't know of any specific\ntype to use.\n\nDefaults to \\`true\\`.`,\n type: 'boolean',\n },\n enableRootFixer: {\n description: `Whether to enable the auto-adding of incrementing roots.\n\nThe default behavior of \\`true\\` is for \"root\" to be auto-inserted for missing\nroots, followed by a 0-based auto-incrementing number.\n\nSo for:\n\n\\`\\`\\`js\nfunction quux ({foo}, {bar}, {baz}) {\n}\n\\`\\`\\`\n\n...the default JSDoc that would be added if the fixer is enabled would be:\n\n\\`\\`\\`js\n/**\n* @param root0\n* @param root0.foo\n* @param root1\n* @param root1.bar\n* @param root2\n* @param root2.baz\n*/\n\\`\\`\\`\n\nHas no effect if \\`enableFixer\\` is set to \\`false\\`.`,\n type: 'boolean',\n },\n exemptedBy: {\n description: `Array of tags (e.g., \\`['type']\\`) whose presence on the document block\navoids the need for a \\`@param\\`. Defaults to an array with\n\\`inheritdoc\\`. If you set this array, it will overwrite the default,\nso be sure to add back \\`inheritdoc\\` if you wish its presence to cause\nexemption of the rule.`,\n items: {\n type: 'string',\n },\n type: 'array',\n },\n ignoreWhenAllParamsMissing: {\n description: `Set to \\`true\\` to ignore reporting when all params are missing. Defaults to\n\\`false\\`.`,\n type: 'boolean',\n },\n interfaceExemptsParamsCheck: {\n description: `Set if you wish TypeScript interfaces to exempt checks for the existence of\n\\`@param\\`'s.\n\nWill check for a type defining the function itself (on a variable\ndeclaration) or if there is a single destructured object with a type.\nDefaults to \\`false\\`.`,\n type: 'boolean',\n },\n unnamedRootBase: {\n description: `An array of root names to use in the fixer when roots are missing. Defaults\nto \\`['root']\\`. Note that only when all items in the array besides the last\nare exhausted will auto-incrementing occur. So, with\n\\`unnamedRootBase: ['arg', 'config']\\`, the following:\n\n\\`\\`\\`js\nfunction quux ({foo}, [bar], {baz}) {\n}\n\\`\\`\\`\n\n...will get the following JSDoc block added:\n\n\\`\\`\\`js\n/**\n* @param arg\n* @param arg.foo\n* @param config0\n* @param config0.\"0\" (\\`bar\\`)\n* @param config1\n* @param config1.baz\n*/\n\\`\\`\\``,\n items: {\n type: 'string',\n },\n type: 'array',\n },\n useDefaultObjectProperties: {\n description: `Set to \\`true\\` if you wish to expect documentation of properties on objects\nsupplied as default values. Defaults to \\`false\\`.`,\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n\n // We cannot cache comment nodes as the contexts may recur with the\n // same comment node but a different JS node, and we may need the different\n // JS node to ensure we iterate its context\n noTracking: true,\n});\n"],"mappings":"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iEAAiE;UAC9E,IAAI,EAAE;QACR,CAAC;QACD,sBAAsB,EAAE;UACtB,OAAO,EAAE,IAAI;UACb,WAAW,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;UAC1B,IAAI,EAAE;QACR,CAAC;QACD,YAAY,EAAE;UACZ,OAAO,EAAE,KAAK;UACd,WAAW,EAAE,4EAA4E;UACzF,IAAI,EAAE;QACR,CAAC;QACD,iBAAiB,EAAE;UACjB,OAAO,EAAE,KAAK;UACd,WAAW,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;UACK,IAAI,EAAE;QACR,CAAC;QACD,YAAY,EAAE;UACZ,OAAO,EAAE,KAAK;UACd,WAAW,EAAE,4EAA4E;UACzF,IAAI,EAAE;QACR,CAAC;QACD,iBAAiB,EAAE;UACjB,WAAW,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;UACR,IAAI,EAAE;QACR,CAAC;QACD,QAAQ,EAAE;UACR,WAAW,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D;UAClD,KAAK,EAAE;YACL,KAAK,EAAE,CACL;cACE,IAAI,EAAE;YACR,CAAC,EACD;cACE,oBAAoB,EAAE,KAAK;cAC3B,UAAU,EAAE;gBACV,OAAO,EAAE;kBACP,IAAI,EAAE;gBACR,CAAC;gBACD,OAAO,EAAE;kBACP,IAAI,EAAE;gBACR;cACF,CAAC;cACD,IAAI,EAAE;YACR,CAAC;UAEL,CAAC;UACD,IAAI,EAAE;QACR,CAAC;QACD,WAAW,EAAE;UACX,WAAW,EAAE,kDAAkD;UAC/D,IAAI,EAAE;QACR,CAAC;QACD,sBAAsB,EAAE;UACtB,WAAW,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;UACV,IAAI,EAAE;QACR,CAAC;QACD,eAAe,EAAE;UACf,WAAW,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;UAC1C,IAAI,EAAE;QACR,CAAC;QACD,UAAU,EAAE;UACV,WAAW,EAAE;AACzB;AACA;AACA;AACA,uBAAuB;UACX,KAAK,EAAE;YACL,IAAI,EAAE;UACR,CAAC;UACD,IAAI,EAAE;QACR,CAAC;QACD,0BAA0B,EAAE;UAC1B,WAAW,EAAE;AACzB,WAAW;UACC,IAAI,EAAE;QACR,CAAC;QACD,2BAA2B,EAAE;UAC3B,WAAW,EAAE;AACzB;AACA;AACA;AACA;AACA,uBAAuB;UACX,IAAI,EAAE;QACR,CAAC;QACD,eAAe,EAAE;UACf,WAAW,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;UACK,KAAK,EAAE;YACL,IAAI,EAAE;UACR,CAAC;UACD,IAAI,EAAE;QACR,CAAC;QACD,0BAA0B,EAAE;UAC1B,WAAW,EAAE;AACzB,mDAAmD;UACvC,IAAI,EAAE;QACR;MACF,CAAC;MACD,IAAI,EAAE;IACR,CAAC,CACF;IACD,IAAI,EAAE;EACR,CAAC;EAED;EACA;EACA;EACA,UAAU,EAAE;AACd,CAAC,CAAC;AAAA","ignoreList":[]}