{"version":3,"file":"index.cjs","sources":["../src/constants.ts","../src/ui/utils.ts","../src/utils/object.ts","../src/utils/url.ts","../src/ui/handler.ts","../src/ui/module.ts","../src/generator/module.ts"],"sourcesContent":["import path from 'node:path';\n\nexport const ASSETS_PATH = path.resolve(__dirname, '..', 'assets');\n","import { URL, pathToFileURL } from 'node:url';\n\nexport function isFileURL(input: string) : boolean {\n    let url: URL;\n\n    try {\n        url = new URL(input);\n    } catch (e) {\n        url = pathToFileURL(input);\n    }\n\n    return url.protocol === 'file:';\n}\n","export function isObject(item: unknown) : item is Record<string, any> {\n    return (\n        !!item &&\n        typeof item === 'object' &&\n        !Array.isArray(item)\n    );\n}\n","const TRAILING_SLASH_RE = /\\/$|\\/\\?/;\n\nexport function hasTrailingSlash(input = '', queryParams = false): boolean {\n    if (!queryParams) {\n        return input.endsWith('/');\n    }\n\n    return TRAILING_SLASH_RE.test(input);\n}\n\nexport function withoutTrailingSlash(input = '', queryParams = false): string {\n    if (!queryParams) {\n        return (hasTrailingSlash(input) ? input.slice(0, -1) : input) || '/';\n    }\n\n    if (!hasTrailingSlash(input, true)) {\n        return input || '/';\n    }\n\n    const [s0, ...s] = input.split('?');\n\n    return (s0.slice(0, -1) || '/') + (s.length ? `?${s.join('?')}` : '');\n}\n\nexport function withTrailingSlash(input = '', queryParams = false): string {\n    if (!queryParams) {\n        return input.endsWith('/') ? input : (`${input}/`);\n    }\n\n    if (hasTrailingSlash(input, true)) {\n        return input || '/';\n    }\n\n    const [s0, ...s] = input.split('?');\n    return `${s0}/${s.length ? `?${s.join('?')}` : ''}`;\n}\n\nexport function hasLeadingSlash(input = ''): boolean {\n    return input.startsWith('/');\n}\n\nexport function withoutLeadingSlash(input = ''): string {\n    return (hasLeadingSlash(input) ? input.substring(1) : input) || '/';\n}\n\nexport function withLeadingSlash(input = ''): string {\n    return hasLeadingSlash(input) ? input : `/${input}`;\n}\n\nexport function cleanDoubleSlashes(input = ''): string {\n    return input.split('://')\n        .map((str) => str.replace(/\\/{2,}/g, '/'))\n        .join('://');\n}\n","import {\n    coreHandler,\n    send,\n    useRequestMountPath, useRequestPath,\n} from 'routup';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { URL } from 'node:url';\nimport type { Spec } from 'swagger-ui-dist';\nimport { createHandlerFn } from '@routup/assets';\nimport { ASSETS_PATH } from '../constants';\nimport type { UIOptions } from './type';\nimport { isFileURL } from './utils';\nimport {\n    cleanDoubleSlashes,\n    isObject,\n    withLeadingSlash,\n    withTrailingSlash,\n    withoutLeadingSlash,\n} from '../utils';\n\n/* istanbul ignore next */\nconst stringify = (obj: Record<string, any>) => {\n    const placeholder = '____FUNCTION_PLACEHOLDER____';\n    const fns : CallableFunction[] = [];\n\n    let json = JSON.stringify(obj, (key, value) => {\n        if (typeof value === 'function') {\n            fns.push(value);\n            return placeholder;\n        }\n\n        return value;\n    }, 2);\n\n    json = json.replace(new RegExp(`\"${placeholder}\"`, 'g'), (_) => fns.shift() as any);\n\n    return `var options = ${json};`;\n};\n\n/**\n * Create a swagger handler by swagger document or web url.\n *\n * @param document\n * @param options\n */\nexport function createUIHandler(\n    document: Spec | string,\n    options: UIOptions = {},\n) {\n    const handler = createHandlerFn(path.dirname(require.resolve('swagger-ui-dist')), {\n        extensions: [],\n    });\n\n    if (isObject(document)) {\n        options.spec = document;\n    } else if (isFileURL(document)) {\n        const documentFile = fs.readFileSync(document, { encoding: 'utf-8' });\n        options.spec = JSON.parse(documentFile);\n    } else {\n        options.url = document;\n    }\n\n    let template : string | undefined;\n    const templateRaw = fs.readFileSync(path.join(ASSETS_PATH, 'template.tpl'), {\n        encoding: 'utf-8',\n    });\n\n    const compileTemplate = (context: {url?: string, mountPath: string, path: string }) : void => {\n        let href = '/';\n        if (context.url) {\n            let pathName : string;\n            if (context.url.startsWith('http')) {\n                pathName = new URL(context.url).pathname;\n            } else {\n                pathName = context.url;\n            }\n\n            const mountPathIndex = pathName.indexOf(context.path);\n            if (mountPathIndex !== -1) {\n                href = pathName.substring(0, mountPathIndex + context.path.length);\n            } else {\n                href = pathName;\n            }\n\n            if (options.baseURL) {\n                href = new URL(withoutLeadingSlash(href), options.baseURL).href;\n            } else if (options.basePath) {\n                href = withLeadingSlash(cleanDoubleSlashes(`${options.basePath}/${href}`));\n            }\n\n            href = withTrailingSlash(href);\n        } else if (options.baseURL) {\n            href = withTrailingSlash(options.baseURL);\n        } else if (options.basePath) {\n            href = withTrailingSlash(withLeadingSlash(options.basePath));\n        }\n\n        template = templateRaw\n            .replace('<% title %>', 'Swagger UI')\n            .replace('<% swaggerOptions %>', stringify(options))\n            .replace('<% baseHref %>', href);\n    };\n\n    return coreHandler((req, res, next) => {\n        /* istanbul ignore next */\n        if (typeof req.url === 'undefined') {\n            return next();\n        }\n\n        if (req.url.includes('/package.json')) {\n            res.statusCode = 404;\n\n            return send(res);\n        }\n\n        return handler(req, res, async () => {\n            if (typeof template === 'undefined') {\n                compileTemplate({\n                    url: req.url,\n                    mountPath: useRequestMountPath(req),\n                    path: useRequestPath(req),\n                });\n            }\n\n            return send(res, template);\n        });\n    });\n}\n","import type { Plugin } from 'routup';\nimport type { Spec } from 'swagger-ui-dist';\nimport { createUIHandler } from './handler';\nimport type { UIOptions } from './type';\n\nexport function swaggerUI(\n    document: Spec | string,\n    options: UIOptions = {},\n) : Plugin {\n    return {\n        name: 'swaggerUI',\n        install: (router) => {\n            router.use(createUIHandler(document, options));\n        },\n    };\n}\n","import { Version, generate as _generate, isMetadata } from '@trapi/swagger';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { createMerger } from 'smob';\nimport type { GeneratorContext, GeneratorOutput } from './type';\n\nexport async function generate<V extends `${Version}`>(\n    context: GeneratorContext<V>,\n): Promise<GeneratorOutput<V>> {\n    if (context.options.metadata) {\n        if (!isMetadata(context.options.metadata)) {\n            if (!context.options.metadata.entryPoint) {\n                context.options.metadata.entryPoint = [\n                    { pattern: '**/*.ts', cwd: path.join(process.cwd(), 'src') },\n                ];\n            }\n\n            if (!context.options.metadata.preset) {\n                context.options.metadata.preset = '@routup/swagger-preset';\n            }\n        }\n    } else {\n        context.options.metadata = {\n            ignore: ['**/node_modules/**'],\n            preset: '@routup/swagger-preset',\n            entryPoint: [\n                { pattern: '**/*.ts', cwd: path.join(process.cwd(), 'src') },\n            ],\n        };\n    }\n\n    const merge = createMerger({\n        array: true,\n        arrayDistinct: true,\n    });\n\n    context.options = merge({\n        name: 'API Documentation',\n        description: 'Explore the REST Endpoints of the API.',\n        consumes: ['application/json'],\n        produces: ['application/json'],\n    }, context.options || {});\n\n    return await _generate({\n        version: context.version || Version.V3,\n        options: context.options,\n        tsConfig: context.tsconfig,\n    }) as GeneratorOutput<V>;\n}\n"],"names":["ASSETS_PATH","path","resolve","__dirname","isFileURL","input","url","URL","e","pathToFileURL","protocol","isObject","item","Array","isArray","TRAILING_SLASH_RE","hasTrailingSlash","queryParams","endsWith","test","withTrailingSlash","s0","s","split","length","join","hasLeadingSlash","startsWith","withoutLeadingSlash","substring","withLeadingSlash","cleanDoubleSlashes","map","str","replace","stringify","obj","placeholder","fns","json","JSON","key","value","push","RegExp","_","shift","createUIHandler","document","options","handler","createHandlerFn","dirname","require","extensions","spec","documentFile","fs","readFileSync","encoding","parse","template","templateRaw","compileTemplate","context","href","pathName","pathname","mountPathIndex","indexOf","baseURL","basePath","coreHandler","req","res","next","includes","statusCode","send","mountPath","useRequestMountPath","useRequestPath","swaggerUI","name","install","router","use","generate","metadata","isMetadata","entryPoint","pattern","cwd","process","preset","ignore","merge","createMerger","array","arrayDistinct","description","consumes","produces","_generate","version","Version","V3","tsConfig","tsconfig"],"mappings":";;;;;;;;;;;;;AAEO,MAAMA,WAAAA,GAAcC,IAAAA,CAAKC,OAAO,CAACC,SAAAA,EAAW,MAAM,QAAA,CAAA;;ACAlD,SAASC,UAAUC,KAAa,EAAA;IACnC,IAAIC,GAAAA;IAEJ,IAAI;AACAA,QAAAA,GAAAA,GAAM,IAAIC,YAAAA,CAAIF,KAAAA,CAAAA;AAClB,IAAA,CAAA,CAAE,OAAOG,CAAAA,EAAG;AACRF,QAAAA,GAAAA,GAAMG,sBAAAA,CAAcJ,KAAAA,CAAAA;AACxB,IAAA;IAEA,OAAOC,GAAAA,CAAII,QAAQ,KAAK,OAAA;AAC5B;;ACZO,SAASC,SAASC,IAAa,EAAA;IAClC,OACI,CAAC,CAACA,IAAAA,IACF,OAAOA,SAAS,QAAA,IAChB,CAACC,KAAAA,CAAMC,OAAO,CAACF,IAAAA,CAAAA;AAEvB;;ACNA,MAAMG,iBAAAA,GAAoB,UAAA;AAEnB,SAASC,gBAAAA,CAAiBX,KAAAA,GAAQ,EAAE,EAAEY,cAAc,KAAK,EAAA;AAC5D,IAAA,IAAI,CAACA,WAAAA,EAAa;QACd,OAAOZ,KAAAA,CAAMa,QAAQ,CAAC,GAAA,CAAA;AAC1B,IAAA;IAEA,OAAOH,iBAAAA,CAAkBI,IAAI,CAACd,KAAAA,CAAAA;AAClC;AAgBO,SAASe,iBAAAA,CAAkBf,KAAAA,GAAQ,EAAE,EAAEY,cAAc,KAAK,EAAA;AAC7D,IAAA,IAAI,CAACA,WAAAA,EAAa;QACd,OAAOZ,KAAAA,CAAMa,QAAQ,CAAC,GAAA,CAAA,GAAOb,QAAS,CAAA,EAAGA,KAAAA,CAAM,CAAC,CAAC;AACrD,IAAA;IAEA,IAAIW,gBAAAA,CAAiBX,OAAO,IAAA,CAAA,EAAO;AAC/B,QAAA,OAAOA,KAAAA,IAAS,GAAA;AACpB,IAAA;AAEA,IAAA,MAAM,CAACgB,EAAAA,EAAI,GAAGC,EAAE,GAAGjB,KAAAA,CAAMkB,KAAK,CAAC,GAAA,CAAA;AAC/B,IAAA,OAAO,CAAA,EAAGF,EAAAA,CAAG,CAAC,EAAEC,EAAEE,MAAM,GAAG,CAAC,CAAC,EAAEF,CAAAA,CAAEG,IAAI,CAAC,GAAA,CAAA,CAAA,CAAM,GAAG,EAAA,CAAA,CAAI;AACvD;AAEO,SAASC,eAAAA,CAAgBrB,KAAAA,GAAQ,EAAE,EAAA;IACtC,OAAOA,KAAAA,CAAMsB,UAAU,CAAC,GAAA,CAAA;AAC5B;AAEO,SAASC,mBAAAA,CAAoBvB,KAAAA,GAAQ,EAAE,EAAA;IAC1C,OAAQqB,CAAAA,eAAAA,CAAgBrB,KAAAA,CAAAA,GAASA,MAAMwB,SAAS,CAAC,CAAA,CAAA,GAAKxB,KAAI,KAAM,GAAA;AACpE;AAEO,SAASyB,gBAAAA,CAAiBzB,KAAAA,GAAQ,EAAE,EAAA;AACvC,IAAA,OAAOqB,gBAAgBrB,KAAAA,CAAAA,GAASA,KAAAA,GAAQ,CAAC,CAAC,EAAEA,KAAAA,CAAAA,CAAO;AACvD;AAEO,SAAS0B,kBAAAA,CAAmB1B,KAAAA,GAAQ,EAAE,EAAA;AACzC,IAAA,OAAOA,KAAAA,CAAMkB,KAAK,CAAC,KAAA,CAAA,CACdS,GAAG,CAAC,CAACC,GAAAA,GAAQA,GAAAA,CAAIC,OAAO,CAAC,SAAA,EAAW,GAAA,CAAA,CAAA,CACpCT,IAAI,CAAC,KAAA,CAAA;AACd;;AChCA,2BACA,MAAMU,SAAAA,GAAY,CAACC,GAAAA,GAAAA;AACf,IAAA,MAAMC,WAAAA,GAAc,8BAAA;AACpB,IAAA,MAAMC,MAA2B,EAAE;AAEnC,IAAA,IAAIC,OAAOC,IAAAA,CAAKL,SAAS,CAACC,GAAAA,EAAK,CAACK,GAAAA,EAAKC,KAAAA,GAAAA;QACjC,IAAI,OAAOA,UAAU,UAAA,EAAY;AAC7BJ,YAAAA,GAAAA,CAAIK,IAAI,CAACD,KAAAA,CAAAA;YACT,OAAOL,WAAAA;AACX,QAAA;QAEA,OAAOK,KAAAA;IACX,CAAA,EAAG,CAAA,CAAA;AAEHH,IAAAA,IAAAA,GAAOA,KAAKL,OAAO,CAAC,IAAIU,MAAAA,CAAO,CAAC,CAAC,EAAEP,WAAAA,CAAY,CAAC,CAAC,EAAE,GAAA,CAAA,EAAM,CAACQ,CAAAA,GAAMP,IAAIQ,KAAK,EAAA,CAAA;AAEzE,IAAA,OAAO,CAAC,cAAc,EAAEP,IAAAA,CAAK,CAAC,CAAC;AACnC,CAAA;AAEA;;;;;AAKC,IACM,SAASQ,eAAAA,CACZC,QAAuB,EACvBC,OAAAA,GAAqB,EAAE,EAAA;IAEvB,MAAMC,OAAAA,GAAUC,uBAAgBlD,IAAAA,CAAKmD,OAAO,CAACC,OAAAA,CAAQnD,OAAO,CAAC,iBAAA,CAAA,CAAA,EAAqB;AAC9EoD,QAAAA,UAAAA,EAAY;AAChB,KAAA,CAAA;AAEA,IAAA,IAAI3C,SAASqC,QAAAA,CAAAA,EAAW;AACpBC,QAAAA,OAAAA,CAAQM,IAAI,GAAGP,QAAAA;IACnB,CAAA,MAAO,IAAI5C,UAAU4C,QAAAA,CAAAA,EAAW;AAC5B,QAAA,MAAMQ,YAAAA,GAAeC,EAAAA,CAAGC,YAAY,CAACV,QAAAA,EAAU;YAAEW,QAAAA,EAAU;AAAQ,SAAA,CAAA;AACnEV,QAAAA,OAAAA,CAAQM,IAAI,GAAGf,IAAAA,CAAKoB,KAAK,CAACJ,YAAAA,CAAAA;IAC9B,CAAA,MAAO;AACHP,QAAAA,OAAAA,CAAQ3C,GAAG,GAAG0C,QAAAA;AAClB,IAAA;IAEA,IAAIa,QAAAA;IACJ,MAAMC,WAAAA,GAAcL,GAAGC,YAAY,CAACzD,KAAKwB,IAAI,CAACzB,aAAa,cAAA,CAAA,EAAiB;QACxE2D,QAAAA,EAAU;AACd,KAAA,CAAA;AAEA,IAAA,MAAMI,kBAAkB,CAACC,OAAAA,GAAAA;AACrB,QAAA,IAAIC,IAAAA,GAAO,GAAA;QACX,IAAID,OAAAA,CAAQ1D,GAAG,EAAE;YACb,IAAI4D,QAAAA;AACJ,YAAA,IAAIF,OAAAA,CAAQ1D,GAAG,CAACqB,UAAU,CAAC,MAAA,CAAA,EAAS;AAChCuC,gBAAAA,QAAAA,GAAW,IAAI3D,YAAAA,CAAIyD,OAAAA,CAAQ1D,GAAG,EAAE6D,QAAQ;YAC5C,CAAA,MAAO;AACHD,gBAAAA,QAAAA,GAAWF,QAAQ1D,GAAG;AAC1B,YAAA;AAEA,YAAA,MAAM8D,cAAAA,GAAiBF,QAAAA,CAASG,OAAO,CAACL,QAAQ/D,IAAI,CAAA;YACpD,IAAImE,cAAAA,KAAmB,EAAC,EAAG;gBACvBH,IAAAA,GAAOC,QAAAA,CAASrC,SAAS,CAAC,CAAA,EAAGuC,iBAAiBJ,OAAAA,CAAQ/D,IAAI,CAACuB,MAAM,CAAA;YACrE,CAAA,MAAO;gBACHyC,IAAAA,GAAOC,QAAAA;AACX,YAAA;YAEA,IAAIjB,OAAAA,CAAQqB,OAAO,EAAE;AACjBL,gBAAAA,IAAAA,GAAO,IAAI1D,YAAAA,CAAIqB,mBAAAA,CAAoBqC,OAAOhB,OAAAA,CAAQqB,OAAO,EAAEL,IAAI;YACnE,CAAA,MAAO,IAAIhB,OAAAA,CAAQsB,QAAQ,EAAE;gBACzBN,IAAAA,GAAOnC,gBAAAA,CAAiBC,mBAAmB,CAAA,EAAGkB,OAAAA,CAAQsB,QAAQ,CAAC,CAAC,EAAEN,IAAAA,CAAAA,CAAM,CAAA,CAAA;AAC5E,YAAA;AAEAA,YAAAA,IAAAA,GAAO7C,iBAAAA,CAAkB6C,IAAAA,CAAAA;QAC7B,CAAA,MAAO,IAAIhB,OAAAA,CAAQqB,OAAO,EAAE;YACxBL,IAAAA,GAAO7C,iBAAAA,CAAkB6B,QAAQqB,OAAO,CAAA;QAC5C,CAAA,MAAO,IAAIrB,OAAAA,CAAQsB,QAAQ,EAAE;YACzBN,IAAAA,GAAO7C,iBAAAA,CAAkBU,gBAAAA,CAAiBmB,OAAAA,CAAQsB,QAAQ,CAAA,CAAA;AAC9D,QAAA;AAEAV,QAAAA,QAAAA,GAAWC,WAAAA,CACN5B,OAAO,CAAC,aAAA,EAAe,YAAA,CAAA,CACvBA,OAAO,CAAC,sBAAA,EAAwBC,SAAAA,CAAUc,OAAAA,CAAAA,CAAAA,CAC1Cf,OAAO,CAAC,gBAAA,EAAkB+B,IAAAA,CAAAA;AACnC,IAAA,CAAA;IAEA,OAAOO,kBAAAA,CAAY,CAACC,GAAAA,EAAKC,GAAAA,EAAKC,IAAAA,GAAAA;AAC1B,mCACA,IAAI,OAAOF,GAAAA,CAAInE,GAAG,KAAK,WAAA,EAAa;YAChC,OAAOqE,IAAAA,EAAAA;AACX,QAAA;AAEA,QAAA,IAAIF,GAAAA,CAAInE,GAAG,CAACsE,QAAQ,CAAC,eAAA,CAAA,EAAkB;AACnCF,YAAAA,GAAAA,CAAIG,UAAU,GAAG,GAAA;AAEjB,YAAA,OAAOC,WAAAA,CAAKJ,GAAAA,CAAAA;AAChB,QAAA;QAEA,OAAOxB,OAAAA,CAAQuB,KAAKC,GAAAA,EAAK,UAAA;YACrB,IAAI,OAAOb,aAAa,WAAA,EAAa;gBACjCE,eAAAA,CAAgB;AACZzD,oBAAAA,GAAAA,EAAKmE,IAAInE,GAAG;AACZyE,oBAAAA,SAAAA,EAAWC,0BAAAA,CAAoBP,GAAAA,CAAAA;AAC/BxE,oBAAAA,IAAAA,EAAMgF,qBAAAA,CAAeR,GAAAA;AACzB,iBAAA,CAAA;AACJ,YAAA;AAEA,YAAA,OAAOK,YAAKJ,GAAAA,EAAKb,QAAAA,CAAAA;AACrB,QAAA,CAAA,CAAA;AACJ,IAAA,CAAA,CAAA;AACJ;;AC3HO,SAASqB,SAAAA,CACZlC,QAAuB,EACvBC,OAAAA,GAAqB,EAAE,EAAA;IAEvB,OAAO;QACHkC,IAAAA,EAAM,WAAA;AACNC,QAAAA,OAAAA,EAAS,CAACC,MAAAA,GAAAA;YACNA,MAAAA,CAAOC,GAAG,CAACvC,eAAAA,CAAgBC,QAAAA,EAAUC,OAAAA,CAAAA,CAAAA;AACzC,QAAA;AACJ,KAAA;AACJ;;ACTO,eAAesC,SAClBvB,OAA4B,EAAA;AAE5B,IAAA,IAAIA,OAAAA,CAAQf,OAAO,CAACuC,QAAQ,EAAE;AAC1B,QAAA,IAAI,CAACC,kBAAAA,CAAWzB,OAAAA,CAAQf,OAAO,CAACuC,QAAQ,CAAA,EAAG;AACvC,YAAA,IAAI,CAACxB,OAAAA,CAAQf,OAAO,CAACuC,QAAQ,CAACE,UAAU,EAAE;AACtC1B,gBAAAA,OAAAA,CAAQf,OAAO,CAACuC,QAAQ,CAACE,UAAU,GAAG;AAClC,oBAAA;wBAAEC,OAAAA,EAAS,SAAA;AAAWC,wBAAAA,GAAAA,EAAK3F,IAAAA,CAAKwB,IAAI,CAACoE,OAAAA,CAAQD,GAAG,EAAA,EAAI,KAAA;AAAO;AAC9D,iBAAA;AACL,YAAA;AAEA,YAAA,IAAI,CAAC5B,OAAAA,CAAQf,OAAO,CAACuC,QAAQ,CAACM,MAAM,EAAE;AAClC9B,gBAAAA,OAAAA,CAAQf,OAAO,CAACuC,QAAQ,CAACM,MAAM,GAAG,wBAAA;AACtC,YAAA;AACJ,QAAA;IACJ,CAAA,MAAO;QACH9B,OAAAA,CAAQf,OAAO,CAACuC,QAAQ,GAAG;YACvBO,MAAAA,EAAQ;AAAC,gBAAA;AAAqB,aAAA;YAC9BD,MAAAA,EAAQ,wBAAA;YACRJ,UAAAA,EAAY;AACR,gBAAA;oBAAEC,OAAAA,EAAS,SAAA;AAAWC,oBAAAA,GAAAA,EAAK3F,IAAAA,CAAKwB,IAAI,CAACoE,OAAAA,CAAQD,GAAG,EAAA,EAAI,KAAA;AAAO;AAC9D;AACL,SAAA;AACJ,IAAA;AAEA,IAAA,MAAMI,QAAQC,iBAAAA,CAAa;QACvBC,KAAAA,EAAO,IAAA;QACPC,aAAAA,EAAe;AACnB,KAAA,CAAA;IAEAnC,OAAAA,CAAQf,OAAO,GAAG+C,KAAAA,CAAM;QACpBb,IAAAA,EAAM,mBAAA;QACNiB,WAAAA,EAAa,wCAAA;QACbC,QAAAA,EAAU;AAAC,YAAA;AAAmB,SAAA;QAC9BC,QAAAA,EAAU;AAAC,YAAA;AAAmB;KAClC,EAAGtC,OAAAA,CAAQf,OAAO,IAAI,EAAC,CAAA;AAEvB,IAAA,OAAO,MAAMsD,gBAAAA,CAAU;AACnBC,QAAAA,OAAAA,EAASxC,OAAAA,CAAQwC,OAAO,IAAIC,eAAAA,CAAQC,EAAE;AACtCzD,QAAAA,OAAAA,EAASe,QAAQf,OAAO;AACxB0D,QAAAA,QAAAA,EAAU3C,QAAQ4C;AACtB,KAAA,CAAA;AACJ;;;;;;;;;;;;;;;"}