{"version":3,"file":"use-editor-plugin2.mjs","sources":["../../../../../../../../packages/components/editor/src/hooks/use-editor-plugin.ts"],"sourcesContent":["import { type ComputedRef, computed, ref } from 'vue'\nimport sanitizeHtml from 'sanitize-html'\nimport { type UseRequestReturn } from '@tav-ui/components/file/src/hooks/use-request'\nimport { type EditorPluginImageUploadHandler, type EditorProps } from '../typings'\n// import { type UseApiReturn } from './use-api'\n\n// TODO: import katex for tinymce latex, see: https://stackoverflow.com/questions/76202508/how-to-add-a-custom-tinymce-plugin-with-vue3-nuxt-using-the-pluginmanager\n// TODO: support markdown for tinymce, see: https://github.com/prathamVaidya/supercode-tinymce-plugin\n\nexport function useEditorPlugin(options: {\n  mergedProps: ComputedRef<EditorProps>\n  handleApi: UseRequestReturn['handleApi']\n  apiResult: UseRequestReturn['result']\n  // editorImageVars: Record<string, any>\n  // uploadImageApiOptions: UseApiReturn['apiActions']['uploadImageApiOptions']\n}) {\n  const { mergedProps, handleApi, apiResult /*editorImageVars, uploadImageApiOptions*/ } = options\n\n  /** 高级列表，see：https://www.tiny.cloud/docs/tinymce/5/advlist/ */\n  const advlistPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/advlist'),\n    name: 'advlist',\n    options: {},\n  }\n\n  /** 锚点，see：https://www.tiny.cloud/docs/tinymce/5/anchor/ */\n  const anchorPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/anchor'),\n    name: 'anchor',\n    options: {},\n  }\n\n  /** 自动链接，see：https://www.tiny.cloud/docs/tinymce/5/autolink/ */\n  const autolinkPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/autolink'),\n    name: 'autolink',\n    options: {\n      default_link_target: '_blank',\n    },\n  }\n\n  /**\n   * 编辑器高度自适应，see：https://www.tiny.cloud/docs/tinymce/5/autoresize/\n   * 1. 引入此插件时，Init 里设置的 height 将失效\n   */\n  const autoresizePlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/autoresize'),\n    name: 'autoresize',\n    options: {},\n  }\n\n  /** 自动存稿，see：https://www.tiny.cloud/docs/tinymce/5/autosave/ */\n  const autosavePlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/autosave'),\n    name: 'autosave',\n    options: {\n      // autosave_restore_when_empty: true, // 如果为 true 打开/关闭 弹窗后会保留结果暂时的富文本编辑都是一次性的，暂时不开启\n    },\n  }\n\n  /** 特殊字符，see：https://www.tiny.cloud/docs/tinymce/5/charmap/ */\n  const charmapPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/charmap'),\n    name: 'charmap',\n    options: {},\n  }\n\n  /** 代码，see：https://www.tiny.cloud/docs/tinymce/5/code/ */\n  const codePlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/code'),\n    name: 'code',\n    options: {},\n  }\n\n  /** 代码示例，see：https://www.tiny.cloud/docs/tinymce/5/code/ */\n  const codesamplePlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/codesample'),\n    name: 'codesample',\n    options: {},\n  }\n\n  /** 文字方向，see：https://www.tiny.cloud/docs/tinymce/5/directionality/ */\n  const directionalityPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/directionality'),\n    name: 'directionality',\n    options: {},\n  }\n\n  /** 表情，see：https://www.tiny.cloud/docs/tinymce/5/emoticons/ */\n  const emoticonsPlugin: Record<string, any> = {\n    setup: () => {\n      // @ts-ignore\n      import('tinymce/plugins/emoticons')\n      // @ts-ignore\n      import('tinymce/plugins/emoticons/js/emojis')\n    },\n    name: 'emoticons',\n    options: {},\n  }\n\n  /** see：https://www.tiny.cloud/docs/tinymce/5/fullpage/ */\n  const fullpagePlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/fullpage'),\n    name: 'fullpage',\n    options: {},\n  }\n\n  /** 全屏，see：https://www.tiny.cloud/docs/tinymce/5/fullscreen/ */\n  const fullscreenPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/fullscreen'),\n    name: 'fullscreen',\n    options: {},\n  }\n\n  /** 帮助，see：https://www.tiny.cloud/docs/tinymce/5/help/ */\n  const helpPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/help'),\n    name: 'help',\n    options: {\n      help_tabs: [\n        'shortcuts',\n        // \"keyboardnav\",\n        // \"plugins\",\n        // \"versions\"\n      ],\n    },\n  }\n\n  /** 分割线，see：https://www.tiny.cloud/docs/tinymce/5/hr/ */\n  const hrPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/hr'),\n    name: 'hr',\n    options: {},\n  }\n\n  /** 图片，see：https://www.tiny.cloud/docs/tinymce/5/image/ */\n  const imagePlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/image'),\n    name: 'image',\n    options: {\n      images_reuse_filename: true,\n      images_upload_handler: (...args: any[]) =>\n        editorPluginImageUploadHandler(\n          mergedProps,\n          handleApi,\n          apiResult,\n          // editorImageVars,\n          // uploadImageApiOptions,\n          args[0],\n          args[1],\n          args[2]\n        ),\n    },\n  }\n  /** 图片编辑，see：https://www.tiny.cloud/docs/tinymce/5/editimage/ */\n  const imagetoolsPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/imagetools'),\n    name: 'imagetools',\n    options: {},\n  }\n\n  /** 导入 css，see：https://www.tiny.cloud/docs/tinymce/5/importcss/ */\n  const importcssPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/importcss'),\n    name: 'importcss',\n    options: {},\n  }\n\n  /** 时间/日期，see：https://www.tiny.cloud/docs/tinymce/5/insertdatetime/ */\n  const insertdatetimePlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/insertdatetime'),\n    name: 'insertdatetime',\n    options: {},\n  }\n\n  /** 邮件模版标准 html 输出，see：https://www.tiny.cloud/docs/tinymce/5/legacyoutput/ */\n  const legacyoutputPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/legacyoutput'),\n    name: 'legacyoutput',\n    options: {},\n  }\n\n  /** 超链接，see：https://www.tiny.cloud/docs/tinymce/5/link/ */\n  const linkPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/link'),\n    name: 'link',\n    options: {\n      default_link_target: '_blank',\n    },\n  }\n\n  /** 列表，see：https://www.tiny.cloud/docs/tinymce/5/lists/ */\n  const listsPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/lists'),\n    name: 'lists',\n    options: {},\n  }\n\n  /** 媒体，see：https://www.tiny.cloud/docs/tinymce/5/media/ */\n  const mediaPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/media'),\n    name: 'media',\n    options: {},\n  }\n\n  /** 不间断空格，see：https://www.tiny.cloud/docs/tinymce/5/nonbreaking/ */\n  const nonbreakingPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/nonbreaking'),\n    name: 'nonbreaking',\n    options: {},\n  }\n\n  /** 无法编辑控制，see：https://www.tiny.cloud/docs/tinymce/5/noneditable/ */\n  const noneditablePlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/noneditable'),\n    name: 'noneditable',\n    options: {},\n  }\n\n  /** 分页符，see：https://www.tiny.cloud/docs/tinymce/5/pagebreak/ */\n  const pagebreakPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/pagebreak'),\n    name: 'pagebreak',\n    options: {},\n  }\n\n  /** 粘贴内容处理，see：https://www.tiny.cloud/docs/tinymce/5/paste/ */\n  const pastePlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/paste'),\n    name: 'paste',\n    options: {\n      paste_block_drop: false,\n      paste_filter_drop: false,\n      // paste_as_text: true, // 如果只想保留文字需要开启\n      paste_merge_formats: false,\n      paste_preprocess: editorPluginPastePreprocessHandler,\n    },\n  }\n\n  /** 预览，see：https://www.tiny.cloud/docs/tinymce/5/preview/ */\n  const previewPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/preview'),\n    name: 'preview',\n    options: {},\n  }\n\n  /** 打印，see：https://www.tiny.cloud/docs/tinymce/5/print/ */\n  const printPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/print'),\n    name: 'print',\n    options: {},\n  }\n\n  /** 快捷栏，see：https://www.tiny.cloud/docs/tinymce/5/quickbars/ */\n  const quickbarsPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/quickbars'),\n    name: 'quickbars',\n    options: {\n      quickbars_insert_toolbar: '',\n      quickbars_selection_toolbar: 'formatselect bold italic | aligns blockquote',\n      quickbars_image_toolbar: '', //TODO: ?\n    },\n  }\n\n  /** 保存，see：https://www.tiny.cloud/docs/tinymce/5/save/ */\n  const savePlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/save'),\n    name: 'save',\n    options: {},\n  }\n\n  /** 查找/替换，see：https://www.tiny.cloud/docs/tinymce/5/searchreplace/ */\n  const searchreplacePlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/searchreplace'),\n    name: 'searchreplace',\n    options: {},\n  }\n\n  /**\n   * 拼写检查，see：https://www.tiny.cloud/docs/tinymce/5/spellchecker/\n   * 1. 暂不支持中文\n   */\n  const spellcheckerPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/spellchecker'),\n    name: 'spellchecker',\n    options: {},\n  }\n\n  /** 聚焦，see：https://www.tiny.cloud/docs/tinymce/5/tabfocus/ */\n  const tabfocusPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/tabfocus'),\n    name: 'tabfocus',\n    options: {},\n  }\n\n  /** 表格，see：https://www.tiny.cloud/docs/tinymce/5/table/ */\n  const tablePlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/table'),\n    name: 'table',\n    options: {},\n  }\n\n  /** 模版，see：https://www.tiny.cloud/docs/tinymce/5/template/ */\n  const templatePlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/template'),\n    name: 'template',\n    options: {},\n  }\n\n  /** md 支持，see：https://www.tiny.cloud/docs/tinymce/5/textpattern/ */\n  const textpatternPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/textpattern'),\n    name: 'textpattern',\n    options: {},\n  }\n\n  /** 大纲，see：https://www.tiny.cloud/docs/tinymce/5/tableofcontents/ */\n  const tocPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/toc'),\n    name: 'toc',\n    options: {},\n  }\n\n  /** 元素范围 see：https://www.tiny.cloud/docs/tinymce/5/visualblocks/ */\n  const visualblocksPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/visualblocks'),\n    name: 'visualblocks',\n    options: {},\n  }\n  /** 可见字符，see：https://www.tiny.cloud/docs/tinymce/5/visualchars/ */\n  const visualcharsPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/visualchars'),\n    name: 'visualchars',\n    options: {},\n  }\n\n  /** 字数统计，see：https://www.tiny.cloud/docs/tinymce/5/wordcount/ */\n  const wordcountPlugin: Record<string, any> = {\n    // @ts-ignore\n    setup: () => import('tinymce/plugins/wordcount'),\n    name: 'wordcount',\n    options: {},\n  }\n\n  const plugins = [\n    advlistPlugin,\n    anchorPlugin,\n    autolinkPlugin,\n    autoresizePlugin,\n    autosavePlugin,\n    charmapPlugin,\n    codePlugin,\n    codesamplePlugin,\n    directionalityPlugin,\n    emoticonsPlugin,\n    fullpagePlugin,\n    fullscreenPlugin,\n    helpPlugin,\n    hrPlugin,\n    imagePlugin,\n    imagetoolsPlugin,\n    importcssPlugin,\n    insertdatetimePlugin,\n    legacyoutputPlugin,\n    linkPlugin,\n    listsPlugin,\n    mediaPlugin,\n    nonbreakingPlugin,\n    noneditablePlugin,\n    pagebreakPlugin,\n    pastePlugin,\n    previewPlugin,\n    printPlugin,\n    quickbarsPlugin,\n    savePlugin,\n    searchreplacePlugin,\n    spellcheckerPlugin,\n    tabfocusPlugin,\n    tablePlugin,\n    templatePlugin,\n    textpatternPlugin,\n    tocPlugin,\n    visualblocksPlugin,\n    visualcharsPlugin,\n    wordcountPlugin,\n  ]\n\n  const filterPluginNames = [\n    'autoresize',\n    'autosave',\n    'charmap',\n    'codesample',\n    'emoticons',\n    'fullpage',\n    'help',\n    'image',\n    'imagetools',\n    'importcss',\n    'insertdatetime',\n    'legacyoutput',\n    'media',\n    'print',\n    'spellchecker',\n    'tabfocus',\n    'template',\n    'toc',\n    'wordcount',\n  ]\n\n  const usePlugins = plugins.filter((plugin) => !filterPluginNames.includes(plugin.name))\n\n  const isLoaded = ref(false)\n  function setupPlugins() {\n    for (let i = 0; i < usePlugins.length; i++) {\n      usePlugins[i].setup()\n    }\n    isLoaded.value = true\n  }\n\n  const pluginConfig = computed(() => {\n    const imagePlugin = usePlugins.find((usePlugin) => usePlugin.name === 'image')\n    if (imagePlugin) {\n      imagePlugin.options = {\n        ...imagePlugin.options,\n        images_file_types: mergedProps.value.imageAccept,\n      }\n    }\n\n    const imagetoolsPlugin = usePlugins.find((usePlugin) => usePlugin.name === 'imagetools')\n    if (imagetoolsPlugin) {\n      imagetoolsPlugin.options = {\n        // ...imagetoolsPlugin.options,\n        // ...(editorImageVars.urlPrefix\n        //   ? {\n        //       imagetools_cors_hosts: [\n        //         'localhost.proxyman.io',\n        //         editorImageVars.urlPrefix.split('//')[1],\n        //       ],\n        //       // imagetools_proxy: editorImageVars.urlPrefix,\n        //     }\n        //   : {}),\n      }\n    }\n\n    const usePluginNames = usePlugins.map((usePlugin) => usePlugin.name).join(' ')\n    const usePluginOptions = usePlugins.reduce((result, cur) => {\n      if (cur.options && Object.keys(cur.options).length > 0) {\n        result = {\n          ...result,\n          ...cur.options,\n        }\n      }\n      return result\n    }, {} as Record<string, any>)\n\n    return {\n      // plugins: isLoaded.value ? usePluginNames : undefined, // tinymce not support dynamic load plugin\n      plugins: usePluginNames,\n      pluginOptions: usePluginOptions,\n    }\n  })\n\n  return {\n    setupPlugins,\n    pluginConfig,\n  }\n}\n\nfunction editorPluginImageUploadHandler(\n  mergedProps: ComputedRef<EditorProps>,\n  handleApi: UseRequestReturn['handleApi'],\n  apiResult: UseRequestReturn['result'],\n  // editorImageVars: Record<string, any>,\n  // uploadImageApiOptions: UseApiReturn['apiActions']['uploadImageApiOptions'],\n  blobInfo: Parameters<EditorPluginImageUploadHandler>[0],\n  success: Parameters<EditorPluginImageUploadHandler>[1],\n  failure: Parameters<EditorPluginImageUploadHandler>[2]\n): ReturnType<EditorPluginImageUploadHandler> {\n  const file = blobInfo.blob() as unknown as File\n  // const imageOptions = uploadImageApiOptions(mergedProps.value.apiParams, [file])\n  const imageOptions = null\n  if (!imageOptions) return\n  // handleApi(imageOptions)\n  //   .then(() => {\n  //     const images = [...apiResult.value]\n  //     const imageUrl = images[0].imageOriginUrl\n  //       .replace(`\\${${editorImageVars.urlPrefixProp}}`, editorImageVars.urlPrefix)\n  //       .replace(`\\${${editorImageVars.keyProp}}`, editorImageVars.key)\n\n  //     success(imageUrl)\n  //   })\n  //   .catch((err: any) => {\n  //     failure(err)\n  //   })\n}\n\nfunction editorPluginPastePreprocessHandler(...args: any[]) {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  const [_, pasteContentinfo] = args\n  const result = sanitizeHtml(pasteContentinfo.content, {\n    allowedTags: sanitizeHtml.defaults.allowedTags.filter(\n      (at) => !['code', 'samp', 'ruby'].includes(at)\n    ),\n    allowedAttributes: {\n      ...sanitizeHtml.defaults.allowedTags.reduce((result, cur) => {\n        if (cur === 'a') {\n          result[cur] = ['href', 'name', 'target']\n        } else {\n          result[cur] = []\n        }\n        return result\n      }, {} as any),\n    },\n    disallowedTagsMode: 'discard',\n  })\n  pasteContentinfo.content = result\n}\n"],"names":[],"mappings":";;;AAEO,SAAS,eAAe,CAAC,OAAO,EAAE;AACzC,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;AACxD,EAAE,MAAM,aAAa,GAAG;AACxB,IAAI,KAAK,EAAE,MAAM,OAAO,yBAAyB,CAAC;AAClD,IAAI,IAAI,EAAE,SAAS;AACnB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,YAAY,GAAG;AACvB,IAAI,KAAK,EAAE,MAAM,OAAO,wBAAwB,CAAC;AACjD,IAAI,IAAI,EAAE,QAAQ;AAClB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,cAAc,GAAG;AACzB,IAAI,KAAK,EAAE,MAAM,OAAO,0BAA0B,CAAC;AACnD,IAAI,IAAI,EAAE,UAAU;AACpB,IAAI,OAAO,EAAE;AACb,MAAM,mBAAmB,EAAE,QAAQ;AACnC,KAAK;AACL,GAAG,CAAC;AACJ,EAAE,MAAM,gBAAgB,GAAG;AAC3B,IAAI,KAAK,EAAE,MAAM,OAAO,4BAA4B,CAAC;AACrD,IAAI,IAAI,EAAE,YAAY;AACtB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,cAAc,GAAG;AACzB,IAAI,KAAK,EAAE,MAAM,OAAO,0BAA0B,CAAC;AACnD,IAAI,IAAI,EAAE,UAAU;AACpB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,aAAa,GAAG;AACxB,IAAI,KAAK,EAAE,MAAM,OAAO,yBAAyB,CAAC;AAClD,IAAI,IAAI,EAAE,SAAS;AACnB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,UAAU,GAAG;AACrB,IAAI,KAAK,EAAE,MAAM,OAAO,sBAAsB,CAAC;AAC/C,IAAI,IAAI,EAAE,MAAM;AAChB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,gBAAgB,GAAG;AAC3B,IAAI,KAAK,EAAE,MAAM,OAAO,4BAA4B,CAAC;AACrD,IAAI,IAAI,EAAE,YAAY;AACtB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,oBAAoB,GAAG;AAC/B,IAAI,KAAK,EAAE,MAAM,OAAO,gCAAgC,CAAC;AACzD,IAAI,IAAI,EAAE,gBAAgB;AAC1B,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,eAAe,GAAG;AAC1B,IAAI,KAAK,EAAE,MAAM;AACjB,MAAM,OAAO,2BAA2B,CAAC,CAAC;AAC1C,MAAM,OAAO,qCAAqC,CAAC,CAAC;AACpD,KAAK;AACL,IAAI,IAAI,EAAE,WAAW;AACrB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,cAAc,GAAG;AACzB,IAAI,KAAK,EAAE,MAAM,OAAO,0BAA0B,CAAC;AACnD,IAAI,IAAI,EAAE,UAAU;AACpB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,gBAAgB,GAAG;AAC3B,IAAI,KAAK,EAAE,MAAM,OAAO,4BAA4B,CAAC;AACrD,IAAI,IAAI,EAAE,YAAY;AACtB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,UAAU,GAAG;AACrB,IAAI,KAAK,EAAE,MAAM,OAAO,sBAAsB,CAAC;AAC/C,IAAI,IAAI,EAAE,MAAM;AAChB,IAAI,OAAO,EAAE;AACb,MAAM,SAAS,EAAE;AACjB,QAAQ,WAAW;AACnB,OAAO;AACP,KAAK;AACL,GAAG,CAAC;AACJ,EAAE,MAAM,QAAQ,GAAG;AACnB,IAAI,KAAK,EAAE,MAAM,OAAO,oBAAoB,CAAC;AAC7C,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,WAAW,GAAG;AACtB,IAAI,KAAK,EAAE,MAAM,OAAO,uBAAuB,CAAC;AAChD,IAAI,IAAI,EAAE,OAAO;AACjB,IAAI,OAAO,EAAE;AACb,MAAM,qBAAqB,EAAE,IAAI;AACjC,MAAM,qBAAqB,EAAE,CAAC,GAAG,IAAI,KAAK,8BAA8B,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACtI,KAAK;AACL,GAAG,CAAC;AACJ,EAAE,MAAM,gBAAgB,GAAG;AAC3B,IAAI,KAAK,EAAE,MAAM,OAAO,4BAA4B,CAAC;AACrD,IAAI,IAAI,EAAE,YAAY;AACtB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,eAAe,GAAG;AAC1B,IAAI,KAAK,EAAE,MAAM,OAAO,2BAA2B,CAAC;AACpD,IAAI,IAAI,EAAE,WAAW;AACrB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,oBAAoB,GAAG;AAC/B,IAAI,KAAK,EAAE,MAAM,OAAO,gCAAgC,CAAC;AACzD,IAAI,IAAI,EAAE,gBAAgB;AAC1B,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,kBAAkB,GAAG;AAC7B,IAAI,KAAK,EAAE,MAAM,OAAO,8BAA8B,CAAC;AACvD,IAAI,IAAI,EAAE,cAAc;AACxB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,UAAU,GAAG;AACrB,IAAI,KAAK,EAAE,MAAM,OAAO,sBAAsB,CAAC;AAC/C,IAAI,IAAI,EAAE,MAAM;AAChB,IAAI,OAAO,EAAE;AACb,MAAM,mBAAmB,EAAE,QAAQ;AACnC,KAAK;AACL,GAAG,CAAC;AACJ,EAAE,MAAM,WAAW,GAAG;AACtB,IAAI,KAAK,EAAE,MAAM,OAAO,uBAAuB,CAAC;AAChD,IAAI,IAAI,EAAE,OAAO;AACjB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,WAAW,GAAG;AACtB,IAAI,KAAK,EAAE,MAAM,OAAO,uBAAuB,CAAC;AAChD,IAAI,IAAI,EAAE,OAAO;AACjB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,iBAAiB,GAAG;AAC5B,IAAI,KAAK,EAAE,MAAM,OAAO,6BAA6B,CAAC;AACtD,IAAI,IAAI,EAAE,aAAa;AACvB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,iBAAiB,GAAG;AAC5B,IAAI,KAAK,EAAE,MAAM,OAAO,6BAA6B,CAAC;AACtD,IAAI,IAAI,EAAE,aAAa;AACvB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,eAAe,GAAG;AAC1B,IAAI,KAAK,EAAE,MAAM,OAAO,2BAA2B,CAAC;AACpD,IAAI,IAAI,EAAE,WAAW;AACrB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,WAAW,GAAG;AACtB,IAAI,KAAK,EAAE,MAAM,OAAO,uBAAuB,CAAC;AAChD,IAAI,IAAI,EAAE,OAAO;AACjB,IAAI,OAAO,EAAE;AACb,MAAM,gBAAgB,EAAE,KAAK;AAC7B,MAAM,iBAAiB,EAAE,KAAK;AAC9B,MAAM,mBAAmB,EAAE,KAAK;AAChC,MAAM,gBAAgB,EAAE,kCAAkC;AAC1D,KAAK;AACL,GAAG,CAAC;AACJ,EAAE,MAAM,aAAa,GAAG;AACxB,IAAI,KAAK,EAAE,MAAM,OAAO,yBAAyB,CAAC;AAClD,IAAI,IAAI,EAAE,SAAS;AACnB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,WAAW,GAAG;AACtB,IAAI,KAAK,EAAE,MAAM,OAAO,uBAAuB,CAAC;AAChD,IAAI,IAAI,EAAE,OAAO;AACjB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,eAAe,GAAG;AAC1B,IAAI,KAAK,EAAE,MAAM,OAAO,2BAA2B,CAAC;AACpD,IAAI,IAAI,EAAE,WAAW;AACrB,IAAI,OAAO,EAAE;AACb,MAAM,wBAAwB,EAAE,EAAE;AAClC,MAAM,2BAA2B,EAAE,8CAA8C;AACjF,MAAM,uBAAuB,EAAE,EAAE;AACjC,KAAK;AACL,GAAG,CAAC;AACJ,EAAE,MAAM,UAAU,GAAG;AACrB,IAAI,KAAK,EAAE,MAAM,OAAO,sBAAsB,CAAC;AAC/C,IAAI,IAAI,EAAE,MAAM;AAChB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,mBAAmB,GAAG;AAC9B,IAAI,KAAK,EAAE,MAAM,OAAO,+BAA+B,CAAC;AACxD,IAAI,IAAI,EAAE,eAAe;AACzB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,kBAAkB,GAAG;AAC7B,IAAI,KAAK,EAAE,MAAM,OAAO,8BAA8B,CAAC;AACvD,IAAI,IAAI,EAAE,cAAc;AACxB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,cAAc,GAAG;AACzB,IAAI,KAAK,EAAE,MAAM,OAAO,0BAA0B,CAAC;AACnD,IAAI,IAAI,EAAE,UAAU;AACpB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,WAAW,GAAG;AACtB,IAAI,KAAK,EAAE,MAAM,OAAO,uBAAuB,CAAC;AAChD,IAAI,IAAI,EAAE,OAAO;AACjB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,cAAc,GAAG;AACzB,IAAI,KAAK,EAAE,MAAM,OAAO,0BAA0B,CAAC;AACnD,IAAI,IAAI,EAAE,UAAU;AACpB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,iBAAiB,GAAG;AAC5B,IAAI,KAAK,EAAE,MAAM,OAAO,6BAA6B,CAAC;AACtD,IAAI,IAAI,EAAE,aAAa;AACvB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,SAAS,GAAG;AACpB,IAAI,KAAK,EAAE,MAAM,OAAO,qBAAqB,CAAC;AAC9C,IAAI,IAAI,EAAE,KAAK;AACf,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,kBAAkB,GAAG;AAC7B,IAAI,KAAK,EAAE,MAAM,OAAO,8BAA8B,CAAC;AACvD,IAAI,IAAI,EAAE,cAAc;AACxB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,iBAAiB,GAAG;AAC5B,IAAI,KAAK,EAAE,MAAM,OAAO,6BAA6B,CAAC;AACtD,IAAI,IAAI,EAAE,aAAa;AACvB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,eAAe,GAAG;AAC1B,IAAI,KAAK,EAAE,MAAM,OAAO,2BAA2B,CAAC;AACpD,IAAI,IAAI,EAAE,WAAW;AACrB,IAAI,OAAO,EAAE,EAAE;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,OAAO,GAAG;AAClB,IAAI,aAAa;AACjB,IAAI,YAAY;AAChB,IAAI,cAAc;AAClB,IAAI,gBAAgB;AACpB,IAAI,cAAc;AAClB,IAAI,aAAa;AACjB,IAAI,UAAU;AACd,IAAI,gBAAgB;AACpB,IAAI,oBAAoB;AACxB,IAAI,eAAe;AACnB,IAAI,cAAc;AAClB,IAAI,gBAAgB;AACpB,IAAI,UAAU;AACd,IAAI,QAAQ;AACZ,IAAI,WAAW;AACf,IAAI,gBAAgB;AACpB,IAAI,eAAe;AACnB,IAAI,oBAAoB;AACxB,IAAI,kBAAkB;AACtB,IAAI,UAAU;AACd,IAAI,WAAW;AACf,IAAI,WAAW;AACf,IAAI,iBAAiB;AACrB,IAAI,iBAAiB;AACrB,IAAI,eAAe;AACnB,IAAI,WAAW;AACf,IAAI,aAAa;AACjB,IAAI,WAAW;AACf,IAAI,eAAe;AACnB,IAAI,UAAU;AACd,IAAI,mBAAmB;AACvB,IAAI,kBAAkB;AACtB,IAAI,cAAc;AAClB,IAAI,WAAW;AACf,IAAI,cAAc;AAClB,IAAI,iBAAiB;AACrB,IAAI,SAAS;AACb,IAAI,kBAAkB;AACtB,IAAI,iBAAiB;AACrB,IAAI,eAAe;AACnB,GAAG,CAAC;AACJ,EAAE,MAAM,iBAAiB,GAAG;AAC5B,IAAI,YAAY;AAChB,IAAI,UAAU;AACd,IAAI,SAAS;AACb,IAAI,YAAY;AAChB,IAAI,WAAW;AACf,IAAI,UAAU;AACd,IAAI,MAAM;AACV,IAAI,OAAO;AACX,IAAI,YAAY;AAChB,IAAI,WAAW;AACf,IAAI,gBAAgB;AACpB,IAAI,cAAc;AAClB,IAAI,OAAO;AACX,IAAI,OAAO;AACX,IAAI,cAAc;AAClB,IAAI,UAAU;AACd,IAAI,UAAU;AACd,IAAI,KAAK;AACT,IAAI,WAAW;AACf,GAAG,CAAC;AACJ,EAAE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1F,EAAE,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;AAC9B,EAAE,SAAS,YAAY,GAAG;AAC1B,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAChD,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AAC5B,KAAK;AACL,IAAI,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;AAC1B,GAAG;AACH,EAAE,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM;AACtC,IAAI,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;AACpF,IAAI,IAAI,YAAY,EAAE;AACtB,MAAM,YAAY,CAAC,OAAO,GAAG;AAC7B,QAAQ,GAAG,YAAY,CAAC,OAAO;AAC/B,QAAQ,iBAAiB,EAAE,WAAW,CAAC,KAAK,CAAC,WAAW;AACxD,OAAO,CAAC;AACR,KAAK;AACL,IAAI,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;AAC9F,IAAI,IAAI,iBAAiB,EAAE;AAC3B,MAAM,iBAAiB,CAAC,OAAO,GAAG,EAAE,CAAC;AACrC,KAAK;AACL,IAAI,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnF,IAAI,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK;AAChE,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9D,QAAQ,MAAM,GAAG;AACjB,UAAU,GAAG,MAAM;AACnB,UAAU,GAAG,GAAG,CAAC,OAAO;AACxB,SAAS,CAAC;AACV,OAAO;AACP,MAAM,OAAO,MAAM,CAAC;AACpB,KAAK,EAAE,EAAE,CAAC,CAAC;AACX,IAAI,OAAO;AACX,MAAM,OAAO,EAAE,cAAc;AAC7B,MAAM,aAAa,EAAE,gBAAgB;AACrC,KAAK,CAAC;AACN,GAAG,CAAC,CAAC;AACL,EAAE,OAAO;AACT,IAAI,YAAY;AAChB,IAAI,YAAY;AAChB,GAAG,CAAC;AACJ,CAAC;AACD,SAAS,8BAA8B,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;AACvG,EAAE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC/B,EAAE,MAAM,YAAY,GAAG,IAAI,CAAC;AAC5B,EAAE,IAAI,CAAC,YAAY;AACnB,IAAI,OAAO;AACX,CAAC;AACD,SAAS,kCAAkC,CAAC,GAAG,IAAI,EAAE;AACrD,EAAE,MAAM,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,IAAI,CAAC;AACrC,EAAE,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE;AACxD,IAAI,WAAW,EAAE,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACzG,IAAI,iBAAiB,EAAE;AACvB,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK;AACpE,QAAQ,IAAI,GAAG,KAAK,GAAG,EAAE;AACzB,UAAU,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AACpD,SAAS,MAAM;AACf,UAAU,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;AAC5B,SAAS;AACT,QAAQ,OAAO,OAAO,CAAC;AACvB,OAAO,EAAE,EAAE,CAAC;AACZ,KAAK;AACL,IAAI,kBAAkB,EAAE,SAAS;AACjC,GAAG,CAAC,CAAC;AACL,EAAE,gBAAgB,CAAC,OAAO,GAAG,MAAM,CAAC;AACpC;;;;"}