{"version":3,"file":"main.Uy9ts_.js","sources":["theme-32/virtual:theme","theme-32/discourse/lib/emoji-diversity.js","theme-32/discourse/components/ucd-warning.gjs","theme-32/discourse/components/modal/ucd-warning.gjs","theme-32/discourse/core/code-energy.js","theme-32/discourse/lib/boundaries.js","theme-32/discourse/core/sensitivity.js","theme-32/discourse/core/strip-ignored-content.js","theme-32/discourse/core/detect-code.js","theme-32/discourse/initializers/init.js","theme-32/discourse/services/ucd-state.js","theme-32/virtual:entrypoint:main"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(32);\n\nexport function themePrefix(key) {\n  return `theme_translations.32.${key}`;\n}\n","const genderEmojiData = {\n  masc: {\n    adult: \"👨\",\n    child: \"👦\",\n    modifier: \"\\u200d♂\",\n  },\n  fem: {\n    adult: \"👩\",\n    child: \"👧\",\n    modifier: \"\\u200d♀\",\n  },\n  // no widespread support for most gender-neutral emoji sequences yet :(\n  // neutral: {\n  //   adult: \"🧑\",\n  //   child: \"🧒\",\n  //   modifier: \"\",\n  // },\n};\n\nconst randomGenderEmojiData = () => {\n  const genders = Object.values(genderEmojiData);\n\n  return genders[Math.floor(Math.random() * genders.length)];\n};\n\nconst emojiRegexes = Object.keys(Object.values(genderEmojiData)[0]).reduce(\n  (regexInfo, subStrType) => {\n    regexInfo[subStrType] = new RegExp(\n      Object.values(genderEmojiData)\n        .map((gender) => gender[subStrType])\n        .filter(Boolean)\n        .join(\"|\"),\n      \"g\"\n    );\n\n    return regexInfo;\n  },\n  {}\n);\n\nexport const randomizeEmojiGender = (emojis) =>\n  Object.entries(emojiRegexes).reduce(\n    (emoji, [subStrType, regex]) =>\n      emoji.replace(regex, () => randomGenderEmojiData()[subStrType]),\n    emojis\n  );\n\nconst MIN_SKIN_TONE_CODEPOINT = 0x1f3fb;\nconst MAX_SKIN_TONE_CODEPOINT = 0x1f3ff;\n\nexport const randomizeEmojiSkinTone = (emoji) =>\n  emoji.replace(/[\\u{1f3fb}-\\u{1f3ff}]/gu, () =>\n    String.fromCodePoint(\n      MIN_SKIN_TONE_CODEPOINT +\n        Math.floor(\n          Math.random() *\n            (MAX_SKIN_TONE_CODEPOINT - MIN_SKIN_TONE_CODEPOINT + 1)\n        )\n    )\n  );\n\nexport const randomizeEmojiDiversity = (emoji) =>\n  randomizeEmojiSkinTone(randomizeEmojiGender(emoji));\n","import Component from \"@glimmer/component\";\nimport { Input } from \"@ember/component\";\nimport { inject as controller } from \"@ember/controller\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport CookText from \"discourse/components/cook-text\";\nimport DButton from \"discourse/components/d-button\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class UcdWarning extends Component {\n  @service modal;\n  @service ucdState;\n\n  @controller composer;\n\n  get shouldPermanentlyDismiss() {\n    return this.ucdState.permanentlyDismissed ?? false;\n  }\n\n  @action\n  toggleShouldPermanentlyDismiss() {\n    this.ucdState.toggle();\n  }\n\n  @action\n  goBackAndFix() {\n    this.modal.close();\n  }\n\n  @action\n  ignoreAndProceed() {\n    this.modal.close();\n    this.composer.model.ucd_previousWarningIgnored = true;\n    this.composer.save();\n  }\n\n  <template>\n    <CookText @rawText={{i18n (themePrefix \"warning_modal.content\")}} />\n    <label for=\"ucd_do-not-show-again\" class=\"checkbox-label\">\n      <Input\n        @type=\"checkbox\"\n        id=\"ucd_do-not-show-again\"\n        name=\"ucd_do-not-show-again\"\n        @checked={{readonly this.shouldPermanentlyDismiss}}\n        {{on \"change\" this.toggleShouldPermanentlyDismiss}}\n      />\n      {{i18n (themePrefix \"warning_modal.do_not_show_again\")}}\n    </label>\n    <div class=\"action-buttons\">\n      <DButton\n        @action={{this.goBackAndFix}}\n        @icon=\"pencil\"\n        class=\"btn-primary\"\n        @label={{themePrefix \"warning_modal.fix_post\"}}\n      />\n      <DButton\n        class=\"btn-default\"\n        @action={{this.ignoreAndProceed}}\n        @label={{themePrefix \"warning_modal.ignore_and_post_anyway\"}}\n      />\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport { htmlSafe } from \"@ember/template\";\nimport { escape } from \"pretty-text/sanitizer\";\nimport DModal from \"discourse/components/d-modal\";\nimport { emojiUnescape } from \"discourse/lib/text\";\nimport { i18n } from \"discourse-i18n\";\nimport { randomizeEmojiDiversity } from \"../../lib/emoji-diversity\";\nimport UcdWarning from \"../ucd-warning\";\n\nexport default class ModalUcdWarning extends Component {\n  @service ucdState;\n\n  get title() {\n    return htmlSafe(\n      [\n        emojiUnescape(escape(randomizeEmojiDiversity(settings.emoji_icon))),\n        escape(i18n(themePrefix(\"warning_modal.title\"))),\n      ].join(\" \")\n    );\n  }\n\n  @action\n  closeModal() {\n    if (this.args.model.ucd_shouldPermanentlyDismiss) {\n      this.ucdState.permanentlyDismiss();\n    }\n\n    this.args.closeModal();\n  }\n\n  <template>\n    <DModal\n      @closeModal={{this.closeModal}}\n      class=\"modal-ucd-warning\"\n      @title={{this.title}}\n      @inline={{@inline}}\n    >\n      <UcdWarning @onClose={{this.closeModal}} />\n    </DModal>\n  </template>\n}\n","const varNameStart = \"[$_a-zA-Z]\";\nconst varNameEnd = \"[$_a-zA-Z0-9]*\";\nconst varName = `${varNameStart}${varNameEnd}`;\nconst varFragment = `[$a-zA-Z]${varNameEnd}`; // no underscore at start\nconst xmlLikeName = \"[a-zA-Z-]+\";\nconst string = `(?:\"(?:[^\\\\n\"\\\\\\\\]|\\\\\\\\[^\\\\n])*\"|'(?:[^\\\\n'\\\\\\\\]|\\\\\\\\[^\\\\n])*')`;\n// adapted from http://wordaligned.org/articles/string-literals-and-regular-expressions\nconst numeric = \"-?(?:0|[1-9]\\\\d*)(?:\\\\.\\\\d+)?(?:[eE][+-]?\\\\d+)?\";\n// adapted from https://www.json.org/\nconst argument = `(?:${varName}|${string}|${numeric})`;\n// ignoring complex values due to complexity;\n// bools, `null`s, and `undefined`s are already matched based on varName\nconst argList = `(?:\\\\s*${argument}\\\\s*(?:,\\\\s*${argument}\\\\s*)*|\\\\s*)`;\n// matches 0 or more args; don't use on its own due to risk of infinite matches\n\n// enum\nexport const CodeEnergyLevels = {\n  Complex: \"Complex\",\n  High: \"High\",\n  Medium: \"Medium\",\n  Low: \"Low\",\n};\n\nexport const codeEnergyValues = {\n  [CodeEnergyLevels.Complex]: 1,\n  [CodeEnergyLevels.High]: 0.7,\n  [CodeEnergyLevels.Medium]: 0.3,\n  [CodeEnergyLevels.Low]: 0.1,\n};\n\nconst nonHtmlIndicators = [\n  `\\\\$${varName}`, // almost certain to be var name\n  `^\\\\s*\\\\.${xmlLikeName}`, // CSS class selectors\n  `:${varName}`, // Ruby symbol\n  // omitted: _varName starting with underscore (conflict with italics)\n  `${varFragment}(?:_${varFragment})+`, // snake_case\n  // ommitted: camelCase and spinal-case (too many false positives)\n  \"(?:^|\\\\s+)(?:\\\\/\\\\/|;)\", // single-line comment\n  // omitted: python-style `#` single-line comments and CSS ID selectors (conflict with md headings)\n  `\\\\/\\\\*[\\\\s\\\\S]+?\\\\*\\\\/`, // C-like multiline comment\n  `('''|\"\"\")[\\\\s\\\\S]+?\\\\1`, // Python-like multiline string/comment\n  \";\\\\s*$\", // trailing semicolon\n  `(?:${varName})?[$_a-z]\\\\(${argList}\\\\)`, // function call\n  // var name cannot end with uppercase to avoid `O(n)` false positive etc.\n  `${varName}\\\\[\\\\s*${argument}?\\\\s*\\\\]`, // array index\n  // omitted: object property (conflict with domain names, e.g. \"google.com\")\n  \"^\\\\s*[{}]\\\\s*$\", // curly brace and nothing else on a line\n  \"\\\\{\\\\{.+\\\\}\\\\}\", // templating languages e.g. Handlebars\n  \"[\\\\$#]\\\\{.+\\\\}\", // template string\n  \"&&|!=|>>|<<|::|\\\\+=|-=|\\\\*=|\\\\/=|\\\\|\\\\|=|\\\\?=|\\\\.\\\\?\", // various operators\n  // omitted: ++ (conflict with C++, Notepad++, etc.)\n  // omitted: || (conflict with empty table header row)\n  \"\\\\\\\\['\\\"ntr0\\\\\\\\]\", // common escape sequences\n  `<\\\\?[^>]*\\\\?>`, // PHP\n  `<%[^>]*%>`, // ERB (Rails)\n  \"0000-00-00T00:00:00\".split(\"0\").join(\"\\\\d\"), // ISO 8601 timestamps in logs\n  \"^\\\\s*at .+(.+)\", // common stack trace format\n  '^\\\\s*{\\\\s*\"[^\"]*\"\\\\s*:', // single-line JSON property\n];\n\nconst htmlIndicators = [\n  \"<!--[\\\\s\\\\S]*?-->\", // XML-like comment\n  `<${xmlLikeName}[^>]*\\\\/?>`, // XML-like start/empty tag\n  `</${xmlLikeName}>`, // XML-like end tag\n  \"&[0-9a-zA-Z]+;\", // HTML entity - human-readable\n  \"&#[0-9]{1,7};\", // HTML entity - decimal\n  \"&#x[0-9a-fA-F]{1,6};\", // HTML entity - hex\n];\n\nconst _codeEnergyIndicators = {\n  // multiple-character matches\n  [CodeEnergyLevels.Complex]: {\n    get indicators() {\n      return [nonHtmlIndicators, settings.include_html && htmlIndicators]\n        .filter(Boolean)\n        .flat();\n    },\n  },\n  // High code energy(almost always seen only in code and never in regular text, such as [)\n  [CodeEnergyLevels.High]: {\n    // TODO\n    indicators: [\n      // \"\\\\[\"\n    ],\n  },\n  // Medium code energy(usually seen in code but rarely in regular text, such as ;)\n  [CodeEnergyLevels.Medium]: {\n    // TODO\n    indicators: [\n      // \";\"\n    ],\n  },\n  // Low code energy(sometimes seen in code, but also seen with fair frequency in regular text, such as .)\n  [CodeEnergyLevels.Low]: {\n    // TODO\n    value: 0.1,\n    indicators: [\n      // \".\"\n    ],\n  },\n};\n\nexport const getCodeEnergyIndicators = () => {\n  return Object.entries(_codeEnergyIndicators)\n    .map(([key, { indicators }]) => {\n      return indicators.map((source) => ({\n        value: codeEnergyValues[key],\n        matcher: new RegExp(source, \"gm\"),\n      }));\n    })\n    .flat();\n};\n","export const getLineBoundaries = (str) => {\n  const lineBoundaries = [];\n\n  let cursor = -1;\n\n  do {\n    lineBoundaries.push({ start: cursor + 1 });\n\n    cursor = str.indexOf(\"\\n\", cursor + 1);\n\n    lineBoundaries[lineBoundaries.length - 1].end =\n      cursor === -1 ? str.length : cursor;\n\n    lineBoundaries[lineBoundaries.length - 1].content = str.slice(\n      lineBoundaries[lineBoundaries.length - 1].start,\n      lineBoundaries[lineBoundaries.length - 1].end\n    );\n  } while (cursor > -1);\n\n  return lineBoundaries;\n};\n\nexport const isBetween = (start, end) => (point) => {\n  return point >= start && point <= end;\n};\n","export const applySensitivity =\n  (sensitivity) => (leastSensitive, mostSensitive) =>\n    leastSensitive + sensitivity * (mostSensitive - leastSensitive);\n\nexport const sensitivityConfig = {\n  get complexMatchesToIgnore() {\n    return Math.round(applySensitivity(settings.sensitivity)(4, 0));\n  },\n\n  get minSequentialLinesToMatch() {\n    return Math.round(applySensitivity(settings.sensitivity)(5, 1));\n  },\n\n  get minTotalCodeEnergy() {\n    return Math.round(applySensitivity(settings.sensitivity)(5, 1));\n  },\n};\n","const ignoredContents = [\n  // properly formatted code\n  /(^([`~])\\2{2,})[^`~\\n]*\\n[\\s\\S]*?\\n\\1\\2*\\s*(?:\\n|$)/gm, // backtick-/tilde-fenced block\n  /(?:^|(?:\\n{2,}))\\s*(?:(?: {4}|\\t).*(?:\\n|$)|[ \\t]*\\n(?=[ \\t]*(?: {4}|\\t)))+/g, // indented block\n  // lack of `m` flag is intentional (`^` must match beginning of input, not line)\n\n  /`[^`\\n]+`/g, // inline backticks (must come after fenced code blocks)\n\n  /\\[([a-z]+)[^\\]\\n]*\\][\\s\\S]*?\\[\\/\\1\\]/gi, // BBCode tags\n\n  // URLs\n  /(?:[a-z][a-z0-9+.-]*:\\/\\/|www\\.)(_\\([^() \\n\\t]+\\)|[^() \\n\\t])+/gi, // parens/underscores\n  // for Wikipedia-style URLs\n\n  // emojis\n  /:[a-z_+-][a-z_0-9+-]*:/g, // descriptive style, e.g. :wink:, :stuck_out_tongue:\n  /:D|:-D|:\\)|:-\\)|;\\)|;-\\)|:\\(|:-\\(|:o|:-o|:\\?|:-\\?|:\\?\\?\\?:|8\\)|8-\\)|:x|:-x|:P|:-P|:!:|:\\?:|:\\||:-\\||\\^_\\^|\\^__\\^|:'\\(|:'-\\(|:-'\\(|:p|:O|:-O|:\\/|;P|;-P|:\\$|:-\\$/g, // emoticon style, e.g. ;), :-P\n  // per https://github.com/discourse/discourse/blob/dc6b547ed89f652b5406489d76140b76cf8e0d1d/script/import_scripts/phpbb3/support/smiley_processor.rb#L36-L63 and https://github.com/discourse/discourse/blob/0eeedf307a8f2a8e1ccd5b24dafbf5a7fd20e51e/lib/emoji/db.json#L7015-L7042\n\n  // misc\n  /\\((?:c|tm|r)\\)/gi, // copy/trademark/registered\n\n  // markdown links and images\n  /!?\\[[^\\]]*\\]\\([^)]*\\)/g,\n\n  // hashtags (not preceded by `&`, so HTML entities stay intact)\n  /(?<![\\w&/])#[\\w:-][\\w:.-]{0,99}/g,\n\n  // mentions (Prefixed by non-word and terminated at word boundary)\n  /\\B@[\\w][\\w.-]{0,58}\\b/g,\n];\n\nexport const stripIgnoredContent = (content) => {\n  const strippedContent = ignoredContents.reduce((str, ignoredContent) => {\n    return str.replace(ignoredContent, \"\");\n  }, content);\n\n  return strippedContent;\n};\n","import { getLineBoundaries, isBetween } from \"../lib/boundaries\";\nimport {\n  CodeEnergyLevels,\n  codeEnergyValues,\n  getCodeEnergyIndicators,\n} from \"./code-energy\";\nimport { sensitivityConfig } from \"./sensitivity\";\nimport { stripIgnoredContent } from \"./strip-ignored-content\";\n\nexport const getCodeEnergy = (content) => {\n  let totalCodeEnergy = 0;\n  let totalComplexMatches = 0;\n\n  const lines = getLineBoundaries(content);\n\n  lines.forEach((x) => {\n    x.matches = 0;\n    x.matched_patterns = [];\n  });\n\n  for (const { matcher, value } of getCodeEnergyIndicators()) {\n    const matches = [...content.matchAll(matcher)];\n\n    totalCodeEnergy += matches.length * value;\n\n    if (value === codeEnergyValues[CodeEnergyLevels.Complex]) {\n      totalComplexMatches += matches.length;\n    }\n\n    for (const match of matches) {\n      const startIndex = match.index;\n      const endIndex = startIndex + match[0].length;\n\n      for (const line of lines) {\n        const isThisLine = isBetween(line.start, line.end);\n\n        if (\n          isThisLine(startIndex) ||\n          isThisLine(endIndex) ||\n          (line.start >= startIndex && line.end <= endIndex)\n        ) {\n          ++line.matches;\n          line.matched_patterns.push({ matcher, value });\n        }\n      }\n    }\n  }\n\n  return { totalCodeEnergy, totalComplexMatches, lines };\n};\n\nexport const numSequentialLinesWithThresholdCodeEnergy =\n  (threshold) => (lines) => {\n    let maxContiguous = 0;\n    let curContiguous = 0;\n\n    for (const line of lines) {\n      // empty/whitespace-only lines don't affect contiguity\n      if (!line.content.trim().length) {\n        continue;\n      }\n\n      if (line.matches >= threshold) {\n        ++curContiguous;\n      } else {\n        maxContiguous = Math.max(maxContiguous, curContiguous);\n        curContiguous = 0;\n      }\n    }\n\n    return Math.max(maxContiguous, curContiguous);\n  };\n\nexport const printDebugInfo = (content) => {\n  content = stripIgnoredContent(content);\n\n  const {\n    complexMatchesToIgnore,\n    minSequentialLinesToMatch,\n    minTotalCodeEnergy,\n  } = sensitivityConfig;\n\n  const { totalCodeEnergy, totalComplexMatches, lines } =\n    getCodeEnergy(content);\n\n  const debugTable = [];\n\n  let consecutive = 0;\n  lines.forEach((l) => {\n    if (!l.content.trim()) {\n      return;\n    }\n    if (l.matches) {\n      consecutive++;\n    } else {\n      consecutive = 0;\n    }\n    debugTable.push([\n      l.matches ? String(l.matches) : \"\",\n      consecutive ? String(consecutive) : \"\",\n      l.matched_patterns.length\n        ? `\\`${l.matched_patterns.map((p) => p.matcher).join(\"`, `\")}\\``\n        : \"\",\n      l.content,\n    ]);\n  });\n\n  const columns = [\"matches\", \"cumulative\", \"matched patterns\", \"content\"];\n  const dividers = columns.map(() => \"\");\n\n  columns.forEach((c, i) => {\n    const longest = Math.max(\n      c.length,\n      ...debugTable.map((row) => row[i].length)\n    );\n    debugTable.forEach((row) => (row[i] = row[i].padEnd(longest)));\n    columns[i] = c.padEnd(longest);\n    dividers[i] = dividers[i].padEnd(longest, \"-\");\n  });\n\n  debugTable.unshift(columns, dividers);\n\n  // eslint-disable-next-line no-console\n  console.log(debugTable.map((l) => `| ${l.join(\" | \")} |`).join(\"\\n\"));\n\n  // eslint-disable-next-line no-console\n  console.log(\"Result is \", { totalCodeEnergy, totalComplexMatches, lines });\n  // eslint-disable-next-line no-console\n  console.log(\"Sensitivity Config is \", {\n    complexMatchesToIgnore,\n    minSequentialLinesToMatch,\n    minTotalCodeEnergy,\n  });\n};\n\nconst detectCode = (content) => {\n  const {\n    complexMatchesToIgnore,\n    minSequentialLinesToMatch,\n    minTotalCodeEnergy,\n  } = sensitivityConfig;\n\n  const { totalCodeEnergy, totalComplexMatches, lines } =\n    getCodeEnergy(content);\n\n  if (totalComplexMatches <= complexMatchesToIgnore) {\n    return false;\n  }\n\n  if (totalCodeEnergy < minTotalCodeEnergy) {\n    return false;\n  }\n\n  if (\n    numSequentialLinesWithThresholdCodeEnergy(\n      codeEnergyValues[CodeEnergyLevels.Complex]\n    )(lines) < minSequentialLinesToMatch\n  ) {\n    return false;\n  }\n\n  return true;\n};\n\nexport const detectUnformattedCode = (content) => {\n  const strippedContent = stripIgnoredContent(content);\n\n  return isBetween(\n    settings.min_post_length_to_check,\n    settings.max_post_length_to_check === -1\n      ? Infinity\n      : settings.max_post_length_to_check\n  )(content.length)\n    ? detectCode(strippedContent)\n    : false;\n};\n","import { getOwner } from \"@ember/owner\";\nimport { withPluginApi } from \"discourse/lib/plugin-api\";\nimport ModalUcdWarning from \"../components/modal/ucd-warning\";\nimport { detectUnformattedCode, printDebugInfo } from \"../core/detect-code\";\n\nconst getDisableAtTrustLevel = () =>\n  settings.disable_at_trust_level === -1\n    ? Infinity\n    : settings.disable_at_trust_level;\n\nexport default {\n  name: \"unformatted-code-detector\",\n  initialize() {\n    withPluginApi((api) => {\n      window.debugUnformattedCodeDetector = () => {\n        const content = document.querySelector(\n          \"#reply-control textarea.d-editor-input\"\n        )?.value;\n        if (!content) {\n          // eslint-disable-next-line no-console\n          console.log(\"No content found\");\n        } else {\n          printDebugInfo(content);\n        }\n      };\n\n      api.addModelGetter(\"composer\", \"ucdState\", function () {\n        return getOwner(this).lookup(\"service:ucd-state\");\n      });\n\n      api.addModelField(\"composer\", \"ucd_previousWarningIgnored\", {\n        defaultValue: false,\n      });\n\n      api.addModelMethod(\n        \"composer\",\n        \"ucd_checkShouldIgnoreWarning\",\n        function () {\n          return (\n            this.ucd_previousWarningIgnored ||\n            this.ucdState.permanentlyDismissed ||\n            api.getCurrentUser()?.trust_level >= getDisableAtTrustLevel()\n          );\n        }\n      );\n\n      api.addModelMethod(\n        \"composer\",\n        \"ucd_checkUnformattedCodeDetected\",\n        function () {\n          return detectUnformattedCode(this.reply);\n        }\n      );\n\n      api.modifyClass(\n        \"service:composer\",\n        (Superclass) =>\n          class extends Superclass {\n            save(...args) {\n              if (\n                this.model.ucd_checkUnformattedCodeDetected() &&\n                !this.model.ucd_checkShouldIgnoreWarning()\n              ) {\n                this.modal.show(ModalUcdWarning, {\n                  model: this.model,\n                });\n              } else {\n                super.save(...args);\n              }\n            }\n          }\n      );\n    });\n  },\n};\n","import Service from \"@ember/service\";\nimport KeyValueStore from \"discourse/lib/key-value-store\";\n\nconst DISMISSED = \"permanently_dismissed\";\nconst NAMESPACE = \"ucd_\";\n\nexport default class extends Service {\n  store = new KeyValueStore(NAMESPACE);\n\n  get permanentlyDismissed() {\n    return this.store.getObject(DISMISSED) || false;\n  }\n\n  toggle() {\n    this.store.setObject({ key: DISMISSED, value: !this.permanentlyDismissed });\n  }\n}\n","import * as Mod1 from \"./discourse/components/modal/ucd-warning\";\nimport * as Mod2 from \"./discourse/components/ucd-warning\";\nimport * as Mod3 from \"./discourse/core/code-energy\";\nimport * as Mod4 from \"./discourse/core/detect-code\";\nimport * as Mod5 from \"./discourse/core/sensitivity\";\nimport * as Mod6 from \"./discourse/core/strip-ignored-content\";\nimport * as Mod7 from \"./discourse/initializers/init\";\nimport * as Mod8 from \"./discourse/lib/boundaries\";\nimport * as Mod9 from \"./discourse/lib/emoji-diversity\";\nimport * as Mod10 from \"./discourse/services/ucd-state\";\nconst compatModules = {\n  \"discourse/components/modal/ucd-warning\": Mod1,\n  \"discourse/components/ucd-warning\": Mod2,\n  \"discourse/core/code-energy\": Mod3,\n  \"discourse/core/detect-code\": Mod4,\n  \"discourse/core/sensitivity\": Mod5,\n  \"discourse/core/strip-ignored-content\": Mod6,\n  \"discourse/initializers/init\": Mod7,\n  \"discourse/lib/boundaries\": Mod8,\n  \"discourse/lib/emoji-diversity\": Mod9,\n  \"discourse/services/ucd-state\": Mod10,\n};\nexport { compatModules };\nexport default compatModules;\n"],"names":["settings","getObjectForTheme","themePrefix","key","genderEmojiData","masc","adult","child","modifier","fem","emojiRegexes","Object","keys","values","reduce","regexInfo","subStrType","RegExp","map","gender","filter","Boolean","join","randomizeEmojiGender","emojis","entries","emoji","regex","replace","randomGenderEmojiData","genders","Math","floor","random","length","MIN_SKIN_TONE_CODEPOINT","randomizeEmojiSkinTone","String","fromCodePoint","randomizeEmojiDiversity","UcdWarning","Component","dt7948","g","this","prototype","service","modal","i","ucdState","controller","composer","shouldPermanentlyDismiss","permanentlyDismissed","toggleShouldPermanentlyDismiss","toggle","n","action","goBackAndFix","close","ignoreAndProceed","model","ucd_previousWarningIgnored","save","setComponentTemplate","createTemplateFactory","id","block","moduleName","scope","CookText","i18n","Input","on","DButton","isStrictMode","ModalUcdWarning","title","htmlSafe","emojiUnescape","escape","emoji_icon","closeModal","args","ucd_shouldPermanentlyDismiss","permanentlyDismiss","DModal","varNameEnd","varName","varFragment","xmlLikeName","argument","argList","CodeEnergyLevels","Complex","High","Medium","Low","codeEnergyValues","nonHtmlIndicators","split","htmlIndicators","_codeEnergyIndicators","indicators","include_html","flat","value","getCodeEnergyIndicators","source","matcher","getLineBoundaries","str","lineBoundaries","cursor","push","start","indexOf","end","content","slice","isBetween","point","applySensitivity","sensitivity","leastSensitive","mostSensitive","sensitivityConfig","complexMatchesToIgnore","round","minSequentialLinesToMatch","minTotalCodeEnergy","ignoredContents","stripIgnoredContent","ignoredContent","getCodeEnergy","totalCodeEnergy","totalComplexMatches","lines","forEach","x","matches","matched_patterns","matchAll","match","startIndex","index","endIndex","line","isThisLine","numSequentialLinesWithThresholdCodeEnergy","threshold","maxContiguous","curContiguous","trim","max","printDebugInfo","debugTable","consecutive","l","p","columns","dividers","c","longest","row","padEnd","unshift","console","log","detectUnformattedCode","strippedContent","min_post_length_to_check","max_post_length_to_check","Infinity","detectCode","init","name","initialize","withPluginApi","api","window","debugUnformattedCodeDetector","document","querySelector","addModelGetter","getOwner","lookup","addModelField","defaultValue","addModelMethod","getCurrentUser","trust_level","disable_at_trust_level","reply","modifyClass","Superclass","ucd_checkUnformattedCodeDetected","ucd_checkShouldIgnoreWarning","show","super","DISMISSED","compatModules","Mod1","Mod2","Mod3","Mod4","Mod5","Mod6","Mod7","Mod8","Mod9","Service","store","KeyValueStore","getObject","setObject"],"mappings":"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"}