UNPKG

@samchon/openapi

Version:

OpenAPI definitions and converters for 'typia' and 'nestia'.

1 lines 26.2 kB
{"version":3,"file":"OpenApiV3Upgrader.mjs","sources":["../../src/converters/OpenApiV3Upgrader.ts"],"sourcesContent":["import { OpenApi } from \"../OpenApi\";\nimport { OpenApiV3 } from \"../OpenApiV3\";\nimport { OpenApiTypeChecker } from \"../utils/OpenApiTypeChecker\";\n\nexport namespace OpenApiV3Upgrader {\n export const convert = (input: OpenApiV3.IDocument): OpenApi.IDocument => ({\n ...input,\n components: convertComponents(input.components ?? {}),\n paths: input.paths\n ? Object.fromEntries(\n Object.entries(input.paths)\n .filter(([_, v]) => v !== undefined)\n .map(\n ([key, value]) => [key, convertPathItem(input)(value)] as const,\n ),\n )\n : undefined,\n openapi: \"3.1.0\",\n \"x-samchon-emended\": true,\n });\n\n /* -----------------------------------------------------------\n OPERATORS\n ----------------------------------------------------------- */\n const convertPathItem =\n (doc: OpenApiV3.IDocument) =>\n (pathItem: OpenApiV3.IPath): OpenApi.IPath => ({\n ...(pathItem as any),\n ...(pathItem.get\n ? { get: convertOperation(doc)(pathItem)(pathItem.get) }\n : undefined),\n ...(pathItem.put\n ? { put: convertOperation(doc)(pathItem)(pathItem.put) }\n : undefined),\n ...(pathItem.post\n ? { post: convertOperation(doc)(pathItem)(pathItem.post) }\n : undefined),\n ...(pathItem.delete\n ? { delete: convertOperation(doc)(pathItem)(pathItem.delete) }\n : undefined),\n ...(pathItem.options\n ? { options: convertOperation(doc)(pathItem)(pathItem.options) }\n : undefined),\n ...(pathItem.head\n ? { head: convertOperation(doc)(pathItem)(pathItem.head) }\n : undefined),\n ...(pathItem.patch\n ? { patch: convertOperation(doc)(pathItem)(pathItem.patch) }\n : undefined),\n ...(pathItem.trace\n ? { trace: convertOperation(doc)(pathItem)(pathItem.trace) }\n : undefined),\n });\n\n const convertOperation =\n (doc: OpenApiV3.IDocument) =>\n (pathItem: OpenApiV3.IPath) =>\n (input: OpenApiV3.IOperation): OpenApi.IOperation => ({\n ...input,\n parameters:\n pathItem.parameters !== undefined || input.parameters !== undefined\n ? [...(pathItem.parameters ?? []), ...(input.parameters ?? [])]\n .map((p) => {\n if (!TypeChecker.isReference(p))\n return convertParameter(doc.components ?? {})(p);\n const found:\n | Omit<OpenApiV3.IOperation.IParameter, \"in\">\n | undefined = p.$ref.startsWith(\"#/components/headers/\")\n ? doc.components?.headers?.[p.$ref.split(\"/\").pop() ?? \"\"]\n : doc.components?.parameters?.[p.$ref.split(\"/\").pop() ?? \"\"];\n return found !== undefined\n ? convertParameter(doc.components ?? {})({\n ...found,\n in: \"header\",\n })\n : undefined!;\n })\n .filter((_, v) => v !== undefined)\n : undefined,\n requestBody: input.requestBody\n ? convertRequestBody(doc)(input.requestBody)\n : undefined,\n responses: input.responses\n ? Object.fromEntries(\n Object.entries(input.responses)\n .filter(([_, v]) => v !== undefined)\n .map(\n ([key, value]) => [key, convertResponse(doc)(value)!] as const,\n )\n .filter(([_, v]) => v !== undefined),\n )\n : undefined,\n });\n\n const convertParameter =\n (components: OpenApiV3.IComponents) =>\n (\n input: OpenApiV3.IOperation.IParameter,\n ): OpenApi.IOperation.IParameter => ({\n ...input,\n schema: convertSchema(components)(input.schema),\n examples: input.examples\n ? Object.fromEntries(\n Object.entries(input.examples)\n .map(([key, value]) => [\n key,\n TypeChecker.isReference(value)\n ? components.examples?.[value.$ref.split(\"/\").pop() ?? \"\"]\n : value,\n ])\n .filter(([_, v]) => v !== undefined),\n )\n : undefined,\n });\n\n const convertRequestBody =\n (doc: OpenApiV3.IDocument) =>\n (\n input:\n | OpenApiV3.IOperation.IRequestBody\n | OpenApiV3.IJsonSchema.IReference<`#/components/requestBodies/${string}`>,\n ): OpenApi.IOperation.IRequestBody | undefined => {\n if (TypeChecker.isReference(input)) {\n const found: OpenApiV3.IOperation.IRequestBody | undefined =\n doc.components?.requestBodies?.[input.$ref.split(\"/\").pop() ?? \"\"];\n if (found === undefined) return undefined;\n input = found;\n }\n return {\n ...input,\n content: input.content\n ? convertContent(doc.components ?? {})(input.content)\n : undefined,\n };\n };\n\n const convertResponse =\n (doc: OpenApiV3.IDocument) =>\n (\n input:\n | OpenApiV3.IOperation.IResponse\n | OpenApiV3.IJsonSchema.IReference<`#/components/responses/${string}`>,\n ): OpenApi.IOperation.IResponse | undefined => {\n if (TypeChecker.isReference(input)) {\n const found: OpenApiV3.IOperation.IResponse | undefined =\n doc.components?.responses?.[input.$ref.split(\"/\").pop() ?? \"\"];\n if (found === undefined) return undefined;\n input = found;\n }\n return {\n ...input,\n content: input.content\n ? convertContent(doc.components ?? {})(input.content)\n : undefined,\n headers: input.headers\n ? Object.fromEntries(\n Object.entries(input.headers)\n .filter(([_, v]) => v !== undefined)\n .map(\n ([key, value]) =>\n [\n key,\n (() => {\n if (TypeChecker.isReference(value) === false)\n return convertParameter(doc.components ?? {})({\n ...value,\n in: \"header\",\n });\n const found:\n | Omit<OpenApiV3.IOperation.IParameter, \"in\">\n | undefined = value.$ref.startsWith(\n \"#/components/headers/\",\n )\n ? doc.components?.headers?.[\n value.$ref.split(\"/\").pop() ?? \"\"\n ]\n : undefined;\n return found !== undefined\n ? convertParameter(doc.components ?? {})({\n ...found,\n in: \"header\",\n })\n : undefined!;\n })(),\n ] as const,\n )\n .filter(([_, v]) => v !== undefined),\n )\n : undefined,\n };\n };\n\n const convertContent =\n (components: OpenApiV3.IComponents) =>\n (\n record: Record<string, OpenApiV3.IOperation.IMediaType>,\n ): Record<string, OpenApi.IOperation.IMediaType> =>\n Object.fromEntries(\n Object.entries(record)\n .filter(([_, v]) => v !== undefined)\n .map(\n ([key, value]) =>\n [\n key,\n {\n ...value,\n schema: value.schema\n ? convertSchema(components)(value.schema)\n : undefined,\n examples: value.examples\n ? Object.fromEntries(\n Object.entries(value.examples)\n .map(([key, value]) => [\n key,\n TypeChecker.isReference(value)\n ? components.examples?.[\n value.$ref.split(\"/\").pop() ?? \"\"\n ]\n : value,\n ])\n .filter(([_, v]) => v !== undefined),\n )\n : undefined,\n },\n ] as const,\n ),\n );\n\n /* -----------------------------------------------------------\n DEFINITIONS\n ----------------------------------------------------------- */\n export const convertComponents = (\n input: OpenApiV3.IComponents,\n ): OpenApi.IComponents => ({\n schemas: Object.fromEntries(\n Object.entries(input.schemas ?? {})\n .filter(([_, v]) => v !== undefined)\n .map(([key, value]) => [key, convertSchema(input)(value)]),\n ),\n securitySchemes: input.securitySchemes,\n });\n\n export const convertSchema =\n (components: OpenApiV3.IComponents) =>\n (input: OpenApiV3.IJsonSchema): OpenApi.IJsonSchema => {\n const nullable: { value: boolean; default?: null } = {\n value: false,\n default: undefined,\n };\n const union: OpenApi.IJsonSchema[] = [];\n const attribute: OpenApi.IJsonSchema.__IAttribute = {\n title: input.title,\n description: input.description,\n ...Object.fromEntries(\n Object.entries(input).filter(\n ([key, value]) => key.startsWith(\"x-\") && value !== undefined,\n ),\n ),\n example: input.example,\n examples: input.examples,\n };\n const visit = (schema: OpenApiV3.IJsonSchema): void => {\n // NULLABLE PROPERTY\n if (\n (schema as OpenApiV3.IJsonSchema.__ISignificant<any>).nullable ===\n true\n ) {\n nullable.value ||= true;\n if ((schema as OpenApiV3.IJsonSchema.INumber).default === null)\n nullable.default = null;\n }\n if (\n Array.isArray((schema as OpenApiV3.IJsonSchema.INumber).enum) &&\n (schema as OpenApiV3.IJsonSchema.INumber).enum?.length &&\n (schema as OpenApiV3.IJsonSchema.INumber).enum?.some(\n (e) => e === null,\n )\n )\n nullable.value ||= true;\n // UNION TYPE CASE\n if (TypeChecker.isAnyOf(schema)) schema.anyOf.forEach(visit);\n else if (TypeChecker.isOneOf(schema)) schema.oneOf.forEach(visit);\n else if (TypeChecker.isAllOf(schema))\n if (schema.allOf.length === 1) visit(schema.allOf[0]);\n else union.push(convertAllOfSchema(components)(schema));\n // ATOMIC TYPE CASE (CONSIDER ENUM VALUES)\n else if (\n TypeChecker.isBoolean(schema) ||\n TypeChecker.isInteger(schema) ||\n TypeChecker.isNumber(schema) ||\n TypeChecker.isString(schema)\n )\n if (\n schema.enum?.length &&\n schema.enum.filter((e) => e !== null).length\n )\n union.push(\n ...schema.enum\n .filter((v) => v !== null)\n .map((value) => ({ const: value })),\n );\n else\n union.push({\n ...schema,\n default: (schema.default ?? undefined) satisfies\n | boolean\n | number\n | string\n | undefined as any,\n ...{ enum: undefined },\n });\n // INSTANCE TYPE CASE\n else if (TypeChecker.isArray(schema))\n union.push({\n ...schema,\n items: convertSchema(components)(schema.items),\n });\n else if (TypeChecker.isObject(schema))\n union.push({\n ...schema,\n ...{\n properties: schema.properties\n ? Object.fromEntries(\n Object.entries(schema.properties)\n .filter(([_, v]) => v !== undefined)\n .map(([key, value]) => [\n key,\n convertSchema(components)(value),\n ]),\n )\n : {},\n additionalProperties: schema.additionalProperties\n ? typeof schema.additionalProperties === \"object\" &&\n schema.additionalProperties !== null\n ? convertSchema(components)(schema.additionalProperties)\n : schema.additionalProperties\n : undefined,\n required: schema.required ?? [],\n },\n });\n else if (TypeChecker.isReference(schema)) union.push(schema);\n else union.push(schema);\n };\n\n visit(input);\n if (\n nullable.value === true &&\n !union.some((e) => (e as OpenApi.IJsonSchema.INull).type === \"null\")\n )\n union.push({\n type: \"null\",\n default: nullable.default,\n });\n if (\n union.length === 2 &&\n union.filter((x) => OpenApiTypeChecker.isNull(x)).length === 1\n ) {\n const type: OpenApi.IJsonSchema = union.filter(\n (x) => OpenApiTypeChecker.isNull(x) === false,\n )[0];\n for (const key of [\n \"title\",\n \"description\",\n \"deprecated\",\n \"example\",\n \"examples\",\n ] as const)\n if (type[key] !== undefined) delete type[key];\n }\n return {\n ...(union.length === 0\n ? { type: undefined }\n : union.length === 1\n ? { ...union[0] }\n : { oneOf: union.map((u) => ({ ...u, nullable: undefined })) }),\n ...attribute,\n ...{ nullable: undefined },\n };\n };\n\n const convertAllOfSchema =\n (components: OpenApiV3.IComponents) =>\n (input: OpenApiV3.IJsonSchema.IAllOf): OpenApi.IJsonSchema => {\n const objects: Array<OpenApiV3.IJsonSchema.IObject | null> =\n input.allOf.map((schema) => retrieveObject(components)(schema));\n if (objects.some((obj) => obj === null))\n return {\n type: undefined,\n ...{\n allOf: undefined,\n },\n };\n return {\n ...input,\n type: \"object\",\n properties: Object.fromEntries(\n objects\n .map((o) => Object.entries(o?.properties ?? {}))\n .flat()\n .map(\n ([key, value]) =>\n [key, convertSchema(components)(value)] as const,\n ),\n ),\n ...{\n allOf: undefined,\n required: [...new Set(objects.map((o) => o?.required ?? []).flat())],\n },\n };\n };\n\n const retrieveObject =\n (components: OpenApiV3.IComponents) =>\n (\n input: OpenApiV3.IJsonSchema,\n visited: Set<OpenApiV3.IJsonSchema> = new Set(),\n ): OpenApiV3.IJsonSchema.IObject | null => {\n if (TypeChecker.isObject(input))\n return input.properties !== undefined && !input.additionalProperties\n ? input\n : null;\n else if (visited.has(input)) return null;\n else visited.add(input);\n\n if (TypeChecker.isReference(input))\n return retrieveObject(components)(\n components.schemas?.[input.$ref.split(\"/\").pop() ?? \"\"] ?? {},\n visited,\n );\n return null;\n };\n\n export namespace TypeChecker {\n export const isBoolean = (\n schema: OpenApiV3.IJsonSchema,\n ): schema is OpenApiV3.IJsonSchema.IBoolean =>\n (schema as OpenApiV3.IJsonSchema.IBoolean).type === \"boolean\";\n export const isInteger = (\n schema: OpenApiV3.IJsonSchema,\n ): schema is OpenApiV3.IJsonSchema.IInteger =>\n (schema as OpenApiV3.IJsonSchema.IInteger).type === \"integer\";\n export const isNumber = (\n schema: OpenApiV3.IJsonSchema,\n ): schema is OpenApiV3.IJsonSchema.INumber =>\n (schema as OpenApiV3.IJsonSchema.INumber).type === \"number\";\n export const isString = (\n schema: OpenApiV3.IJsonSchema,\n ): schema is OpenApiV3.IJsonSchema.IString =>\n (schema as OpenApiV3.IJsonSchema.IString).type === \"string\";\n export const isArray = (\n schema: OpenApiV3.IJsonSchema,\n ): schema is OpenApiV3.IJsonSchema.IArray =>\n (schema as OpenApiV3.IJsonSchema.IArray).type === \"array\";\n export const isObject = (\n schema: OpenApiV3.IJsonSchema,\n ): schema is OpenApiV3.IJsonSchema.IObject =>\n (schema as OpenApiV3.IJsonSchema.IObject).type === \"object\";\n export const isReference = (\n schema: OpenApiV3.IJsonSchema,\n ): schema is OpenApiV3.IJsonSchema.IReference =>\n (schema as OpenApiV3.IJsonSchema.IReference).$ref !== undefined;\n export const isAllOf = (\n schema: OpenApiV3.IJsonSchema,\n ): schema is OpenApiV3.IJsonSchema.IAllOf =>\n (schema as OpenApiV3.IJsonSchema.IAllOf).allOf !== undefined;\n export const isAnyOf = (\n schema: OpenApiV3.IJsonSchema,\n ): schema is OpenApiV3.IJsonSchema.IAnyOf =>\n (schema as OpenApiV3.IJsonSchema.IAnyOf).anyOf !== undefined;\n export const isOneOf = (\n schema: OpenApiV3.IJsonSchema,\n ): schema is OpenApiV3.IJsonSchema.IOneOf =>\n (schema as OpenApiV3.IJsonSchema.IOneOf).oneOf !== undefined;\n export const isNullOnly = (\n schema: OpenApiV3.IJsonSchema,\n ): schema is OpenApiV3.IJsonSchema.INullOnly =>\n (schema as OpenApiV3.IJsonSchema.INullOnly).type === \"null\";\n }\n}\n"],"names":["OpenApiV3Upgrader","convert","input","components","convertComponents","paths","Object","fromEntries","entries","filter","_","v","undefined","map","key","value","convertPathItem","openapi","doc","pathItem","get","convertOperation","put","post","delete","options","head","patch","trace","parameters","p","TypeChecker","isReference","convertParameter","found","$ref","startsWith","headers","split","pop","in","requestBody","convertRequestBody","responses","convertResponse","schema","convertSchema","examples","requestBodies","content","convertContent","record","schemas","securitySchemes","nullable","default","union","attribute","title","description","example","visit","Array","isArray","enum","length","some","e","isAnyOf","anyOf","forEach","isOneOf","oneOf","isAllOf","allOf","push","convertAllOfSchema","isBoolean","isInteger","isNumber","isString","const","items","isObject","properties","additionalProperties","required","type","x","OpenApiTypeChecker","isNull","u","objects","retrieveObject","obj","o","flat","Set","visited","has","add","isNullOnly"],"mappings":";;AAIM,IAAWA;;CAAjB,SAAiBA;IACFA,kBAAAC,UAAWC,UAAmD;WACtEA;QACHC,YAAYH,kBAAAI,kBAAkBF,MAAMC,cAAc,CAAA;QAClDE,OAAOH,MAAMG,QACTC,OAAOC,YACLD,OAAOE,QAAQN,MAAMG,OAClBI,QAAO,EAAEC,GAAGC,OAAOA,MAAMC,YACzBC,KACC,EAAEC,KAAKC,WAAW,EAACD,KAAKE,gBAAgBd,MAAhBc,CAAuBD,cAGrDH;QACJK,SAAS;QACT,qBAAqB;;IAMvB,MAAMD,kBACHE,OACAC,aAA8C;WACzCA;WACAA,SAASC,MACT;YAAEA,KAAKC,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASC;YAChDR;WACAO,SAASG,MACT;YAAEA,KAAKD,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASG;YAChDV;WACAO,SAASI,OACT;YAAEA,MAAMF,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASI;YACjDX;WACAO,SAASK,SACT;YAAEA,QAAQH,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASK;YACnDZ;WACAO,SAASM,UACT;YAAEA,SAASJ,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASM;YACpDb;WACAO,SAASO,OACT;YAAEA,MAAML,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASO;YACjDd;WACAO,SAASQ,QACT;YAAEA,OAAON,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASQ;YAClDf;WACAO,SAASS,QACT;YAAEA,OAAOP,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASS;YAClDhB;;IAGR,MAAMS,mBACHH,OACAC,YACAjB,UAAqD;WACjDA;QACH2B,YACEV,SAASU,eAAejB,aAAaV,MAAM2B,eAAejB,YACtD,KAAKO,SAASU,cAAc,OAAS3B,MAAM2B,cAAc,KACtDhB,KAAKiB;YACJ,KAAKC,YAAYC,YAAYF,IAC3B,OAAOG,iBAAiBf,IAAIf,cAAc,CAAE,EAArC8B,CAAuCH;YAChD,MAAMI,QAEUJ,EAAEK,KAAKC,WAAW,2BAC9BlB,IAAIf,YAAYkC,UAAUP,EAAEK,KAAKG,MAAM,KAAKC,SAAS,MACrDrB,IAAIf,YAAY0B,aAAaC,EAAEK,KAAKG,MAAM,KAAKC,SAAS;YAC5D,OAAOL,UAAUtB,YACbqB,iBAAiBf,IAAIf,cAAc,CAAA,EAAnC8B,CAAuC;mBAClCC;gBACHM,IAAI;iBAEN5B;AAAU,YAEfH,QAAO,CAACC,GAAGC,MAAMA,MAAMC,cAC1BA;QACN6B,aAAavC,MAAMuC,cACfC,mBAAmBxB,IAAnBwB,CAAwBxC,MAAMuC,eAC9B7B;QACJ+B,WAAWzC,MAAMyC,YACbrC,OAAOC,YACLD,OAAOE,QAAQN,MAAMyC,WAClBlC,QAAO,EAAEC,GAAGC,OAAOA,MAAMC,YACzBC,KACC,EAAEC,KAAKC,WAAW,EAACD,KAAK8B,gBAAgB1B,IAAhB0B,CAAqB7B,WAE9CN,QAAO,EAAEC,GAAGC,OAAOA,MAAMC,eAE9BA;;IAGR,MAAMqB,mBACH9B,cAECD,UACmC;WAChCA;QACH2C,QAAQ7C,kBAAA8C,cAAc3C,WAAdH,CAA0BE,MAAM2C;QACxCE,UAAU7C,MAAM6C,WACZzC,OAAOC,YACLD,OAAOE,QAAQN,MAAM6C,UAClBlC,KAAI,EAAEC,KAAKC,WAAW,EACrBD,KACAiB,YAAYC,YAAYjB,SACpBZ,WAAW4C,WAAWhC,MAAMoB,KAAKG,MAAM,KAAKC,SAAS,MACrDxB,UAELN,QAAO,EAAEC,GAAGC,OAAOA,MAAMC,eAE9BA;;IAGR,MAAM8B,qBACHxB,OAEChB;QAIA,IAAI6B,YAAYC,YAAY9B,QAAQ;YAClC,MAAMgC,QACJhB,IAAIf,YAAY6C,gBAAgB9C,MAAMiC,KAAKG,MAAM,KAAKC,SAAS;YACjE,IAAIL,UAAUtB,WAAW,OAAOA;YAChCV,QAAQgC;;QAEV,OAAO;eACFhC;YACH+C,SAAS/C,MAAM+C,UACXC,eAAehC,IAAIf,cAAc,CAAA,EAAjC+C,CAAqChD,MAAM+C,WAC3CrC;;AACL;IAGL,MAAMgC,kBACH1B,OAEChB;QAIA,IAAI6B,YAAYC,YAAY9B,QAAQ;YAClC,MAAMgC,QACJhB,IAAIf,YAAYwC,YAAYzC,MAAMiC,KAAKG,MAAM,KAAKC,SAAS;YAC7D,IAAIL,UAAUtB,WAAW,OAAOA;YAChCV,QAAQgC;;QAEV,OAAO;eACFhC;YACH+C,SAAS/C,MAAM+C,UACXC,eAAehC,IAAIf,cAAc,CAAA,EAAjC+C,CAAqChD,MAAM+C,WAC3CrC;YACJyB,SAASnC,MAAMmC,UACX/B,OAAOC,YACLD,OAAOE,QAAQN,MAAMmC,SAClB5B,QAAO,EAAEC,GAAGC,OAAOA,MAAMC,YACzBC,KACC,EAAEC,KAAKC,WACL,EACED,KACA;gBACE,IAAIiB,YAAYC,YAAYjB,WAAW,OACrC,OAAOkB,iBAAiBf,IAAIf,cAAc,CAAE,EAArC8B,CAAuC;uBACzClB;oBACHyB,IAAI;;gBAER,MAAMN,QAEUnB,MAAMoB,KAAKC,WACzB,2BAEElB,IAAIf,YAAYkC,UACdtB,MAAMoB,KAAKG,MAAM,KAAKC,SAAS,MAEjC3B;gBACJ,OAAOsB,UAAUtB,YACbqB,iBAAiBf,IAAIf,cAAc,CAAA,EAAnC8B,CAAuC;uBAClCC;oBACHM,IAAI;qBAEN5B;AACL,cArBD,OAwBLH,QAAO,EAAEC,GAAGC,OAAOA,MAAMC,eAE9BA;;AACL;IAGL,MAAMsC,iBACH/C,cAECgD,UAEA7C,OAAOC,YACLD,OAAOE,QAAQ2C,QACZ1C,QAAO,EAAEC,GAAGC,OAAOA,MAAMC,YACzBC,KACC,EAAEC,KAAKC,WACL,EACED,KACA;WACKC;QACH8B,QAAQ9B,MAAM8B,SACV7C,kBAAA8C,cAAc3C,WAAdH,CAA0Be,MAAM8B,UAChCjC;QACJmC,UAAUhC,MAAMgC,WACZzC,OAAOC,YACLD,OAAOE,QAAQO,MAAMgC,UAClBlC,KAAI,EAAEC,KAAKC,WAAW,EACrBD,KACAiB,YAAYC,YAAYjB,SACpBZ,WAAW4C,WACThC,MAAMoB,KAAKG,MAAM,KAAKC,SAAS,MAEjCxB,UAELN,QAAO,EAAEC,GAAGC,OAAOA,MAAMC,eAE9BA;;IASPZ,kBAAAI,oBACXF,UACyB;QACzBkD,SAAS9C,OAAOC,YACdD,OAAOE,QAAQN,MAAMkD,WAAW,CAAE,GAC/B3C,QAAO,EAAEC,GAAGC,OAAOA,MAAMC,YACzBC,KAAI,EAAEC,KAAKC,WAAW,EAACD,KAAKd,kBAAA8C,cAAc5C,MAAdF,CAAqBe;QAEtDsC,iBAAiBnD,MAAMmD;;IAGZrD,kBAAa8C,gBACvB3C,cACAD;QACC,MAAMoD,WAA+C;YACnDvC,OAAO;YACPwC,SAAS3C;;QAEX,MAAM4C,QAA+B;QACrC,MAAMC,YAA8C;YAClDC,OAAOxD,MAAMwD;YACbC,aAAazD,MAAMyD;eAChBrD,OAAOC,YACRD,OAAOE,QAAQN,OAAOO,QACpB,EAAEK,KAAKC,WAAWD,IAAIsB,WAAW,SAASrB,UAAUH;YAGxDgD,SAAS1D,MAAM0D;YACfb,UAAU7C,MAAM6C;;QAElB,MAAMc,QAAShB;YAEb,IACGA,OAAqDS,aACtD,MACA;gBACAA,SAASvC,UAATuC,SAASvC,QAAU;gBACnB,IAAK8B,OAAyCU,YAAY,MACxDD,SAASC,UAAU;;YAEvB,IACEO,MAAMC,QAASlB,OAAyCmB,SACvDnB,OAAyCmB,MAAMC,UAC/CpB,OAAyCmB,MAAME,MAC7CC,KAAMA,MAAM,QAGfb,SAASvC,UAATuC,SAASvC,QAAU;YAErB,IAAIgB,YAAYqC,QAAQvB,SAASA,OAAOwB,MAAMC,QAAQT,aACjD,IAAI9B,YAAYwC,QAAQ1B,SAASA,OAAO2B,MAAMF,QAAQT,aACtD,IAAI9B,YAAY0C,QAAQ5B,SAC3B,IAAIA,OAAO6B,MAAMT,WAAW,GAAGJ,MAAMhB,OAAO6B,MAAM,UAC7ClB,MAAMmB,KAAKC,mBAAmBzE,WAAnByE,CAA+B/B,eAE5C,IACHd,YAAY8C,UAAUhC,WACtBd,YAAY+C,UAAUjC,WACtBd,YAAYgD,SAASlC,WACrBd,YAAYiD,SAASnC,SAErB,IACEA,OAAOmB,MAAMC,UACbpB,OAAOmB,KAAKvD,QAAQ0D,KAAMA,MAAM,OAAMF,QAEtCT,MAAMmB,QACD9B,OAAOmB,KACPvD,QAAQE,KAAMA,MAAM,OACpBE,KAAKE,UAAW;gBAAEkE,OAAOlE;wBAG9ByC,MAAMmB,KAAK;mBACN9B;gBACHU,SAAUV,OAAOU,WAAW3C;mBAKzB;oBAAEoD,MAAMpD;;qBAGZ,IAAImB,YAAYgC,QAAQlB,SAC3BW,MAAMmB,KAAK;mBACN9B;gBACHqC,OAAOlF,kBAAA8C,cAAc3C,WAAdH,CAA0B6C,OAAOqC;qBAEvC,IAAInD,YAAYoD,SAAStC,SAC5BW,MAAMmB,KAAK;mBACN9B;mBACA;oBACDuC,YAAYvC,OAAOuC,aACf9E,OAAOC,YACLD,OAAOE,QAAQqC,OAAOuC,YACnB3E,QAAO,EAAEC,GAAGC,OAAOA,MAAMC,YACzBC,KAAI,EAAEC,KAAKC,WAAW,EACrBD,KACAd,kBAAA8C,cAAc3C,WAAdH,CAA0Be,cAGhC,CAAE;oBACNsE,sBAAsBxC,OAAOwC,8BAClBxC,OAAOwC,yBAAyB,YACvCxC,OAAOwC,yBAAyB,OAC9BrF,kBAAA8C,cAAc3C,WAAdH,CAA0B6C,OAAOwC,wBACjCxC,OAAOwC,uBACTzE;oBACJ0E,UAAUzC,OAAOyC,YAAY;;qBAG9B,IAAIvD,YAAYC,YAAYa,SAASW,MAAMmB,KAAK9B,cAChDW,MAAMmB,KAAK9B;AAAO;QAGzBgB,MAAM3D;QACN,IACEoD,SAASvC,UAAU,SAClByC,MAAMU,MAAMC,KAAOA,EAAgCoB,SAAS,UAE7D/B,MAAMmB,KAAK;YACTY,MAAM;YACNhC,SAASD,SAASC;;QAEtB,IACEC,MAAMS,WAAW,KACjBT,MAAM/C,QAAQ+E,KAAMC,mBAAmBC,OAAOF,KAAIvB,WAAW,GAC7D;YACA,MAAMsB,OAA4B/B,MAAM/C,QACrC+E,KAAMC,mBAAmBC,OAAOF,OAAO,QACxC;YACF,KAAK,MAAM1E,OAAO,EAChB,SACA,eACA,cACA,WACA,cAEA,IAAIyE,KAAKzE,SAASF,kBAAkB2E,KAAKzE;;QAE7C,OAAO;eACD0C,MAAMS,WAAW,IACjB;gBAAEsB,MAAM3E;gBACR4C,MAAMS,WAAW,IACf;mBAAKT,MAAM;gBACX;gBAAEgB,OAAOhB,MAAM3C,KAAK8E,MAAC;uBAAWA;oBAAGrC,UAAU1C;;;eAChD6C;eACA;gBAAEH,UAAU1C;;;AAChB;IAGL,MAAMgE,qBACHzE,cACAD;QACC,MAAM0F,UACJ1F,MAAMwE,MAAM7D,KAAKgC,UAAWgD,eAAe1F,WAAf0F,CAA2BhD;QACzD,IAAI+C,QAAQ1B,MAAM4B,OAAQA,QAAQ,QAChC,OAAO;YACLP,MAAM3E;eACH;gBACD8D,OAAO9D;;;QAGb,OAAO;eACFV;YACHqF,MAAM;YACNH,YAAY9E,OAAOC,YACjBqF,QACG/E,KAAKkF,KAAMzF,OAAOE,QAAQuF,GAAGX,cAAc,MAC3CY,OACAnF,KACC,EAAEC,KAAKC,WACL,EAACD,KAAKd,kBAAA8C,cAAc3C,WAAdH,CAA0Be;eAGrC;gBACD2D,OAAO9D;gBACP0E,UAAU,KAAI,IAAIW,IAAIL,QAAQ/E,KAAKkF,KAAMA,GAAGT,YAAY,KAAIU;;;AAE/D;IAGL,MAAMH,iBACH1F,cACD,CACED,OACAgG,UAAsC,IAAID;QAE1C,IAAIlE,YAAYoD,SAASjF,QACvB,OAAOA,MAAMkF,eAAexE,cAAcV,MAAMmF,uBAC5CnF,QACA,WACD,IAAIgG,QAAQC,IAAIjG,QAAQ,OAAO,WAC/BgG,QAAQE,IAAIlG;QAEjB,IAAI6B,YAAYC,YAAY9B,QAC1B,OAAO2F,eAAe1F,WAAf0F,CACL1F,WAAWiD,UAAUlD,MAAMiC,KAAKG,MAAM,KAAKC,SAAS,OAAO,CAAA,GAC3D2D;QAEJ,OAAO;AAAI;IAGf,IAAiBnE;KAAjB,SAAiBA;QACFA,YAAS8C,YACpBhC,UAECA,OAA0C0C,SAAS;QACzCxD,YAAS+C,YACpBjC,UAECA,OAA0C0C,SAAS;QACzCxD,YAAQgD,WACnBlC,UAECA,OAAyC0C,SAAS;QACxCxD,YAAQiD,WACnBnC,UAECA,OAAyC0C,SAAS;QACxCxD,YAAOgC,UAClBlB,UAECA,OAAwC0C,SAAS;QACvCxD,YAAQoD,WACnBtC,UAECA,OAAyC0C,SAAS;QACxCxD,YAAWC,cACtBa,UAECA,OAA4CV,SAASvB;QAC3CmB,YAAO0C,UAClB5B,UAECA,OAAwC6B,UAAU9D;QACxCmB,YAAOqC,UAClBvB,UAECA,OAAwCwB,UAAUzD;QACxCmB,YAAOwC,UAClB1B,UAECA,OAAwC2B,UAAU5D;QACxCmB,YAAUsE,aACrBxD,UAECA,OAA2C0C,SAAS;AACxD,MA7CD,CAAiBxD,cAAA/B,kBAAW+B,gBAAX/B,gCA6ChB,CAAA;AACF,EA1dD,CAAiBA,sBAAAA,oBA0dhB,CAAA;;"}