{"version":3,"sources":["src/module/apps/ModuleReviewDialog.ts","src/module/apps/TroubleShooter.ts","src/module/setupModules.ts","src/module/lib/HandlebarsHelpers.ts","src/module/apps/ConfigPanel.ts","src/module/lib/MidiDependentsRegistry.ts","src/module/apps/DependentsExplorer.ts","src/module/apps/RollStatsDisplay.ts","src/module/midi-sounds.ts","src/module/apps/SoundConfigPanel.ts","src/module/apps/TargetConfirmationConfig.ts","src/module/chatMessageHandling.ts","src/module/apps/Item.ts","src/module/lib/RollModifierTracker.ts","src/module/apps/ConditionEditor.ts","src/module/undo.ts","src/module/apps/TargetConfirmation.ts","src/module/activities/activityHelpers.ts","src/module/activities/MidiActivityMixin.ts","src/module/activities/AttackActivity.ts","src/module/apps/MidiActivityChoiceDialog.ts","src/module/apps/MidiRollChoiceDialog.ts","src/module/patching.ts","src/module/apps/ActorOnUseMacroConfig.ts","src/module/apps/ItemOnUseMacrosConfig.ts","src/module/Hooks.ts","src/module/utils.ts","src/module/GMAction.ts","src/module/activities/SummonActivity.ts","src/module/activities/TransformActivity.ts","src/module/Workflow.ts","src/module/settings.ts","src/module/preloadTemplates.ts","src/module/sheetQOL.ts","src/module/RollStats.ts","src/module/MidiKeyManager.ts","src/module/apps/UndoWorkflow.ts","src/module/ChatClasses/ChatLogMidi.ts","src/module/lib/midiCompletions.ts","src/module/apps/OverTimeEditor.ts","src/module/ChatClasses/ChatMessageMidi.ts","src/module/activities/SaveActivity.ts","src/module/activities/UtilityActivity.ts","src/module/activities/DamageActivity.ts","src/module/activities/CastActivity.ts","src/module/activities/CheckActivity.ts","src/module/activities/HealActivity.ts","src/module/activities/ForwardActivity.ts","src/module/activities/EnchantActivity.ts","src/module/MidiCombat5e.ts","src/module/ChatClasses/DamageApplicationElementMidi.ts","src/midi-qol.ts"],"sourcesContent":["import { i18n } from \"../../midi-qol.js\";\nconst { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;\n\ninterface ModuleReviewItem {\n  id: string;\n  title: string;\n  savedVersion: string;\n  currentVersion: string | null;\n  status: \"active\" | \"installed\" | \"missing\";\n  statusClass: string;\n  badgeKey: string;\n  badgeClass: string;\n  canActivate: boolean;\n  checked: boolean;\n  versionMatch: boolean;\n  versionLower: boolean;\n}\n\nexport class ModuleReviewDialog extends HandlebarsApplicationMixin(ApplicationV2) {\n  savedModules: Record<string, { title: string; active: boolean; installed?: boolean; version: string; compatibility?: string }>;\n\n  constructor(savedModules: Record<string, any>, options = {}) {\n    super(options);\n    this.savedModules = savedModules;\n  }\n\n  static override DEFAULT_OPTIONS = {\n    id: \"midi-module-review\",\n    classes: [\"midi-module-review\"],\n    window: {\n      title: \"midi-qol.ModuleReview.Title\",\n      resizable: true,\n      contentClasses: [\"standard-form\"]\n    },\n    position: {\n      width: 550,\n      height: 600\n    },\n    actions: {\n      selectAll: ModuleReviewDialog.#onSelectAll,\n      deselectAll: ModuleReviewDialog.#onDeselectAll,\n      applyModules: ModuleReviewDialog.#onApply\n    }\n  };\n\n  static override PARTS = {\n    modules: {\n      template: \"modules/midi-qol/templates/apps/ModuleReviewDialog/moduleReview.hbs\",\n      scrollable: [\"\"]\n    }\n  };\n\n  async _prepareContext(options) {\n    const context: any = await super._prepareContext(options);\n    const modules: ModuleReviewItem[] = [];\n\n    for (const [id, saved] of Object.entries(this.savedModules)) {\n      const currentModule = game.modules.get(id);\n      let status: \"active\" | \"installed\" | \"missing\";\n      let canActivate = false;\n      let checked = false;\n\n      if (currentModule?.active) {\n        status = \"active\";\n      } else if (currentModule) {\n        status = \"installed\";\n        canActivate = true;\n        checked = true;\n      } else {\n        status = \"missing\";\n      }\n\n      const currentVersion = currentModule?.version ?? null;\n      const versionMatch = currentVersion === saved.version;\n      const versionLower = !!(currentVersion && saved.version && !versionMatch\n        && foundry.utils.isNewerVersion(saved.version, currentVersion));\n\n      const badgeKeyMap = {\n        active: \"midi-qol.ModuleReview.Active\",\n        installed: \"midi-qol.ModuleReview.Installed\",\n        missing: \"midi-qol.ModuleReview.NotInstalled\"\n      };\n      const badgeClassMap = {\n        active: \"badge-active\",\n        installed: \"badge-installed\",\n        missing: \"badge-missing\"\n      };\n\n      modules.push({\n        id,\n        title: saved.title ?? id,\n        savedVersion: saved.version ?? \"?\",\n        currentVersion,\n        status,\n        statusClass: status,\n        badgeKey: badgeKeyMap[status],\n        badgeClass: badgeClassMap[status],\n        canActivate,\n        checked,\n        versionMatch,\n        versionLower\n      });\n    }\n\n    // Sort: missing first, then installed (activatable), then active\n    const statusOrder = { missing: 0, installed: 1, active: 2 };\n    modules.sort((a, b) => statusOrder[a.status] - statusOrder[b.status] || a.title.localeCompare(b.title));\n\n    context.modules = modules;\n    context.hasMissing = modules.some(m => m.status === \"missing\");\n    return context;\n  }\n\n  static #onSelectAll(this: ModuleReviewDialog, event: Event) {\n    event.preventDefault();\n    const checkboxes = Array.from(this.element.querySelectorAll<HTMLInputElement>('input[type=\"checkbox\"]:not(:disabled)'));\n    for (const cb of checkboxes) cb.checked = true;\n  }\n\n  static #onDeselectAll(this: ModuleReviewDialog, event: Event) {\n    event.preventDefault();\n    const checkboxes = Array.from(this.element.querySelectorAll<HTMLInputElement>('input[type=\"checkbox\"]:not(:disabled)'));\n    for (const cb of checkboxes) cb.checked = false;\n  }\n\n  static async #onApply(this: ModuleReviewDialog, event: Event) {\n    event.preventDefault();\n    const checkboxes = Array.from(this.element.querySelectorAll<HTMLInputElement>('input[type=\"checkbox\"]:checked:not(:disabled)'));\n    const moduleIds: string[] = [];\n    for (const cb of checkboxes) {\n      const moduleId = cb.dataset.moduleId;\n      if (moduleId) moduleIds.push(moduleId);\n    }\n\n    if (moduleIds.length === 0) {\n      ui.notifications?.info(i18n(\"midi-qol.ModuleReview.NoChanges\"));\n      return;\n    }\n\n    // Get current module configuration and enable checked modules\n    const moduleConfig = game.settings.get(\"core\", \"moduleConfiguration\") as Record<string, boolean>;\n    let changed = false;\n    for (const id of moduleIds) {\n      if (!moduleConfig[id]) {\n        moduleConfig[id] = true;\n        changed = true;\n      }\n    }\n\n    if (!changed) {\n      ui.notifications?.info(i18n(\"midi-qol.ModuleReview.NoChanges\"));\n      return;\n    }\n\n    await game.settings.set(\"core\", \"moduleConfiguration\", moduleConfig);\n    ui.notifications?.info(i18n(\"midi-qol.ModuleReview.ReloadPrompt\"));\n    this.close();\n    foundry.utils.debouncedReload();\n  }\n}\n","import { i18n, systemConcentrationId, error } from \"../../midi-qol.js\";\nimport { ModuleReviewDialog } from \"./ModuleReviewDialog.js\";\nimport { autoApplyDamageOptions, autoCEEffectsOptions, autoCheckHitOptions, autoCheckSavesOptions, autoEffectsOptions, autoTargetOptions, CheckedAuthorsList, checkedModuleList, checkMechanic, collectModuleData, collectSettingData, configSettings, coverCalculationOptions, enableWorkflow, exportSettingsToJSON, fetchParams, importSettingsFromJSON, rangeTargetOptions, safeGetGameSetting } from \"../settings.js\";\nimport { USEFUL_MODULE_VERSIONS, getModuleVersion, installedModules } from \"../setupModules.js\";\nconst { ApplicationV2, DialogV2, HandlebarsApplicationMixin } = foundry.applications.api;\n\nconst minimumMidiVersion = \"11.0.7\";\n\nexport class TroubleShooter extends HandlebarsApplicationMixin(ApplicationV2) {\n  public static errors: { timestamp: number, timeString: string, error: any, message: string | undefined }[] = [];\n  public static MAX_ERRORS = 10;\n  static _data: TroubleShooterData;\n  public static set data(data) { this._data = data };\n  public static get data() { return this._data }\n  // @ts-expect-error will be replaced in v2 anyway (which I have yet to do)\n  _fixerId: number;\n  // @ts-expect-error will be replaced in v2 anyway (which I have yet to do)\n  _fixerFuncs: Array<(app) => void>\n  get nextFixerId() { this._fixerId += 1; return this._fixerId }\n  _hookId;\n\n  constructor(...args) {\n    super(...args);\n    TroubleShooter.data = TroubleShooter.collectTroubleShooterData();\n    //@ts-expect-error\n    this._hookId = Hooks.on(\"midi-qol.TroubleShooter.recordError\", (errorDetail) => {\n      if (TroubleShooter.data.isLocal) {\n        TroubleShooter.data = TroubleShooter.collectTroubleShooterData();\n        this.render({force: true});\n      }\n    });\n    return this;\n  }\n\n  // async render(options?) {\n  //   await super.render(options);\n  //   if (options.tab) this._tabs[0].activate(options.tab);\n  //   return this;\n  // }\n\n  static override DEFAULT_OPTIONS = {\n    id: \"midi-trouble-shooter\",\n    classes: [\"midi-trouble-shooter\"],\n    window: {\n      title: \"midi-qol.TroubleShooter.Label\",\n      resizable: true,\n      contentClasses: [\"standard-form\"]\n    },\n    position: {\n      height: \"auto\" as \"auto\",\n      width: 900\n    },\n    form: {\n      closeOnSubmit: false\n    },\n    actions: {\n      export: TroubleShooter.#onExport,\n      import: TroubleShooter.#onImport,\n      refresh: TroubleShooter.#onRefresh,\n      clear: TroubleShooter.#onClear,\n      overwrite: TroubleShooter.#onOverwrite,\n      reviewModules: TroubleShooter.#onReviewModules\n    }\n  };\n\n  static override PARTS = {\n    tabs: {template: \"templates/generic/tab-navigation.hbs\"},\n    summary: {template: \"modules/midi-qol/templates/apps/TroubleShooter/summary.hbs\"},\n    common: {template: \"modules/midi-qol/templates/apps/TroubleShooter/common.hbs\"},\n    problems: {template: \"modules/midi-qol/templates/apps/TroubleShooter/problems.hbs\"},\n    errors: {template: \"modules/midi-qol/templates/apps/TroubleShooter/errors.hbs\"},\n    modules: {template: \"modules/midi-qol/templates/apps/TroubleShooter/modules.hbs\"},\n    footer: {template: \"templates/generic/form-footer.hbs\"}\n  }\n\n  // V13 version:\n  // static TABS = {\n  //   sheet: {\n  //     tabs: [\n  //       {id: \"summary\"},\n  //       {id: \"common\"},\n  //       {id: \"problems\"},\n  //       {id: \"errors\"},\n  //       {id: \"modules\"}\n  //     ],\n  //     initial: \"summary\",\n  //     labelPrefix: \"midi-qol.TroubleShooter.Tabs\"\n  //   }\n  // }\n\n  // V12 version:\n  tabGroups = {\n    sheet: \"summary\"\n  }\n\n  public static recordError(err, message?: string | undefined) {\n    if (!this.errors) this.errors = [];\n    while (this.errors.length >= this.MAX_ERRORS) this.errors.shift();\n    const timestamp = Date.now()\n    const timeString = `${new Date(timestamp).toLocaleDateString()} - ${new Date(timestamp).toLocaleTimeString()}`;\n    const stack = err.stack?.split(\"\\n\").map(s => removeIpAddressAndHostName(s));\n    const errorDetail = { timestamp, timeString, error: { message: err.message, stack }, message };\n    this.errors.push(errorDetail);\n    //@ts-expect-error\n    Hooks.callAll(\"midi-qol.TroubleShooter.recordError\", errorDetail);\n  }\n\n  public static clearErrors() {\n    this.errors = [];\n  }\n  public static logErrors() {\n  }\n  async _updateObject(event, formData) {\n  };\n\n  public static exportTroubleShooterData() {\n    const data = TroubleShooter.collectTroubleShooterData();\n    const filename = \"fvtt-midi-qol-troubleshooter.json\"\n    foundry.utils.saveDataToFile(JSON.stringify(data, null, 2), \"text/json\", filename);\n  }\n  public static async importTroubleShooterDataFromJSONDialog() {\n    const content = await foundry.applications.handlebars.renderTemplate(\"templates/apps/import-data.hbs\",\n      { hint1: \"Choose a Trouble Shooter JSON file to import\" });\n    let dialog = new Promise((resolve, reject) => {\n      new DialogV2({\n        window: { title: `Import Trouble Shooter Data` },\n        classes: [\"midi-qol-import-troubleshooter\"],\n        content: content,\n        position: {\n          width: 400,\n          height: \"auto\"\n        },\n        buttons: [\n          {\n            action: \"import\",\n            icon: \"fa-solid fa-file-import\",\n            label: 'Import',\n            default: true,\n            callback: event => {\n              const form = (event.currentTarget as HTMLElement | null)?.querySelector(\"form\");\n              if (!form?.data.files.length) return ui.notifications?.error(\"You did not upload a data file!\");\n              foundry.utils.readTextFromFile(form.data.files[0]).then(json => {\n                const jsonData = JSON.parse(json);\n                if (foundry.utils.isNewerVersion(minimumMidiVersion, jsonData.midiVersion ?? \"0.0.0\")) {\n                  ui.notifications?.error(\"Trouble Shooter Data is too old to use\");\n                  resolve(false);\n                  return;\n                }\n                jsonData.isLocal = false;\n                jsonData.fileName = form.data.files[0].name;\n                TroubleShooter.data = jsonData;\n                for (let error of TroubleShooter.data.errors) {\n                  error.timeString = `${new Date(error.timestamp).toLocaleDateString()} - ${new Date(error.timestamp).toLocaleTimeString()}`;\n\n                }\n                // Midi Settings Summary fields now all need to be a string. Older versions had booleans etc there so force them to string\n                const midiSummary = TroubleShooter.data.summary.midiSettings;\n                Object.keys(midiSummary).forEach(key => {\n                  if (typeof midiSummary[key] !== \"string\") midiSummary[key] = `${midiSummary[key]}`;\n                });\n                resolve(true);\n              });\n            }\n          },\n          {\n            action: \"no\",\n            icon: \"fa-solid fa-xmark\",\n            label: 'Cancel',\n            callback: event => resolve(false)\n          }\n        ],\n      }).render({force: true});\n    });\n    return await dialog;\n  }\n  public static getDetailedSettings(moduleId: string): any {\n    const returnValue = {};\n    let settings = Array.from(game.settings.settings ?? []).filter(i => i[0].includes(moduleId) && i[1].namespace === moduleId);\n    settings.forEach(i => {\n      if (typeof i[1].name !== \"string\") return;\n      if (!i[1].config) return;\n      let value: any = safeGetGameSetting(moduleId, i[1].key);\n      if (typeof value !== \"string\") value = JSON.stringify(value);\n      returnValue[i18n(i[1].name)] = value;\n    });\n    return returnValue;\n  }\n  static async troubleShooter(app) {\n    await TroubleShooter.exportTroubleShooterData();\n  }\n\n  async _onSubmit(...args): Promise<any> {\n    let [event, options] = args;\n    // error(\"On Submit\", event, options.updateData, options.preventClose, options.preventRender);\n    return {};\n  }\n\n  async _preClose(options) {\n    await super._preClose(options);\n    //@ts-expect-error\n    Hooks.off(\"midi-qol.TroubleShooter.recordError\", this._hookId);\n  }\n\n  static #onExport(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    TroubleShooter.exportTroubleShooterData();\n  }\n\n  static async #onImport(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    if (await TroubleShooter.importTroubleShooterDataFromJSONDialog()) {\n      // @ts-expect-error\n      this.render({force: true})\n    }\n  }\n\n  static #onRefresh(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    TroubleShooter.data = TroubleShooter.collectTroubleShooterData();\n    // @ts-expect-error\n    this.render({force: true});\n  }\n\n  static #onClear(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    TroubleShooter.clearErrors();\n    TroubleShooter.data = TroubleShooter.collectTroubleShooterData();\n    // @ts-expect-error\n    this.render({force: true});\n  }\n\n  static #onOverwrite(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    // @ts-expect-error\n    this.overWriteMidiSettings();\n  }\n\n  static #onReviewModules(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    const modules = TroubleShooter.data?.modules;\n    if (!modules || Object.keys(modules).length === 0) {\n      ui.notifications?.warn(i18n(\"midi-qol.TroubleShooter.NoModuleData\"));\n      return;\n    }\n    const activeModules = Object.fromEntries(\n      Object.entries(modules).filter(([_, mod]: [string, any]) => mod.active)\n    );\n    if (Object.keys(activeModules).length === 0) {\n      ui.notifications?.warn(i18n(\"midi-qol.TroubleShooter.NoModuleData\"));\n      return;\n    }\n    new ModuleReviewDialog(activeModules).render(true);\n  }\n\n  async _onRender(context, options) {\n    super._onRender(context, options);\n    for (let i = 0; i < this._fixerFuncs.length; i++) {\n      const id = `#fixer-${i + 1}`;\n      const fixerFunc = this._fixerFuncs[i];\n      const app = this;\n      this.element.querySelector(id)?.addEventListener(\"click\", function(event) {\n        event.preventDefault();\n        event.stopPropagation();\n        fixerFunc(app);\n      });\n    }\n  }\n\n  async overWriteMidiSettings(): Promise<boolean> {\n    if (!game.user?.isGM) {\n      ui.notifications?.error(\"Only a GM can overwrite midi settings\")\n      return false;\n    }\n    if (TroubleShooter.data.isLocal) {\n      ui.notifications?.warn(`midi-qol | Cant set midi settings - you have not loaded external trouble shooter data`)\n      return false;\n    }\n    let dialog: Promise<boolean> = new Promise((resolve, reject) => {\n      new DialogV2({\n        window: { title: `Overwrite midi-qol settings from loaded file` },\n        content: `<p>This will <strong><em>permanently</em></strong> overwrite your midi settings</p>`,\n        position: {\n          width: 400,\n          height: \"auto\"\n        },\n        buttons: [\n          {\n            action: \"overwrite\",\n            icon: \"fa-solid fa-file-import\",\n            label: 'Overwrite',\n            callback: async (event) => {\n              await exportSettingsToJSON(); // Just a safety net saving of the settings\n              const settingsJSON = TroubleShooter.data.midiSettings;\n              importSettingsFromJSON(settingsJSON);\n              //@ts-expect-error\n              Hooks.callAll(\"midi-qol.configSettingsChanged\");\n              resolve(true);\n            }\n          },\n          {\n            action: \"cancel\",\n            default: true,\n            icon: \"fa-solid fa-xmark\",\n            label: 'Cancel',\n            callback: event => resolve(false)\n          }\n        ],\n      }).render({force: true});\n    });\n    return await dialog;\n  }\n\n  async _prepareContext(options) {\n    let context: any = foundry.utils.deepClone(TroubleShooter.data);\n    context = foundry.utils.mergeObject(await super._prepareContext(options), context, {inplace: false});\n    context.hasIncompatible = context.summary.incompatible.length > 0;\n    context.hasOutOfDate = context.summary.outOfDate.length > 0;\n    context.hasPossibleOutOfData = context.summary.possibleOutOfDate.length > 0;\n    context.hasProblems = context.problems.length > 0;\n    context.hasErrors = context.errors.length > 0;\n    context.hasFoundryModuleProblems = !foundry.utils.isEmpty(context.summary.foundryModuleIssues);\n    this._fixerId = 0;\n    this._fixerFuncs = [];\n    const excludeFoundryWarnings = true;\n    if (excludeFoundryWarnings) {\n      for (let key of Object.keys(context.summary.foundryModuleIssues)) {\n        const problem = context.summary.foundryModuleIssues[key];\n        if (problem.error.length === 0) {\n          delete context.summary.foundryModuleIssues[key];\n        } else delete problem.warning;\n      }\n    }\n    for (let problem of context.problems) {\n      if (problem.problemDetail) problem.problemDetail = JSON.stringify(problem.problemDetail);\n      if (problem.fixerFunc) {\n        problem.hasFixerFunc = true;\n        problem.fixerId = this.nextFixerId;\n        this._fixerFuncs.push(problem.fixerFunc);\n      }\n    }\n    context.buttons = [\n      {\n        type: \"button\",\n        action: \"refresh\",\n        icon: \"fa-solid fa-gears\",\n        label: \"MENU.Reload\"\n      },\n      {\n        type: \"button\",\n        action: \"clear\",\n        icon: \"fa-solid fa-gears\",\n        label: \"midi-qol.TroubleShooter.ClearErrors\"\n      },\n      {\n        type: \"button\",\n        action: \"export\",\n        icon: \"fa-solid fa-floppy-disk\",\n        label: \"SIDEBAR.Export\"\n      },\n      {\n        type: \"button\",\n        action: \"import\",\n        icon: \"fa-solid fa-file-import\",\n        label: \"SIDEBAR.Import\"\n      },\n      {\n        type: \"button\",\n        action: \"overwrite\",\n        icon: \"fa-solid fa-download\",\n        label: \"midi-qol.TroubleShooter.Overwrite\"\n      },\n      {\n        type: \"button\",\n        action: \"reviewModules\",\n        icon: \"fa-solid fa-cubes\",\n        label: \"midi-qol.TroubleShooter.ReviewModules\"\n      }\n    ]\n    // V12-only:\n    context.tabs = this.#getTabs();\n    return context;\n  }\n\n  // V12-only:\n  #getTabs() {\n    const tabs = {\n      summary: {id: \"summary\", group: \"sheet\", label: \"midi-qol.TroubleShooter.Tabs.summary\", active: true},\n      common: {id: \"common\", group: \"sheet\", label: \"midi-qol.TroubleShooter.Tabs.common\"},\n      problems: {id: \"problems\", group: \"sheet\", label: \"midi-qol.TroubleShooter.Tabs.problems\"},\n      errors: {id: \"errors\", group: \"sheet\", label: \"midi-qol.TroubleShooter.Tabs.errors\"},\n      modules: {id: \"modules\", group: \"sheet\", label: \"midi-qol.TroubleShooter.Tabs.modules\"}\n    };\n    return tabs;\n  }\n\n  // V12-only (I think):\n  async _preparePartContext(partId, context) {\n    if (Object.keys(context.tabs).includes(partId)) {\n      context.tab = context.tabs[partId];\n    }\n    return context;\n  }\n\n  public static collectTroubleShooterData() {\n    let data: TroubleShooterData = {\n      midiVersion: game.modules.get(\"midi-qol\")?.version as string,\n      isLocal: true,\n      fileName: \"Local Settings\",\n      summary: {},\n      problems: [],\n      modules: {},\n      errors: {},\n      midiSettings: {}\n    };\n\n    const gameVersion = game.version ?? \"unknown\";\n    const gameSystemId = game.system?.id;\n    if (!gameSystemId) return data;\n    data.summary.gameSystemId = gameSystemId;\n    data.summary = {\n      \"foundry-version\": gameVersion,\n      \"Game System\": gameSystemId,\n      \"Game System Version\": game.system?.version,\n      \"midi-qol-version\": game.modules.get(\"midi-qol\")?.version,\n      \"Dynamic Active Effects Version\": game.modules.get(\"dae\")?.version,\n      \"coreSettings\": {\n        \"Photo Sensitivity\": safeGetGameSetting(\"core\", \"photosensitiveMode\")\n      },\n      \"gameSystemSettings\": {\n        \"Diagonal Distance Setting\": safeGetGameSetting(gameSystemId, \"diagonalMovement\"),\n        \"Proficiency Variant\": safeGetGameSetting(gameSystemId, \"proficiencyModifier\"),\n        \"Collapse Item Cards\": safeGetGameSetting(gameSystemId, \"autoCollapseItemCards\"),\n        \"Critical Damage Maximize Dice\": safeGetGameSetting(gameSystemId, \"criticalDamageMaxDice\"),\n        \"Critical Damage Modifiers\": safeGetGameSetting(gameSystemId, \"criticalDamageModifiers\"),\n        \"Concentration Disabled\": safeGetGameSetting(gameSystemId, \"disableConcentration\"),\n        \"Attack Visibility\": safeGetGameSetting(gameSystemId, \"attackRollVisibility\"),\n        \"Challenge Visibility\": safeGetGameSetting(gameSystemId, \"challengeVisibility\"),\n      },\n      \"moduleSettings\": {}\n    }\n    if (canvas.scene) {\n      const globalIllumination = canvas.scene?.environment?.globalLight?.enabled;\n      data.summary[\"coreSettings\"][\"Scene Details\"] =\n        `${canvas.scene.dimensions.height} x ${canvas.scene.dimensions.width} | Size: ${canvas.scene.grid.size} | Type: ${Object.keys(CONST.GRID_TYPES)[canvas.scene.grid.type]} | Distance: ${canvas.scene.grid.distance} | Global Illumination ${globalIllumination}`;\n\n      const sceneObjects = [\"tokens\", \"sounds\", \"tiles\", \"walls\", \"lights\", \"templates\", \"notes\"];\n      const report: string[] = []\n      for (let c of sceneObjects) {\n        const collection = canvas.scene[c];\n        report[c] = `${c} ${collection.size}${collection.invalidDocumentIds.size > 0 ?\n          ` (${collection.invalidDocumentIds.size} ${i18n(\"Invalid\")})` : \"\"}`;\n      }\n      data.summary[\"coreSettings\"][\"Scene Objects\"] = Object.values(report).join(\" | \");\n    }\n    const report: string[] = []\n    const reportCollections = [\"actors\", \"items\", \"journal\", \"tables\", \"playlists\", \"messages\"];\n    for (let c of reportCollections) {\n      const collection = game[c];\n      report[c] = `${c} ${collection.size}${collection.invalidDocumentIds.size > 0 ?\n        ` (${collection.invalidDocumentIds.size} ${i18n(\"Invalid\")})` : \"\"}`;\n    }\n    data.summary[\"coreSettings\"][\"World Object counts\"] = Object.values(report).join(\" | \");\n    data.summary[\"coreSettings\"][\"Module Count\"] = `Active: ${game.modules.filter(m => m.active).length} | Installed: ${game.modules.size}`;\n    if (game.modules.get(\"ActiveAuras\")?.active) {\n      data.summary.moduleSettings[\"Active Auras In Combat\"] = safeGetGameSetting(\"ActiveAuras\", \"combatOnly\");\n    }\n    if (game.modules.get(\"ddb-importer\")?.active) {\n    } else data.summary.moduleSettings[\"DDB Importer\"] = i18n(\"midi-qol.Inactive\");\n    if (game.modules.get(\"dfreds-convenient-effects\")?.active) {\n      data.summary.moduleSettings[\"Convenient Effects Modify Status Effects\"] = safeGetGameSetting(\"dfreds-convenient-effects\", \"modifyStatusEffects\");\n    } else data.summary.moduleSettings[\"Convenient Effects\"] = i18n(\"midi-qol.Inactive\");\n    if (game.modules.get(\"monks-little-details\")?.active) {\n      data.summary.moduleSettings[\"Monk's Little Details Status Effects\"] = safeGetGameSetting(\"monks-little-details\", \"add-extra-statuses\");\n      data.summary.moduleSettings[\"Monk's Little Clear Targets\"] = safeGetGameSetting(\"monks-little-details\", \"clear-targets\");\n      data.summary.moduleSettings[\"Monk's Little Remember Targets\"] = safeGetGameSetting(\"monks-little-details\", \"remember-previous\");\n    } else data.summary.moduleSettings[\"Monk's Little Details\"] = i18n(\"midi-qol.Inactive\");\n    if (game.modules.get(\"monks-tokenbar\")?.active) {\n      data.summary.moduleSettings[\"Monk's Token Bar Allow Players to use\"] = safeGetGameSetting(\"monks-tokenbar\", \"allow-player\");\n    } else data.summary.moduleSettings[\"Monks Token Bar\"] = i18n(\"midi-qol.Inactive\");\n    if (game.modules.get(\"flash-rolls-5e\")?.active) {\n      data.summary.moduleSettings[\"Flash Token Bar Active\"] = \"true\";\n    } else data.summary.moduleSettings[\"Flash Token Bar\"] = i18n(\"midi-qol.Inactive\");\n    if (game.modules.get(\"sequencer\")?.active) {\n      data.summary.moduleSettings[\"Sequencer Enable Effects\"] = safeGetGameSetting(\"sequencer\", \"effectsEnabled\");\n      data.summary.moduleSettings[\"Sequencer Enable Sounds\"] = safeGetGameSetting(\"sequencer\", \"soundsEnabled\")\n    } else data.summary.moduleSettings[\"Sequencer\"] = i18n(\"midi-qol.Inactive\");\n    if (game.modules.get(\"times-up\")?.active) {\n      data.summary.moduleSettings[\"Times Up Disable Passive Effects Expiry\"] = safeGetGameSetting(\"times-up\", \"DisablePassiveEffects\");\n    } else data.summary.moduleSettings[\"Times-Up\"] = i18n(\"midi-qol.Inactive\");\n    if (game.modules.get(\"tokenmagic\")?.active) {\n      data.summary.moduleSettings[\"Token Magic FX Automatic Template Effects \"] = safeGetGameSetting(\"tokenmagic\", \"autoTemplateEnabled\");\n      data.summary.moduleSettings[\"Token Magic FX Default Template Grid on Hover \"] = safeGetGameSetting(\"tokenmagic\", \"defaultTemplateOnHover\");\n      data.summary.moduleSettings[\"Token Magic FX Auto Hide Template Elements \"] = safeGetGameSetting(\"tokenmagic\", \"autohideTemplateElements\");\n    } else data.summary.moduleSettings[\"Token Magic FX\"] = i18n(\"midi-qol.Inactive\");\n\n    // SelectOptionValue can be string or {label, hint} — extract the label string for display\n    const optLabel = (v: any): string => typeof v === \"string\" ? v : v?.label ?? \"\";\n\n    data.summary.midiSettings = {};\n    data.summary.midiSettings[\"Enable Roll Automation Support (Client Setting)\"] = `${enableWorkflow}`;\n    data.summary.midiSettings[\"Auto Target on Template Draw\"] = optLabel(autoTargetOptions[configSettings.autoTarget]);\n    data.summary.midiSettings[\"Auto Target for Ranged Targets/Spells\"] = optLabel(rangeTargetOptions[configSettings.rangeTarget]);\n    data.summary.midiSettings[\"Auto Apply Item Effects\"] = optLabel(autoEffectsOptions[configSettings.autoItemEffects]);\n    data.summary.midiSettings[\"Apply Convenient Effects\"] = optLabel(autoCEEffectsOptions[configSettings.autoCEEffects]);\n    data.summary.midiSettings[\"Auto Check Hits\"] = optLabel(autoCheckHitOptions[configSettings.autoCheckHit]);\n    data.summary.midiSettings[\"Roll Seperate Attacks per Target\"] = `${configSettings.attackPerTarget}`;\n    data.summary.midiSettings[\"Auto Check Saves\"] = optLabel(autoCheckSavesOptions[configSettings.autoCheckSaves]);\n    data.summary.midiSettings[\"Auto Apply Damage to Target\"] = optLabel(autoApplyDamageOptions[configSettings.autoApplyDamage]);\n    // data.summary.midiSettings[\"Enable Concentration Automation\"] = configSettings.concentrationAutomation;\n    data.summary.midiSettings[\"Expire 1Hit/1Attack/1Action on roll\"] = `${checkMechanic(\"actionSpecialDurationImmediate\")}`;\n    data.summary.midiSettings[\"Inapacitated Actors can't Take Actions\"] = `${checkMechanic(\"incapacitated\")}`;\n    data.summary.midiSettings[\"Calculate Cover\"] = optLabel(coverCalculationOptions[configSettings.optionalRules.coverCalculation]);\n    data.summary.midiSettings[\"Add Fake GM Dice\"] = `${configSettings.addFakeDice}`;\n    data.summary.knownModules = {};\n    let tempModules = {};\n    // Find modules by id\n    checkedModuleList.forEach(matcher => {\n      const modules = game.modules.filter(m => !!m.id.match(matcher)) ?? [];\n      if (modules.length > 0) {\n        modules.forEach(module => {\n          foundry.utils.setProperty(tempModules, module.id, { title: module.title, active: module.active, installed: true, moduleVersion: module.version, foundryVersion: module.compatibility?.verified });\n        })\n      } else {\n        foundry.utils.setProperty(tempModules, matcher.toString(), { title: \"Not installed\", active: false, installed: false, moduleVersion: ``, foundryVersion: `` });\n      }\n    });\n    const baseVersion = game.version?.slice(0, 2) ?? \"unknown\";\n    const maxVersion = baseVersion + \".999\";\n    CheckedAuthorsList.forEach(matcher => {\n      // @ts-expect-error\n      const modules = game.modules.filter(m => m.authors.find(au => au.name.toLocaleLowerCase().match(matcher))) ?? [];\n      if (modules.length > 0) {\n        modules.forEach(module => {\n          foundry.utils.setProperty(tempModules, module.id, { title: module.title, active: module.active, installed: true, moduleVersion: module.version, foundryVersion: module.compatibility?.verified });\n        })\n      }\n    });\n    Object.keys(tempModules)\n      .sort((m1, m2) => m1 < m2 ? -1 : m1 > m2 ? 1 : 0)\n      .forEach(key => { data.summary.knownModules[key] = tempModules[key] });\n    /*\n    checkedModuleList.forEach(moduleId => {\n      const moduleData = game.modules.get(moduleId);\n      if (moduleData)\n        //@ts-expect-error .version\n        foundry.utils.setProperty(data.summary.knownModules, moduleId, { title: moduleData.title, active: moduleData?.active, installed: true, moduleVersion: moduleData?.version, foundryVersion: moduleData.compatibility?.verified });\n      else\n        foundry.utils.setProperty(data.summary.knownModules, moduleId, { title: \"Not installed\", active: false, installed: false, moduleVersion: ``, foundryVersion: `` });\n    });\n    */\n\n    data.modules = collectModuleData();\n\n    // Plutonium detection for summary warning\n    for (const id of Object.keys(data.modules)) {\n      if (id.match(/xxxxxxxxx/i)) {\n        data.summary.moduleSettings[\"xxxxxxxxx detected\"] = \"incompatible importer found\";\n      }\n    }\n\n    for (const [moduleId, moduleEntry] of Object.entries(data.modules) as [string, any][]) {\n      switch (moduleId) {\n        case \"ATL\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"ActiveAuras\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"about-time\":\n          break;\n        case \"anonymous\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"autoanimations\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          if (game.modules.get(\"autoanimations\")?.active) this.checkAutoAnimations(data);\n          break;\n        case \"combat-utility-belt\":\n          break;\n        case \"condition-lab-triggler\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"dae\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"ddb-game-log\":\n          break;\n        case \"dfreds-convenient-effects\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n\n          break;\n        case \"dice-so-nice\":\n          break;\n        case \"effect-macro\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"foundryvtt=simple-calendar\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"itemacro\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          this.checkItemMacro(data);\n          break;\n        case \"levels\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"levelsautocover\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"levelsvolumetrictemplates\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"lib-wrapper\":\n          if (!(game.modules.get(\"lib-wrapper\")?.active)) {\n            data.problems.push({\n              moduleId: \"lib-wrapper\",\n              severity: \"Error\",\n              critical: true,\n              problemSummary: \"Midi won't function without lib-wrapper\",\n              fixer: \"Install and activate lib-wrapper\",\n              problemDetail: undefined\n            });\n          };\n          break;\n        case \"midi-qol\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"monks-combat-details\":\n          if (safeGetGameSetting(\"monks-combat-details\", \"auto-defeated\") !== \"none\" && configSettings.addDead !== \"none\") {\n            data.problems.push({\n              moduleId: \"monks-combat-details\",\n              severity: \"Error\",\n              problemSummary: \"Both Midi and Monks Combat Details are adding defeated effects\",\n              fixer: \"Disable defeated effects in one of the modules\",\n              problemDetail: undefined\n            });\n          }\n          break;\n        case \"monks-little-details\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"monks-tokenbar\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"flash-rolls-5e\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"multilevel-tokens\":\n          break;\n        case \"simbuls-cover-calculator\":\n          break;\n        case \"socketlib\":\n          if (!(game.modules.get(\"socketlib\")?.active)) {\n            data.problems.push({\n              moduleId: \"socketlib\",\n              severity: \"Error\",\n              critical: true,\n              problemSummary: \"Midi won't function without socketlib\",\n              fixer: \"Install and activate socketlib\",\n              problemDetail: undefined\n            });\n          };\n          break;\n        case \"times-up\":\n          if (!(game.modules.get(\"times-up\")?.active)) {\n            data.problems.push({\n              moduleId: \"times-up\",\n              severity: \"Warn\",\n              problemSummary: \"Times Up is not installed or not active. Effects won't expire\",\n              fixer: \"Install and activate times-up\",\n              problemDetail: undefined\n            });\n          };\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          break;\n        case \"walledtemplates\":\n          this.checkWalledTemplates(data);\n          break;\n        case \"warpgate\":\n          foundry.utils.setProperty(data.modules[moduleId], \"settings\", TroubleShooter.getDetailedSettings(moduleId));\n          // if (game.modules.get(\"warpgate\")?.active) TroubleShooter.checkWarpgateUserPermissions(data);\n          break;\n        case \"wjmaia\":\n          break;\n        case \"advancedspelleffects\":\n        case \"attack-roll-check-5e\":\n        case \"betterrolls5e\":\n        case \"dice-rng-protector\":\n        case \"effective-transferral\":\n        case \"fast-rolls\":\n        case \"faster-rolling-by-default-5e\":\n        case \"gm-paranoia-taragnor\":\n        case \"max-crit\":\n        case \"mre-dnd5e\":\n        case \"multiattack-5e\":\n        case \"obsidian\":\n        case \"quick-rolls\":\n        case \"ready-set-roll-5e\":\n        case \"roll-tooltips-5e\":\n        case \"retroactive-advantage-5e\":\n        case \"rollgroups\":\n        case \"wire\":\n          data.modules[moduleId].incompatible = true;\n          break;\n      }\n    }\n    // Check Incompatible modules\n    data.summary.incompatible = Object.keys(data.modules)\n      .filter(key => data.modules[key].incompatible && game.modules.get(key)?.active)\n      .map(key => ({ key, title: data.modules[key].title }));\n\n    data.summary.foundryModuleIssues = foundry.utils.duplicate(game.issues?.packageCompatibilityIssues);\n    for (let key in data.summary.foundryModuleIssues) {\n      const issue: any = data.summary.foundryModuleIssues[key];\n      issue.title = game.modules.get(key)?.title;\n      delete issue.manifest;\n    }\n\n    data.summary.outOfDate = Object.keys(data.modules)\n      .filter(key => foundry.utils.isNewerVersion(baseVersion, data.modules[key].compatibility ?? 0))\n      .map(key => {\n        const versionString = `${data.modules[key].active ? i18n(\"midi-qol.Active\") : i18n(\"midi-qol.Inactive\")} ${data.modules[key].version}`\n        return {\n          key,\n          title: data.modules[key].title,\n          active: data.modules[key].active,\n          moduleVersion: data.modules[key].version, //versionString,\n          foundryVersion: data.modules[key].compatibility\n        }\n      });\n    data.summary.possibleOutOfDate = Object.keys(data.modules).filter(key => {\n      let moduleVersion = data.modules[key].compatibility ?? \"0.0.0\";\n      if (moduleVersion === baseVersion) moduleVersion = maxVersion\n      // if (!data.modules[key].active) return false;\n      if (foundry.utils.isNewerVersion(baseVersion, moduleVersion)) return false;\n      return foundry.utils.isNewerVersion(gameVersion, moduleVersion)\n    }).map(key =>\n    ({\n      key,\n      title: data.modules[key].title,\n      active: data.modules[key].active,\n      moduleVersion: data.modules[key].version,\n      version: data.modules[key].compatibility\n    }));\n    for (let key of Object.keys(USEFUL_MODULE_VERSIONS)) {\n      if (game.modules.get(key)?.active) {\n        const installedVersion = getModuleVersion(key);\n        const requiredVersion = USEFUL_MODULE_VERSIONS[key];\n        if (foundry.utils.isNewerVersion(requiredVersion, installedVersion)) {\n          data.problems.push({\n            moduleId: key,\n            severity: \"Error\",\n            problemSummary: `${key} needs to be at least version ${requiredVersion} but is version ${installedVersion} and will not be used`,\n            fixer: `Update ${key} to latest version`,\n            problemDetail: undefined\n          });\n        }\n      }\n    }\n\n    data.summary.foundryReportedErrors\n    let midiSettings: any = foundry.utils.duplicate(collectSettingData());\n    delete midiSettings.flags;\n    data.midiSettings = midiSettings;\n    TroubleShooter.checkCommonProblems(data);\n    data.errors = foundry.utils.duplicate(TroubleShooter.errors).reverse();\n    return data;\n  }\n\n  public static checkConcentrationStatusEffects(data: TroubleShooterData) {\n    if (safeGetGameSetting(game.system?.id ?? \"dnd5e\", \"disableConcentration\")) return;\n    let severity: \"Error\" | \"Warn\" = \"Error\";\n    let statusEffect = CONFIG.statusEffects.find(e => e.id === systemConcentrationId);\n\n    if (!statusEffect) {\n      data.problems.push({\n        moduleId: \"midi-qol\",\n        severity,\n        problemSummary: `Concentration Automation is enabled but the status effect with id \"${systemConcentrationId}\" was not found.`,\n        problemDetail: undefined,\n        fixer: \"Check which module is removing the concentrating status effect\"\n      });\n    }\n  }\n\n  public static checkMidiCoverSettings(data: TroubleShooterData) {\n    switch (configSettings.optionalRules.wallsBlockRange) {\n      case \"none\":\n        break;\n      case \"center\":\n        break;\n      case \"centerLevels\":\n        if (!(game.modules.get(\"levels\")?.active)) {\n          data.problems.push({\n            moduleId: \"levels\",\n            severity: \"Error\",\n            problemSummary: \"You must enable the 'levels' module to use the 'Center Levels' option for 'Walls Block Range'\",\n            problemDetail: undefined,\n            fixer: \"Enable the 'levels' module\"\n          });\n        }\n        break;\n      case \"levelsautocover\":\n        if (!(game.modules.get(\"levelsautocover\")?.active)) {\n          data.problems.push({\n            moduleId: \"levelsautocover\",\n            severity: \"Error\",\n            problemSummary: \"You must enable the 'levelsautocover' module to use the 'Levels Auto Cover' option for 'Walls Block Range'\",\n            problemDetail: undefined,\n            fixer: \"Enable the 'levelsautocover' module\"\n          });\n        }\n        break;\n      case \"simbuls-cover-calculator\":\n        if (!(game.modules.get(\"simbuls-cover-calculator\")?.active)) {\n          data.problems.push({\n            moduleId: \"simbuls-cover-calculator\",\n            severity: \"Error\",\n            problemSummary: \"You must enable the 'simbuls-cover-calculator' module to use the 'Simbul's Cover Calculator' option for 'Walls Block Range'\",\n            problemDetail: undefined,\n            fixer: \"Enable the 'simbuls-cover-calculator' module\"\n          });\n        }\n        break;\n      case \"tokenvisibility\":\n        data.problems.push({\n          moduleId: \"tokenvisibility\",\n          severity: \"Error\",\n          problemSummary: \"Midi has swtiched to Alternate Token Cover from Alternate Token Visibility. You should install and activate Alternative Token Cover\",\n          problemDetail: undefined,\n          fixer: \"Enable the 'tokencover' module and set 'Walls Block Range' to 'Token Cover' on the Mechanics Tab\"\n        });\n        break;\n      case \"tokencover\":\n        if (!(game.modules.get(\"tokencover\")?.active)) {\n          data.problems.push({\n            moduleId: \"tokencover\",\n            severity: \"Error\",\n            problemSummary: \"You must enable the 'tokencover' module to use the 'Token Cover' option for 'Walls Block Range'\",\n            problemDetail: undefined,\n            fixer: \"Enable the 'tokencover' module\"\n          });\n        }\n        break;\n    }\n    switch (configSettings.optionalRules.coverCalculation) {\n      case \"none\":\n        break;\n      case \"levelsautocover\":\n        if (!(game.modules.get(\"levelsautocover\")?.active)) {\n          data.problems.push({\n            moduleId: \"levelsautocover\",\n            severity: \"Error\",\n            problemSummary: \"You must enable the 'levelsautocover' module to use the 'Levels Auto Cover' option for 'Walls Block Range'\",\n            problemDetail: undefined,\n            fixer: \"Enable the 'levelsautocover' module\"\n          });\n        }\n        break;\n      case \"simbuls-cover-calculator\":\n        if (!(game.modules.get(\"simbuls-cover-calculator\")?.active)) {\n          data.problems.push({\n            moduleId: \"simbuls-cover-calculator\",\n            severity: \"Error\",\n            problemSummary: \"You must enable the 'simbuls-cover-calculator' module to use the 'Simbul's Cover Calculator' option for 'Walls Block Range'\",\n            problemDetail: undefined,\n            fixer: \"Enable the 'simbuls-cover-calculator' module\"\n          });\n        }\n        break;\n      case \"tokenvisibility\":\n        data.problems.push({\n          moduleId: \"tokenvisibility\",\n          severity: \"Error\",\n          problemSummary: \"Midi has swtiched to Alternate Token Cover from Alternate Token Visibility. You should install Alternative Token Cover\",\n          problemDetail: undefined,\n          fixer: \"Enable the 'tokencover' module and update 'Calculate Cover' to 'Token Cover' on the Mechanics tab\"\n        });\n        break;\n      case \"tokencover\":\n        if (!(game.modules.get(\"tokencover\")?.active)) {\n          data.problems.push({\n            moduleId: \"tokencover\",\n            severity: \"Error\",\n            problemSummary: \"You must enable the 'tokencover' module to use the 'Token Cover' option for 'Walls Block Range'\",\n            problemDetail: undefined,\n            fixer: \"Enable the 'tokencover' module\"\n          });\n        }\n        break;\n    }\n\n    switch (configSettings.autoTarget) {\n      case \"walledtemplates\":\n        if (!game.modules.get(\"walledtemplates\")?.active) {\n          data.problems.push({\n            moduleId: \"walledtemplates\",\n            severity: \"Error\",\n            problemSummary: \"You must enable the 'walledtemplates' module to use the 'Walled Templates' option for 'Auto Target on Template Draw'\",\n            problemDetail: undefined,\n            fixer: \"Enable the 'walledtemplates' module\"\n          });\n        }\n        break;\n    }\n  }\n\n  public static checkMidiSaveSettings(data: TroubleShooterData) {\n    if (!installedModules.get(\"monks-tokenbar\")\n      && (configSettings.playerRollSaves === \"mtb\" || configSettings.rollNPCSaves === \"mtb\" || configSettings.rollNPCLinkedSaves === \"mtb\")) {\n      data.problems.push({\n        moduleId: \"monks-tokenbar\",\n        severity: \"Error\",\n        problemSummary: \"You must enable the 'monks-tokenbar' module to use the 'Monk's Token Bar' option for 'Roll NPC.Player Saves'\",\n        problemDetail: undefined,\n        fixer: \"Enable the 'monks-tokenbar' module\"\n      });\n    }\n    if (!installedModules.get(\"flash-rolls-5e\")\n      && (configSettings.playerRollSaves === \"ftb\" || configSettings.rollNPCSaves === \"ftb\" || configSettings.rollNPCLinkedSaves === \"ftb\")) {\n      data.problems.push({\n        moduleId: \"flash-rolls-5e\",\n        severity: \"Error\",\n        problemSummary: \"You must enable the 'flash-rolls-5e' module to use the 'Flash Token Bar' option for 'Roll NPC/Player Saves'\",\n        problemDetail: undefined,\n        fixer: \"Enable the 'flash-rolls-5e' module\"\n      });\n    }\n  }\n  public static checkWalledTemplates(data: TroubleShooterData) {\n    if (game.modules.get(\"walledtemplates\")?.active) {\n      const walledTemplatesTargeting = safeGetGameSetting(\"walledtemplates\", \"autotarget-menu\") === 'yes' || (safeGetGameSetting(\"walledtemplates\", \"autotarget-menu\") === 'toggle' && safeGetGameSetting(\"walledtemplates\", \"autotarget-enabled\"));\n      // const walledTemplatesTargeting = safeGetGameSetting(\"walledtemplates\", \"autotarget-enabled\");\n      const midiTargeting = configSettings.autoTarget !== \"walledtemplates\" && configSettings.autoTarget !== \"none\";\n\n      if (walledTemplatesTargeting && midiTargeting) {\n        data.problems.push({\n          moduleId: \"walledtemplates\",\n          severity: \"Error\",\n          problemSummary: \"Both walled templates auto targeting and midi's auto targeting are enabled\",\n          problemDetail: undefined,\n          fixer: \"Only enable one of the auto targeting options\",\n          /*          fixerFunc: async function (app: TroubleShooter) {\n                      if (!game.user?.isGM) {\n                        ui.notifications?.error(\"midi-qol | You must be a GM to fix walled templates auto target\");\n                        return;\n                      }\n                      await game.settings.set(\"walledtemplates\", \"autotarget-enabled\", true);\n                      await game.settings.set(\"walledtemplates\", \"autotarget-menu\", \"yes\");\n                      configSettings.autoTarget = \"walledtemplates\";\n                      await game.settings.set(\"midi-qol\", \"ConfigSettings\", configSettings);\n                      //@ts-expect-error reload configure\n                      SettingsConfig.reloadConfirm({ world: true });\n                      TroubleShooter.data = TroubleShooter.collectTroubleShooterData();\n                      app.render(true)\n                    },\n          */\n          fixerId: -1\n        });\n      } else if (walledTemplatesTargeting && configSettings.autoTarget !== \"walledtemplates\") {\n        data.problems.push({\n          moduleId: \"walledtemplates\",\n          severity: \"Error\",\n          problemSummary: \"Walled templates is set to auto target and midi is not using it for targeting\",\n          problemDetail: undefined,\n          fixer: \"Disable walled templates auto target\",\n          fixerFunc: async function (app: TroubleShooter) {\n            if (!game.user?.isGM) {\n              ui.notifications?.error(\"midi-qol | You must be a GM to fix walled templates settings\");\n              return;\n            }\n            // @ts-expect-error\n            await game.settings.set(\"walledtemplates\", \"autotarget-enabled\", false);\n            // @ts-expect-error\n            await game.settings.set(\"walledtemplates\", \"autotarget-menu\", \"no\");\n            TroubleShooter.data = TroubleShooter.collectTroubleShooterData();\n            app.render(true)\n          },\n          fixerId: -1\n        });\n      }\n    } else if (configSettings.autoTarget === \"walledtemplates\") {\n      data.problems.push({\n        moduleId: \"walledtemplates\",\n        severity: \"Error\",\n        problemSummary: \"Midi is set to use walled templates but the module is not enabled\",\n        problemDetail: undefined,\n        fixer: \"Enable the walled templates module\",\n        fixerId: -1\n      });\n    }\n  }\n\n  public static checkItemMacro(data: TroubleShooterData) {\n    if (!game.modules.get(\"itemacro\")?.active) return;\n    if (safeGetGameSetting('itemacro', 'charsheet')) {\n      data.problems.push({\n        moduleId: \"itemacro\",\n        severity: \"Warn\",\n        problemSummary: \"Item Macro Character sheet hook is enabled.\",\n        problemDetail: undefined,\n        fixer: \"Turn off the setting in module settings or use the auto fix button\",\n        fixerFunc: async function (app: TroubleShooter) {\n          if (!game.user?.isGM) {\n            ui.notifications?.error(\"midi-qol | You must be a GM to fix Item Macro char sheet flag\");\n            return;\n          }\n          // @ts-expect-error\n          await game.settings.set(\"itemacro\", \"charsheet\", false);\n          //@ts-expect-error\n          SettingsConfig.reloadConfirm({ world: true });\n        },\n        fixerId: -1\n      });\n    }\n  }\n\n  public static checkCommonProblems(data: TroubleShooterData) {\n    this.checkMidiSettings(data);\n    this.checkMidiCoverSettings(data)\n    this.checkMidiSaveSettings(data);\n    this.checkNoActorTokens(data);\n    this.checkConcentrationStatusEffects(data);\n    this.checkChatLogPrune(data);\n  }\n\n  public static checkChatLogPrune(data: TroubleShooterData) {\n    if (!(game.modules.get(\"chatlog-prune\")?.active)) {\n      data.problems.push({\n        moduleId: \"chatlog-prune\",\n        severity: \"Warn\",\n        problemSummary: \"Chat Log Prune is not active. Long sessions may experience performance issues as chat messages accumulate.\",\n        problemDetail: undefined,\n        fixer: \"Install and activate chatlog-prune\"\n      });\n    }\n  }\n\n  public static checkAutoAnimations(data: TroubleShooterData) {\n  }\n\n  // public static checkWarpgateUserPermissions(data: TroubleShooterData) {\n  //   if (!game.permissions?.TOKEN_CREATE.includes(1)) {\n  //     const problem: ProblemSpec = {\n  //       moduleId: \"warpgate\",\n  //       severity: \"Warn\",\n  //       problemSummary: \"Players Do not have permission to create tokens\",\n  //       problemDetail: undefined,\n  //       fixer: \"Edit player permissions\"\n  //     }\n  //     data.problems.push(problem);\n  //   }\n\n  //   if (!game.permissions?.TOKEN_CONFIGURE.includes(1)) {\n  //     const problem: ProblemSpec = {\n  //       moduleId: \"warpgate\",\n  //       severity: \"Warn\",\n  //       problemSummary: \"Players Do not have permission to configure tokens\",\n  //       problemDetail: undefined,\n  //       fixer: \"Edit player permissions\"\n  //     }\n  //     data.problems.push(problem);\n  //   }\n\n  //   if (!game.permissions?.FILES_BROWSE.includes(1)) {\n  //     const problem: ProblemSpec = {\n  //       moduleId: \"warpgate\",\n  //       severity: \"Warn\",\n  //       problemSummary: \"Players Do not have permission to browse files\",\n  //       problemDetail: undefined,\n  //       fixer: \"Edit player permissions\"\n  //     }\n  //     data.problems.push(problem);\n  //   }\n  // }\n\n  // Check for tokens with no actors\n  public static checkNoActorTokens(data: TroubleShooterData) {\n    const problemTokens = canvas.tokens?.placeables.filter(token => !token.actor);\n    if (problemTokens?.length) {\n      let problem: ProblemSpec = {\n        moduleId: \"midi-qol\",\n        severity: \"Warn\",\n        problemSummary: \"There are tokens with no actor in the scene\",\n        problemDetail: problemTokens.map(t => {\n          const detail = {};\n          detail[`${t.scene?.name ?? \"\"} - ${t.name}`] = t.document.uuid;\n          return detail;\n        }),\n        fixer: \"You should edit or remove them\"\n      }\n      data.problems.push(problem);\n    }\n  }\n\n  public static checkMidiSettings(data: TroubleShooterData) {\n    if (!(safeGetGameSetting(\"midi-qol\", \"EnableWorkflow\"))) {\n      data.problems.push({\n        moduleId: \"midi-qol\",\n        severity: \"Warn\",\n        problemSummary: \"Combat automation is disabled\",\n        problemDetail: \"Also need to check on all player clients\",\n        fixerFunc: async function (app: TroubleShooter) {\n          game.settings.set(\"midi-qol\", \"EnableWorkflow\", true).then(() => {\n            fetchParams();\n            TroubleShooter.data = TroubleShooter.collectTroubleShooterData();\n            app.render({ force: true })\n          });\n        },\n        fixerId: -1\n      });\n    }\n  }\n}\n\ninterface ProblemSpec {\n  moduleId: string | undefined,\n  severity: \"Error\" | \"Warn\" | \"Inform\",\n  problemSummary: string,\n  critical?: boolean,\n  problemDetail: any | undefined,\n  fixer?: string,\n  fixerFunc?: any,\n  fixerId?: number;\n}\ninterface TroubleShooterData {\n  midiVersion: string;\n  isLocal: boolean;\n  fileName: string;\n  summary: any,\n  problems: ProblemSpec[],\n  modules: any\n  errors: any,\n  midiSettings: any\n}\n\n\nfunction removeIpAddressAndHostName(inputString) {\n  // Regular expression to match URLs\n  const urlRegex = /(?:https?|ftp):\\/\\/([a-zA-Z0-9.-]+)(?::\\d+)?(\\/[^\\s]*)?/gi;\n\n  // Replace each matched URL with a sanitised version\n  const sanitisedString = inputString.replace(urlRegex, (match, hostname) => {\n    return match.replaceAll(hostname, \"<address>\")\n  });\n\n  return sanitisedString;\n}","import { error, warn, log, debugEnabled, i18n } from \"../midi-qol.js\";\nimport { TroubleShooter } from \"./apps/TroubleShooter.js\";\nimport { configSettings, pruneChatLog } from \"./settings.js\";\n\nexport const DAE_REQUIRED_VERSION = \"13.0.23\";\nexport const USEFUL_MODULE_VERSIONS = {\n  \"about-time\": \"0.0\",\n  \"ActiveAuras\": \"0.4.13\",\n  \"anonymous\": \"0.0.0\",\n  \"auraeffects\": \"1.3.4\",\n  \"autoanimations\": \"3.2.991\",\n  \"chatlog-prune\": \"1.0.1\",\n  \"chris-premades\": \"1.3.0\",\n  \"condition-lab-triggler\": \"1.4\",\n  \"dae\": DAE_REQUIRED_VERSION,\n  \"ddb-game-log\": \"0.0.0\",\n  \"dfreds-convenient-effects\": \"5.0.4\",\n  \"dice-so-nice\": \"4.1.1\",\n  \"epic-rolls-5e\": \"3.1.1\",\n  \"flash-rolls-5e\": \"1.13.1\",\n  \"gambits-premades\": \"2.0.1\",\n  \"levels\": \"6.0.0\",\n  \"levelsautocover\": \"1.4\",\n  \"levelsvolumetrictemplates\": \"0.0.0\",\n  \"lib-changelogs\": \"0.0.0\",\n  \"lib-wrapper\": \"1.3.5\",\n  \"magicitems\": \"4.0.0\",\n  \"midi-item-showcase-community\": \"1.5\",\n  \"monks-tokenbar\": \"1.0.55\",\n  \"multilevel-tokens\": \"13.0.0\",\n  \"perceptive\": \"3.2.1\",\n  \"ready-set-roll-5e\": \"3.4.3\",\n  \"seasons-and-stars\": \"0.11.0\",\n  \"simbuls-cover-calculator\":  \"1.0.2\",\n  \"simplecover5e\": \"1.3.1\",\n  \"socketlib\": \"0.0\",\n  \"times-up\": \"13.0.0\",\n  \"tokencover\": \"0.6.0\",\n  \"vision-5e\": \"3.0.6\",\n  \"walledtemplates\": \"0.0.0\",\n  \"wjmais\": \"0.0.0\",\n};\nexport let installedModules = new Map<string, boolean>();\n\nexport function getModuleVersion(moduleName: string): string {\n  let modVer = game.modules.get(moduleName)?.version || \"0.0.0\";\n  if (!/[0-9\\.]+/.test(modVer)) {\n    console.warn(`midi-qol | module ${moduleName} has unrecognised version ${modVer} using ${USEFUL_MODULE_VERSIONS[moduleName]} instead}`);\n    modVer = USEFUL_MODULE_VERSIONS[moduleName];\n  }\n  return modVer;\n}\nexport let setupModules = () => {\n  for (let name of Object.keys(USEFUL_MODULE_VERSIONS)) {\n    const modVer = getModuleVersion(name);\n    const neededVer = USEFUL_MODULE_VERSIONS[name];\n    const isValidVersion = foundry.utils.isNewerVersion(modVer, neededVer) || !foundry.utils.isNewerVersion(neededVer, modVer);\n    if (!installedModules.get(name)) installedModules.set(name, game.modules.get(name)?.active && isValidVersion)\n    if (!installedModules.get(name)) {\n      if (game.modules.get(name)?.active) {\n        const message = `midi-qol requires ${name} to be of version ${USEFUL_MODULE_VERSIONS[name]} or later, but it is version ${game.modules.get(name)?.version}`;\n        error(message);\n        TroubleShooter.recordError(new Error(message), message);\n      } else warn(`optional module ${name} not active - some features disabled`)\n    }\n  }\n  if (debugEnabled > 0) {\n    for (let module of installedModules.keys())\n      log(`module ${module} has valid version ${installedModules.get(module)}`);\n  }\n}\n\nexport function dice3dEnabled() {\n  // @ts-expect-error no dsn types\n  return Boolean(installedModules.get(\"dice-so-nice\") && (game.dice3d?.config?.enabled || game.dice3d?.isEnabled()));\n}\n\nexport function checkModules() { // this really should happen in TroubleShooter\n  if (game.user?.isGM && !installedModules.get(\"socketlib\")) {\n    ui.notifications?.error(\"midi-qol.NoSocketLib\", {permanent: true, localize: true});\n  }\n  // Warn about deprecated built-in chat log pruning\n  if (game.user?.isGM && pruneChatLog) {\n    const chatlogPruneModule = game.modules.get(\"chatlog-prune\");\n    const chatlogPruneActive = chatlogPruneModule?.active;\n    const chatlogPruneEnabled = chatlogPruneActive && (game.settings as any).get(\"chatlog-prune\", \"enabled\");\n    if (!chatlogPruneActive || !chatlogPruneEnabled) {\n      let message = `<h3>${i18n(\"midi-qol.chatlogPruneWarning\")}</h3>`;\n      message += `<p>${i18n(\"midi-qol.chatlogPruneDeprecated\")}</p>`;\n      if (!chatlogPruneActive) {\n        message += `<p>${i18n(\"midi-qol.chatlogPruneInstallHint\")}</p>`;\n      } else if (!chatlogPruneEnabled) {\n        message += `<p>${i18n(\"midi-qol.chatlogPruneEnableHint\")}</p>`;\n      }\n      ChatMessage.implementation.create({\n        content: message,\n        whisper: game.users?.filter(u => u.isGM).map(u => u.id),\n        speaker: { alias: \"midi-qol\" }\n      });\n    }\n  }\n}\n","/**\n * Custom Handlebars helpers for midi-qol.\n * Based on Foundry's selectOptions helper but with added hint/tooltip support on options.\n */\n\nimport type { SelectOptionValue } from \"../../globals.js\";\n\n/**\n * Register all custom Handlebars helpers.\n * Call this during module initialization (e.g. in the init hook).\n */\nexport function registerHandlebarsHelpers(): void {\n\tHandlebars.registerHelper(\"midiSelectOptions\", midiSelectOptions);\n}\n\n/**\n * A drop-in replacement for Foundry's {{selectOptions}} that supports a `hint` property\n * on each option, rendered as a title attribute on the <option> element for hover tooltips.\n *\n * Options format — object values can include a `hint` key:\n * ```js\n * let choices = {\n *   a: { label: \"Choice A\", hint: \"Detailed description of A\" },\n *   b: { label: \"Choice B\", hint: \"Detailed description of B\" }\n * };\n * ```\n *\n * Or use `hintAttr` to specify which property holds the hint:\n * ```js\n * let choices = [\n *   { key: \"a\", name: \"Choice A\", description: \"Description of A\" },\n *   { key: \"b\", name: \"Choice B\", description: \"Description of B\" }\n * ];\n * // {{midiSelectOptions choices valueAttr=\"key\" labelAttr=\"name\" hintAttr=\"description\"}}\n * ```\n *\n * Simple string values (no hint) also work, same as Foundry's helper:\n * ```js\n * let choices = { a: \"Choice A\", b: \"Choice B\" };\n * // {{midiSelectOptions choices selected=value localize=true}}\n * ```\n *\n * When localize=true, hints are localized. If the localized result equals the key\n * (meaning no translation was found), the hint is omitted.\n *\n * Hash parameters (same as Foundry's selectOptions, plus hintAttr):\n * - selected: current value(s)\n * - localize: localize labels (and hints) via game.i18n.localize\n * - blank: label for a blank first option\n * - sort: sort options alphabetically\n * - inverted: swap keys and values\n * - valueAttr: property name for option value (when choices are objects)\n * - labelAttr: property name for option label\n * - hintAttr: property name for option hint/tooltip (default: \"hint\")\n */\nfunction midiSelectOptions(choices: any, options: any): Handlebars.SafeString {\n\tconst {\n\t\tlocalize = false,\n\t\tblank,\n\t\tsort,\n\t\tvalueAttr,\n\t\tlabelAttr,\n\t\thintAttr,\n\t\tinverted,\n\t} = options.hash;\n\n\tlet selected: string[] = normalizeSelected(options.hash.selected);\n\n\t// Build flat array of { value, label, hint? }\n\tconst optionList: SelectOptionEntry[] = [];\n\n\tif (choices instanceof Array) {\n\t\tfor (const [i, choice] of choices.entries()) {\n\t\t\tif (typeof choice === \"object\") {\n\t\t\t\toptionList.push(extractOption(choice, i, { valueAttr, labelAttr, hintAttr }));\n\t\t\t} else {\n\t\t\t\toptionList.push({ value: String(i), label: String(choice) });\n\t\t\t}\n\t\t}\n\t} else if (choices && typeof choices === \"object\") {\n\t\tfor (const entry of Object.entries(choices)) {\n\t\t\tconst [k, v] = inverted ? ([entry[1], entry[0]] as [any, any]) : entry;\n\t\t\tconst value = valueAttr ? (v as any)[valueAttr] : k;\n\t\t\tif (typeof v === \"object\") {\n\t\t\t\toptionList.push(extractOption(v as any, value, { valueAttr, labelAttr, hintAttr }));\n\t\t\t} else {\n\t\t\t\toptionList.push({ value: String(value), label: String(v) });\n\t\t\t}\n\t\t}\n\t}\n\n\t// Localize\n\tif (localize) {\n\t\tfor (const opt of optionList) {\n\t\t\tif (opt.label) opt.label = game.i18n!.localize(opt.label);\n\t\t\tif (opt.hint) {\n\t\t\t\tconst localized = game.i18n!.localize(opt.hint);\n\t\t\t\t// If localize returns the key unchanged, no translation exists — omit the hint\n\t\t\t\topt.hint = (localized !== opt.hint) ? localized : undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Sort\n\tif (sort) {\n\t\toptionList.sort((a, b) => (a.label ?? \"\").localeCompare(b.label ?? \"\", game.i18n!.lang));\n\t}\n\n\t// Build HTML\n\tconst parts: string[] = [];\n\n\t// Blank option\n\tif (typeof blank === \"string\") {\n\t\tconst blankLabel = localize ? game.i18n!.localize(blank) : blank;\n\t\tconst sel = selected.includes(\"\") ? \" selected\" : \"\";\n\t\tparts.push(`<option value=\"\"${sel}>${escapeHTML(blankLabel)}</option>`);\n\t}\n\n\tfor (const opt of optionList) {\n\t\tif (opt.value === undefined || opt.label === undefined) continue;\n\t\tconst sel = selected.includes(String(opt.value)) ? \" selected\" : \"\";\n\t\tconst hintStr = opt.hint ? ` title=\"${escapeHTML(opt.hint)}\"` : \"\";\n\t\tparts.push(`<option value=\"${escapeHTML(String(opt.value))}\"${sel}${hintStr}>${escapeHTML(opt.label)}</option>`);\n\t}\n\n\treturn new Handlebars.SafeString(parts.join(\"\\n\"));\n}\n\n/* ---------------------------------------- */\n/*  Internal helpers                        */\n/* ---------------------------------------- */\n\ninterface SelectOptionEntry {\n\tvalue: string;\n\tlabel: string;\n\thint?: string;\n}\n\ninterface ExtractAttrs {\n\tvalueAttr?: string;\n\tlabelAttr?: string;\n\thintAttr?: string;\n}\n\nfunction normalizeSelected(selected: any): string[] {\n\tif (selected === undefined || selected === null) return [];\n\tif (selected instanceof Set) return Array.from(selected).map(String);\n\tif (selected instanceof Array) return selected.map(String);\n\treturn [String(selected)];\n}\n\nfunction extractOption(obj: Record<string, any>, fallbackValue: any, attrs: ExtractAttrs): SelectOptionEntry {\n\tconst value = String(attrs.valueAttr ? obj[attrs.valueAttr] : (obj.value ?? fallbackValue));\n\tconst label = String(attrs.labelAttr ? obj[attrs.labelAttr] : (obj.label ?? value));\n\tconst hint = attrs.hintAttr ? obj[attrs.hintAttr] : obj.hint;\n\tconst entry: SelectOptionEntry = { value, label };\n\tif (hint !== undefined && hint !== null) entry.hint = String(hint);\n\treturn entry;\n}\n\nfunction escapeHTML(str: string): string {\n\treturn str.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\");\n}\n\n/**\n * Update the label of a SelectOptionValue while preserving hint and other properties.\n * If the option is an object, returns a new object with the updated label.\n * If the option is a plain string, returns the new label string.\n */\nexport function withOptionLabel(option: SelectOptionValue, label: string): SelectOptionValue {\n\tif (typeof option === \"object\") {\n\t\treturn { ...option, label };\n\t}\n\treturn label;\n}\n\n","import { criticalDamage, criticalDamageChoices, nsaFlag, coloredBorders, coloredBordersOptions, importSettingsFromJSON, exportSettingsToJSON, enableWorkflow, wallsBlockRangeOptionsNew, coverCalculationOptions, hiddenAdvantageOptions, addDeadOptions, rollNPCSavesOptions, playerRollSavesOptions, autoCheckHitOptions, autoTargetOptions, rangeTargetOptions, requiresTargetsOptions, autoCheckSavesOptions, autoRollDamageOptions, removeButtonsOptions, autoApplyDamageOptions, damageCardStyleOptions, playerDamageCardOptions, damageImmunitiesOptions, showItemDetailsOptions, doReactionsOptions, gmDoReactionsOptions, autoCEEffectsOptions, rollOtherDamageOptions, showReactionAttackRollOptions, recordAOOOptions, EnforceReactionsOptions, autoEffectsOptions, requireMagicalOptions, hideRollDetailsOptions, gmAttackDisplayOptions, gmDamageDisplayOptions, gmDsnDisplayOptions, checkFlankingOptions, flankingBonusOptions, playerRollSavesOptionsReduced, rollAlternateOptions, consumeResourceOptions, averageDamageOptions, removeConcentrationEffectsOptions, incapacitatedOptions, checkRangeOptions, invisAdvantageOptions, confirmAttackDamageOptions, challengeModeArmorOptions, saveDROrderOptions, doConcentrationCheckOptions, addChatDamageButtonsOptions, activationAutomationOptions, safeGetGameSetting, resetConfigSettingsToDefaults, distanceMeasurementOptions } from \"../settings.js\"\nimport { configSettings } from \"../settings.js\"\nimport { warn, i18n, error, debug, debugEnabled, log, GameSystemConfig, ceInterface } from \"../../midi-qol.js\";\nimport { installedModules } from \"../setupModules.js\";\nimport type { SelectOptions } from \"../../globals.js\";\nimport { withOptionLabel } from \"../lib/HandlebarsHelpers.js\";\nconst { ApplicationV2, DialogV2, HandlebarsApplicationMixin } = foundry.applications.api;\n\nconst PATH = \"./modules/midi-qol/sample-config/\";\n\nexport class ConfigPanel extends HandlebarsApplicationMixin(ApplicationV2) {\n  configHookId: number | undefined;\n  activeTab: string;\n\n  constructor(options?) {\n    super(options);\n    this.configHookId = Hooks.on(\"midi-qol.ConfigSettingsChanged\", () => {\n      this.close();\n    });\n    this.activeTab = \"gm\";\n    return this;\n  }\n\n  static override DEFAULT_OPTIONS = {\n    id: \"midi-qol-settings\",\n    tag: \"form\",\n    window: {\n      title: \"midi-qol.ConfigTitle\",\n      contentClasses: [\"standard-form\"]\n    },\n    position: {\n      width: 800,\n      height: \"auto\" as \"auto\"\n    },\n    form: {\n      closeOnSubmit: true,\n      handler: this.#onSubmit as any\n    }\n  };\n\n  static override PARTS = {\n    tabs: { template: \"templates/generic/tab-navigation.hbs\" },\n    gm: { template: \"modules/midi-qol/templates/apps/ConfigPanel/gm.hbs\" },\n    player: { template: \"modules/midi-qol/templates/apps/ConfigPanel/player.hbs\" },\n    workflow: { template: \"modules/midi-qol/templates/apps/ConfigPanel/workflow.hbs\" },\n    concentration: { template: \"modules/midi-qol/templates/apps/ConfigPanel/concentration.hbs\" },\n    reactions: { template: \"modules/midi-qol/templates/apps/ConfigPanel/reactions.hbs\" },\n    misc: { template: \"modules/midi-qol/templates/apps/ConfigPanel/misc.hbs\" },\n    mechanics: { template: \"modules/midi-qol/templates/apps/ConfigPanel/mechanics.hbs\" },\n    rules: { template: \"modules/midi-qol/templates/apps/ConfigPanel/rules.hbs\" },\n    quick: { template: \"modules/midi-qol/templates/apps/ConfigPanel/quick.hbs\" },\n    footer: { template: \"modules/midi-qol/templates/apps/ConfigPanel/footer.hbs\" }\n  }\n\n  // V13 version:\n  static TABS = {\n    sheet: {\n      tabs: [\n        {id: \"gm\"},\n        {id: \"player\"},\n        {id: \"workflow\"},\n        {id: \"concentration\"},\n        {id: \"reactions\"},\n        {id: \"misc\"},\n        {id: \"mechanics\"},\n        {id: \"rules\"},\n        {id: \"quick\"},\n      ],\n      initial: \"gm\",\n      labelPrefix: \"midi-qol.Config.Tabs\"\n    }\n  // This is silly, but for now there's some types-thinks \"mandatory\" fields \n  } as unknown as Record<string, foundry.applications.api.ApplicationV2.TabsConfiguration>\n\n  // V12 version:\n  // tabGroups = {\n  //   sheet: \"gm\"\n  // }\n\n  get title() {\n    return i18n(\"midi-qol.ConfigTitle\") ?? \"Midi-QOL Configuration\";\n  }\n\n  async _prepareContext(options) {\n    if (!enableWorkflow) {\n      ui.notifications?.error(\"Workflow automation is not enabled\")\n    }\n    let wallsBlockRangeOptions: SelectOptions = foundry.utils.duplicate(wallsBlockRangeOptionsNew);\n    let CoverCalculationOptions: SelectOptions = foundry.utils.duplicate(coverCalculationOptions);\n    [{ id: \"levelsautocover\", name: \"'Levels Auto Cover'\" }, { id: \"simbuls-cover-calculator\", name: \"'Simbuls Cover Calculator'\" }, { id: \"simplecover5e\", name: \"'Simple Cover 5e'\" }, { id: \"tokencover\", name: \"'Alternative Token Cover'\" }].forEach(module => {\n      if (!installedModules.get(module.id)) {\n        const notInstalled = game.i18n?.format(\"MODMANAGE.DepNotInstalled\", { missing: \"\" }) ?? \"\";\n        wallsBlockRangeOptions[module.id] = withOptionLabel(wallsBlockRangeOptions[module.id], `${i18n(wallsBlockRangeOptions[module.id])} - ${notInstalled}`);\n        CoverCalculationOptions[module.id] = withOptionLabel(CoverCalculationOptions[module.id], `${i18n(CoverCalculationOptions[module.id])} - ${notInstalled}`);\n      }\n    });\n    if (!installedModules.get(\"levels\")) {\n      wallsBlockRangeOptions[\"centerLevels\"] = withOptionLabel(wallsBlockRangeOptions[\"centerLevels\"], `${i18n(wallsBlockRangeOptions[\"centerLevels\"])} - ${game.i18n?.format(\"MODMANAGE.DepNotInstalled\", { missing: \"Levels\" })}`);\n    }\n    // Mark walledtemplates option as \"not installed\" when the module is not active\n    const autoTargetOptionsLocalized: SelectOptions = foundry.utils.duplicate(autoTargetOptions);\n    if (!installedModules.get(\"walledtemplates\")) {\n      const notInstalled = game.i18n?.format(\"MODMANAGE.DepNotInstalled\", { missing: \"\" }) ?? \"\";\n      autoTargetOptionsLocalized[\"walledtemplates\"] = withOptionLabel(autoTargetOptions[\"walledtemplates\"], `${i18n(autoTargetOptions[\"walledtemplates\"])} - ${notInstalled}`);\n    }\n\n    let HiddenAdvantageOptions: SelectOptions = foundry.utils.duplicate(hiddenAdvantageOptions);\n    [{ id: \"perceptive\", name: \"Perceptive\" }].forEach(module => {\n      if (!installedModules.get(module.id)) {\n        HiddenAdvantageOptions[module.id] = withOptionLabel(HiddenAdvantageOptions[module.id], `${i18n(HiddenAdvantageOptions[module.id])} - ${game.i18n?.format(\"MODMANAGE.DepNotInstalled\", { missing: \"\" })}`);\n      }\n    });\n    let quickSettingsOptions = {};\n    for (let key of Object.keys(quickSettingsDetails)) {\n      quickSettingsOptions[key] = quickSettingsDetails[key].description;\n    }\n    /*\n    if (configSettings.addWounded > 0 && [\"none\", undefined].includes(configSettings.addWoundedStyle))\n      configSettings.addWoundedStyle = \"normal\";\n    */\n    const AddWoundedOptions = foundry.utils.duplicate(addDeadOptions);\n    delete AddWoundedOptions[\"none\"];\n    const rollNPCSavesOptionsLocalized: SelectOptions = foundry.utils.duplicate(rollNPCSavesOptions);\n    for (let key of Object.keys(rollNPCSavesOptions)) {\n      const notInstalled = game.i18n?.format(\"MODMANAGE.DepNotInstalled\", { missing: \"\" }) ?? \"\";\n      switch (key) {\n        case \"mtb\":\n          if (!installedModules.get(\"monks-tokenbar\")) rollNPCSavesOptionsLocalized[key] = withOptionLabel(rollNPCSavesOptions[key], `${i18n(rollNPCSavesOptions[key])} - ${notInstalled}`);\n          break;\n        case \"ftb\":\n          if (!installedModules.get(\"flash-rolls-5e\")) rollNPCSavesOptionsLocalized[key] = withOptionLabel(rollNPCSavesOptions[key], `${i18n(rollNPCSavesOptions[key])} - ${notInstalled}`);\n          break;\n        case \"rer\":\n          if (!installedModules.get(\"epic-rolls-5e\")) rollNPCSavesOptionsLocalized[key] = withOptionLabel(rollNPCSavesOptions[key], `${i18n(rollNPCSavesOptions[key])} - ${notInstalled}`);\n      }\n\n    }\n    let playerRollSavesOptionsLocalized: SelectOptions = foundry.utils.duplicate(playerRollSavesOptions);\n    for (let key of Object.keys(playerRollSavesOptions)) {\n      const notInstalled = game.i18n?.format(\"MODMANAGE.DepNotInstalled\", { missing: \"\" }) ?? \"\";\n      switch (key) {\n        case \"mtb\":\n          if (!installedModules.get(\"monks-tokenbar\")) playerRollSavesOptionsLocalized[key] = withOptionLabel(playerRollSavesOptionsLocalized[key], `${i18n(playerRollSavesOptionsLocalized[key])} - ${notInstalled}`);\n          break;\n        case \"ftb\":\n          if (!installedModules.get(\"flash-rolls-5e\")) playerRollSavesOptionsLocalized[key] = withOptionLabel(playerRollSavesOptionsLocalized[key], `${i18n(playerRollSavesOptionsLocalized[key])} - ${notInstalled}`);\n          break;\n        case \"rer\":\n          if (!installedModules.get(\"epic-rolls-5e\")) playerRollSavesOptionsLocalized[key] = withOptionLabel(playerRollSavesOptionsLocalized[key], `${i18n(playerRollSavesOptionsLocalized[key])} - ${notInstalled}`);\n      }\n    };\n\n    // Mark CE-dependent options as \"not active\" when Convenient Effects is not active\n    const checkFlankingOptionsLocalized: SelectOptions = foundry.utils.duplicate(checkFlankingOptions);\n    const autoCEEffectsOptionsLocalized: SelectOptions = foundry.utils.duplicate(autoCEEffectsOptions);\n    if (!installedModules.get(\"dfreds-convenient-effects\")) {\n      const notActive = game.i18n?.localize(\"midi-qol.Inactive\") ?? \"Inactive\";\n      const ceFlankingKeys = [\"ceonly\", \"ceflanked\", \"ceflankedNoconga\"];\n      for (const key of ceFlankingKeys) {\n        if (key in checkFlankingOptionsLocalized) {\n          checkFlankingOptionsLocalized[key] = withOptionLabel(checkFlankingOptions[key], `${i18n(checkFlankingOptions[key])} - ${notActive}`);\n        }\n      }\n      const ceEffectKeys = [\"itempri\", \"cepri\", \"both\"];\n      for (const key of ceEffectKeys) {\n        if (key in autoCEEffectsOptionsLocalized) {\n          autoCEEffectsOptionsLocalized[key] = withOptionLabel(autoCEEffectsOptions[key], `${i18n(autoCEEffectsOptions[key])} - ${notActive}`);\n        }\n      }\n    }\n\n    let statusEffectList = CONFIG.statusEffects.map((se) => {\n      let name = i18n(se.name);\n      if (se.id.startsWith(\"Convenient Effect\")) name = `${name} (CE)`;\n      return { id: se.id, name: name }\n    });\n\n    if (ceInterface) {\n      statusEffectList = statusEffectList.concat(ceInterface.findEffects().map(ae => ({ id: `z${ae.flags[\"dfreds-convenient-effects\"].ceEffectId}`, name: `${ae.name} (CE)` })));\n    }\n    let StatusEffectOptions = statusEffectList.reduce((acc, { id, name }) => { acc[id] = name; return acc }, { \"none\": \"None\" });\n    const vitalityDeathRequiresOptions = {\n      \"vitalityOnly\": \"midi-qol.VitalityDeathRequires.VitalityOnly\",\n      \"vitalityAndHP\": \"midi-qol.VitalityDeathRequires.VitalityAndHP\"\n    };\n    let context: any = {\n      configSettings,\n      quickSettings: true,\n      quickSettingsOptions,\n      autoCheckHitOptions,\n      autoTargetOptions: autoTargetOptionsLocalized,\n      rangeTargetOptions,\n      requiresTargetsOptions,\n      autoCheckSavesOptions,\n      autoRollDamageOptions,\n      removeButtonsOptions,\n      criticalDamage,\n      criticalDamageChoices,\n      autoApplyDamageOptions,\n      damageCardStyleOptions,\n      playerDamageCardOptions,\n      damageImmunitiesOptions,\n      showItemDetailsOptions,\n      doReactionsOptions,\n      wallsBlockRangeOptions,\n      gmDoReactionsOptions,\n      AutoCEEffectsOptions: autoCEEffectsOptionsLocalized,\n      rollOtherDamageOptions,\n      showReactionAttackRollOptions,\n      CoverCalculationOptions,\n      distanceMeasurementOptions,\n      RecordAOOOptions: recordAOOOptions,\n      EnforceReactionsOptions: EnforceReactionsOptions,\n      AutoEffectsOptions: autoEffectsOptions,\n      RequireMagicalOptions: requireMagicalOptions,\n      itemTypeLabels: Object.keys(CONFIG.Item.typeLabels).filter(key => ![\"backpack\", \"base\"].includes(key)).reduce((acc, key) => { acc[key] = CONFIG.Item.typeLabels[key]; return acc }, {}),\n      hasConvenientEffects: installedModules.get(\"dfreds-convenient-effects\"),\n      hideRollDetailsOptions,\n      gmAttackDisplayOptions,\n      gmDamageDisplayOptions,\n      gmDsnDisplayOptions,\n      checkFlankingOptions: checkFlankingOptionsLocalized,\n      flankingBonusOptions,\n      nsaFlag,\n      coloredBorders,\n      coloredBordersOptions,\n      playerRollSavesOptions: playerRollSavesOptionsLocalized,\n      rollNPCSavesOptions: rollNPCSavesOptionsLocalized,\n      customSoundsPlaylistOptions: game.playlists?.contents.reduce((acc, e) => { acc[e.id] = e.name; return acc }, {}) || {},\n      customSoundOptions: game.playlists?.get(configSettings.customSoundsPlaylist)?.sounds.reduce((acc, s) => { acc[s.id ?? \"\"] = s.name; return acc }, { \"none\": \"\" }),\n      rollSoundOptions: CONFIG.sounds,\n      isBetterRolls: installedModules.get(\"betterrolls5e\"),\n      rollAlternateOptions,\n      ConsumeResourceOptions: consumeResourceOptions,\n      AddDeadOptions: addDeadOptions,\n      AddWoundedOptions,\n      AverageDamageOptions: averageDamageOptions,\n      RemoveConcentrationEffectsOptions: removeConcentrationEffectsOptions,\n      IncapacitatedOptions: incapacitatedOptions,\n      CheckRangeOptions: checkRangeOptions,\n      InvisAdvantageOptions: invisAdvantageOptions,\n      HiddenAdvantageOptions,\n      ConfirmAttackDamageOptions: confirmAttackDamageOptions,\n      ChallengeModeArmorOptions: challengeModeArmorOptions,\n      RollSkillsBlindOptions: foundry.utils.mergeObject({ \"all\": \"All\" }, Object.keys(GameSystemConfig.skills).reduce((acc, s) => { acc[s] = GameSystemConfig.skills[s].label; return acc }, {})),\n      RollSavesBlindOptions: foundry.utils.mergeObject({ \"all\": \"All\", \"death\": i18n(\"DND5E.DeathSave\") }, Object.keys(GameSystemConfig.abilities).reduce((acc, s) => { acc[s] = GameSystemConfig.abilities[s].label; return acc }, {})),\n      RollChecksBlindOptions: foundry.utils.mergeObject({ \"all\": \"All\" }, Object.keys(GameSystemConfig.abilities).reduce((acc, s) => { acc[s] = GameSystemConfig.abilities[s].label; return acc }, {})),\n      midiPropertiesTabOptions: CONST.USER_ROLE_NAMES,\n      templateSnappingOptions: {\n        \"full\": i18n(\"midi-qol.TemplateSnapping.Full\"),\n        \"half\": i18n(\"midi-qol.TemplateSnapping.Half\"),\n      },\n      StatusEffectOptions,\n      vitalityDeathRequiresOptions,\n      SaveDROrderOptions: saveDROrderOptions,\n      ColorOptions: colorList.reduce((acc, c) => { acc[c] = c; return acc }, { \"Delete\": \"Delete\" }),\n      DoConcentrationCheckOptions: doConcentrationCheckOptions,\n      AddChatDamageButtonsOptions: addChatDamageButtonsOptions,\n      ActivationAutomationOptions: activationAutomationOptions,\n      rollModes: CONFIG.Dice.rollModes,\n      fastForwardOptions: {\n        attack: i18n(\"midi-qol.fastForwardOptions.attack\"),\n        damage: i18n(\"midi-qol.fastForwardOptions.damage\"),\n        check: i18n(\"midi-qol.fastForwardOptions.check\"),\n        save: i18n(\"midi-qol.fastForwardOptions.save\"),\n        skill: i18n(\"midi-qol.fastForwardOptions.skill\"),\n        tool: i18n(\"midi-qol.fastForwardOptions.tool\"),\n      },\n      preferredGMOptions: game.users?.filter(user => user.isGM).reduce((acc, user) => {\n        acc[user.id] = user.name ?? \"\";\n        return acc;\n      }, { \"\": i18n(\"None\") } as Record<string, string>),\n    };\n    context = foundry.utils.mergeObject(await super._prepareContext(options), context, { inplace: false });\n    context.concentrationDisabled =safeGetGameSetting(\"dnd5e\", \"disableConcentration\");\n    const attackRollVisibility = safeGetGameSetting(\"dnd5e\", \"attackRollVisibility\") as string;\n    if (attackRollVisibility !== undefined) {\n      const choices = game.settings.settings.get(\"dnd5e.attackRollVisibility\")?.choices;\n      context.attackRollVisibilityOptions = choices;\n      context.attackRollVisibilityValue = attackRollVisibility;\n    }\n    const challengeVisibility = safeGetGameSetting(\"dnd5e\", \"challengeVisibility\") as string;\n    if (challengeVisibility !== undefined) {\n      const choices = game.settings.settings.get(\"dnd5e.challengeVisibility\")?.choices;\n      context.challengeVisibilityOptions = choices;\n      context.challengeVisibilityValue = challengeVisibility;\n    }\n    // context.tabs = this.#getTabs();\n    if (debugEnabled > 0) warn(\"Config Panel: getData \", context)\n    return context;\n  }\n\n  changeTab(tab, group, options?) {\n    super.changeTab(tab, group, options);\n    this.activeTab = tab;\n  }\n\n  // V12-only (I think): does not seem to be\n  async _preparePartContext(partId, context) {\n    // @ts-expect-error shhh\n    const partContext = await super._preparePartContext(partId, context);\n    // @ts-expect-error it's okay\n    if (partId in (partContext.tabs ?? {})) partContext.tab = partContext.tabs[partId];\n    // if (Object.keys(context.tabs).includes(partId)) {\n    //   context.tab = context.tabs[partId];\n    // }\n    return partContext;\n  }\n\n  _onSearch(term) {\n    for (let tag of [\".midi-qol-box\", \".form-group\"]) {\n      const elts = Array.from(this.element.querySelectorAll(tag));\n      term = term.toLowerCase().trim();\n      elts.forEach((el) => {\n        // @ts-expect-error\n        if (!term || el.innerText.toLowerCase().includes(term)) {\n          // @ts-expect-error\n          el.style.display = null;\n        } else {\n          // @ts-expect-error\n          el.style.display = \"none\";\n        }\n      });\n    }\n  }\n\n  async _onRender(context, options) {\n    super._onRender(context, options);\n    // Don't think this was doing anything\n    // html.find(\".playlist\").change(this._playList.bind(this));\n    this.element.querySelector(\".itemTypeListEdit\")?.addEventListener(\"click\", event => {\n      const options = Object.entries(CONFIG.Item.typeLabels).filter(kv => ![\"backpack\", \"base\"].includes(kv[0])).map(([k, v]) => ({ value: k, label: i18n(v), selected: configSettings.itemTypeList?.includes(k) }));\n      options.sort((a, b) => a.label.compare(b.label));\n      DialogV2.prompt<foundry.applications.api.DialogV2.PromptConfig>({\n        id: \"midi-qol-item-selector\",\n        content: foundry.applications.fields.createMultiSelectInput({\n          type: \"checkboxes\",\n          name: \"items\",\n          options\n        }).outerHTML,\n        window: { title: \"Show Item Details\" },\n        position: {\n          height: \"auto\"\n        },\n        ok: {\n          label: \"DND5E.TraitSave\",\n          icon: \"fa-solid fa-floppy-disk\",\n          callback: (evt, button) => {\n            const data = new foundry.applications.ux.FormDataExtended(button.form as HTMLFormElement);\n            // @ts-expect-error\n            if (data) configSettings.itemTypeList = data.object?.items ?? configSettings.itemTypeList;\n          }\n        },\n        rejectClose: false\n      });\n    });\n    this.element.querySelector(\".optionalRulesEnabled\")?.addEventListener(\"click\", event => {\n      configSettings.optionalRulesEnabled = !configSettings.optionalRulesEnabled;\n      this.render({ force: true });\n    });\n    this.element.querySelector(\"#midi-qol-export-config\")?.addEventListener(\"click\", exportSettingsToJSON);\n    this.element.querySelector(\"#midi-qol-import-config\")?.addEventListener(\"click\", async () => {\n      if (await importFromJSONDialog()) this.close();\n    });\n    for (const elem of Array.from(this.element.querySelectorAll(\".midi-qol-blind-select\"))) {\n      elem.addEventListener(\"mouseenter\", this.selectHover.bind(this));\n      elem.addEventListener(\"mouseleave\", this.selectHoverOut.bind(this));\n    }\n    for (const elem of Array.from(this.element.querySelectorAll(\".import-quick-setting\"))) {\n      elem.addEventListener(\"click\", async function (event) {\n        const key = event.currentTarget?.id;\n        if (await applySettings.bind(this)(key)) this.close();\n      }.bind(this));\n    }\n    // @ts-expect-error\n    this.element.querySelector('input[type=\"search\"]')?.addEventListener(\"input\", (e) => { this._onSearch(e.currentTarget?.value) });\n  }\n\n  selectHover(event) {\n    const target = event.currentTarget;\n    target.focus();\n  }\n  selectHoverOut(event) {\n    const target = event.currentTarget;\n    target.blur();\n  }\n\n  async _preClose(options) {\n    await super._preClose(options);\n    if (this.configHookId) Hooks.off(\"midi-qol.ConfigSettingsChanged\", this.configHookId);\n  }\n\n  // async _playList(event) {\n  //   event.preventDefault();\n  //   configSettings.customSoundsPlaylist = `${$(event.currentTarget).children(\"option:selected\").val()}`;\n  //   await this.submit({ preventClose: true });\n  //   this.render();\n  // }\n\n  // onReset() {\n  //   this.render(true);\n  // }\n\n  static async #onSubmit(event, form, formData) {\n    const realData = formData.object;\n    let needReload = false;\n    realData.itemTypeList = configSettings.itemTypeList;\n    if (realData.enforceReactions !== \"none\" && configSettings.enforceReactions !== realData.enforceReactions) {\n      needReload = true;\n    }\n    if (realData.enforceBonusActions !== \"none\" && configSettings.enforceBonusActions !== realData.enforceBonusActions) {\n      needReload = true;\n    }\n    if (configSettings.activityNamePrefix !== realData.activityNamePrefix) needReload = true;\n\n    // Handle dnd5e attackRollVisibility setting separately\n    if (realData.dnd5eAttackRollVisibility !== undefined) {\n      await game.settings.set(\"dnd5e\", \"attackRollVisibility\", realData.dnd5eAttackRollVisibility);\n      delete realData.dnd5eAttackRollVisibility;\n    }\n\n    // Handle dnd5e challengeVisibility setting separately\n    if (realData.dnd5eChallengeVisibility !== undefined) {\n      await game.settings.set(\"dnd5e\", \"challengeVisibility\", realData.dnd5eChallengeVisibility);\n      delete realData.dnd5eChallengeVisibility;\n    }\n\n    let newSettings = foundry.utils.mergeObject(configSettings, realData, { overwrite: true, inplace: false });\n    if (game.user?.can(\"SETTINGS_MODIFY\")) {\n      await game.settings.set(\"midi-qol\", \"ConfigSettings\", newSettings);\n      //@ts-expect-error v13 stubby\n      if (needReload) foundry.applications.settings.SettingsConfig.reloadConfirm({world: true});\n    }\n  }\n}\n\nasync function importFromJSONDialog() {\n  const content = await foundry.applications.handlebars.renderTemplate(\"templates/apps/import-data.hbs\", { entity: \"midi-qol\", name: \"settings\" });\n  let dialog = new Promise((resolve, reject) => {\n    new DialogV2({\n      window: { title: `Import midi-qol settings` },\n      position: {\n        width: 400,\n        height: \"auto\"\n      },\n      content: content,\n      buttons: [\n        {\n          action: \"import\",\n          icon: \"fa-solid fa-file-import\",\n          label: 'Import',\n          default: true,\n          callback: event => {\n            const form = (event.currentTarget as HTMLElement | null)?.querySelector(\"form\");\n            if (!form?.data.files.length) return ui.notifications?.error(\"You did not upload a data file!\");\n            foundry.utils.readTextFromFile(form.data.files[0]).then(json => {\n              importSettingsFromJSON(json).then(() => resolve(true))\n            });\n          }\n        },\n        {\n          action: \"no\",\n          icon: \"fa-solid fa-xmark\",\n          label: 'Cancel',\n          callback: event => resolve(false)\n        }\n      ],\n    }).render({ force: true });\n  });\n  return await dialog;\n}\n\nasync function fetchConfigFile(filename: string | undefined): Promise<string> {\n  if (!filename) return \"{}\";\n  return new Promise((resolve, reject) => {\n    fetch(filename).then(response => response.text())\n      .then(data => {\n        resolve(data)\n      });\n  });\n}\n\nfunction showDiffs(current: any, changed: any, flavor: string = \"\", title: string = \"\") {\n  const diffs = foundry.utils.diffObject(changed, current, { inner: true });\n  const changes: string[] = [];\n  for (let key of Object.keys(diffs)) {\n    let name: string;\n    if (key.startsWith(\"gm\"))\n      name = key[2].toUpperCase() + key.substring(3);\n    else name = key[0].toUpperCase() + key.substring(1);\n    let longName = i18n(\"midi-qol.\" + name + \".Name\");\n    if (longName?.startsWith(\"midi-qol\")) longName = name;\n    debug(\"Show config changes: Name is \", name, key, key.startsWith(\"gm\") ? \"GM\" : \"\", i18n(`midi-qol.${name + \".Name\"}`))\n    let currentVal = current[key];\n    let changedVal = changed[key];\n    if (typeof currentVal === \"object\") currentVal = \"Object\"\n    if (typeof changedVal === \"object\") changedVal = \"Object\"\n\n    changes.push(`${key.startsWith(\"gm\") ? \"GM \" : \"\"}${longName} <strong>${currentVal} => ${changedVal}</strong>`)\n  }\n  if (changes.length === 0) changes.push(\"No Changes\");\n  const dialog = new Promise((resolve, reject) => {\n    let dialogTitle;\n    if (title !== \"\") dialogTitle = `${i18n(\"midi-qol.Config.Tabs.quick\")} - ${title}`;\n    else dialogTitle = i18n(\"midi-qol.Config.Tabs.quick\");\n    let d = new DialogV2({\n      classes: [\"midi-qol-quick-config\"],\n      window: { title: dialogTitle },\n      position: {\n        height: \"auto\"\n      },\n      content: changes.join(\"<br>\"),\n      buttons: [\n        {\n          action: \"apply\",\n          default: true,\n          icon: \"fa-solid fa-check\",\n          label: 'Apply',\n          callback: () => resolve(true)\n        },\n        {\n          action: \"abort\",\n          icon: \"fa-solid fa-xmark\",\n          label: 'Don\\'t Apply',\n          callback: () => resolve(false)\n        }\n      ],\n    }).render({ force: true });\n    warn(\"Quick Settings \", changes.join(\"\\n\"));\n  })\n  return dialog;\n}\n\nlet quickSettingsDetails: any = {\n  FullAuto: {\n    description: \"Full Automation: As few button presses as possible\",\n    shortDescription: \"Full Automation\",\n    fileName: \"midi-qol-full-auto.json\",\n  },\n  FullManual: {\n    description: \"No Automation: All rolls manual\",\n    shortDescription: \"No Automation\",\n    fileName: \"midi-qol-manual.json\"\n  },\n  GMAuto: {\n    description: \"GM Attack/Damage: Automatic\",\n    shortDescription: \"GM Attack/Damage: Automatic\",\n    configSettings: {\n      gmAutoAttack: true,\n      gmAutoDamage: \"onHit\",\n      gmAutoFastForward: [\"attack\", \"damage\"],\n      gmRemoveButtons: \"all\",\n      gmTargetConfirmation: \"none\",\n      autoItemEffects: \"applyRemove\",\n      allowUseMacro: true,\n    },\n  },\n  GMManual: {\n    description: \"GM Attack/Damage: Manual\",\n    shortDescription: \"GM Attack/Damage: Manual\",\n    configSettings: {\n      gmAutoAttack: false,\n      gmAutoDamage: \"none\",\n      gmAutoFastForward: [],\n      gmRemoveButtons: \"none\",\n      gmTargetConfirmation: \"none\"\n    },\n  },\n  ShowItemInfo: {\n    description: \"Show Item Info in chat card\",\n    shortDescription: \"Show Item Info\",\n    configSettings: {\n      showItemDetails: \"all\",\n    },\n    codeChecks: (current, settings) => {\n      settings.itemTypeList = Object.keys(CONFIG.Item.typeLabels).filter(key => ![\"backpack\", \"base\"].includes(key));\n    }\n  },\n  PlayerAuto: {\n    description: \"Player Attack/Damage Roll: Automatic\",\n    shortDescription: \"Player Attack/Damage Roll: Automatic\",\n    configSettings: {\n      autoRollAttack: true,\n      autoRollDamage: \"onHit\",\n      autoFastForward: [\"attack\", \"damage\"],\n      removeButtons: \"all\",\n      targetConfirmation: \"none\"\n    },\n  },\n  PlayerManual: {\n    description: \"Player Attack/Damage Roll: Manual\",\n    shortDescription: \"Player Attack/Damage Roll: Manual\",\n    configSettings: {\n      autoRollAttack: false,\n      autoRollDamage: \"none\",\n      autoFastForward: [],\n      removeButtons: \"none\",\n      targetConfirmation: \"none\"\n    },\n  },\n  DamageAuto: {\n    description: \"Automatic Hits/Saves/damage application\",\n    shortDescription: \"Auto. Hits/Saves/dmg. application\",\n    configSettings: {\n      autoCheckHit: \"all\",\n      autoCheckSaves: \"all\",\n      removeButtons: \"all\",\n      playerRollSaves: \"chat\",\n      playerSaveTimeout: 30,\n      rollNPCSaves: \"auto\",\n      autoTarget: \"wallsBlockIgnoreDefeated\",\n      rangeTarget: \"alwaysIgnoreDefeated\",\n      rollNPCLinkedSaves: \"auto\",\n      autoCEEffects: \"cepri\",\n      autoItemEffects: \"applyRemove\",\n      allowUseMacro: true,\n      autoApplyDamage: \"yesCard\"\n    },\n    codeChecks: (current, settings) => {\n    }\n  },\n  DamageManual: {\n    description: \"No Hits/Saves/damage application automation\",\n    shortDescription: \"No Hits/Saves/dmg. app. automation\",\n    configSettings: {\n      autoCheckHit: \"none\",\n      autoCheckSaves: \"none\",\n      playerRollSaves: \"chat\",\n      playerSaveTimeout: 30,\n      rollNPCSaves: \"chat\",\n      autoTarget: \"wallsBlockIgnoreDefeated\",\n      rangeTarget: \"alwaysIgnoreDefeated\",\n      rollNPCLinkedSaves: \"chat\",\n      autoCEEffects: \"cepri\",\n      autoItemEffects: \"off\",\n      allowUseMacro: true,\n      autoApplyDamage: \"no\"\n    }\n  },\n  EnableReactions: {\n    description: \"Turn on Reaction processing\",\n    shortDescription: \"Turn on Reaction processing\",\n    configSettings: {\n      \"doReactions\": \"all\",\n      \"gmDoReactions\": \"all\",\n      \"reactionTimeout\": 30,\n      \"showReactionAttackRoll\": \"all\",\n      enforceReactions: \"all\",\n      recordAOO: \"all\"\n    },\n    codeChecks: (current, settings) => {\n      let changesMade = false;\n      if (current.autoCheckHit === \"none\") {\n        settings.autoCheckHit = \"whisper\";\n        changesMade = true;\n      }\n      if (current.autoCheckSaves === \"none\") {\n        settings.autoCheckSaves = \"whisper\";\n        changesMade = true;\n      }\n      if (current.playerRollSaves === \"none\") {\n        settings.playerRollSaves = \"chat\";\n        changesMade = true;\n      }\n      if (current.rollNPCLinkedSaves === \"none\") {\n        settings.rollNPCLinkedSaves = \"chat\";\n        changesMade = true;\n      }\n      if (current.autoApplyDamage === \"none\") {\n        settings.autoApplyDamage = \"noCard\";\n        changesMade = true;\n      }\n      if (changesMade) ui.notifications?.warn(\"midi-qol Some automation enabled to support reaction processing\")\n    }\n  },\n  DisableReactions: {\n    description: \"Turn off Reaction processing\",\n    shortDescription: \"Turn off Reaction processing\",\n    configSettings: {\n      doReactions: \"none\",\n      gmDoReactions: \"none\",\n      reactionTimeout: 0,\n      showReactionAttackRoll: \"all\",\n      enforceReactions: \"none\",\n      recordAOO: \"none\"\n    },\n  },\n  EnableConcentration: {\n    description: \"Enable Concentration Automation\",\n    shortDescription: \"Enable Concentration Automation\",\n    configSettings: {\n      removeConcentration: true,\n      singleConcentrationRoll: true,\n    },\n    codeChecks: (current, settings) => {\n      //@ts-expect-error\n      game.settings.set(game.system?.id, \"disableConcentration\", false);\n    }\n  },\n  NoDamageApplication: {\n    description: \"Allow GM to fudge damage application (display but no auto apply)\",\n    shortDescription: \"Allow GM to fudge damage application\",\n    configSettings: {\n      autoApplyDamage: \"noCard\"\n    },\n    codeChecks: (current, settings) => {\n      //@ts-expect-error\n      game.settings.set(\"midi-qol\", \"AddChatDamageButtons\", \"gm\");\n    }\n  },\n  DisableConcentration: {\n    description: \"Disable Concentration Automation\",\n    shortDescription: \"Disable Concentration Automation\",\n    configSettings: {\n      removeConcentration: false,\n      singleConcentrationRoll: false,\n    },\n    codeChecks: (current, settings) => {\n      //@ts-expect-error\n      game.settings.set(game.system?.id, \"disableConcentration\", true);\n    }\n  },\n\n  SecretSquirrel: {\n    description: \"Secret Squirrel: Hide most GM roll info from players\",\n    shortDescription: \"Secret Squirrel\",\n    configSettings: {\n      gmAttackDisplay: \"hidden\",\n      gmDamageDisplay: \"hidden\",\n      gmAttackDsn: \"none\",\n      gmDamageDsn: \"none\",\n      displaySaveAdvantage: false,\n      hideNPCNames: \"Unknown Creature\",\n      showReactionAttackRoll: \"none\",\n      displayHitResultNumeric: false\n    },\n    codeChecks: (current, settings) => {\n      if (current.autoCheckHit !== \"none\") settings.autoCheckHit = \"whisper\";\n      if (current.autoCheckSaves !== \"none\") settings.autoCheckSaves = \"whisper\";\n      if (!installedModules.get(\"anonymous\")) ui.notifications?.warn(\"'Anonymous' is recommended to hide creature names for normal dnd5e rolls\");\n      game.settings.set(\"dnd5e\", \"challengeVisibility\", \"none\");\n    }\n  },\n  FullDisclosure: {\n    description: \"Full Disclosure: Players see the details of all GM rolls and the results\",\n    shortDescription: \"Full Disclosure\",\n    configSettings: {\n      gmAttackDisplay: \"full\",\n      gmDamageDisplay: \"full\",\n      gmAttackDsn: \"show\",\n      gmDamageDsn: \"show\",\n      displaySaveAdvantage: true,\n      showReactionAttackRoll: \"all\",\n      hideNPCNames: \"\",\n      displayHitResultNumeric: true\n    },\n    codeChecks: (current, settings) => {\n      if (current.autoCheckHit !== \"none\") settings.autoCheckHit = \"all\";\n      if (current.autoCheckSaves !== \"none\") settings.autoCheckSaves = \"allShow\";\n      game.settings.set(\"dnd5e\", \"challengeVisibility\", \"all\");\n    }\n  }\n}\n\nexport async function applySettings(key: string) {\n  let settingsToApply = {};\n  const config = quickSettingsDetails[key];\n\n  if (config.configSettings) {\n    settingsToApply = foundry.utils.duplicate(config.configSettings);\n    if (config.codeChecks) config.codeChecks(configSettings, settingsToApply)\n    if (await showDiffs(configSettings, settingsToApply, \"\", config.shortDescription)) {\n      settingsToApply = foundry.utils.mergeObject(configSettings, settingsToApply, { overwrite: true, inplace: true });\n      //@ts-expect-error\n      if (game.user?.can(\"SETTINGS_MODIFY\")) game.settings.set(\"midi-qol\", \"ConfigSettings\", settingsToApply);\n      return true;\n    }\n  } else if (config.fileName) {\n    try {\n      const jsonText = await fetchConfigFile(PATH + config.fileName);\n      const configData = JSON.parse(jsonText);\n      if (await showDiffs(configSettings, configData.configSettings, \"\", config.shortDescription)) {\n        await importSettingsFromJSON(jsonText);\n        log(`Loaded ${config.fileName}`);\n      }\n      return true;\n    } catch (err) {\n      error(\"could not load config file\", config.fileName, err);\n    }\n  }\n  return false;\n}\nconst colorList = [\n  `AliceBlue`,\n  `AntiqueWhite`,\n  `Aqua`,\n  `Aquamarine`,\n  `Azure`,\n  `Beige`,\n  `Bisque`,\n  `Black`,\n  `BlanchedAlmond`,\n  `Blue`,\n  `BlueViolet`,\n  `Brown`,\n  `BurlyWood`,\n  `CadetBlue`,\n  `Chartreuse`,\n  `Chocolate`,\n  `Coral`,\n  `CornflowerBlue`,\n  `Cornsilk`,\n  `Crimson`,\n  `Cyan`,\n  `DarkBlue`,\n  `DarkCyan`,\n  `DarkGoldenRod`,\n  `DarkGray`,\n  `DarkGrey`,\n  `DarkGreen`,\n  `DarkKhaki`,\n  `DarkMagenta`,\n  `DarkOliveGreen`,\n  `Darkorange`,\n  `DarkOrchid`,\n  `DarkRed`,\n  `DarkSalmon`,\n  `DarkSeaGreen`,\n  `DarkSlateBlue`,\n  `DarkSlateGray`,\n  `DarkSlateGrey`,\n  `DarkTurquoise`,\n  `DarkViolet`,\n  `DeepPink`,\n  `DeepSkyBlue`,\n  `DimGray`,\n  `DimGrey`,\n  `DodgerBlue`,\n  `FireBrick`,\n  `FloralWhite`,\n  `ForestGreen`,\n  `Fuchsia`,\n  `Gainsboro`,\n  `GhostWhite`,\n  `Gold`,\n  `GoldenRod`,\n  `Gray`,\n  `Grey`,\n  `Green`,\n  `GreenYellow`,\n  `HoneyDew`,\n  `HotPink`,\n  `IndianRed`,\n  `Indigo`,\n  `Ivory`,\n  `Khaki`,\n  `Lavender`,\n  `LavenderBlush`,\n  `LawnGreen`,\n  `LemonChiffon`,\n  `LightBlue`,\n  `LightCoral`,\n  `LightCyan`,\n  `LightGoldenRodYellow`,\n  `LightGray`,\n  `LightGrey`,\n  `LightGreen`,\n  `LightPink`,\n  `LightSalmon`,\n  `LightSeaGreen`,\n  `LightSkyBlue`,\n  `LightSlateGray`,\n  `LightSlateGrey`,\n  `LightSteelBlue`,\n  `LightYellow`,\n  `Lime`,\n  `LimeGreen`,\n  `Linen`,\n  `Magenta`,\n  `Maroon`,\n  `MediumAquaMarine`,\n  `MediumBlue`,\n  `MediumOrchid`,\n  `MediumPurple`,\n  `MediumSeaGreen`,\n  `MediumSlateBlue`,\n  `MediumSpringGreen`,\n  `MediumTurquoise`,\n  `MediumVioletRed`,\n  `MidnightBlue`,\n  `MintCream`,\n  `MistyRose`,\n  `Moccasin`,\n  `NavajoWhite`,\n  `Navy`,\n  `OldLace`,\n  `Olive`,\n  `OliveDrab`,\n  `Orange`,\n  `OrangeRed`,\n  `Orchid`,\n  `PaleGoldenRod`,\n  `PaleGreen`,\n  `PaleTurquoise`,\n  `PaleVioletRed`,\n  `PapayaWhip`,\n  `PeachPuff`,\n  `Peru`,\n  `Pink`,\n  `Plum`,\n  `PowderBlue`,\n  `Purple`,\n  `Red`,\n  `RosyBrown`,\n  `RoyalBlue`,\n  `SaddleBrown`,\n  `Salmon`,\n  `SandyBrown`,\n  `SeaGreen`,\n  `SeaShell`,\n  `Sienna`,\n  `Silver`,\n  `SkyBlue`,\n  `SlateBlue`,\n  `SlateGray`,\n  `SlateGrey`,\n  `Snow`,\n  `SpringGreen`,\n  `SteelBlue`,\n  `Tan`,\n  `Teal`,\n  `Thistle`,\n  `Tomato`,\n  `Turquoise`,\n  `Violet`,\n  `Wheat`,\n  `White`,\n  `WhiteSmoke`,\n  `Yellow`,\n  `YellowGreen`,\n]","import { warn, debugEnabled, error, debug, log } from \"../../midi-qol.js\";\nimport { TroubleShooter } from \"../apps/TroubleShooter.js\";\n\n/**\n * Change event types for the registry\n */\nexport type RegistryChangeType = \"track\" | \"untrack\" | \"clear\" | \"deleteDependents\";\n\n/**\n * Change event data passed to the hook\n */\nexport interface RegistryChangeEvent {\n  type: RegistryChangeType;\n  parentUuid?: string;\n  dependentUuid?: string;\n}\n\n/**\n * Registry for midi-qol dependent documents.\n *\n * This registry tracks documents that depend on Actors, Items, or other non-ActiveEffect parents.\n * It works alongside dnd5e's DependentsRegistry but handles the case where parents are not ActiveEffects.\n *\n * Documents use the `flags.dnd5e.dependentOn` flag to specify their parent UUID.\n * The MidiDependentDocumentMixin reads this flag and tracks the document in this registry.\n * When a parent document is deleted, midi-qol's hooks use this registry to find and delete dependents.\n */\nexport class MidiDependentsRegistry {\n  // Map of parent document UUID -> Set of dependent document UUIDs\n  static #dependents = new Map<string, Set<string>>();\n\n  /**\n   * Get all dependent documents for a given parent document.\n   * @param document The parent document (Actor, Item, Effect, etc.) or its UUID\n   * @returns Array of dependent documents\n   */\n  static get(document: foundry.abstract.Document.Any | string): foundry.abstract.Document.Any[] {\n    const uuid = typeof document === \"string\" ? document : document?.uuid;\n    if (!uuid) return [];\n    return Array.from(this.#dependents.get(uuid) ?? [])\n      .map(depUuid => fromUuidSync(depUuid, { strict: false }))\n      .filter((d): d is foundry.abstract.Document.Any => !!d);\n  }\n\n  /**\n   * Track a document as dependent on a parent document.\n   * @param parentUuid UUID of the parent document\n   * @param dependent The dependent document\n   */\n  static track(parentUuid: string, dependent: foundry.abstract.Document.Any) {\n    if (!parentUuid || !dependent?.uuid) return;\n\n    const isNewParent = !this.#dependents.has(parentUuid);\n    if (isNewParent) this.#dependents.set(parentUuid, new Set());\n    const dependentSet = this.#dependents.get(parentUuid)!;\n    const isNewDependent = !dependentSet.has(dependent.uuid);\n    if (!isNewDependent) return; // Already tracking this dependent\n    dependentSet.add(dependent.uuid);\n    if (debugEnabled > 0) log(`MidiDependentsRegistry | TRACK: ${(\"name\" in dependent ? dependent.name : \"\")} (${dependent.uuid}) depends on ${parentUuid}`);\n    Hooks.callAll(\"midi-qol.dependentsRegistryChanged\", { type: \"track\", parentUuid, dependentUuid: dependent.uuid } as RegistryChangeEvent);\n  }\n\n  /**\n   * Stop tracking a document as dependent.\n   * @param parentUuid UUID of the parent document\n   * @param dependent The dependent document to stop tracking\n   */\n  static untrack(parentUuid: string, dependent: foundry.abstract.Document.Any) {\n    if (!parentUuid || !dependent?.uuid) return;\n    const dependentSet = this.#dependents.get(parentUuid);\n    if (!dependentSet?.has(dependent.uuid)) return; // Not tracking this dependent\n    dependentSet.delete(dependent.uuid);\n    // Clean up empty parent entries\n    if (dependentSet.size === 0) this.#dependents.delete(parentUuid);\n    if (debugEnabled > 0) log(`MidiDependentsRegistry | UNTRACK: ${(\"name\" in dependent ? dependent.name : \"\")} (${dependent.uuid}) no longer depends on ${parentUuid}`);\n    Hooks.callAll(\"midi-qol.dependentsRegistryChanged\", { type: \"untrack\", parentUuid, dependentUuid: dependent.uuid } as RegistryChangeEvent);\n  }\n\n  /**\n   * Delete all dependents of a parent document.\n   * Called when the parent document is deleted.\n   * @param parentUuid UUID of the deleted parent document\n   */\n  static async deleteDependents(parentUuid: string): Promise<void> {\n    const dependents = this.get(parentUuid);\n    if (dependents.length === 0) return;\n\n    if (debugEnabled > 0) log(`MidiDependentsRegistry | Deleting ${dependents.length} dependents of ${parentUuid}`);\n\n    for (const dependent of dependents) {\n      try {\n        //@ts-expect-error - delete options parameter varies by document type\n        await dependent.delete({});\n      } catch (err) {\n        // Document may have been deleted by another system (race condition) - not an error\n        if (debugEnabled > 0) warn(`MidiDependentsRegistry | Could not delete dependent ${dependent.uuid}:`, err);\n      }\n    }\n\n    // Clean up the registry entry\n    this.#dependents.delete(parentUuid);\n    Hooks.callAll(\"midi-qol.dependentsRegistryChanged\", { type: \"deleteDependents\", parentUuid } as RegistryChangeEvent);\n  }\n\n  /**\n   * Clear all entries from the registry.\n   * Useful for cleanup on world/scene change.\n   */\n  static clear() {\n    if (this.#dependents.size === 0) return; // Nothing to clear\n    this.#dependents.clear();\n    Hooks.callAll(\"midi-qol.dependentsRegistryChanged\", { type: \"clear\" } as RegistryChangeEvent);\n  }\n\n  /**\n   * Get all parent-dependent relationships in the registry.\n   * @returns Array of {parentUuid, dependentUuids} objects\n   */\n  static getAll(): Array<{ parentUuid: string; dependentUuids: string[] }> {\n    const entries: Array<{ parentUuid: string; dependentUuids: string[] }> = [];\n    for (const [parentUuid, dependentSet] of this.#dependents.entries()) {\n      if (dependentSet.size > 0) {\n        entries.push({ parentUuid, dependentUuids: Array.from(dependentSet) });\n      }\n    }\n    return entries;\n  }\n\n  /**\n   * Check if registry has any entries.\n   */\n  static get size(): number {\n    return this.#dependents.size;\n  }\n}\n\n/**\n * Mixin that adds midi-qol dependent document tracking to a document class.\n *\n * This mixin reads the `flags.dnd5e.dependentOn` flag (NOT midi-qol.dependentOn) and tracks\n * the document in MidiDependentsRegistry. This allows users to always use the same flag\n * regardless of whether the parent is an Actor, Item, or ActiveEffect.\n *\n * For ActiveEffect parents, dnd5e's own system handles deletion.\n * For Actor/Item parents, midi-qol's delete hooks use MidiDependentsRegistry.\n *\n * @param Base The base document class to wrap.\n * @returns The extended document class with midi-qol dependent tracking\n * @mixin\n */\n/** Minimal interface for document instances used by the mixin — uuid, flags, and name are present on all Foundry documents */\ninterface MixinDocumentInstance {\n  uuid: string;\n  name: string;\n  flags: Record<string, any>;\n  prepareData(): void;\n  _onCreate(data: object, options: object, userId: string): void;\n  _preUpdate(changed: object, options: object, user: User): Promise<any>;\n  _onUpdate(changed: object, options: object, userId: string): void;\n  _onDelete(options: object, userId: string): void;\n}\n\nexport function MidiDependentDocumentMixin<T extends new (...args: any[]) => MixinDocumentInstance>(Base: T) {\n  class MidiDependentDocument extends Base {\n    /** @inheritDoc */\n    prepareData() {\n      super.prepareData();\n      // Only track during initialization (game.ready === false) when loading from database\n      // After game is ready, _onCreate() handles tracking for newly created documents\n      if (game.ready) return;\n      try {\n        const dependentOn = this.flags?.dnd5e?.dependentOn;\n        if (dependentOn && this.uuid) {\n          MidiDependentsRegistry.track(dependentOn, this as unknown as foundry.abstract.Document.Any);\n        }\n      } catch (err) {\n        const message = `MidiDependentsRegistry.prepareData`;\n        TroubleShooter.recordError(err, message);\n        error(message, err);\n      }\n    }\n\n    /** @inheritDoc */\n    _onCreate(data: object, options: object, userId: string) {\n      const returnValue = super._onCreate(data, options, userId);\n      try {\n        // Track newly created documents if they have the flag set at creation\n        const dependentOn = this.flags?.dnd5e?.dependentOn;\n        if (dependentOn && this.uuid) {\n          MidiDependentsRegistry.track(dependentOn, this as unknown as foundry.abstract.Document.Any);\n        }\n      } catch (err) {\n        const message = `MidiDependentsRegistry._onCreate`;\n        TroubleShooter.recordError(err, message);\n        error(message, err);\n      }\n      return returnValue;\n    }\n\n    /** @inheritDoc */\n    async _preUpdate(changed: object, options: object, user: User) {\n      const allowed = await super._preUpdate(changed, options, user);\n      try {\n        // Check if dependentOn flag is being changed/deleted\n        const dnd5eFlags = (changed as Record<string, any>).flags?.dnd5e;\n        if (!dnd5eFlags) return allowed;\n        if (!(\"dependentOn\" in dnd5eFlags || \"-=dependentOn\" in dnd5eFlags)) return allowed;\n\n        const oldParent = this.flags?.dnd5e?.dependentOn;\n        if (oldParent && this.uuid) {\n          MidiDependentsRegistry.untrack(oldParent, this as unknown as foundry.abstract.Document.Any);\n        }\n      } catch (err) {\n        const message = `MidiDependentsRegistry._preUpdate`;\n        TroubleShooter.recordError(err, message);\n        error(message, err);\n      }\n      return allowed;\n    }\n\n    /** @inheritDoc */\n    _onUpdate(changed: object, options: object, userId: string) {\n      super._onUpdate(changed, options, userId);\n      try {\n        // Handle dependentOn flag being added or changed\n        const dnd5eFlags = (changed as Record<string, any>).flags?.dnd5e;\n        if (!dnd5eFlags || !(\"dependentOn\" in dnd5eFlags)) return;\n\n        const newParent = this.flags?.dnd5e?.dependentOn;\n        if (newParent && this.uuid) {\n          MidiDependentsRegistry.track(newParent, this as unknown as foundry.abstract.Document.Any);\n        }\n      } catch (err) {\n        const message = `MidiDependentsRegistry._onUpdate`;\n        TroubleShooter.recordError(err, message);\n        error(message, err);\n      }\n    }\n\n    /** @inheritDoc */\n    _onDelete(options: object, userId: string) {\n      super._onDelete(options, userId);\n      try {\n        // Read dnd5e.dependentOn flag\n        const dependentOn = this.flags?.dnd5e?.dependentOn;\n        if (dependentOn && this.uuid) {\n          MidiDependentsRegistry.untrack(dependentOn, this as unknown as foundry.abstract.Document.Any);\n        }\n      } catch (err) {\n        const message = `MidiDependentsRegistry._onDelete`;\n        TroubleShooter.recordError(err, message);\n        error(message, err);\n      }\n    }\n  }\n  return MidiDependentDocument;\n}\n","import { i18n } from \"../../midi-qol.js\";\nimport { MidiDependentsRegistry, RegistryChangeEvent } from \"../lib/MidiDependentsRegistry.js\";\n\nconst { ApplicationV2, HandlebarsApplicationMixin, DialogV2 } = foundry.applications.api;\n\ninterface DependentInfo {\n  uuid: string;\n  name: string;\n  type: string;\n  displayType: string;\n  icon: string;\n  exists: boolean;\n  hasItemParent?: boolean;\n  // Owner info for Items and ActiveEffects\n  ownerUuid?: string;\n  ownerName?: string;\n  ownerIcon?: string;\n  ownerExists?: boolean;\n  // Grandparent info when owner is an Item\n  grandparentUuid?: string;\n  grandparentName?: string;\n  grandparentIcon?: string;\n  grandparentExists?: boolean;\n}\n\ninterface DependentEntry {\n  parentUuid: string;\n  parentName: string;\n  parentType: string;\n  parentIcon: string;\n  parentExists: boolean;\n  hasItemParent?: boolean;\n  // Owner info for Items and ActiveEffects (the Actor/Item they belong to)\n  ownerUuid?: string;\n  ownerName?: string;\n  ownerIcon?: string;\n  ownerExists?: boolean;\n  // Grandparent info when owner is an Item (the Actor the Item belongs to)\n  grandparentUuid?: string;\n  grandparentName?: string;\n  grandparentIcon?: string;\n  grandparentExists?: boolean;\n  dependents: DependentInfo[];\n}\n\ninterface TypeSection {\n  type: string;\n  label: string;\n  icon: string;\n  collapsed: boolean;\n  entries: DependentEntry[];\n  count: number;\n}\n\n/** Throttle delay for rendering after registry changes */\nconst RENDER_THROTTLE_MS = 100;\n/** Debounce delay for search input */\nconst SEARCH_DEBOUNCE_MS = 300;\n\nexport class DependentsExplorer extends HandlebarsApplicationMixin(ApplicationV2) {\n  #searchFilter: string = \"\";\n  #collapsedSections: Set<string> = new Set();\n  #hookIds: Map<string, number> = new Map();\n  // Cache of processed entries by parent UUID for incremental updates\n  #entriesCache: Map<string, DependentEntry> = new Map();\n  #cacheValid: boolean = false;\n  // Throttled render to batch rapid UI updates\n  #throttledRender = foundry.utils.throttle(() => this.render({ force: true }), RENDER_THROTTLE_MS);\n  // Debounced search render to avoid cursor issues\n  #debouncedSearchRender = foundry.utils.debounce(() => this.#renderSearchResults(), SEARCH_DEBOUNCE_MS);\n\n  static override DEFAULT_OPTIONS = {\n    id: \"midi-qol-dependents-explorer\",\n    window: {\n      title: \"midi-qol.DependentsExplorer.Title\",\n      resizable: true,\n      contentClasses: [\"standard-form\", \"dependents-explorer\"]\n    },\n    position: {\n      width: 600,\n      height: 500\n    },\n    actions: {\n      deleteParent: this.#onDeleteParent,\n      deleteDependent: this.#onDeleteDependent,\n      openDocument: this.#onOpenDocument,\n      toggleSection: this.#onToggleSection,\n      clearFilter: this.#onClearFilter\n    }\n  };\n\n  static override PARTS = {\n    main: {\n      template: \"modules/midi-qol/templates/apps/DependentsExplorer/dependentsExplorer.hbs\",\n      // Preserve scroll position during re-render\n      scrollable: [\".sections-list\"]\n    }\n  };\n\n  get title() {\n    return i18n(\"midi-qol.DependentsExplorer.Title\");\n  }\n\n  async _prepareContext(options: any) {\n    const context: any = await super._prepareContext(options);\n\n    // Rebuild cache if invalid\n    if (!this.#cacheValid) {\n      this.#rebuildCache();\n    }\n\n    const entriesByType = new Map<string, DependentEntry[]>();\n    const filter = this.#searchFilter.toLowerCase();\n\n    for (const entry of this.#entriesCache.values()) {\n      // Filter by name\n      if (filter && !entry.parentName.toLowerCase().includes(filter)) {\n        // Check if any dependent matches the filter\n        const hasMatchingDependent = entry.dependents.some(dep =>\n          dep.name.toLowerCase().includes(filter)\n        );\n        if (!hasMatchingDependent) continue;\n      }\n\n      if (!entriesByType.has(entry.parentType)) {\n        entriesByType.set(entry.parentType, []);\n      }\n      entriesByType.get(entry.parentType)!.push(entry);\n    }\n\n    // Build sections from all types\n    const sections: TypeSection[] = [];\n\n    for (const [type, entries] of entriesByType) {\n      if (entries.length === 0) continue;\n\n      // Sort entries by name\n      entries.sort((a, b) => a.parentName.localeCompare(b.parentName));\n\n      sections.push({\n        type,\n        label: this.#getTypeLabel(type),\n        icon: this.#getTypeIcon(type),\n        collapsed: this.#collapsedSections.has(type),\n        entries,\n        count: entries.length\n      });\n    }\n\n    // Sort sections alphabetically by label\n    sections.sort((a, b) => a.label.localeCompare(b.label));\n\n    context.sections = sections;\n    context.isEmpty = sections.length === 0;\n    context.emptyMessage = filter\n      ? i18n(\"midi-qol.DependentsExplorer.NoMatches\")\n      : i18n(\"midi-qol.DependentsExplorer.Empty\");\n    context.searchFilter = this.#searchFilter;\n    context.totalCount = this.#entriesCache.size;\n\n    return context;\n  }\n\n  #getDocumentIcon(doc: any): string {\n    if (!doc) return \"fas fa-question\";\n    return this.#getTypeIcon(doc.documentName);\n  }\n\n  #getDisplayType(type: string): string {\n    return type === \"ActiveEffect\" ? \"Effect\" : type;\n  }\n\n  #getTypeIcon(type: string): string {\n    switch (type) {\n      case \"Actor\": return \"fas fa-user\";\n      case \"Item\": return \"fas fa-suitcase\";\n      case \"ActiveEffect\": return \"fas fa-bolt\";\n      case \"Token\": return \"fas fa-user-circle\";\n      case \"Scene\": return \"fas fa-map\";\n      case \"Combatant\": return \"fas fa-fist-raised\";\n      default: return \"fas fa-file\";\n    }\n  }\n\n  #getTypeLabel(type: string): string {\n    switch (type) {\n      case \"Actor\": return i18n(\"midi-qol.DependentsExplorer.TypeActor\");\n      case \"Item\": return i18n(\"midi-qol.DependentsExplorer.TypeItem\");\n      case \"ActiveEffect\": return i18n(\"midi-qol.DependentsExplorer.TypeActiveEffect\");\n      case \"Token\": return i18n(\"midi-qol.DependentsExplorer.TypeToken\");\n      case \"Scene\": return i18n(\"midi-qol.DependentsExplorer.TypeScene\");\n      case \"Combatant\": return i18n(\"midi-qol.DependentsExplorer.TypeCombatant\");\n      default: return type;\n    }\n  }\n\n  async _onFirstRender(context: any, options: any): Promise<void> {\n    await super._onFirstRender(context, options);\n\n    // Register hook to listen for registry changes\n    this.#hookIds.set(\"registryChanged\", Hooks.on(\"midi-qol.dependentsRegistryChanged\", (event: RegistryChangeEvent) => {\n      this.#handleRegistryChange(event);\n    }));\n\n    // Register hooks to listen for document updates (for display changes like counters)\n    this.#hookIds.set(\"updateItem\", Hooks.on(\"updateItem\", (doc: any) => {\n      this.#handleDocumentUpdate(doc.uuid);\n    }));\n    this.#hookIds.set(\"updateActiveEffect\", Hooks.on(\"updateActiveEffect\", (doc: any) => {\n      this.#handleDocumentUpdate(doc.uuid);\n    }));\n    this.#hookIds.set(\"updateActor\", Hooks.on(\"updateActor\", (doc: any) => {\n      this.#handleDocumentUpdate(doc.uuid);\n    }));\n  }\n\n  #handleDocumentUpdate(uuid: string) {\n    if (!this.#cacheValid) return;\n    if (!this.#isDocumentInCache(uuid)) return;\n    this.#refreshDocumentInCache(uuid);\n    this.#throttledRender();\n  }\n\n  #isDocumentInCache(uuid: string): boolean {\n    // Check if document is a parent\n    if (this.#entriesCache.has(uuid)) return true;\n    // Check if document is a dependent\n    for (const entry of this.#entriesCache.values()) {\n      if (entry.dependents.some(d => d.uuid === uuid)) return true;\n    }\n    return false;\n  }\n\n  #refreshDocumentInCache(uuid: string) {\n    // If it's a parent, rebuild the parent entry\n    if (this.#entriesCache.has(uuid)) {\n      const entry = this.#entriesCache.get(uuid)!;\n      const dependentUuids = entry.dependents.map(d => d.uuid);\n      const newEntry = this.#buildParentEntry(uuid, dependentUuids);\n      if (newEntry) {\n        this.#entriesCache.set(uuid, newEntry);\n      }\n    }\n    // If it's a dependent, rebuild that dependent's info in all entries that contain it\n    for (const [parentUuid, entry] of this.#entriesCache.entries()) {\n      const depIndex = entry.dependents.findIndex(d => d.uuid === uuid);\n      if (depIndex !== -1) {\n        const newDepInfo = this.#buildDependentInfo(uuid);\n        if (newDepInfo) {\n          entry.dependents[depIndex] = newDepInfo;\n        }\n      }\n    }\n  }\n\n  #handleRegistryChange(event: RegistryChangeEvent) {\n    switch (event.type) {\n      case \"track\":\n        if (event.parentUuid && event.dependentUuid) {\n          this.#addToCache(event.parentUuid, event.dependentUuid);\n        }\n        break;\n      case \"untrack\":\n        if (event.parentUuid && event.dependentUuid) {\n          this.#removeFromCache(event.parentUuid, event.dependentUuid);\n        }\n        break;\n      case \"clear\":\n      case \"deleteDependents\":\n        // These require full cache rebuild\n        this.#cacheValid = false;\n        break;\n    }\n    this.#throttledRender();\n  }\n\n  #addToCache(parentUuid: string, dependentUuid: string) {\n    if (!this.#cacheValid) return; // Cache will be rebuilt on next render\n\n    const existingEntry = this.#entriesCache.get(parentUuid);\n    if (existingEntry) {\n      // Check if dependent already exists\n      if (!existingEntry.dependents.some(d => d.uuid === dependentUuid)) {\n        const depInfo = this.#buildDependentInfo(dependentUuid);\n        if (depInfo) {\n          existingEntry.dependents.push(depInfo);\n        }\n      }\n    } else {\n      // New parent - build the full entry\n      const entry = this.#buildParentEntry(parentUuid, [dependentUuid]);\n      if (entry) {\n        this.#entriesCache.set(parentUuid, entry);\n      }\n    }\n  }\n\n  #removeFromCache(parentUuid: string, dependentUuid: string) {\n    if (!this.#cacheValid) return; // Cache will be rebuilt on next render\n\n    const existingEntry = this.#entriesCache.get(parentUuid);\n    if (existingEntry) {\n      existingEntry.dependents = existingEntry.dependents.filter(d => d.uuid !== dependentUuid);\n      // Remove parent entry if no dependents left\n      if (existingEntry.dependents.length === 0) {\n        this.#entriesCache.delete(parentUuid);\n      }\n    }\n  }\n\n  #buildDependentInfo(uuid: string): DependentInfo | null {\n    const doc = fromUuidSync(uuid, { strict: false }) as any;\n    const docType = doc?.documentName ?? \"Unknown\";\n\n    // Get owner info for Items and ActiveEffects\n    let depOwnerUuid: string | undefined;\n    let depOwnerName: string | undefined;\n    let depOwnerIcon: string | undefined;\n    let depOwnerExists: boolean | undefined;\n    let depGrandparentUuid: string | undefined;\n    let depGrandparentName: string | undefined;\n    let depGrandparentIcon: string | undefined;\n    let depGrandparentExists: boolean | undefined;\n\n    if (doc && (docType === \"Item\" || docType === \"ActiveEffect\")) {\n      const owner = doc.parent;\n      if (owner) {\n        depOwnerUuid = owner.uuid;\n        depOwnerName = owner.name;\n        depOwnerIcon = this.#getDocumentIcon(owner);\n        depOwnerExists = true;\n\n        // If owner is an Item, get its parent (the Actor)\n        if (owner.documentName === \"Item\" && owner.parent) {\n          const grandparent = owner.parent;\n          depGrandparentUuid = grandparent.uuid;\n          depGrandparentName = grandparent.name;\n          depGrandparentIcon = this.#getDocumentIcon(grandparent);\n          depGrandparentExists = true;\n        }\n      }\n    }\n\n    return {\n      uuid,\n      name: doc?.name ?? doc?.documentName ?? i18n(\"midi-qol.DependentsExplorer.Unknown\"),\n      type: docType,\n      displayType: this.#getDisplayType(docType),\n      icon: this.#getDocumentIcon(doc),\n      exists: !!doc,\n      hasItemParent: doc?.parent instanceof Item,\n      ownerUuid: depOwnerUuid,\n      ownerName: depOwnerName,\n      ownerIcon: depOwnerIcon,\n      ownerExists: depOwnerExists,\n      grandparentUuid: depGrandparentUuid,\n      grandparentName: depGrandparentName,\n      grandparentIcon: depGrandparentIcon,\n      grandparentExists: depGrandparentExists\n    };\n  }\n\n  #rebuildCache() {\n    this.#entriesCache.clear();\n    const rawEntries = MidiDependentsRegistry.getAll();\n    for (const { parentUuid, dependentUuids } of rawEntries) {\n      const entry = this.#buildParentEntry(parentUuid, dependentUuids);\n      if (entry) {\n        this.#entriesCache.set(parentUuid, entry);\n      }\n    }\n    this.#cacheValid = true;\n  }\n\n  #buildParentEntry(parentUuid: string, dependentUuids: string[]): DependentEntry | null {\n    const parentDoc = fromUuidSync(parentUuid, { strict: false }) as any;\n    const parentExists = !!parentDoc;\n    const parentName = parentDoc?.name ?? parentDoc?.documentName ?? i18n(\"midi-qol.DependentsExplorer.Unknown\");\n    const parentType = parentDoc?.documentName ?? \"Unknown\";\n\n    const dependents: DependentInfo[] = dependentUuids\n      .map(uuid => this.#buildDependentInfo(uuid))\n      .filter((d): d is DependentInfo => d !== null);\n\n    // Get owner info for Items and ActiveEffects\n    let ownerUuid: string | undefined;\n    let ownerName: string | undefined;\n    let ownerIcon: string | undefined;\n    let ownerExists: boolean | undefined;\n    let grandparentUuid: string | undefined;\n    let grandparentName: string | undefined;\n    let grandparentIcon: string | undefined;\n    let grandparentExists: boolean | undefined;\n\n    if (parentDoc && (parentType === \"Item\" || parentType === \"ActiveEffect\")) {\n      const owner = parentDoc.parent;\n      if (owner) {\n        ownerUuid = owner.uuid;\n        ownerName = owner.name;\n        ownerIcon = this.#getDocumentIcon(owner);\n        ownerExists = true;\n\n        // If owner is an Item, get its parent (the Actor)\n        if (owner.documentName === \"Item\" && owner.parent) {\n          const grandparent = owner.parent;\n          grandparentUuid = grandparent.uuid;\n          grandparentName = grandparent.name;\n          grandparentIcon = this.#getDocumentIcon(grandparent);\n          grandparentExists = true;\n        }\n      }\n    }\n\n    return {\n      parentUuid,\n      parentName,\n      parentType,\n      parentIcon: this.#getDocumentIcon(parentDoc),\n      parentExists,\n      hasItemParent: parentDoc?.parent instanceof Item,\n      ownerUuid,\n      ownerName,\n      ownerIcon,\n      ownerExists,\n      grandparentUuid,\n      grandparentName,\n      grandparentIcon,\n      grandparentExists,\n      dependents\n    };\n  }\n\n  async _onRender(context: any, options: any): Promise<void> {\n    await super._onRender(context, options);\n\n    // Set up search input handler\n    const searchInput = this.element.querySelector('input[name=\"search-filter\"]') as HTMLInputElement;\n    if (searchInput) {\n      searchInput.addEventListener(\"input\", this.#onSearchInput.bind(this));\n    }\n  }\n\n  async _onClose(options: any): Promise<void> {\n    await super._onClose(options);\n\n    // Unregister all hooks when the app is closed\n    for (const [hookName, hookId] of this.#hookIds.entries()) {\n      if (hookName === \"registryChanged\") {\n        Hooks.off(\"midi-qol.dependentsRegistryChanged\", hookId);\n      } else {\n        // @ts-expect-error Dynamic hook names not in HookConfig\n        Hooks.off(hookName, hookId);\n      }\n    }\n    this.#hookIds.clear();\n  }\n\n  #onSearchInput(event: Event) {\n    const input = event.target as HTMLInputElement;\n    this.#searchFilter = input.value;\n    // Debounce the render to avoid cursor position issues\n    this.#debouncedSearchRender();\n  }\n\n  #renderSearchResults() {\n    // Store cursor position before render\n    const searchInput = this.element.querySelector('input[name=\"search-filter\"]') as HTMLInputElement;\n    const cursorPosition = searchInput?.selectionStart ?? this.#searchFilter.length;\n\n    this.render({ force: true }).then(() => {\n      // Restore cursor position after render\n      const newSearchInput = this.element.querySelector('input[name=\"search-filter\"]') as HTMLInputElement;\n      if (newSearchInput) {\n        newSearchInput.setSelectionRange(cursorPosition, cursorPosition);\n      }\n    });\n  }\n\n  static #onClearFilter(this: DependentsExplorer, event: Event, target: HTMLElement) {\n    this.#searchFilter = \"\";\n    this.render({ force: true }).then(() => {\n      // Focus the search input after clearing\n      const searchInput = this.element.querySelector('input[name=\"search-filter\"]') as HTMLInputElement;\n      searchInput?.focus();\n    });\n  }\n\n  static #onToggleSection(this: DependentsExplorer, event: Event, target: HTMLElement) {\n    const type = target.dataset.type;\n    if (!type) return;\n\n    if (this.#collapsedSections.has(type)) {\n      this.#collapsedSections.delete(type);\n    } else {\n      this.#collapsedSections.add(type);\n    }\n    this.render({ force: true });\n  }\n\n  static async #onDeleteParent(this: DependentsExplorer, event: Event, target: HTMLElement) {\n    const uuid = target.dataset.uuid;\n    if (!uuid) return;\n\n    const doc = fromUuidSync(uuid, { strict: false }) as any;\n    if (!doc) {\n      ui.notifications?.warn(i18n(\"midi-qol.DependentsExplorer.DocumentNotFound\"));\n      return;\n    }\n\n    const docType = doc.documentName;\n    const isItemEffect = docType === \"ActiveEffect\" && doc.parent instanceof Item;\n    const needsConfirm = docType === \"Actor\" || docType === \"Item\" || isItemEffect;\n\n    if (needsConfirm) {\n      const confirmMessage = isItemEffect\n        ? i18n(\"midi-qol.DependentsExplorer.ConfirmDeleteItemEffect\").replace(\"{name}\", doc.name)\n        : i18n(\"midi-qol.DependentsExplorer.ConfirmDeleteParent\").replace(\"{name}\", doc.name).replace(\"{type}\", docType);\n      const confirmed = await DialogV2.confirm({\n        window: { title: i18n(\"midi-qol.DependentsExplorer.ConfirmDelete\") },\n        content: confirmMessage,\n        yes: { label: i18n(\"midi-qol.DependentsExplorer.Delete\") },\n        no: { label: i18n(\"midi-qol.DependentsExplorer.Cancel\") }\n      });\n      if (!confirmed) return;\n    }\n\n    const docName = doc.name;\n    try {\n      await doc.delete();\n      ui.notifications?.info(i18n(\"midi-qol.DependentsExplorer.Deleted\").replace(\"{name}\", docName));\n      this.render({ force: true });\n    } catch (err) {\n      console.error(\"DependentsExplorer | Failed to delete document:\", err);\n      ui.notifications?.error(i18n(\"midi-qol.DependentsExplorer.DeleteFailed\"));\n    }\n  }\n\n  static async #onDeleteDependent(this: DependentsExplorer, event: Event, target: HTMLElement) {\n    const uuid = target.dataset.uuid;\n    if (!uuid) return;\n\n    const doc = fromUuidSync(uuid, { strict: false }) as any;\n    if (!doc) {\n      ui.notifications?.warn(i18n(\"midi-qol.DependentsExplorer.DocumentNotFound\"));\n      return;\n    }\n\n    const docType = doc.documentName;\n    const isItemEffect = docType === \"ActiveEffect\" && doc.parent instanceof Item;\n    const needsConfirm = docType === \"Actor\" || docType === \"Item\" || isItemEffect;\n\n    if (needsConfirm) {\n      const confirmMessage = isItemEffect\n        ? i18n(\"midi-qol.DependentsExplorer.ConfirmDeleteItemEffect\").replace(\"{name}\", doc.name)\n        : i18n(\"midi-qol.DependentsExplorer.ConfirmDeleteDependent\").replace(\"{name}\", doc.name).replace(\"{type}\", docType);\n      const confirmed = await DialogV2.confirm({\n        window: { title: i18n(\"midi-qol.DependentsExplorer.ConfirmDelete\") },\n        content: confirmMessage,\n        yes: { label: i18n(\"midi-qol.DependentsExplorer.Delete\") },\n        no: { label: i18n(\"midi-qol.DependentsExplorer.Cancel\") }\n      });\n      if (!confirmed) return;\n    }\n\n    const docName = doc.name;\n    try {\n      await doc.delete();\n      ui.notifications?.info(i18n(\"midi-qol.DependentsExplorer.Deleted\").replace(\"{name}\", docName));\n      this.render({ force: true });\n    } catch (err) {\n      console.error(\"DependentsExplorer | Failed to delete document:\", err);\n      ui.notifications?.error(i18n(\"midi-qol.DependentsExplorer.DeleteFailed\"));\n    }\n  }\n\n  static async #onOpenDocument(this: DependentsExplorer, event: Event, target: HTMLElement) {\n    const uuid = target.dataset.uuid;\n    if (!uuid) return;\n\n    const doc = fromUuidSync(uuid, { strict: false }) as any;\n    if (!doc) {\n      ui.notifications?.warn(i18n(\"midi-qol.DependentsExplorer.DocumentNotFound\"));\n      return;\n    }\n\n    if (typeof doc.sheet?.render === \"function\") {\n      doc.sheet.render(true);\n    }\n  }\n}\n","import { i18n, gameStats } from \"../../midi-qol.js\";\nimport { configSettings } from \"../settings.js\";\nimport { RollStats } from \"../RollStats.js\";\nconst { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;\n\nexport class RollStatsDisplay extends HandlebarsApplicationMixin(ApplicationV2) {\n\n  statsHookId: number;\n  playersOnly: boolean;\n  stats: RollStats;\n  expanded: Record<string, boolean>;\n  expandedItems: Record<string, boolean>;\n  showLifetime: Record<string, boolean>;\n  #renderPending: boolean = false;\n\n  constructor(options: any = {}) {\n    super(options);\n    this.stats = options.stats ?? gameStats;\n    this.playersOnly = options.playersOnly ?? configSettings.playerStatsOnly ?? !game.user?.isGM;\n    this.expanded = {};\n    this.expandedItems = {};\n    this.showLifetime = {};\n    Object.keys(this.stats.currentStats).forEach(aid => {\n      this.expanded[aid] = this.playersOnly;\n    })\n    this.statsHookId = Hooks.on(\"midi-qol.StatsUpdated\", () => {\n      if (this.#renderPending) return;\n      this.#renderPending = true;\n      setTimeout(() => {\n        this.#renderPending = false;\n        this.render({force: true});\n      }, 500);\n    });\n  }\n\n  static override DEFAULT_OPTIONS = {\n    id: \"midi-qol-statistics\",\n    window: {\n      title: \"midi-qol.StatsTitle\",\n      resizable: true,\n      contentClasses: [\"standard-form\"]\n    },\n    position: {\n      width: 820,\n      height: 650\n    },\n    actions: {\n      clearStats: RollStatsDisplay.#onClearStats,\n      exportJSON: RollStatsDisplay.#onExportJSON,\n      exportCSV: RollStatsDisplay.#onExportCSV,\n      endSession: RollStatsDisplay.#onEndSession,\n      removeStats: RollStatsDisplay.#onRemoveStats,\n      toggleExpand: RollStatsDisplay.#onToggleExpand,\n      toggleItems: RollStatsDisplay.#onToggleItems,\n      togglePeriod: RollStatsDisplay.#onTogglePeriod,\n    }\n  };\n\n  static override PARTS = {\n    tabs: {template: \"templates/generic/tab-navigation.hbs\"},\n    stats: {template: \"modules/midi-qol/templates/apps/RollStatsDisplay/stats.hbs\", scrollable: [\"\", \".midi-stats-card-body\"]},\n    config: {template: \"modules/midi-qol/templates/apps/RollStatsDisplay/config.hbs\", scrollable: [\"\"]}\n  }\n\n  tabGroups = {\n    sheet: \"stats\"\n  }\n\n  get title() {\n    return i18n(\"midi-qol.StatsTitle\")\n  }\n\n  _onClose(options) {\n    super._onClose(options);\n    Hooks.off(\"midi-qol.StatsUpdated\", this.statsHookId);\n    this.stats.saveStats();\n  }\n\n  async _prepareContext(options) {\n    const context: any = await super._prepareContext(options);\n    context.stats = this.stats.prepareStats();\n    Object.keys(context.stats).forEach(id => {\n      if (this.playersOnly && game.user?.id !== id && game.actors?.get(id)?.permission !== CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER) {\n        delete context.stats[id];\n      }\n    });\n    // Add hasItemStats flag and build aligned damage-type column arrays per actor\n    Object.keys(context.stats).forEach(id => {\n      const s = context.stats[id];\n      s.hasItemStats = Object.keys(s.itemStats).length > 0;\n\n      // Damage dealt by type — union of all types across session+lifetime so columns align\n      const sDealt = s.sessionDamageDealtByType ?? {};\n      const sApplied = s.sessionDamageAppliedByType ?? {};\n      const lDealt = s.lifetimeDamageDealtByType ?? {};\n      const lApplied = s.lifetimeDamageAppliedByType ?? {};\n      const dealtTypes = [...new Set([\n        ...Object.keys(sDealt), ...Object.keys(lDealt),\n        ...Object.keys(sApplied), ...Object.keys(lApplied)\n      ])];\n      s.damageDealtTypes = dealtTypes;\n      s.sessionDamageByType = dealtTypes.map(type => ({\n        dealt: sDealt[type] ?? 0, applied: sApplied[type] ?? 0\n      }));\n      s.lifetimeDamageByType = dealtTypes.map(type => ({\n        dealt: lDealt[type] ?? 0, applied: lApplied[type] ?? 0\n      }));\n\n      // Damage taken by type — union across session+lifetime\n      const sTaken = s.sessionDamageTakenByType ?? {};\n      const lTaken = s.lifetimeDamageTakenByType ?? {};\n      const takenTypes = [...new Set([...Object.keys(sTaken), ...Object.keys(lTaken)])];\n      s.damageTakenTypes = takenTypes;\n      s.sessionDmgTaken = takenTypes.map(type => sTaken[type] ?? 0);\n      s.lifetimeDmgTaken = takenTypes.map(type => lTaken[type] ?? 0);\n    });\n    context.hasStats = Object.keys(context.stats).length > 0;\n    context.isGm = game.user?.isGM;\n    context.configSettings = configSettings;\n    context.tabs = this.#getTabs();\n    return context;\n  }\n\n  _preparePartContext(partId, context) {\n    if (Object.keys(context.tabs).includes(partId)) {\n      context.tab = context.tabs[partId];\n    }\n    return context;\n  }\n\n  #getTabs() {\n    const tabs = {\n      stats: {id: \"stats\", group: \"sheet\", label: i18n(\"midi-qol.RollStats\"), active: true},\n      config: {id: \"config\", group: \"sheet\", label: i18n(\"midi-qol.RollStatsConfig\")}\n    };\n    return tabs;\n  }\n\n  async _onRender(context, options) {\n    super._onRender(context, options);\n    // Settings change listeners\n    for (const name of [\"keepRollStats\", \"playerStatsOnly\"]) {\n      this.element.querySelector(`input[name=\"${name}\"]`)?.addEventListener(\"change\", (e) => {\n        configSettings[name] = (e.target as HTMLInputElement).checked;\n        game.settings.set(\"midi-qol\", \"ConfigSettings\", configSettings);\n      });\n    }\n    this.element.querySelector('input[name=\"saveStatsEvery\"]')?.addEventListener(\"change\", (e) => {\n      configSettings.saveStatsEvery = Number((e.target as HTMLInputElement).value);\n      game.settings.set(\"midi-qol\", \"ConfigSettings\", configSettings);\n    });\n    // Apply expand/collapse and session/lifetime state via CSS classes\n    Object.keys(this.stats.currentStats).forEach(id => {\n      const card = this.element.querySelector(`.midi-stats-card[data-actor-id=\"${id}\"]`) as HTMLElement | null;\n      if (card) {\n        if (this.expanded[id]) card.classList.add(\"expanded\");\n        if (this.showLifetime[id]) card.classList.add(\"show-lifetime\");\n      }\n      const itemsSection = this.element.querySelector(`.midi-stats-items-section[data-actor-id=\"${id}\"]`) as HTMLElement | null;\n      if (itemsSection && this.expandedItems[id]) {\n        itemsSection.classList.add(\"expanded\");\n      }\n    });\n  }\n\n  static #onClearStats(this: RollStatsDisplay) {\n    this.stats.clearStats();\n  }\n\n  static #onExportJSON(this: RollStatsDisplay) {\n    this.stats.exportToJSON();\n  }\n\n  static #onExportCSV(this: RollStatsDisplay) {\n    this.stats.exportToCSV();\n  }\n\n  static #onEndSession(this: RollStatsDisplay) {\n    this.stats.endSession();\n  }\n\n  static #onRemoveStats(this: RollStatsDisplay, event: Event, target: HTMLElement) {\n    const actorId = target.dataset.actorId;\n    if (actorId) {\n      this.stats.clearActorStats(actorId);\n      this.render({force: true});\n    }\n  }\n\n  static #onToggleExpand(this: RollStatsDisplay, event: Event, target: HTMLElement) {\n    const actorId = target.dataset.actorId;\n    if (!actorId) return;\n    this.expanded[actorId] = !this.expanded[actorId];\n    const card = target.closest(\".midi-stats-card\") as HTMLElement | null;\n    if (card) {\n      card.classList.toggle(\"expanded\");\n    }\n  }\n\n  static #onToggleItems(this: RollStatsDisplay, event: Event, target: HTMLElement) {\n    const actorId = target.dataset.actorId;\n    if (!actorId) return;\n    this.expandedItems[actorId] = !this.expandedItems[actorId];\n    const section = target.closest(\".midi-stats-items-section\") as HTMLElement | null;\n    if (section) {\n      section.classList.toggle(\"expanded\");\n    }\n  }\n\n  static #onTogglePeriod(this: RollStatsDisplay, event: Event, target: HTMLElement) {\n    event.stopPropagation(); // Prevent triggering toggleExpand on the parent header\n    const actorId = target.dataset.actorId;\n    if (!actorId) return;\n    this.showLifetime[actorId] = !this.showLifetime[actorId];\n    const card = target.closest(\".midi-stats-card\") as HTMLElement | null;\n    if (card) {\n      card.classList.toggle(\"show-lifetime\", this.showLifetime[actorId]);\n    }\n  }\n}\n","import { debug, i18n, log, GameSystemConfig } from \"../midi-qol.js\";\nimport { configSettings, midiSoundSettings } from \"./settings.js\";\nimport { dice3dEnabled } from \"./setupModules.js\";\nimport { Workflow } from \"./Workflow.js\";\n \ninterface rollSpec {\n  actorType: string // any,npc,character\n  itemType: string; // weapon/spell/equipment/consumable\n  itemSubtype: string;\n  weaponSubType: string;\n  actionType: string;\n  rollType: string; // itemRoll, attackRoll, damageRoll, consume, cast, \n  resultType: string; // critical/fumble/success/fail/normal\n  playlistName: string;\n  soundName: string; // soundName or random\n}\ninterface SoundSpec {\n  playlistName: string;\n  soundName: string;\n};\nexport class MidiSounds {\n  static weaponBaseTypes: {};\n\n  static getSound(playListName: string, soundName: string) {\n    const playlist: Playlist.Implementation | undefined = game.playlists?.getName(playListName);\n    return { playlist, sound: playlist?.sounds.getName(soundName) };\n  }\n\n  static async playSound(playListName: string, soundName: string) {\n    const { playlist, sound } = this.getSound(playListName, soundName);\n    if (playlist && sound?.path) {\n        return foundry.audio.AudioHelper.play({ src: sound.path, volume: sound.volume, loop: false }, true);\n    }\n    return null;\n  }\n\n  static ActionTypes(): Record<string, string> {\n    const damageEntries = Object.fromEntries(Object.entries(GameSystemConfig.damageTypes as Record<string, {label: string}>).map(([key, {label}]) => [key, `${i18n(\"DND5E.Damage\")}: ${label}`]));\n    const itemActionEntries = Object.fromEntries(Object.entries(GameSystemConfig.itemActionTypes as Record<string, string>).map(([key, label]) => [key, `${i18n(\"DND5E.Action\")}: ${label}`]));\n\n    return {\n      itemRoll: `${i18n(\"DOCUMENT.Item\")} ${i18n(\"TABLE.Roll\")}`,\n      attack: i18n(\"DND5E.AttackRoll\"),\n      damage: i18n(\"DND5E.DamageRoll\"),\n      critical: `${i18n(\"DND5E.Attack\")}: ${i18n(\"midi-qol.CriticalSoundName\")}`,\n      fumble: `${i18n(\"DND5E.Attack\")}: ${i18n(\"midi-qol.FumbleSoundName\")}`,\n      hit: `${i18n(\"DND5E.Attack\")}: ${i18n(\"midi-qol.Hits\")}`,\n      miss: `${i18n(\"DND5E.Attack\")}: ${i18n(\"midi-qol.Misses\")}`,\n      none: i18n(\"None\"),\n      ...itemActionEntries,\n      ...damageEntries,\n    };\n  }\n  static async playRandomSound(playListName: string) {\n    const playlist: Playlist | undefined = game.playlists?.getName(playListName);\n    if (playlist) {\n      const sounds = playlist.sounds;\n      const soundIndex = Math.floor(Math.random() * sounds.contents.length);\n      const sound = sounds.contents[soundIndex];\n      return this.playSound(playlist.name, sound.name);\n    }\n    return null;\n  }\n\n  static getSubtype(item?: Item.Implementation): string {\n    if (!item?.type) return \"\";\n    let subtype = \"\";\n    switch (item.type) {\n      // @ts-expect-error no dnd5e-types\n      case \"weapon\": subtype = \"weapon.\" + item.system.type.value; break;\n      // @ts-expect-error no dnd5e-types\n      case \"equipment\": subtype = \"equipment.\" + item.system.type.value; break;\n      // @ts-expect-error no dnd5e-types\n      case \"consumable\": subtype = \"consumable.\" + item.system.type.value; break;\n      // @ts-expect-error no dnd5e-types\n      case \"spell\": subtype = \"spell.\" + item.system.school; break;\n      // @ts-expect-error no dnd5e-types\n      case \"tool\": subtype = \"tool.\" + item.system.type.value; break;\n      default: subtype = item.type + \"any\";\n    }\n    return subtype;\n  }\n\n  static async getWeaponBaseTypes() {\n    MidiSounds.weaponBaseTypes = {};\n    const packname = GameSystemConfig.sourcePacks.ITEMS;\n    if (packname) {\n      const packObject = game.packs?.get(packname);\n      // @ts-expect-error no dnd5e-types\n      await packObject?.getIndex({ fields: [\"system.armor.type\", \"system.toolType\", \"system.weaponType\", \"img\"] });\n\n      const weaponTypes = Object.keys(GameSystemConfig.weaponTypes);\n      for (const wt of weaponTypes) {\n        const baseTypes = await MidiSounds.getItemBaseTypes(\"weapon\", wt);\n        foundry.utils.mergeObject(MidiSounds.weaponBaseTypes, baseTypes)\n      }\n    }\n    debug(\"Weapon base types are \", MidiSounds.weaponBaseTypes);\n  }\n\n  static async getItemBaseTypes(type: string, weaponType: string) {\n    const baseIds = GameSystemConfig[`${type}Ids`];\n    if (baseIds === undefined) return {};\n\n    const typeProperty = `type.value`;\n    const baseType = weaponType;\n\n    const items: Record<string, string> = {};\n    for (const [name, id] of Object.entries(baseIds)) {\n      let baseItem = await globalThis.dnd5e.documents.Trait.getBaseItem(id);\n      if (baseType !== baseItem && foundry.utils.getProperty(baseItem.system, typeProperty)) continue;\n      items[name] = baseItem?.name;\n    }\n    const result =  Object.fromEntries(Object.entries(items).sort((lhs, rhs) => lhs[1].localeCompare(rhs[1])));\n    return result;\n  }\n\n  static getSpecFor(actorType: string, type: string, subtype: string, weaponSubType: string, selector: string) {\n    let spec: SoundSpec | undefined;\n    for (let aType of [actorType, \"any\"]) {\n      let specs = foundry.utils.getProperty(midiSoundSettings, aType) ?? {};\n      if (!spec) spec = foundry.utils.getProperty(specs, `weapon.${weaponSubType}.${selector}`) as SoundSpec;\n      if (!spec) spec = foundry.utils.getProperty(specs, `${subtype}.${selector}`) as SoundSpec;\n      if (!spec) spec = foundry.utils.getProperty(specs, `${type}.any.${selector}`) as SoundSpec;\n      if (!spec) spec = foundry.utils.getProperty(specs, `all.any.${selector}`) as SoundSpec;\n      if (spec) return spec;\n    }\n    return undefined;\n  }\n\n  static playSpec(spec: SoundSpec) {\n    if (spec.soundName !== \"random\")\n      return this.playSound(spec.playlistName, spec.soundName);\n    else\n      return this.playRandomSound(spec.playlistName)\n  }\n\n  static processHook(workflow: Workflow, selector: string) {\n    const subtype = this.getSubtype(workflow.item);\n    // @ts-expect-error no dnd5e-types\n    const baseType = workflow.item.system.type?.baseItem as string ?? \"\";\n    let spec = this.getSpecFor(workflow.item.parent?.type ?? \"all\", workflow.item.type ?? \"any\", subtype, baseType, selector);\n    if (!spec) return false;\n    return this.playSpec(spec);\n  }\n\n  static midiSoundsReadyHooks() {\n    Hooks.on(\"midi-qol.preItemRoll\", async (workflow: Workflow) => {\n      if (!configSettings.useCustomSounds || !workflow.item) return true;\n      await this.processHook(workflow, \"itemRoll\");\n      return true; // sounds can never block roll\n    });\n    Hooks.on(\"midi-qol.preAttackRoll\", async (workflow: Workflow) => {\n      if (!configSettings.useCustomSounds || !workflow.item) return true;\n      if (dice3dEnabled() \n        && workflow.activity.hasAttack && !await this.processHook(workflow, workflow.activity.actionType)) {\n        await this.processHook(workflow, \"attack\");\n      }\n      return true;\n    });\n\n    Hooks.on(\"midi-qol.AttackRollComplete\", async (workflow: Workflow) => {\n      if (!configSettings.useCustomSounds || !workflow.item) return true;\n      if (!dice3dEnabled() \n        && workflow.activity.hasAttack && !await this.processHook(workflow, workflow.activity.actionType)) {\n          await this.processHook(workflow, \"attack\");\n      }\n      if (workflow.isCritical) {\n        await this.processHook(workflow, \"critical\")\n      } else if (workflow.isFumble) {\n        await this.processHook(workflow, \"fumble\")\n      } else if (workflow.hitTargets.size === 0) {\n        await this.processHook(workflow, \"miss\")\n      } else {\n        await this.processHook(workflow, \"hit\")\n      }\n      return true;\n    });\n\n    Hooks.on(\"midi-qol.DamageRollComplete\", async (workflow: Workflow) => {\n      if (!configSettings.useCustomSounds || !workflow.item) return true;\n      const result = await this.processHook(workflow, workflow.defaultDamageType);\n      if (!result)\n        await this.processHook(workflow, \"damage\");\n      return true;\n    });\n  }\n\n  static async createDefaultPlayList(): Promise<Playlist.Implementation | undefined> {\n    if (!game.user?.isGM) {\n      ui.notifications?.warn(\"Only a GM can create the default playlist\");\n      return;\n    }\n    if (game.playlists?.getName(\"Midi Item Tracks\") !== undefined) {\n      ui.notifications?.error(\"Midi Item Tracks already exists - delete it before creating the default playlist\");\n      return;\n    }\n    const playlistData: Playlist.CreateData = {\n      name: \"Midi Item Tracks\",\n      description: \"Midi Qol sample custom sounds\",\n      mode: CONST.PLAYLIST_MODES.DISABLED,\n      sounds: [\n        {\n          path: \"modules/midi-qol/sounds/success-drums.ogg\",\n          repeat: false,\n          volume: 0.125,\n          name: \"success-drums\",\n          playing: false,\n          pausedTime: null,\n          sort: 0\n        },\n        {\n          name: \"dice\",\n          description: \"\",\n          path: \"sounds/dice.wav\",\n          playing: false,\n          pausedTime: null,\n          repeat: false,\n          volume: 0.5240467536394058,\n          sort: 0,\n        },\n        {\n          name: \"drink\",\n          description: \"\",\n          path: \"modules/midi-qol/sounds/drink.wav\",\n          playing: false,\n          pausedTime: null,\n          repeat: false,\n          volume: 0.5240467536394058,\n          sort: 0,\n        },\n        {\n          name: \"fail1\",\n          description: \"\",\n          path: \"modules/midi-qol/sounds/fail1.wav\",\n          playing: false,\n          pausedTime: null,\n          repeat: false,\n          volume: 0.5240467536394058,\n          sort: 0,\n        },\n        {\n          name: \"fail2\",\n          description: \"\",\n          path: \"modules/midi-qol/sounds/fail2.wav\",\n          playing: false,\n          pausedTime: null,\n          repeat: false,\n          volume: 0.5240467536394058,\n          sort: 0,\n        },\n        {\n          name: \"good-results\",\n          description: \"\",\n          path: \"modules/midi-qol/sounds/good-results.ogg\",\n          playing: false,\n          pausedTime: null,\n          repeat: false,\n          volume: 0.5240467536394058,\n          sort: 0,\n        },\n        {\n          name: \"spell\",\n          description: \"\",\n          path: \"modules/midi-qol/sounds/spell.wav\",\n          playing: false,\n          pausedTime: null,\n          repeat: false,\n          volume: 0.5240467536394058,\n          sort: 0,\n        },\n        {\n          name: \"success\",\n          description: \"\",\n          path: \"modules/midi-qol/sounds/success.wav\",\n          playing: false,\n          pausedTime: null,\n          repeat: false,\n          volume: 0.5240467536394058,\n          sort: 0,\n        },\n        {\n          name: \"swing\",\n          description: \"\",\n          path: \"modules/midi-qol/sounds/swing.wav\",\n          playing: false,\n          pausedTime: null,\n          repeat: false,\n          volume: 0.5240467536394058,\n          sort: 0,\n        },\n        {\n          name: \"use\",\n          description: \"\",\n          path: \"modules/midi-qol/sounds/use.wav\",\n          playing: false,\n          pausedTime: null,\n          repeat: false,\n          volume: 0.5240467536394058,\n          sort: 0,\n        },\n        {\n          name: \"fail3\",\n          description: \"\",\n          path: \"modules/midi-qol/sounds/fail3.ogg\",\n          playing: false,\n          pausedTime: null,\n          repeat: false,\n          volume: 0.5240467536394058,\n          sort: 0,\n        },\n        {\n          name: \"bowshot\",\n          description: \"\",\n          path: \"modules/midi-qol/sounds/bow-and-arrow.mp3\",\n          playing: false,\n          pausedTime: null,\n          repeat: false,\n          volume: 0.5240467536394058,\n          sort: 0,\n        }\n      ]\n    };\n    return Playlist.create(playlistData, {});\n  }\n\n  static async setupDetailedSounds() {\n    const soundSettings = {\n      version: \"0.9.48\",\n      any: {\n        all: {\n          any: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            attack: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            damage: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            critical: { playlistName: \"Midi Item Tracks\", soundName: \"success-drums\" },\n            fumble: { playlistName: \"Midi Item Tracks\", soundName: \"fail1\" },\n            mwak: { playlistName: \"Midi Item Tracks\", soundName: \"swing\" },\n            rwak: { playlistName: \"Midi Item Tracks\", soundName: \"bowshot\" },\n            rsak: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            msak: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n          }\n        },\n        consumable: {\n          ammo: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"none\" }\n          },\n          food: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"drink\" },\n          },\n          poison: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"drink\" },\n          },\n          potion: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"drink\" },\n          },\n          rod: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n          },\n          scroll: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n          },\n          trinket: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"use\" },\n          },\n          wand: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n          },\n        },\n        weapon: {\n          any: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n            mwak: { playlistName: \"Midi Item Tracks\", soundName: \"swing\" },\n            rwak: { playlistName: \"Midi Item Tracks\", soundName: \"bowshot\" },\n            rsak: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            msak: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n          }\n        },\n        spell: {\n          any: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n            mwak: { playlistName: \"Midi Item Tracks\", soundName: \"swing\" },\n            rwak: { playlistName: \"Midi Item Tracks\", soundName: \"bowshot\" },\n            rsak: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            msak: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n          }\n        },\n        feat: {\n          any: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"use\" }\n          },\n        },\n        tool: {\n          any: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"use\" }\n          }\n        }\n      }\n    }\n    if (game.user?.can(\"SETTINGS_MODIFY\")) await game.settings.set(\"midi-qol\", \"MidiSoundSettings\", soundSettings);\n  }\n  static async setupFullSounds() {\n    const soundSettings = {\n      version: \"0.9.48\",\n      any: {\n        all: {\n          any: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            attack: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            damage: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            critical: { playlistName: \"Midi Item Tracks\", soundName: \"success-drums\" },\n            fumble: { playlistName: \"Midi Item Tracks\", soundName: \"fail1\" },\n            hit: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n            miss: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n            abil: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            heal: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            msak: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            mwak: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            other: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            rsak: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            rwak: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            save: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            util: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            acid: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            bludgeoning: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            cold: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            fire: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            force: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            lightning: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            \"midi-none\": { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            necrotic: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            piercing: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            poison: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            psychic: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            radiant: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            slashing: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            thunder: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n          }\n        },\n        consumable: {\n          ammo: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"none\" }\n          },\n          food: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"drink\" },\n          },\n          poison: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"drink\" },\n          },\n          potion: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"drink\" },\n          },\n          rod: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n          },\n          scroll: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n          },\n          trinket: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"use\" },\n          },\n          wand: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n          },\n        },\n        weapon: {\n          any: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n            abil: { playlistName: \"Midi Item Tracks\", soundName: \"swing\" },\n            heal: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            msak: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            mwak: { playlistName: \"Midi Item Tracks\", soundName: \"swing\" },\n            other: { playlistName: \"Midi Item Tracks\", soundName: \"swing\" },\n            rsak: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            rwak: { playlistName: \"Midi Item Tracks\", soundName: \"bowshot\" },\n            save: { playlistName: \"Midi Item Tracks\", soundName: \"swing\" },\n            util: { playlistName: \"Midi Item Tracks\", soundName: \"swing\" },\n            damage: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            critical: { playlistName: \"Midi Item Tracks\", soundName: \"success-drums\" },\n            fumble: { playlistName: \"Midi Item Tracks\", soundName: \"fail1\" },\n            hit: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n            miss: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n          }\n        },\n        spell: {\n          any: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            abil: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            heal: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            msak: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            mwak: { playlistName: \"Midi Item Tracks\", soundName: \"swing\" },\n            other: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            rsak: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            rwak: { playlistName: \"Midi Item Tracks\", soundName: \"bowshot\" },\n            save: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            util: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            critical: { playlistName: \"Midi Item Tracks\", soundName: \"success-drums\" },\n            fumble: { playlistName: \"Midi Item Tracks\", soundName: \"fail1\" },\n            hit: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n            miss: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n          }\n        },\n        feat: {\n          any: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"use\" },\n            abil: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n            heal: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n            msak: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            mwak: { playlistName: \"Midi Item Tracks\", soundName: \"swing\" },\n            other: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n            rsak: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            rwak: { playlistName: \"Midi Item Tracks\", soundName: \"bowshot\" },\n            save: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            util: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n            critical: { playlistName: \"Midi Item Tracks\", soundName: \"success-drums\" },\n            fumble: { playlistName: \"Midi Item Tracks\", soundName: \"fail1\" },\n            hit: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n            miss: { playlistName: \"Midi Item Tracks\", soundName: \"none\" },\n          }\n        },\n        tool: {\n          any: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"use\" },\n            critical: { playlistName: \"Midi Item Tracks\", soundName: \"success-drums\" },\n            fumble: { playlistName: \"Midi Item Tracks\", soundName: \"fail1\" },\n          }\n        }\n      }\n    }\n    if (game.user?.can(\"SETTINGS_MODIFY\")) await game.settings.set(\"midi-qol\", \"MidiSoundSettings\", soundSettings);\n  }\n  static async setupBasicSounds() {\n    const soundSettings: any = {\n      version: \"0.9.48\",\n      any: {\n        all: {\n          any: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            attack: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            damage: { playlistName: \"Midi Item Tracks\", soundName: \"dice\" },\n            critical: { playlistName: \"Midi Item Tracks\", soundName: \"success-drums\" },\n            fumble: { playlistName: \"Midi Item Tracks\", soundName: \"fail1\" },\n            mwak: { playlistName: \"Midi Item Tracks\", soundName: \"swing\" },\n            rwak: { playlistName: \"Midi Item Tracks\", soundName: \"bowshot\" },\n            rsak: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n            msak: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n          }\n        },\n        consumable: {\n          ammo: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"none\" }\n          },\n          food: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"drink\" },\n          },\n          poison: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"drink\" },\n          },\n          potion: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"drink\" },\n          },\n          rod: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n          },\n          scroll: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n          },\n          trinket: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"use\" },\n          },\n          wand: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"spell\" },\n          },\n        },\n        tool: {\n          any: {\n            itemRoll: { playlistName: \"Midi Item Tracks\", soundName: \"use\" }\n          }\n        }\n      }\n    }\n    if (game.user?.can(\"SETTINGS_MODIFY\")) await game.settings.set(\"midi-qol\", \"MidiSoundSettings\", soundSettings);\n  }\n}","import { GameSystemConfig, i18n } from \"../../midi-qol.js\";\nimport { MidiSounds } from \"../midi-sounds.js\";\nimport { configSettings, midiSoundSettings } from \"../settings.js\";\nconst { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;\n\nexport class SoundConfigPanel extends HandlebarsApplicationMixin(ApplicationV2) {\n  static defaultPlaylist: string | undefined;\n  static defaultSound: string | undefined;\n\n  get title() {\n    return i18n(\"midi-qol.ConfigTitle\") ?? \"Sound Config\";\n  }\n\n  static override DEFAULT_OPTIONS = {\n    id: \"midi-qol-sound-config\",\n    window: {\n      title: \"midi-qol.SoundSettings.Name\",\n      resizable: true,\n      contentClasses: [\"standard-form\"]\n    },\n    position: {\n      height: \"auto\" as \"auto\",\n      width: 900\n    },\n    actions: {\n      add: this.#onAdd,\n      delete: this.#onDelete,\n      save: this.#onSave as any\n    },\n    form: {\n      submitOnChange: false,\n      closeOnSubmit: false,\n    },\n    tag: \"form\"\n  };\n\n  static override PARTS = {\n    tabs: { template: \"templates/generic/tab-navigation.hbs\" },\n    sounds: { \n      template: \"modules/midi-qol/templates/apps/SoundConfigPanel/sounds.hbs\",\n      scrollable: [\"\"]\n    },\n    quick: { template: \"modules/midi-qol/templates/apps/SoundConfigPanel/quick.hbs\" },\n    footer: { template: \"templates/generic/form-footer.hbs\" },\n  }\n\n  tabGroups = {\n    sheet: \"sounds\"\n  }\n\n  async _prepareContext(options) {\n    const context: any = await super._prepareContext(options);\n    const consumableSubtypesData = Object.keys(GameSystemConfig.consumableTypes).reduce((obj, key) => { obj[key] = GameSystemConfig.consumableTypes[key].label; return obj }, {});\n    const spellSchoolData = Object.keys(GameSystemConfig.spellSchools).reduce((obj, key) => { obj[key] = GameSystemConfig.spellSchools[key].label; return obj }, {});\n    const itemTypes: any = foundry.utils.duplicate(CONFIG.Item.typeLabels);\n    delete itemTypes.backpack;\n    delete itemTypes.class;\n    itemTypes.all = \"All\";\n    itemTypes.none = \"None\";\n    context.weaponSubtypes = foundry.utils.mergeObject({ any: \"Any\", none: \"None\" }, GameSystemConfig.weaponTypes);\n    context.weaponSubtypes = foundry.utils.mergeObject(context.weaponSubtypes, MidiSounds.weaponBaseTypes);\n    context.equipmentSubtypes = foundry.utils.mergeObject({ any: \"Any\" }, GameSystemConfig.equipmentTypes);\n    context.consumableSubTypes = foundry.utils.mergeObject({ any: \"Any\" }, consumableSubtypesData);\n    context.spellSubtypes = foundry.utils.mergeObject({ any: \"Any\" }, spellSchoolData);\n    context.toolSubtypes = foundry.utils.mergeObject({ any: \"Any\" }, GameSystemConfig.toolTypes);\n    context.defaultSubtypes = { any: \"Any\" };\n    context.characterTypes = { any: \"Any\", npc: \"NPC\", character: \"Character\", \"none\": \"None\" };\n    context.subTypes = {\n      \"weapon\": context.weaponSubtypes,\n      \"equipment\": context.equipmentSubtypes,\n      \"consumable\": context.consumableSubTypes,\n      \"spell\": context.spellSubtypes,\n      \"tool\": context.toolSubtypes,\n      \"feat\": { any: \"Any\" },\n      \"all\": context.defaultSubtypes,\n    }\n    context.itemTypes = Object.keys(itemTypes).reduce((list, key) => {\n      if (!context.subTypes[key]) context.subTypes[key] = { \"any\": \"Any\" }; // Add for subtypes we don't know about\n      list[key] = i18n(itemTypes[key]);\n      return list\n    }, {});\n    context.midiSoundSettings = foundry.utils.duplicate(midiSoundSettings);\n    context.quickSettingsOptions = { createPlaylist: \"Create Sample Playlist\", basic: \"Basic Settings\", detailed: \"Detailed Settings\", full: \"Full Settings\" };\n    context.playlists = this.playlists;\n    const requiredPlayLists = this.requiredPlaylists;\n    context.missingPlaylists = [];\n    for (let playlistName of Object.keys(requiredPlayLists)) {\n      if (!context.playlists[playlistName]) {\n        context.playlists[playlistName] = {\"none\": \"none\"};\n        context.missingPlaylists.push(playlistName);\n      }\n      for (let soundName of Array.from(requiredPlayLists[playlistName]) as Array<string>) {\n        if (!context.playlists[playlistName]?.[soundName]) {\n          if (!context.playlists[playlistName]) context.playlists[playlistName] = {};\n          context.playlists[playlistName][soundName] = `Missing:${soundName}`;\n        }\n      }\n    }\n    context.actionTypes = MidiSounds.ActionTypes();\n    context.tabs = this.#getTabs();\n    SoundConfigPanel.defaultPlaylist = Object.keys(context.playlists ?? {})[0];\n    SoundConfigPanel.defaultSound = Object.keys(context.playlists[SoundConfigPanel.defaultPlaylist] ?? {})[0] ?? \"\";\n    context.buttons = [{\n      icon: \"fas fa-floppy-disk\",\n      action: \"save\",\n      label: \"Save Changes\",\n      type: \"button\",\n    }];\n\n    return context;\n  }\n\n  get playlists() {\n   return game.playlists?.reduce((acc, pl: any) => {\n      acc[pl.name] = pl.sounds.reduce((list, sound) => {\n        list[sound.name] = sound.name; return list\n      }, {});\n      acc[pl.name].none = \"none\";\n      acc[pl.name].random = \"random\";\n      return acc;\n    }, {}) ?? {};\n  }\n\n  get requiredPlaylists() {\n    const requiredPlayLists: any = {};\n    for (let [cek, ce] of Object.entries(midiSoundSettings)) {\n      if (cek === \"version\") continue; // skip the version entry\n      for (let [tek, te] of Object.entries(ce as any)) {\n        for (let [stek, ste] of Object.entries(te as any)) {\n          for (let [eek, ee] of Object.entries(ste as any)) {\n            if (!requiredPlayLists[(ee as any).playlistName]) {\n              requiredPlayLists[(ee as any).playlistName] = new Set();\n            }\n            requiredPlayLists[(ee as any).playlistName].add((ee as any).soundName);\n          }\n        }\n      }\n    }\n    return requiredPlayLists;\n  }\n  \n  missingSounds(soundSettings): string[] {\n    const missingSounds: string[] = [];\n    let missingPlaylists: string[] = [];\n    const requiredPlayLists = this.requiredPlaylists;\n    const playlists = this.playlists;\n    for (let playlistName of Object.keys(requiredPlayLists)) {\n      if (!playlists[playlistName]) {\n        playlists[playlistName] = {};\n        missingPlaylists.push(playlistName);\n      }\n      for (let soundName of Array.from(requiredPlayLists[playlistName]) as Array<string>) {\n        if (!playlists[playlistName][soundName]) {\n          missingSounds.push(`${playlistName}: ${soundName}`);\n        }\n      }\n    }\n    return missingSounds;\n  }\n\n  canSave(soundSettings: any): boolean {\n    let missingPlaylists: string[] = [];\n    const requiredPlayLists = this.requiredPlaylists;\n    const playlists = this.playlists;\n    let canSave = true;\n    const missingSounds: string[] = [];\n    for (let playlistName of Object.keys(requiredPlayLists)) {\n      if (!playlists[playlistName]) {\n        playlists[playlistName] = {};\n        missingPlaylists.push(playlistName);\n        canSave = false;\n      }\n      for (let soundName of Array.from(requiredPlayLists[playlistName]) as Array<string>) {\n        if (!playlists[playlistName][soundName]) {\n          playlists[playlistName][soundName] = `${soundName} missing`;\n          missingSounds.push(`${playlistName}:${soundName}`);\n          // canSave = false;\n        }\n      }\n    }\n    return canSave;\n  }\n  #getTabs() {\n    const tabs = {\n      sounds: { id: \"sounds\", group: \"sheet\", label: \"midi-qol.SoundSettings.Name\", active: true },\n      quick: { id: \"quick\", group: \"sheet\", label: \"midi-qol.Config.Tabs.quick\" }\n    };\n    return tabs;\n  }\n\n  async _preparePartContext(partId, context) {\n    if (Object.keys(context.tabs).includes(partId)) {\n      context.tab = context.tabs[partId];\n    }\n    return context;\n  }\n\n  static async #onAdd(this: SoundConfigPanel, event, target) {\n    if (!SoundConfigPanel.defaultPlaylist) {\n      ui.notifications?.error(\"Midi Sound Configuration: You must define at least one playlist before adding a sound\");\n      event.preventDefault();\n      return;\n    }\n    if (!game.user?.can(\"SETTINGS_MODIFY\")) return;\n    event.preventDefault();\n\n    const formData: any = new foundry.applications.ux.FormDataExtended(target.form);\n    const fdo = formData.object;\n    for (let key of [\"chartype\", \"action\", \"category\", \"playlistName\", \"soundName\", \"subtype\"]) {\n      if (!fdo[key]) fdo[key] = [];\n      if (typeof fdo[key] === \"string\") fdo[key] = [fdo[key]];\n      if (key !== \"playlistName\") fdo[key].push(\"none\");\n      else fdo[key].push(SoundConfigPanel.defaultPlaylist ?? \"none\");\n    }\n\n    await SoundConfigPanel.#onSubmit.bind(this)(event, target, formData);\n    this.render({ force: true });\n  }\n\n  static #onDelete(this: SoundConfigPanel, event, target) {\n    event.preventDefault();\n    const rowTarget = target.closest(\"tr\");\n    rowTarget.remove();\n    // event.currentTarget.requestSubmit();\n  }\n\n  static async #onSave(this: SoundConfigPanel, event, target) {\n    const form = event.currentTarget;\n    const formData = new foundry.applications.ux.FormDataExtended(form);\n    SoundConfigPanel.#onSubmit.bind(this)(event, form, formData);\n  }\n\n  static async #onSubmit(this: SoundConfigPanel, event, form, formDataIn): Promise<void> {\n    if (!game.user?.can(\"SETTINGS_MODIFY\")) return;\n    if (!game.user?.can(\"SETTINGS_MODIFY\")) return;\n\n    const formData = formDataIn.object;\n    const settings: any = {};\n    if (formData.chartype) {\n      if (typeof formData.chartype === \"string\") {\n        for (let key of [\"chartype\", \"action\", \"category\", \"playlistName\", \"soundName\", \"subtype\"]) {\n          formData[key] = [formData[key]];\n        }\n      }\n      for (let i = 0; i < (formData.chartype?.length ?? 0); i++) {\n        const chartype = formData.chartype[i];\n        const category = formData.category[i];\n        const subtype = formData.subtype[i];\n        const action = formData.action[i];\n        const playlistName = formData.playlistName[i];\n        const soundName = formData.soundName[i];\n        if (!settings[chartype]) settings[chartype] = {};\n        if (!settings[chartype][category]) settings[chartype][category] = {};\n        if (!settings[chartype][category][subtype]) settings[chartype][category][subtype] = {};\n        settings[chartype][category][subtype][action] = { playlistName, soundName };\n      }\n    }\n    if (this.canSave(settings) === false) {\n      // ui.notifications?.warn(\"Midi Sound Configuration: Some referenced sounds are missing\")\n      ui.notifications?.warn(`Missing ${this.missingSounds(settings).join(\"<br>\")}`);\n    }\n    settings.version = \"12.4.40\";\n    await game.settings.set(\"midi-qol\", \"MidiSoundSettings\", settings);\n    this.render();\n  }\n\n  _onChangeForm(formConfig, event) {\n    super._onChangeForm(formConfig, event);\n    //@ts-expect-error\n    SoundConfigPanel.#onSubmit.bind(this)(event, this.element, new foundry.applications.ux.FormDataExtended(this.element))\n    .then(() => this.render({}));\n    // this.render();\n  }\n  async _onRender(context, options) {\n    super._onRender(context, options);\n    for (const elem of Array.from(this.element.querySelectorAll(\".import-quick-setting\"))) {\n      elem.addEventListener(\"click\", function (event) {\n        const key = event.currentTarget?.id;\n        switch (key) {\n          case \"createPlaylist\": MidiSounds.createDefaultPlayList().then(() => this.render(true)); break\n          case \"basic\": MidiSounds.setupBasicSounds().then(() => this.render(true)); break;\n          case \"detailed\": MidiSounds.setupDetailedSounds().then(() => this.render(true)); break;\n          case \"full\": MidiSounds.setupFullSounds().then(() => this.render(true)); break;\n        }\n      }.bind(this));\n    }\n  }\n\n  changeHandler(event) {\n    if (!this.element.querySelector(\"form\")) return;\n    this.render({ force: true });\n  }\n}","import { i18n } from \"../../midi-qol.js\"\nimport { configSettings, defaultTargetConfirmationSettings, targetConfirmation } from \"../settings.js\";\nconst { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;\n\nexport class TargetConfirmationConfig extends HandlebarsApplicationMixin(ApplicationV2) {\n  gridMappings = {\n      \"midi-qol-grid1\": {x: -1, y: -1},\n      \"midi-qol-grid2\": {x: 0, y: -1},\n      \"midi-qol-grid3\": {x: 1, y: -1},\n      \"midi-qol-grid4\": {x: -1, y: 0},\n      \"midi-qol-grid5\": {x: 0, y: 0},\n      \"midi-qol-grid6\": {x: 1, y: 0},\n      \"midi-qol-grid7\": {x: -1, y: 1},\n      \"midi-qol-grid8\": {x: 0, y: 1},\n      \"midi-qol-grid9\": {x: 1, y: 1}\n    };\n  selectedPosition: {x: number, y: number} = targetConfirmation.gridPosition ?? foundry.utils.duplicate(defaultTargetConfirmationSettings.gridPosition);\n\n  static override PARTS = {\n    main: { template: \"modules/midi-qol/templates/apps/TargetConfirmationConfig/targetConfirmationConfig.hbs\" }\n  };\n\n  static override DEFAULT_OPTIONS = {\n    id: \"midi-qol-target-confirmation-config\",\n    window: {\n      title: \"midi-qol.ConfigTitle\",\n      contentClasses: [\"standard-form\"]\n    },\n    position: {\n      width: 400,\n      height: \"auto\" as \"auto\"\n    },\n    form: {\n      closeOnSubmit: true\n    },\n    actions: {\n      submit: TargetConfirmationConfig.#onSubmit\n    }\n  };\n    // scrollY: [\".tab.workflow\"],\n    // tabs: [{ navSelector: \".tabs\", contentSelector: \".content\", initial: \"gm\" }]\n\n  async _updateObject(event, formData) {\n    formData = foundry.utils.expandObject(formData);\n    let newSettings = foundry.utils.mergeObject(targetConfirmation, formData, { overwrite: true, inplace: false })\n    // const newSettings = foundry.utils.mergeObject(configSettings, expand, {overwrite: true})\n    if (!newSettings.enabled) {\n      newSettings = foundry.utils.duplicate(defaultTargetConfirmationSettings);\n      newSettings.gridPosition = formData.gridPosition;\n    }\n    game.settings.set(\"midi-qol\", \"TargetConfirmation\", newSettings);\n    this.render({ force: true });\n  }\n\n  async _onRender(context, options) {\n    await super._onRender(context, options);\n    const selected = Object.keys(this.gridMappings).find(key => this.gridMappings[key].x === this.selectedPosition.x && this.gridMappings[key].y === this.selectedPosition.y);  \n    this.element.querySelector(`#${selected}`)?.classList.add(\"selected\");\n    const checkboxes = this.element.querySelectorAll('form .form-group input[type=\"checkbox\"]');\n    checkboxes.forEach((checkbox) => {\n      checkbox.addEventListener(\"click\", () => {\n        // @ts-expect-error\n        targetConfirmation[checkbox.name] = !targetConfirmation[checkbox.name];\n        this.render({force: true});\n      })\n    })\n    const gridItems = this.element.querySelectorAll(\".midi-qol .grid-item\");\n    gridItems.forEach((item) => {\n      item.addEventListener(\"click\", () => {\n        gridItems.forEach((other) => {\n          other.classList.remove(\"selected\");\n        });\n        item.classList.toggle(\"selected\");\n        this.selectedPosition = this.gridMappings[item.id];\n      });\n    });\n  }\n\n  get title() {\n    return i18n(\"Target Confirmation Config\") ?? \"Target Confirmation Config\";\n  }\n\n  async _prepareContext(options) {\n    const context: any = await super._prepareContext(options);\n    context.targetConfirmation = targetConfirmation;\n    return context;\n  }\n\n  async _preClose(options) {\n    targetConfirmation.gridPosition = this.selectedPosition;\n    await game.settings.set(\"midi-qol\", \"TargetConfirmation\", targetConfirmation);\n  }\n\n  static async #onSubmit(this: TargetConfirmationConfig, event, target) {\n    this.close();\n  }\n}","import { debug, warn, i18n, error, debugEnabled, i18nFormat, MODULE_ID } from \"../midi-qol.js\";\nimport { DDBGameLogWorkflow, Workflow } from \"./Workflow.js\";\nimport { nsaFlag, coloredBorders, configSettings, forceHideRoll } from \"./settings.js\";\nimport { playerFor, playerForActor, doOverTimeEffect, isInCombat, isAutoFastForward } from \"./utils.js\";\nimport { preferredActiveGM, socketlibSocket, unTimedExecuteAsGM } from \"./GMAction.js\";\nimport { TroubleShooter } from \"./apps/TroubleShooter.js\";\nexport const MAESTRO_MODULE_NAME = \"maestro\";\nexport const MODULE_LABEL = \"Maestro\";\nexport let colorChatMessageHandler = (message: ChatMessage.Implementation, html: HTMLElement, data: ChatMessage.MessageData) => {\n  if (coloredBorders === \"none\") return true;\n  let actorId = message.speaker.actor ?? \"\";\n  let userId = message.author?.id ?? \"\";\n  let actor = message.speakerActor;\n  let user = game.users?.get(userId) as User.Implementation | undefined;\n\n  if (actor) user = playerForActor(actor);\n  if (!user) return true;\n  html.style.borderColor = user.color.toString();\n  const sender = html.querySelector<HTMLElement>('.message-sender');\n  if (!sender) return;\n  if (coloredBorders === \"borderNamesBackground\") {\n    sender.style[\"text-shadow\"] = `1px 1px 1px #FFFFFF`;\n    sender.style.backgroundColor = user.color.toString();\n  } else if (coloredBorders === \"borderNamesText\") {\n    sender.style.color = user.color.toString();\n    sender.style[\"text-shadow\"] = `1px 1px 1px ${sender.style.color}`;\n  }\n  return true;\n}\n\n// TODO think about monks tb on preUpdateChatMessage?\n// Also should ideally be async.\nexport function checkOverTimeSaves(message: ChatMessage.Implementation, data: ChatMessage.CreateData, options: ChatMessage.Database.CreateOptions, user: string) {\n  if (!message.rolls?.length || ![\"skill\", \"save\", \"ability\"].includes(data.flags?.dnd5e?.roll?.type ?? \"\")) return true;\n  let actor = message.speakerActor;\n  if (message.speaker.token) {\n    actor = game.scenes?.get(message.speaker?.scene ?? \"\")?.tokens?.get(message.speaker.token)?.actor ?? actor;\n  }\n  if (!actor) return true;\n  const overtimeActorUuid = data.flags?.[MODULE_ID]?.overtimeActorUuid;\n  if (actor.uuid !== overtimeActorUuid) {\n    if (overtimeActorUuid) {\n      const overTimeActor = fromUuidSync(overtimeActorUuid) as Actor.Implementation | undefined;\n      ui.notifications?.warn(`Over time actor mismatch ${actor.name} should be ${overTimeActor?.name}`);\n    }\n    return true;\n  }\n  // Check that it is the actor's turn\n  let activeCombatants = game.combats?.combats.map(combat => combat.combatant?.token?.id)\n  const isTurn = activeCombatants?.includes(ChatMessage.getSpeaker({ actor })?.token);\n  const inCombat = isInCombat(actor);\n  if (!isTurn && inCombat) {\n    return true;\n  }\n\n  try {\n    let func = async (actor: Actor, rollFlags: any, roll: Roll) => {\n      for (let effect of actor.effects.filter(ef => ef.changes.some(change => change.key.startsWith(\"flags.midi-qol.OverTime\")))) {\n        await doOverTimeEffect(actor, effect, true, { saveToUse: roll, rollFlags: data.flags?.dnd5e?.roll, isActionSave: true })\n      }\n    };\n    func(actor, data.flags?.dnd5e?.roll, message.rolls[message.rolls.length - 1]);\n  } catch (err) {\n    const message = `checkOverTimeSaves error for ${actor?.name} ${actor.uuid}`;\n    console.warn(message, err);\n    TroubleShooter.recordError(err, message);\n  } finally {\n    return true;\n  }\n}\n\nexport let nsaMessageHandler = (message: ChatMessage.Implementation, data: ChatMessage.CreateData, options: ChatMessage.Database.PreCreateOptions, user: string) => {\n  if (!nsaFlag || !message.whisper || message.whisper.length === 0) return true;\n  let gmIds = ChatMessage.getWhisperRecipients(\"GM\").filter(u => u.active).map(u => u.id);\n  let currentIds = message.whisper as string[];\n  gmIds = gmIds.filter(id => !currentIds.includes(id));\n  if (debugEnabled > 1) debug(\"nsa handler active GMs \", gmIds, \" current ids \", currentIds, \"extra gmIds \", gmIds)\n  if (gmIds.length > 0) message.updateSource({ \"whisper\": currentIds.concat(gmIds) });\n  return true;\n}\n\nexport let hideRollRender = (msg: ChatMessage.Implementation, html: HTMLElement, data: ChatMessage.MessageData) => {\n  if (forceHideRoll && (msg.whisper.length > 0 || msg?.blind)) {\n    if (!game.user?.isGM && !msg.isAuthor && msg.whisper.indexOf(game.user?.id ?? \"\") === -1) {\n      if (debugEnabled > 0) warn(\"hideRollRender | hiding message\", msg.whisper);\n      html.style.display = \"none\";\n      // It seems that html.remove() can get called before the message is rendered to the dom?\n      setTimeout(() => { html.remove() }, 10);\n    }\n  }\n  return true;\n};\n\n\nexport let hideRollUpdate = (message: ChatMessage.Implementation, data: ChatMessage.UpdateData, options: ChatMessage.Database.UpdateOptions, id: string) => {\n  return true;\n  /*\n  if (forceHideRoll && (message.whisper.length > 0 || message.blind)) {\n    if (!game.user?.isGM && ((!message.isAuthor && (message.whisper.indexOf(game.user?.id ?? \"\") === -1) || message.blind))) {\n      let messageLi = document.querySelector<HTMLLIElement>(`.message[data-message-id=${data._id}]`);\n      if (debugEnabled > 0) warn(\"hideRollUpdate: Hiding \", message.whisper, messageLi)\n      if (messageLi) messageLi.style.display = \"none\";\n      if (ui.sidebar?.popouts.chat) {\n        let popoutLi = ui.sidebar.popouts.chat.element.querySelector<HTMLLIElement>(`.message[data-message-id=${data._id}]`)\n        if (popoutLi) popoutLi.style.display = \"none\";\n      }\n    }\n  }\n  return true;\n  */\n};\n\nexport let hideStuffHandler = (message: ChatMessage.Implementation, html: HTMLElement, data: ChatMessage.MessageData) => {\n  if (debugEnabled > 1) debug(\"hideStuffHandler message: \", message.id, message)\n  // Hide rolls which are blind and not the GM if force hide is true\n  if ((forceHideRoll && message.blind && !game.user?.isGM)\n    || (foundry.utils.getProperty(message, \"flags.midi-qol.gmHide\") && game.user?.isGM)) {\n    html.style.display = \"none\";\n    return;\n  }\n  // If force hide rolls and you are not the author/target of a whisper roll hide it.\n  if (forceHideRoll\n    && !(game.user?.isGM && nsaFlag)\n    && message.whisper.length > 0 && !message.whisper.includes(game.user?.id ?? \"\")\n    && !message.isAuthor) {\n    html.style.display = \"none\";\n    return;\n  }\n  // Blind roll dice replacement — affects non-midi messages too (monks-tokenbar etc.)\n  if (!game.user?.isGM && message.blind) {\n    html.querySelectorAll(\".midi-attack-roll .dice-roll\").forEach(el => {\n      el.outerHTML = `<span>${i18n(\"midi-qol.DiceRolled\")}</span>`;\n    });\n    if (!(message.flags && message.flags[\"monks-tokenbar\"]))\n      html.querySelectorAll(\".dice-roll\").forEach(el => {\n        el.outerHTML = `<span>${i18n(\"midi-qol.DiceRolled\")}</span>`;\n      });\n  }\n  return true;\n}\n\nexport function ddbglPendingFired(data: { sceneId: string, tokenId: string, actorId: string, itemId: string, actionType: string }) {\n  let { sceneId, tokenId, actorId, itemId, actionType } = data;\n  if (!itemId || ![\"attack\", \"damage\", \"heal\"].includes(actionType)) {\n    error(\"DDB Game Log - no item/action for pending roll\"); return\n  }\n  // const tokenUuid = `Scene.${sceneId??0}.Token.${tokenId??0}`;\n  const token = fromUuidSync(`Scene.${sceneId ?? 0}.Token.${tokenId ?? 0}`)?.object as Token.Implementation | undefined;\n  const actor = token?.actor ?? game.actors?.get(actorId ?? \"\");\n  if (!actor) {\n    warn(\" ddb-game-log hook could not find actor\");\n    return;\n  }\n  // find the player who controls the character.\n  let player: User.Implementation | null | undefined;\n  if (token) {\n    player = playerFor(token);\n  } else {\n    player = game.users?.players.find(p => p.active && actor?.testUserPermission(p, \"OWNER\"));\n  }\n  if (!player || !player.active) player = ChatMessage.getWhisperRecipients(\"GM\").find(u => u.active);\n  if (player?.id !== game.user?.id) return;\n\n  let item = actor.items.get(itemId);\n  if (!item) {\n    warn(` ddb-game-log - hook could not find item ${itemId} on actor ${actor.name}`);\n    return;\n  }\n\n  let workflow: DDBGameLogWorkflow | undefined = DDBGameLogWorkflow.get(item.uuid);\n  if (actionType === \"attack\") {\n    if (DDBGameLogWorkflow.get(item.uuid)) Workflow.removeWorkflow(item.uuid);\n    workflow = undefined;\n  }\n\n  // @ts-expect-error no dnd5e-types\n  if ([\"damage\", \"heal\"].includes(actionType) && item.hasAttack && !workflow) {\n    warn(` ddb-game-log damage roll without workflow being started ${actor.name} using ${item.name}`);\n    return;\n  }\n\n  if (!workflow) {\n    const speaker = {\n      scene: sceneId,\n      token: tokenId,\n      actor: actorId,\n      alias: token?.name ?? actor.name\n    }\n    // @ts-expect-error TODO: Halp. Item? Activity?\n    workflow = new DDBGameLogWorkflow(actor, item, speaker, Array.from(game.user?.targets ?? new Set()), {});\n    // @ts-expect-error no dnd5e-types\n    item.displayCard({ showFullCard: false, workflow, createMessage: false, defaultCard: true });\n    // showItemCard.bind(item)(false, workflow, false, true);\n    return;\n  }\n}\n\nexport function ddbglPendingHook(data) { // need to propagate this to all players.\n  if (!configSettings.enableDDBGL) return;\n  socketlibSocket.executeForEveryone(\"ddbglPendingFired\", data);\n}\n\nexport function processCreateDDBGLMessages(message: ChatMessage.Implementation, options: ChatMessage.Database.CreateOptions, user: string) {\n  if (!configSettings.enableDDBGL) return;\n\n  const flags = message.flags;\n  if (!flags || !flags[\"ddb-game-log\"] || !game.user) return;\n  const ddbGLFlags: any = flags[\"ddb-game-log\"];\n  if (!ddbGLFlags || ddbGLFlags.pending) return;\n  // let sceneId, tokenId, actorId, itemId;\n  if (!([\"attack\", \"damage\", \"heal\"].includes(flags.dnd5e?.roll?.type ?? \"\"))) return;\n  const itemId = flags.dnd5e?.roll?.itemId;\n  if (!itemId) { error(\"Could not find item for fulfilled roll\"); return }\n  const token = fromUuidSync(`Scene.${message.speaker.scene}.Token.${message.speaker.token}`)?.object as Token.Implementation | null;\n  const actor = token?.actor ?? game.actors?.get(message.speaker.actor ?? \"\");\n  if (!actor) {\n    error(\"ddb-game-log could not find actor for roll\");\n    return;\n  }\n  // find the player who controls the character.\n  let player: User.Implementation | null | undefined;\n  if (token) {\n    player = playerFor(token);\n  } else {\n    player = game.users?.players.find(p => p.active && actor?.testUserPermission(p, \"OWNER\"));\n  }\n  if (!player || !player.active) player = preferredActiveGM();\n  if (player?.id !== game.user?.id) return;\n\n  const item = actor.items.get(itemId);\n  if (!item) {\n    error(`ddb-game-log roll could not find item ${flags?.dnd5e?.roll?.itemId} on actor ${actor.name}`);\n    return;\n  }\n\n  let workflow: DDBGameLogWorkflow | undefined = DDBGameLogWorkflow.get(item.uuid);\n  //@ts-expect-error no dnd5e-types\n  if (!workflow && flags.dnd5e.roll.type === \"damage\" && item.hasAttack && [\"rwak\", \"mwak\"].includes(item.actionType)) {\n    warn(`ddb-game-log roll damage roll without workflow being started ${actor.name} using ${item.name}`);\n    return;\n  }\n  if (!workflow) {\n    error(`ddb-game-log roll no workflow for ${item.name}`)\n    return;\n  }\n  if (configSettings.undoWorkflow && workflow.undoData && message) {\n    if (!workflow.undoData.chatCardUuids) workflow.undoData.chatCardUuids = [];\n    workflow.undoData.chatCardUuids = workflow.undoData.chatCardUuids.concat([message.uuid]);\n    unTimedExecuteAsGM(\"updateUndoChatCardUuids\", workflow.undoData);\n  }\n  if (flags?.dnd5e?.roll?.type === \"attack\") {\n    let rolls = message.rolls;\n    if (!(rolls instanceof Array)) rolls = [rolls];\n    // workflow.needItemCard = false; TODO revisit this\n    workflow.attackRoll = rolls[0] ?? undefined;\n    workflow.attackTotal = rolls[0]?.total ?? 0;\n    // @ts-expect-error no dnd5e-types\n    workflow.needsDamage = workflow.item.hasDamage;\n    workflow.attackRollHTML = message.content;\n    workflow.attackRolled = true;\n    if (workflow.currentAction === workflow.WorkflowState_WaitForAttackRoll) {\n      if (workflow.suspended) workflow.unSuspend({ attackRoll: workflow.attackRoll })\n      // TODO NW workflow.performState(workflow.WorkflowState_WaitForAttackRoll,{attackRoll: workflow.attackRoll});\n    }\n  }\n\n  if ([\"damage\", \"heal\"].includes(flags.dnd5e?.roll?.type ?? \"\")) {\n    let rolls = message.rolls;\n    if (!rolls) return;\n    // workflow.needItemCard = false; TODO revisit this\n    workflow.attackRolled = true;\n    if (!(rolls instanceof Array)) rolls = [rolls];\n    if (workflow.needsDamage && rolls?.length) {\n      workflow.needsDamage = false;\n      workflow.setDamageRolls(rolls);\n    } else if (workflow.needsOtherDamage && rolls?.length) {\n      workflow.setOtherDamageRolls(rolls);\n      workflow.needsOtherDamage = false;\n    }\n    if (workflow.currentAction === workflow.WorkflowState_WaitForDamageRoll) {\n      if (workflow.suspended) workflow.unSuspend({ damageRoll: workflow.damageRoll })\n      // TODO NW workflow.performState(workflow.WorkflowState_WaitForDamageRoll);\n    }\n  }\n}\n\n\n","export class OnUseMacros {\n  items: OnUseMacro[];\n\n  constructor(onUseMacros: any = null) {\n    if (typeof onUseMacros === \"string\") {\n      this.items = onUseMacros?.split(',')?.filter((value: string) => value.trim().length > 0)?.map((macro: string) => new OnUseMacro(macro));\n    } else {\n      this.items = [];\n    }\n  }\n\n  static parseParts(parts) {\n    const macros = new OnUseMacros();\n    parts.items?.forEach(x => macros.items.push(OnUseMacro.parsePart(x)));\n    return macros;\n  }\n\n  public getMacros(currentOption: string | undefined): string {\n    return this.items.filter(x => x.macroName?.length > 0 && (x.option.toLocaleLowerCase() === (currentOption ?? \"\").toLocaleLowerCase() || x.option === \"all\")).map(x => x.macroName).toString();\n  }\n\n  public toString() {\n    return this.items.map(m => m.toString()).join(',');\n  }\n}\n\nexport class OnUseMacro {\n  macroName: string;\n  option: string;\n  macro: string | undefined = undefined;\n  macroPassOptions: Record<string, string> = {};\n\n  constructor(macro: string | undefined = undefined) {\n    if (macro === undefined) {\n      this.macroName = \"ItemMacro\";\n    } else {\n      const pattern = new RegExp('(?:\\\\[(?<option>.*?)\\\\])?(?<macroName>.*)', '');\n      let data = macro.match(pattern)?.groups;\n      this.macroName = data![\"macroName\"].trim();\n      this.option = data![\"option\"];\n    }\n    this.option ??= \"postActiveEffects\";\n  }\n\n  static parsePart(parts: { macroName: string, option: string | undefined }) {\n    const m = new OnUseMacro();\n    m.macroName = parts.macroName;\n    m.option = parts.option ?? m.option;\n    return m;\n  }\n\n  public toString() {\n    return `[${this.option}]${this.macroName}`;\n  }\n}\nexport class OnUseMacroOptions {\n  static options: Array<{ option: string, label: string }>;\n\n  static setOptions(options: any) {\n    this.options = [];\n    for (let option of Object.keys(options)) {\n      this.options.push({ option, label: options[option] });\n    }\n  }\n\n  static get getOptions(): Array<{ option: string, label: string }> {\n    return this.options;\n  }\n}\n\nexport function getCurrentSourceMacros(document: Actor.Implementation): OnUseMacros {\n  const macroField = new OnUseMacros(foundry.utils.getProperty(document, \"_source.flags.midi-qol.onUseMacroName\") ?? null)\n  // const macroField = foundry.utils.getProperty(object, \"_source.flags.midi-qol.onUseMacroParts\");\n  return macroField;\n}","/**\n * Tracks roll modifiers: advantage/disadvantage, auto-fail/success, min/max with attribution.\n */\n\nimport { RollDialogConfig, RollProcessConfig } from \"../../globals.js\";\nimport { GameSystemConfig, i18n, i18nFormat } from \"../../midi-qol.js\";\nimport { createConditionData, evalAllConditions, evalAllConditionsAsync, tokenForActor, MidiOptions } from \"../utils.js\";\n\n/** Attribution types for roll modifier tracking */\nexport type AdvantageAttributionType = 'ADV' | 'DIS' | 'NOADV' | 'NODIS' | 'CRIT' | 'NOCRIT' | 'FUMBLE' | 'NOFUMBLE' | 'SUCCESS' | 'FAIL' | 'MIN' | 'MAX';\n\n/** Attribution map: type -> source -> displayName */\nexport type AdvantageAttributionMap = Partial<Record<AdvantageAttributionType, Record<string, string>>>;\n\n/** Callback type for adding attributions */\ntype AttributionCallback = (type: AdvantageAttributionType, source: string, displayName: string) => void;\n\nexport interface RollModifierFlags {\n  failFlags: string[];\n  successFlags: string[];\n  maxFlags: string[];\n  minFlags: string[];\n}\n\nexport interface CriticalModifierFlags {\n  criticalFlags: string[];\n  noCriticalFlags: string[];\n  fumbleFlags: string[];\n  noFumbleFlags: string[];\n}\n\nexport interface RollModifierResult {\n  autoFail: boolean;\n  autoSuccess: boolean;\n  max: number | undefined;\n  min: number | undefined;\n}\n\n// Interface for advantage/disadvantage flag configuration\nexport interface AdvantageFlags {\n  advantageFlags: string[];\n  disadvantageFlags: string[];\n  systemRollModeFields: string[];\n  // Actor noAdvantage/noDisadvantage flags (prevent advantage/disadvantage on actor's own rolls)\n  noAdvantageFlags?: string[];\n  noDisadvantageFlags?: string[];\n  // Source actor grants flags (checked on workflow.actor, e.g., caster)\n  sourceAdvantageFlags?: string[];\n  sourceDisadvantageFlags?: string[];\n  sourceNoAdvantageFlags?: string[];\n  sourceNoDisadvantageFlags?: string[];\n}\n\n// Helper to get flag path with midi-qol prefix\nfunction midiFlag(flag: string): string {\n  return `flags.midi-qol.${flag}`;\n}\n\n\n// Helper to resolve a short key (e.g., \"mwak\", \"str\", \"acr\") to a human-readable label\nfunction resolveKeyLabel(key: string): string {\n  if (key === \"all\") return \"All\";\n  const abilityLabel = GameSystemConfig.abilities?.[key]?.label;\n  if (abilityLabel) return abilityLabel;\n  const skillLabel = GameSystemConfig.skills?.[key]?.label;\n  if (skillLabel) return skillLabel;\n  const actionLabel = GameSystemConfig.itemActionTypes?.[key];\n  if (actionLabel) return actionLabel;\n  const dmgLabel = GameSystemConfig.damageTypes?.[key]?.label;\n  if (dmgLabel) return dmgLabel;\n  const toolLabel = globalThis.dnd5e?.documents?.Trait?.keyLabel?.(`tool:${key}`);\n  if (toolLabel) return toolLabel;\n  return key;\n}\n\n// Helper to get a human-readable display name for a midi-qol flag path\nexport function getFlagDisplayName(flag: string): string {\n  // Tier 1: Check DAE localizationMap (covers ~95% of template-generated flags)\n  const lmEntry = globalThis.DAE?.localizationMap?.[midiFlag(flag)];\n  if (lmEntry?.name) return lmEntry.name;\n\n  if (!game.i18n) return flag;\n\n  // Tier 2: Check for exact flagTemplate i18n key\n  const exactKey = `midi-qol.flagTemplate.${flag}.name`;\n  const exactResult = game.i18n.localize(exactKey);\n  if (exactResult !== exactKey) {\n    // If the template contains {label} but we have no label segment, strip the placeholder\n    if (exactResult.includes(\"{label}\")) return exactResult.replace(/\\s*\\(\\{label\\}\\)/, \"\");\n    return exactResult;\n  }\n\n  // Tier 3: Split on last \".\" and try prefix template + resolved label\n  const lastDot = flag.lastIndexOf(\".\");\n  if (lastDot > 0) {\n    const prefix = flag.substring(0, lastDot);\n    const lastElement = flag.substring(lastDot + 1);\n    const prefixKey = `midi-qol.flagTemplate.${prefix}.name`;\n    const prefixResult = game.i18n.localize(prefixKey);\n    if (prefixResult !== prefixKey) {\n      const label = resolveKeyLabel(lastElement);\n      return i18nFormat(prefixKey, { label });\n    }\n  }\n\n  // Tier 4: Fallback to raw flag\n  return flag;\n}\n\n/**\n * Build attribution display name, prefixing with active effect name(s) if available.\n * Format: \"Effect Name - flag display\" when an effect set the flag, otherwise just \"flag display\".\n */\nfunction getAttributionDisplayName(actor: Actor.Implementation, flag: string, flagDisplayName: string): string {\n  const evalKey = `flags.midi-qol.${flag}`.replace(\"flags.midi-qol.\", \"flags.midi.evaluated.\");\n  const result = foundry.utils.getProperty(actor, `${evalKey}.effects`);\n  const effectNames: string[] = Array.isArray(result) ? result : [];\n  // Filter out the generic \"flag\" entry which means it was set directly, not by an effect\n  const realEffects = effectNames.filter(name => name !== \"flag\");\n  if (realEffects.length > 0) {\n    const uniqueNames = [...new Set(realEffects)];\n    return `${uniqueNames.join(\", \")} - ${flagDisplayName}`;\n  }\n  return flagDisplayName;\n}\n\n// ─────────────────────────────────────────────────────────────────\n// AdvantageDisadvantageTracker Class\n// ─────────────────────────────────────────────────────────────────\n\ntype AdvantageType = 'ADV' | 'DIS';\ntype SuppressionType = 'NOADV' | 'NODIS';\n\n/**\n * Tracks a single advantage or disadvantage state with attribution.\n */\nexport class AdvantageDisadvantageTracker {\n  #active = false;\n  #suppressed = false;\n  #override = false;\n\n  readonly #type: AdvantageType;\n  readonly #suppressionType: SuppressionType;\n  readonly #addAttribution: AttributionCallback;\n\n  constructor(type: AdvantageType, addAttribution: AttributionCallback) {\n    this.#type = type;\n    this.#suppressionType = type === 'ADV' ? 'NOADV' : 'NODIS';\n    this.#addAttribution = addAttribution;\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // State Inspection\n  // ─────────────────────────────────────────────────────────────────\n\n  /** Get complete state snapshot */\n  get get(): Readonly<{ active: boolean; suppressed: boolean; override: boolean }> {\n    return { active: this.#active, suppressed: this.#suppressed, override: this.#override };\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Query Methods\n  // ─────────────────────────────────────────────────────────────────\n\n  /** Whether at least one source has been added */\n  get isAdded(): boolean { return this.#active; }\n\n  /** Whether suppressed by a blocking flag */\n  get isSuppressed(): boolean { return this.#suppressed; }\n\n  /** Whether override is set (bypasses suppression) */\n  get hasOverride(): boolean { return this.#override; }\n\n  /**\n   * Computed final state.\n   * Returns true if active and not suppressed (or if override is set).\n   * Returns undefined if not active or if suppressed.\n   */\n  get isActive(): true | undefined {\n    if (this.#override) return this.#active || undefined;\n    if (this.#suppressed) return undefined;\n    return this.#active || undefined;\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Mutation Methods\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Add a source of advantage/disadvantage.\n   * @param source - Optional source identifier for attribution\n   * @param displayName - Optional human-readable display name\n   */\n  add(source?: string, displayName?: string): void {\n    this.#active = true;\n    if (source !== undefined) {\n      this.#addAttribution(this.#type, source, displayName ?? source);\n    }\n  }\n\n  /**\n   * Clear active state.\n   * Preserves suppression state.\n   */\n  clear(): void {\n    this.#active = false;\n  }\n\n  /**\n   * Suppress this modifier.\n   * When suppressed, isActive returns undefined.\n   * @param source - Optional source identifier for attribution\n   * @param displayName - Optional human-readable display name\n   */\n  suppress(source?: string, displayName?: string): void {\n    this.#suppressed = true;\n    if (source !== undefined) {\n      this.#addAttribution(this.#suppressionType, source, displayName ?? source);\n    }\n  }\n\n  /**\n   * Force this modifier, bypassing suppression.\n   * @param source - Optional source identifier for attribution\n   * @param displayName - Optional human-readable display name\n   */\n  setOverride(source?: string, displayName?: string): void {\n    this.#active = true;\n    this.#override = true;\n    if (source !== undefined) {\n      this.#addAttribution(this.#type, source, displayName ?? source);\n    }\n  }\n\n  /**\n   * Clear override state.\n   */\n  clearOverride(): void {\n    this.#override = false;\n  }\n\n  /**\n   * Reset all state to initial values.\n   */\n  reset(): void {\n    this.#active = false;\n    this.#suppressed = false;\n    this.#override = false;\n  }\n\n  /** Restore state from serialized data */\n  restore(state: { active: boolean; suppressed: boolean; override: boolean }): void {\n    this.#active = state.active;\n    this.#suppressed = state.suppressed;\n    this.#override = state.override;\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────\n// CriticalFumbleTracker Class\n// ─────────────────────────────────────────────────────────────────\n\ntype CritType = 'CRIT' | 'FUMBLE';\ntype NoCritType = 'NOCRIT' | 'NOFUMBLE';\n\n/**\n * Tracks critical or fumble state with attribution.\n */\nexport class CriticalFumbleTracker {\n  #natural = false;\n  #forced = false;\n  #suppressed = false;\n  #override: boolean | undefined = undefined;\n\n  readonly #type: CritType;\n  readonly #noType: NoCritType;\n  readonly #addAttribution: AttributionCallback;\n\n  constructor(type: CritType, addAttribution: AttributionCallback) {\n    this.#type = type;\n    this.#noType = type === 'CRIT' ? 'NOCRIT' : 'NOFUMBLE';\n    this.#addAttribution = addAttribution;\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // State Inspection\n  // ─────────────────────────────────────────────────────────────────\n\n  /** Get complete state snapshot */\n  get get(): Readonly<{ natural: boolean; forced: boolean; suppressed: boolean; override: boolean | undefined }> {\n    return {\n      natural: this.#natural,\n      forced: this.#forced,\n      suppressed: this.#suppressed,\n      override: this.#override\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Query Methods\n  // ─────────────────────────────────────────────────────────────────\n\n  /** Whether natural crit/fumble occurred from dice */\n  get isNatural(): boolean { return this.#natural; }\n\n  /** Whether forced by a flag */\n  get isForced(): boolean { return this.#forced; }\n\n  /** Whether suppressed by a blocking flag */\n  get isSuppressed(): boolean { return this.#suppressed; }\n\n  /** Whether override is set */\n  get hasOverride(): boolean { return this.#override !== undefined; }\n\n  /** Get override value (undefined if not set) */\n  get overrideValue(): boolean | undefined { return this.#override; }\n\n  /**\n   * Computed final state.\n   * Priority: override > suppressed > (natural || forced)\n   */\n  get isActive(): boolean {\n    if (this.#override !== undefined) return this.#override;\n    if (this.#suppressed) return false;\n    return this.#natural || this.#forced;\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Mutation Methods\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Set natural crit/fumble from dice roll.\n   * @param source - Source identifier for attribution\n   * @param displayName - Human-readable display name\n   */\n  setNatural(source: string, displayName?: string): void {\n    this.#natural = true;\n    this.#addAttribution(this.#type, source, displayName ?? source);\n  }\n\n  /**\n   * Force crit/fumble from a flag.\n   * @param source - Source identifier for attribution\n   * @param displayName - Human-readable display name\n   */\n  force(source: string, displayName?: string): void {\n    this.#forced = true;\n    this.#addAttribution(this.#type, source, displayName ?? source);\n  }\n\n  /**\n   * Suppress (prevent) crit/fumble.\n   * @param source - Source identifier for attribution\n   * @param displayName - Human-readable display name\n   */\n  suppress(source: string, displayName?: string): void {\n    this.#suppressed = true;\n    this.#addAttribution(this.#noType, source, displayName ?? source);\n  }\n\n  /**\n   * Override crit/fumble state absolutely.\n   * @param value - true to force, false to prevent\n   * @param source - Source identifier for attribution\n   * @param displayName - Human-readable display name\n   */\n  setOverride(value: boolean, source: string, displayName?: string): void {\n    this.#override = value;\n    this.#addAttribution(value ? this.#type : this.#noType, source, displayName ?? source);\n  }\n\n  /**\n   * Reset all state to initial values.\n   */\n  reset(): void {\n    this.#natural = false;\n    this.#forced = false;\n    this.#suppressed = false;\n    this.#override = undefined;\n  }\n\n  /** Restore state from serialized data */\n  restore(state: { natural: boolean; forced: boolean; suppressed: boolean; override: boolean | undefined }): void {\n    this.#natural = state.natural;\n    this.#forced = state.forced;\n    this.#suppressed = state.suppressed;\n    this.#override = state.override;\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────\n// RollValueTracker Class\n// ─────────────────────────────────────────────────────────────────\n\n/**\n * Tracks roll value modifiers: auto-fail, auto-success, min, max.\n */\nexport class RollValueTracker {\n  #autoFail = false;\n  #autoSuccess = false;\n  #min = -Infinity;\n  #max = Infinity;\n\n  readonly #addAttribution: AttributionCallback;\n\n  constructor(addAttribution: AttributionCallback) {\n    this.#addAttribution = addAttribution;\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // State Inspection\n  // ─────────────────────────────────────────────────────────────────\n\n  /** Get complete state snapshot */\n  get get(): Readonly<{ willFail: boolean; willSucceed: boolean; minValue: number; maxValue: number }> {\n    return {\n      willFail: this.#autoFail,\n      willSucceed: this.#autoSuccess,\n      minValue: this.#min,\n      maxValue: this.#max\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Query Methods\n  // ─────────────────────────────────────────────────────────────────\n\n  get willFail(): boolean { return this.#autoFail; }\n  get willSucceed(): boolean { return this.#autoSuccess; }\n  get minValue(): number { return this.#min; }\n  get maxValue(): number { return this.#max; }\n  get hasMin(): boolean { return this.#min > -Infinity; }\n  get hasMax(): boolean { return this.#max < Infinity; }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Mutation Methods\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Set auto-fail for this roll.\n   * @param source - Source identifier for attribution\n   * @param displayName - Human-readable display name\n   */\n  fail(source: string, displayName?: string): void {\n    this.#autoFail = true;\n    this.#addAttribution('FAIL', source, displayName ?? source);\n  }\n\n  /**\n   * Set auto-success for this roll.\n   * @param source - Source identifier for attribution\n   * @param displayName - Human-readable display name\n   */\n  succeed(source: string, displayName?: string): void {\n    this.#autoSuccess = true;\n    this.#addAttribution('SUCCESS', source, displayName ?? source);\n  }\n\n  /**\n   * Set minimum roll value (only if higher than current).\n   * @param value - Minimum roll value\n   * @param source - Source identifier for attribution\n   * @param displayName - Human-readable display name\n   */\n  min(value: number, source: string, displayName?: string): void {\n    if (value > this.#min) {\n      this.#min = value;\n      this.#addAttribution('MIN', source, displayName ?? `${source} (${value})`);\n    }\n  }\n\n  /**\n   * Force set minimum roll value, ignoring current value.\n   * @param value - Minimum roll value\n   * @param source - Source identifier for attribution\n   * @param displayName - Human-readable display name\n   */\n  forceMin(value: number, source: string, displayName?: string): void {\n    this.#min = value;\n    this.#addAttribution('MIN', source, displayName ?? `${source} (${value})`);\n  }\n\n  /**\n   * Set maximum roll value (only if lower than current).\n   * @param value - Maximum roll value\n   * @param source - Source identifier for attribution\n   * @param displayName - Human-readable display name\n   */\n  max(value: number, source: string, displayName?: string): void {\n    if (value < this.#max) {\n      this.#max = value;\n      this.#addAttribution('MAX', source, displayName ?? `${source} (${value})`);\n    }\n  }\n\n  /**\n   * Force set maximum roll value, ignoring current value.\n   * @param value - Maximum roll value\n   * @param source - Source identifier for attribution\n   * @param displayName - Human-readable display name\n   */\n  forceMax(value: number, source: string, displayName?: string): void {\n    this.#max = value;\n    this.#addAttribution('MAX', source, displayName ?? `${source} (${value})`);\n  }\n\n  /**\n   * Reset all state to initial values.\n   */\n  reset(): void {\n    this.#autoFail = false;\n    this.#autoSuccess = false;\n    this.#min = -Infinity;\n    this.#max = Infinity;\n  }\n\n  /** Restore state from serialized data */\n  restore(state: { willFail: boolean; willSucceed: boolean; minValue: number; maxValue: number }): void {\n    this.#autoFail = state.willFail;\n    this.#autoSuccess = state.willSucceed;\n    this.#min = state.minValue;\n    this.#max = state.maxValue;\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────\n// RollModifierTracker Class\n// ─────────────────────────────────────────────────────────────────\n\nexport class RollModifierTracker {\n\n  // ─────────────────────────────────────────────────────────────────\n  // Sub-trackers\n  // ─────────────────────────────────────────────────────────────────\n\n  readonly advantage: AdvantageDisadvantageTracker;\n  readonly disadvantage: AdvantageDisadvantageTracker;\n  readonly critical: CriticalFumbleTracker;\n  readonly fumble: CriticalFumbleTracker;\n  readonly modifiers: RollValueTracker;\n\n  // ─────────────────────────────────────────────────────────────────\n  // Attribution\n  // ─────────────────────────────────────────────────────────────────\n\n  #attribution: AdvantageAttributionMap = {};\n  /** Legacy Set format: \"${type}:${source}\" */\n  #legacyAttribution: Set<string> = new Set();\n  /** Legacy Set format for adv-reminder: \"${type}:${source}\" */\n  #advReminderAttribution: Set<string> = new Set();\n\n  constructor() {\n\n    // Create sub-trackers with bound attribution method\n    const addAttr = this.addAttribution.bind(this);\n    this.advantage = new AdvantageDisadvantageTracker('ADV', addAttr);\n    this.disadvantage = new AdvantageDisadvantageTracker('DIS', addAttr);\n    this.critical = new CriticalFumbleTracker('CRIT', addAttr);\n    this.fumble = new CriticalFumbleTracker('FUMBLE', addAttr);\n    this.modifiers = new RollValueTracker(addAttr);\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Attribution Methods\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Add an attribution entry.\n   * @param type - Attribution type (ADV, DIS, NOADV, NODIS, CRIT, etc.)\n   * @param source - Source identifier (e.g., 'flanking', 'invisible')\n   * @param displayName - Human-readable display name\n   */\n  addAttribution(type: AdvantageAttributionType, source: string, displayName: string): void {\n    this.#attribution[type] ??= {};\n    this.#attribution[type]![source] = displayName;\n    this.#legacyAttribution.add(`${type}:${source}`);\n    this.#advReminderAttribution.add(`${type}:${source}`);\n  }\n\n  /** Get the attribution map */\n  get attribution(): AdvantageAttributionMap {\n    return this.#attribution;\n  }\n\n  /** Get legacy Set format: \"${type}:${displayName}\" */\n  get legacyAttribution(): Set<string> {\n    return this.#legacyAttribution;\n  }\n\n  /** Get legacy Set format for adv-reminder: \"${type}:${source}\" */\n  get advReminderAttribution(): Set<string> {\n    return this.#advReminderAttribution;\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Combined Mode\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Get the combined advantage/disadvantage mode.\n   * @returns ADV_MODE.ADVANTAGE, ADV_MODE.DISADVANTAGE, or ADV_MODE.NORMAL\n   */\n  get advantageMode(): number {\n    // @ts-expect-error CONFIG.Dice.D20Roll not typed\n    const ADV_MODE: { DISADVANTAGE: number, NORMAL: number, ADVANTAGE: number } = CONFIG.Dice.D20Roll.ADV_MODE;\n    if (this.advantage.hasOverride && !this.disadvantage.hasOverride) return ADV_MODE.ADVANTAGE;\n    if (this.disadvantage.hasOverride && !this.advantage.hasOverride) return ADV_MODE.DISADVANTAGE;\n    if (this.advantage.hasOverride && this.disadvantage.hasOverride) return ADV_MODE.NORMAL;\n    if (this.advantage.isActive && !this.disadvantage.isActive) return ADV_MODE.ADVANTAGE;\n    if (this.disadvantage.isActive && !this.advantage.isActive) return ADV_MODE.DISADVANTAGE;\n    return ADV_MODE.NORMAL;\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Convenience Getters (delegate to sub-trackers)\n  // ─────────────────────────────────────────────────────────────────\n\n  /** Check if there's effective advantage */\n  get hasAdvantage(): true | undefined {\n    return this.advantage.isActive;\n  }\n\n  /** Check if there's effective disadvantage */\n  get hasDisadvantage(): true | undefined {\n    return this.disadvantage.isActive;\n  }\n\n  /** Computed final critical state */\n  get isCritical(): boolean {\n    return this.critical.isActive;\n  }\n\n  /** Computed final fumble state */\n  get isFumble(): boolean {\n    return this.fumble.isActive;\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Utility Methods\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Reset all state to initial values.\n   */\n  reset(): void {\n    this.advantage.reset();\n    this.disadvantage.reset();\n    this.critical.reset();\n    this.fumble.reset();\n    this.modifiers.reset();\n    this.#attribution = {};\n    this.#legacyAttribution.clear();\n    this.#advReminderAttribution.clear();\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Serialization\n  // ─────────────────────────────────────────────────────────────────\n\n  /** Serialize tracker state to a plain object for persistence */\n  toJSON(): object {\n    return {\n      advantage: this.advantage.get,\n      disadvantage: this.disadvantage.get,\n      critical: this.critical.get,\n      fumble: this.fumble.get,\n      modifiers: this.modifiers.get,\n      attribution: this.#attribution,\n      legacyAttribution: Array.from(this.#legacyAttribution),\n      advReminderAttribution: Array.from(this.#advReminderAttribution)\n    };\n  }\n\n  /** Restore tracker state from serialized data */\n  restore(data: ReturnType<RollModifierTracker[\"toJSON\"]> & Record<string, any>): void {\n    if (!data) return;\n    if (data.advantage) this.advantage.restore(data.advantage);\n    if (data.disadvantage) this.disadvantage.restore(data.disadvantage);\n    if (data.critical) this.critical.restore(data.critical);\n    if (data.fumble) this.fumble.restore(data.fumble);\n    if (data.modifiers) this.modifiers.restore(data.modifiers);\n    if (data.attribution) this.#attribution = data.attribution;\n    if (data.legacyAttribution) this.#legacyAttribution = new Set(data.legacyAttribution);\n    if (data.advReminderAttribution) this.#advReminderAttribution = new Set(data.advReminderAttribution);\n  }\n\n  processKeys(config: RollProcessConfig = {}) {\n    if (!config?.event) return;\n    //@ts-expect-error - game.system.utils not typed\n    const areKeysPressed = game.system.utils.areKeysPressed;\n\n    const keys = {\n      normal: areKeysPressed(config.event, \"skipDialogNormal\"),\n      advantage: areKeysPressed(config.event, \"skipDialogAdvantage\"),\n      disadvantage: areKeysPressed(config.event, \"skipDialogDisadvantage\")\n    };\n\n    // Special case handling so that shift+alt+ctl will force a normal roll\n    if (keys.advantage && keys.disadvantage && keys.normal) {\n      this.advantage.setOverride(\"forcedKeyPress\", i18n(\"midi-qol.ForcedKeyPress\"));\n      this.disadvantage.setOverride(\"forcedKeyPress\", i18n(\"midi-qol.ForcedKeyPress\"));\n      config.advantage = false;\n      config.disadvantage = false;\n      config.event = undefined;\n    } else {\n      if (keys.disadvantage) {\n        const source = keys.normal ? \"forcedKeyPress\" : \"keyPress\";\n        if (keys.normal)\n          this.disadvantage.setOverride(source, i18n(\"midi-qol.KeyPress\"));\n        else\n          this.disadvantage.add(source, i18n(\"midi-qol.KeyPress\"));\n      }\n      if (keys.advantage) {\n        const source = keys.normal ? \"forcedKeyPress\" : \"keyPress\";\n        if (keys.normal)\n          this.advantage.setOverride(source, i18n(\"midi-qol.ForcedKeyPress\"));\n        else\n          this.advantage.add(source, i18n(\"midi-qol.KeyPress\"));\n      }\n    }\n  }\n}\n\n/**\n * Centralized function for processing advantage/disadvantage flags.\n * Handles both actor flags and source actor grants flags.\n * Populates and returns a RollModifierTracker instance with attribution tracking.\n */\nexport async function computeAdvantageFlags(\n  actor: Actor.Implementation,\n  flags: AdvantageFlags,\n  options: MidiOptions,\n  tracker?: RollModifierTracker\n): Promise<RollModifierTracker> {\n  tracker ??= new RollModifierTracker();\n\n  // Seed with any pre-existing advantage/disadvantage from options\n  if (options.advantage) {\n    tracker.advantage.add(\"options\", \"Options\");\n  }\n  if (options.disadvantage) {\n    tracker.disadvantage.add(\"options\", \"Options\");\n  }\n\n  // The opposing entity that grants advantage/disadvantage.\n  // For attacks: the defender. For saves: the caster. Falls back to actor's own token.\n  const grantsActor = options.grantsActor ?? options.workflow?.actor;\n  const grantsToken = options.grantsToken ?? (grantsActor ? tokenForActor(grantsActor) : undefined);\n\n  const conditionData = createConditionData({\n    workflow: options.workflow,\n    target: grantsToken ?? tokenForActor(actor),\n    actor,\n    item: options.item ?? options.itemUuid ?? options.saveItem ?? options.saveItemUuid\n  });\n\n  // Check actor's advantage flags\n  for (const flag of flags.advantageFlags) {\n    if (await evalAllConditionsAsync(actor, midiFlag(flag), conditionData, false)) {\n      const source = flag.replace(/^advantage\\./, '');\n      tracker.advantage.add(source, getAttributionDisplayName(actor, flag, getFlagDisplayName(flag)));\n      break;\n    }\n  }\n\n  // Check actor's disadvantage flags\n  for (const flag of flags.disadvantageFlags) {\n    if (await evalAllConditionsAsync(actor, midiFlag(flag), conditionData, false)) {\n      const source = flag.replace(/^disadvantage\\./, '');\n      tracker.disadvantage.add(source, getAttributionDisplayName(actor, flag, getFlagDisplayName(flag)));\n      break;\n    }\n  }\n\n  // Check source actor grants flags\n\n  // Check actor's noAdvantage flags\n  if (flags.noAdvantageFlags?.length) {\n    for (const flag of flags.noAdvantageFlags) {\n      if (await evalAllConditionsAsync(actor, midiFlag(flag), conditionData, false)) {\n        tracker.advantage.suppress(flag, getAttributionDisplayName(actor, flag, getFlagDisplayName(flag)));\n        break;\n      }\n    }\n  }\n\n  // Check actor's noDisadvantage flags\n  if (flags.noDisadvantageFlags?.length) {\n    for (const flag of flags.noDisadvantageFlags) {\n      if (await evalAllConditionsAsync(actor, midiFlag(flag), conditionData, false)) {\n        tracker.disadvantage.suppress(flag, getAttributionDisplayName(actor, flag, getFlagDisplayName(flag)));\n        break;\n      }\n    }\n  }\n\n  if (grantsActor) {\n    const grantsConditionData = createConditionData({\n      workflow: options.workflow,\n      target: tokenForActor(actor),\n      actor: grantsActor,\n      token: grantsToken,\n      item: options.item ?? options.itemUuid ?? options.saveItem ?? options.saveItemUuid\n    });\n\n    const grantsName = grantsToken?.name ?? grantsActor.name ?? \"\";\n\n    if (flags.sourceAdvantageFlags?.length) {\n      for (const flag of flags.sourceAdvantageFlags) {\n        if (await evalAllConditionsAsync(grantsActor, midiFlag(flag), grantsConditionData, false)) {\n          const effectDisplay = getAttributionDisplayName(grantsActor, flag, getFlagDisplayName(flag));\n          tracker.advantage.add(`${flag} ${grantsName}`, `${effectDisplay} (${grantsName})`);\n          break;\n        }\n      }\n    }\n\n    if (flags.sourceDisadvantageFlags?.length) {\n      for (const flag of flags.sourceDisadvantageFlags) {\n        if (await evalAllConditionsAsync(grantsActor, midiFlag(flag), grantsConditionData, false)) {\n          const effectDisplay = getAttributionDisplayName(grantsActor, flag, getFlagDisplayName(flag));\n          tracker.disadvantage.add(`${flag} ${grantsName}`, `${effectDisplay} (${grantsName})`);\n          break;\n        }\n      }\n    }\n\n    if (flags.sourceNoAdvantageFlags?.length) {\n      for (const flag of flags.sourceNoAdvantageFlags) {\n        if (await evalAllConditionsAsync(grantsActor, midiFlag(flag), grantsConditionData, false)) {\n          const effectDisplay = getAttributionDisplayName(grantsActor, flag, getFlagDisplayName(flag));\n          tracker.advantage.suppress(`${flag} ${grantsName}`, `${effectDisplay} (${grantsName})`);\n          break;\n        }\n      }\n    }\n\n    if (flags.sourceNoDisadvantageFlags?.length) {\n      for (const flag of flags.sourceNoDisadvantageFlags) {\n        if (await evalAllConditionsAsync(grantsActor, midiFlag(flag), grantsConditionData, false)) {\n          const effectDisplay = getAttributionDisplayName(grantsActor, flag, getFlagDisplayName(flag));\n          tracker.disadvantage.suppress(`${flag} ${grantsName}`, `${effectDisplay} (${grantsName})`);\n          break;\n        }\n      }\n    }\n  }\n\n  // Check system roll mode fields\n  if (flags.systemRollModeFields?.length) {\n    for (const field of flags.systemRollModeFields) {\n      const rollMode = foundry.utils.getProperty(actor.system, field);\n      if (rollMode === 1) {\n        tracker.advantage.add(\"system.rollMode\", \"System Roll Mode\");\n      } else if (rollMode === -1) {\n        tracker.disadvantage.add(\"system.rollMode\", \"System Roll Mode\");\n      }\n    }\n  }\n\n  return tracker;\n}\n\n/**\n * Evaluate roll modifier flags and populate the tracker with autoFail/autoSuccess/min/max.\n * This is the flag evaluation step - call applyRollModifiers afterwards to apply to config.\n *\n * @param actor - The actor to evaluate flags for\n * @param flags - The flags to evaluate (failFlags, successFlags, minFlags, maxFlags)\n * @param tracker - The RollModifierTracker to populate\n * @param options - Additional options including workflow for condition evaluation\n */\nexport function computeRollModifiers(\n  actor: Actor.Implementation,\n  flags: RollModifierFlags,\n  tracker: RollModifierTracker,\n  options?: { workflow?: any }\n): void {\n  const conditionData = createConditionData({ workflow: options?.workflow, actor, target: tokenForActor(actor) });\n\n  // Evaluate auto-fail flags\n  for (const flag of flags.failFlags) {\n    if (evalAllConditions(actor, midiFlag(flag), conditionData, false)) {\n      tracker.modifiers.fail(flag, getFlagDisplayName(flag));\n      break;\n    }\n  }\n\n  // Evaluate auto-success flags\n  for (const flag of flags.successFlags) {\n    if (evalAllConditions(actor, midiFlag(flag), conditionData, false)) {\n      tracker.modifiers.succeed(flag, getFlagDisplayName(flag));\n      break;\n    }\n  }\n\n  // Evaluate max flags\n  for (const flag of flags.maxFlags) {\n    const value = evalAllConditions(actor, midiFlag(flag), conditionData, Infinity);\n    if (typeof value !== \"boolean\" && Number.isNumeric(value)) {\n      const numValue = Number(value);\n      tracker.modifiers.max(numValue, getFlagDisplayName(flag));\n    }\n  }\n\n  // Evaluate min flags\n  for (const flag of flags.minFlags) {\n    const value = evalAllConditions(actor, midiFlag(flag), conditionData, -Infinity);\n    if (typeof value !== \"boolean\" && Number.isNumeric(value)) {\n      const numValue = Number(value);\n      tracker.modifiers.min(numValue, getFlagDisplayName(flag));\n    }\n  }\n}\n\n/**\n * Apply roll modifiers from tracker state to the roll config.\n * Call computeRollModifiers first to populate the tracker, or set values directly.\n * Returns the modifier results so callers can check autoFail/autoSuccess.\n *\n * @param tracker - The RollModifierTracker with populated state\n * @param config - The roll config to modify\n * @param dialog - The dialog config to modify\n * @param options - Values for auto-fail (default 1) and auto-success (default 99)\n */\nexport function applyRollModifiers(\n  tracker: RollModifierTracker,\n  config: RollProcessConfig,\n  dialog: RollDialogConfig,\n  options?: { failValue?: number, successValue?: number }\n): RollModifierResult {\n  const failValue = options?.failValue ?? 1;\n  const successValue = options?.successValue ?? 99;\n\n  // Get values from tracker\n  const autoFail = tracker.modifiers.willFail;\n  const autoSuccess = tracker.modifiers.willSucceed;\n  const max = tracker.modifiers.maxValue;\n  const min = tracker.modifiers.minValue;\n\n  const result: RollModifierResult = {\n    autoFail,\n    autoSuccess,\n    max: max === Infinity ? undefined : max,\n    min: min === -Infinity ? undefined : min\n  };\n\n  // Apply modifiers to roll config\n  config.rolls ??= [];\n  if (!config.rolls.length) {\n    config.rolls.push({ options: {} });\n  }\n\n  if (autoFail) {\n    dialog.configure = false;\n    config.rolls = [{ options: { maximum: failValue }, parts: [] }];\n  } else if (autoSuccess) {\n    dialog.configure = false;\n    config.rolls = [{ options: { minimum: successValue }, parts: [] }];\n  } else {\n    for (const roll of config.rolls) {\n      roll.options ??= {};\n      if (max < Infinity) {\n        roll.options.maximum = Math.min(roll.options.maximum ?? Infinity, max);\n      }\n      if (min > -Infinity) {\n        roll.options.minimum = Math.max(roll.options.minimum ?? -Infinity, min);\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Evaluate critical/fumble modifier flags and populate the tracker.\n * Handles actor flags for critical/noCritical/fumble/noFumble.\n *\n * @param actor - The actor to evaluate flags for\n * @param flags - The flags to evaluate\n * @param tracker - The RollModifierTracker to populate\n * @param options - Additional options including workflow for condition evaluation\n */\nexport async function computeCriticalModifiers(\n  actor: Actor.Implementation,\n  flags: CriticalModifierFlags,\n  tracker: RollModifierTracker,\n  options?: { workflow?: any, actionType?: string }\n): Promise<void> {\n  const conditionData = createConditionData({ workflow: options?.workflow, actor, target: tokenForActor(actor) });\n\n  // Evaluate critical flags - force critical\n  for (const flag of flags.criticalFlags) {\n    if (await evalAllConditionsAsync(actor, midiFlag(flag), conditionData, false)) {\n      tracker.critical.force(flag, getFlagDisplayName(flag));\n      break;\n    }\n  }\n\n  // Evaluate noCritical flags - suppress critical\n  for (const flag of flags.noCriticalFlags) {\n    if (await evalAllConditionsAsync(actor, midiFlag(flag), conditionData, false)) {\n      tracker.critical.suppress(flag, getFlagDisplayName(flag));\n      break;\n    }\n  }\n\n  // Evaluate fumble flags - force fumble\n  for (const flag of flags.fumbleFlags) {\n    if (await evalAllConditionsAsync(actor, midiFlag(flag), conditionData, false)) {\n      tracker.fumble.force(flag, getFlagDisplayName(flag));\n      break;\n    }\n  }\n\n  // Evaluate noFumble flags - suppress fumble\n  for (const flag of flags.noFumbleFlags) {\n    if (await evalAllConditionsAsync(actor, midiFlag(flag), conditionData, false)) {\n      tracker.fumble.suppress(flag, getFlagDisplayName(flag));\n      break;\n    }\n  }\n}\n\n/**\n * Evaluate target grants critical/fumble flags and populate the tracker.\n * Handles grants.critical, grants.noCritical, grants.fumble, grants.noFumble.\n *\n * @param targetActor - The target actor to evaluate grants flags on\n * @param targetName - Display name for attribution\n * @param flags - The grants flags to evaluate\n * @param tracker - The RollModifierTracker to populate\n * @param options - Additional options including workflow and source actor for condition evaluation\n */\nexport async function computeTargetCriticalModifiers(\n  targetActor: Actor.Implementation,\n  targetName: string,\n  flags: CriticalModifierFlags,\n  tracker: RollModifierTracker,\n  options?: { workflow?: any, grantsActor?: Actor.Implementation }\n): Promise<void> {\n  const conditionData = createConditionData({\n    workflow: options?.workflow,\n    actor: options?.grantsActor,\n    target: tokenForActor(targetActor)\n  });\n\n  // Evaluate grants.critical flags\n  for (const flag of flags.criticalFlags) {\n    if (await evalAllConditionsAsync(targetActor, midiFlag(flag), conditionData, false)) {\n      tracker.critical.force(flag, `${getFlagDisplayName(flag)} (${targetName})`);\n      break;\n    }\n  }\n\n  // Evaluate grants.noCritical flags\n  for (const flag of flags.noCriticalFlags) {\n    if (await evalAllConditionsAsync(targetActor, midiFlag(flag), conditionData, false)) {\n      tracker.critical.suppress(flag, `${getFlagDisplayName(flag)} (${targetName})`);\n      break;\n    }\n  }\n\n  // Evaluate grants.fumble flags\n  for (const flag of flags.fumbleFlags) {\n    if (await evalAllConditionsAsync(targetActor, midiFlag(flag), conditionData, false)) {\n      tracker.fumble.force(flag, `${getFlagDisplayName(flag)} (${targetName})`);\n      break;\n    }\n  }\n\n  // Evaluate grants.noFumble flags\n  for (const flag of flags.noFumbleFlags) {\n    if (await evalAllConditionsAsync(targetActor, midiFlag(flag), conditionData, false)) {\n      tracker.fumble.suppress(flag, `${getFlagDisplayName(flag)} (${targetName})`);\n      break;\n    }\n  }\n}\n","import { i18n } from \"../../midi-qol.js\";\n\nconst { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;\n\ninterface ConditionEditorOptions {\n  value: string;\n  key: string;\n  effect?: ActiveEffect;\n  label?: string;\n  parent: Actor | Item | null;\n  onSubmit: (value: string) => void;\n  onCancel: () => void;\n}\n\n/**\n * Build a static completion tree representing everything available in the\n * condition evaluation sandbox. Derived from createConditionData() and\n * asyncMySafeEval() — assumes a workflow is active, which is the case\n * for all advantage/disadvantage/grants condition flags.\n *\n * Pulls rich type info (children, instanceChildren, staticChildren) from the\n * existing macro-autocomplete tree where available, then overlays\n * condition-specific fields and helper functions.\n */\nfunction buildConditionCompletions(api: any): Record<string, any> {\n  const completions: Record<string, any> = {};\n  const tree = api.tree;\n\n  /**\n   * Clone a tree entry, preserving children/instanceChildren/staticChildren\n   * references and overlaying extra children and/or overriding top-level fields.\n   */\n  function cloneWithExtras(\n    treeEntry: any,\n    overrides?: Record<string, any>,\n    extraChildren?: Record<string, any>\n  ): Record<string, any> {\n    if (!treeEntry) return overrides ?? {};\n    const entry: Record<string, any> = { ...treeEntry, ...overrides };\n    if (extraChildren) {\n      entry.children = { ...(treeEntry.children ?? {}), ...extraChildren };\n    }\n    return entry;\n  }\n\n  // Actor system schema children — used for root-level and target getRollData() fields\n  const actorSystemChildren = tree.actor?.children?.system?.children ?? {};\n\n  // ── Direct properties set by createConditionData ──\n  completions.isAttuned = { type: \"property\", detail: \"boolean\", info: \"Whether the triggering item is attuned\" };\n  completions.options = { type: \"property\", detail: \"object\", info: \"Roll options passed to the evaluation\" };\n  completions.isConcentrationCheck = { type: \"property\", detail: \"boolean\", info: \"Whether this is a concentration check\" };\n  completions.isDeathSave = { type: \"property\", detail: \"boolean\", info: \"Whether this is a death saving throw\" };\n\n  // ── actor sub-object — plain object, NOT the full Actor document ──\n  // In createConditionData: rollData.actor = {}; only raceOrType, typeOrRace, isCombatTurn are set\n  completions.actor = {\n    type: \"property\",\n    detail: \"object\",\n    info: \"Actor sub-object (raceOrType, typeOrRace, isCombatTurn only)\",\n    children: {\n      raceOrType: { type: \"property\", detail: \"string\", info: \"Race (PCs) or creature type (NPCs)\" },\n      typeOrRace: { type: \"property\", detail: \"string\", info: \"Creature type (NPCs) or race (PCs)\" },\n      isCombatTurn: { type: \"property\", detail: \"boolean\", info: \"Whether it's this actor's combat turn\" },\n    }\n  };\n\n  // items/equippedItems arrays\n  completions.items = { type: \"property\", detail: \"array\", info: \"All actor item roll data (array)\" };\n  completions.equippedItems = { type: \"property\", detail: \"array\", info: \"Equipped item roll data (array)\" };\n  completions.worldTime = { type: \"property\", detail: \"number\", info: \"Current world time (game.time.worldTime)\" };\n\n  // ── Target sub-object — getRollData() spread + system getter + condition fields ──\n  // In createConditionData: rollData.target = { get system() {...}, ...theTargetActor.getRollData() }\n  // getRollData() flattens actor.system to root, so target has abilities, attributes, etc. directly\n  const actorSystemEntry = tree.actor?.children?.system;\n  completions.target = {\n    type: \"property\",\n    detail: \"object\",\n    info: \"Target data (getRollData spread + condition fields)\",\n    children: {\n      ...actorSystemChildren,\n      system: actorSystemEntry\n        ? cloneWithExtras(actorSystemEntry, { info: \"Target actor's system data (getter)\" })\n        : { type: \"property\", detail: \"object\", info: \"Target actor's system data (getter)\" },\n      raceOrType: { type: \"property\", detail: \"string\", info: \"Target's race or creature type\" },\n      typeOrRace: { type: \"property\", detail: \"string\", info: \"Target's creature type or race\" },\n      items: { type: \"property\", detail: \"array\", info: \"Target's item roll data\" },\n      equippedItems: { type: \"property\", detail: \"array\", info: \"Target's equipped item roll data\" },\n      saved: { type: \"property\", detail: \"boolean\", info: \"Whether target passed the save\" },\n      failedSave: { type: \"property\", detail: \"boolean\", info: \"Whether target failed the save\" },\n      superSaver: { type: \"property\", detail: \"boolean\", info: \"Whether target is a super saver\" },\n      semiSuperSaver: { type: \"property\", detail: \"boolean\", info: \"Whether target is a semi-super saver\" },\n      isHit: { type: \"property\", detail: \"boolean\", info: \"Whether target was hit by the attack\" },\n      isHitEC: { type: \"property\", detail: \"boolean\", info: \"Whether target was hit (EC)\" },\n      canSense: { type: \"property\", detail: \"boolean\", info: \"Whether target can sense the attacker\" },\n      canSee: { type: \"property\", detail: \"boolean\", info: \"Whether target can see the attacker\" },\n      isCombatTurn: { type: \"property\", detail: \"boolean\", info: \"Whether it's the target's combat turn\" },\n    }\n  };\n\n  // Target identity fields at root level\n  completions.targetUuid = { type: \"property\", detail: \"string\", info: \"Target token document UUID\" };\n  completions.targetId = { type: \"property\", detail: \"string\", info: \"Target token ID\" };\n  completions.targetActorUuid = { type: \"property\", detail: \"string\", info: \"Target actor UUID\" };\n  completions.targetActorId = { type: \"property\", detail: \"string\", info: \"Target actor ID\" };\n  completions.raceOrType = { type: \"property\", detail: \"string\", info: \"Target's race or creature type\" };\n  completions.typeOrRace = { type: \"property\", detail: \"string\", info: \"Target's creature type or race\" };\n\n  // Visibility at root level\n  completions.canSense = { type: \"property\", detail: \"boolean\", info: \"Whether actor can sense the target\" };\n  completions.canSee = { type: \"property\", detail: \"boolean\", info: \"Whether actor can see the target\" };\n\n  // General\n  completions.humanoid = { type: \"property\", detail: \"string[]\", info: \"Array of humanoid race/type strings\" };\n  completions.tokenUuid = { type: \"property\", detail: \"string\", info: \"Actor's token document UUID\" };\n  completions.tokenId = { type: \"property\", detail: \"string\", info: \"Actor's token ID (deprecated)\" };\n\n  // ── Workflow — pull rich children from midiCompletions tree entry ──\n  completions.workflow = cloneWithExtras(tree.workflow,\n    { info: \"The active midi-qol Workflow instance\" }\n  );\n  completions.w = cloneWithExtras(tree.workflow,\n    { detail: \"Workflow\", info: \"Alias for workflow\" }\n  );\n\n  // ── Activity — pull rich children from midiCompletions tree entry ──\n  completions.activity = cloneWithExtras(tree.activity,\n    { info: \"The workflow's triggering activity\" }\n  );\n  completions.a = cloneWithExtras(tree.activity,\n    { detail: \"Activity\", info: \"Alias for activity\" }\n  );\n  completions.otherDamageActivity = cloneWithExtras(tree.activity,\n    { detail: \"Activity\", info: \"Other/versatile damage activity\" }\n  );\n\n  completions.riderStatuses = { type: \"property\", detail: \"object\", info: \"Status effects from applied effect riders ({status: true})\" };\n  completions.hasSave = { type: \"property\", detail: \"boolean\", info: \"Whether the workflow includes a save\" };\n  completions.shouldRollDamage = { type: \"property\", detail: \"boolean\", info: \"Whether damage should be rolled\" };\n  completions.hasAttack = { type: \"property\", detail: \"boolean\", info: \"Whether the activity has an attack roll\" };\n  completions.hasDamage = { type: \"property\", detail: \"boolean\", info: \"Whether the activity deals damage\" };\n\n  // ── item — item roll data (getRollData().item), NOT the full Item document ──\n  // In createConditionData: rollData.item = data.workflow.item.getRollData().item\n  // This is item.system data spread + name, type, img, etc.\n  const itemSystemChildren = tree.item?.children?.system?.children ?? {};\n  completions.item = {\n    type: \"property\",\n    detail: \"object\",\n    info: \"Item roll data (from getRollData().item, not the full Item document)\",\n    children: {\n      ...itemSystemChildren,\n      actionType: { type: \"property\", detail: \"string\", info: \"Activity action type (mwak, rsak, save, etc.)\" },\n    }\n  };\n\n  // ── Damage type info ──\n  completions.damageTypes = { type: \"property\", detail: \"object\", info: \"Damage types from the roll ({type: true})\" };\n  completions.defaultDamageType = { type: \"property\", detail: \"object\", info: \"Default damage type from the roll\" };\n\n  // ── Combat fields ──\n  completions.combatRound = { type: \"property\", detail: \"number\", info: \"Current combat round number\" };\n  completions.combatTurn = { type: \"property\", detail: \"number\", info: \"Current combat turn number\" };\n  completions.combatTime = { type: \"property\", detail: \"number\", info: \"Combat time (round + turn/100)\" };\n  completions.isCombatTurn = { type: \"property\", detail: \"boolean\", info: \"Whether it's the actor's combat turn\" };\n\n  // ── Constants — pull rich children from global tree ──\n  if (tree.CONFIG) completions.CONFIG = cloneWithExtras(tree.CONFIG);\n  if (tree.CONST) completions.CONST = cloneWithExtras(tree.CONST);\n\n  // ── Sandbox helper functions (merged by asyncMySafeEval/mySafeEval) ──\n  // Pull function completions from the MidiQOL tree to avoid duplicating detail/info strings.\n  // These are the same functions exported on globalThis.MidiQOL and injected into the condition sandbox.\n  const midiChildren = tree.MidiQOL?.children ?? {};\n\n  // Roll — pull rich class info (static + instance methods) from global tree\n  completions.Roll = cloneWithExtras(tree.Roll,\n    { info: \"Foundry Roll class for dice expressions\" }\n  );\n\n  // Functions shared with MidiQOL namespace — reference tree entries directly\n  for (const fn of [\n    \"findNearby\", \"findNearbyCount\", \"checkNearby\", \"hasCondition\",\n    \"checkIncapacitated\", \"canSee\", \"canSense\", \"computeDistance\",\n    \"checkActivityRange\", \"checkDistance\", \"contestedRoll\", \"sizeNumeric\",\n  ]) {\n    if (midiChildren[fn]) completions[fn] = midiChildren[fn];\n  }\n\n  // Functions only available in condition sandbox (not in MidiQOL namespace)\n  completions.checkDefeated = {\n    type: \"function\",\n    detail: \"(actorRef) => 0 | 1\",\n    info: \"Check if actor/token is defeated.\\nReturns: 1 if defeated, 0 if not\"\n  };\n  completions.fromUuidSync = {\n    type: \"function\",\n    detail: \"(uuid) => Document | null\",\n    info: \"Synchronously resolve a UUID to a Document\"\n  };\n  completions.confirm = {\n    type: \"function\",\n    detail: \"(message) => Promise<boolean>\",\n    info: \"Show a confirmation dialog (async only)\"\n  };\n  completions.nonWorkflowTargetedToken = {\n    type: \"property\",\n    detail: \"string\",\n    info: \"UUID of the first user-targeted token (outside workflow context)\"\n  };\n  // combat — pull rich children from global tree (game.combat runtime data)\n  completions.combat = cloneWithExtras(tree.game?.children?.combat ?? tree.combat,\n    { detail: \"Combat\", info: \"Active combat encounter (game.combat)\" }\n  );\n  completions.evalRaceOrType = {\n    type: \"function\",\n    detail: \"(actor) => string\",\n    info: \"Get race (PCs) or creature type (NPCs) of an actor\"\n  };\n  completions.evalTypeOrRace = {\n    type: \"function\",\n    detail: \"(actor) => string\",\n    info: \"Get creature type (NPCs) or race (PCs) of an actor\"\n  };\n  // getRollData() fields are available at the root level too (abilities, attributes, details, etc.)\n  // Merge actor system schema completions so users can type e.g. abilities.str.mod directly\n  if (actorSystemChildren) {\n    for (const [key, value] of Object.entries(actorSystemChildren as Record<string, any>)) {\n      if (!completions[key]) {\n        completions[key] = value;\n      }\n    }\n  }\n\n  return completions;\n}\n\n/**\n * Build a Blockly-specific category specification for the condition editor.\n * Organized into: Actor Data, Target Data, Workflow, Combat, Functions.\n * Only includes variables explicitly available in the condition sandbox.\n * Each category maps JS code paths to completion entries used by the\n * Blockly editor to register property/function blocks.\n */\nfunction buildBlocklyCategories(api: any): Record<string, Record<string, any>> {\n  const midiChildren = api.tree?.MidiQOL?.children ?? {};\n  // getRollData() flattens system data, so actor.abilities.str.mod is correct\n  // (not actor.system.abilities.str.mod) in the condition sandbox\n  const actorSystemChildren = api.tree?.actor?.children?.system?.children ?? {};\n\n  // Item system children for getRollData().item properties — prefer Item5e if available\n  const itemSystemChildren = api.tree?.Item5e?.children?.system?.children\n    ?? api.tree?.item?.children?.system?.children ?? {};\n\n  // Activity children from the completion tree\n  const activityChildren = api.tree?.activity?.children ?? {};\n\n  // Build indexed array children: indices 0-4, each with item system properties\n  // Generates code like items[0].name, equippedItems[2].level, etc.\n  function buildArrayItemChildren(): Record<string, any> {\n    const indexed: Record<string, any> = {};\n    for (let i = 0; i <= 4; i++) {\n      indexed[String(i)] = {\n        type: \"property\",\n        detail: \"object\",\n        info: `Item at index ${i} (item.getRollData() format)`,\n        children: itemSystemChildren,\n      };\n    }\n    return indexed;\n  }\n\n  // Build actor entries: condition-specific leaf fields + namespace blocks for system subtrees\n  const actorEntries: Record<string, any> = {\n    \"actor.raceOrType\": { type: \"property\", detail: \"string\", info: \"Race (PCs) or creature type (NPCs)\" },\n    \"actor.typeOrRace\": { type: \"property\", detail: \"string\", info: \"Creature type (NPCs) or race (PCs)\" },\n    \"actor.isCombatTurn\": { type: \"property\", detail: \"boolean\", info: \"Whether it's this actor's combat turn\" },\n    canSee: { type: \"property\", detail: \"boolean\", info: \"Whether actor can see the target\" },\n    canSense: { type: \"property\", detail: \"boolean\", info: \"Whether actor can sense the target\" },\n    equippedItems: { type: \"property\", detail: \"object[]\", info: \"Actor's equipped items (item.getRollData() format)\", children: buildArrayItemChildren() },\n    isAttuned: { type: \"property\", detail: \"boolean\", info: \"Whether the triggering item is attuned\" },\n    items: { type: \"property\", detail: \"object[]\", info: \"Actor's items (item.getRollData() format)\", children: buildArrayItemChildren() },\n    tokenUuid: { type: \"property\", detail: \"string\", info: \"Actor's token document UUID\" },\n  };\n  // Add system subtrees as namespace blocks (actor.abilities, actor.attributes, etc.)\n  for (const [key, entry] of Object.entries(actorSystemChildren as Record<string, any>)) {\n    const children = entry?.children ?? entry?.instanceChildren;\n    if (children && Object.keys(children).length > 0) {\n      actorEntries[`actor.${key}`] = { ...entry, children };\n    }\n  }\n\n  // Build target entries: condition-specific leaf fields + namespace blocks for system subtrees\n  const targetEntries: Record<string, any> = {\n    \"target.canSee\": { type: \"property\", detail: \"boolean\", info: \"Whether target can see the attacker\" },\n    \"target.canSense\": { type: \"property\", detail: \"boolean\", info: \"Whether target can sense the attacker\" },\n    \"target.equippedItems\": { type: \"property\", detail: \"object[]\", info: \"Target's equipped items (item.getRollData() format)\", children: buildArrayItemChildren() },\n    \"target.failedSave\": { type: \"property\", detail: \"boolean\", info: \"Whether target failed the save\" },\n    \"target.isCombatTurn\": { type: \"property\", detail: \"boolean\", info: \"Whether it's the target's combat turn\" },\n    \"target.isHit\": { type: \"property\", detail: \"boolean\", info: \"Whether target was hit by the attack\" },\n    \"target.isHitEC\": { type: \"property\", detail: \"boolean\", info: \"Whether target was hit (including EC)\" },\n    \"target.items\": { type: \"property\", detail: \"object[]\", info: \"Target's items (item.getRollData() format)\", children: buildArrayItemChildren() },\n    \"target.raceOrType\": { type: \"property\", detail: \"string\", info: \"Target's race or creature type\" },\n    \"target.saved\": { type: \"property\", detail: \"boolean\", info: \"Whether target passed the save\" },\n    \"target.semiSuperSaver\": { type: \"property\", detail: \"boolean\", info: \"Whether target is a semi-super saver\" },\n    \"target.superSaver\": { type: \"property\", detail: \"boolean\", info: \"Whether target is a super saver\" },\n    \"target.typeOrRace\": { type: \"property\", detail: \"string\", info: \"Target's creature type or race\" },\n    raceOrType: { type: \"property\", detail: \"string\", info: \"Target's race or creature type\" },\n    targetActorUuid: { type: \"property\", detail: \"string\", info: \"Target actor UUID\" },\n    targetUuid: { type: \"property\", detail: \"string\", info: \"Target token document UUID\" },\n    typeOrRace: { type: \"property\", detail: \"string\", info: \"Target's creature type or race\" },\n  };\n  // Add system subtrees as namespace blocks (target.abilities, target.attributes, etc.)\n  for (const [key, entry] of Object.entries(actorSystemChildren as Record<string, any>)) {\n    const children = entry?.children ?? entry?.instanceChildren;\n    if (children && Object.keys(children).length > 0) {\n      targetEntries[`target.${key}`] = { ...entry, children };\n    }\n  }\n\n  return {\n    \"Actor Data\": actorEntries,\n    \"Target Data\": targetEntries,\n    \"Workflow\": {\n      hasAttack: { type: \"property\", detail: \"boolean\", info: \"Whether the activity has an attack roll\" },\n      hasDamage: { type: \"property\", detail: \"boolean\", info: \"Whether the activity deals damage\" },\n      hasSave: { type: \"property\", detail: \"boolean\", info: \"Whether the workflow includes a save\" },\n      isConcentrationCheck: { type: \"property\", detail: \"boolean\", info: \"Whether this is a concentration check\" },\n      isDeathSave: { type: \"property\", detail: \"boolean\", info: \"Whether this is a death saving throw\" },\n      item: { type: \"property\", detail: \"object\", info: \"Triggering item (item.getRollData() format)\", children: itemSystemChildren },\n      shouldRollDamage: { type: \"property\", detail: \"boolean\", info: \"Whether damage should be rolled\" },\n      \"workflow.activity\": { type: \"variable\", detail: \"Activity\", info: \"The workflow's triggering activity\", children: activityChildren },\n    },\n    \"World\": {\n      worldTime: { type: \"property\", detail: \"number\", info: \"Current world time (game.time.worldTime)\" },\n    },\n    \"Combat\": {\n      combatRound: { type: \"property\", detail: \"number\", info: \"Current combat round number\" },\n      combatTime: { type: \"property\", detail: \"number\", info: \"Combat time (round + turn/100)\" },\n      combatTurn: { type: \"property\", detail: \"number\", info: \"Current combat turn number\" },\n      isCombatTurn: { type: \"property\", detail: \"boolean\", info: \"Whether it's the actor's combat turn\" },\n    },\n    \"Functions\": {\n      ...(midiChildren.findNearby ? { findNearby: midiChildren.findNearby } : {}),\n      ...(midiChildren.findNearbyCount ? { findNearbyCount: midiChildren.findNearbyCount } : {}),\n      ...(midiChildren.checkNearby ? { checkNearby: midiChildren.checkNearby } : {}),\n      ...(midiChildren.hasCondition ? { hasCondition: midiChildren.hasCondition } : {}),\n      ...(midiChildren.checkIncapacitated ? { checkIncapacitated: midiChildren.checkIncapacitated } : {}),\n      ...(midiChildren.computeDistance ? { computeDistance: midiChildren.computeDistance } : {}),\n      ...(midiChildren.sizeNumeric ? { sizeNumeric: midiChildren.sizeNumeric } : {}),\n      checkDefeated: { type: \"function\", detail: \"(actorRef) => 0 | 1\", info: \"Check if actor/token is defeated\" },\n      fromUuidSync: { type: \"function\", detail: \"(uuid) => Document | null\", info: \"Synchronously resolve a UUID to a Document\" },\n      evalRaceOrType: { type: \"function\", detail: \"(actor) => string\", info: \"Get race (PCs) or creature type (NPCs) of an actor\" },\n      evalTypeOrRace: { type: \"function\", detail: \"(actor) => string\", info: \"Get creature type (NPCs) or race (PCs) of an actor\" },\n    },\n  };\n}\n\nexport class ConditionEditor extends HandlebarsApplicationMixin(ApplicationV2) {\n  declare originalValue: string;\n  declare flagKey: string;\n  declare effect: ActiveEffect | undefined;\n  declare label: string | undefined;\n  declare parentDoc: Actor | Item | null;\n  declare onSubmitCallback: (value: string) => void;\n  declare onCancelCallback: () => void;\n  declare submitted: boolean;\n\n  constructor(editorOptions: ConditionEditorOptions, appOptions?: Partial<foundry.applications.api.ApplicationV2.Configuration>) {\n    super(appOptions);\n    this.originalValue = editorOptions.value;\n    this.flagKey = editorOptions.key;\n    this.effect = editorOptions.effect;\n    this.label = editorOptions.label;\n    this.parentDoc = editorOptions.parent;\n    this.onSubmitCallback = editorOptions.onSubmit;\n    this.onCancelCallback = editorOptions.onCancel;\n    this.submitted = false;\n  }\n\n  static override DEFAULT_OPTIONS = {\n    id: \"midi-qol-condition-editor\",\n    window: {\n      title: \"midi-qol.ConditionEditor.Title\",\n      resizable: true,\n      contentClasses: [\"standard-form\"]\n    },\n    position: {\n      width: 650,\n      height: 400,\n    },\n    actions: {\n      save: ConditionEditor.#onSave,\n      cancel: ConditionEditor.#onCancel,\n    }\n  };\n\n  static override PARTS = {\n    form: {\n      template: \"modules/midi-qol/templates/apps/ConditionEditor/conditionEditor.hbs\"\n    }\n  };\n\n  get title(): string {\n    const name = this.effect?.name ?? this.label ?? \"\";\n    return `${i18n(\"midi-qol.ConditionEditor.Title\")}: ${name}`;\n  }\n\n  override async _prepareContext(options: foundry.applications.api.ApplicationV2.RenderOptions) {\n    const context: Record<string, any> = await super._prepareContext(options);\n    context.value = this.originalValue;\n    context.key = this.flagKey;\n    return context;\n  }\n\n  override async _onRender(context: Record<string, any>, options: foundry.applications.api.ApplicationV2.RenderOptions) {\n    await super._onRender(context, options);\n\n    const codeMirrorEl = this.element.querySelector(\"code-mirror\") as HTMLElement | null;\n    if (!codeMirrorEl) return;\n\n    // Set value programmatically — avoids HTML attribute escaping issues with quotes/special chars.\n    // Default to a logical AND expression so the Blockly visual editor has a useful starting block\n    // (standalone expression blocks need a statement wrapper to generate code).\n    const editorValue = this.originalValue || \"true && true\";\n    (codeMirrorEl as any).value = editorValue;\n\n    // Inject contextual completions into the code-mirror element via macro-autocomplete API\n    const macroAutoComplete = (game as any).modules?.get(\"macro-autocomplete\");\n    const api = macroAutoComplete?.api;\n    if (!api?.setContextCompletions) return;\n\n    const completions = buildConditionCompletions(api);\n    const blocklyCategories = buildBlocklyCategories(api);\n    api.setContextCompletions(codeMirrorEl, completions, blocklyCategories);\n  }\n\n  /** Read current value from the code-mirror element */\n  #getCurrentValue(): string {\n    const codeMirrorEl = this.element.querySelector(\"code-mirror\") as HTMLElement | null;\n    if (!codeMirrorEl) return this.originalValue;\n    // Foundry's <code-mirror> exposes the value as a property\n    return (codeMirrorEl as any).value ?? this.originalValue;\n  }\n\n  get hasUnsavedChanges(): boolean {\n    return this.#getCurrentValue() !== this.originalValue;\n  }\n\n  override async close(options?: foundry.applications.api.ApplicationV2.ClosingOptions): Promise<this> {\n    if (!this.submitted && this.hasUnsavedChanges) {\n      const confirmed = await foundry.applications.api.DialogV2.confirm({\n        window: { title: i18n(\"midi-qol.OverTimeEditor.UnsavedTitle\") },\n        content: `<p>${i18n(\"midi-qol.OverTimeEditor.UnsavedContent\")}</p>`,\n        yes: { label: i18n(\"midi-qol.OverTimeEditor.CloseWithoutSaving\") },\n        no: { label: i18n(\"midi-qol.OverTimeEditor.Cancel\") }\n      });\n      if (!confirmed) return this;\n    }\n    // Clean up contextual completions\n    const api = (game as any).modules?.get(\"macro-autocomplete\")?.api;\n    const codeMirrorEl = this.element?.querySelector(\"code-mirror\");\n    if (api?.clearContextCompletions && codeMirrorEl) {\n      api.clearContextCompletions(codeMirrorEl);\n    }\n    return super.close(options);\n  }\n\n  static #onSave(this: ConditionEditor): void {\n    const value = this.#getCurrentValue();\n    this.submitted = true;\n    this.onSubmitCallback(value);\n    this.close();\n  }\n\n  static #onCancel(this: ConditionEditor): void {\n    this.submitted = true;\n    this.onCancelCallback();\n    this.close();\n  }\n\n  override async _preClose(options): Promise<void> {\n    await super._preClose(options);\n    if (!this.submitted) {\n      this.onCancelCallback();\n    }\n  }\n}\n","\nimport { debug, debugEnabled, error, log, warn, busyWait} from \"../midi-qol.js\";\nimport { socketlibSocket, unTimedExecuteAsGM } from \"./GMAction.js\";\nimport { configSettings } from \"./settings.js\";\nimport { getConcentrationEffect, getTokenDocument, isReactionItem } from \"./utils.js\";\nimport { UndoData, Workflow } from \"./Workflow.js\";\n\nexport let undoDataQueue: UndoData[] = [];\nlet startedUndoDataQueue: UndoData[] = [];\nconst MAXUNDO = 15;\ninterface undoTokenActorEntry {\n  actorUuid: string;\n  tokenUuid: string | undefined,\n  actorData: any;\n  tokenData: any;\n}\ninterface UndoDataDirect {\n  id: string;\n  userId: string;\n  userName: string;\n  itemName: string;\n  itemUuid: string;\n  actorUuid: string;\n  actorName: string;\n  isReaction: boolean;\n  tokendocUuid?: string;\n  chatCardUuids?: string[];\n  templateUuids?: string[];\n  sequencerUuid?: string;\n  itemCardUuid?: string;\n  targets?: { actorUuid: string; tokenUuid: string;  }[];\n}\n\nexport function queueUndoDataDirect(undoDataDef: UndoDataDirect) {\n  if (!configSettings.undoWorkflow) return;\n  unTimedExecuteAsGM(\"queueUndoDataDirect\", undoDataDef);\n}\nexport function _queueUndoDataDirect(undoDataDef: UndoDataDirect) {\n  if (!configSettings.undoWorkflow) return;\n  const tokenDoc = fromUuidSync(undoDataDef.tokendocUuid) as TokenDocument.Implementation | undefined;\n  const actor = fromUuidSync(undoDataDef.actorUuid) as Actor.Implementation | undefined;\n  if (!actor) return;\n  const undoData: UndoData = {\n    id: undoDataDef.id ?? foundry.utils.randomID(),\n    actorUuid: undoDataDef.actorUuid,\n    actorEntry: { actorUuid: undoDataDef.actorUuid, tokenUuid: undoDataDef.tokendocUuid, actorData: actor?.toObject(true), tokenData: tokenDoc?.toObject(true) },\n    chatCardUuids: undoDataDef.chatCardUuids ?? [],\n    itemCardUuid: undoDataDef.itemCardUuid,\n    actorName: actor.name,\n    itemName: undoDataDef.itemName,\n    userName: undoDataDef.userName,\n    allTargets: new Collection(),\n    serverTime: game.time?.serverTime,\n    templateUuids: undoDataDef.templateUuids ?? [],\n    isReaction: undoDataDef.isReaction,\n  };\n\n  for (let undoEntry of undoDataDef.targets ?? []) {\n    let { actorUuid, tokenUuid } = undoEntry;\n    const targetData = createTargetData(tokenUuid);\n    if (targetData) {\n      // TODO: Verify this works\n      undoData.allTargets?.set(actorUuid, targetData);\n    }\n  }\n  addQueueEntry(undoDataQueue, undoData);\n}\n// Called by workflow to start a new undoWorkflow entry\nexport async function saveUndoData(workflow: Workflow): Promise<boolean> {\n  if (!configSettings.undoWorkflow) return true;\n  workflow.undoData = {\n    id: workflow.id,\n    userId: game.user?.id,\n    itemName: workflow.item.name,\n    itemUuid: workflow.item.uuid,\n    userName: game.user?.name,\n    tokendocUuid: workflow.token?.document.uuid,\n    actorUuid: workflow.actor.uuid,\n    actorName: workflow.actor.name,\n    chatCardUuids: [],\n    isReaction: workflow.workflowOptions?.isReaction || isReactionItem(workflow.item),\n    templateUuids: [],\n    sequencerUuid: workflow.item.uuid,\n  };\n  if (!await unTimedExecuteAsGM(\"startUndoWorkflow\", workflow.undoData)) {\n    error(\"Could not startUndoWorkflow\");\n    return false;\n  }\n  return true;\n}\n\nexport function createTargetData(tokenUuid: string) {\n  if (!tokenUuid) return undefined;\n  const tokenDoc = fromUuidSync(tokenUuid) as TokenDocument.Implementation | undefined;\n  if (!tokenDoc) {\n    error(\"undo | createTargetData could not fetch token document for \", tokenUuid);\n    return undefined;\n  }\n  const targetData = { tokenUuid, actorUuid: tokenDoc.actor?.uuid ?? \"\", actorData: tokenDoc.actor?.toObject(true), tokenData: tokenDoc.toObject(true) };\n  return targetData;\n}\n\n// Called to save snapshots of workflow actor/token data\nexport function startUndoWorkflow(undoData: UndoData): boolean {\n  if (!configSettings.undoWorkflow) return true;\n  let actor = fromUuidSync(undoData.actorUuid) as Actor.Implementation | TokenDocument.Implementation | null | undefined;\n  if (actor instanceof TokenDocument) actor = actor.actor;\n  const actorData = actor?.toObject(true);\n  const tokenData = actor?.isToken ? actor.token!.toObject(true) : (fromUuidSync(undoData.tokendocUuid ?? \"\") as TokenDocument.Implementation)?.toObject(true);\n  undoData.actorEntry = { actorUuid: undoData.actorUuid, tokenUuid: undoData.tokendocUuid, actorData, tokenData };\n  undoData.allTargets = new Collection(); // every token referenced by the workflow\n  const concentrationEffect = getConcentrationEffect(actor, undoData.itemUuid);\n  if (concentrationEffect) {\n    // @ts-expect-error no dnd5e-types\n    for (let dependent of concentrationEffect.getDependents()) {\n      let token: TokenDocument.Implementation | null | undefined;\n      if (dependent instanceof ActiveEffect) dependent = dependent.parent;\n      if (dependent instanceof Actor && dependent.isToken) token = dependent.token;\n      else if (dependent instanceof Actor) token = dependent.getActiveTokens(false, true)[0];\n      if (!token) continue;\n      const targetData = createTargetData(token.uuid);\n      if (targetData) undoData.allTargets.set(dependent.uuid, targetData);\n    }\n  }\n  addQueueEntry(startedUndoDataQueue, undoData);\n  return true;\n}\n\nexport function updateUndoChatCardUuidsById(data: { id: string, chatCardUuids: string[] }) {\n  if (!configSettings.undoWorkflow) return;\n  const currentUndo = undoDataQueue.find(undoEntry => undoEntry.id === data.id);\n  if (!currentUndo) {\n    console.warn(\"midi-qol | updateUndoChatCardUuidsById | Could not find existing entry for \", data);\n    return;\n  }\n  currentUndo.chatCardUuids = data.chatCardUuids;\n}\nexport function updateUndoChatCardUuids(data: UndoData) {\n  if (!configSettings.undoWorkflow) return;\n  const currentUndo = undoDataQueue.find(undoEntry => undoEntry.serverTime === data.serverTime && undoEntry.userId === data.userId);\n  if (!currentUndo) {\n    console.warn(\"midi-qol | updateUndoChatCardUuids | Could not find existing entry for \", data);\n    return;\n  }\n  currentUndo.chatCardUuids = data.chatCardUuids;\n}\n\n// Called after preamblecomplete so save references to all targets\n// This is a bit convoluted since we don't want to pass massive data elements over the wire.\n// The total data for an undo entry can be measred in megabytes, so just pass uuids to the gm client and they can look up the tokens/actors\nexport async function saveTargetsUndoData(workflow: Workflow) {\n  if (!workflow.undoData) return;\n  workflow.undoData.targets = [];\n  workflow.targets.forEach(t => {\n    let tokenDoc = getTokenDocument(t);\n    if (!tokenDoc) return;\n    if ((tokenDoc?.actor)?.uuid === workflow.actor.uuid) return;\n    workflow.undoData!.targets!.push({ tokenUuid: tokenDoc?.uuid, actorUuid: (tokenDoc?.actor)?.uuid ?? \"\" });\n  });\n  workflow.undoData.serverTime = game.time?.serverTime;\n  workflow.undoData.itemCardUuid = workflow.itemCardUuid;\n  for (const tUuid of workflow.templateUuids) {\n    if (tUuid) workflow.undoData.templateUuids.push(tUuid);\n  }\n  return unTimedExecuteAsGM(\"queueUndoData\", workflow.undoData)\n}\n\nexport async function addUndoChatMessage(message: ChatMessage.Implementation) {\n  const currentUndo = undoDataQueue[0];\n  if (message instanceof Promise) message = await message;\n  if (configSettings.undoWorkflow && currentUndo && !currentUndo.chatCardUuids.some(uuid => uuid === message.uuid)) {\n    // Assumes workflow.undoData.chatCardUuids has been initialised\n    currentUndo.chatCardUuids = currentUndo.chatCardUuids.concat([message.uuid]);\n    unTimedExecuteAsGM(\"updateUndoChatCardUuids\", currentUndo);\n  }\n}\nHooks.on(\"createChatMessage\", (message, data, user) => {\n  if (!configSettings.undoWorkflow) return;\n  if ((undoDataQueue ?? []).length < 1) return;\n  const currentUndo = undoDataQueue[0];\n  const speaker = message.speaker;\n  // if (currentUndo.userId !== user) return;\n  if (speaker.token) {\n    const tokenUuid = `Scene.${speaker.scene}.Token.${speaker.token}`;\n    // allTargets is keyed by actor uuid - resolve the speaker token's actor\n    const actorUuid = (fromUuidSync(tokenUuid) as TokenDocument.Implementation | null)?.actor?.uuid;\n    if (actorUuid && currentUndo.allTargets?.has(actorUuid)) currentUndo.chatCardUuids.push(message.uuid);\n  } else if (speaker.actor) {\n    const actorUuid = `Actor.${speaker.actor}`;\n    if (currentUndo.allTargets?.has(actorUuid)) currentUndo.chatCardUuids.push(message.uuid);\n  }\n});\n\nexport function showUndoQueue() {\n  console.log(undoDataQueue);\n  log(\"Undo queue size is \", new TextEncoder().encode(JSON.stringify(undoDataQueue)).length);\n  log(\"Started queue size is \", new TextEncoder().encode(JSON.stringify(startedUndoDataQueue)).length);\n}\n\nexport function getUndoQueue() {\n  return undoDataQueue;\n}\n\nexport function queueUndoData(data: UndoData): boolean {\n  let inProgress = startedUndoDataQueue.find(undoData => undoData.userId === data.userId && undoData.id === data.id);\n  if (!inProgress) {\n    error(\"Could not find started undo entry for \", data.userId, data.id);\n    return false;\n  };\n  inProgress = foundry.utils.mergeObject(inProgress, data, { overwrite: false });\n  startedUndoDataQueue = startedUndoDataQueue.filter(undoData => undoData.userId !== data.userId || undoData.itemUuid !== data.itemUuid);\n\n  data.targets?.forEach(undoEntry => {\n    if (!inProgress.allTargets?.get(undoEntry.actorUuid ?? \"\")) {\n      const targetData = createTargetData(undoEntry.tokenUuid)\n      if (targetData) {\n        foundry.utils.mergeObject(undoEntry, targetData, { inplace: true });\n        inProgress.allTargets?.set(undoEntry.actorUuid!, undoEntry);\n      }\n    }\n    /* This replaces the use of midi-qol concentration data but I'm not sure it's needed\n    //@ts-expect-error\n    let actor = fromUuidSync(undoEntry.actorUuid);\n    if (actor instanceof TokenDocument) actor = actor.actor;\n    for (let effect of actor?.appliedEffects) {\n      const dependents = effect.getDependents();\n      for (let dependent of dependents) {\n        let token;\n        if (dependent instanceof ActiveEffect) dependent = dependent.parent;\n        if (dependent instanceof Actor && dependent.isToken) token = dependent.token;\n        else if (dependent instanceof Actor) token = dependent.getActiveTokens()[0];\n        if (!token) continue;\n        const targetData = createTargetData(token.uuid)\n        if (targetData && !inProgress.allTargets.get(token.actor.uuid)) {\n          inProgress.allTargets.set(token.actor.uuid, targetData)\n        }\n      }\n    }\n    */\n  });\n\n  addQueueEntry(undoDataQueue, inProgress);\n  return true;\n}\n\nexport function addQueueEntry(queue: UndoData[], data: UndoData) {\n  // add the item\n  let added = false;\n  for (let i = 0; i < queue.length; i++) {\n    if ((data.serverTime ?? 0) > (queue[i].serverTime ?? 0)) {\n      queue.splice(i, 0, data);\n      added = true;\n      break;\n    }\n  }\n  if (!added) queue.push(data);\n  Hooks.callAll(\"midi-qol.addUndoEntry\", data)\n  if (queue.length > MAXUNDO) {\n    log(\"Removed undoEntry due to overflow\", queue.pop());\n  }\n}\n\nexport async function undoMostRecentWorkflow() {\n  return unTimedExecuteAsGM(\"undoMostRecentWorkflow\")\n}\nexport async function removeMostRecentWorkflow() {\n  return unTimedExecuteAsGM(\"removeMostRecentWorkflow\")\n}\n\nexport async function undoTillWorkflow(workflowId: string, undoTarget: boolean, removeWorkflow: boolean = false) {\n  if (undoDataQueue.length === 0) return false;\n  if (!undoDataQueue.find(ue => ue.id === workflowId)) return false;\n  const queueLength = undoDataQueue.length;\n  try {\n    while (undoDataQueue.length > 0 && undoDataQueue[0].id !== workflowId) {\n      await undoWorkflow(undoDataQueue.shift());\n    }\n    if (undoTarget) await undoWorkflow(undoDataQueue[0]);\n    if (undoDataQueue.length > 0 && removeWorkflow) {\n      const undoData = undoDataQueue.shift();\n      if (undoData) {\n        // This should be unneeded as removing the chat card should trigger removal of the workflow\n        socketlibSocket.executeAsUser(\"removeWorkflow\", undoData.userId, undoData.id);\n      }\n    }\n  } finally {\n    if (queueLength !== undoDataQueue.length) Hooks.callAll(\"midi-qol.removeUndoEntry\");\n  }\n  return queueLength !== undoDataQueue.length;\n}\n\nexport async function _undoMostRecentWorkflow() {\n  if (undoDataQueue.length === 0) return false;\n  let undoData: UndoData | undefined;\n  try {\n    while (undoDataQueue.length > 0) {\n      undoData = undoDataQueue.shift();\n      if (undoData?.isReaction) await undoWorkflow(undoData);\n      else return undoWorkflow(undoData);\n    }\n  } finally {\n    if (undoData) Hooks.callAll(\"midi-qol.removeUndoEntry\", undoData);\n  }\n  return;\n}\n\nexport async function _removeMostRecentWorkflow() {\n  if (undoDataQueue.length === 0) return false;\n  let undoData: UndoData | undefined;\n  try {\n    while (undoDataQueue.length > 0) {\n      undoData = undoDataQueue.shift();\n      if (undoData?.isReaction) continue;\n      else return undoData;\n    }\n  } finally {\n    if (undoData) Hooks.callAll(\"midi-qol.removeUndoEntry\", undoData);\n  }\n  return;\n}\n\nexport async function _removeChatCards(data: { chatCardUuids: string[] }) {\n  // TODO see if this might be async and awaited\n  if (!data.chatCardUuids) return;\n  try {\n    for (let uuid of data.chatCardUuids) {\n      const card = fromUuidSync(uuid) as ChatMessage.Implementation | undefined;\n      await removeChatCard(card);\n    }\n  } catch (err) {\n    error(err);\n    // debugger;\n  }\n}\n\nexport function getRemoveUndoEffects(effectsData: ActiveEffect.Source[], actor: Actor.Implementation): string[] {\n  if (!effectsData) return []; // should only hapoen for unlinked unmodified\n  const effectsToRemove = actor.effects.filter(effect => {\n    return !effectsData.some(effectData => effect.id === effectData._id);\n  }).map(effect => effect.id!) ?? [];\n  return effectsToRemove;\n}\n\nfunction getRemoveUndoItems(itemsData: Item.Source[], actor: Actor.Implementation): string[] {\n  if (!itemsData) return []; // Should only happen for unchanged unlinked actors\n  const itemsToRemove = actor.items.filter(item => {\n    return !itemsData?.some(itemData => item.id === itemData._id);\n  }).map(item => item.id!);\n  return itemsToRemove;\n}\n\nfunction getChanges(newData?: Actor.Source | TokenDocument.Source, savedData?: Actor.Source | TokenDocument.Source): Partial<Actor.Source | TokenDocument.Source> {\n  if (!newData && !savedData) return {};\n  if (newData) {\n    delete (newData as Partial<Actor.Source>).items;\n    delete (newData as Partial<Actor.Source>).effects;\n  }\n  if (savedData) {\n    delete (savedData as Partial<Actor.Source>).items;\n    delete (savedData as Partial<Actor.Source>).effects;\n  }\n\n  const changes = foundry.utils.flattenObject(foundry.utils.diffObject(newData ?? {}, savedData ?? {}));\n  const tempChanges = foundry.utils.flattenObject(foundry.utils.diffObject(savedData ?? {}, newData ?? {}));\n  const toDelete = {};\n  for (let key of Object.keys(tempChanges)) {\n    if (!changes[key]) {\n      let parts = key.split(\".\");\n      parts[parts.length - 1] = \"-=\" + parts[parts.length - 1];\n      let newKey = parts.join(\".\");\n      toDelete[newKey] = null\n    }\n  }\n  return foundry.utils.mergeObject(changes, toDelete);\n}\nasync function undoSingleTokenActor({ tokenUuid, actorUuid, actorData, tokenData }: { tokenUuid?: string; actorUuid?: string; actorData?: Actor.Source, tokenData?: TokenDocument.Source}) {\n  let actor = fromUuidSync(actorUuid ?? \"\") as Actor.Implementation | TokenDocument.Implementation | undefined | null;\n  if (actor instanceof TokenDocument) actor = actor.actor;\n  const tokenDoc = actor?.isToken ? actor.token : fromUuidSync(tokenUuid ?? \"\") as TokenDocument.Implementation | undefined;\n  if (!actor) return;\n  let actorChanges: Partial<Actor.Source> | undefined;\n  let tokenChanges: Partial<TokenDocument.Source> | undefined;\n  if (debugEnabled > 0) warn(\"undoSingleTokenActor | starting for \", actor.name);\n\n  const removeItemsFunc = async () => {\n    const itemsToRemove = getRemoveUndoItems(actorData?.items ?? [], actor);\n    // @ts-expect-error extra option silliness\n    if (itemsToRemove?.length > 0) await actor.deleteEmbeddedDocuments(\"Item\", itemsToRemove, { isUndo: true });\n    if (debugEnabled > 0) warn(\"undoSingleTokenActor | items to remove \", actor.name, itemsToRemove);\n    // await busyWait(100);\n  }\n  if (globalThis.DAE.actionQueue) await globalThis.DAE.actionQueue.add(removeItemsFunc)\n  else await removeItemsFunc();\n  if (debugEnabled > 0) warn(\"undoSingleTokenActor |  removeItemFunc completed\")\n\n  if (debugEnabled > 0) warn(\"undoSingleTokenActor | about to remove effects\")\n  const removeEffectsFunc = async () => {\n    const effectsToRemove = getRemoveUndoEffects(actorData?.effects ?? [], actor);\n    if (debugEnabled > 0) warn(\"undoSingleTokenActor |\", effectsToRemove);\n    // @ts-expect-error extra option silliness\n    if (effectsToRemove.length > 0) await actor.deleteEmbeddedDocuments(\"ActiveEffect\", effectsToRemove, { noConcentrationCheck: true, isUndo: true });\n  }\n  if (globalThis.DAE?.actionQueue) await globalThis.DAE.actionQueue.add(removeEffectsFunc)\n  else await removeEffectsFunc();\n  if (debugEnabled > 0) warn(\"undoSingleTokenActor | remove effects completed\")\n\n  const itemsToAdd = actorData?.items?.filter(itemData => /*!itemData.flags?.dae?.DAECreated && */ !actor.items.some(item => itemData._id === item.id));\n  if (debugEnabled > 0) warn(\"undoSingleTokenActor | Items to add \", actor.name, itemsToAdd)\n  if ((itemsToAdd?.length ?? 0) > 0) {\n    if (globalThis.DAE?.actionQueue) await globalThis.DAE.actionQueue.add(actor.createEmbeddedDocuments.bind(actor), \"Item\", itemsToAdd, { keepId: true, isUndo: true });\n    // @ts-expect-error extra option silliness\n    else await actor?.createEmbeddedDocuments(\"Item\", itemsToAdd, { keepId: true, isUndo: true });\n    await busyWait(100);\n  }\n  let effectsToAdd = actorData?.effects?.filter(efData => !actor.effects.some(effect => efData._id === effect.id));\n  effectsToAdd = effectsToAdd?.filter(efData => !efData?.flags?.dae?.transfer) ?? [];\n  // revisit this for v11 and effects not transferred\n\n  if (debugEnabled > 0) warn(\"undoSingleTokenActor | Effects to add \", actor.name, effectsToAdd);\n  if (effectsToAdd?.length > 0) {\n    if (globalThis.DAE?.actionQueue) await globalThis.DAE.actionQueue.add(async () => {\n      effectsToAdd = effectsToAdd?.filter(eff => !actor.effects.some(effect => effect.id === eff._id!));\n      if (debugEnabled > 0) warn(\"undoSingleTokenActor | Effects to add are \", effectsToAdd, actor.name);\n      // @ts-expect-error extra option silliness\n      await actor.createEmbeddedDocuments(\"ActiveEffect\", effectsToAdd, { keepId: true, isUndo: true })\n    });\n    // @ts-expect-error extra option silliness\n    else await actor.createEmbeddedDocuments(\"ActiveEffect\", effectsToAdd, { keepId: true, isUndo: true });\n  }\n\n  if (actorData && globalThis.DAE?.actionQueue) await globalThis.DAE.actionQueue.add(actor.updateEmbeddedDocuments.bind(actor), \"Item\", actorData.items, { keepId: true, isUndo: true });\n  // @ts-expect-error extra option silliness\n  else if (actorData) await actor.updateEmbeddedDocuments(\"Item\", actorData.items, { keepId: true, isUndo: true });\n  if ((actorData?.effects?.length ?? 0) > 0) {\n    if (globalThis.DAE?.actionQueue) await globalThis.DAE.actionQueue.add(actor.updateEmbeddedDocuments.bind(actor), \"ActiveEffect\", actorData!.effects, { keepId: true, isUndo: true });\n    // @ts-expect-error extra option silliness\n    else await actor.updateEmbeddedDocuments(\"ActiveEffect\", actorData!.effects, { keepId: true, isUndo: true });\n  }\n\n  actorChanges = actorData ? getChanges(actor.toObject(true), actorData) : {};\n  if (debugEnabled > 0) warn(\"undoSingleTokenActor | Actor data \", actor.name, actorData, actorChanges);\n  if (!foundry.utils.isEmpty(actorChanges)) {\n    delete actorChanges.items;\n    delete actorChanges.effects;\n    // @ts-expect-error extra option silliness\n    await actor.update(actorChanges, { noConcentrationCheck: true })\n  }\n  if (tokenDoc) {\n    tokenChanges = tokenData ? getChanges(tokenDoc.toObject(true), tokenData) : {};\n    // @ts-expect-error pretty sure this doesn't exist but idk\n    delete tokenChanges.actorData;\n    delete tokenChanges.delta;\n    if (!foundry.utils.isEmpty(tokenChanges)) {\n      // @ts-expect-error extra option silliness\n      await tokenDoc.update(tokenChanges, { noConcentrationCheck: true })\n    }\n  }\n}\n\nexport async function removeChatCard(chatCard?: ChatMessage.Implementation): Promise<ChatMessage.Implementation | undefined> {\n  if (!chatCard || !chatCard.content) return;\n  const shouldDelete = configSettings.undoChatColor === \"Delete\";\n  if (shouldDelete) {\n    if (debugEnabled > 1) debug(\"Deleting chat card \", chatCard.id, chatCard.uuid);\n    return await chatCard.delete();\n  }\n  return await chatCard.update({ content: `<div style=\"background-color: ${configSettings.undoChatColor};\"> ${chatCard.content}</div>` });\n}\n\nexport async function undoWorkflow(undoData?: UndoData) {\n  if (!undoData) return;\n  log(`Undoing workflow for Player ${undoData.userName} Token: ${undoData.actorEntry?.actorData?.name} Item: ${undoData.itemName ?? \"\"}`)\n  for (let templateUuid of undoData.templateUuids)\n    await (fromUuidSync(templateUuid) as MeasuredTemplateDocument.Implementation | undefined)?.delete();\n  if (globalThis.Sequencer && undoData.sequencerUuid) await globalThis.Sequencer.EffectManager.endEffects({ origin: undoData.sequencerUuid })\n\n  for (let undoEntry of undoData?.allTargets ?? []) {\n    log(\"undoing target \", undoEntry.actorData?.name ?? undoEntry.tokenData?.name, undoEntry)\n    await undoSingleTokenActor(undoEntry)\n  };\n  if (undoData.actorEntry) await undoSingleTokenActor(undoData.actorEntry);\n  const shouldDelete = false;\n  // delete cards...\n  if (undoData.itemCardUuid) {\n    const message = fromUuidSync(undoData.itemCardUuid) as ChatMessage.Implementation | undefined;\n    await removeChatCard(message);\n  }\n  await _removeChatCards({ chatCardUuids: undoData.chatCardUuids });\n}","import { Activity } from \"../../globals.js\";\nimport { i18n, error, i18nFormat } from \"../../midi-qol.js\";\nimport { checkMechanic, checkRule, configSettings, targetConfirmation } from \"../settings.js\";\nimport { TOTAL_COVER, HALF_COVER, THREE_QUARTERS_COVER, activityHasAreaTarget, checkActivityRange, getCoverBonus, computeFlankingStatus, getToken, isInCombat, isValidTarget, markFlanking, tokenForActor, updateUserTargets, getTokenName } from \"../utils.js\";\nimport { shouldEnforceSingleTarget } from \"../activities/activityHelpers.js\";\nimport { getTokenPlayerName } from \"../utils.js\";\nimport { TroubleShooter } from \"./TroubleShooter.js\";\nimport ApplicationV2 = foundry.applications.api.ApplicationV2\nimport { WorkflowOptions } from \"../Workflow.js\";\nconst { HandlebarsApplicationMixin } = foundry.applications.api;\n\nexport class TargetConfirmationDialog extends HandlebarsApplicationMixin(ApplicationV2) {\n  callback: ((data) => {}) | undefined;\n  data: {\n    actor: Actor.Implementation;\n    activity: Activity;\n    user: User | null;\n    targets: Token.Implementation[];\n    options: any;\n    maxTargets: number | null | undefined;\n  };\n  hookId: number;\n\n  constructor(actor: Actor.Implementation, activity: Activity, user: User.Implementation, options: TargetConfirmationOptions = {}) {\n    super(options);\n    this.position.left = TargetConfirmationDialog.xPosition;\n    this.position.top = TargetConfirmationDialog.yPosition;\n    let maxTargets = activity.target?.affects?.count ? Number(activity.target.affects.count) : +Infinity;\n    const inCombat = activity.item.parent && isInCombat(activity.item.parent);\n\n    const requiresTargets = configSettings.requiresTargets === \"always\"\n      || (configSettings.requiresTargets === \"tokens\" && (canvas?.scene?.tokens.size ?? 0) > 0)\n      || (configSettings.requiresTargets === \"combat\" && inCombat);\n    // @ts-expect-error no dnd5e-types\n    if (activity.item.type === \"weapon\" && requiresTargets && shouldEnforceSingleTarget(activity)) {\n      maxTargets = 1;\n    }\n    this.data = { actor, activity, user, targets: [], options, maxTargets };\n    const keys = {}; // TODO see if this needs to be set from the workflow event or let it get processed later\n    // Handle alt/ctrl etc keypress when completing the dialog\n    this.callback = function (value) {\n      foundry.utils.setProperty(options, \"workflowOptions.advantage\", options.workflowOptions?.advantage);\n      foundry.utils.setProperty(options, \"workflowOptions.disadvantage\", options.workflowOptions?.disadvantage);\n      foundry.utils.setProperty(options, \"workflowOptions.fastForward\", options.workflowOptions?.fastForward);\n      return options.callback ? options.callback(value) : value;\n    }\n    // Make sure the current targets respect the targeting rules of the activity\n    this.validateAndUpdateTargets();\n \n    if ([\"ceflanked\", \"ceflankedNoconga\", \"midiFlanked\", \"midiFlankedNoConga\"].includes(checkRule(\"checkFlanking\") as string) && game.user?.targets) {\n      const actor = this.data.activity.actor;\n      const token = tokenForActor(actor);\n      if (token)\n        for (let target of game.user?.targets)\n          markFlanking(token, target)\n    }\n    // this.callback = options.callback;\n    this.hookId = Hooks.on(\"targetToken\", (user, token, targeted) => {\n      if (user !== game.user) return;\n      if (game.user.targets) {\n        this.validateAndUpdateTargets();\n      }\n      // Validate max number of targets after target validation, so that invalid targets can be removed without triggering a warning\n      if (this.data.maxTargets && game.user.targets?.size > this.data.maxTargets)\n        ui.notifications?.warn(i18nFormat(\"midi-qol.wrongNumberTargets\", { allowedTargets: this.data.maxTargets }));\n\n      const newTargets = Array.from(game.user.targets ?? []);\n      // Do not re-render if the targets have not changed\n      if (!newTargets.equals(this.data.targets ?? [])) {\n        this.data.targets = newTargets;\n        this.render();\n      }\n    });\n    return this;\n  }\n\n  get title() {\n    return this.data.options.title ?? i18n(\"midi-qol.TargetConfirmation.Name\");\n  }\n\n  static get xPosition() {\n    const left = 100;\n    const middle = window.innerWidth / 2 - 155;\n    let adjustment = 20;\n\n    const right = window.innerWidth - adjustment - (ui.sidebar?.element.clientWidth ?? 10) - 300;\n    switch (targetConfirmation.gridPosition?.x) {\n      case -1: return left;\n      case 0: return middle;\n      default:\n      case 1: return right;\n    }\n  }\n\n  static get yPosition() {\n    const top = 100;\n    const middle = window.innerHeight / 2 - 100;\n    const bottom = window.innerHeight - 200;\n    switch (targetConfirmation.gridPosition?.y) {\n      case -1: return top;\n      case 0: return middle;\n      default:\n      case 1: return bottom;\n    }\n  }\n\n  static override PARTS = {\n    main: { template: \"modules/midi-qol/templates/apps/TargetConfirmation/targetConfirmation.hbs\" },\n    footer: { template: \"templates/generic/form-footer.hbs\" }\n  };\n\n  static override DEFAULT_OPTIONS = {\n    id: \"midi-qol-targetConfirmation\",\n    window: {\n      title: \"midi-qol.TargetConfirmation.Name\",\n      resizable: true,\n      contentClasses: [\"standard-form\"]\n    },\n    classes: [\"midi-targeting\"],\n    position: {\n      width: 300,\n      height: \"auto\" as \"auto\",\n      left: 100,\n      top: 100\n    },\n    actions: {\n      roll: this.#onRoll,\n      cancel: this.#onCancel,\n      clearTargets: this.#onClearTargets\n    }\n  };\n\n  validateAndUpdateTargets() {\n    const targets = Array.from(game.user?.targets ?? []);\n    const actor = this.data.activity.actor;\n    const attackerToken = tokenForActor(actor);\n    let validTargets: Array<string> = [];\n    for (let target of targets) {\n      // Skip invalid targets\n      if (!isValidTarget(target)) continue;\n\n      // Skip targets that are excluded by workflow options (if present)\n      if (this.data.options?.workflowOptions?.excludeTargets && this.data.options.workflowOptions.excludeTargets?.includes(target.document.uuid)) continue;\n\n      // Skip targets that do not match the activity's target type\n      switch (this.data.activity.target?.affects?.type ?? \"any\") {\n        case \"enemy\":\n          if ((attackerToken?.document?.disposition ?? 1) * target.document.disposition >= 0) continue;\n          break;\n        case \"ally\":\n          if ((attackerToken?.document?.disposition ?? 1) * target.document.disposition < 0) continue;\n          break;\n        default: break;\n      }\n      validTargets.push(target.id);\n    }\n    updateUserTargets(validTargets);\n  }\n\n  async _prepareContext(options: ApplicationV2.RenderOptions) {\n    let context: Omit<typeof this.data, 'targets'> & ApplicationV2.RenderContext & {\n      blurb?: string;\n      buttons?: {\n        type?: string;\n        icon?: string;\n        label?: string;\n        action?: string;\n      }[]\n      targets: (Token.Implementation | {\n        name: string;\n        img: string;\n        displayedDisposition?: string;\n        details: string;\n        hasDetails: boolean;\n        uuid: string;\n      })[]\n    } = { ...this.data, ...await super._prepareContext(options) };\n    const targets = Array.from(game.user?.targets ?? []);\n    context.targets = [];\n    const actor = this.data.activity.actor;\n    const token = tokenForActor(actor);\n    for (let target of targets) {\n      // if (maxTargets && data.targets.length >= maxTargets) break;\n\n      // Note: no need to revaldiate targets, they are filtered before first render and each time token selection changes\n\n      let img = target.document.texture.src as string;\n      if (foundry.helpers.media.VideoHelper.hasVideoExtension(img)) {\n        img = await game.video?.createThumbnail(img as string, { width: 50, height: 50 }) ?? \"\";\n      }\n\n      let details: string[] = [];\n      if ([\"ceflanked\", \"ceflankedNoconga\", \"midiFlanked\", \"midiFlankedNoConga\"].includes(checkRule(\"checkFlanking\") as string)) {\n        if (token && await computeFlankingStatus(token, target)) details.push((i18n(\"midi-qol.Flanked\") ?? \"Flanked\"));\n      }\n\n      let attackerToken = token;\n      if (token && checkMechanic(\"checkRange\") !== \"none\" && ([\"mwak\", \"msak\", \"rwak\", \"rsak\", \"utility\", \"check\", \"save\", \"damage\"].includes(this.data.activity.actionType))) {\n        const { result, attackingToken } = checkActivityRange(this.data.activity, token, new Set([target]), false);\n        if (attackingToken) attackerToken = attackingToken;\n        switch (result) {\n          case \"normal\":\n            details.push(`${i18n(\"DND5E.RangeNormal\")}`);\n            break;\n          case \"dis\":\n            details.push(`${i18n(\"DND5E.RangeLong\")}`);\n            break;\n          case \"fail\":\n            details.push(`${i18n(\"midi-qol.OutOfRange\")}`);\n            break;\n        }\n      }\n      // Cover display: always check status-based cover (coverTotal etc.); only show \"No Cover\" when a cover module is configured\n      if (!activityHasAreaTarget(this.data.activity)) {\n        const hasCoverModule = typeof configSettings.optionalRules.coverCalculation === \"string\" && configSettings.optionalRules.coverCalculation !== \"none\";\n        const targetCover = attackerToken ? getCoverBonus(attackerToken, target, this.data.activity) : 0;\n        if (targetCover > 0 || hasCoverModule) {\n          switch (targetCover) {\n            case HALF_COVER:\n              details.push(`${i18n(\"DND5E.CoverHalf\")} ${i18n(\"DND5E.Cover\")}`);\n              break;\n            case THREE_QUARTERS_COVER:\n              details.push(`${i18n(\"DND5E.CoverThreeQuarters\")} ${i18n(\"DND5E.Cover\")}`);\n              break;\n            case TOTAL_COVER:\n              details.push(`${i18n(\"DND5E.CoverTotal\")} ${i18n(\"DND5E.Cover\")}`);\n              break;\n            case 0:\n              details.push(`${i18n(\"No\")} ${i18n(\"DND5E.Cover\")}`);\n              break;\n            default:\n              details.push(`+${targetCover} ${i18n(\"DND5E.Cover\")}`);\n              break;\n          }\n        }\n      }\n\n      let name: string;\n      if (game.user?.isGM) {\n        name = getTokenName(target);\n      } else {\n        name = getTokenPlayerName(target) ?? \"\";\n      }\n      const relativeDisposition = (token?.document.disposition ?? 0) * target.document.disposition;\n      let displayedDisposition: string | undefined = undefined;\n      if (target.document.disposition !== CONST.TOKEN_DISPOSITIONS.SECRET) {\n        if (relativeDisposition === CONST.TOKEN_DISPOSITIONS.FRIENDLY) {\n          displayedDisposition = i18n(\"TOKEN.DISPOSITION.FRIENDLY\");\n        } /*else if (relativeDisposition === CONST.TOKEN_DISPOSITIONS.NEUTRAL) {\n          displayedDisposition = i18n(\"TOKEN.DISPOSITION.NEUTRAL\");\n        } else if (relativeDisposition === CONST.TOKEN_DISPOSITIONS.HOSTILE) {\n          displayedDisposition = i18n(\"TOKEN.DISPOSITION.HOSTILE\");\n        }*/\n      }\n      context.targets.push({\n        name, // : name: game.user.isGM ? getLinkText(target.actor) : getTokenPlayerName(target),\n        img,\n        displayedDisposition,\n        details: details.join(\" - \"),\n        hasDetails: details.length > 0,\n        uuid: target.document.uuid\n      });\n    }\n    if (this.data.activity.target) {\n      if (this.data.maxTargets)\n        context.blurb = i18nFormat(\"midi-qol.TargetConfirmation.Blurb\", { targetCount: this.data.maxTargets, targetType: this.data.activity.target.affects.type || \"targets\" })\n      else context.blurb = i18n(\"midi-qol.TargetConfirmation.BlurbAny\");\n    }\n    context.buttons = [\n      { type: \"button\", icon: \"fa-solid fa-dice-d20\", label: \"DND5E.Roll\", action: \"roll\" },\n      { type: \"button\", icon: \"fa-solid fa-stop\", label: \"Cancel\", action: \"cancel\" },\n      { type: \"hidden\", icon: \"fa-solid fa-check\", label: \"Clear\", action: \"clearTargets\" }\n    ];\n    return context;\n  }\n\n  static #onRoll(this: TargetConfirmationDialog) {\n    if (this.data.maxTargets && (game.user?.targets?.size ?? 0) > this.data.maxTargets) {\n      ui.notifications?.warn(i18nFormat(\"midi-qol.wrongNumberTargets\", { allowedTargets: this.data.maxTargets }));\n      return;\n    }\n    this.doCallback(true);\n    this.close();\n  }\n\n  static #onCancel(this: TargetConfirmationDialog) {\n    this.doCallback(false);\n    this.close();\n  }\n\n  static #onClearTargets(this: TargetConfirmationDialog) {\n    updateUserTargets([]);\n    this.data.targets = [];\n    this.render();\n  }\n\n  async _onRender(context, options) {\n    await super._onRender(context, options);\n    if (canvas) {\n      // TODO: This doing anything? \n      let targetNames = this.element.getElementsByClassName(\"content-link midi-qol\");\n      for (let targetName of Array.from(targetNames)) {\n        targetName.addEventListener(\"click\", async (event) => {\n          event.stopPropagation();\n          // @ts-expect-error\n          const doc = await fromUuid(event.currentTarget?.dataset.uuid) as Actor | null;\n          //@ts-expect-error render not updated for v2 parameters\n          return doc?.sheet?.render({ force: true });\n        });\n      }\n      let imgs = this.element.getElementsByTagName(\"img\");\n      for (let i of Array.from(imgs)) {\n        i.style.border = 'none';\n        i.closest(\".midi-qol-box\")?.addEventListener(\"contextmenu\", (event) => {\n          const token = getToken(i.id);\n          if (token) {\n            token.setTarget(false, { user: game.user, releaseOthers: false, groupSelection: true });\n            this.render();\n          }\n        });\n        i.closest(\".midi-qol-box\")?.addEventListener('click', async function () {\n          const token = getToken(i.id);\n          if (token) await canvas.ping(token.center);\n        });\n        i.closest(\".midi-qol-box\")?.addEventListener('mouseover', function () {\n          const token = getToken(i.id);\n          if (token) {\n            token.hover = true;\n            token.refresh();\n          }\n        });\n        i.closest(\".midi-qol-box\")?.addEventListener('mouseout', function () {\n          const token = getToken(i.id);\n          if (token) {\n            token.hover = false;\n            token.refresh();\n          }\n        });\n      }\n    }\n  }\n\n  close(options = {}) {\n    Hooks.off(\"targetToken\", this.hookId);\n    this.doCallback(false);\n    return super.close(options);\n  }\n\n  #callbackFired = false;\n  doCallback(value = false) {\n    // close() always calls doCallback(false) - only the first call (e.g. roll) may win\n    if (this.#callbackFired) return;\n    this.#callbackFired = true;\n    try {\n      if (this.callback) this.callback(value);\n    } catch (err) {\n      const message = `TargetConfirmation | calling callback failed`;\n      TroubleShooter.recordError(err, message);\n      error(message, err);\n    }\n  }\n}\n\nexport type TargetConfirmationOptions = Partial<ApplicationV2.Configuration> & {\n  callback?: (value: unknown) => void;\n  workflowOptions?: WorkflowOptions;\n}\n","import { Activity, ActivityUseConfiguration, RollMessageConfig, TokenOrDocument } from \"../../globals.js\";\nimport { MODULE_ID, debugEnabled, warn, error } from \"../../midi-qol.js\";\nimport { Workflow } from \"../Workflow.js\";\nimport { TargetConfirmationDialog, TargetConfirmationOptions } from \"../apps/TargetConfirmation.js\";\nimport { configSettings, safeGetGameSetting, targetConfirmation } from \"../settings.js\";\nimport { installedModules } from \"../setupModules.js\";\nimport { getFlankingEffect, CERemoveEffect, sumRolls, evalActivationCondition, computeTemplateShapeDistance, getToken, checkActivityRange, checkDefeated, checkIncapacitated, computeCoverBonus, getSpeaker, hasWallBlockingCondition, isValidTarget, tokenForActor, activityHasAreaTarget, activityHasAutoPlaceTemplate, activityHasEmanationNoTemplate, getActivityAutoTargetAction, getAoETargetType, doReactions, getUnitDist, updateUserTargets, MidiOptions } from \"../utils.js\";\nimport { allAttackTypes } from \"../../midi-qol.js\";\nconst { DialogV2 } = foundry.applications.api;\nimport Token = foundry.canvas.placeables.Token;\n\n// Target types that represent discrete creatures (not areas)\nconst creatureTargetTypes = [\"creature\", \"enemy\", \"ally\", \"willing\"];\n\n/**\n * Determines if the enforceSingleWeaponTarget setting should apply to this activity.\n * Returns false for emanation/AoE activities that naturally target multiple creatures.\n * @param activity The activity to check\n * @returns true if single target should be enforced\n */\nexport function shouldEnforceSingleTarget(activity: Activity): boolean {\n  if (!configSettings.enforceSingleWeaponTarget) return false;\n  if (!allAttackTypes.includes(activity.actionType)) return false;\n\n  // Don't enforce for emanation or AoE targeting - these naturally target multiple creatures\n  const isEmanationTargeting = activityHasAutoPlaceTemplate(activity) || activityHasEmanationNoTemplate(activity);\n  const isAoETargeting = !isEmanationTargeting && activityHasAreaTarget(activity);\n  if (isEmanationTargeting || isAoETargeting) return false;\n\n  // If an explicit target count is set, respect it instead of enforcing single target\n  const hasExplicitCount = activity.target?.affects?.count && activity.target.affects.count !== \"\";\n  if (hasExplicitCount) return false;\n\n  // Enforce for creature-like target types, or when there's no target specification at all\n  const affectsType = activity.target?.affects?.type;\n  return !affectsType || creatureTargetTypes.includes(affectsType);\n}\n\nexport async function confirmWorkflow(existingWorkflow: Workflow): Promise<boolean> {\n  const validStates = [existingWorkflow.WorkflowState_Completed, existingWorkflow.WorkflowState_Start, existingWorkflow.WorkflowState_RollFinished]\n  if (existingWorkflow.currentAction === existingWorkflow.WorkflowState_NoAction) return true;\n  if (!(validStates.includes(existingWorkflow.currentAction!))) {// && configSettings.confirmAttackDamage !== \"none\") {\n    if (configSettings.autoCompleteWorkflow) {\n      existingWorkflow.aborted = true;\n      await existingWorkflow.performState(existingWorkflow.WorkflowState_Cleanup);\n      await Workflow.removeWorkflow(existingWorkflow.id);\n    } else if (existingWorkflow.currentAction === existingWorkflow.WorkflowState_WaitForDamageRoll && existingWorkflow.hitTargets.size === 0) {\n      existingWorkflow.aborted = true;\n      await existingWorkflow.performState(existingWorkflow.WorkflowState_Cleanup);\n    } else {\n      switch (await DialogV2.wait({\n        window: { title: game.i18n?.format(\"midi-qol.WaitingForPreviousWorkflow\", { name: existingWorkflow.activity.name ?? \"\" }) },\n        content: game.i18n?.localize(\"midi-qol.ResolvePreviousWorkflow\"),\n        rejectClose: false,\n        close: () => { return false },\n        buttons: [\n          { action: \"complete\", label: `<i class=\"fas fa-check\"></i> Complete previous`, callback: () => { return \"complete\" } },\n          { action: \"discard\", label: `<i class=\"fas fa-trash\"></i> Discard previous`, callback: () => { return \"discard\" } },\n          { action: \"undo\", label: `<i class=\"fas fa-arrow-rotate-left\"></i> Undo until previous`, callback: () => { return \"undo\" } },\n          { action: \"cancel\", default: true, label: `<i class=\"fas fa-xmark\"></i> Cancel New`, callback: () => { return \"cancel\" } }\n        ],\n      })) {\n        case \"complete\":\n          await existingWorkflow.performState(existingWorkflow.WorkflowState_Cleanup);\n          await Workflow.removeWorkflow(existingWorkflow.id);\n          break;\n        case \"discard\":\n          await existingWorkflow.performState(existingWorkflow.WorkflowState_Abort);\n          Workflow.removeWorkflow(existingWorkflow.id);\n          break;\n        case \"undo\":\n          await existingWorkflow.performState(existingWorkflow.WorkflowState_Cancel);\n          Workflow.removeWorkflow(existingWorkflow.id);\n          break;\n        case \"cancel\":\n        default:\n          return false;\n      }\n    }\n  }\n  return true;\n}\nexport async function removeFlanking(actor: Actor.Implementation): Promise<void> {\n  let CEFlanking = getFlankingEffect();\n  if (CEFlanking && CEFlanking.name) await CERemoveEffect({ effectName: CEFlanking.name, uuid: actor.uuid });\n}\n\n//\nexport function setDamageRollMinTerms(rolls?: Roll[]) {\n  if (rolls && sumRolls(rolls)) {\n    for (let roll of rolls) {\n      for (let term of roll.terms) {\n        // I don't like the default display and it does not look good for dice so nice - fiddle the results for maximised rolls\n        if (term instanceof foundry.dice.terms.Die && term.modifiers.includes(`min${term.faces}`)) {\n          for (let result of term.results) {\n            result.result = term.faces ?? 1;\n          }\n        }\n      }\n    }\n  }\n}\n\nexport async function doActivityReactions(activity: Activity, workflow: Workflow) {\n  const promises: Promise<{\n    name?: string;\n    uuid?: string;\n    ac?: number;\n  }>[] = [];\n  if (!foundry.utils.getProperty(activity, `flags.${MODULE_ID}.noProvokeReaction`) && !workflow?.workflowOptions.noProvokeReaction) {\n    for (let targetToken of workflow.targets) {\n      promises.push((async () => {\n        const result = await doReactions(targetToken, workflow.tokenUuid, null, \"reactionpreattack\", { item: activity.item, workflow, workflowOptions: foundry.utils.mergeObject(workflow.workflowOptions, { sourceActorUuid: activity.actor?.uuid, sourceItemUuid: activity.item?.uuid }, { inplace: false, overwrite: true }) });\n        if (result.name) {\n          targetToken.actor?.reset();\n          workflow.actor.reset();\n          // targetToken.actor?.prepareData(); // allow for any items applied to the actor - like shield spell\n        }\n        return result;\n      })());\n    }\n  }\n  return await Promise.all(promises);\n}\n\nexport function preActivityConsumptionHook(activity: Activity, usageConfig: ActivityUseConfiguration, messageConfig: RollMessageConfig): boolean {\n  // console.error(\"preActivityConsumptionHook\", activity, usageConfig, messageConfig);\n  return true;\n}\n\nexport function activityConsumptionHook(activity: Activity, usageConfig: ActivityUseConfiguration, messageConfig: RollMessageConfig, updates: unknown): boolean {\n  // console.error(\"activityConsumptionHook\", activity, usageConfig, messageConfig, updates);\n  return true;\n}\n\n/**\n * Check if an activity's target count is a formula (not a plain number or blank).\n * By the time this runs, prepareFinalData has already evaluated the formula to a number,\n * so we check the raw _source data for the original formula string.\n * If activity.target.override is true, the formula lives on the activity;\n * otherwise it's inherited from the item via _setOverride.\n * A formula-based count means the target count may change with scaling or other roll data,\n * so target confirmation should be deferred until after the consumption dialog.\n */\nexport function activityHasScaledTargetCount(activity: Activity): boolean {\n  // @ts-expect-error no dnd5e-types - override is added by dnd5e's _setOverride, _source is raw DataModel source\n  const sourceCount = activity.target?.override\n    // @ts-expect-error no dnd5e-types\n    ? activity._source?.target?.affects?.count\n    // @ts-expect-error no dnd5e-types\n    : activity.item?.system?._source?.target?.affects?.count;\n  // Blank or missing means no explicit count (infinite targets) — not scaled.\n  // A plain numeric string like \"3\" is already resolved — not scaled.\n  // Anything else is a formula that may depend on roll data — treat as scaled.\n  if (typeof sourceCount !== \"string\" || sourceCount === \"\") return false;\n  return /[^0-9.]/.test(sourceCount);\n}\n\nfunction activityRequiresPostTemplateConfirmation(activity: Activity): boolean {\n  // const isRangeTargeting = [\"ft\", \"m\"].includes(activity.range?.units) && [\"creature\", \"ally\", \"enemy\"].includes(activity.target?.affects.type);\n  if (activity.target?.template?.type) {\n    return true;\n    //  } else if (isRangeTargeting) {\n    //    return true;\n  }\n  if (activityHasScaledTargetCount(activity)) return true;\n  return false;\n}\n\nfunction itemRequiresPostTemplateConfirmation(activity: Activity): boolean {\n  // @ts-expect-error no dnd5e-types\n  const isRangeTargeting = [\"ft\", \"m\"].includes(activity.item.system.range?.units) && [\"creature\", \"ally\", \"enemy\"].includes(activity.target?.affects.type);\n  if (activity.target?.template?.type) {\n    return true;\n  } else if (isRangeTargeting) {\n    return true;\n  }\n  return false;\n}\n\nexport function requiresTargetConfirmation(activity: Activity, options: MidiOptions): boolean {\n  // if (!activity.item) debugger;\n  // fix for very silly value choice in midi properties.\n  if ([\"none\", \"never\"].includes(options.workflowOptions?.targetConfirmation ?? \"\")) return false;\n  if (options.workflowOptions?.targetConfirmation === \"always\") return true;\n  if ([\"enchant\", \"summon\"].includes(activity.type)) return false;\n  if (activity.target?.affects?.choice) return true;\n  if ([\"\", \"self\", undefined].includes(activity.target?.affects?.type) && [\"\", undefined, \"self\"].includes(activity.range?.units)) return false;\n  if (activity.target?.affects.type === \"self\") return false;\n  if (options.workflowOptions?.attackPerTarget === true) return false;\n  if ((activity.forcedTargetConfirmation ?? activity.midiProperties?.confirmTargets) === \"always\") return true;\n  if ((activity.forcedTargetConfirmation ?? activity.midiProperties?.confirmTargets) === \"never\") return false;\n  if (targetConfirmation.noneTargeted && ((activity.target?.affects.type ?? \"\") !== \"\" || activity.attack) && (game.user?.targets?.size ?? 0) === 0)\n    return true;\n  let numTargets = game.user?.targets?.size ?? 0;\n  // @ts-expect-error no dnd5e-types\n  if (numTargets === 0 && activity.item.type === \"weapon\" && shouldEnforceSingleTarget(activity))\n    numTargets = 1;\n  const token = tokenForActor(activity.actor);\n  if (targetConfirmation.enabled) {\n    if (targetConfirmation.always && (activity.target?.affects.type ?? \"\") !== \"self\") {\n      if (debugEnabled > 0) warn(\"target confirmation triggered from targetConfirmation.always\");\n      return true;\n    }\n    if (activity.attack && targetConfirmation.hasAttack) {\n      if (debugEnabled > 0) warn(\"target confirmation triggered by targetConfirmation.hasAttack\");\n      return true;\n    }\n    if (activity.target?.affects.type === \"creature\" && targetConfirmation.hasCreatureTarget) {\n      if (debugEnabled > 0) warn(\"target confirmation triggered from targetConfirmation.hasCreatureTarget\");\n      return true;\n    }\n    if (targetConfirmation.noneTargeted && ((activity.target?.affects.type ?? \"\") !== \"\" || activity.attack) && numTargets === 0) {\n      if (debugEnabled > 0) warn(\"target confirmation triggered from targetConfirmation.noneTargeted\");\n      return true;\n    }\n    if (targetConfirmation.allies && token && numTargets > 0 && activity.target?.affects.type !== \"self\") {\n      if (game.user?.targets.some(t => t.document.disposition == token.document.disposition)) {\n        if (debugEnabled > 0) warn(\"target confirmation triggered from targetConfirmation.allies\");\n        return true;\n      }\n    }\n    if (targetConfirmation.targetSelf && activity.target?.affects.type !== \"self\") {\n      let tokenToUse = token;\n      /*\n      if (tokenToUse && game.user?.targets) {\n        const { result, attackingToken } = checkActivityRange(activity, tokenToUse, new Set(game.user?.targets))\n        if (speaker.token && result === \"fail\")\n          tokenToUse = undefined; \n        else tokenToUse = attackingToken;\n      }\n      */\n      if (tokenToUse && game.user?.targets?.has(tokenToUse)) {\n        if (debugEnabled > 0) warn(\"target confirmation triggered by has targetConfirmation.targetSelf\");\n        return true;\n      }\n    }\n    if (targetConfirmation.mixedDisposition && numTargets > 0 && game.user?.targets) {\n      const dispositions = new Set();\n      for (let target of game.user?.targets) {\n        if (target) dispositions.add(target.document.disposition);\n      }\n      if (dispositions.size > 1) {\n        if (debugEnabled > 0) warn(\"target confirmation triggered from targetConfirmation.mixedDisposition\");\n        return true;\n      }\n    }\n    if (targetConfirmation.longRange && game.user?.targets && numTargets > 0 &&\n      // @ts-expect-error no dnd5e-types\n      ([\"ft\", \"m\"].includes(activity.item.system.range?.units) || activity.item.system.range?.type === \"touch\")) {\n      if (token) {\n        for (let target of game.user?.targets) {\n          const { result, attackingToken } = checkActivityRange(activity, token, new Set([target]))\n          if (result !== \"normal\") {\n            if (debugEnabled > 0) warn(\"target confirmation triggered from targetConfirmation.longRange\");\n            return true;\n          }\n        }\n      }\n    }\n    if (targetConfirmation.inCover && numTargets > 0 && token && game.user?.targets) {\n      const isRangeTargeting = [\"ft\", \"m\"].includes(activity.range?.units ?? \"\") && [\"creature\", \"ally\", \"enemy\"].includes(activity.target?.affects?.type ?? \"\");\n      if (!activity.target?.template?.type && !isRangeTargeting && token) {\n        for (let target of game.user?.targets) {\n          if (computeCoverBonus(token, target, activity) > 0) {\n            if (debugEnabled > 0) warn(\"target confirmation triggered from targetConfirmation.inCover\");\n            return true;\n          }\n        }\n      }\n    }\n    const isRangeTargeting = [\"ft\", \"m\"].includes(activity.range?.units ?? \"\") && [\"creature\", \"ally\", \"enemy\"].includes(activity.target?.affects.type ?? \"\");\n    if (activity.target?.template?.type && (targetConfirmation.hasAoE)) {\n      if (debugEnabled > 0) warn(\"target confirmation triggered by targetConfirmation.hasAoE\")\n      return true;\n    } else if (isRangeTargeting && (targetConfirmation.hasRangedAoE)) {\n      if (debugEnabled > 0) warn(\"target confirmation triggered by has targetConfirmation.hasRangedAoE\");\n      return true;\n    }\n  }\n  return false;\n}\n\nexport async function preTemplateTargets(activity: Activity, options: MidiOptions): Promise<boolean> {\n  if (activityRequiresPostTemplateConfirmation(activity)) return true;\n  if (requiresTargetConfirmation(activity, options))\n    return await resolveTargetConfirmation(activity, options) === true;\n  return true;\n}\n\nexport async function postTemplateConfirmTargets(activity: Activity, options: MidiOptions, workflow: Workflow): Promise<boolean> {\n  const updateTargets = async () => {\n    const needCanSeeSense = game.user?.targets && !workflow.targets.equals(new Set(game.user?.targets));\n    workflow.setTargets(new Set(game.user?.targets));\n    if (needCanSeeSense) await workflow.activity.setupCanSeeSense({ workflow });\n  }\n  // Only show confirmation here if the activity deferred from pre-template\n  // (i.e. it has a template or scaled target count). Otherwise preTemplateTargets\n  // already handled confirmation and we just need to sync targets.\n  if (activityRequiresPostTemplateConfirmation(activity) && requiresTargetConfirmation(activity, options)) {\n    const result = await resolveTargetConfirmation(activity, options);\n    if (result && game.user?.targets) {\n      await updateTargets();\n    }\n    return result === true;\n  }\n  // Only sync targets from game.user.targets when the activity has a template or\n  // scaled target count — these need post-template syncing because dnd5e auto-targets\n  // tokens inside the template. For non-template activities, targets were already set\n  // in setupTargets and must not be overwritten from game.user.targets (which may have\n  // been changed by concurrent effects during the async workflow state transitions).\n  if (activityRequiresPostTemplateConfirmation(activity) && game.user?.targets) {\n    await updateTargets();\n  }\n  return true;\n}\n\nexport async function resolveTargetConfirmation(activity: Activity, options: TargetConfirmationOptions = {}): Promise<boolean> {\n  if (!canvas.tokens?.active) {\n    await canvas.tokens?.activate();\n  }\n  // TODO looks like fvtt-types is broken for scene controls\n  const uiControls = ui.controls as any;\n  const savedControl = uiControls?.control;\n  const savedTool = uiControls?.tool;\n  const tokenControl = uiControls?.controls.tokens;\n  const tokenTargetTool = tokenControl?.tools?.target;\n  await uiControls?.activate({ control: tokenControl.name, tool: tokenTargetTool.name });\n  const wasMaximized = !((activity.actor?.sheet as foundry.applications.api.ApplicationV2)?.minimized);\n  // Hide the sheet that originated the preview\n  if (wasMaximized) await activity.actor?.sheet?.minimize();\n\n  let targets = new Promise((resolve, reject) => {\n    // no timeout since there is a dialog to close\n    // create target dialog which updates the target display\n    options ??= {};\n    options.callback = resolve;\n    new TargetConfirmationDialog(activity.actor!, activity, game.user!, options).render({ force: true });\n  });\n  let shouldContinue = await targets;\n  for (let token of canvas.tokens?.placeables ?? []) token.initializeVisionSource();\n  if (savedTool) await ui.controls?.activate({ control: savedControl.name, tool: savedTool.name });\n\n\n  if (wasMaximized) await activity.actor?.sheet?.maximize();\n  return !!shouldContinue;\n}\n\nexport async function showItemInfo(this: Item.Implementation): Promise<ChatMessage.Implementation | undefined> {\n  const token = this.actor?.token;\n\n  const templateData = {\n    actor: this.actor,\n    // tokenId: token?.id,\n    tokenId: token?.uuid,\n    tokenUuid: token?.uuid,\n    item: this,\n    itemUuid: this.uuid,\n    // @ts-expect-error no dnd5e-types\n    data: await this.system.getCardData(),\n    // @ts-expect-error no dnd5e-types\n    labels: this.labels,\n    condensed: false,\n    hasAttack: false,\n    isHealing: false,\n    hasDamage: false,\n    // @ts-expect-error no dnd5e-types\n    isSpell: this.type === \"spell\",\n    isPower: false,\n    hasSave: false,\n    hasAreaTarget: false,\n    hasAttackRoll: false,\n    configSettings,\n    hideItemDetails: false,\n    hasEffects: false,\n    isMerge: false,\n  };\n\n  const templateType = [\"tool\"].includes(this.type) ? this.type : \"item\";\n  const template = `modules/midi-qol/templates/${templateType}-card.hbs`;\n  const html = await foundry.applications.handlebars.renderTemplate(template, templateData);\n\n  const chatData: ChatMessage.CreateData = {\n    content: html,\n    // @ts-expect-error no dnd5e-types\n    flavor: this.system.chatFlavor || this.name,\n    speaker: getSpeaker(this.actor!),\n    flags: {\n      \"core\": { \"canPopout\": true }\n    }\n  };\n  chatData.style = CONST.CHAT_MESSAGE_STYLES.OTHER;\n\n  // Toggle default roll mode\n  let rollMode = safeGetGameSetting(\"core\", \"rollMode\") ?? \"public\";\n  if ([\"gmroll\", \"blindroll\"].includes(rollMode)) chatData[\"whisper\"] = ChatMessage.getWhisperRecipients(\"GM\").filter(u => u.active);\n  if (rollMode === \"blindroll\") chatData[\"blind\"] = true;\n  if (rollMode === \"selfroll\") chatData[\"whisper\"] = [game.user?.id];\n\n  // Create the chat message\n  return ChatMessage.create(chatData);\n}\n\nfunction isTokenInside(template: foundry.canvas.placeables.MeasuredTemplate.Implementation, token: Token.Implementation, wallsBlockTargeting: boolean): boolean {\n  const grid = canvas.scene?.grid;\n  if (!grid) return false;\n  const templatePos = { x: template.document.x, y: template.document.y };\n  if (configSettings.optionalRules.wallsBlockRange !== \"none\" && hasWallBlockingCondition(token))\n    return false;\n  if (!isValidTarget(token)) return false;\n\n  // TODO: This can be vastly simplified, _IF_ we can assume gridded scenes\n  // Check for center of each square the token uses.\n  // e.g. for large tokens all 4 squares\n  const startX = token.document.width >= 1 ? 0.5 : (token.document.width / 2);\n  const startY = token.document.height >= 1 ? 0.5 : (token.document.height / 2);\n  for (let x = startX; x < token.document.width; x++) {\n    for (let y = startY; y < token.document.height; y++) {\n      const currGrid = {\n        x: token.x + x * grid.size! - templatePos.x,\n        y: token.y + y * grid.size! - templatePos.y,\n      };\n      let contains = template.shape?.contains(currGrid.x, currGrid.y);\n      if (contains && wallsBlockTargeting) {\n        let tx = templatePos.x;\n        let ty = templatePos.y;\n        if (template.shape instanceof PIXI.Rectangle) {\n          tx = tx + template.shape.width / 2;\n          ty = ty + template.shape.height / 2;\n        }\n        const r = new foundry.canvas.geometry.Ray({ x: tx, y: ty }, { x: currGrid.x + templatePos.x, y: currGrid.y + templatePos.y });\n\n        // If volumetric templates installed always leave targeting to it.\n        if (\n          configSettings.optionalRules.wallsBlockRange === \"centerLevels\"\n          && installedModules.get(\"levels\")\n          && !installedModules.get(\"levelsvolumetrictemplates\")) {\n          let p1 = {\n            x: currGrid.x + templatePos.x, y: currGrid.y + templatePos.y,\n            z: token.document.elevation\n          }\n          // installedModules.get(\"levels\").lastTokenForTemplate.elevation no longer defined\n          //@ts-expect-error no levels types\n          const { elevation } = CONFIG.Levels.handlers.TemplateHandler.getTemplateData(false)\n          let p2 = {\n            x: tx, y: ty,\n            z: elevation as number\n          }\n          contains = getUnitDist(p2.x, p2.y, p2.z, token) <= template.document.distance;\n          //@ts-expect-error no levels types\n          contains = contains && !CONFIG.Levels?.API?.testCollision(p1, p2, \"collision\");\n        } else if (!installedModules.get(\"levelsvolumetrictemplates\")) {\n          contains = !CONFIG.Canvas.polygonBackends.sight.testCollision({ x: tx, y: ty }, { x: currGrid.x + templatePos.x, y: currGrid.y + templatePos.y }, { mode: \"any\", type: \"move\" })\n        }\n      }\n      // Check the distance from origin.\n      if (contains) return true;\n    }\n  }\n  return false;\n}\nexport function isAoETargetable(targetToken: Token.Implementation, options: { selfToken?: TokenOrDocument | string | null | undefined, ignoreSelf?: boolean, AoETargetType?: string, autoTarget?: string } = { ignoreSelf: false, AoETargetType: \"any\" }): boolean {\n  if (!isValidTarget(targetToken)) return false;\n  const autoTarget = options.autoTarget ?? configSettings.autoTarget;\n  const selfToken = getToken(options.selfToken);\n  if ([\"wallsBlockIgnoreIncapacitated\", \"alwaysIgnoreIncapacitated\"].includes(autoTarget) && checkIncapacitated(targetToken.actor, false, false)) return false;\n  if ([\"wallsBlockIgnoreDefeated\", \"alwaysIgnoreDefeated\"].includes(autoTarget) && checkDefeated(targetToken)) return false;\n  if (targetToken.document.uuid === selfToken?.document.uuid && options.ignoreSelf) return false;\n  const selfDisposition = selfToken?.document.disposition ?? 1;\n  switch (options.AoETargetType) {\n    case \"any\":\n      return true;\n    case \"ally\":\n      return targetToken.document.disposition === selfDisposition;\n    case \"notAlly\":\n      return targetToken.document.disposition !== selfDisposition\n    case \"enemy\":\n      return targetToken.document.disposition === -selfDisposition || targetToken.document.disposition == CONST.TOKEN_DISPOSITIONS.SECRET;\n    case \"notEnemy\":\n      return targetToken.document.disposition !== -selfDisposition && targetToken.document.disposition !== CONST.TOKEN_DISPOSITIONS.SECRET;\n    case \"neutral\":\n      return targetToken.document.disposition === CONST.TOKEN_DISPOSITIONS.NEUTRAL;\n    case \"notNeutral\":\n      return targetToken.document.disposition !== CONST.TOKEN_DISPOSITIONS.NEUTRAL;\n    case \"friendly\":\n      return targetToken.document.disposition === CONST.TOKEN_DISPOSITIONS.FRIENDLY;\n    case \"notFriendly\":\n      return targetToken.document.disposition !== CONST.TOKEN_DISPOSITIONS.FRIENDLY;\n    case \"hostile\":\n      return targetToken.document.disposition === CONST.TOKEN_DISPOSITIONS.HOSTILE || targetToken.document.disposition == CONST.TOKEN_DISPOSITIONS.SECRET;\n    case \"notHostile\":\n      return targetToken.document.disposition !== CONST.TOKEN_DISPOSITIONS.HOSTILE && targetToken.document.disposition !== CONST.TOKEN_DISPOSITIONS.SECRET;\n    default:\n      return true;\n  }\n}\n\nexport function selectTargetsFromTemplates(\n  templates: (foundry.canvas.placeables.MeasuredTemplate.Implementation | MeasuredTemplateDocument | string)[],\n  selfTokenRef: TokenOrDocument | string | null | undefined = \"\",\n  ignoreSelf: boolean = false,\n  AoETargetType: string = \"any\",\n  autoTarget?: string\n): Token.Implementation[] {\n  const tokens = computeTargetsFromTemplates(templates, selfTokenRef, ignoreSelf, AoETargetType, autoTarget);\n  const targetIds = tokens.map(t => t.id).filter(Boolean) as string[];\n  updateUserTargets(targetIds);\n  return tokens;\n}\n\n\n/**\n * Returns tokens inside a template without modifying game.user.targets.\n * Accepts a MeasuredTemplate placeable, a MeasuredTemplateDocument, or a UUID string.\n * Handles WalledTemplates, VolumetricTemplates, and standard template targeting.\n * Note: When VolumetricTemplates is active, game.user.targets may be modified as a\n * side effect of compute3Dtemplate — the returned array is still the authoritative result.\n */\nexport function computeTargetsFromTemplate(\n  template: foundry.canvas.placeables.MeasuredTemplate.Implementation | MeasuredTemplateDocument | string,\n  selfTokenRef: TokenOrDocument | string | null | undefined = \"\",\n  ignoreSelf: boolean = false,\n  AoETargetType: string = \"any\",\n  autoTarget?: string\n): Token.Implementation[] {\n  if (!autoTarget) autoTarget = configSettings.autoTarget;\n  if (autoTarget === \"none\") return [];\n\n  // Resolve to a MeasuredTemplate placeable\n  let mTemplate: foundry.canvas.placeables.MeasuredTemplate.Implementation | undefined;\n  if (typeof template === \"string\") {\n    const tDoc = fromUuidSync(template) as MeasuredTemplateDocument | null;\n    mTemplate = tDoc?.object ?? undefined;\n  } else if (template instanceof MeasuredTemplateDocument) {\n    mTemplate = template.object ?? undefined;\n  } else {\n    mTemplate = template;\n  }\n  if (!mTemplate) return [];\n\n  const useWalledTemplates = autoTarget === \"walledtemplates\" && game.modules.get(\"walledtemplates\")?.active;\n  if (!useWalledTemplates) {\n    // For cones/rays during preview, the shape may be stale (computed with old direction)\n    const templateType = mTemplate.document.t;\n    if (templateType === \"cone\" || templateType === \"ray\" || !mTemplate.shape) {\n      const { shape } = computeTemplateShapeDistance(mTemplate.document);\n      mTemplate.shape = shape;\n    }\n  }\n\n  const selfToken = getToken(selfTokenRef);\n  let targetTokens: Token.Implementation[] = [];\n\n  if (installedModules.get(\"levelsvolumetrictemplates\")) {\n    const tokensToCheck = canvas.tokens?.placeables?.filter(tk =>\n      isAoETargetable(tk, { selfToken, ignoreSelf, AoETargetType, autoTarget })\n    );\n    //@ts-expect-error VolumetricTemplates\n    VolumetricTemplates.compute3Dtemplate(mTemplate, tokensToCheck);\n    targetTokens = Array.from(game.user?.targets ?? []);\n  } else if (useWalledTemplates) {\n    //@ts-expect-error walledtemplates\n    targetTokens = (mTemplate.targetsWithinShape) ? mTemplate.targetsWithinShape() : [];\n    targetTokens = targetTokens.filter(token => isAoETargetable(token, { selfToken, ignoreSelf, AoETargetType, autoTarget }));\n  } else {\n    const wallsBlockTargeting = [\"wallsBlock\", \"wallsBlockIgnoreDefeated\", \"wallsBlockIgnoreIncapacitated\"].includes(autoTarget);\n    for (const token of (canvas.tokens?.placeables ?? [])) {\n      if (!isAoETargetable(token, { selfToken, ignoreSelf, AoETargetType, autoTarget })) continue;\n      if (token.actor && isTokenInside(mTemplate, token, wallsBlockTargeting)) {\n        if (token.id) {\n          targetTokens.push(token);\n        }\n      }\n    }\n  }\n  return targetTokens;\n}\n\nexport function computeTargetsFromTemplates(\n  templates: (foundry.canvas.placeables.MeasuredTemplate.Implementation | MeasuredTemplateDocument | string)[],\n  selfTokenRef: TokenOrDocument | string | null | undefined = \"\",\n  ignoreSelf: boolean = false,\n  AoETargetType: string = \"any\",\n  autoTarget?: string\n): Token.Implementation[] {\n  const allTargetTokens: Set<Token.Implementation> = new Set();\n\n  for (const template of templates) {\n    const tokens = computeTargetsFromTemplate(template, selfTokenRef, ignoreSelf, AoETargetType, autoTarget);\n    tokens.forEach(t => allTargetTokens.add(t));\n  }\n  return Array.from(allTargetTokens);\n}\n\n// If we are blocking the roll let anyone waiting on the roll know it is complete\nfunction blockRoll(item, workflow) {\n  if (item) {\n    if (workflow) workflow.aborted = true;\n    let hookName = `midi-qol.RollComplete.${item?.uuid}`;\n    //@ts-expect-error\n    Hooks.callAll(hookName, workflow)\n  }\n  return false;\n}\n\n/**\n * Get currently selected tokens in the scene or user's character's tokens.\n * @returns {Token5e[]}\n */\n\n\nexport function getSceneTargets(): Token.Implementation[] {\n  return globalThis.dnd5e.utils.getSceneTargets();\n}","import { Activity, ActivityUseConfiguration, RollDialogConfig, DND5ETargetDescriptor, RollMessageConfig, RollProcessConfig } from \"../../globals.js\";\nimport { GameSystemConfig, MODULE_ID, allAttackTypes, debugEnabled, error, i18n, i18nFormat, warn, busyWait, getHealingLabel } from \"../../midi-qol.js\";\nimport { socketlibSocket } from \"../GMAction.js\";\nimport { ActiveDefenceWorkflow, AugmentedEvent, TrapWorkflow, Workflow, SavesFirstWorkflow } from \"../Workflow.js\";\nimport { OnUseMacros } from \"../apps/Item.js\";\nimport { TroubleShooter } from \"../apps/TroubleShooter.js\";\nimport { ConditionEditor } from \"../apps/ConditionEditor.js\";\nimport { averageDice, skipConcentrationActorUuids } from \"../patching.js\"\nimport {\n  aoeTargetTypeOptions,\n  autoCEEffectsOptions,\n  autoTargetOptions,\n  checkMechanic,\n  checkRule,\n  configSettings,\n  confirmTargetOptions,\n  getIgnoreTraitsOptions,\n  removeButtonsOptions,\n  safeGetGameSetting,\n  triggeredActivityRollAsOptions,\n  triggeredActivityTargetOptions,\n  rollConfigOptions,\n  consumeConfigOptions,\n  damageConfigOptions\n} from \"../settings.js\";\nimport { installedModules } from \"../setupModules.js\";\nimport { saveUndoData } from \"../undo.js\";\nimport {\n  activityHasAreaTarget,\n  callActivityHooks,\n  canSee,\n  canSense,\n  checkActivityRange,\n  checkIncapacitated,\n  createConditionData,\n  displayDSNForRoll,\n  evalActivationCondition,\n  evalCondition,\n  getAutoRollAttack,\n  getAutoRollDamage,\n  getDistance,\n  getRemoveAttackButtons,\n  getRemoveDamageButtons,\n  getSpeaker,\n  getToken,\n  activityHasAutoPlaceTemplate,\n  hasUsedBonusAction,\n  hasUsedReaction,\n  initializeVision,\n  autoConsumeResource,\n  isInCombat,\n  logIncapacitatedCheckResult,\n  needsBonusActionCheck,\n  needsReactionCheck,\n  setBonusActionUsed,\n  setReactionUsed,\n  sumRolls,\n  tokenForActor,\n  getOrCreateTokenForActor,\n  validTargetTokens,\n  activityHasEmanationNoTemplate,\n  getActivityAutoTargetAction,\n  areMidiKeysPressed,\n  getActor,\n  setRangedTargets,\n  updateUserTargets,\n  isValidTarget,\n  needsAOOCheck,\n  addRollTo,\n  pushTargetSave,\n  popTargetSave,\n  clearTargetSave,\n  getConsumptionData,\n} from \"../utils.js\";\nimport { activityHasScaledTargetCount, preTemplateTargets, removeFlanking, requiresTargetConfirmation, selectTargetsFromTemplates, setDamageRollMinTerms, shouldEnforceSingleTarget } from \"./activityHelpers.js\";\n\nexport class MidiConditionField extends globalThis.dnd5e.dataModels.fields.FormulaField {\n  _validateType(value: unknown) {\n    return typeof value === \"string\";\n  }\n  constructor(options: any) {\n    super(options);\n  }\n  static get _defaults(): any {\n    return foundry.utils.mergeObject(super._defaults, {\n      deterministic: false\n    });\n  }\n\n  /**\n   * Override _toInput to wrap the text input with a condition editor button.\n   * The button opens the ConditionEditor which provides autocomplete for condition expressions.\n   */\n  _toInput(config: any): HTMLElement {\n    // Get the standard text input from parent\n    const input = super._toInput(config) as HTMLInputElement;\n\n    if (!configSettings.conditionEditorEnabled) return input;\n\n    // Create wrapper container\n    const wrapper = document.createElement(\"div\");\n    wrapper.classList.add(\"midi-condition-field-wrapper\");\n    wrapper.appendChild(input);\n\n    // Create editor button using data-action pattern (event listeners don't survive Handlebars outerHTML serialization)\n    const fieldName = config.name ?? this.name;\n    const fieldLabel = this.label ?? config.name ?? this.name;\n    const button = document.createElement(\"button\");\n    button.type = \"button\";\n    button.classList.add(\"midi-condition-editor-btn\", \"unbutton\", \"control-button\");\n    button.dataset.action = \"openConditionEditor\";\n    button.dataset.fieldName = fieldName;\n    button.dataset.fieldLabel = fieldLabel;\n    button.innerHTML = '<i class=\"fas fa-code\" inert></i>';\n    button.title = i18n(\"midi-qol.ConditionEditor.Title\");\n\n    wrapper.appendChild(button);\n    return wrapper;\n  }\n}\n\nexport let MidiActivityMixin = Base => {\n  interface MidiActivityMixin extends Activity { };\n  class MidiActivityMixin extends Base {\n    get workflow() {\n      warn(\"MidiActivityMixin | activity.workflow is deprecated. activities no long store workflow references\");\n      return Workflow.getWorkflowByActivityUuid(this.uuid);\n    }\n    set workflow(value) {\n      error(\"MidiActivityMixin | activity.workflow = is deprecated. activities no long store workflow references\"); ``\n    }\n    get targets() {\n      foundry.utils.logCompatibilityWarning(\"MidiActivityMixin | activity.targets is deprecated. Use workflow.targets instead\");\n      return Workflow.getWorkflowByActivityUuid(this.uuid)?.targets ?? new Set();\n    }\n    set targets(value) {\n      foundry.utils.logCompatibilityWarning(\"MidiActivityMixin | setting activity.targets is not supported. Use workflow.targets instead\");\n    }\n\n    /** The effective activation type for this activity. Overridden by MidiCastActivity to resolve from the linked spell. */\n    get effectiveActivationType(): string | undefined {\n      return this.activation?.type;\n    }\n\n    static LOCALIZATION_PREFIXES = [...super.LOCALIZATION_PREFIXES, \"midi-qol.SHARED\"];\n\n    static defineSchema() {\n      const { StringField, ArrayField, BooleanField, NumberField, SchemaField, ObjectField, SetField } = foundry.data.fields;\n      const { FormulaField } = globalThis.dnd5e.dataModels.fields;\n      const schema = {\n        ...super.defineSchema(),\n        // flags: new ObjectField(),\n        useConditionText: new MidiConditionField({ name: \"useCondition\", initial: \"\" }),\n        useConditionReason: new StringField({ name: \"useConditionReason\", initial: \"\" }),\n        effectConditionText: new MidiConditionField({ name: \"effectCondition\", initial: \"\" }),\n        // disabled pending a way to make it work \n        // useSystemActivity: new BooleanField({ name: \"useSystemActivity\", initial: false }),\n        macroData: new SchemaField({\n          name: new StringField({ name: \"name\", initial: \"\" }),\n          command: new StringField({ name: \"command\", initial: \"\" }),\n        }),\n        ignoreTraits: new SchemaField({\n          idi: new BooleanField({ name: \"idi\", initial: false }),\n          idr: new BooleanField({ name: \"idr\", initial: false }),\n          idv: new BooleanField({ name: \"idv\", initial: false }),\n          ida: new BooleanField({ name: \"ida\", initial: false }),\n          idm: new BooleanField({ name: \"idm\", initial: false })\n        }),\n        midiProperties: new SchemaField({\n          ignoreTraits: new SetField(new StringField(), { initial: [] }),\n          triggeredActivityId: new StringField({ name: \"triggeredActivity\", initial: \"none\", required: true, blank: false }),\n          //@ts-expect-error\n          triggeredActivityConditionText: new MidiConditionField({ name: \"triggeredActivityCondition\", initial: \"\" }),\n          triggeredActivityTargets: new StringField({ name: \"triggeredActivityTargets\", initial: \"targets\", required: true, blank: false }),\n          triggeredActivityRollAs: new StringField({ name: \"triggeredActivityRollAs\", initial: \"self\" }),\n          triggeredActivityConsume: new BooleanField({ name: \"triggeredActivityConsume\", initial: true }),\n          triggeredActivityConfigure: new BooleanField({ name: \"triggeredActivityConfigure\", initial: true }),\n          autoConsume: new BooleanField({ name: \"autoConsume\", initial: false }),\n          forceConsumeDialog: new StringField({ name: \"forceConsumeDialog\", initial: \"default\" }),\n          forceRollDialog: new StringField({ name: \"forceRollDialog\", initial: \"default\" }),\n          forceDamageDialog: new StringField({ name: \"forceDamageDialog\", initial: \"default\" }),\n          confirmTargets: new StringField({ name: \"confirmTargets\", initial: \"default\", required: true, blank: false }),\n          autoTargetType: new StringField({ name: \"autoTargetType\", initial: \"any\", required: true, blank: false }),\n          autoTargetAction: new StringField({ name: \"autoTargetAction\", initial: \"default\" }),\n          automationOnly: new BooleanField({ name: \"automationOnly\", initial: false }),\n          otherActivityCompatible: new BooleanField({ name: \"otherActivityCompatible\", initial: true }),\n          otherActivityAsParentType: new BooleanField({ name: \"otherActivityAsParentType\", initial: true, required: false }),\n          identifier: new StringField({ name: \"identifier\", initial: \"\", required: false }),\n          displayActivityName: new BooleanField({ name: \"displayActivityName\", initial: false }),\n          rollMode: new StringField({ name: \"rollMode\", initial: \"default\", required: true, blank: false }),\n          chooseEffects: new BooleanField({ name: \"chooseEffects\", initial: false }),\n          toggleEffect: new BooleanField({ name: \"toggleEffect\", initial: false }),\n          ignoreFullCover: new BooleanField({ name: \"ignoreFullCover\", initial: false }),\n          removeChatButtons: new StringField({ name: \"removeChatButtons\", initial: \"default\", blank: false, required: true }),\n          magicEffect: new BooleanField({ name: \"magicEffect\", initial: false }),\n          magicDamage: new BooleanField({ name: \"magicDamage\", initial: false }),\n          noConcentrationCheck: new BooleanField({ name: \"noConcentrationCheck\", initial: false }),\n          skipConcentrationCheck: new BooleanField({ name: \"skipConcentrationCheck\", initial: false }),\n          autoCEEffects: new StringField({ name: \"autoCEEffects\", initial: \"default\", blank: false, required: true }),\n        }),\n        isOverTimeFlag: new BooleanField({ name: \"isOverTimeFlag\", initial: false }),\n        overTimeProperties: new SchemaField({\n          turnChoice: new StringField({ blank: false, choices: [\"start\", \"end\"], default: \"start\" }),\n          saveRemoves: new BooleanField({ initial: true }),\n          rollAs: new StringField({ blank: false, choices: [\"target\", \"source\"], initial: \"target\" }),\n          //@ts-expect-error find out why there is a type error here\n          preRemoveConditionText: new MidiConditionField({ name: \"removeCondition\", initial: \"\" }),\n          //@ts-expect-error find out why there is a type error here\n          postRemoveConditionText: new MidiConditionField({ name: \"postRemoveCondition\", initial: \"\" }),\n        }),\n      };\n      return schema;\n    }\n\n    /**\n     * @type {boolean}\n     * @memberof MidiActivityMixin\n     * @readonly\n     * @returns {boolean}\n     * @description Is this activity suitable as an other activity. It must be a possible other activity (default false) and the otherActivityCompatible flag must be set to true\n     */\n    get isOtherActivityCompatible() {\n      if (!this.possibleOtherActivity) return false;\n      return this.midiProperties!.otherActivityCompatible;\n    }\n\n    /**\n     * @type {boolean}\n     * @memberof MidiActivityMixin\n     * @readonly\n     * @returns {boolean}\n     * @description Is this activity suitable as a triggerable activity. Default is true and must be overridden in the subclass\n     * Examples of non triggerable activities are the Enchant activity\n     */\n    get isTriggerableActivity() {\n      return true;\n    }\n\n    /**\n     * @type {boolean}\n     * @memberof MidiActivityMixin\n     * @readonly\n     * @returns {boolean}\n     * @description Is this activity only triggerable by the actor that owns it. \n     * Default is false and must be overridden in the subclass\n     * Examples of self triggerOnly are the Cast and Forward activities\n     */\n    get isSelfTriggerableOnly() {\n      return false;\n    }\n\n    get forcedTargetConfirmation(): string | undefined {\n      return undefined;\n    }\n    /**\n     * @type {boolean}\n     * @memberof MidiActivityMixin\n     * @readonly\n     * @returns {boolean}\n     * @description Is this activity a candidate to be used as an \"other\" activity. Default is false and must be overridden in the subclass\n     */\n    get possibleOtherActivity() {\n      return false;\n    }\n\n    get canUseOtherActivity() {\n      return false;\n    }\n\n    get canUse() {\n      // if (this.midiProperties?.automationOnly) return false;\n      return super.canUse;\n    }\n\n    getOnUseMacros({ onlyOnUseItemMacros = false } = {}) {\n      const onUseMacros = new OnUseMacros();\n      this.ammunitionOnUseMacros = new OnUseMacros();\n      const itemOnUseMacros = this.item?.flags?.[MODULE_ID]?.onUseMacroParts ?? new OnUseMacros();\n      const ammunitionOnUseMacros = this.ammunitionItem?.flags?.[MODULE_ID]?.onUseMacroParts ?? new OnUseMacros();\n      const actorOnUseMacros = this.actor?.flags?.[MODULE_ID]?.onUseMacroParts ?? new OnUseMacros();\n      if (onlyOnUseItemMacros) {\n        onUseMacros.items = [...itemOnUseMacros.items];\n      } else {\n        onUseMacros.items = [...itemOnUseMacros.items, ...actorOnUseMacros.items];\n      }\n      this.ammunitionOnUseMacros.items = ammunitionOnUseMacros.items;\n      return onUseMacros\n    }\n\n    get validProperties() {\n      return new Set([\"idi\", \"idr\", \"idv\", \"ida\"]);\n    }\n\n    get macro() {\n      return new Macro({ name: this.macroData.name || this.name, command: this.macroData.command, img: this.img, type: \"script\" });\n    }\n    set macro(macro: Macro) {\n      //@ts-expect-error\n      return this.update({ macroData: { name: macro.name, command: macro.command } });\n    }\n    get messageFlags() {\n      const baseFlags = super.messageFlags;\n      // Lock target membership to workflow.targets, but use dnd5e's fresh AC values.\n      // dnd5e's getTargetDescriptors() reads live ac.value (which includes cover bonuses)\n      // and returns null for coverTotal. getWorkflowByActivityUuid uses a direct map\n      // lookup so it only finds the current workflow (not stale re-keyed ones).\n      const targets = new Map();\n      if (this.workflow?.targets) {\n        const dnd5eDescriptors = baseFlags.targets as Array<{uuid: string, ac: number | null}> | undefined;\n        for (const token of this.workflow.targets) {\n          const { name } = token;\n          const { img, system, uuid } = token.actor ?? {};\n          if (!uuid) continue;\n          const dnd5eTarget = dnd5eDescriptors?.find(td => td.uuid === uuid);\n          //@ts-expect-error no dnd5e types\n          const ac = dnd5eTarget ? dnd5eTarget.ac : system?.attributes?.ac?.value ?? null;\n          targets.set(uuid, { name, img, uuid, ac });\n        }\n        baseFlags.targets = Array.from(targets.values());\n      }\n      return baseFlags;\n    }\n    async getTriggeredActivity() {\n      // @ts-expect-error no dnd5e-types\n      let activity = this.item.system.activities.find(a => a.id === this.midiProperties?.triggeredActivityId);\n      // @ts-expect-error no dnd5e-types\n      if (!activity) activity = this.item.system.activities.find(a => a.identifier === this.midiProperties?.triggeredActivityId);\n      if (!activity) activity = await fromUuid(this.midiProperties?.triggeredActivityId);\n      return activity as MidiActivityMixin | undefined;\n    }\n\n    static metadata = foundry.utils.mergeObject(\n      super.metadata, {\n      usage: {\n        dialog: MidiActivityUsageDialog,\n        actions: {\n          placeTemplate: MidiActivityMixin.#placeTemplate,\n          rollDamage: MidiActivityMixin.#rollDamage,\n          rollDamageNoCritical: MidiActivityMixin.#rollDamageNoCritical,\n          rollDamageCritical: MidiActivityMixin.#rollDamageCritical,\n          confirmDamageRollCancel: MidiActivityMixin.#confirmDamageRollCancel,\n          confirmDamageRollComplete: MidiActivityMixin.#confirmDamageRollComplete,\n          confirmDamageRollCompleteHit: MidiActivityMixin.#confirmDamageRollCompleteHit,\n          confirmDamageRollCompleteMiss: MidiActivityMixin.#confirmDamageRollCompleteMiss,\n          midiApplyEffects: MidiActivityMixin.#applyEffects,\n          refundOtherActivity: MidiActivityMixin.#refundOtherActivity,\n          consumeOtherActivity: MidiActivityMixin.#consumeOtherActivity,\n        }\n      },\n    }, { inplace: false, insertValues: true, insertKeys: true });\n\n    static async #applyEffects(this: MidiActivityMixin, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      const workflow = Workflow.getWorkflow(message.uuid);\n      if (workflow) workflow.activity = this;\n      if (!workflow) {\n        const errMessage = \"MidiQOL | MidiActivity | applyEffects | No workflow found\";\n        error(errMessage);\n        TroubleShooter.recordError(new Error(\"No workflow found\"), errMessage);\n        return;\n      }\n      const authorId = message.author?.id;\n      if (game.user?.id !== authorId) {\n        // applying effects on behalf of another user;\n        if (!game.user?.isGM) {\n          ui.notifications?.warn(\"Only the GM can apply effects for other players\")\n          return;\n        }\n        if (game.user?.targets.size === 0) {\n          ui.notifications?.warn(i18n(\"midi-qol.noTargets\"));\n          return;\n        }\n        await socketlibSocket.executeAsUser(\"applyEffects\", authorId, {\n          workflowId: message.uuid,\n          targets: Array.from(game.user?.targets).map(t => t.document.uuid)\n        });\n      } else {\n        workflow.forceApplyEffects = true; // don't overwrite the application targets\n        workflow.effectTargets = new Set(game.user?.targets);\n        if (workflow.effectTargets.size > 0) workflow.performState(workflow.WorkflowState_ApplyDynamicEffects)\n      }\n    }\n    static async #confirmDamageRollCancel(this: MidiActivityMixin, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      const workflowId = message.uuid;\n      const authorId = message.author?.id;\n      if (!authorId || !workflowId) return;\n      if (!game.user?.isGM && configSettings.confirmAttackDamage === \"gmOnly\") {\n        return;\n      }\n      /* TODO Since workflows are available locally we can use them to cancel the workflow without a socket call\n        const workflow = Workflow.getWorkflow(workflowId);\n        if (workflow) cancelWorkflow(workflowId);\n      */\n      const user = game.users?.get(authorId);\n      if (user?.active) {\n        await socketlibSocket.executeAsUser(\"cancelWorkflow\", authorId, { workflowId, itemCardUuid: message.uuid }).then(result => {\n          if (typeof result === \"string\") ui.notifications?.warn(result);\n        });\n      } else {\n        await Workflow.removeItemCardButtons(message.uuid, { removeAllButtons: true });\n      }\n    }\n\n    static async #confirmDamageRollComplete(this: MidiActivityMixin, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      await this.doConfirmation(\"confirmDamageRollComplete\", event, target, message);\n    }\n    static async #confirmDamageRollCompleteHit(this: MidiActivityMixin, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      await this.doConfirmation(\"confirmDamageRollCompleteHit\", event, target, message);\n    }\n    static async #confirmDamageRollCompleteMiss(this: MidiActivityMixin, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      await this.doConfirmation(\"confirmDamageRollCompleteMiss\", event, target, message);\n    }\n    async doConfirmation(actionToCall: string, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      if (!game.user?.isGM && configSettings.confirmAttackDamage === \"gmOnly\") {\n        return;\n      }\n      if (message.author?.active) {\n        const result = await socketlibSocket.executeAsUser(actionToCall, message.author.id, { workflowId: message.uuid, activityUuid: this.uuid, itemCardUuid: message.uuid });\n        if (typeof result === \"string\") ui.notifications?.warn(result);\n      } else {\n        await Workflow.removeItemCardButtons(message.uuid, { removeConfirmButtons: true });\n      }\n    }\n\n    static async #refundOtherActivity(this: MidiActivityMixin, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      // Get the other activity from the associated activity on the message\n      //@ts-expect-error no dnd5e types\n      const activity = message.getAssociatedActivity?.() as MidiActivityMixin | undefined;\n      const otherActivity = activity?.otherActivity;\n      if (!otherActivity) return;\n\n      // Get the consumed data from the chat message flag (mirrors dnd5e structure)\n      const consumed = message.getFlag(MODULE_ID, \"use.consumed\");\n      if (!consumed || foundry.utils.isEmpty(consumed)) return;\n\n      // Call dnd5e's refund method\n      await otherActivity.refund(consumed);\n\n      // Remove the consumed flag - button visibility is handled by shouldHideChatButton\n      await message.unsetFlag(MODULE_ID, \"use.consumed\");\n    }\n\n    static async #consumeOtherActivity(this: MidiActivityMixin, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      // Get the other activity from the associated activity on the message\n      //@ts-expect-error no dnd5e types\n      const activity = message.getAssociatedActivity?.() as MidiActivityMixin | undefined;\n      const otherActivity = activity?.otherActivity;\n      if (!otherActivity) return;\n\n      // Prepare usage config for consumption\n      const otherUsageConfig = otherActivity._prepareUsageConfig({\n        consume: { resources: true, spellSlot: false, action: false }\n      });\n\n      // Check if consumption would succeed\n      const consumptionCheck = await otherActivity._prepareUsageUpdates(otherUsageConfig, { returnErrors: true });\n      if (Array.isArray(consumptionCheck) && consumptionCheck.length > 0) {\n        // Consumption would fail - show warning\n        ui.notifications?.warn(i18nFormat(\"midi-qol.otherActivityConsumptionFailed\", {\n          actorName: otherActivity.actor?.name ?? \"Unknown\",\n          itemName: otherActivity.item?.name ?? \"Unknown\",\n          activityName: otherActivity.name ?? \"Unknown\"\n        }));\n        return;\n      }\n\n      // Consume resources\n      const messageConfig: any = { data: {} };\n      const consumeResult = await otherActivity.consume(otherUsageConfig, messageConfig);\n      if (consumeResult === false) {\n        // Consumption was cancelled by a hook\n        return;\n      }\n\n      // Get consumed delta data from messageConfig (not return value)\n      const consumed = getConsumptionData(messageConfig);\n\n      // Set the consumed flag - button visibility is handled by shouldHideChatButton\n      if (consumed) {\n        await message.setFlag(MODULE_ID, \"use.consumed\", consumed);\n      }\n    }\n\n    /**\n     * Handle the \"Place Template\" button click from the chat card.\n     * Places all templates sequentially and delegates to workflow for validation and processing.\n     */\n    static async #placeTemplate(this: MidiActivityMixin, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      // @ts-expect-error .canvas\n      const AbilityTemplate = game.system.canvas.AbilityTemplate;\n      const templates: MeasuredTemplateDocument[] = [];\n\n      try {\n        const previews = AbilityTemplate.fromActivity(this);\n        if (!previews) return;\n        for (const template of previews) {\n          const result = await template.drawPreview();\n          if (result) {\n            const docs = Array.isArray(result) ? result : [result];\n            templates.push(...docs);\n          }\n        }\n      } catch (err) {\n        // User cancelled during placement — fall through to validation\n      }\n\n      // Find workflow and process (handles count validation, deletion if incomplete)\n      const workflow = Workflow.getWorkflow(message.uuid);\n      if (!workflow) {\n        warn(\"MidiActivityMixin | #placeTemplate | No workflow found for message\", message.uuid);\n        return;\n      }\n\n      // processPlacedTemplates handles validation, cleanup, and workflow advancement\n      await workflow.processPlacedTemplates(templates, this);\n    }\n\n    static #rollDamage(this: Activity, event, target, message) {\n      const workflow = Workflow.getWorkflow(message?.uuid);\n      if (workflow) workflow.activity = this;\n      return this.rollDamage({ event, workflow, midiOptions: { isCritical: workflow?.workflowOptions?.isCritical || workflow?.isCritical } }, {}, message);\n    }\n\n    static #rollDamageNoCritical(this: Activity, event, target, message) {\n      const workflow = Workflow.getWorkflow(message?.uuid);\n      if (workflow) workflow.activity = this;\n      return this.rollDamage({ event, workflow, critical: { allow: false }, midiOptions: { isCritical: false } }, {}, message);\n    }\n\n    static #rollDamageCritical(this: Activity, event, target, message) {\n      const workflow = Workflow.getWorkflow(message?.uuid);\n      if (workflow) workflow.activity = this;\n      return this.rollDamage({ event, workflow, critical: { allow: true }, midiOptions: { isCritical: true } }, {}, message);\n    }\n\n    get identifier() {\n      if (this.midiProperties?.identifier) return this.midiProperties.identifier;\n      return this.name.slugify();\n    }\n\n    _preCreate(data) {\n      super._preCreate(data);\n      if (!(\"otherActivityId\" in data)) {\n        this.updateSource({ otherActivityId: \"none\" });\n      }\n    }\n\n    prepareData() {\n      //@ts-expect-error\n      if (!this.midiProperties.identifier && !this.name) this.midiProperties.identifier = i18n(this.constructor.metadata.dnd5eTitle).slugify();\n      super.prepareData();\n    }\n\n    async _onChatAction(event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      // dnd5e's #onChatAction already provides a scaled `this` — no need to clone here.\n      const existingItem = this.workflow?.item ?? this.item;\n      // @ts-expect-error no dnd5e-types\n      const activity = this.workflow?.activity ?? existingItem.system.activities.get(this.id);\n      const action = target.dataset.action ?? \"\";\n      let handler = activity?.metadata.usage?.actions?.[action];\n      const workflow = Workflow.getWorkflow(message.uuid);\n      if (!handler && workflow) {\n        if (activity) handler = activity?.metadata.usage?.actions?.[action];\n      }\n      if (handler) await handler.call(activity, event, target, message);\n    }\n\n    async useAs(actor: Actor.Implementation | null | undefined, usage: ActivityUseConfiguration = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n      // itemData._id = this.item._id;\n      actor = getActor(usage.midiOptions?.rollAs);\n      if (usage.midiOptions?.rollAs) delete usage.midiOptions.rollAs;\n      if (!actor || actor === this.actor || this.isSelfTriggerableOnly) return this.use(usage, dialog, message);\n      const itemData = this.item.toObject();\n      // @ts-expect-error\n      delete itemData._id;\n      foundry.utils.setProperty(itemData, `flags.${MODULE_ID}.syntheticItem`, true);\n      let item = new CONFIG.Item.documentClass(itemData, { parent: actor });\n      item.prepareData();\n      //@ts-expect-error no dnd5e-types\n      item.prepareFinalAttributes(); // Since actor prepareData is not being called need to do this here\n      // @ts-expect-error no dnd5e-types\n      const activity = item.system.activities.get(this.id);\n      return activity.use(usage, dialog, message);\n    }\n\n    async use(usage: ActivityUseConfiguration = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n      if (usage.midiOptions?.rollAs) return this.useAs(usage.midiOptions.rollAs, usage, dialog, message);\n      if (!this.item.isEmbedded) return;\n      if (!this.item.isOwner) {\n        ui.notifications?.error(\"DND5E.DocumentUseWarn\", { localize: true });\n        return;\n      }\n      if (!this.canUse) {\n        ui.notifications?.error(\"DND5E.ACTIVITY.Warning.UsageNotAllowed\", { localize: true });\n        return;\n      }\n      let preUseActivityHookId: number | undefined;\n      let activityConsumptionHookId: number | undefined;\n      try {\n        usage.midiOptions ??= {};\n        usage.midiOptions.workflowOptions ??= {};\n        // Capture current targets before template placement can replace them\n        usage.midiOptions.workflowOptions.preSelectedTargetUuids ??= Array.from(game.user?.targets ?? []).map(t => t.document.uuid);\n        if (debugEnabled > 0) warn(\"MidiQOL | MidiActivity | use | Called\", usage, dialog, message);\n        let item = this.item.clone({}, { keepId: true });\n        // @ts-expect-error no dnd5e-types\n        let activity = item.system.activities.get(this.id) as MidiActivityMixin;\n        let workflowClass = usage?.midi?.workflowClass ?? globalThis.MidiQOL.workflowClass;\n        if (game.user?.isGM && checkRule(\"activeDefence\")) {\n          workflowClass = ActiveDefenceWorkflow;\n        }\n        if (!(workflowClass.prototype instanceof Workflow)) workflowClass = Workflow;\n        const workflowOptions = { ...usage.midiOptions, ...(usage.midiOptions?.workflowOptions ?? {}), event: usage.event as AugmentedEvent | undefined, storeWorkflow: true };\n        delete workflowOptions.workflowOptions;\n        if (usage.workflow)\n          usage.midiOptions.workflowOptions.autoRollAttack = true;\n        if (!(usage.workflow instanceof TrapWorkflow)) { \n          //TODO stupidly the constructor for TrapWorkflow is not compatible with the workflow constructor - will need to clean that up\n          if (configSettings.savesBeforeDamage)\n          usage.workflow = new SavesFirstWorkflow(activity.actor ?? null, activity, ChatMessage.getSpeaker({ actor: activity.item.actor }), null, { workflowOptions });\n          else usage.workflow = new workflowClass(activity.actor ?? null, activity, ChatMessage.getSpeaker({ actor: activity.item.actor }), null, { workflowOptions });\n        }\n        usage.workflow!.sequenceId = usage.sequenceId;\n        message.workflow = usage.workflow; // TODO: remove hack to allow card config processing\n        usage.workflow!.systemCard = message.systemCard;\n        if ((activity.midiProperties?.rollMode ?? \"default\") !== \"default\") message.rollMode = activity.midiProperties!.rollMode;\n        if (activity.midiProperties?.skipConcentrationCheck && this.actor &&\n            activity.consumption.targets.some(t => t.target === \"attributes.hp.value\"))\n          skipConcentrationActorUuids.add(this.actor.uuid);\n        if (item.parent) await removeFlanking(item.parent);\n        // config.midiOptions.workflowOptions.targetConfirmation ??= this.forcedTargetConfirmation;\n        if (!usage.workflow) return undefined;\n        if (usage.midiOptions.isCritical) {\n          usage.workflow.isCritical = true;\n          usage.workflow.attackRollModifierTracker.addAttribution(\"CRIT\", \"activity.use\", i18n(\"midi-qol.ActivityUse\"));\n        }\n        if (usage.midiOptions.isFumble) {\n          usage.workflow.isFumble = true;\n          usage.workflow.attackRollModifierTracker.addAttribution(\"FUMBLE\", \"activity.use\", i18n(\"midi-qol.ActivityUse\"));\n        }\n        const autoCreateTemplate = activityHasAutoPlaceTemplate(activity);\n        const emanationNoTemplate = activityHasEmanationNoTemplate(activity);\n        const isTrapWorkflow = usage.workflow instanceof TrapWorkflow;\n        if (autoCreateTemplate || emanationNoTemplate || isTrapWorkflow) {\n          usage.create ??= {};\n          usage.create.measuredTemplate = false;\n        }\n\n        foundry.utils.setProperty(message, \"data.flags.midi-qol.messageType\", \"attack\");\n        if (usage.midiOptions?.configureDialog === false) dialog.configure = false;\n        if (!await activity.checkAutoConsume(usage, dialog)) {\n          if (this.midiProperties?.forceConsumeDialog === \"always\") dialog.configure = true;\n          else if (this.midiProperties?.forceConsumeDialog === \"never\") dialog.configure = false;\n        }\n        const rollToggle = areMidiKeysPressed(usage.event as AugmentedEvent, \"RollToggle\");\n        if (rollToggle && usage.workflow) {\n          foundry.utils.setProperty(usage.workflow, \"rollOptions.rollToggle\", true);\n          dialog.configure = !dialog.configure; // toggle the configure dialog\n        }\n        // if (rollToggle) dialog.configure = !dialog.configure; Should this always be looked at\n        // Synthetic items don't have an _id so setup for them to be recovered from the chat card\n        if (!activity.item._id || foundry.utils.getProperty(activity.item, `flags.${MODULE_ID}.syntheticItem`))\n          foundry.utils.setProperty(message, \"data.flags.dnd5e.item.data\", activity.item.toObject());\n\n        let useResults: any;\n        preUseActivityHookId = Hooks.on(\"dnd5e.preUseActivity\", (newActivity, usageConfig, messageConfig) => {\n          if (usage.workflow!.activity?.uuid !== newActivity.uuid) return true;\n          // Not sure if required but set the workflow in the super.usageConfig.\n          usageConfig.workflow = usage.workflow;\n          // newActivity will be the scaled activity to use that instead of what we have\n          usage.workflow!.activity = newActivity;\n          // TODO fix this nasty hack\n          messageConfig.workflow = usage.workflow;\n          return true;\n        });\n        let usageData: ActivityUseConfiguration | undefined;\n        activityConsumptionHookId = Hooks.on(\"dnd5e.activityConsumption\", (newActivity, usageConfig, messageConfig) => {\n          if (usage.workflow!.activity?.uuid !== newActivity.uuid) return;\n          usageData = usageConfig;\n          usageConfig.workflow!.activity = newActivity;\n          usageConfig.activity = newActivity;\n        });\n\n        if (!await activity.preTargetingChecks(usage, dialog, message)) return false;\n        // Save/clear targets BEFORE setupTargets changes game.user.targets for self-targeting\n        const isSelfTarget = this.target?.affects?.type === \"self\"\n          // @ts-expect-error item.type includes \"tool\" at runtime\n          || (this.item.type === \"tool\" && !this.target?.affects?.type);\n        if (isSelfTarget) {\n          pushTargetSave();\n          usage.workflow!.selfTargeted = true;\n        } else {\n          clearTargetSave();\n        }\n        if (!await activity.setupTargets(usage, dialog, message)) {\n          if (isSelfTarget) { popTargetSave(); usage.workflow!.selfTargeted = false; }\n          ui.notifications?.warn(i18n(\"midi-qol.noTargets\"));\n          return false;\n        }\n        if (!await activity.preChatChecks(usage, dialog, message)) {\n          if (isSelfTarget) { popTargetSave(); usage.workflow!.selfTargeted = false; }\n          return false;\n        }\n        // If midiOptions.spellLevel is provided, set the spell slot key so that\n        // dnd5e's _prepareUsageScaling derives the correct scaling from it.\n        // @ts-expect-error item.type includes \"spell\" at runtime\n        if (usage.midiOptions?.spellLevel && activity.item?.type === \"spell\") {\n          usage.spell ??= {} as { slot: string };\n          usage.spell.slot = `spell${usage.midiOptions.spellLevel}`;\n        }\n        try {\n          useResults = await super.use.bind(activity)(usage, dialog, message);\n        } catch (err) {\n          error(\"MidiQOL | MidiActivity | use | Error in super.use\", err);\n          TroubleShooter.recordError(err, \"Error in super.use\");\n          Workflow.removeWorkflow(usage.workflow?.id);\n          return false;\n        }\n        // Cleanup skipConcentrationCheck flag in case workflow was interrupted before concentration check\n        if (this.actor) skipConcentrationActorUuids.delete(this.actor.uuid);\n        if (!useResults) { // activity use was aborted\n          Workflow.removeWorkflow(usage.workflow?.id);\n          return false;\n        }\n        // Remove the copy stored by activity uuid\n        Workflow.workflows.delete(usage.workflow!.activity?.uuid ?? \"\");\n        // Force a few values to be added to the updates cache now we have the chat card.\n        usage.workflow.itemCardUuid = useResults.message.uuid;\n        usage.workflow.id = useResults.message.uuid ?? usage.workflow.id;\n        usage.workflow.activity = usage.workflow.activity;\n        usage.workflow.item = usage.workflow!.activity?.item;\n        activity = usage.workflow!.activity! as MidiActivityMixin;\n        Workflow.addWorkflow(usage.workflow);\n        // Template cleanup is now handled by setupTemplateCleanup in unSuspend\n        if (await activity.postChatCardChecks(usage, dialog, message) !== true) return;\n        await activity.setupCanSeeSense(usage)\n        // if (autoCreateTemplate || emanationNoTemplate) if (!await activity.setupTargets(usage, dialog, message)) return;\n        if (activity.templates) { // TODO find a better place to store this\n          useResults.templates = activity.templates;\n          delete activity.templates;\n        }\n        // Process any templates placed (via dialog checkbox or emanation auto-placement)\n        // processPlacedTemplates handles validation, cleanup if incomplete, and workflow integration\n        const allTemplates = (useResults.templates ?? []).flat() as MeasuredTemplateDocument[];\n        if (allTemplates.length > 0) {\n          await usage.workflow.processPlacedTemplates(allTemplates, activity);\n        }\n        if (configSettings.undoWorkflow) await saveUndoData(usage.workflow);\n\n        usage.workflow.itemUseComplete = true;\n\n        usage.workflow.id = useResults.message.uuid;\n        if ((usage.workflow.itemUsesReaction || usage.midiOptions?.workflowOptions?.castUsesReaction) && this.actor && !hasUsedReaction(this.actor))\n          await setReactionUsed(this.actor);\n        if ((usage.workflow.itemUsesBonusAction || usage.midiOptions?.workflowOptions?.castUsesBonusAction) && this.actor && !hasUsedBonusAction(this.actor))\n          await setBonusActionUsed(this.actor);\n        // @ts-expect-error no dnd5e-types\n        if (activity.item?.type === \"spell\" || activity.item.flags?.dnd5e?.spellLevel) {\n          usage.workflow.castData = {\n            // @ts-expect-error no dnd5e-types\n            baseLevel: activity.item.system.level ?? activity.item.flags?.dnd5e?.spellLevel?.base,\n            // @ts-expect-error no dnd5e-types\n            castLevel: activity.item.system.level !== undefined ? activity.item.system.level + (usageData?.scaling ?? 0) : activity.item.flags?.dnd5e?.spellLevel?.value,\n            scaling: (usageData?.scaling ?? activity.item.flags?.dnd5e?.scaling) || 0,\n            itemUuid: activity.item.uuid\n          };\n        }\n        // Scaling is now handled by the workflow's activity getter (reads from chat card flags).\n        await usage.workflow.performState((usage.workflow as Workflow).WorkflowState_Start, {});\n        return useResults;\n      } finally {\n        if (preUseActivityHookId) Hooks.off(\"dnd5e.preUseActivity\", preUseActivityHookId);\n        if (activityConsumptionHookId) Hooks.off(\"dnd5e.activityConsumption\", activityConsumptionHookId);\n      }\n    }\n\n    /**\n     * Check if this activity has consumption configured.\n     * @returns true if this activity has consumption targets configured\n     */\n    hasConsumption(): boolean {\n      return (this.consumption?.targets?.length ?? 0) > 0;\n    }\n\n    /**\n     * Determines whether this activity should auto-consume resources without showing a dialog.\n     * @param workflow - The workflow for getting auto-consume settings\n     * @returns true if consumption should be automatic, false if a dialog should be shown\n     */\n    shouldAutoConsume(workflow?: Workflow): boolean {\n      const forceConsumeDialog = this.midiProperties?.forceConsumeDialog ?? \"default\";\n\n      // Check activity-level overrides first\n      if (forceConsumeDialog === \"always\") {\n        return false;\n      }\n      if (forceConsumeDialog === \"never\" || this.midiProperties?.autoConsume) {\n        return true;\n      }\n\n      // Use global setting\n      const autoConsumeSetting = autoConsumeResource(workflow);\n      // @ts-expect-error no dnd5e-types\n      const isSpell = this.item?.type === \"spell\";\n\n      if (autoConsumeSetting === \"none\") {\n        return false;\n      }\n      if (autoConsumeSetting === \"spell\" && !isSpell) {\n        return false;\n      }\n      if (autoConsumeSetting === \"item\" && isSpell) {\n        return false;\n      }\n      // \"both\" means auto-consume\n      return true;\n    }\n\n    async checkAutoConsume(usage: ActivityUseConfiguration, dialog: RollDialogConfig = {}): Promise<boolean> {\n      if (dialog.configure === true) return false;\n      if (!this.shouldAutoConsume(usage.workflow)) return false;\n\n      const consumption = this._prepareUsageConfig(usage);\n      const autoConsume = await this._prepareUsageUpdates(consumption, { returnErrors: true });\n      // If consumption would fail _prepareUsageUpdates will return an array of errors and on success an object of updates\n      if ((autoConsume.length ?? 0) > 0) {\n        dialog.configure = true;\n        return true;\n      }\n      dialog.configure = false;\n\n      if (this.hasAreaTarget && this.actor?.sheet) {\n        setTimeout(() => {\n          this.actor?.sheet?.minimize();\n        }, 100)\n      }\n      return true;\n    }\n\n    async rollDamage(config: RollProcessConfig, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n      // TODO decide what this should mean\n      if (!config?.workflow) {\n        return super.rollDamage(config, dialog, message);\n      }\n      if (config.workflow.currentAction === config.workflow.WorkflowState_Abort || config.workflow.currentAction === config.workflow.WorkflowState_Completed)\n        return this.use(config, dialog, {});\n      // TODO: This is odd. `midiOptions` should have `workflowOptions` _in_ it, not be assigned it\n      config.midiOptions ??= config.workflow.workflowOptions ?? {};\n      if (debugEnabled > 0) {\n        warn(\"MidiActivity | rollDamage | Called\", config, dialog, message);\n      }\n      let result: Roll[] | undefined;\n      let otherResult: Roll[] | undefined;\n      let preRollDamageHookId: number | undefined;\n      let rollDamageHookId: number | undefined;\n      try {\n        if (await callActivityHooks(this, \"midi-qol.preDamageRoll\", config.workflow, this, config, dialog, message) === false) {\n          console.warn(\"midi-qol | Damage roll blocked via pre-hook\");\n          return;\n        }\n        if (configSettings.allowUseMacro) {\n          const results = await config.workflow.callMacros(this.item, config.workflow.onUseMacros?.getMacros(\"preDamageRollConfig\"), \"OnUse\", \"preDamageRollConfig\", { config, dialog, message });\n          const cancelWorkflow = results?.some(i => i === false) ?? false;\n          if (cancelWorkflow) {\n            console.warn(\"midi-qol | Damage roll blocked by preDamageRollConfig onUseMacro\");\n            return;\n          }\n        }\n        //@ts-expect-error\n        const areKeysPressed = game.system.utils.areKeysPressed;\n        const keys = {\n          normal: areKeysPressed(config.event, \"skipDialogNormal\")\n            || areKeysPressed(config.event, \"skipDialogDisadvantage\"),\n          critical: areKeysPressed(config.event, \"skipDialogAdvantage\")\n        };\n\n        config.midiOptions!.isCritical ??= config.workflow.workflowOptions?.isCritical || config.workflow.isCritical;\n        config.isCritical ??= config.midiOptions!.isCritical;\n        config.midiOptions!.fastForwardDamage ??= config.workflow.workflowOptions?.fastForwardDamage;\n        if (this.hasDamage || this.hasHealing) {\n          if (Object.values(keys).some(k => k)) dialog.configure = this.midiProperties?.forceDamageDialog !== \"never\";\n          else if (dialog.configure === undefined) {\n            switch (this.midiProperties?.forceDamageDialog) {\n              case \"always\":\n                dialog.configure = true;\n                break;\n              case \"never\":\n                dialog.configure = false;\n                break;\n              default:\n                dialog.configure = !(config.midiOptions?.fastForwardDamage ?? config.workflow?.workflowOptions.fastForwardDamage ?? false);\n            }\n          }\n          if (config.workflow && areMidiKeysPressed(config.event, \"RollToggle\")) config.workflow.rollOptions.rollToggle = !config.workflow.rollOptions.rollToggle;\n          //@ts-expect-error no dnd5e-types\n          if (this.item.isVersatile && areMidiKeysPressed(config.event ?? config.workflow.rollOptions.event, \"Versatile\")) {\n            config.workflow.attackMode = \"twoHanded\";\n          }\n          if (config.workflow.rollOptions?.rollToggle) dialog.configure = !dialog.configure;\n          // If the activity damage has any choice force configuration dialog\n          // if (dialog.configure) config.midiOptions.isCritical = false;\n          preRollDamageHookId = Hooks.once(\"dnd5e.preRollDamage\", (rollConfig, dialogConfig, messageConfig) => {\n            const targetDescriptors = foundry.utils.getProperty(messageConfig, \"data.flags.dnd5e.targets\") as Array<DND5ETargetDescriptor>;\n            // since saves might have been rolled merge the target descriptors\n            if (targetDescriptors && config.workflow) {\n              config.workflow.targetDescriptors ??= [];\n              for (let targetDetails of targetDescriptors) {\n                const existing = config.workflow.targetDescriptors.find(td => td.uuid === targetDetails.uuid);\n                if (existing) {\n                  Object.assign(existing, foundry.utils.mergeObject(existing, targetDetails));\n                } else {\n                  config.workflow.targetDescriptors.push(targetDetails);\n                }\n              }\n            }\n            if (keys.critical) rollConfig.isCritical = true;\n            else if (keys.normal) rollConfig.isCritical = false;\n            else if (!dialogConfig.configure) rollConfig.isCritical ||= rollConfig.midiOptions?.isCritical;\n            if (this.damage?.parts.some(part => part.types.size > 1)) dialogConfig.configure = true;\n            ///@ts-expect-error no dnd5e-types\n            else if ((rollConfig.ammunition?.system.damage.base?.types.size ?? 0) > 1) dialogConfig.configure = true;\n            else if ((this.healing?.types?.size ?? 0) > 1) dialogConfig.configure = true;\n            if (dialogConfig.configure) {\n              dialogConfig.options ??= {};\n              if (rollConfig.isCritical || rollConfig.midiOptions?.isCritical) {\n                dialogConfig.options.defaultButton = \"critical\";\n              } else dialogConfig.options.defaultButton = \"normal\";\n            } return true;\n\n          });\n          rollDamageHookId = Hooks.once(\"dnd5e.rollDamage\", rolls => {\n            if (rolls[0] && config.workflow && config.midiOptions?.updateWorkflow !== false) \n              //@ts-expect-error no dnd5e-types\n              config.workflow.isCritical = rolls[0].options.isCritical;\n          });\n          const rollMode = safeGetGameSetting(\"core\", \"rollMode\");\n          message.create ??= false;\n          const showChatDamageCard = game.user?.isGM && configSettings.gmAttackDamageCards && [CONST.DICE_ROLL_MODES.SELF, CONST.DICE_ROLL_MODES.BLIND, CONST.DICE_ROLL_MODES.PRIVATE].includes(rollMode);\n          if (showChatDamageCard) {\n            // Show a chat card for damage rolls if the players are not going to see the midi card.\n            message.create = true;\n            foundry.utils.setProperty(message, \"data.flags.midi-qol.gmHide\", true); // since the gm will see the midi card hide the attack card for the author\n          }\n          result = await super.rollDamage(config, dialog, message);\n          if (!result) { // user backed out of roll \n            config.workflow.currentAction = config.workflow.WorkflowState_WaitForDamageRoll;\n            // config.workflow.suspend();\n            return;\n          }\n          if (result) result = await this.postProcessDamageRoll(config, result);\n          if (config.workflow && config.midiOptions?.updateWorkflow !== false) await config.workflow.setDamageRolls(result);\n        }\n        if (this.otherActivity && config.workflow.otherActivity !== this && config.midiOptions?.updateWorkflow !== false) {\n          // Check if we need to defer rolling until after consumption is confirmed\n          if (!this.deferOtherDamage(config, dialog)) {\n            otherResult = await this.rollOtherDamage(config, dialog);\n          }\n        }\n        if (config.midiOptions?.updateWorkflow !== false && config.workflow.suspended) {\n          // If neither the activity nor the other activity produced damage rolls,\n          // we still need to advance the workflow past WaitForDamageRoll.\n          // Use noDamage flag to indicate no damage was available to roll\n          // (as opposed to the user cancelling the roll).\n          const noDamage = !result?.[0] && !otherResult?.[0] && !(this.hasDamage || this.hasHealing);\n          config.workflow.unSuspend.bind(config.workflow)({ damageRoll: result?.[0], otherDamageRoll: otherResult?.[0], noDamage });\n        }\n      } catch (err) {\n        const message = \"doDamageRoll error\";\n        TroubleShooter.recordError(err, message);\n        error(message, err);\n      } finally {\n        if (preRollDamageHookId) Hooks.off(\"dnd5e.preRollDamage\", preRollDamageHookId);\n        if (rollDamageHookId) Hooks.off(\"dnd5e.rollDamage\", rollDamageHookId);\n      }\n      return result ?? [];\n    }\n\n    /**\n     * Check if other activity damage should be deferred until after consumption is confirmed.\n     * If deferral is needed, stores the config and dialog for later rolling.\n     * Only defers if we're actually checking hits or saves - otherwise consume immediately.\n     * @param config - The roll process configuration\n     * @param dialog - The roll dialog configuration\n     * @returns true if damage was deferred, false if it should be rolled immediately\n     */\n    deferOtherDamage(config: RollProcessConfig, dialog: RollDialogConfig): boolean {\n      if (!this.otherActivity || !config.workflow) return false;\n\n      if (!this.otherActivity.hasConsumption()) return false;\n\n      // Only defer if we're checking hits or saves - otherwise consume immediately\n      const checkingHits = this.attack && configSettings.autoCheckHit !== \"none\";\n      const checkingSaves = (this.otherActivity.save || this.otherActivity.check) && configSettings.autoCheckSaves !== \"none\";\n\n      if (!checkingHits && !checkingSaves) {\n        // Not checking hits or saves - consume immediately, don't defer\n        return false;\n      }\n\n      // Store info needed to roll other activity damage later\n      // No need to deep clone config - rollOtherDamage clones it before modification\n      // Shallow clone dialog since rollOtherDamage may mutate dialog.configure\n      config.workflow.otherDamageConfig = config;\n      config.workflow.otherDamageDialog = { ...dialog };\n      return true; // Deferred - don't roll now\n    }\n\n    /**\n     * Roll damage for the other activity referenced by this activity.\n     * @param config - The roll process configuration\n     * @param dialog - The roll dialog configuration\n     * @returns The damage rolls from the other activity, or undefined if not rolled\n     */\n    async rollOtherDamage(\n      config: RollProcessConfig,\n      dialog: RollDialogConfig\n    ): Promise<Roll[] | undefined> {\n      if (!this.otherActivity || !config.workflow) return undefined;\n      // Check if other activity has something to roll\n      if (!(this.otherActivity.hasDamage || this.otherActivity.hasHealing || this.otherActivity.roll?.formula)) {\n        return undefined;\n      }\n\n      // Build otherDamageMatches (no-op if already built)\n      await config.workflow.buildOtherDamageMatches();\n      if (this.otherCondition && !config.workflow.otherDamageMatches?.size) return undefined;\n\n      let otherResult: Roll[] | undefined;\n      const otherConfig = {\n        ...config,\n        midiOptions: {\n          ...config.midiOptions,\n          fastForward: config.midiOptions?.fastForwardDamage,\n          updateWorkflow: false, // rollFormula will try and restart the workflow\n          addOptionalBonuses: false // don't apply optional bonus flags to other activity damage\n        }\n      };\n\n      // Undo the roll toggle since rollFormula will look at it as well\n      if (this.otherActivity.ac && config.workflow.rollOptions?.rollToggle) {\n        dialog.configure = !dialog.configure;\n      }\n\n      // Apply scaling to the other activity's item if specified\n      // Scaling is stored on the chat card by checkOtherActivityConsumption\n      let otherActivity = this.otherActivity;\n      const scaling = config.workflow?.chatCard?.getFlag(MODULE_ID, \"use.otherScaling\");\n      if (scaling) {\n        const item = otherActivity.item.clone({ flags: { dnd5e: { scaling } } }, { keepId: true });\n        otherActivity = item.system.activities.get(otherActivity.id);\n      }\n\n      // Roll damage or formula\n      if (otherActivity?.hasDamage) {\n        otherResult = await otherActivity.rollDamage(otherConfig, dialog, { create: false }) as Roll[] | undefined;\n      } else if (otherActivity?.roll?.formula) {\n        otherResult = await otherActivity.rollFormula!(otherConfig, dialog, { create: false }) as Roll[] | undefined;\n        if (otherResult) {\n          if (!(otherResult instanceof Array)) otherResult = [otherResult];\n          otherResult = otherResult.map(roll =>\n            //@ts-expect-error\n            new game.system.dice.DamageRoll(roll.formula, {}, {})\n          );\n        }\n      }\n\n      // Apply parent activity type to damage properties if configured\n      if (otherResult && this.otherActivityAsParentType) {\n        otherResult.forEach(r => {\n          //@ts-expect-error no dnd5e-types\n          const properties = new Set(r.options.properties ?? []);\n          properties?.delete(this.otherActivity.actionType);\n          properties?.add(this.actionType);\n          //@ts-expect-error no dnd5e-types\n          r.options.properties = Array.from(properties);\n        });\n      }\n\n      // Update workflow with other damage rolls\n      if (otherResult && config.midiOptions?.updateWorkflow !== false) {\n        await config.workflow.setOtherDamageRolls(otherResult);\n      }\n\n      return otherResult;\n    }\n\n    configureDamageRoll(config: RollProcessConfig): void {\n      try {\n        let workflow = config.workflow;\n        if (!workflow) return void config;\n\n        if (workflow.workflowType === \"TrapWorkflow\") workflow.rollOptions.fastForward = true;\n\n        if (workflow.currentAction !== workflow.WorkflowState_WaitForDamageRoll && workflow.noAutoAttack) {\n          // TODO NW check this allow damage roll to go ahead if it's an ordinary roll\n          workflow.currentAction = workflow.WorkflowState_WaitForDamageRoll;\n        }\n\n        if (workflow.currentAction !== workflow.WorkflowState_WaitForDamageRoll) {\n          if (workflow.currentAction === workflow.WorkflowState_AwaitTemplate)\n            return ui.notifications?.warn(i18n(\"midi-qol.noTemplateSeen\")) as void;\n          else if (workflow.currentAction === workflow.WorkflowState_WaitForAttackRoll)\n            return ui.notifications?.warn(i18n(\"midi-qol.noAttackRoll\")) as void;\n        }\n\n        // TODO revisit this to see if it is still possible to just re-roll the damage\n        if (workflow && (workflow.damageRollCount ?? 0) > 0) { // we are re-rolling the damage. redisplay the item card but remove the damage if the roll was finished\n          workflow.displayChatCardWithoutDamageDetail();\n        };\n\n        // Allow overrides from the caller\n        if (debugEnabled > 0) warn(\"rolling damage  \", this.name, this);\n\n        if (workflow && config.midiOptions?.isCritical !== undefined)\n          workflow.isCritical = config.midiOptions?.isCritical;\n        config.midiOptions ??= {};\n        config.midiOptions.fastForwardDamage ??= workflow.workflowOptions?.fastForwardDamage ?? workflow.rollOptions.fastForwardDamage;\n\n        if (workflow) workflow.damageRollCount += 1;\n      } catch (err) {\n        const message = \"Configure Damage Roll error\";\n        TroubleShooter.recordError(err, message);\n        error(message, err);\n      }\n    }\n\n    getDamageConfig(config: RollProcessConfig = {}) {\n      config.attackMode = config.workflow?.attackMode;\n      const rollConfig = super.getDamageConfig(config);\n      this.configureDamageRoll(rollConfig);\n      this.createDamageRollModifiers(rollConfig);\n\n      return rollConfig;\n    }\n\n    getDamageRollModifiers(roll: Roll /* DamageRoll */): string[] {\n      const modifiers: string[] = [];\n      const actionType = this.actionType;\n      const itemType = this.item.type;\n      //@ts-expect-error no dnd5e-types\n      const damageTypes = roll.options.types;\n      const changes: any[] = [];\n      if (this.actor) for (let effect of this.actor.allApplicableEffects()) {\n        if (effect.disabled || effect.isSuppressed) continue;\n        for (let change of effect.changes) {\n          if (!change.key.startsWith(\"flags.midi-qol.rollModifiers.damage.\")) continue;\n          changes.push(change);\n        }\n      }\n      changes.sort((a, b) => a.priority - b.priority);\n      for (let change of changes) {\n        const [_, __, ___, ____, actionOrItem, damageType] = change.key.split(\".\");\n        if (actionOrItem === \"all\" || actionOrItem === actionType || actionOrItem === itemType) {\n          if (damageType === \"all\" || damageTypes.includes(damageType)) {\n            modifiers.push(change.value);\n          }\n        }\n      }\n      return modifiers;\n    }\n\n    createDamageRollModifiers(this: Activity, rollConfig: RollProcessConfig) {\n      const rolls = rollConfig.rolls;\n      rolls?.forEach(roll => {\n        // @ts-expect-error\n        const modifiers = this.getDamageRollModifiers(roll);\n        roll.options ??= {};\n        roll.options[\"midi-qol\"] ??= {};\n        roll.options[\"midi-qol\"].modifiers ??= [];\n        roll.options[\"midi-qol\"].modifiers = roll.options[\"midi-qol\"].modifiers.concat(modifiers);\n        if (roll.options?.properties && this.midiProperties?.magicDamage && !roll.options.properties.includes(\"mgc\")) roll.options.properties.push(\"mgc\");\n      })\n    }\n\n    async postProcessDamageRoll(config: RollProcessConfig, result: Array<Roll>): Promise<Array<Roll>> {\n      //@ts-expect-error\n      const DamageRoll = CONFIG.Dice.DamageRoll;\n      const rollMode = safeGetGameSetting(\"core\", \"rollMode\");\n\n      try {\n        if (!config.workflow) return result;\n\n        // @ts-expect-error no dnd5e-types\n        let magicalDamage = this.item?.system.magicAvailable;\n        // @ts-expect-error no dnd5e-types\n        magicalDamage ??= this.item?.system.properties.has(\"mgc\");\n        magicalDamage = magicalDamage || (configSettings.requireMagical === \"off\" && this.attackBonus > 0);\n        //@ts-expect-error no dnd5e-types\n        magicalDamage ||= configSettings.requireMagical === \"off\" && (config.ammunition?.system.magicalBonus ?? 0) > 0;\n        magicalDamage = magicalDamage || (configSettings.requireMagical === \"off\" && (this.attack?.type.classification ?? \"none\") !== \"weapon\");\n        magicalDamage = magicalDamage || (configSettings.requireMagical === \"nonspell\" && this.isSpell);\n\n        if (result?.length > 0) {\n          result.forEach(roll => {\n            const droll: any = roll;\n            if (!droll.options.properties) droll.options.properties = [];\n            if (this.isSpell) droll.options.properties.push(\"spell\");\n            if (magicalDamage && !droll.options.properties.includes(\"mgc\")) droll.options.properties.push(\"mgc\");\n            droll.options.properties.push(this.actionType);\n            if (droll.data.actorType === configSettings.averageDamage || configSettings.averageDamage === \"all\") \n              averageDice(droll);\n          })\n        }\n        const firstTarget = config.workflow.hitTargets.first() ?? config.workflow.targets?.first();\n        const firstTargetActor = firstTarget?.actor;\n        const targetMaxFlags = firstTargetActor?.flags?.[MODULE_ID]?.grants?.max?.damage ?? {};\n        const maxFlags = config.workflow.actor.flags?.[MODULE_ID]?.max ?? {};\n        let needsMaxDamage = (maxFlags.damage?.all && await evalActivationCondition(config.workflow, maxFlags.damage.all, firstTarget, { async: true, errorReturn: false }))\n          || (maxFlags.damage && maxFlags.damage[this.actionType] && await evalActivationCondition(config.workflow, maxFlags.damage[this.actionType], firstTarget, { async: true, errorReturn: false }));\n        needsMaxDamage = needsMaxDamage || (\n          (targetMaxFlags.all && await evalActivationCondition(config.workflow, targetMaxFlags.all, firstTarget, { async: true, errorReturn: false }))\n          || (targetMaxFlags[this.actionType] && await evalActivationCondition(config.workflow, targetMaxFlags[this.actionType], firstTarget, { async: true, errorReturn: false })));\n        const targetMinFlags = firstTargetActor?.flags?.[MODULE_ID]?.grants?.min?.damage ?? {};\n        const minFlags = config.workflow.actor.flags?.[MODULE_ID]?.min ?? {};\n        let needsMinDamage = (minFlags.damage?.all && await evalActivationCondition(config.workflow, minFlags.damage.all, firstTarget, { async: true, errorReturn: false }))\n          || (minFlags?.damage && minFlags.damage[this.actionType] && await evalActivationCondition(config.workflow, minFlags.damage[this.actionType], firstTarget, { async: true, errorReturn: false }));\n        needsMinDamage = needsMinDamage || (\n          (targetMinFlags.all && await evalActivationCondition(config.workflow, targetMinFlags.all, firstTarget, { async: true, errorReturn: false }))\n          || (targetMinFlags[this.actionType] && await evalActivationCondition(config.workflow, targetMinFlags[this.actionType], firstTarget, { async: true, errorReturn: false })));\n        if (needsMaxDamage && needsMinDamage) {\n          needsMaxDamage = false;\n          needsMinDamage = false;\n        }\n        const bonusDamageFlags = firstTargetActor?.flags?.[MODULE_ID]?.grants?.bonus?.damage ?? {};\n        if (bonusDamageFlags.all || bonusDamageFlags[this.actionType]) {\n          const newDamageRoll = bonusDamageFlags[this.actionType] ?? bonusDamageFlags.all;\n          const bonusDamage = await new DamageRoll(`${newDamageRoll}`, firstTargetActor?.getRollData()).roll();\n          result[0] = addRollTo(result[0], bonusDamage);\n        }\n\n        let actionFlavor: string;\n        actionFlavor = this.actionType === \"heal\" ? getHealingLabel() : i18n(\"DND5E.DamageRoll\");\n\n        const title = this.name;\n        const speaker = getSpeaker(this.actor!);\n        let flavor = title;\n        // @ts-expect-error no dnd5e-types\n        if (this.item.labels.damages?.length > 0) {\n          // @ts-expect-error no dnd5e-types\n          flavor = `${title} (${this.item.labels.damages.map(d => d.damageType)})`;\n        }\n        let messageData = foundry.utils.mergeObject({\n          title,\n          flavor,\n          speaker,\n        }, { \"flags.dnd5e.roll\": { type: \"damage\", itemId: this.item.id, itemUuid: this.item.uuid } });\n        if (needsMaxDamage) {\n          for (let i = 0; i < result.length; i++) {\n            result[i] = await result[i].reroll({ maximize: true });\n          }\n        } else if (needsMinDamage) {\n          for (let i = 0; i < result.length; i++) {\n            result[i] = await result[i].reroll({ minimize: true });\n          }\n        } else if (this.actor?.flags?.[MODULE_ID]?.damage?.[\"reroll-kh\"] || this.actor?.flags?.[MODULE_ID]?.damage?.[\"reroll-kl\"]) {\n          let result2: Roll[] = [];\n          for (let i = 0; i < result.length; i++) {\n            result2.push(await result[i].reroll());\n          }\n          if ((this.actor?.flags?.[MODULE_ID]?.damage?.[\"reroll-kh\"] && (sumRolls(result2) > sumRolls(result)))\n            || (this.actor?.flags?.[MODULE_ID]?.damage?.[\"reroll-kl\"] && (sumRolls(result2) < sumRolls(result)))) {\n            [result, result2] = [result2, result];\n          }\n          // display roll not being used.\n          if (config.workflow.workflowOptions?.damageRollDSN !== false) {\n            let promises = result2.map(r => displayDSNForRoll(r, \"damageRoll\"));\n            await Promise.all(promises);\n          }\n          await DamageRoll.toMessage(result2, messageData, { rollMode: game.settings.get(\"core\", \"rollMode\") });\n          // await result2.toMessage(messageData, { rollMode: game.settings.get(\"core\", \"rollMode\") });\n        } else if (this.actor?.flags?.[MODULE_ID]?.damage?.advantage) {\n          // To do this properly requires rerolling each term in the damage roll\n        }\n        setDamageRollMinTerms(result)\n\n        if (this.actionType === \"heal\" && !Object.keys(GameSystemConfig.healingTypes).includes(config.workflow.defaultDamageType ?? \"\")) config.workflow.defaultDamageType = \"healing\";\n        if (config.workflow?.workflowOptions?.damageRollDSN !== false) {\n          let promises = result.map(r => displayDSNForRoll(r, \"damageRoll\"));\n          await Promise.all(promises);\n        }\n        if (config.midiOptions?.addOptionalBonuses !== false) {\n          result = await config.workflow.processDamageRollBonusFlags(result);\n        }\n        return result;\n      } catch (err) {\n        const message = `doDamageRoll error for item ${this?.name} ${this.uuid}`;\n        TroubleShooter.recordError(err, message);\n        throw err;\n      }\n    }\n\n    async setupCanSeeSense(usage: { workflow?: Workflow }) {\n      const workflow = usage.workflow;\n      const wasSightEnabled = {};\n      if (!workflow) return;\n      let needPause = false;\n      for (let tokenRef of workflow.targets.union(new Set([workflow.token]))) {\n        const target = getToken(tokenRef);\n        if (!target) continue;\n        wasSightEnabled[target.id] = target.document.sight.enabled;\n        // Skip initializeVision only for the attacker token if it already has a\n        // properly initialized vision source — re-initializing would destroy Foundry's\n        // active vision source. Targets are always re-initialized to avoid stale LOS.\n        if (target === getToken(workflow.token) && target.vision?.active && target.vision?.los) continue;\n        const needsInit = (!target.document.sight.enabled && configSettings.optionalRules.invisVision)\n          // @ts-expect-error no dnd5e-types\n          || (target.actor?.type === \"npc\")\n          || (!target.isOwner && target.document.sight.enabled)\n          || (!target.vision || !target.vision?.los);\n        if (needsInit) {\n          initializeVision(target);\n          needPause = game.modules.get(\"levels-3d-preview\")?.active ?? false;\n        }\n      }\n      if (needPause) {\n        await busyWait(100);\n        for (let tokenRef of workflow.targets) {\n          const target = getToken(tokenRef);\n          if (!target || !target.vision?.los) continue;\n          target.vision.add();\n        }\n      }\n\n      for (let target of workflow.targets) {\n        // TODO: This is odd - if `!workflow.token` then `true`, but then we're adding `undefined` to `targetsCanSense`\n        const tokenCanSense = workflow.token ? canSense(workflow.token, target, globalThis.MidiQOL.InvisibleDisadvantageVisionModes) : true;\n        const targetCanSense = workflow.token ? canSense(target, workflow.token, globalThis.MidiQOL.InvisibleDisadvantageVisionModes) : false;\n        if (targetCanSense) workflow.targetsCanSense.add(workflow.token!);\n        else workflow.targetsCanSense.delete(workflow.token!);\n        if (tokenCanSense) workflow.tokenCanSense.add(target);\n        else workflow.tokenCanSense.delete(target);\n        const tokenCanSee = workflow.token ? canSee(workflow.token, target) : true;\n        const targetCanSee = workflow.token ? canSee(target, workflow.token) : false;\n        if (targetCanSee) workflow.targetsCanSee.add(workflow.token!);\n        else workflow.targetsCanSee.delete(workflow.token!);\n        if (tokenCanSee) workflow.tokenCanSee.add(target);\n        else workflow.tokenCanSee.delete(target);\n      }\n\n      // Blood Sense: treat wounded targets within bloodsense range as sensed/seen\n      if (workflow.token?.actor) {\n        const bloodsenseRange = Number(foundry.utils.getProperty(workflow.token.actor, `flags.${MODULE_ID}.bloodsense`) ?? 0);\n        if (bloodsenseRange > 0) {\n          for (const target of workflow.targets) {\n            if (workflow.tokenCanSense.has(target) && workflow.tokenCanSee.has(target)) continue;\n            const targetToken = getToken(target);\n            if (!targetToken?.actor) continue;\n            // @ts-expect-error no dnd5e-types\n            const hp = targetToken.actor.system.attributes?.hp;\n            if (!hp || hp.value >= hp.max) continue; // not wounded\n            const distance = getDistance(workflow.token, targetToken, { wallsBlock: false });\n            if (distance >= 0 && distance <= bloodsenseRange) {\n              workflow.tokenCanSense.add(target);\n              workflow.tokenCanSee.add(target);\n            }\n          }\n        }\n      }\n\n      // Trigger setters to persist the mutated sets\n      workflow.targetsCanSense = workflow.targetsCanSense;\n      workflow.tokenCanSense = workflow.tokenCanSense;\n      workflow.targetsCanSee = workflow.targetsCanSee;\n      workflow.tokenCanSee = workflow.tokenCanSee;\n      for (let targetRef of workflow.targets) {\n        const target = getToken(targetRef);\n        if (!target) continue;\n        target.document.sight.enabled = wasSightEnabled[target.id];\n        target.initializeVisionSource();\n      }\n      if (workflow.token) {\n        workflow.token.document.sight.enabled = wasSightEnabled[workflow.token.id];\n        workflow.token.initializeVisionSource();\n      }\n    }\n\n    async setupTargets(config: ActivityUseConfiguration, dialog: RollDialogConfig, message: RollMessageConfig): Promise<boolean> {\n      if (!config.workflow) {\n        const errMessage = \"MidiQOL | MidiActivity | setupTargets | No workflow found\";\n        error(errMessage);\n        TroubleShooter.recordError(new Error(\"No workflow found\"), errMessage);\n        return false;\n      }\n      const workflow = config.workflow;\n      const hasTargetsToUse = (config.midiOptions?.targetsToUse?.size ?? 0) > 0 && !activityHasAreaTarget(this);\n      // If targetsToUse was provided (e.g. from completeActivityUse, OverTime effects),\n      // pre-populate game.user.targets so any confirmation dialog shows the right selection.\n      if (hasTargetsToUse) {\n        const tokenIds = Array.from(config.midiOptions!.targetsToUse!).map(t => (t as Token).id);\n        updateUserTargets(tokenIds);\n      }\n      const isSelfTargetActivity = this.target?.affects?.type === \"self\";\n      if (!isSelfTargetActivity && (requiresTargetConfirmation(this, config.midiOptions ?? {})\n        || configSettings.enforceSingleWeaponTarget)) {\n        if (!(await preTemplateTargets(this, config.midiOptions ?? {})))\n          return false;\n        // Confirmation was shown — read the user's final selection from game.user.targets.\n        workflow.setTargets(validTargetTokens(new Set(game.user?.targets)));\n      } else if (hasTargetsToUse) {\n        // No confirmation needed — set workflow targets directly from the provided Set\n        // to avoid race conditions with game.user.targets being changed by concurrent effects.\n        workflow.setTargets(validTargetTokens(config.midiOptions!.targetsToUse!));\n      } else {\n        // No targetsToUse and no confirmation — use current user targets or self-target.\n        let selfTarget = this.target?.affects.type === \"self\";\n        // @ts-expect-error no dnd5e-types\n        if (this.item.type === \"tool\" && !this.target?.affects.type)\n          selfTarget = true;\n        if (!selfTarget) {\n          workflow.setTargets(validTargetTokens(new Set(game.user?.targets)));\n        } else {\n          foundry.utils.setProperty(config, \"midiOptions.workflowOptions.targetConfirmation\", \"none\");\n          let potentialTarget = getOrCreateTokenForActor(this.actor);\n          workflow.setTargets(new Set());\n          if (potentialTarget) workflow.setTargets(workflow.targets.add(potentialTarget));\n        }\n      }\n      // remove selection of un-targetable targets TODO\n      if (canvas.scene) {\n        const tokensIdsToUse: Array<string> = Array.from(workflow.targets).filter(t => isValidTarget(t)).map(t => (t as Token).id);\n        updateUserTargets(tokensIdsToUse);\n      }\n      return true;\n    }\n\n    async confirmTargets(): Promise<void> {\n    }\n\n    async preTargetingChecks(usage: ActivityUseConfiguration, dialog: RollDialogConfig, message: RollMessageConfig, optionsConfig: any = {}): Promise<boolean> {\n      const workflow = usage.workflow;\n      const removeWorkflow = (workflow) => {\n        return false;\n      }\n      if (!workflow) return false;\n      let options: any = { none: false, checkAoO: true, checkReaction: true, checkBonusAction: true, checkAllowIncapacitated: false, callMacros: true, callHooks: true, checkTargets: true, checkComponents: true, checkUse: true }\n      if (optionsConfig.none) options = optionsConfig;\n      options = foundry.utils.mergeObject(options, optionsConfig, { insertKeys: true, overwrite: true });\n      if (usage.midiOptions?.proceedChecks?.none) options = usage.midiOptions!.proceedChecks;\n      options = foundry.utils.mergeObject(options, usage.midiOptions?.proceedChecks ?? {}, { insertKeys: true, overwrite: true });\n      let cancelWorkflow: boolean | undefined;\n\n      if (options.checkAllowIncapacitated && !usage.midiOptions?.workflowOptions?.allowIncapacitated && checkMechanic(\"incapacitated\") !== \"nothing\") {\n        const condition = checkIncapacitated(this.actor, true, false);\n        if (condition) {\n          logIncapacitatedCheckResult(this.actor?.name ?? \"\", condition, debugEnabled > 0, true);\n          if (checkMechanic(\"incapacitated\") === \"enforce\") return removeWorkflow(usage.workflow);\n        }\n      }\n\n      if (options.callHooks) {\n        cancelWorkflow = await callActivityHooks(this, \"midi-qol.preTargeting\", { activity: this, token: workflow.token, config: usage, dialog, message }) === false;\n        cancelWorkflow ||= await callActivityHooks(this, \"midi-qol.preTargetingV2\", { workflow, usage, dialog, message }) === false;\n      }\n\n      if (options.callMacros && configSettings.allowUseMacro) {\n        const results = await workflow?.callMacros(this.item, workflow?.onUseMacros?.getMacros(\"preTargeting\"), \"OnUse\", \"preTargeting\", { usage, dialog, message });\n        cancelWorkflow ||= results?.some(i => i === false) ?? false;\n      }\n      if (cancelWorkflow) return removeWorkflow(usage.workflow);\n      return true;\n    }\n\n    async preChatChecks(usage: ActivityUseConfiguration, dialog: RollDialogConfig, message: RollMessageConfig, optionsConfig: any = {}): Promise<boolean> {\n      const workflow = usage.workflow;\n      const removeWorkflow = (workflow) => {\n        return false;\n      }\n      if (!workflow) return false;\n      let options: any = { none: false, checkAoO: true, checkReaction: true, checkBonusAction: true, checkAllowIncapacitated: false, callMacros: true, callHooks: true, checkTargets: true, checkComponents: true, checkUse: true }\n      if (optionsConfig.none) options = optionsConfig;\n      else\n        options = foundry.utils.mergeObject(options, optionsConfig, { insertKeys: true, overwrite: true });\n      if (usage.midiOptions?.proceedChecks?.none) options = usage.midiOptions.proceedChecks;\n      else\n        options = foundry.utils.mergeObject(options, usage.midiOptions?.proceedChecks ?? {}, { insertKeys: true, overwrite: true });\n\n      if (options.callHooks) {\n        let hookAbort = await callActivityHooks(this, \"midi-qol.preItemRoll\", { activity: this, token: workflow.token, config: usage, dialog, message }) === false;\n        hookAbort ||= await callActivityHooks(this, \"midi-qol.preItemRollV2\", { workflow, usage, dialog, message }) === false;\n        if (hookAbort || workflow.aborted) {\n          console.warn(\"midi-qol | attack roll blocked by preItemRoll hook\");\n          workflow.aborted = true;\n          await workflow.performState(workflow.WorkflowState_Abort)\n          return removeWorkflow(workflow);\n        }\n      }\n\n      if (options.callMacros && configSettings.allowUseMacro) {\n        const results = await workflow.callMacros(workflow.item, workflow.onUseMacros?.getMacros(\"preItemRoll\"), \"OnUse\", \"preItemRoll\", { usage, dialog, message });\n        if (workflow.aborted || results.some(i => i === false)) {\n          console.warn(\"midi-qol | item roll blocked by preItemRoll macro\");\n          workflow.aborted = true;\n          await workflow.performState(workflow.WorkflowState_Abort)\n          return removeWorkflow(workflow);\n        }\n      }\n\n      if (options.checkUse && this.useCondition && this.effectiveActivationType !== \"reaction\") { // reactions condition evaluation is handled elsewhere\n        if (!(await evalActivationCondition(workflow, this.useCondition, workflow.targets.first(), { async: true }))) {\n          const message = `${this.useConditionReason} ${this.actor?.name} unable to use ${this.item.name}:${this.name}`;\n          if (!(usage.midiOptions?.noUseWarning || usage.midiOptions?.workflowOptions?.noUseWarning))\n            ui.notifications?.warn(message);\n          else\n            console.warn(`midi-qol | preChatChecks | ${message} `);\n          return removeWorkflow(workflow);\n        }\n      }\n\n      // @ts-expect-error no dnd5e-types\n      if (this.isSpell || this.item?.system.type?.value === \"scroll\") {\n        const midiFlags = this.actor?.flags[MODULE_ID];\n        // @ts-expect-error no dnd5e-types\n        const needsVerbal = this.item.system.properties.has(\"vocal\");\n        // @ts-expect-error no dnd5e-types\n        const needsSomatic = this.item.system.properties.has(\"somatic\");\n        // @ts-expect-error no dnd5e-types\n        const needsMaterial = this.item.system.properties.has(\"material\");\n        //TODO Consider how to disable this check for DamageOnly workflows and trap workflows\n        const conditionData = createConditionData({ actor: this.actor, activity: this });\n        const notSpell = await evalCondition(midiFlags?.fail?.spell?.all, conditionData, { errorReturn: false, async: true });\n        if (notSpell) {\n          ui.notifications?.warn(\"You are unable to cast the spell\");\n          return removeWorkflow(usage.workflow);\n        }\n        if (options.checkComponents) {\n          let notVerbal = await evalCondition(midiFlags?.fail?.spell?.verbal, conditionData, { errorReturn: false, async: true });\n          if (notVerbal && needsVerbal) {\n            ui.notifications?.warn(\"You make no sound and the spell fails\");\n            return removeWorkflow(usage.workflow);\n          }\n          notVerbal = notVerbal || await evalCondition(midiFlags?.fail?.spell?.vocal, conditionData, { errorReturn: false, async: true });\n          if (notVerbal && needsVerbal) {\n            ui.notifications?.warn(\"You make no sound and the spell fails\");\n            return removeWorkflow(usage.workflow);\n          }\n          const notSomatic = await evalCondition(midiFlags?.fail?.spell?.somatic, conditionData, { errorReturn: false, async: true });\n          if (notSomatic && needsSomatic) {\n            ui.notifications?.warn(\"You can't make the gestures and the spell fails\");\n            return removeWorkflow(usage.workflow);\n          }\n          const notMaterial = await evalCondition(midiFlags?.fail?.spell?.material, conditionData, { errorReturn: false, async: true });\n          if (notMaterial && needsMaterial) {\n            ui.notifications?.warn(\"You can't use the material component and the spell fails\");\n            return removeWorkflow(usage.workflow);\n          }\n        }\n      }\n      workflow.AoO = false;\n      workflow.itemUsesReaction = false;\n      if (!usage.midiOptions?.workflowOptions?.notReaction && options.checkReaction && this.actor?.inCombat) {\n        const isTurn = game.combat?.combatant === game.combat?.getCombatantsByActor(this.actor)[0];\n        if ([\"reaction\", \"reactiondamage\", \"reactionmanual\", \"reactionpreattack\"].includes(this.effectiveActivationType ?? \"\")\n          && (this.activation?.cost ?? 1) > 0) {\n          workflow.itemUsesReaction = true;\n        }\n\n        if (!isTurn && needsAOOCheck(this.actor) && this.attack && this.effectiveActivationType !== \"special\") {\n          workflow.itemUsesReaction = true;\n          workflow.AoO = true;\n        }\n\n        const queryReaction = workflow.itemUsesReaction && hasUsedReaction(this.actor) && this.actor.inCombat\n          && needsReactionCheck(this.actor)\n        if (queryReaction) {\n          const shouldRoll = await foundry.applications.api.DialogV2.confirm({\n            window: {\n              title: \"midi-qol.EnforceReactions.Title\"\n            },\n            content: i18n(\"midi-qol.EnforceReactions.Content\")\n          });\n          if (!shouldRoll) {\n            await workflow.performState(workflow.WorkflowState_Abort);\n            return removeWorkflow(usage.workflow); // user aborted roll TODO should the workflow be deleted?\n          }\n        }\n      }\n\n      workflow.itemUsesBonusAction = false;\n      if (!usage.midiOptions?.workflowOptions?.notBonusAction && options.checkBonusAction && this.actor?.inCombat && needsBonusActionCheck(this.actor)) {\n        workflow.itemUsesBonusAction = [\"bonus\"].includes(this.effectiveActivationType ?? \"\");\n        const queryBonus = workflow.itemUsesBonusAction && hasUsedBonusAction(this.actor) && needsBonusActionCheck(this.actor);\n        if (queryBonus) {\n          const shouldRoll = await foundry.applications.api.DialogV2.confirm({\n            window: {\n              title: \"midi-qol.EnforceBonusActions.Title\"\n            },\n            content: i18n(\"midi-qol.EnforceBonusActions.Content\")\n          });\n          if (!shouldRoll) {\n            await workflow.performState(workflow.WorkflowState_Abort); // user aborted roll TODO should the workflow be deleted?\n            return removeWorkflow(usage.workflow);\n          }\n        }\n      }\n      return true;\n    }\n\n    async postChatCardChecks(usage: ActivityUseConfiguration, dialog: RollDialogConfig, message: RollMessageConfig, optionsConfig: any = {}): Promise<boolean> {\n      const workflow = usage.workflow;\n      const removeWorkflow = async (workflow: Workflow) => {\n        Workflow.removeWorkflow(workflow.id);\n        const consumed = getConsumptionData(workflow.chatCard);\n        if (!foundry.utils.isEmpty(consumed)) {\n          await workflow.activity.refund(consumed);\n        }\n        await workflow.chatCard?.delete()\n        return false\n      };\n      if (debugEnabled > 0)\n        warn(\"MidiQOL | postChatCardChecks | Called\", this);\n      if (!workflow) return false;\n      let options: any = { none: false, checkAoO: true, checkReaction: true, checkBonusAction: true, checkAllowIncapacitated: false, callMacros: true, callHooks: true, checkTargets: true, checkComponents: true, checkUse: true }\n      if (optionsConfig.none) options = optionsConfig;\n      else\n        options = foundry.utils.mergeObject(options, optionsConfig, { insertKeys: true, overwrite: true });\n      if (usage.midiOptions?.proceedChecks?.none) options = usage.midiOptions.proceedChecks;\n      else\n        options = foundry.utils.mergeObject(options, usage.midiOptions?.proceedChecks ?? {}, { insertKeys: true, overwrite: true });\n      try {\n        // Needs to be after chat card as requires targets\n\n        let isEmanationTargeting = activityHasAutoPlaceTemplate(this) || activityHasEmanationNoTemplate(this);\n        let isAoETargeting = !isEmanationTargeting && activityHasAreaTarget(this);\n        let selfTarget = this.target?.affects.type === \"self\";\n        const inCombat = this.actor && isInCombat(this.actor);\n        const requiresTargets = configSettings.requiresTargets === \"always\"\n          || (configSettings.requiresTargets === \"tokens\" && (canvas?.scene?.tokens.size ?? 0) > 0)\n          || (configSettings.requiresTargets === \"combat\" && inCombat);\n        let speaker = getSpeaker(this.actor!);\n\n        const token = tokenForActor(this.actor);\n        let cancelWorkflow = false;\n\n        let shouldAllowRoll = !options.checkTargets || !requiresTargets // we don't care about targets\n          || (workflow.targets.size > 0) // there are some target selected\n          || (this.target?.affects.type ?? \"\") === \"\" // no target required\n          || selfTarget\n          || isAoETargeting // area effect spell and we will auto target\n          || isEmanationTargeting // range target and will autoTarget\n          || (!this.attack && !this.hasDamage && !this.hasSave); // does not do anything - need to check dynamic effects\n\n        if (!shouldAllowRoll) {\n          ui.notifications?.warn(i18n(\"midi-qol.noTargets\"));\n          return removeWorkflow(workflow);\n        }\n\n        // Determine allowed number of targets\n        // Skip count enforcement for scaled target counts — deferred to WorkflowState_AoETargetConfirmation\n        // where the user will have a chance to adjust targets after seeing the scaled count.\n        let allowedTargets: number;\n        const hasExplicitCount = this.target?.affects?.count && this.target.affects.count !== \"\";\n        if (hasExplicitCount && !activityHasScaledTargetCount(this)) {\n          allowedTargets = Number(this.target.affects.count);\n        } else if (options.checkTargets && requiresTargets && shouldEnforceSingleTarget(this)) {\n          // Enforce single target for weapons when the setting is enabled\n          allowedTargets = 1;\n        } else {\n          allowedTargets = Infinity;\n        }\n\n        // Check for no targets when creature-type targeting requires them\n        const creatureTargetTypes = [\"creature\", \"enemy\", \"ally\", \"willing\"];\n        if (options.checkTargets && requiresTargets && !isEmanationTargeting && !isAoETargeting\n            && creatureTargetTypes.includes(this.target?.affects?.type) && workflow.targets.size === 0) {\n          ui.notifications?.warn(i18n(\"midi-qol.noTargets\"));\n          if (debugEnabled > 0) warn(`${game.user?.name} attempted to roll with no targets selected`);\n          return removeWorkflow(workflow);\n        }\n\n        // Check for too many targets\n        if (options.checkTargets && requiresTargets && workflow.targets.size > allowedTargets) {\n          ui.notifications?.warn(i18nFormat(\"midi-qol.wrongNumberTargets\", { allowedTargets }));\n          if (debugEnabled > 0) warn(`${game.user?.name} ${i18nFormat(`midi-qol.${MODULE_ID}.wrongNumberTargets`, { allowedTargets })}`);\n          return removeWorkflow(workflow);\n        }\n\n        let tokenToUse: foundry.canvas.placeables.Token.Implementation | undefined;\n        if (speaker.token) tokenToUse = canvas.tokens?.get(speaker.token);\n        const rangeDetails = checkActivityRange(this, tokenToUse, workflow.targets, checkMechanic(\"checkRange\") !== \"none\" && !isAoETargeting)\n        if (checkMechanic(\"checkRange\") !== \"none\" && !isAoETargeting && !isEmanationTargeting && !workflow.AoO && speaker.token) {\n          if (tokenToUse && workflow.targets.size > 0) {\n            if (rangeDetails.result === \"fail\")\n              return removeWorkflow(workflow);\n            else {\n              tokenToUse = rangeDetails.attackingToken;\n            }\n          }\n        }\n\n\n        if (!workflow) return false;\n        workflow.token = tokenToUse;\n        workflow.rangeDetails = rangeDetails;\n\n        if (configSettings.undoWorkflow) await saveUndoData(workflow);\n\n        // if showing a full card we don't want to auto roll attacks or damage.\n        // Check if activity consumes ammunition\n        const ammoConsumption = this.consumption?.targets?.find(t => t.type === \"ammo\");\n        if (ammoConsumption?.target) {\n          workflow.ammunition = this.actor?.items.get(ammoConsumption.target);\n        }\n        // Need concentration removal to complete before allowing workflow to continue so have workflow wait for item use to complete\n      } catch (err) {\n        const message = `postChatCardChecks error for ${this.actor?.name} ${this.name} ${this.uuid}`;\n        TroubleShooter.recordError(err, message);\n        throw err;\n      }\n      return true;\n    }\n\n    _usageChatButtons(message) { // need to filter out place template button for auto placed or no templates\n      let buttons = super._usageChatButtons(message);\n      const autoCreateTemplate = activityHasAutoPlaceTemplate(this);\n      const emanationNoTemplate = activityHasEmanationNoTemplate(this);\n      if (autoCreateTemplate || emanationNoTemplate) {\n        buttons = buttons.filter(b => b.dataset?.action !== \"placeTemplate\")\n      }\n\n      // Add other activity consumption buttons (mirroring dnd5e pattern)\n      if (this.otherActivity?.hasConsumption()) {\n        buttons.push({\n          label: i18n(\"midi-qol.ConsumeOtherActivityResource\"),\n          icon: '<i class=\"fa-solid fa-cubes-stacked\" inert></i>',\n          dataset: { action: \"consumeOtherActivity\" }\n        }, {\n          label: i18n(\"midi-qol.RefundOtherActivityResource\"),\n          icon: '<i class=\"fa-solid fa-clock-rotate-left\" inert></i>',\n          dataset: { action: \"refundOtherActivity\" }\n        });\n      }\n\n      return buttons;\n    }\n\n    /**\n     * Determine whether a chat button should be hidden based on current state.\n     * Mirrors dnd5e's shouldHideChatButton pattern.\n     */\n    shouldHideChatButton(button: HTMLButtonElement, message: ChatMessage.Implementation): boolean {\n      const consumed = message.getFlag(MODULE_ID, \"use.consumed\");\n      switch (button.dataset.action) {\n        // Show consume button only when rolled but didn't consume (empty object {})\n        // Hide if: cancelled (false), not checked (undefined), or already consumed (non-empty object)\n        case \"consumeOtherActivity\": return !(consumed && foundry.utils.isEmpty(consumed));\n        // Show refund button only when actually consumed (non-empty object)\n        case \"refundOtherActivity\": return !consumed || foundry.utils.isEmpty(consumed);\n        // dnd5e hides placeTemplate when !game.canvas.scene, which is true during page reload\n        // before canvas is ready — only check permission here\n        case \"placeTemplate\": return !game.user?.can(\"TEMPLATE_CREATE\");\n      }\n      return super.shouldHideChatButton?.(button, message) ?? false;\n    }\n\n    async _placeEmanationTemplate(workflow: Workflow) {\n      const autoCreateTemplate = activityHasAutoPlaceTemplate(this);\n      const actor = this.item.parent;\n      const tokenToUse = workflow.token ?? getToken(actor);\n      if (!tokenToUse) return;\n      if (autoCreateTemplate) {\n        const gs = canvas.dimensions?.distance ?? 5;\n        const templateOptions: any = {};\n        // square templates don't respect the options distance field\n        let item = this;\n        let target = this.target ?? { value: 0, template: { size: 0 } };\n        const fudge = 0.1;\n        const { width, height } = tokenToUse.document;\n\n        templateOptions.distance = Math.ceil(Number(target.template.size) + Math.max((width ?? 1) / 2, (height ?? 1) / 2, 0) * (canvas.dimensions?.distance ?? 0));\n        templateOptions.x = tokenToUse.center?.x ?? 0;\n        templateOptions.y = tokenToUse.center?.y ?? 0;\n        foundry.utils.setProperty(templateOptions, `flags.${MODULE_ID}.actorUuid`, actor?.uuid);\n        foundry.utils.setProperty(templateOptions, `flags.${MODULE_ID}.tokenId`, tokenToUse.id);\n        foundry.utils.setProperty(templateOptions, `flags.${MODULE_ID}.workflowId`, this.uuid); // TODO look at this when workflow ids are chat card ids\n        foundry.utils.setProperty(templateOptions, `flags.${MODULE_ID}.itemUuid`, this.item.uuid);\n\n        // @ts-expect-error .canvas\n        let templates = game.system.canvas.AbilityTemplate.fromActivity(this, templateOptions) as foundry.canvas.placeables.MeasuredTemplate.Implementation[];\n        // fromActivity returns an array of templates - work out if we need more than one\n        if (!templates) error(\"No templates returned from fromActivity\");\n        let template = templates[0];\n        const templateData = template.document.toObject();\n        if (this.item) foundry.utils.setProperty(templateData, `flags.${MODULE_ID}.itemUuid`, this.item.uuid);\n        if (this.actor) foundry.utils.setProperty(templateData, `flags.${MODULE_ID}.actorUuid`, this.actor.uuid);\n        if (!foundry.utils.getProperty(templateData, `flags.dnd5e.origin`)) foundry.utils.setProperty(templateData, `flags.${game.system?.id}.origin`, this.item?.uuid);\n        const templateDocuments = await canvas.scene?.createEmbeddedDocuments(\"MeasuredTemplate\", [templateData]);\n\n        if (templateDocuments && templateDocuments.length > 0) {\n          let td = templateDocuments[0];\n          td.object?.refresh();\n          await busyWait(10);\n          if (workflow) {\n            workflow.templateUuid = td.uuid;\n            if (installedModules.get(\"walledtemplates\") && this.flags?.walledtemplates?.attachToken === \"caster\") {\n              // @ts-expect-error walledtemplates types\n              await tokenToUse.attachTemplate(td.object, { \"flags.dae.stackable\": \"noneName\" }, true);\n              if (workflow && !foundry.utils.getProperty(this, \"item.flags.walledtemplates.noAutotarget\"))\n                selectTargetsFromTemplates([td]);\n            }\n            else if (getActivityAutoTargetAction(this) !== \"none\") selectTargetsFromTemplates([td]);\n          } else selectTargetsFromTemplates([td]);\n          return templateDocuments;\n        }\n      }\n    }\n\n    async _usageChatContext(message) {\n      // TODO major revisit needed for this\n      const workflow = message.workflow as Workflow;\n      let systemCard = message.systemCard ?? false;\n      const minimalCard = false;\n\n      // Insert targets as required for emanation templates and emanationNoTemplate\n      // This is the wrong spot, but there is no other good spot for it.\n      const tokenToUse = getToken(this.item.parent);\n      const autoCreateTemplate = activityHasAutoPlaceTemplate(this);\n      const emanationNoTemplate = activityHasEmanationNoTemplate(this);\n      // If emanationTemplate or emanationNoTemplate setup game.user?.targets.\n      if (tokenToUse && autoCreateTemplate) {\n        this.templates = await this._placeEmanationTemplate(workflow);\n      }\n      if (tokenToUse && emanationNoTemplate) {\n        setRangedTargets(tokenToUse, this.target);\n        message.workflow?.setTargets(validTargetTokens(new Set(game.user?.targets)));\n        foundry.utils.setProperty(message.data, \"flags.dnd5e.targets\", globalThis.dnd5e.utils.getTargetDescriptors());\n      }\n      const context = await super._usageChatContext(message);\n      if (debugEnabled > 0) warn(\"show item card \", this, this.actor, this.actor?.token, systemCard, workflow);\n      let needAttackButton = !getRemoveAttackButtons(this) || configSettings.mergeCardMulti\n        || configSettings.confirmAttackDamage !== \"none\" ||\n        !(workflow?.someAutoRollEventKeySet() && !getAutoRollAttack(workflow));\n      const needDamageButton = (this.hasDamage || this.hasHealing) && (\n        ([\"none\", \"saveOnly\"].includes(getAutoRollDamage(workflow)) || workflow?.rollOptions.rollToggle)\n        || configSettings.confirmAttackDamage !== \"none\"\n        || !getRemoveDamageButtons(this)\n        || systemCard\n        || configSettings.mergeCardMulti);\n      // not used const sceneId = token?.scene && token.scene.id || canvas.scene?.id;\n      const isPlayerOwned = this.item.actor?.hasPlayerOwner;\n      const hideItemDetails = ([\"none\", \"cardOnly\"].includes(configSettings.showItemDetails) || (configSettings.showItemDetails === \"pc\" && !isPlayerOwned))\n        || !configSettings.itemTypeList?.includes(this.item.type);\n      // Are there any potential effects to apply\n      let hasEffects = workflow?.workflowType === \"BaseWorkflow\" && this.effects.some(ae => !ae.effect?.transfer && !ae.effect?.flags?.dae?.dontApply);;\n      // if target type is not blank or there are targets only set hasEffects if we are not going to remove the button later\n      if (this.target?.affects.type !== \"\" || workflow?.targets.size !== 0)\n        hasEffects &&= ![\"applyNoButton\", \"applyRemove\"].includes(configSettings.autoItemEffects);\n      let dmgBtnText = (this.actionType === \"heal\") ? getHealingLabel() : i18n(\"DND5E.Damage\");\n      if (workflow?.workflowOptions?.fastForwardDamage && configSettings.showFastForward) dmgBtnText += ` ${i18n(\"midi-qol.fastForward\")}`;\n\n      let midiContextData = {\n        hasButtons: true,\n        labels: this.labels,\n        //@ ts-expect-error TODO needed for abilities translation\n        // config: game.system.config,\n        condensed: configSettings.mergeCardCondensed && !!this.attack,\n        hasAttack: this.attack && !minimalCard && (systemCard || needAttackButton || configSettings.confirmAttackDamage !== \"none\"),\n        // @ts-expect-error no dnd5e-types\n        isHealing: !minimalCard && this.item.isHealing && (systemCard || configSettings.autoRollDamage !== \"always\"),\n        hasDamage: needDamageButton,\n        hasAttackRoll: !minimalCard && this.attack,\n        configSettings,\n        hideItemDetails,\n        dmgBtnText,\n        hasEffects,\n        effects: this.item.effects,\n        isMerge: true,\n        mergeCardMulti: configSettings.mergeCardMulti && (this.attack || this.hasDamage),\n        confirmAttackDamage: configSettings.confirmAttackDamage !== \"none\" && (this.attack || this.hasDamage),\n        RequiredMaterials: i18n(\"DND5E.RequiredMaterials\"),\n        Attack: i18n(\"DND5E.Attack\"),\n        OtherFormula: i18n(\"DND5E.OtherFormula\"),\n        displayProperties: configSettings.displayProperties,\n        canCancel: configSettings.undoWorkflow, // TODO enable this when more testing done.\n      };\n      if (!configSettings.displayProperties && context.supplements) {\n        const materialsLabel = i18n(\"DND5E.Materials\");\n        context.supplements = context.supplements.filter(s => !s.includes(`>${materialsLabel}</`));\n      }\n      const rollSaveOptions = new Set();\n      rollSaveOptions.add(configSettings.rollNPCLinkedSaves);\n      rollSaveOptions.add(configSettings.rollNPCSaves);\n      rollSaveOptions.add(configSettings.playerRollSaves);\n      const showSaveButtons = rollSaveOptions.has(\"none\") || rollSaveOptions.has(\"chat\") || configSettings.autoCheckSaves === \"none\";\n      if (this.otherActivity?.save && !this.save && showSaveButtons) {\n        context.buttons = context.buttons.concat(this.otherActivity!._usageChatButtons(message));\n      } else if (this.otherActivity?.check && !this.check && showSaveButtons) {\n        context.buttons = context.buttons.concat(this.otherActivity!._usageChatButtons(message));\n      }\n      context.buttons = context.buttons?.filter(b => ![\"rollAttack\", \"rollDamage\", \"rollHealing\"].includes(b.dataset?.action));\n      if (!showSaveButtons) context.buttons = context.buttons?.filter(b => ![\"rollSave\", \"rollCheck\"].includes(b.dataset?.action));\n      if (configSettings.autoCheckSaves !== \"none\") context.buttons?.forEach(b => { b.isDisabled = [\"rollSave\", \"rollCheck\"].includes(b.dataset?.action) ? \"disabled\" : \"\" });\n      return foundry.utils.mergeObject(context, midiContextData)\n    }\n\n    get actionType() { // the default actionType method in dnd5e mixin returns this.metadata.data instead of this.metadata.type\n      return this.metadata.type;\n    }\n\n    get otherActivity() {\n      if (this._otherActivity !== undefined) return this._otherActivity as MidiActivityMixin;\n      if (this.otherActivityId === \"none\" || this.otherActivityId === undefined) return undefined;\n      if (this.ammunitionItem) {\n        //TODO consider making this a choice of activity\n        // @ts-expect-error no dnd5e-types\n        this._otherActivity = this.ammunitionItem.system.activities?.find(\n          a => a.midiProperties?.automationOnly && a.isOtherActivityCompatible\n        ) as MidiActivityMixin | undefined;\n        if (!this._otherActivity) {\n          // @ts-expect-error no dnd5e-types\n          this._otherActivity = this.ammunitionItem.system.activities.find(\n            a => a.isOtherActivityCompatible\n          ) as MidiActivityMixin | undefined;\n        }\n\n        if (this._otherActivity) {\n          this._otherActivity.prepareData();\n          return this._otherActivity as MidiActivityMixin;\n        }\n      }\n\n      if (this.otherActivityId !== \"\") {\n        // @ts-expect-error no dnd5e-types\n        this._otherActivity = this.item.system.activities.get(this.otherActivityId) as MidiActivityMixin | undefined;\n        // @ts-expect-error no dnd5e-types\n        if (!this._otherActivity) this._otherActivity = this.item.system.activities.find(a => a.identifier === this.otherActivityId) as MidiActivityMixin | undefined;\n        this._otherActivity?.prepareData();\n        return this._otherActivity as MidiActivityMixin | undefined;\n      }\n\n      // Auto-detect only applies to attack activities\n      if (!this.attack) {\n        this._otherActivity = null;\n        return this._otherActivity as null;\n      }\n\n      if (!this._otherActivity) {\n        // Is there exactly 1 automation only and otherActivityCompatible activity on the item\n        // @ts-expect-error no dnd5e-types\n        const otherActivityOptions = this.item.system.activities.filter(a => a.midiProperties?.automationOnly && a.isOtherActivityCompatible && a.uuid !== this.uuid);\n        if (otherActivityOptions.length === 1) {\n          this._otherActivity = otherActivityOptions[0];\n        }\n      }\n      if (!this._otherActivity) {\n        // Is there exactly 1 other activity compatible activity on the item\n        // @ts-expect-error no dnd5e-types\n        const otherActivityOptions = this.item.system.activities.filter(a => a.isOtherActivityCompatible && a.uuid !== this.uuid);\n        if (otherActivityOptions.length === 1) {\n          this._otherActivity = otherActivityOptions[0];\n        }\n      }\n      // If none of the above match we can't tell which one to use.\n      this._otherActivity?.prepareData();\n      if (!this._otherActivity) this._otherActivity = null;\n      return this._otherActivity as MidiActivityMixin | undefined | null;\n    }\n\n    get useCondition() {\n      return this.useConditionText ?? \"\";\n    }\n\n    get effectCondition() {\n      return this.effectConditionText ?? \"\";\n    }\n\n    get reactionCondition() {\n      return this.useCondition ?? \"\";\n    }\n\n    get otherCondition() {\n      return this.otherActivity?.useCondition ?? \"\";\n    }\n\n    get hasDamage() {\n      return (this.damage?.parts?.length ?? 0) > 0;\n    }\n\n    get hasHealing() {\n      return this.healing !== undefined;\n    }\n    get hasAttack() {\n      return this.attack !== undefined;\n    }\n    get hasSave() {\n      return (!!this.save || !!this.check);\n    }\n  }\n  return MidiActivityMixin;\n}\n\nexport let MidiActivityMixinSheet = Base => {\n  return class MidiActivitySheet extends Base {\n\n    static DEFAULT_OPTIONS = {\n      ...super.DEFAULT_OPTIONS,\n      actions: {\n        ...super.DEFAULT_OPTIONS.actions,\n        addMacro: MidiActivitySheet.#addMacro,\n        openConditionEditor: MidiActivitySheet.#openConditionEditor,\n      }\n    }\n    static #addMacro() {\n      const Editor = globalThis.DAE?.DIMEditor;\n      if (Editor) new Editor({ document: this.activity }).render({ force: true });\n      else ui.notifications?.error(\"DIMEditor not available - install Dynamic Active Effects\");\n    }\n\n    static #openConditionEditor(event: PointerEvent, target: HTMLElement) {\n      const fieldName = target.dataset.fieldName ?? \"\";\n      const fieldLabel = target.dataset.fieldLabel ?? fieldName;\n      const input = target.closest(\".midi-condition-field-wrapper\")?.querySelector(\"input\") as HTMLInputElement | null;\n      if (!input) return;\n\n      new ConditionEditor({\n        value: input.value,\n        key: fieldName,\n        label: fieldLabel,\n        parent: this.activity?.item ?? null,\n        onSubmit: (newValue: string) => {\n          input.value = newValue;\n          input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n        },\n        onCancel: () => { }\n      }).render({ force: true });\n    }\n\n    static PARTS = {\n      ...super.PARTS,\n      \"midi-qol\": {\n        template: \"modules/midi-qol/templates/activity/parts/midi-activity-tab.hbs\",\n      }\n    }\n\n    _getTabs() {\n      const midiSubTabs = [\"modConditions\", \"workflowSettings\", \"activityManagement\", \"overtime\", \"activityMacro\"];\n      if (!midiSubTabs.includes(this.tabGroups[\"midi-qol\"])) {\n        this.tabGroups[\"midi-qol\"] = \"modConditions\";\n      }\n\n      let tabs = super._getTabs();\n      tabs = {\n        ...tabs,\n        \"midi-qol\": {\n          id: \"midi-qol\",\n          group: \"sheet\",\n          icon: \"fa-solid fa-sun\",\n          label: \"midi-qol\",\n          tabs: {\n            modConditions: {\n              id: \"modConditions\",\n              group: \"midi-qol\",\n              icon: \"fa-solid fa-filter\",\n              label: i18n(\"midi-qol.ActivitySheetTabs.modConditions\")\n            },\n            workflowSettings: {\n              id: \"workflowSettings\",\n              group: \"midi-qol\",\n              icon: \"fa-solid fa-gears\",\n              label: i18n(\"midi-qol.ActivitySheetTabs.workflowSettings\")\n            },\n            activityManagement: {\n              id: \"activityManagement\",\n              group: \"midi-qol\",\n              icon: \"fa-solid fa-sitemap\",\n              label: i18n(\"midi-qol.ActivitySheetTabs.activityManagement\")\n            },\n            overtime: {\n              id: \"overtime\",\n              group: \"midi-qol\",\n              icon: \"fa-solid fa-clock\",\n              label: i18n(\"midi-qol.ActivitySheetTabs.overtime\")\n            },\n            activityMacro: {\n              id: \"activityMacro\",\n              group: \"midi-qol\",\n              icon: \"fa-solid fa-file-pen\",\n              label: i18n(\"midi-qol.ActivitySheetTabs.activityMacro\")\n            }\n          }\n        }\n      }\n      return super._markTabs(tabs);\n    }\n\n    async _prepareMidiQolContext(context) {\n      // context = await super._prepareEffectContext(context);\n      context.ConfirmTargetOptions = Object.entries(confirmTargetOptions).map(([value, label]) => ({ value, label }));\n      if (this.activity.forcedTargetConfirmation) context.ConfirmTargetOptions = context.ConfirmTargetOptions.filter(o => o.value === this.activity.forcedTargetConfirmation);\n      const ROLL_MODES = CONST.DICE_ROLL_MODES;\n      context.RollModeOptions = [\n        { value: \"default\", label: i18n(\"Default\") },\n        { value: ROLL_MODES.PUBLIC, label: i18n(\"CHAT.RollPublic\") },\n        { value: ROLL_MODES.PRIVATE, label: i18n(\"CHAT.RollPrivate\") },\n        { value: ROLL_MODES.BLIND, label: i18n(\"CHAT.RollBlind\") },\n        { value: ROLL_MODES.SELF, label: i18n(\"CHAT.RollSelf\") }\n      ];\n      context.RemoveChatButtonsOptions = Object.entries(foundry.utils.mergeObject({ \"default\": i18n(\"midi-qol.MidiSettings\") }, removeButtonsOptions))\n        .map(([value, label]) => ({ value, label }));\n      context.placeholderIdentifier = context.activity.identifier;\n      const midiProperties = context.activity.midiProperties;\n\n      context.ConsumeDialogOptions = Object.entries(consumeConfigOptions).map(([value, label]) => {\n        return { value, label, selected: midiProperties.forceConsumeDialog === value }\n      });;\n      context.RollDialogOptions = Object.entries(rollConfigOptions).map(([value, label]) => {\n        return { value, label, selected: midiProperties.forceRollDialog === value }\n      })\n      context.DamageDialogOptions = Object.entries(damageConfigOptions).map(([value, label]) => {\n        return { value, label, selected: midiProperties.forceDamageDialog === value }\n      });\n      context.otherActivityOptions = this.item.system.activities\n        .filter(a => a.id !== this.activity.id && a.isOtherActivityCompatible)\n        .reduce((ret, a) => {\n          const identifierString = a.identifier === a.name.slugify() ? \"\" : ` (${a.identifier})`;\n          ret.push({ label: `${a.name}${identifierString}`, value: a.identifier, id: a.id });\n          return ret\n        }, [{ label: \"Auto\", value: \"\" }, { label: \"None\", value: \"none\" }]);\n      context.otherActivityOptions?.forEach(option => { option.selected = option.value === this.activity.otherActivityId || option.id === this.activity.otherActivityId });\n      context.triggeredActivityOptions = this.item.system.activities\n        .filter(a => a.id !== this.activity.id && a.isTriggerableActivity)\n        .reduce((ret, a) => {\n          const identifierString = a.identifier === a.name.slugify() ? \"\" : ` (${a.identifier})`;\n          ret.push({ label: `${a.name}${identifierString}`, value: a.identifier, id: a.id }); return ret\n        }, [{ label: \"None\", value: \"none\" }]);\n      context.triggeredActivityOptions?.filter(option => { option.selected = option.value === this.activity.midiProperties.triggeredActivityId || option.id === this.activity.midiProperties.triggeredActivityId });\n      let activity = context.activity;\n      let triggeredActivity = await context.activity.getTriggeredActivity();\n      const triggerList: String[] = [activity.name];\n      while (triggeredActivity) {\n        triggerList.push(triggeredActivity.name);\n        if (triggeredActivity.id === activity.id) {\n          ui.notifications?.error(`midi-qol | Circular activity call detected ${triggerList.join(\"->\")}`);\n          break;\n        }\n        triggeredActivity = await triggeredActivity.getTriggeredActivity();\n      }\n      context.triggeredActivityTargetOptions = Object.entries(triggeredActivityTargetOptions).map(([value, label]) => {\n        return { value, label, selected: midiProperties.triggeredActivityTargets === value }\n      })\n      context.triggeredActivityRollAsOptions = Object.entries(triggeredActivityRollAsOptions).map(([value, label]) => {\n        return { value, label, selected: midiProperties.triggeredActivityRollAs === value }\n      });\n      if ((await context.activity.getTriggeredActivity())?.isSelfTriggerableOnly) {\n        context.triggeredActivityRollAsOptions = context.triggeredActivityRollAsOptions.filter(o => o.value === \"self\");\n        // adjust target list\n      }\n      context.ignoreTraitsOptions = getIgnoreTraitsOptions().map((option) => {\n        return { ...option, selected: this.activity.midiProperties.ignoreTraits.has(option.value) }\n      });\n      context.AutoTargetTypeOptions = Object.entries(aoeTargetTypeOptions).map(([value, label]) => ({ value, label }));\n      const AutoCEEffectsOptions = Object.entries(autoCEEffectsOptions).map(([value, opt]) => ({ value, label: typeof opt === \"string\" ? opt : opt.label }));\n      context.AutoCEEffectsOptions = [{ value: \"default\", label: i18n(\"midi-qol.MidiSettings\") }, ...AutoCEEffectsOptions];\n      const defaultAction = { \"default\": i18n(\"midi-qol.MidiSettings\") };\n      context.AutoTargetActionOptions = Object.entries(foundry.utils.mergeObject(defaultAction, autoTargetOptions)).map(([value, opt]) => ({ value, label: typeof opt === \"string\" ? opt : opt.label }));\n      context.hasAreaTarget = this.activity.target?.template?.type;\n      context.possibleOtherActivity = this.activity.possibleOtherActivity;\n      context.turnChoiceOptions = [{ value: \"start\", label: i18n(\"midi-qol.OVERTIME.FIELDS.turnChoice.start\") }, { value: \"end\", label: i18n(\"midi-qol.OVERTIME.FIELDS.turnChoice.end\") }];\n      context.overTimeRollAsOptions = [{ value: \"target\", label: i18n(\"midi-qol.OVERTIME.FIELDS.rollAs.target\") }, { value: \"source\", label: i18n(\"midi-qol.OVERTIME.FIELDS.rollAs.source\") }];\n      context.CEActive = installedModules.get(\"dfreds-convenient-effects\");\n      return context;\n    }\n\n    async _preparePartContext(partId, context, options) {\n      context = await super._preparePartContext(partId, context, options);\n      context.hasDamage = this.activity.damage;\n      context.isSummons = this.activity.type === \"summon\";\n      context.consumesHP = this.activity.consumption?.targets?.some(t => t.target === \"attributes.hp.value\");\n      if (partId === \"midi-qol\") {\n        context.tab = context.tabs[\"midi-qol\"];\n        return this._prepareMidiQolContext(context);\n      }\n      return context;\n    }\n  }\n}\n\n//TODO find out why this is adding the button but the button won't trigger\nfunction attachActivitySheetHeaderButton(app, buttons) {\n  const Editor = globalThis.DAE?.DIMEditor;\n  if (!Editor) return;\n  let activity = app.activity;\n  if (!activity.macro) return;\n  const DIMtitle = i18n('dae.DIMEditor.Name');\n\n  buttons.unshift({\n    label: DIMtitle,\n    class: 'dae-dimeditor',\n    icon: 'fas fa-file-pen',\n    tooltip: DIMtitle,\n    // style: activity.macro?.command ? 'color: #36ba36;' : \"\",\n    onclick: (ev) => { new Editor({ document: app.activity }).render({ force: true }); }\n  });\n}\n\nfunction renderActivitySheetHook(app, [elem]) {\n  const Editor = globalThis.DAE?.DIMEditor;\n  if (!Editor) return;\n  let activity = app.activity;\n  if (!activity.macro) return;\n  let existingButton = elem.closest('.window-header').querySelector('button.dae-dimeditor');\n  if (existingButton) {\n    if (activity.macro?.command) existingButton.style.color = '#36ba36';\n    return;\n  }\n  let closeButton = elem.closest('.window-header').querySelector('button[data-action=\"close\"]');\n  let daeButton = document.createElement('button');\n  const DIMtitle = i18n('dae.DIMEditor.Name');\n  daeButton.setAttribute('class', 'header-control fa-solid fa-file-pen dae-dimeditor icon');\n  daeButton.onclick = function (ev) { new Editor({ document: this.activity }).render({ force: true }); }.bind(app);\n  if (activity.macro?.command) daeButton.style.color = '#36ba36';\n\n  daeButton.title = \"Activity Macro Editor\";\n  closeButton.parentNode.insertBefore(daeButton, closeButton);\n}\n\nexport let MidiActivityUsageDialog;\nexport function setupMidiActivityMixin() {\n  //@ts-expect-error\n  const ActivityUsageDialog = game.system.applications.activity.ActivityUsageDialog;\n  MidiActivityUsageDialog = class MidiActivityUsageDialog extends ActivityUsageDialog {\n    async _prepareCreationContext(context, options) {\n      context = await super._prepareCreationContext(context, options);\n      //@ts-expect-error\n      if (activityHasAutoPlaceTemplate(this.activity) || activityHasEmanationNoTemplate(this.activity)) {\n        context.hasCreation = false;\n      }\n      return context;\n    }\n  }\n  //@ts-expect-error\n  Hooks.on(\"renderActivitySheet\", renderActivitySheetHook);\n  // TODO - get this working - Hooks.on(\"getHeaderControlsActivitySheet\", attachActivitySheetHeaderButton);\n\n}\n","import { debugEnabled, warn, error, busyWait, GameSystemConfig, debug, log, i18n, MODULE_ID, i18nFormat } from \"../../midi-qol.js\";\nimport { unTimedExecuteAsGM } from \"../GMAction.js\";\nimport { Workflow } from \"../Workflow.js\";\nimport { RollModifierTracker, AdvantageFlags, computeAdvantageFlags, computeRollModifiers, applyRollModifiers, RollModifierFlags } from \"../lib/RollModifierTracker.js\";\nimport { MidiOptions } from \"../utils.js\";\nimport { replaceDefaultActivities, configSettings, confirmTargetOptions, safeGetGameSetting } from \"../settings.js\";\nimport { addAttribution, areMidiKeysPressed, callActivityHooks, completeActivityUse, addUpdatesCache, displayDSNForRoll, getSpeaker, isAutoFastForward, updateUserTargets, validTargetTokens } from \"../utils.js\";\nimport { MidiActivityMixin, MidiActivityMixinSheet } from \"./MidiActivityMixin.js\";\nimport { doActivityReactions, preTemplateTargets, requiresTargetConfirmation } from \"./activityHelpers.js\";\nimport { OnUseMacros } from \"../apps/Item.js\";\nimport { Activity, ActivityUseConfiguration, DND5ETargetDescriptor, RollDialogConfig, RollMessageConfig, RollProcessConfig } from \"../../globals.js\";\n\nexport let MidiAttackSheet: ReturnType<typeof defineMidiAttackSheetClass>;\nexport let MidiAttackActivity: ReturnType<typeof defineMidiAttackActivityClass>;\n// export let MidiAttackActivityData;\n\n/**\n * Get the effective forceRollDialog setting for an activity.\n * Returns \"always\" | \"never\" | \"default\"\n */\nfunction getEffectiveForceRollDialog(activity: any): \"always\" | \"never\" | \"default\" {\n  const activitySetting = activity.midiProperties?.forceRollDialog;\n  if (activitySetting === \"always\" || activitySetting === \"never\") {\n    return activitySetting;\n  }\n  return \"default\";\n}\n\nexport function setupAttackActivity() {\n  if (debugEnabled > 0) warn(\"MidiQOL | AttackActivity | setupAttackActivity | Called\");\n\n  //@ts-expect-error\n  MidiAttackSheet = defineMidiAttackSheetClass(game.system.applications.activity.AttackSheet);\n  MidiAttackActivity = defineMidiAttackActivityClass(GameSystemConfig.activityTypes.attack.documentClass as Activity);\n  if (replaceDefaultActivities) {\n    // GameSystemConfig.activityTypes[\"dnd5eAttack\"] = GameSystemConfig.activityTypes.attack;\n    GameSystemConfig.activityTypes.attack = { documentClass: MidiAttackActivity };\n  } else {\n    GameSystemConfig.activityTypes[\"midiAttack\"] = { documentClass: MidiAttackActivity };\n  }\n}\n\nlet defineMidiAttackSheetClass = (baseClass: any) => {\n  return class MidiAttackActivitySheet extends MidiActivityMixinSheet(baseClass) {\n\n    static PARTS = {\n      ...super.PARTS,\n      effect: {\n        template: \"modules/midi-qol/templates/activity/attack-effect.hbs\",\n        templates: [\n          ...super.PARTS.effect.templates,\n          \"modules/midi-qol/templates/activity/parts/attack-extras.hbs\",\n        ]\n      }\n    }\n\n    async _prepareEffectContext(context) {\n      const activity = this.activity;\n      context = await super._prepareEffectContext(context);\n      context.attackModeOptions = this.item.system.attackModes;\n      context.hasAmmunition = this.item.system.properties.has(\"amm\");\n      context.ammunitionOptions = this.item.system.ammunitionOptions ?? [];\n      context.ammunitionOptions?.forEach(option => {\n        option.selected = option.value === this.activity.ammunition;\n      });\n      if (activity.otherActivityUuid) {\n        ui.notifications?.warn(\"Please update other activity. otherActivityUuid is deprecated\");\n        activity.otherActivityUuid = undefined;\n      }\n      // Add healing types to the existing damageParts typeOptions (dnd5e only includes damageTypes)\n      if (context.damageParts?.length) {\n        const healingTypes = Object.entries(GameSystemConfig.healingTypes).map(([value, config]) => ({\n          value, label: config.label, selected: false\n        }));\n        for (const part of context.damageParts) {\n          // Mark existing healing type selections (types may be a Set or undefined)\n          const typesSet = part.data?.types instanceof Set ? part.data.types : new Set();\n          for (const healingType of healingTypes) {\n            healingType.selected = typesSet.has(healingType.value);\n          }\n          // Add healing types to the end of typeOptions\n          part.typeOptions = [...(part.typeOptions ?? []), ...healingTypes.map(h => ({ ...h }))];\n        }\n      }\n      context.ConfirmTargetOptions = Object.entries(confirmTargetOptions).map(([value, label]) => ({ value, label }));\n\n      if (debugEnabled > 0) {\n        warn((\"prepareEffectContext | context\"), context);\n      }\n      return context;\n    }\n\n    _prepareSubmitData(event, formData) {\n      let submitData = super._prepareSubmitData(event, formData);\n      submitData.otherActivityUuid = \"\";\n      return submitData;\n    }\n\n  }\n}\n\nlet defineMidiAttackActivityClass = <T extends Activity>(ActivityClass: T) => {\n  return class MidiAttackActivity extends MidiActivityMixin(ActivityClass) {\n    _otherActivity: Activity | undefined;\n\n    static LOCALIZATION_PREFIXES = [...super.LOCALIZATION_PREFIXES, \"midi-qol.ATTACK\"];\n\n    static defineSchema() {\n      const { StringField, ArrayField, BooleanField, SchemaField, ObjectField, NumberField, DocumentIdField } = foundry.data.fields;\n\n      const schema = {\n        ...super.defineSchema(),\n        otherActivityId: new StringField({ name: \"otherActivity\", initial: \"\" }),\n        otherActivityAsParentType: new BooleanField({\n          name: \"otherActivityAsParentType\",\n          initial: true,\n          required: false,\n          label: i18n(\"midi-qol.SHARED.FIELDS.otherActivityAsParentType.label\"),\n          hint: i18n(\"midi-qol.SHARED.FIELDS.otherActivityAsParentType.hint\")\n        }),\n        attackMode: new StringField({ name: \"attackMode\", initial: \"oneHanded\" }),\n        ammunition: new StringField({ name: \"ammunition\", initial: \"\" }),\n        // deprecated \n        otherActivityUuid: new StringField({ name: \"otherActivityUuid\", required: false, initial: \"\" }),\n        attackRollPerTarget: new StringField({ name: \"attackRollPerTarget\", initial: \"default\", required: true }),\n        fumbleThreshold: new NumberField({ name: \"fumbleThreshold\", initial: 1, required: false }),\n      };\n      return schema;\n    }\n    static metadata =\n      foundry.utils.mergeObject(\n        super.metadata, {\n        sheetClass: MidiAttackSheet,\n        title: configSettings.activityNamePrefix ? \"midi-qol.ATTACK.Title.one\" : ActivityClass.metadata.title,\n        dnd5eTitle: ActivityClass.metadata.title,\n        usage: {\n          chatCard: \"modules/midi-qol/templates/activity-card.hbs\",\n          actions: {\n            rollAttack: MidiAttackActivity.#rollAttack,\n            rollAttackAdvantage: MidiAttackActivity.#rollAttackAdvantage,\n            rollAttackDisadvantage: MidiAttackActivity.#rollAttackDisadvantage,\n            rollDamage: MidiAttackActivity.#rollDamage,\n            rollDamageNoCritical: MidiAttackActivity.#rollDamageNoCritical,\n            rollDamageCritical: MidiAttackActivity.#rollDamageCritical,\n          }\n        },\n      }, { inplace: false, insertKeys: true, insertValues: true })\n\n    static #rollAttack(this: Activity, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      const workflow = Workflow.getWorkflow(message?.uuid);\n\n      if (!message || !workflow || (workflow.currentAction && [workflow.WorkflowState_Abort, workflow.WorkflowState_Completed].includes(workflow.currentAction))) {\n        if (workflow?.itemCardUuid) Workflow.removeItemCardButtons(workflow.itemCardUuid, { removeAllButtons: true });\n        const attackConfig: ActivityUseConfiguration = { event, workflow };\n        attackConfig.midiOptions = workflow?.rollOptions ?? {};\n        attackConfig.midiOptions.workflowOptions ??= {};\n        attackConfig.midiOptions.targets = new Set(workflow?.targets);\n        attackConfig.workflow = workflow;\n        if (workflow) {\n          attackConfig.midiOptions.workflowOptions ??= {};\n          attackConfig.midiOptions.workflowOptions.autoRollAttack = true;\n        }\n        attackConfig.event = event;\n        // @ts-expect-error\n        this.use(attackConfig, {}, {});\n      } else {\n        const attackConfig: ActivityUseConfiguration = { workflow };\n        attackConfig.midiOptions = workflow?.rollOptions ?? {};\n        attackConfig.midiOptions.workflowOptions ??= workflow.workflowOptions ?? {};\n        workflow.advantage = undefined;\n        workflow.disadvantage = undefined;\n        attackConfig.midiOptions.advantage = undefined;\n        attackConfig.midiOptions.disadvantage = undefined;\n        workflow.activity = this;\n        // Update targets if user has selected new ones; preserve existing targets otherwise\n        // (e.g. template-derived targets, programmatic targetsToUse, or no selection)\n        const currentTargets = validTargetTokens(new Set(game.user?.targets));\n        if (currentTargets.size > 0) workflow.setTargets(currentTargets);\n        // @ts-expect-error\n        return this.rollAttack({ workflow }, {}, {});\n      }\n    }\n\n    static #rollAttackAdvantage(this: Activity, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      const workflow = Workflow.getWorkflow(message?.uuid);\n      if (!message || !workflow || (workflow.currentAction && [workflow.WorkflowState_Abort, workflow.WorkflowState_Completed].includes(workflow.currentAction))) {\n        if (workflow?.itemCardUuid) Workflow.removeItemCardButtons(workflow.itemCardUuid, { removeAllButtons: true });\n        const attackConfig: any = { event, workflow };\n        attackConfig.midiOptions = workflow?.rollOptions ?? {};\n        attackConfig.midiOptions.workflowOptions ??= {};\n        attackConfig.workflow = workflow;\n        if (workflow) {\n          attackConfig.midiOptions.workflowOptions ??= {};\n          attackConfig.midiOptions.workflowOptions.advantage = true;\n          attackConfig.midiOptions.workflowOptions.disadvantage = false;\n          attackConfig.midiOptions.workflowOptions.autoRollAttack = true;\n        }\n        //@ts-expect-error\n        this.use(attackConfig, {}, {});\n      } else {\n        const attackConfig: ActivityUseConfiguration = { workflow };\n        attackConfig.midiOptions = workflow?.rollOptions ?? {};\n        attackConfig.midiOptions.workflowOptions ??= workflow.workflowOptions ?? {};\n        // User explicitly chose advantage — set workflowOptions so checkAttackAdvantage processes it\n        attackConfig.midiOptions.workflowOptions.advantage = true;\n        attackConfig.midiOptions.workflowOptions.disadvantage = false;\n        workflow.activity = this;\n        // Update targets if user has selected new ones; preserve existing targets otherwise\n        const currentTargets = validTargetTokens(new Set(game.user?.targets));\n        if (currentTargets.size > 0) workflow.setTargets(currentTargets);\n        //@ts-expect-error\n        return this.rollAttack(attackConfig, {}, {});\n      }\n    }\n\n    static #rollAttackDisadvantage(this: Activity, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      const workflow = Workflow.getWorkflow(message?.uuid);\n      if (!message || !workflow || (workflow.currentAction && [workflow.WorkflowState_Abort, workflow.WorkflowState_Completed].includes(workflow.currentAction))) {\n        if (workflow?.itemCardUuid) Workflow.removeItemCardButtons(workflow.itemCardUuid, { removeAllButtons: true });\n        const attackConfig: ActivityUseConfiguration = { event, workflow };\n        attackConfig.midiOptions = workflow?.rollOptions ?? {};\n        attackConfig.midiOptions.workflowOptions ??= {};\n        attackConfig.workflow = workflow;\n        if (workflow) {\n          attackConfig.midiOptions.workflowOptions ??= {};\n          attackConfig.midiOptions.workflowOptions.autoRollAttack = true;\n          attackConfig.midiOptions.advantage = false;\n          attackConfig.midiOptions.disadvantage = true;\n        }\n        //@ts-expect-error\n        this.use(attackConfig, {}, {});\n      } else {\n        const attackConfig: any = { workflow };\n        attackConfig.midiOptions = workflow?.rollOptions ?? {};\n        attackConfig.midiOptions.workflowOptions ??= workflow.workflowOptions ?? {};\n        // User explicitly chose disadvantage — set workflowOptions so checkAttackAdvantage processes it\n        attackConfig.midiOptions.workflowOptions.advantage = false;\n        attackConfig.midiOptions.workflowOptions.disadvantage = true;\n        workflow.activity = this;\n        // Update targets if user has selected new ones; preserve existing targets otherwise\n        const currentTargets = validTargetTokens(new Set(game.user?.targets));\n        if (currentTargets.size > 0) workflow.setTargets(currentTargets);\n        //@ts-expect-error\n        return this.rollAttack(attackConfig, {}, {});\n      }\n    }\n\n    static #rollDamage(this: Activity, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      const workflow = Workflow.getWorkflow(message?.uuid);\n      if (workflow) workflow.activity = this;\n      // @ts-expect-error\n      return this.rollDamage({ event, workflow, midiOptions: { isCritical: workflow?.workflowOptions?.isCritical || workflow?.isCritical } }, {}, message);\n    }\n\n    static #rollDamageNoCritical(this: Activity, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      const workflow = Workflow.getWorkflow(message?.uuid);\n      if (workflow) workflow.activity = this;\n      // @ts-expect-error\n      return this.rollDamage({ event, workflow, critical: { allow: false }, midiOptions: { isCritical: false } }, {}, message);\n    }\n\n    static #rollDamageCritical(this: Activity, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      const workflow = Workflow.getWorkflow(message?.uuid);\n      if (workflow) workflow.activity = this;\n      // @ts-expect-error\n      return this.rollDamage({ event, workflow, midiOptions: { isCritical: true } }, {}, message);\n    }\n\n    async rollDamage(config: RollProcessConfig, dialog: RollDialogConfig, message: RollMessageConfig) {\n      if (!config.ammunition) {\n        let ammunition = this.ammunitionItem;\n        if (!ammunition) ammunition = config.workflow?.ammunition;\n        if (!ammunition && config.workflow) {\n          const data = foundry.utils.getProperty(config.workflow.chatCard, \"flags.midi-qol.ammunitionData\") as any;\n          if (data) return new Item.implementation(data, { parent: this.actor });\n        }\n        config.ammunition = ammunition;\n        this.ammunitionItem = ammunition;\n      }\n      return super.rollDamage(config, dialog, message);\n    }\n\n    async _triggerSubsequentActions(config, results) {\n    }\n\n    async useWIP(usage: any = {}, dialog: any = {}, message: any = {}) {\n      let preValidateRollHookId;\n      try {\n        if (debugEnabled > 0) warn(\"MidiQOL | AttackActivity | use | Called\", usage, dialog, message);\n        usage.midiOptions ??= {};\n        if (foundry.utils.getProperty(usage, \"midiOptions.checkRollPerTarget\") !== false) {\n          // const itemAttackPerTarget = foundry.utils.getProperty(this.item, \"flags.midi-qol.rollAttackPerTarget\");\n          const itemAttackPerTarget = this.attackRollPerTarget ?? \"default\";\n          let isAttackPerTarget = itemAttackPerTarget === \"always\"\n            || (configSettings.attackPerTarget && itemAttackPerTarget !== \"never\")\n          // isAttackPerTarget &&= this.target?.template?.type === \"\";\n          if (isAttackPerTarget) {\n            foundry.utils.setProperty(usage, \"midiOptions.workflowOptions.rollAttackPerTarget\", true);\n          }\n        }\n        return super.use(usage, dialog, message);\n      } finally {\n        //@ts-expect-error\n        if (preValidateRollHookId) Hooks.off(\"dnd5e.preValidateRollAttack\", preValidateRollHookId);\n      }\n    }\n\n    async use(this: Activity, usage: ActivityUseConfiguration = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n      if (debugEnabled > 0) warn(\"MidiQOL | AttackActivity | use | Called\", usage, dialog, message);\n      usage.midiOptions ??= {};\n      // const itemAttackPerTarget = foundry.utils.getProperty(this.item, \"flags.midi-qol.rollAttackPerTarget\");\n      const itemAttackPerTarget = this.attackRollPerTarget ?? \"default\";\n      let isAttackPerTarget = itemAttackPerTarget === \"always\"\n        || (configSettings.attackPerTarget && itemAttackPerTarget !== \"never\")\n      isAttackPerTarget &&= this.target?.template?.type === \"\"; // only works if there is no AoE template targeting.\n      // Solution for this is to have a lead Use activity that sets the targets and then calls the attack activity as a trigger activity\n      const willHaveTargets = (usage.midiOptions?.targetsToUse?.size ?? 0) > 0 || (game.user?.targets?.size ?? 0) > 0 || requiresTargetConfirmation(this, {})\n      if (!isAttackPerTarget || !willHaveTargets)\n        return super.use(usage, dialog, message);\n      // Do target confirmation if required\n      if (!usage.midiOptions.targetsToUse && !await preTemplateTargets(this, usage.midiOptions)) return false;\n      let returnValue;\n      let checkReaction = !usage.midiOptions.isTriggered; // first pass do reaction checks\n      let checkBonusAction = !usage.midiOptions.isTriggered; // first pass do bonus action checks\n      let targets: Set<foundry.canvas.placeables.Token.Implementation> | undefined;\n      const localSavedTargetIds = Array.from(game.user?.targets ?? []).map(t => t.id);\n      if (usage.midiOptions.targetsToUse) targets = usage.midiOptions.targetsToUse;\n      if (!targets) targets = new Set(game.user?.targets);\n      for (let target of targets) {\n        let item = this.item.clone({}, { keepId: true });\n        // @ts-expect-error no dnd5e-types\n        let activity = item.system.activities.get(this.id);\n        const attackConfig = foundry.utils.deepClone(usage);\n        attackConfig.midiOptions ??= {};\n        attackConfig.midiOptions.targetsToUse = new Set([target]);\n        attackConfig.midiOptions.workflowOptions ??= {};\n        attackConfig.midiOptions.proceedChecks = { checkReaction, checkBonusAction };\n        attackConfig.midiOptions.workflowOptions.targetConfirmation = \"never\";\n        const attackDialog = foundry.utils.deepClone(dialog);\n        delete attackDialog.configure;\n        returnValue = await super.use.bind(activity)(attackConfig, attackDialog, message);\n        if (!returnValue) break;\n        checkReaction = false;\n        checkBonusAction = false;\n      }\n      updateUserTargets(localSavedTargetIds);\n      return returnValue;\n    }\n\n    async rollAttack(config: RollProcessConfig = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}): Promise<Roll[] | null> {\n      const hookIds: Record<string, number | undefined> = {};\n      let rolls;\n      const workflow = config.workflow;\n      config.midiOptions ??= {};\n      // @ts-expect-error\n      const areKeysPressed = game.system.utils.areKeysPressed;\n\n      try {\n        if (debugEnabled > 0) warn(\"MidiQOL | AttackActivity | rollAttack | Called\", config, dialog, message);\n\n        if (workflow) \n          workflow.rollOptions.rollToggle = areMidiKeysPressed(config.event, \"RollToggle\");\n\n        let returnValue = await this.configureAttackRoll(config);\n        // Check returnValue first - if false (no workflow), fall through to dnd5e base behavior\n        if (!returnValue)\n          return super.rollAttack?.(config, dialog, message) ?? [];\n\n        if (!workflow || workflow?.aborted) return [];\n        if (configSettings.allowUseMacro && workflow.workflowOptions.noOnUseMacro !== true) {\n          await workflow.callMacros(workflow.item, workflow.onUseMacros?.getMacros(\"preAttackRoll\"), \"OnUse\", \"preAttackRoll\");\n          if (workflow.ammunition) await workflow.callMacros(workflow.ammunition, workflow.ammunitionOnUseMacros?.getMacros(\"preAttackRoll\"), \"OnUse\", \"preAttackRoll\");\n        }\n        // Ensure config.event is set for dnd5e key handling\n        config.event ??= workflow.rollOptions.event;\n\n        let requiresAmmoConfirmation = false;\n        // @ts-expect-error no dnd5e-types\n        if (this.item.system.properties?.has(\"amm\")) {\n          const ammoConfirmation = this.confirmAmmunition;\n          if (ammoConfirmation.reason) {\n            ui.notifications?.warn(ammoConfirmation.reason);\n          }\n          if (!ammoConfirmation.proceed) {\n            if (workflow) workflow.aborted = true;\n          }\n          requiresAmmoConfirmation = ammoConfirmation.confirm;\n        }\n        const effectiveForceRollDialog = getEffectiveForceRollDialog(this);\n\n        // Determine dialog.configure based on forceRollDialog setting and shift key\n        // Alt/Ctrl (advantage/disadvantage) are handled by dnd5e, only shift key skips dialog\n        if (areKeysPressed(config.event, \"skipDialogNormal\")) {\n          // Shift key pressed - skip dialog unless forceRollDialog=\"always\"\n          dialog.configure = effectiveForceRollDialog === \"always\";\n        } else if (effectiveForceRollDialog === \"always\") {\n          dialog.configure = true;\n        } else if (effectiveForceRollDialog === \"never\") {\n          dialog.configure = false;\n        } else {\n          // \"default\" - use fast forward settings\n          dialog.configure = !isAutoFastForward(\"attack\", { workflow });\n        }\n\n        // Ammo confirmation always requires dialog\n        if (requiresAmmoConfirmation) {\n          dialog.configure = true;\n        }\n\n        // Thrown weapons normally require dialog to choose attack mode, but respect forceRollDialog=\"never\"\n        //@ts-expect-error no dnd5e-types\n        if (this.item?.system.properties.has(\"thr\") && effectiveForceRollDialog !== \"never\") {\n          dialog.configure = true;\n        }\n\n        dialog.options ??= {};\n\n        hookIds[\"dnd5e.preRollAttack\"] = Hooks.once(\"dnd5e.preRollAttack\", (rollConfig, dialogConfig, messageConfig) => {\n          if (workflow?.aborted) return false;\n          if (workflow?.rollOptions?.rollToggle) dialogConfig.configure = !dialogConfig.configure;\n          if (configSettings.checkTwoHanded && [\"twoHanded\", \"offhand\"].includes(rollConfig.attackMode)) {\n            // check equipment - shield other weapons for equipped status\n            // @ts-expect-error no dnd5e-types\n            if (this.actor.system.attributes.ac?.shield > 0) {\n              ui.notifications?.warn(i18n(\"midi-qol.TwoHandedShieldWarning\"));\n              if (workflow) workflow.aborted = true;\n              return false;\n            }\n          } else if (!rollConfig.attackMode && dialogConfig.options?.attackModeOptions?.length) dialogConfig.configure = true;\n\n          // Apply roll modifiers (auto-fail/success, min/max) for attack rolls\n          const actType = this.actionType;\n          const attackModifierFlags: RollModifierFlags = {\n            failFlags: [\"fail.all\", \"fail.attack.all\", `fail.attack.${actType}`],\n            successFlags: [\"success.all\", \"success.attack.all\", `success.attack.${actType}`],\n            maxFlags: [\"max.attack.all\", `max.attack.${actType}`],\n            minFlags: [\"min.attack.all\", `min.attack.${actType}`]\n          };\n          if (workflow?.attackRollModifierTracker) {\n            computeRollModifiers(this.actor!, attackModifierFlags, workflow.attackRollModifierTracker, { workflow });\n            applyRollModifiers(workflow.attackRollModifierTracker, rollConfig, dialogConfig);\n          }\n\n          return true;\n        });\n        hookIds[\"dnd5e.rollAttack\"] = Hooks.once(\"dnd5e.rollAttack\", (rolls, { ammoUpdate, subject }) => {\n          if (ammoUpdate?.destroy) {\n            // @ts-expect-error no dnd5e-types\n            const data = this.actor.items.get(ammoUpdate.id).toObject();\n            addUpdatesCache(workflow.id, { \"flags.midi-qol.ammunitionData\": data });\n          }\n        });\n        hookIds[\"dnd5e.postAttackRollConfiguration\"] = Hooks.once(\"dnd5e.postAttackRollConfiguration\", (rolls, config, dialog, message) => {\n          if (rolls?.length === 0) {\n            // if (config.workflow) config.workflow.aborted = true;\n            return false;\n          }\n          // @ts-expect-error no dnd5e-types\n          if (configSettings.checkTwoHanded && [\"twoHanded\", \"offhand\"].includes(rolls?.[0]?.options?.attackMode)) {\n            // check equipment - shield other weapons for equipped status\n            // @ts-expect-error no dnd5e-types\n            if (this.actor.system.attributes.ac?.shield > 0) {\n              ui.notifications?.warn(i18n(\"midi-qol.TwoHandedShieldWarning\"));\n              if (config.workflow) config.workflow.aborted = true;\n              return false;\n            }\n          }\n          // @ts-expect-error no dnd5e-types\n          if (this.requireAmmunition && this.item.system.properties?.has(\"amm\")) {\n            // @ts-expect-error no dnd5e-types\n            const chosenAmmunition = this.actor.items.get(rolls?.[0]?.options?.ammunition);\n            // @ts-expect-error no dnd5e-types\n            if ((chosenAmmunition?.system.quantity ?? 0) <= 0) ui.notifications?.error(i18nFormat(\"midi-qol.NoAmmunition\", { name: chosenAmmunition?.name ?? \"Ammunition\" }));\n            else this.ammunitionItem = chosenAmmunition;\n            // @ts-expect-error no dnd5e-types\n            return chosenAmmunition?.system.quantity > 0;\n          }\n          return true;\n        })\n        // Capture target descriptors last, after all other modules have had a chance to modify AC (e.g. cover)\n        //@ts-expect-error dnd5e hook not in fvtt-types\n        hookIds[\"dnd5e.postRollConfiguration\"] = Hooks.once(\"dnd5e.postRollConfiguration\", (rolls, config, dialog, message) => {\n          const targetDescriptors = foundry.utils.getProperty(message, \"data.flags.dnd5e.targets\") as DND5ETargetDescriptor[] | undefined;\n          if (targetDescriptors && workflow) {\n            // Don't mutate td.ac — it's a shared reference with the chat message data.\n            // null AC (coverTotal) is handled downstream in checkHits() as auto-miss.\n            workflow.targetDescriptors = targetDescriptors as DND5ETargetDescriptor[];\n          }\n        });\n        // Active defence resolves by triggering saving throws and returns early\n        if (workflow.useActiveDefence) {\n          message.create = false; // go through the roll process but don't show the attack roll.\n        }\n\n        message ??= {};\n        message.create ??= config.midiOptions.chatMessage;\n        const rollMode = safeGetGameSetting(\"core\", \"rollMode\");\n        const showChatAttackCard = game.user?.isGM && configSettings.gmAttackDamageCards && [CONST.DICE_ROLL_MODES.SELF, CONST.DICE_ROLL_MODES.BLIND, CONST.DICE_ROLL_MODES.PRIVATE].includes(rollMode);\n        if (showChatAttackCard) {\n          // Show a chat card for attack rolls if the players are not going to see the midi card.\n          message.create = true;\n          foundry.utils.setProperty(message, \"data.flags.midi-qol.gmHide\", true); // since the gm will see the midi card hide the attack card for the author\n          message.rollMode = rollMode;\n        }\n        config.attackMode ??= this.attackMode ?? \"oneHanded\";\n        // @ts-expect-error isVersatile is a dnd5e getter\n        if (config.event && areMidiKeysPressed(config.event, \"Versatile\") && this.item.isVersatile) {\n          config.attackMode = \"twoHanded\";\n        }\n        // @ts-expect-error weirdness with how I did the types\n        rolls = await super.rollAttack(config, dialog, message);\n\n        if (!rolls || rolls.length === 0) {\n          // if (workflow) workflow.aborted = true;\n          return null;\n        }\n        if (dialog.configure && rolls[0]?.options?.ammunition && rolls[0].options.ammunition !== this.ammunition) {\n          await this.update({ ammunition: rolls[0].options.ammunition });\n          this.ammunition = rolls[0].options.ammunition;\n          this.ammunitionItem = this.actor?.items.get(this.ammunition);\n          this._otherActivity = undefined; // reset this in case ammunition changed\n        }\n\n        if (workflow) {\n          // Sync tracker with what the player actually chose in the roll dialog\n          // @ts-expect-error CONFIG.Dice.D20Roll not typed\n          const ADV_MODE: { DISADVANTAGE: number, NORMAL: number, ADVANTAGE: number } = CONFIG.Dice.D20Roll.ADV_MODE;\n          const returnedAdvMode = rolls[0]?.options?.advantageMode;\n          if (returnedAdvMode !== undefined) {\n            const trackerMode = workflow.attackRollModifierTracker.advantageMode;\n            if (returnedAdvMode !== trackerMode) {\n              const label = i18n(\"midi-qol.ConfigButtons\");\n              if (returnedAdvMode === ADV_MODE.ADVANTAGE) {\n                workflow.attackRollModifierTracker.advantage.setOverride(\"config-buttons\", label);\n                workflow.attackRollModifierTracker.disadvantage.clearOverride();\n              } else if (returnedAdvMode === ADV_MODE.DISADVANTAGE) {\n                workflow.attackRollModifierTracker.disadvantage.setOverride(\"config-buttons\", label);\n                workflow.attackRollModifierTracker.advantage.clearOverride();\n              } else {\n                // Player chose normal — clear any overrides\n                workflow.attackRollModifierTracker.advantage.clearOverride();\n                workflow.attackRollModifierTracker.disadvantage.clearOverride();\n              }\n            }\n          }\n\n          workflow.attackMode = rolls[0].options.attackMode ?? config.attackMode;\n          if (this.ammunition && !this.ammunitionItem) { // assume it was deleted\n            const storedData = foundry.utils.getProperty(workflow.chatCard, \"flags.midi-qol.ammunitionData\") as any;\n            if (storedData) workflow.ammunition = new Item.implementation(storedData, { parent: this.actor })\n          } else workflow.ammunition = this.ammunitionItem;\n          if (this.ammunition) this.update({ ammunition: this.ammunitionItem?.id ?? \"\" });\n          if (configSettings.allowUseMacro) {\n            workflow.ammunitionOnUseMacros = workflow.ammunition?.flags?.[MODULE_ID]?.onUseMacroParts ?? new OnUseMacros();\n          }\n          if (workflow.workflowOptions?.attackRollDSN !== false && !showChatAttackCard) await displayDSNForRoll(rolls[0], \"attackRollD20\");\n          await workflow?.setAttackRoll(rolls[0]);\n          rolls[0] = await workflow.processAttackRollBonusFlags();\n          // Always add attribution to roll for indicator/tooltip display\n          addAttribution(rolls[0], workflow.attackAttribution);\n          await workflow?.setAttackRoll(rolls[0]);\n        }\n        if (debugEnabled > 0) {\n          warn(\"AttackActivity | rollAttack | setAttackRolls completed \", rolls);\n          warn(`Attack Activity | workflow is suspended ${workflow?.suspended}`);\n        }\n        if (workflow?.suspended) workflow.unSuspend.bind(workflow)({ attackRoll: rolls[0] })\n      } catch (err) {\n        error(\"AttackActivity | rollAttack | Error configuring dialog\", err);\n      } finally {\n        for (const [hookName, hookId] of Object.entries(hookIds)) {\n          //@ts-expect-error \n          if (hookId !== undefined) Hooks.off(hookName, hookId);\n        }\n      }\n      return rolls;\n    }\n\n    async configureAttackRoll(this: Activity, config: RollProcessConfig): Promise<boolean> {\n      if (debugEnabled > 0) warn(\"configureAttackRoll\", this, config);\n      if (!config.workflow) return false;\n      let workflow: Workflow = config.workflow;\n      config.midiOptions ??= {};\n\n      if (debugEnabled > 1) debug(\"Entering configure attack roll\", config.event, workflow, config.rollOptions);\n      if (workflow.workflowType === \"BaseWorkflow\") {\n        if (workflow.attackRoll && workflow.currentAction === workflow.WorkflowState_Completed) {\n          // This should not happen anymore\n          // we are re-rolling the attack.\n          await workflow.setDamageRolls(undefined)\n          if (workflow.itemCardUuid) {\n            await Workflow.removeItemCardButtons(workflow.itemCardUuid, { removeConfirmButtons: true });\n          }\n          if (workflow.damageRollCount > 0) { // re-rolling damage counts as new damage\n            const messageConfig = foundry.utils.mergeObject({\n              create: true,\n              data: {\n                flags: {\n                  dnd5e: {\n                    // @ts-expect-error\n                    ...this.messageFlags,\n                    messageType: \"usage\",\n                    use: {\n                      effects: this.applicableEffects?.map(e => e.id)\n                    }\n                  }\n                }\n              },\n              hasConsumption: false\n            }, { flags: workflow.chatCard.flags })\n            // @ts-expect-error\n            const itemCard = await this._createUsageMessage(messageConfig);\n            // const itemCard = await this.displayCard(foundry.utils.mergeObject(config, { systemCard: false, workflowId: workflow.id, minimalCard: false, createMessage: true }));\n            workflow.itemCardUuid = itemCard.uuid;\n            if (configSettings.undoWorkflow && workflow.undoData) {\n              workflow.undoData.chatCardUuids = workflow.undoData.chatCardUuids.concat([itemCard.uuid]);\n              unTimedExecuteAsGM(\"updateUndoChatCardUuids\", workflow.undoData);\n            }\n          }\n        }\n      }\n\n      if (workflow.workflowType === \"TrapWorkflow\") workflow.workflowOptions.fastForward = true;\n\n      await doActivityReactions(this, workflow);\n      await busyWait(10);\n      if (configSettings.allowUseMacro && workflow.workflowOptions.noTargetOnUseMacro !== true) {\n        await workflow.triggerTargetMacros([\"isPreAttacked\"]);\n        if (workflow.aborted) {\n          console.warn(`midi-qol | item ${workflow.item.name ?? \"\"} roll blocked by isPreAttacked macro`);\n          await workflow.performState(workflow.WorkflowState_Abort);\n          return false;\n        }\n      }\n\n      // preAttackRoll hooks may modify flags; checkAttackAdvantage() runs after them (below)\n      if (await callActivityHooks(this, \"midi-qol.preAttackRoll\", workflow) === false) {\n        console.warn(\"midi-qol | attack roll blocked by preAttackRoll hook\");\n        return false;\n      }\n      await workflow.checkAttackAdvantage();\n      // Process keyboard modifiers (ctrl/alt for advantage/disadvantage) after flag processing\n      workflow.attackRollModifierTracker.processKeys(config);\n      if (await callActivityHooks(this, \"midi-qol.preAttackRollConfig\", workflow) === false) {\n        console.warn(\"midi-qol | attack roll blocked by preAttackRollConfig hook\");\n        return false;\n      }\n      if (configSettings.allowUseMacro && workflow.workflowOptions?.noOnUseMacro !== true) {\n        await workflow.callMacros(workflow.item, workflow.onUseMacros?.getMacros(\"preAttackRollConfig\"), \"OnUse\", \"preAttackRollConfig\");\n        if (workflow.ammunition) await workflow.callMacros(workflow.ammunition, workflow.ammunitionOnUseMacros?.getMacros(\"preAttackRollConfig\"), \"OnUse\", \"preAttackRollConfig\");\n      }\n\n      // Set config advantage/disadvantage from tracker (after all hooks/macros have had a chance to modify)\n      if (workflow.attackRollModifierTracker.hasAdvantage) config.advantage = true;\n      if (workflow.attackRollModifierTracker.hasDisadvantage) config.disadvantage = true;\n\n      workflow.attackRollCount += 1;\n      if (workflow.attackRollCount > 1) workflow.damageRollCount = 0;\n\n      // create an options object to pass to the roll.\n      config.midiOptions = foundry.utils.mergeObject(config.midiOptions, {\n        chatMessage: ([\"TrapWorkflow\", \"Workflow\"].includes(workflow.workflowType)) ? false : config.midiOptions.chatMessage,\n        fastForward: workflow.workflowOptions?.fastForwardAttack ?? workflow.rollOptions.fastForwardAttack ?? config.midiOptions.fastForward,\n        messageData: {\n          speaker: getSpeaker(this.actor!)\n        }\n      },\n        { insertKeys: true, overwrite: true });\n      if (workflow.rollOptions.rollToggle) config.midiOptions.fastForward = !config.midiOptions.fastForward;\n\n      // Setup labels for advantage reminder\n      const advantageLabels = Array.from(workflow.advReminderAttackAdvAttribution).filter(s => s.startsWith(\"ADV:\")).map(s => s.replace(\"ADV:\", \"\"));\n      if (advantageLabels.length > 0) foundry.utils.setProperty(config.midiOptions, \"dialogOptions.adv-reminder.advantageLabels\", advantageLabels);\n      const disadvantageLabels = Array.from(workflow.advReminderAttackAdvAttribution).filter(s => s.startsWith(\"DIS:\")).map(s => s.replace(\"DIS:\", \"\"));\n      if (disadvantageLabels.length > 0) foundry.utils.setProperty(config.midiOptions, \"dialogOptions.adv-reminder.disadvantageLabels\", disadvantageLabels);\n\n      if (config.midiOptions.fumble === true || config.midiOptions.fumble === false)\n        delete config.midiOptions.fumble;\n\n      config.midiOptions.chatMessage = false;\n      if (config.midiOptions?.workflowOptions?.versatile) config.attackMode = \"twoHanded\";\n      return true;\n    }\n    getDamageConfig(config: RollProcessConfig) {\n      const rollConfig = super.getDamageConfig(config);\n      for (let roll of rollConfig.rolls) {\n        if (rollConfig.ammunition) { // add ammunition properties to the damage roll\n          let rollProperties = new Set(roll.options.properties);\n          const ammunitionProperties = rollConfig.ammunition.system.properties;\n          roll.options.properties = Array.from(rollProperties.union(ammunitionProperties));\n        }\n        // critical/fumble will be inserted when roll.build is called.\n      }\n      return rollConfig;\n    }\n    /** @override */\n    get actionType() {\n      const type = this.attack!.type;\n      return `${type.value === \"ranged\" ? \"r\" : \"m\"}${type.classification === \"spell\" ? \"sak\" : \"wak\"}`;\n    }\n\n    set ammunitionItem(value) {\n      this._ammunitionItem = value;\n    }\n\n    get ammunitionItem() {\n      if (this._ammunitionItem) return this._ammunitionItem;\n      if (!this.ammunition) return undefined;\n      const ammunitionItem = this.actor?.items?.get(this.ammunition);\n      return ammunitionItem\n    }\n    get possibleOtherActivity() {\n      return false;\n    }\n    get isOtherActivityCompatible() {\n      return false;\n    }\n\n    get canUseOtherActivity() {\n      return true;\n    }\n\n    prepareData() {\n      super.prepareData();\n      if (this.otherActivityUuid && this.otherActivityUuid !== \"\") {\n        console.warn(`midi-qol | otherActivityUuid is deprecated. Edit ${this.actor?.name ?? \"\"} ${this.item?.name ?? \"\"} ${this.name} and reset other activity. Currently ${this.otherActivityUuid}`);\n      }\n    }\n    get confirmAmmunition(): { reason?: string, confirm: boolean, proceed: boolean } {\n      // @ts-expect-error no dnd5e-types\n      const ammunitionOptions = this.item.system.ammunitionOptions;\n      let ammoAutoSelected = false;\n      const ammoCount = (ammunitionOptions?.filter(ammo => !ammo.disabled) ?? []).length;\n      if ((ammoCount ?? 0) > 0 && (this.ammunition ?? \"\") === \"\") {\n        this.ammunition = ammunitionOptions?.find((ammo: { disabled?: boolean; value?: string }) => !ammo.disabled)?.value ?? \"\";\n        ammoAutoSelected = true;\n      }\n      if (this.requireAmmunition && ammoCount === 0) return { reason: i18n(\"midi-qol.NoAmmunitionAvailable\"), proceed: false, confirm: true };\n      if (this.requireAmmunition && !this.ammunition) return { reason: i18n(\"midi-qol.NoAmmunitionSelected\"), proceed: true, confirm: true };\n      if (ammunitionOptions.some(ammo => ammo.value === this.ammunition && ammo.disabled)) return { reason: game.i18n?.format(\"midi-qol.NoAmmunition\", { name: this.ammunitionItem?.name }), proceed: true, confirm: true };\n      if (game.user?.isGM) return { confirm: configSettings.gmConfirmAmmunition && (ammoCount > 1 || ammoAutoSelected), proceed: true };\n      return { confirm: configSettings.confirmAmmunition && (ammoCount > 1 || ammoAutoSelected), proceed: true };\n    }\n\n    get requireAmmunition(): boolean {\n      return game.user?.isGM ? configSettings.gmRequireAmmunition : configSettings.playerRequireAmmunition;\n    }\n    async _usageChatContext(message) {\n      const context = await super._usageChatContext(message);\n\n      context.hasAttack = this.attack; // && !minimalCard && (systemCard || needAttackButton || configSettings.confirmAttackDamage !== \"none\"),\n      return context;\n    }\n  }\n}\n\n/**\n * Compute attack advantage/disadvantage from actor flags and target grants flags.\n * This handles the flag-based advantage checks for attacks.\n * Special rules (flanking, invisible, nearby foe, heavy weapons) are handled separately in Workflow.\n *\n * @param actor - The attacking actor\n * @param actionType - The action type (mwak, rwak, msak, rsak, etc.)\n * @param options - MidiOptions including workflow, target info\n * @param abilityId - Optional ability ID for ability-based attack flags (e.g., \"str\", \"dex\")\n * @param tracker - Optional existing RollModifierTracker to populate\n * @returns RollModifierTracker with attack advantage attribution\n */\nexport async function computeAttackAdvantage(\n  actor: Actor.Implementation,\n  actionType: string,\n  options: MidiOptions,\n  abilityId?: string,\n  tracker?: RollModifierTracker\n): Promise<RollModifierTracker> {\n  tracker ??= new RollModifierTracker();\n\n  // Spell school for school-specific attack flags\n  // @ts-expect-error no dnd5e-types\n  const attackSchool: string | undefined = options.item?.system?.school;\n\n  // Define attack advantage flags\n  const attackFlags: AdvantageFlags = {\n    advantageFlags: [\n      \"advantage.all\",\n      \"advantage.attack.all\",\n      `advantage.attack.${actionType}`,\n      // Include ability-based attack flags if abilityId is provided\n      ...(abilityId ? [`advantage.attack.${abilityId}`] : []),\n      ...(attackSchool ? [`advantage.attack.school.${attackSchool}`] : [])\n    ],\n    disadvantageFlags: [\n      \"disadvantage.all\",\n      \"disadvantage.attack.all\",\n      `disadvantage.attack.${actionType}`,\n      ...(abilityId ? [`disadvantage.attack.${abilityId}`] : []),\n      ...(attackSchool ? [`disadvantage.attack.school.${attackSchool}`] : [])\n    ],\n    noAdvantageFlags: [\n      \"noAdvantage.all\",\n      \"noAdvantage.attack.all\",\n      `noAdvantage.attack.${actionType}`,\n      ...(abilityId ? [`noAdvantage.attack.${abilityId}`] : []),\n      ...(attackSchool ? [`noAdvantage.attack.school.${attackSchool}`] : [])\n    ],\n    noDisadvantageFlags: [\n      \"noDisadvantage.all\",\n      \"noDisadvantage.attack.all\",\n      `noDisadvantage.attack.${actionType}`,\n      ...(abilityId ? [`noDisadvantage.attack.${abilityId}`] : []),\n      ...(attackSchool ? [`noDisadvantage.attack.school.${attackSchool}`] : [])\n    ],\n    systemRollModeFields: [], // dnd5e doesn't have native attack roll modes at actor level\n    // Target grants flags (checked on target actor)\n    sourceAdvantageFlags: [\n      \"grants.advantage.all\",\n      \"grants.advantage.attack.all\",\n      `grants.advantage.attack.${actionType}`,\n      ...(attackSchool ? [`grants.advantage.attack.school.${attackSchool}`] : [])\n    ],\n    sourceDisadvantageFlags: [\n      \"grants.disadvantage.all\",\n      \"grants.disadvantage.attack.all\",\n      `grants.disadvantage.attack.${actionType}`,\n      ...(attackSchool ? [`grants.disadvantage.attack.school.${attackSchool}`] : [])\n    ],\n    sourceNoAdvantageFlags: [\n      \"grants.noAdvantage.attack.all\",\n      `grants.noAdvantage.attack.${actionType}`,\n      ...(attackSchool ? [`grants.noAdvantage.attack.school.${attackSchool}`] : [])\n    ],\n    sourceNoDisadvantageFlags: [\n      \"grants.noDisadvantage.attack.all\",\n      `grants.noDisadvantage.attack.${actionType}`,\n      ...(attackSchool ? [`grants.noDisadvantage.attack.school.${attackSchool}`] : [])\n    ]\n  };\n\n  // For attacks, the entity that grants advantage/disadvantage is the defender (target)\n  const targetToken = options.workflow?.targets?.first();\n  const targetActor = targetToken?.actor ?? undefined;\n\n  await computeAdvantageFlags(actor, attackFlags, {\n    ...options,\n    grantsActor: targetActor,\n    grantsToken: targetToken\n  }, tracker);\n\n  return tracker;\n}","import { i18n } from \"../../midi-qol.js\";\nimport { safeGetGameSetting } from \"../settings.js\";\nimport { asyncHooksCall, asyncHooksCallAll } from \"../utils.js\";\n\n//@ts-expect-error\nconst ActivityChoiceDialog = dnd5e.applications?.activity?.ActivityChoiceDialog;\n\n// The post-hook choice list create() computed, keyed by item, so the dialog it opens reuses it in\n// _prepareContext instead of re-running the filter + prune hook. Overwritten on each create(); the\n// WeakMap lets entries be collected with their item.\nconst pendingChoices = new WeakMap();\n\nexport class MidiActivityChoiceDialog extends ActivityChoiceDialog {\n  static get defaultOptions() {\n    return super.getDefaultOptions();\n  }\n\n  /** The item's offerable activities after midi's usability filter and the module prune hook.\n   *  Returns the surviving choice contexts ({id, name, img, sort}), sorted. Single source of truth\n   *  for \"which activities can be used\" — shared by the dialog and the item-use entry points so the\n   *  prompt-vs-autoselect-vs-skip decision matches exactly what the dialog would display. */\n  static async getActivities(item: Item.Implementation) {\n    // @ts-expect-error no dnd5e types — item.system.activities / item.flags.dnd5e aren't typed\n    const all = [...item.system.activities];\n    const riders: string[] = item.flags.dnd5e?.riders?.activity ?? [];\n    const activities = all\n      .filter(a => a.canUse !== false && !riders.includes(a.id) && !a.midiProperties?.automationOnly && !a.inProgress)\n      .map(a => ({ id: a.id, name: a.name, img: a.img, sort: a.sort }))\n      .sort((a, b) => a.sort - b.sort);\n    // Modules may remove entries from `activities` to make them unavailable for this use.\n    await asyncHooksCallAll(\"midi-qol.itemUseActivitySelect\", { activities, item });\n    return activities;\n  }\n\n  /** Resolve the activity to use for an item, applying the prune hook exactly once:\n   *  - 0 survivors  → null (caller should skip rolling the item)\n   *  - 1 survivor   → that Activity directly, no dialog (unless chooseActivity forces the prompt)\n   *  - 2+ survivors → render the picker and resolve to the chosen Activity (or null if dismissed) */\n  static async create(item: Item.Implementation, { chooseActivity, ...options }: { chooseActivity?: boolean } & Record<string, unknown> = {}) {\n    const activities = await this.getActivities(item);\n    if (activities.length === 0) return null;\n    // @ts-expect-error no dnd5e types\n    if (activities.length === 1 && !chooseActivity) return item.system.activities.get(activities[0].id);\n    pendingChoices.set(item, activities);\n    return super.create(item, options);\n  }\n\n  // Only here to satisfy the linter\n  get item() { return super.item };\n\n  async _prepareContext(options) {\n    let controlHint;\n    if ( safeGetGameSetting(\"dnd5e\", \"controlHints\") ) {\n      controlHint = i18n(\"DND5E.Controls.Activity.FastForwardHint\");\n      controlHint = controlHint.replace(\n        \"<left-click>\",\n        `<img src=\"systems/dnd5e/icons/svg/mouse-left.svg\" alt=\"${i18n(\"DND5E.Controls.LeftClick\")}\">`\n      );\n    }\n    // Reuse the list create() already computed (filter + prune hook fired once); only recompute if\n    // the dialog was constructed by some path that didn't go through create().\n    const activities = pendingChoices.get(this.item) ?? await MidiActivityChoiceDialog.getActivities(this.item);\n    return {\n      ...await super._prepareContext(options),\n      controlHint,\n      activities\n    };\n  }\n}\n","import { i18n, i18nFormat, GameSystemConfig } from \"../../midi-qol.js\";\nimport { PreComputedAdvantageData } from \"../../globals.js\";\nimport { RollModifierTracker } from \"../lib/RollModifierTracker.js\";\nimport { getToolLabel } from \"../utils.js\";\n\n/**\n * A choice entry for the dropdown in the roll dialog.\n */\nexport interface RollChoice {\n  value: string;\n  label: string;\n  modifier: string;\n}\n\n/** Re-export for backward compatibility - canonical type is PreComputedAdvantageData in globals.ts */\nexport type PreComputedAdvantage = PreComputedAdvantageData;\n\n/**\n * Custom D20 roll dialog that adds a filtered choice dropdown when multiple\n * abilities or skills are available for a save/check. Follows the same pattern as\n * dnd5e's SkillToolRollConfigurationDialog.\n *\n * The dialog is used via `dialog.applicationClass = MidiRollChoiceDialog` and\n * `dialog.options.rollChoices` / `dialog.options.advantageByChoice`.\n *\n * Set `dialog.options.choiceType` to `\"ability\"` (default), `\"skill\"`, or\n * `\"tool\"` to control which config property the dropdown reads/writes.\n */\n//@ts-expect-error D20RollConfigurationDialog is not typed\nconst D20RollConfigurationDialog = dnd5e.applications?.dice?.D20RollConfigurationDialog;\nexport class MidiRollChoiceDialog extends D20RollConfigurationDialog {\n  // Only here to satisfy the linter\n  static get rollType() { return super.rollType; }\n\n  get config(): any { return super.config; }\n  get message(): any { return super.message; }\n  get rolls(): any { return super.rolls; }\n\n  /** Typed access to our custom options (ApplicationV2 options are untyped) */\n  get midiOptions(): { rollChoices: RollChoice[], choiceType: string, advantageByChoice?: Record<string, PreComputedAdvantage> } {\n    const opts = (this as any).options;\n    return {\n      rollChoices: opts.rollChoices ?? [],\n      choiceType: opts.choiceType ?? \"ability\",\n      advantageByChoice: opts.advantageByChoice\n    };\n  }\n\n  /** Typed wrapper for ApplicationV2._updateFrame (protected method) */\n  private _midiUpdateFrame(options: { window: { title: string } }): void {\n    (this as any)._updateFrame(options);\n  }\n\n  /** Typed wrapper for ApplicationV2.render with parts */\n  private _midiRenderParts(parts: string[]): void {\n    (this as any).render({ parts });\n  }\n\n  /** Mutable default button override — options are frozen by ApplicationV2, so we track it here instead */\n  _midiDefaultButton: string | undefined;\n\n  /** @override */\n  static DEFAULT_OPTIONS = {\n    rollChoices: [] as RollChoice[],\n    advantageByChoice: {} as Record<string, PreComputedAdvantage>,\n    choiceType: \"ability\" as \"ability\" | \"skill\" | \"tool\"\n  };\n\n  /* -------------------------------------------- */\n  /*  Rendering                                   */\n  /* -------------------------------------------- */\n\n  /** @override — restore focus to autofocus button after partial re-render of buttons part */\n  _syncPartState(partId, newElement, priorElement, state) {\n    super._syncPartState(partId, newElement, priorElement, state);\n    if (partId === \"buttons\") {\n      (newElement.querySelector(\"[autofocus]\") as HTMLElement | null)?.focus();\n    }\n  }\n\n  /** @override — read defaultButton from mutable _midiDefaultButton when set, instead of frozen options */\n  async _prepareButtonsContext(context, options) {\n    context = await super._prepareButtonsContext(context, options);\n    const overrideButton = this._midiDefaultButton;\n    if (overrideButton) {\n      for (const [key, btn] of Object.entries(context.buttons ?? {}) as [string, any][]) {\n        btn.default = (key === overrideButton);\n      }\n    }\n    return context;\n  }\n\n  /** @override */\n  async _prepareConfigurationContext(context, options) {\n    context = await super._prepareConfigurationContext(context, options);\n    const { rollChoices: choices, choiceType } = this.midiOptions;\n\n    // For skill/tool rolls, add the ability dropdown (replicates SkillToolRollConfigurationDialog)\n    // so the player can change which ability is used for the check.\n    if (choiceType === \"skill\" || choiceType === \"tool\") {\n      context.fields.unshift({\n        field: new foundry.data.fields.StringField({\n          //@ts-expect-error no dnd5e-types\n          required: true, blank: false, label: game.i18n.localize(\"DND5E.Abilities\")\n        }),\n        name: \"ability\",\n        options: Object.entries(CONFIG.DND5E.abilities).map(([value, { label }]) => ({ value, label })),\n        value: this.config.ability\n      });\n    }\n\n    if (choices?.length > 1) {\n      context.fields.unshift({\n        field: new foundry.data.fields.StringField({\n          required: true, blank: false, label: i18n(\"midi-qol.RollChoice\")\n        }),\n        name: choiceType,\n        options: choices.map(c => ({\n          value: c.value,\n          label: `${c.label} (${c.modifier})`\n        })),\n        value: choiceType === \"skill\" ? this.config.skill : choiceType === \"tool\" ? this.config.tool : this.config.ability\n      });\n    }\n    return context;\n  }\n\n  /* -------------------------------------------- */\n  /*  Event Listeners and Handlers                */\n  /* -------------------------------------------- */\n\n  /** @override */\n  _onChangeForm(formConfig, event) {\n    super._onChangeForm(formConfig, event);\n    const { choiceType, advantageByChoice } = this.midiOptions;\n\n    // Handle ability change on skill/tool rolls (replicates SkillToolRollConfigurationDialog)\n    if ((choiceType === \"skill\" || choiceType === \"tool\") && event.target?.name === \"ability\") {\n      const ability = event.target.value ?? this.config.ability;\n      if (this.config.skill) {\n        const skillLabel = GameSystemConfig.skills[this.config.skill]?.label ?? \"\";\n        const abilityLabel = GameSystemConfig.abilities[ability]?.label ?? \"\";\n        const flavor = i18nFormat(\"DND5E.SkillPromptTitle\", { skill: skillLabel, ability: abilityLabel });\n        foundry.utils.setProperty(this.message, \"data.flavor\", flavor);\n        this._midiUpdateFrame({ window: { title: flavor } });\n      }\n    }\n\n    if (event.target?.name === choiceType) {\n      const newValue = event.target.value;\n\n      if (choiceType === \"tool\") {\n        // Tool change: update config.tool and window title\n        this.config.tool = newValue;\n        const toolLabel = getToolLabel(newValue);\n        const flavor = i18nFormat(\"DND5E.ToolPromptTitle\", { tool: toolLabel });\n        foundry.utils.setProperty(this.message, \"data.flavor\", flavor);\n        this._midiUpdateFrame({ window: { title: flavor } });\n      } else if (choiceType === \"skill\") {\n        // Skill change: update config.skill and window title\n        this.config.skill = newValue;\n        const skillLabel = GameSystemConfig.skills[newValue]?.label ?? \"\";\n        const abilityLabel = GameSystemConfig.abilities[this.config.ability]?.label ?? \"\";\n        const flavor = i18nFormat(\"DND5E.SkillPromptTitle\", { skill: skillLabel, ability: abilityLabel });\n        foundry.utils.setProperty(this.message, \"data.flavor\", flavor);\n        this._midiUpdateFrame({ window: { title: flavor } });\n      } else {\n        // Ability change (save): update config.ability and window title\n        this.config.ability = newValue;\n        const abilityLabel = GameSystemConfig.abilities[newValue]?.label ?? \"\";\n        const flavor = i18nFormat(\"DND5E.SavePromptTitle\", { ability: abilityLabel });\n        foundry.utils.setProperty(this.message, \"data.flavor\", flavor);\n        this._midiUpdateFrame({ window: { title: flavor } });\n      }\n\n      // Update advantage/disadvantage from pre-computed object\n      const preComputed = advantageByChoice?.[newValue];\n      if (preComputed) {\n        this._midiDefaultButton = preComputed.defaultButton;\n        // Re-render buttons to reflect new advantage state\n        this._midiRenderParts([\"buttons\"]);\n      }\n    }\n  }\n\n  /* -------------------------------------------- */\n\n  /**\n   * Factory to create a buildConfig callback for rebuilding save roll parts\n   * when the player changes the ability dropdown.\n   *\n   * This follows the same pattern as dnd5e's `_buildSkillToolConfig` callback\n   * used by SkillToolRollConfigurationDialog.\n   */\n  /**\n   * Apply pre-computed advantage/disadvantage to a roll config's options so\n   * that D20Roll.fromConfig → configureModifiers() produces the correct formula.\n   */\n  static applyPreComputedAdvantage(rollConfig: any, preComputed: PreComputedAdvantage | undefined): void {\n    if (!preComputed) return;\n    // Only override advantageMode if pre-computed flags grant advantage or disadvantage.\n    // If neither, don't set anything - let keyboard modifiers (shift/ctrl) work.\n    if (!preComputed.hasAdvantage && !preComputed.hasDisadvantage) return;\n\n    rollConfig.options ??= {};\n    // @ts-expect-error CONFIG.Dice.D20Roll not typed\n    const ADV_MODE: { DISADVANTAGE: number, NORMAL: number, ADVANTAGE: number } = CONFIG.Dice.D20Roll.ADV_MODE;\n    if (preComputed.hasAdvantage && !preComputed.hasDisadvantage) {\n      rollConfig.options.advantageMode = ADV_MODE.ADVANTAGE;\n    } else if (!preComputed.hasAdvantage && preComputed.hasDisadvantage) {\n      rollConfig.options.advantageMode = ADV_MODE.DISADVANTAGE;\n    }\n    // Note: If both hasAdvantage and hasDisadvantage are true, they cancel out - don't override\n    // Clear legacy flags so configureModifiers() uses advantageMode directly\n    delete rollConfig.options.advantage;\n    delete rollConfig.options.disadvantage;\n  }\n\n  /**\n   * Unified factory to create a buildConfig callback for rebuilding roll parts\n   * when the player changes the dropdown selection.\n   *\n   * - skill/tool: Delegates to dnd5e's actor._buildSkillToolConfig()\n   * - save/check: Custom implementation (dnd5e has no public method for this)\n   *\n   * @param actor - The actor making the roll\n   * @param rollType - \"save\", \"check\", \"skill\", or \"tool\"\n   * @param advantageByChoice - Pre-computed advantage data keyed by choice ID\n   */\n  static createBuildConfig(\n    actor: Actor.Implementation,\n    rollType: \"save\" | \"check\" | \"skill\" | \"tool\",\n    advantageByChoice?: Record<string, PreComputedAdvantage>\n  ): (processConfig: any, rollConfig: any, formData: FormData | null, index: number) => void {\n    return (processConfig, rollConfig, formData, index) => {\n      if (index !== 0) return;\n\n      let choiceId: string;\n\n      if (rollType === \"skill\" || rollType === \"tool\") {\n        // Skill/tool: delegate to dnd5e's _buildSkillToolConfig\n        const formField = rollType;\n        const newChoice = formData?.get?.(formField) ?? processConfig[formField];\n        if (!newChoice || typeof newChoice !== \"string\") return;\n\n        // Compute hostActor for polymorph skill merging (same as dnd5e's _buildSkillTool)\n        //@ts-expect-error no dnd5e-types\n        const hostActor = actor.isPolymorphed && actor.flags?.dnd5e?.transformOptions?.mergeSkills && (rollType === \"skill\")\n          //@ts-expect-error no dnd5e-types\n          ? game.actors.get(actor.flags.dnd5e?.originalActor) : null;\n\n        // Call dnd5e's method - it handles parts construction, proficiency, bonuses, and exhaustion\n        //@ts-expect-error no dnd5e-types\n        actor._buildSkillToolConfig(rollType, hostActor, processConfig, rollConfig, formData, index);\n\n        choiceId = newChoice;\n\n      } else {\n        // Ability save/check: only rebuild if ability CHANGED via form\n        // (dnd5e pre-constructs parts in #rollD20Test, so we don't rebuild on fast-forward or same ability)\n        const formAbility = formData?.get?.(\"ability\") as string | null;\n        choiceId = formAbility ?? processConfig.ability;\n        if (!choiceId) return;\n\n        // Only rebuild parts if user changed the ability in the dialog\n        if (formAbility && formAbility !== processConfig.ability) {\n          //@ts-expect-error no dnd5e-types\n          const abilityData = actor.system.abilities?.[formAbility];\n          if (!abilityData) return;\n\n          const rollData = actor.getRollData();\n          const profKey = `${rollType}Prof` as \"saveProf\" | \"checkProf\";\n          const typeCapitalized = rollType.charAt(0).toUpperCase() + rollType.slice(1);\n\n          //@ts-expect-error no dnd5e-types\n          const { parts, data } = CONFIG.Dice.D20Roll.constructParts({\n            mod: abilityData.mod,\n            prof: abilityData[profKey]?.hasProficiency ? abilityData[profKey].term : null,\n            [`${formAbility}${typeCapitalized}Bonus`]: abilityData.bonuses?.[rollType],\n            //@ts-expect-error no dnd5e-types\n            [`${rollType}Bonus`]: actor.system.bonuses?.abilities?.[rollType],\n            //@ts-expect-error no dnd5e-types\n            cover: (formAbility === \"dex\" && rollType === \"save\") ? actor.system.attributes?.ac?.cover : null\n          }, rollData);\n\n          //@ts-expect-error no dnd5e-types\n          actor.addRollExhaustion?.(parts, data);\n          rollConfig.parts = parts;\n          rollConfig.data = data;\n          processConfig.ability = formAbility;\n        }\n      }\n\n      // Apply midi's pre-computed advantage (midi-specific, not in dnd5e)\n      MidiRollChoiceDialog.applyPreComputedAdvantage(rollConfig, advantageByChoice?.[choiceId]);\n    };\n  }\n\n  // Convenience wrappers for backward compatibility and clearer call sites\n\n  /** @deprecated Use createBuildConfig(actor, \"save\", advantageByChoice) instead */\n  static createSaveBuildConfig(actor: Actor.Implementation, advantageByChoice?: Record<string, PreComputedAdvantage>) {\n    return MidiRollChoiceDialog.createBuildConfig(actor, \"save\", advantageByChoice);\n  }\n\n  /** @deprecated Use createBuildConfig(actor, \"check\", advantageByChoice) instead */\n  static createCheckBuildConfig(actor: Actor.Implementation, advantageByChoice?: Record<string, PreComputedAdvantage>) {\n    return MidiRollChoiceDialog.createBuildConfig(actor, \"check\", advantageByChoice);\n  }\n\n  /** @deprecated Use createBuildConfig(actor, \"skill\", advantageByChoice) instead */\n  static createSkillBuildConfig(actor: Actor.Implementation, advantageByChoice?: Record<string, PreComputedAdvantage>) {\n    return MidiRollChoiceDialog.createBuildConfig(actor, \"skill\", advantageByChoice);\n  }\n\n  /** @deprecated Use createBuildConfig(actor, \"tool\", advantageByChoice) instead */\n  static createToolBuildConfig(actor: Actor.Implementation, advantageByChoice?: Record<string, PreComputedAdvantage>) {\n    return MidiRollChoiceDialog.createBuildConfig(actor, \"tool\", advantageByChoice);\n  }\n}\n","import { log, i18n, error, i18nFormat, warn, debugEnabled, GameSystemConfig, MODULE_ID, gameStats } from \"../midi-qol.js\";\nimport { configSettings, checkRule, checkMechanic, safeGetGameSetting, playerControlsInvisibleTokens } from \"./settings.js\";\nimport { bonusDialog, ConvenientEffectsHasEffect, createConditionData, displayDSNForRoll, expireRollEffect, getCriticalDamage, getDeadStatus, getOptionalCountRemainingShortFlag, getOrCreateTokenForActor, getSpeaker, getUnconsciousStatus, getVitalityDeadStatus, getWoundedStatus, hasAutoPlaceTemplate, hasUsedAction, hasUsedBonusAction, hasUsedReaction, midiRenderRoll, notificationNotify, removeActionUsed, removeBonusActionUsed, removeReactionUsed, tokenForActor, expireEffects, DSNMarkDiceDisplayed, evalAllConditions, evalAllConditionsAsync, CEAddEffectWith, isConvenientEffect, CERemoveEffect, hasCondition, areMidiKeysPressed, MidiOptions, getVitalityItem, checkMagicResistanceAndVulnerability, isAutoFastForward, FastForwardRollType, buildRollChoices, selectBestRollChoice, getTokenPerimeterPolygon, closestPointOnPerimeter, measurePointDistance, setUserInitiatedTarget } from \"./utils.js\";\nimport { installedModules } from \"./setupModules.js\";\nimport { OnUseMacro, OnUseMacros } from \"./apps/Item.js\";\nimport { TroubleShooter } from \"./apps/TroubleShooter.js\";\nimport { MidiAttackActivity } from \"./activities/AttackActivity.js\";\nimport { MidiActivityChoiceDialog } from \"./apps/MidiActivityChoiceDialog.js\";\nimport { MidiRollChoiceDialog, PreComputedAdvantage } from \"./apps/MidiRollChoiceDialog.js\";\nimport Token = foundry.canvas.placeables.Token;\nimport { AnyMutableObject } from \"fvtt-types/utils\";\nimport { Activity, ActivityUseConfiguration, DamageApplicationOptions, DamageDescription, RollDialogConfig, RollMessageConfig, RollProcessConfig } from \"../globals.js\";\nimport { Workflow } from \"./Workflow.js\";\nimport { preferredActiveGM } from \"./GMAction.js\";\nimport { MidiDependentsRegistry, MidiDependentDocumentMixin } from \"./lib/MidiDependentsRegistry.js\";\nimport { RollModifierTracker, computeAdvantageFlags, computeRollModifiers, applyRollModifiers, RollModifierFlags, RollModifierResult, AdvantageFlags } from \"./lib/RollModifierTracker.js\";\n\nlet libWrapper;\n\nconst NumericTerm = foundry.dice.terms.NumericTerm;\n\n// Module-level Set to track actors that should skip concentration checks\n// Used instead of actor flags to avoid database writes and orphaned flags\nexport const skipConcentrationActorUuids = new Set<string>();\n\n// Per-actor semaphores to prevent race conditions in checkWounded\n// Multiple concurrent updateActor hooks can fire for the same actor, causing duplicate status effects\nconst actorWoundedSemaphores = new Map<string, foundry.utils.Semaphore>();\n\nexport function getActorWoundedSemaphore(actorUuid: string): foundry.utils.Semaphore {\n  if (!actorWoundedSemaphores.has(actorUuid)) {\n    actorWoundedSemaphores.set(actorUuid, new foundry.utils.Semaphore(1));\n  }\n  return actorWoundedSemaphores.get(actorUuid)!;\n}\n\n// ==================== PATCHING ENTRY POINTS ====================\n// These functions are called during module initialization to register libWrapper patches.\n// The helper functions they reference are defined later in this file.\n\nexport function initPatching() {\n  libWrapper = globalThis.libWrapper;\n  const ChatLog = foundry.applications.sidebar.tabs.ChatLog;\n  // TODO this needs more work libWrapper.register(MODULE_ID, \"CONFIG.Item.documentClass.migrateData\", removeMidiProperties, \"WRAPPER\");\n  libWrapper.register(MODULE_ID, \"CONFIG.Actor.documentClass.prototype.prepareDerivedData\", _prepareDerivedData, \"WRAPPER\");\n  // For new onUse macros stuff.\n  libWrapper.register(MODULE_ID, \"CONFIG.Item.documentClass.prototype.prepareData\", itemPrepareData, \"WRAPPER\");\n  libWrapper.register(MODULE_ID, \"CONFIG.Actor.documentClass.prototype.prepareData\", actorPrepareData, \"WRAPPER\");\n  // I think this can be removed in v13 libWrapper.register(MODULE_ID, \"KeyboardManager.prototype._onFocusIn\", _onFocusIn, \"OVERRIDE\");\n  libWrapper.register(MODULE_ID, \"CONFIG.Actor.documentClass.prototype.getRollData\", actorGetRollData, \"WRAPPER\");\n  libWrapper.register(MODULE_ID, \"CONFIG.Item.documentClass.prototype.getRollData\", itemGetRollData, \"WRAPPER\");\n  libWrapper.register(MODULE_ID, \"CONFIG.ActiveEffect.documentClass.prototype._preCreate\", _preCreateActiveEffect, \"WRAPPER\");\n  libWrapper.register(MODULE_ID, \"CONFIG.Dice.D20Roll.prototype.configureModifiers\", _configureModifiers, \"WRAPPER\");\n  libWrapper.register(MODULE_ID, \"dnd5e.applications.actor.BaseActorSheet.prototype._prepareItem\", _prepareItem, \"WRAPPER\");\n\n  // Setup document classes with both dnd5e's DependentDocumentMixin (for flag-based tracking)\n  // and MidiDependentDocumentMixin (for our registry-based tracking of Actor/Item parents)\n  // This allows dnd5e.dependentOn flag to work for all parent types\n\n  // MeasuredTemplate, Token, AmbientLight need dnd5e's mixin added (not in their base class)\n  class MidiMeasuredTemplateDocument extends MidiDependentDocumentMixin(\n    globalThis.dnd5e.documents.mixins.DependentDocumentMixin(CONFIG.MeasuredTemplate.documentClass)\n  ) { };\n  //@ts-expect-error\n  CONFIG.MeasuredTemplate.documentClass = MidiMeasuredTemplateDocument;\n\n  class MidiTokenDocument extends MidiDependentDocumentMixin(\n    globalThis.dnd5e.documents.mixins.DependentDocumentMixin(CONFIG.Token.documentClass)\n  ) { };\n  //@ts-expect-error\n  CONFIG.Token.documentClass = MidiTokenDocument;\n\n  class MidiAmbientLightDocument extends MidiDependentDocumentMixin(\n    globalThis.dnd5e.documents.mixins.DependentDocumentMixin(CONFIG.AmbientLight.documentClass)\n  ) { };\n  //@ts-expect-error\n  CONFIG.AmbientLight.documentClass = MidiAmbientLightDocument;\n\n  class MidiRegionDocument extends MidiDependentDocumentMixin(\n    globalThis.dnd5e.documents.mixins.DependentDocumentMixin(CONFIG.Region.documentClass)\n  ) { };\n  //@ts-expect-error\n  CONFIG.Region.documentClass = MidiRegionDocument;\n\n  // ActiveEffect, Item, Actor already have dnd5e's DependentDocumentMixin in their class hierarchy\n  // Just add MidiDependentDocumentMixin for our registry tracking\n  //@ts-expect-error - Mixin pattern type inference\n  class MidiActiveEffect extends MidiDependentDocumentMixin(CONFIG.ActiveEffect.documentClass) { };\n  //@ts-expect-error\n  CONFIG.ActiveEffect.documentClass = MidiActiveEffect;\n\n  //@ts-expect-error - Mixin pattern type inference\n  class MidiItem extends MidiDependentDocumentMixin(CONFIG.Item.documentClass) { };\n  //@ts-expect-error\n  CONFIG.Item.documentClass = MidiItem;\n\n  //@ts-expect-error - Mixin pattern type inference\n  class MidiActor extends MidiDependentDocumentMixin(CONFIG.Actor.documentClass) { };\n  //@ts-expect-error\n  CONFIG.Actor.documentClass = MidiActor;\n}\n\n/**\n * libWrapper WRAPPER for Token._onClickLeft, Token._onClickRight2, and TokenLayer.selectObjects.\n * Sets _userInitiatedTarget flag so the targetToken hook can distinguish user clicks from programmatic targeting.\n */\nfunction userInitiatedTargetWrapper(this: any, wrapped: Function, ...args: any[]) {\n  setUserInitiatedTarget(true);\n  try {\n    return wrapped(...args);\n  } finally {\n    setUserInitiatedTarget(false);\n  }\n}\n\nexport function readyPatching() {\n  libWrapper.register(MODULE_ID, \"game.dnd5e.canvas.AbilityTemplate.prototype._onMovePlacement\", midiATOnMovePlacement, \"MIXED\");\n  libWrapper.register(MODULE_ID, \"CONFIG.Actor.sheetClasses.character['dnd5e.CharacterActorSheet'].cls.prototype._filterItems\", _filterItems, \"WRAPPER\");\n  libWrapper.register(MODULE_ID, \"CONFIG.Actor.sheetClasses.npc['dnd5e.NPCActorSheet'].cls.prototype._filterItems\", _filterItems, \"WRAPPER\");\n  libWrapper.register(MODULE_ID, \"CONFIG.ActiveEffect.documentClass.createConcentrationEffectData\", createConcentrationEffectData, \"WRAPPER\");\n  // Register _onUpdate wrapper for wounded/dead status handling\n  // This runs AFTER dnd5e's _onUpdate, checking current state rather than stale update data\n  libWrapper.register(MODULE_ID, \"CONFIG.Actor.documentClass.prototype._onUpdate\", actorOnUpdate, \"WRAPPER\");\n  // This controls whether to display the chat message or not\n  // dnd5e.damageActor handles picking up concentration item rolls\n  // processConcentrationSave handles doing the auto roll for concentration chat messages\n  libWrapper.register(MODULE_ID, \"CONFIG.Actor.documentClass.prototype.challengeConcentration\", challengeConcentration, \"MIXED\")\n  // Moved overtime processing to the updateCombat hook instead.\n  // libWrapper.register(MODULE_ID, \"CONFIG.Combat.documentClass.prototype._preUpdate\", processOverTime, \"WRAPPER\");\n  libWrapper.register(MODULE_ID, \"CONFIG.Combat.documentClass.prototype._preDelete\", _preDeleteCombat, \"WRAPPER\");\n\n  libWrapper.register(MODULE_ID, \"foundry.applications.ui.Notifications.prototype.notify\", notificationNotify, \"MIXED\");\n\n  // User-initiated targeting detection — set flag so targetToken hook can distinguish user clicks from programmatic targeting\n  libWrapper.register(MODULE_ID, \"foundry.canvas.placeables.Token.prototype._onClickLeft\", userInitiatedTargetWrapper, \"WRAPPER\");\n  libWrapper.register(MODULE_ID, \"foundry.canvas.placeables.Token.prototype._onClickRight2\", userInitiatedTargetWrapper, \"WRAPPER\");\n  libWrapper.register(MODULE_ID, \"foundry.canvas.layers.TokenLayer.prototype.selectObjects\", userInitiatedTargetWrapper, \"WRAPPER\");\n\n  const gameVersion = game.system?.version;\n  if ((game.system?.id === \"dnd5e\" && foundry.utils.isNewerVersion(\"3.3\", gameVersion ?? \"\"))) {\n    if (ui.notifications)\n      ui.notifications.error(`dnd5e version ${gameVersion} is too old to support midi-qol, please update to 3.3.1 or later`);\n    else\n      error(`dnd5e version ${gameVersion} is too old to support midi-qol, please update to 3.3.1 or later`);\n  }\n}\n\nexport let visionPatching = () => {\n  if (playerControlsInvisibleTokens) {\n    ui.notifications?.warn(\"Player control vision is deprecated, use it at your own risk\")\n    console.warn(\"midi-qol | Player control vision is deprecated, use it at your own risk\")\n\n    log(\"Patching Token._isVisionSource\")\n    libWrapper.register(MODULE_ID, \"foundry.canvas.placeables.Token.prototype._isVisionSource\", _isVisionSource, \"WRAPPER\");\n\n    log(\"Patching Token.isVisible\")\n    libWrapper.register(MODULE_ID, \"foundry.canvas.placeables.Token.prototype.isVisible\", isVisible, \"WRAPPER\");\n  }\n  log(\"Vision patching - \", playerControlsInvisibleTokens ? \"enabled\" : \"disabled\")\n}\n\nexport let itemPatching = () => {\n  libWrapper.register(MODULE_ID, \"CONFIG.Item.documentClass.prototype.use\", doItemUse, \"MIXED\");\n  libWrapper.register(MODULE_ID, \"CONFIG.Dice.DamageRoll.prototype.configureDamage\", configureDamage, \"MIXED\");\n};\n\nexport let actorAbilityRollPatching = () => {\n\n  log(\"Patching roll abilities Save/Test/Skill/Tool\")\n  libWrapper.register(MODULE_ID, \"CONFIG.Actor.documentClass.prototype.rollSavingThrow\", rollSavingThrow, \"MIXED\");\n  libWrapper.register(MODULE_ID, \"CONFIG.Actor.documentClass.prototype.rollAbilityCheck\", rollAbilityCheck, \"MIXED\");\n  libWrapper.register(MODULE_ID, \"CONFIG.Actor.documentClass.prototype.rollDeathSave\", rollDeathSave, \"WRAPPER\");\n  libWrapper.register(MODULE_ID, \"CONFIG.Actor.documentClass.prototype.rollSkill\", doRollSkill, \"MIXED\");\n  libWrapper.register(MODULE_ID, \"CONFIG.Actor.documentClass.prototype.rollToolCheck\", rollToolCheck, \"WRAPPER\");\n}\n\n// ==================== END PATCHING ENTRY POINTS ====================\n\n/**\n * Wrapper for Actor._onUpdate that handles wounded/dead status.\n * Runs AFTER dnd5e's _onUpdate completes, checking current state.\n * This is more robust than Hooks.on(\"updateActor\") because:\n * 1. We run after dnd5e's status handling is complete\n * 2. We check actual current state, not stale update data\n * 3. Document lifecycle is more serialized than hook callbacks\n */\nasync function actorOnUpdate(this: Actor.Implementation, wrapped: Function, data: object, options: any, userId: string) {\n  // Check if HP is changing - if so, we need to serialize the entire _onUpdate call\n  // to prevent dnd5e's own status handling from racing with itself\n  const hpUpdate = foundry.utils.getProperty(data, \"system.attributes.hp.value\");\n  const temphpUpdate = foundry.utils.getProperty(data, \"system.attributes.hp.temp\");\n  const hpChanging = hpUpdate !== undefined || temphpUpdate !== undefined;\n\n  if (!hpChanging) {\n    // No HP change - just call wrapped normally\n    await wrapped(data, options, userId);\n    return;\n  }\n\n  // HP is changing - serialize the entire _onUpdate call for this actor\n  // This prevents concurrent HP updates from causing race conditions in dnd5e's status handling\n  const semaphore = getActorWoundedSemaphore(this.uuid);\n  await semaphore.add(async () => {\n    // Let dnd5e and base Foundry handle their stuff first (now serialized)\n    await wrapped(data, options, userId);\n\n    // Only active GM processes wounded/dead status changes\n    if (!game.users?.activeGM?.isSelf) return;\n\n    // Skip if vitality update is pending - the updateItem hook will handle it\n    if (!options.midiVitalityUpdatePending) {\n      await processWoundedStatus(this);\n    }\n  });\n}\n\n/**\n * Process wounded/dead status based on CURRENT actor state.\n * This function reads the actor's current HP and vitality, not stale update data.\n *\n * IMPORTANT: Callers must acquire the actor's semaphore (via getActorWoundedSemaphore)\n * before calling this function to prevent race conditions.\n *\n * Called from actorOnUpdate (for HP changes) and updateItem hook (for vitality changes).\n */\nexport async function processWoundedStatus(actor: Actor.Implementation) {\n  // Read current state - caller is responsible for serialization\n  // @ts-expect-error no dnd5e-types\n  const attributes = actor.system.attributes;\n  if (!attributes?.hp) return;\n\n    // Check for vitality system\n    const vitalityItem = getVitalityItem(actor);\n    const hasVitality = !!vitalityItem;\n\n    // Get current vitality value\n    let currentVitality: number | undefined;\n    if (vitalityItem) {\n      // @ts-expect-error uses exists on items with uses\n      const maxUses = vitalityItem.system.uses?.max ?? 0;\n      // @ts-expect-error uses exists on items with uses\n      const spentUses = vitalityItem.system.uses?.spent ?? 0;\n      currentVitality = maxUses - spentUses;\n    }\n\n    // Determine if actor needs to be dead\n    const deathRequires = configSettings.optionalRules.vitalityDeathRequires || \"vitalityOnly\";\n    let needsBeaten: boolean;\n    if (hasVitality) {\n      if (deathRequires === \"vitalityOnly\") {\n        needsBeaten = (currentVitality ?? 0) <= 0;\n      } else {\n        needsBeaten = (currentVitality ?? 0) <= 0 && attributes.hp.value <= 0;\n      }\n    } else {\n      needsBeaten = attributes.hp.value <= 0;\n    }\n\n    // Handle wounded status\n    if (configSettings.addWounded > 0 && configSettings.addWoundedStyle !== \"none\") {\n      const needsWounded = attributes.hp.pct <= configSettings.addWounded && !needsBeaten;\n      const woundedStatus = getWoundedStatus();\n      if (!woundedStatus) {\n        const message = \"wounded status condition not set - please update your midi-qol wounded condition on the mechanics tab\";\n        TroubleShooter.recordError(new Error(message), \"In processWoundedStatus\");\n        ui.notifications?.warn(`midi-qol | ${message}`);\n      } else {\n        // toggleStatusEffect handles both cases gracefully - no need to check first\n        await actor.toggleStatusEffect(woundedStatus.id!, {\n          overlay: configSettings.addWoundedStyle === \"overlay\",\n          active: needsWounded\n        });\n      }\n    }\n\n    // Handle dead status\n    if (hasVitality) {\n      const effect = getVitalityDeadStatus();\n      if (effect) {\n        await setDeadStatus(actor, { effect, useDefeated: configSettings.markNonPlayerDefeated, makeDead: needsBeaten });\n      }\n    } else if (configSettings.addDead !== \"none\") {\n      let effect = getDeadStatus();\n      let useDefeated = configSettings.markNonPlayerDefeated;\n      // @ts-expect-error no dnd5e-types\n      if (actor.type === \"character\" || actor.hasPlayerOwner || actor.system.traits?.important) {\n        effect = getUnconsciousStatus();\n        useDefeated = configSettings.markPlayerDefeated;\n      }\n      if (effect) {\n        await setDeadStatus(actor, { effect, useDefeated, makeDead: needsBeaten });\n      }\n    }\n}\n\nfunction _isVisionSource(this: Token.Implementation, wrapped) {\n  const isVisionSource = wrapped();\n  if (this.document.hidden && !game.user?.isGM && game.user && this.actor?.testUserPermission(game.user, \"OWNER\")) {\n    return true;\n  }\n  return isVisionSource;\n}\n\nfunction isVisible(this: Token.Implementation, wrapped) {\n  const isVisible = wrapped();\n  if (!game.user?.isGM && game.user && this.actor?.testUserPermission(game.user, \"OWNER\")) {\n    return true;\n  }\n  return isVisible;\n}\n\n/**\n * Determines the roll mode for a roll, applying blind roll settings if configured.\n * If the roll should be blind, sets the core rollMode setting temporarily (caller must restore).\n *\n * @param blindRollSettings - Array of IDs that should force blind roll (e.g., configSettings.rollSkillsBlind)\n * @param choiceId - The ability/skill/tool ID being rolled\n * @param messageRollMode - Roll mode from message config (takes priority if already BLIND)\n * @returns The roll mode to use\n */\nfunction applyBlindRollMode(\n  blindRollSettings: string[],\n  choiceId: string | undefined,\n  messageRollMode: keyof CONFIG.Dice.RollModes | undefined\n): keyof CONFIG.Dice.RollModes {\n  let rollMode: keyof CONFIG.Dice.RollModes = messageRollMode ?? safeGetGameSetting(\"core\", \"rollMode\");\n\n  // If already blind, keep it\n  if (rollMode === CONST.DICE_ROLL_MODES.BLIND) return rollMode;\n\n  // Check if this roll should be forced to blind\n  const shouldBeBlind = blindRollSettings.includes(\"all\") || blindRollSettings.includes(choiceId ?? \"\");\n  if (shouldBeBlind && [CONST.DICE_ROLL_MODES.PUBLIC, \"roll\", CONST.DICE_ROLL_MODES.PRIVATE].includes(rollMode)) {\n    rollMode = CONST.DICE_ROLL_MODES.BLIND;\n    game.settings.set(\"core\", \"rollMode\", CONST.DICE_ROLL_MODES.BLIND);\n  }\n\n  return rollMode;\n}\n\nexport interface Options {\n  advantage: boolean | undefined,\n  disadvantage: boolean | undefined,\n  fastForward: boolean | undefined,\n  fastForwardSet: boolean | undefined,\n  parts: [] | undefined,\n  chatMessage: boolean | undefined,\n  rollToggle: boolean | undefined,\n  other: boolean | undefined,\n  autoRollAttack: boolean | undefined,\n  autoRollDamage: boolean | undefined,\n  fastForwardAttack: boolean | undefined,\n  fastForwardDamage: boolean | undefined,\n  fastForwardAbility: boolean | undefined,\n  isMagicSave?: boolean,\n  saveItemUuid?: string,\n  saveItem?: Item,\n  item?: Item,\n  itemUuid?: string,\n  simulate?: boolean,\n  target?: number,\n  rollType?: string\n};\nexport const defaultRollOptions: Options = {\n  advantage: false,\n  disadvantage: false,\n  fastForward: undefined,\n  fastForwardSet: undefined,\n  parts: undefined,\n  chatMessage: undefined,\n  rollToggle: undefined,\n  other: undefined,\n  autoRollAttack: undefined,\n  autoRollDamage: undefined,\n  fastForwardAttack: undefined,\n  fastForwardDamage: undefined,\n  fastForwardAbility: undefined\n};\n\nexport function collectBonusFlags(actor: Actor.Implementation, category: string, detail: string) {\n  const bonusFlags = Object.keys(actor.flags[MODULE_ID]?.optional ?? [])\n    .filter(flag => {\n      const checkFlag = actor.flags[MODULE_ID]!.optional![flag][category];\n      if (checkFlag === undefined) return false;\n      if (detail.startsWith(\"fail\")) {\n        const [_, type] = detail.split(\".\");\n        return checkFlag.fail && checkFlag.fail[type] ? getOptionalCountRemainingShortFlag(actor, flag) > 0 : false;\n      } else if (!(typeof checkFlag === \"string\" || checkFlag[detail] || checkFlag[\"all\"] !== undefined)) return false;\n      if (actor.flags[MODULE_ID]!.optional![flag].count === undefined) return true;\n      return getOptionalCountRemainingShortFlag(actor, flag) > 0;\n    })\n    .map(flag => {\n      const checkFlag = actor.flags[MODULE_ID]!.optional![flag][category];\n      if (typeof checkFlag === \"string\") return `flags.midi-qol.optional.${flag}`;\n      else return `flags.midi-qol.optional.${flag}`;\n    });\n  return bonusFlags;\n}\n\nexport async function bonusCheck(actor: Actor.Implementation, result: Roll, category: string, detail = \"\", messageData: any = {}): Promise<Roll> {\n  detail ||= foundry.utils.getProperty(messageData, \"flags.dnd5e.roll.type\") as string; // death saves -> \"death\", tool checks -> \"tool\"\n  let bonusFlags = collectBonusFlags(actor, category, detail);\n  if (bonusFlags.length > 0) {\n    const data = {\n      actor,\n      roll: result,\n      rollHTML: await midiRenderRoll(result),\n      rollTotal: result.total,\n      category,\n      detail: detail,\n      messageData\n    }\n    let title: string | undefined;\n    if (GameSystemConfig.abilities[detail]?.label || GameSystemConfig.skills[detail]?.label) {\n      if (detail.startsWith(\"fail\")) title = \"Failed Save Check\";\n      else if (category.startsWith(\"check\")) title = i18nFormat(\"DND5E.AbilityPromptTitle\", { ability: GameSystemConfig.abilities[detail].label ?? \"\" });\n      else if (category.startsWith(\"save\")) title = i18nFormat(\"DND5E.SavePromptTitle\", { ability: GameSystemConfig.abilities[detail].label ?? \"\" });\n      else if (category.startsWith(\"skill\")) title = i18nFormat(\"DND5E.SkillPromptTitle\", {\n        //@ts-expect-error no dnd5e types\n        ability: GameSystemConfig.abilities[actor.system.skills[detail]?.ability]?.label ?? \"\",\n        skill: GameSystemConfig.skills[detail].label ?? \"\"\n      });\n    } else {\n      if (detail.startsWith(\"fail\")) title = \"Failed Save Check\";\n      else if (category.startsWith(\"check\")) title = i18nFormat(\"DND5E.AbilityPromptTitle\", { ability: GameSystemConfig.abilities[detail] ?? \"\" });\n      else if (category.startsWith(\"save\")) title = i18nFormat(\"DND5E.SavePromptTitle\", { ability: GameSystemConfig.abilities[detail] ?? \"\" });\n      else if (category.startsWith(\"skill\")) title = i18nFormat(\"DND5E.SkillPromptTitle\", {\n        //@ts-expect-error no dnd5e types\n        ability: GameSystemConfig.abilities[actor.system.skills[detail]?.ability] ?? \"\",\n        skill: GameSystemConfig.skills[detail] ?? \"\"\n      });\n    }\n\n    const displayBonusRolls: boolean = !!(bonusFlags.reduce((returnValue: boolean | undefined, flag: string) => returnValue || (foundry.utils.getProperty(actor ?? {}, `${flag}.displayBonusRolls`) as boolean | undefined), undefined)\n      ?? checkMechanic(\"displayBonusRolls\"));\n    const newRoll = await bonusDialog.bind(data)(\n      bonusFlags,\n      detail ? `${category}.${detail}` : category,\n      displayBonusRolls,\n      `${actor.name} - ${title}`,\n      data.roll,\n      \"roll\",\n      { messageData }\n    );\n    if (newRoll) result = newRoll;\n  }\n\n  return result;\n}\n\nasync function doRollSkill(this: Actor.Implementation, wrapped, config: RollProcessConfig = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n  let oldFormat = false;\n  config.midiOptions ??= {};\n  let preRollSkillHookId: number | undefined;\n  let rollSkillHookId: number | undefined;\n  //@ts-expect-error\n  let result: CONFIG.Dice.D20Roll[] = [];\n  const saveRollMode: keyof CONFIG.Dice.RollModes = safeGetGameSetting(\"core\", \"rollMode\");\n  try {\n    message.data ??= {};\n    let skillId = config.skill;\n    const rollSkills: string[] = config.midiOptions?.rollSkills ?? (skillId ? [skillId] : []);\n    if (rollSkills.length === 0)\n      throw new Error(`doRollSkill called with no skills to roll for ${this.name}`);\n\n    let overtimeActorUuid: string | undefined;\n    if (config.event) { // TODO Decide if we want to do this or support core behaviour of anyone rolling concentration check\n      // @ts-expect-error we know better\n      const target = config.event?.target?.closest('.roll-link, [data-action=\"rollRequest\"], [data-action=\"concentration\"]');\n      if (target?.dataset?.midiOvertimeActorUuid) overtimeActorUuid = target.dataset.midiOvertimeActorUuid;\n      if (overtimeActorUuid && this.uuid !== overtimeActorUuid) {\n        const actualActor = fromUuidSync(overtimeActorUuid) as Actor.Implementation | undefined;\n        //@ts-expect-error no dnd5e types\n        if (actualActor) return actualActor.rollSkill(config, dialog, message);\n      }\n    }\n    // Check if advantage was pre-computed by an external module (Monks Token Bar, Flash Rolls, Epic Rolls)\n    const sourceInfo = getAdvantageSourceInfo(config);\n    const isExternalModuleRoll = sourceInfo.isExternalModule;\n\n    let hasPreComputedAdvantage = false;\n    if (!config.midiOptions.recomputeAdvantage) {\n      hasPreComputedAdvantage = applyPreComputedAdvantage(config);\n      if (hasPreComputedAdvantage && isAutoFastForward(\"skill\")) {\n        config.midiOptions.fastForward = true;\n      }\n    }\n    // Ensure workflow is set up from workflowId if needed\n    if (!config.midiOptions.workflow && config.midiOptions.workflowId) {\n      config.midiOptions.workflow = Workflow.getWorkflow(config.midiOptions.workflowId);\n    }\n\n    let success: boolean | undefined = undefined;\n    let rollMode: keyof CONFIG.Dice.RollModes = message.rollMode ?? safeGetGameSetting(\"core\", \"rollMode\");\n    if (dialog.configure === undefined && config.midiOptions.fastForward) dialog.configure = false;\n\n    let skillModifiers: RollModifierResult;\n    const midiOptions = config.midiOptions;\n\n    // Check if advantageByChoice was passed in (from Workflow via GMAction with deserialized trackers)\n    const passedSkillAdvantageMap = config.midiOptions?.advantageByChoice as Record<string, PreComputedAdvantage> | undefined;\n    const hasPassedSkillAdvantage = passedSkillAdvantageMap && Object.keys(passedSkillAdvantageMap).length > 0 &&\n      Object.values(passedSkillAdvantageMap).some(v => v.tracker instanceof RollModifierTracker);\n\n    // Skip building advantage map for external module rolls - they already computed advantage\n    const preComputedSkillAdvantageMap: Record<string, PreComputedAdvantage> = isExternalModuleRoll\n      ? {} // External modules handle their own advantage - don't recompute\n      : hasPassedSkillAdvantage && passedSkillAdvantageMap\n        ? passedSkillAdvantageMap\n        : await buildPreComputedAdvantageMap(this, \"skill\", rollSkills, config.midiOptions ?? {});\n\n    // Setup dialog with MidiRollChoiceDialog helper\n    let userExplicitChoice: string | undefined;\n    const { hasMultiple: hasMultipleSkills } = setupChoiceDialog(\n      this, config, dialog, \"skill\", rollSkills,\n      preComputedSkillAdvantageMap, hasPreComputedAdvantage, \"skill\",\n      (choice) => { userExplicitChoice = choice; }\n    );\n\n    preRollSkillHookId = Hooks.once(\"dnd5e.preRollSkill\", (configData, dialogData, messageData) => {\n      configData.midiOptions = { ...(configData.midiOptions ?? {}), ...(midiOptions ?? {}) };\n      messageData.data ??= {};\n      if (overtimeActorUuid) messageData.data[\"flags.midi-qol.overtimeActorUuid\"] = overtimeActorUuid;\n\n      const skillAdvantageValues = Object.values(preComputedSkillAdvantageMap);\n      const allAutoFail = skillAdvantageValues.length > 0 && skillAdvantageValues.every(d => {\n        const tracker = d.tracker instanceof RollModifierTracker ? d.tracker : undefined;\n        return tracker?.modifiers.willFail;\n      });\n      if (hasMultipleSkills && !allAutoFail && dialogData.configure !== false) {\n        dialogData.configure = true;\n      } else {\n        const chosenSkill = configData.skill ?? skillId;\n        const chosenAdvantage = preComputedSkillAdvantageMap[chosenSkill!];\n        if (chosenAdvantage) {\n          if (!hasPreComputedAdvantage) {\n            configData.advantage = chosenAdvantage.hasAdvantage;\n            configData.disadvantage = chosenAdvantage.hasDisadvantage;\n          }\n          const chosenTracker = chosenAdvantage.tracker instanceof RollModifierTracker ? chosenAdvantage.tracker : undefined;\n          if (chosenTracker) {\n            skillModifiers = applyRollModifiers(chosenTracker, configData, dialogData);\n            if (skillModifiers.autoFail) success = false;\n          }\n        }\n      }\n      setRollDialogOptions(configData, dialogData, \"skill\");\n    });\n    rollSkillHookId = Hooks.once(\"dnd5e.postSkillRollConfiguration\", (rolls, configData, dialog, messageDetails) => {\n      // record message configuration details for later display\n      message = messageDetails;\n\n      // Detect skill change from choice dialog and check auto-fail/auto-success\n      if (configData.skill && configData.skill !== skillId) {\n        skillId = configData.skill;\n      }\n      const chosenSkillData = preComputedSkillAdvantageMap[skillId ?? \"\"];\n      const chosenSkillTracker = chosenSkillData?.tracker instanceof RollModifierTracker ? chosenSkillData.tracker : undefined;\n      if (chosenSkillTracker?.modifiers.willFail) success = false;\n      else if (chosenSkillTracker?.modifiers.willSucceed) success = true;\n\n      // Apply blind roll mode based on chosen skill\n      messageDetails.rollMode = applyBlindRollMode(configSettings.rollSkillsBlind, skillId, messageDetails.rollMode);\n\n      return true;\n    });\n\n    const saveCreate = message.create;\n    message.create = false;\n\n    // Set originatingMessage so dnd5e's MessageRegistry and getOriginatingMessage() work correctly\n    const originatingCardId = config.midiOptions?.workflow?.itemCardId\n      ?? (config.midiOptions?.itemCardUuid ? fromUuidSync(config.midiOptions.itemCardUuid)?.id : undefined);\n    if (originatingCardId) foundry.utils.setProperty(message, \"data.flags.dnd5e.originatingMessage\", originatingCardId);\n\n    if (this.token) foundry.utils.setProperty(dialog, \"options.window.subtitle\", this.token.name);\n    result = await wrapped(config, dialog, message);\n    message.create = saveCreate;\n\n    if (!result) return result;\n    rollMode = message.rollMode ?? rollMode;\n    result.forEach(r => r.options.rollMode = rollMode);\n    /*\n    if (rollMode !== CONST.DICE_ROLL_MODES.BLIND) rollMode = result.options.rollMode;\n    else result.options.rollMode = CONST.DICE_ROLL_MODES.BLIND;\n    */\n    await displayDSNForRoll(result, \"skill\", rollMode);\n    DSNMarkDiceDisplayed(result);\n    if (!config.simulate) {\n      result[0] = await bonusCheck(this, result[0], \"skill\", skillId, message.data);\n      DSNMarkDiceDisplayed(result);\n      // Check for skill fail bonuses if the roll fails against target\n      if (Number.isNumeric(result[0].options.target) && result[0].isSuccess === false) {\n        const failFlagsLength = collectBonusFlags(this, \"skill\", \"fail.all\").length;\n        const failSkillFlagsLength = collectBonusFlags(this, \"skill\", `fail.${skillId}`).length;\n        if (failFlagsLength || failSkillFlagsLength) {\n          // If the roll fails and there is a flags.midi-qol.optional.NAME.skill.fail flag, apply the bonus\n          result[0] = await bonusCheck(this, result[0], \"skill\", failSkillFlagsLength ? `fail.${skillId}` : \"fail.all\", message.data);\n          DSNMarkDiceDisplayed(result);\n        }\n      }\n    }\n    if (config.target !== undefined && success === undefined) {\n      const resultTotal = result.reduce((acc, r) => acc + r.total, 0);\n      success = resultTotal >= config.target;\n      result.forEach(r => r.options.success = success);\n    }\n    // Stamp the chosen skill on the rolls (after bonusCheck) so the save display can show which skill was used\n    // userExplicitChoice is set by buildConfig wrapper when user changes dropdown; config.skill is the auto-selected best\n    const _chosenSkill = userExplicitChoice ?? config.skill;\n    if ((config.midiOptions?.rollSkills?.length ?? 0) > 1) result.forEach(r => { if (r?.options) r.options.midiChosenId = _chosenSkill; });\n\n    // Set originatingMessage on roll options so modules can access it without .parent\n    const rollOriginatingId = foundry.utils.getProperty(message, \"data.flags.dnd5e.originatingMessage\") as string | undefined\n      ?? originatingCardId;\n    if (rollOriginatingId) result.forEach(r => { if (r?.options) r.options.originatingMessage = rollOriginatingId; });\n\n    if (message.create !== false && result) {\n      if (foundry.utils.getProperty(result, \"flags.midi-qol.chatMessageShown\") !== true) {\n        const messageData: any = foundry.utils.mergeObject({ sound: CONFIG.sounds.dice }, message.data ?? {});\n        messageData.rolls = result;\n        const chatMsg = await ChatMessage.create(messageData, { rollMode });\n        // dnd5e sets roll.parent in buildPost; replicate here since we bypass buildPost\n        if (chatMsg) result.forEach(r => (r as any).parent = chatMsg);\n      }\n    }\n    if (skillId) await expireRollEffect.bind(this)(\"Skill\", skillId, success);\n\n  } catch (err) {\n    const message = `doRollSkill error ${this.name}, ${this.uuid}`;\n    TroubleShooter.recordError(err, message)\n    throw err;\n  }\n  finally {\n    if (preRollSkillHookId) Hooks.off(\"dnd5e.preRollSkill\", preRollSkillHookId);\n    if (rollSkillHookId) Hooks.off(\"dnd5e.postSkillRollConfiguration\", rollSkillHookId);\n    if (saveRollMode) game.settings.set(\"core\", \"rollMode\", saveRollMode);\n  }\n  return oldFormat ? result?.[0] : result;\n}\n\n/**\n * Extracts pre-computed advantage/disadvantage from roll config.\n * Different modules store advantage in different locations:\n *\n * | Source                  | Module              | Location                              |\n * |-------------------------|---------------------|---------------------------------------|\n * | direct                  | Flash Rolls, GMAction| config.advantage/disadvantage        |\n * | event                   | Monks TokenBar      | config.event.advantage/disadvantage   |\n * | rolls                   | Epic Rolls          | config.rolls[0].options.adv/disadv    |\n * | midiOptions             | midi-qol internal   | config.midiOptions.advantage/disadv   |\n *\n * \"External\" modules are those that don't provide midiOptions.workflowId:\n * - Monks TokenBar, Epic Rolls, Flash Rolls → external (override their fastForward)\n * - GMAction, character sheet rolls → internal (use midi-qol's normal flow)\n */\ntype AdvantageSourceType = 'monks-tokenbar' | 'epic-rolls-5e' | 'flash-rolls-5e' | 'midi-qol' | 'none';\n\ninterface AdvantageSourceInfo {\n  advantage: boolean | undefined;\n  disadvantage: boolean | undefined;\n  hasPreComputed: boolean;      // true if any source provided advantage/disadvantage\n  isExternalModule: boolean;    // true if from external module (no workflowId)\n  sourceType: AdvantageSourceType;  // module name that provided the advantage/disadvantage\n  hasEvent: boolean;            // true if config.event exists (for shift key checking)\n}\n\nfunction getAdvantageSourceInfo(config: RollProcessConfig): AdvantageSourceInfo {\n  // Source 1: Direct on config (Flash Rolls sets this, midi-qol GMAction also sets this)\n  const directAdvantage = config.advantage;\n  const directDisadvantage = config.disadvantage;\n  const hasDirect = directAdvantage !== undefined || directDisadvantage !== undefined;\n\n  // Source 2: Event object (Monks TokenBar sets event.advantage/event.disadvantage)\n  // @ts-expect-error event may have advantage/disadvantage properties\n  const eventAdvantage = config.event?.advantage;\n  // @ts-expect-error event may have advantage/disadvantage properties\n  const eventDisadvantage = config.event?.disadvantage;\n  const hasEventAdvantage = eventAdvantage !== undefined || eventDisadvantage !== undefined;\n\n  // Source 3: rolls[0].options (Epic Rolls)\n  const rollsAdvantage = config.rolls?.[0]?.options?.advantage;\n  const rollsDisadvantage = config.rolls?.[0]?.options?.disadvantage;\n  const hasRolls = rollsAdvantage !== undefined || rollsDisadvantage !== undefined;\n\n  // Source 4: midiOptions (midi-qol internal)\n  const midiAdvantage = config.midiOptions?.advantage;\n  const midiDisadvantage = config.midiOptions?.disadvantage;\n  const hasMidiOptions = midiAdvantage !== undefined || midiDisadvantage !== undefined;\n\n  // Combine all sources (first defined value wins)\n  const advantage = directAdvantage ?? eventAdvantage ?? rollsAdvantage ?? midiAdvantage;\n  const disadvantage = directDisadvantage ?? eventDisadvantage ?? rollsDisadvantage ?? midiDisadvantage;\n\n  // Determine if this is from an external module\n  // External = has pre-computed advantage, NO workflowId, AND the matching module is active\n  const hasWorkflowId = !!config.midiOptions?.workflowId;\n  const hasExternalSource =\n    (hasEventAdvantage && !!installedModules.get(\"monks-tokenbar\"))\n    || (hasRolls && !hasWorkflowId && !!installedModules.get(\"epic-rolls-5e\"))\n    // @ts-expect-error Flash Rolls sets config._isFlashRoll on its request rolls\n    || (config._isFlashRoll && !!installedModules.get(\"flash-rolls-5e\"));\n\n  // Determine which module provided the advantage/disadvantage based on how it was passed\n  // Only match a specific module if it is actually active\n  let sourceType: AdvantageSourceType = 'none';\n  if (hasEventAdvantage && installedModules.get(\"monks-tokenbar\")) {\n    sourceType = 'monks-tokenbar';  // Monks TokenBar passes event.advantage/disadvantage\n  } else if (hasRolls && !hasWorkflowId && installedModules.get(\"epic-rolls-5e\")) {\n    sourceType = 'epic-rolls-5e';   // Epic Rolls passes rolls[0].options.advantage/disadvantage\n  // @ts-expect-error Flash Rolls sets config._isFlashRoll on its request rolls\n  } else if (config._isFlashRoll && installedModules.get(\"flash-rolls-5e\")) {\n    sourceType = 'flash-rolls-5e';  // Flash Rolls marks its rolls with config._isFlashRoll\n  } else if (hasDirect || hasMidiOptions) {\n    sourceType = 'midi-qol';        // midi-qol internal (GMAction, character sheet, etc.)\n  }\n\n  // Check if event object exists (for shift key detection)\n  // Monks TokenBar passes the event, Epic Rolls nulls it when fast-forwarding, Flash Rolls doesn't pass it\n  const hasEvent = !!config.event;\n\n  return {\n    advantage,\n    disadvantage,\n    hasPreComputed: hasDirect || hasEventAdvantage || hasRolls || hasMidiOptions,\n    isExternalModule: hasExternalSource,\n    sourceType,\n    hasEvent\n  };\n}\n\nfunction getExternalModuleFastForward(sourceInfo: AdvantageSourceInfo, rollType: FastForwardRollType): boolean {\n  // Get the appropriate fast forward setting based on which external module is the source\n  switch (sourceInfo.sourceType) {\n    case 'monks-tokenbar':\n      if (installedModules.get(\"monks-tokenbar\")) {\n        return safeGetGameSetting(\"monks-tokenbar\", \"bypass-roll-dialog\") as boolean ?? false;\n      }\n      break;\n    case 'flash-rolls-5e':\n    case 'midi-qol':\n    case 'epic-rolls-5e':\n    case 'none':\n    default:\n      return isAutoFastForward(rollType);\n  }\n  return isAutoFastForward(rollType);\n}\n\nfunction setRollDialogOptions(config: RollProcessConfig, dialog: RollDialogConfig, rollType: FastForwardRollType) {\n  dialog.options ??= {};\n  // @ts-expect-error CONFIG.Dice.D20Roll not typed\n  const ADV_MODE: { DISADVANTAGE: number, NORMAL: number, ADVANTAGE: number } = CONFIG.Dice.D20Roll.ADV_MODE;\n  const sourceInfo = getAdvantageSourceInfo(config);\n\n  // Determine dialog visibility (whether to show the roll configuration dialog)\n  // If dialog.configure was explicitly set by the caller (a boolean, not undefined),\n  // respect that value. This allows macros/code to pass configure: false to skip the\n  // dialog or configure: true to force it, regardless of module settings.\n  if (dialog.configure !== undefined) {\n    // Caller explicitly set dialog.configure — preserve it\n  } else if (sourceInfo.isExternalModule) {\n    // External module (Flash Rolls, Monks TokenBar, Epic Rolls): use the module's own fast forward setting\n    // Shift key toggle is handled below for modules that pass the event (Monks TokenBar)\n    const moduleFastForward = getExternalModuleFastForward(sourceInfo, rollType);\n    dialog.configure = !moduleFastForward;\n  } else {\n    // Standard midi-qol flow (character sheet rolls, checkSaves, etc.)\n    if (config.midiOptions?.fastForward) dialog.configure = false;\n    if (isAutoFastForward(rollType)) dialog.configure = false;\n  }\n\n  // Shift key toggle - only works if event is available\n  // This handles: character sheet rolls, Monks TokenBar (has event),\n  // but NOT Flash Rolls or Epic Rolls (no event when fast-forwarding)\n  if (areMidiKeysPressed(config.event, \"RollToggle\")) {\n    dialog.configure = !dialog.configure;\n  }\n\n  // Set advantage mode for the dialog (use source info + rolls[0].options for dnd5e native)\n  const rollOptions = config.rolls?.[0]?.options;\n  const hasAdvantage = sourceInfo.advantage || rollOptions?.advantage;\n  const hasDisadvantage = sourceInfo.disadvantage || rollOptions?.disadvantage;\n\n  if (hasAdvantage && !hasDisadvantage) {\n    dialog.options.advantageMode = ADV_MODE.ADVANTAGE;\n    dialog.options.defaultButton = \"advantage\";\n  } else if (!hasAdvantage && hasDisadvantage) {\n    dialog.options.advantageMode = ADV_MODE.DISADVANTAGE;\n    dialog.options.defaultButton = \"disadvantage\";\n  } else {\n    dialog.options.advantageMode = ADV_MODE.NORMAL;\n    dialog.options.defaultButton = \"normal\";\n  }\n}\n\n/**\n * Applies pre-computed advantage/disadvantage to config if found.\n * Returns true if pre-computed values were found (caller should skip computing from flags).\n */\nfunction applyPreComputedAdvantage(config: RollProcessConfig): boolean {\n  const sourceInfo = getAdvantageSourceInfo(config);\n  if (!sourceInfo.hasPreComputed) {\n    return false;\n  }\n\n  // Apply to config if not already set\n  config.advantage ??= sourceInfo.advantage;\n  config.disadvantage ??= sourceInfo.disadvantage;\n  return true;\n}\n\ntype RollChoiceType = \"skill\" | \"ability\" | \"tool\";\n\n/**\n * Sets up MidiRollChoiceDialog for multi-choice rolls (skill, ability, or tool).\n * Configures dialog options, auto-selects best choice, and wraps buildConfig to capture user selection.\n */\nfunction setupChoiceDialog(\n  actor: Actor.Implementation,\n  config: RollProcessConfig,\n  dialog: RollDialogConfig,\n  choiceType: RollChoiceType,\n  choices: string[],\n  advantageMap: Record<string, PreComputedAdvantage>,\n  hasPreComputedAdvantage: boolean,\n  rollTypeForChoices: \"skill\" | \"tool\" | \"save\" | \"check\",\n  onChoiceCapture: (choice: string) => void\n): { hasMultiple: boolean } {\n  const hasMultiple = choices.length > 1;\n\n  dialog.applicationClass = MidiRollChoiceDialog;\n  dialog.options ??= {};\n  const rollChoices = buildRollChoices(actor, rollTypeForChoices, choices);\n  const best = selectBestRollChoice(rollChoices, advantageMap);\n\n  if (best) {\n    if (hasMultiple) (config as AnyMutableObject)[choiceType] = best.value;\n    const bestAdvantage = advantageMap[best.value];\n    if (bestAdvantage && !hasPreComputedAdvantage) {\n      config.advantage = bestAdvantage.hasAdvantage;\n      config.disadvantage = bestAdvantage.hasDisadvantage;\n    }\n  }\n\n  dialog.options.rollChoices = rollChoices;\n  dialog.options.advantageByChoice = advantageMap;\n  dialog.options.choiceType = choiceType;\n\n  // Only set buildConfig when we need to rebuild parts on choice change:\n  // - Skills/tools: Always (dnd5e's pattern expects buildConfig to construct parts)\n  // - Saves/checks: Only if multiple abilities (single ability is fully handled by dnd5e)\n  const needsBuildConfig = (choiceType === \"skill\" || choiceType === \"tool\") || hasMultiple;\n\n  if (needsBuildConfig) {\n    const buildConfigType = (choiceType === \"skill\" || choiceType === \"tool\")\n      ? choiceType\n      : rollTypeForChoices; // \"save\" or \"check\" for ability rolls\n    const baseBuildConfig = MidiRollChoiceDialog.createBuildConfig(actor, buildConfigType, advantageMap);\n\n    dialog.options.buildConfig = (processConfig: any, rollConfig: any, formData: FormData | null, index: number) => {\n      baseBuildConfig(processConfig, rollConfig, formData, index);\n      if (formData && index === 0) {\n        const chosen = formData.get?.(choiceType);\n        if (chosen && typeof chosen === \"string\") onChoiceCapture(chosen);\n      }\n    };\n  }\n\n  if (hasMultiple && dialog.configure !== false) dialog.configure = true;\n\n  return { hasMultiple };\n}\n\nfunction multiply(modifier: string) {\n  const rgx = /mx([0-9])+/;\n  const match = modifier.match(rgx);\n  if (!match) return false;\n  let [mult] = match.slice(1);\n  const multiplier = parseInt(mult);\n  for (let r of this.results) {\n    r.count = multiplier * r.result;\n    r.rerolled = true;\n  }\n  return true;\n}\n\nexport function addDiceTermModifiers() {\n  const Die = foundry.dice.terms.Die;\n  Die.MODIFIERS[\"mx\"] = \"multiply\";\n  foundry.utils.setProperty(Die.prototype, \"multiply\", multiply);\n}\n\nexport function averageDice(roll: Roll) {\n  roll.terms = roll.terms.map(term => {\n    if (term instanceof foundry.dice.terms.DiceTerm) {\n      const mult = term.modifiers.includes(\"mx2\") ? 2 : 1\n      const newTerm = new NumericTerm({ number: Math.floor((term.number ?? 1) * mult * ((term.faces ?? 1) + 1) / 2) });\n      newTerm.options = foundry.utils.duplicate(term.options);\n      return newTerm;\n    }\n    return term;\n  });\n  roll.resetFormula();\n  return roll;\n}\n\nfunction applyDamageModifiers(damageRoll: Roll): Roll {\n  if (damageRoll.options?.[\"midi-qol\"]?.modifiers?.length) {\n    damageRoll.terms.forEach(term => {\n      if (term instanceof foundry.dice.terms.DiceTerm) {\n        term.modifiers ??= [];\n        term.modifiers = term.modifiers.concat(damageRoll.options[\"midi-qol\"].modifiers);\n      }\n    })\n  }\n  return damageRoll;\n}\n\n// @ts-expect-error no dnd5e-types\nfunction configureDamage(this: CONFIG.Dice.DamageRoll, wrapped, options: any = { critical: {} }) {\n  // Remove existing critical damage\n  this.terms = this.terms.filter(t => !t.options.criticalBonusDamage && !t.options.criticalFlatBonus);\n  this.terms.forEach(term => {\n    if (term._number instanceof Roll) {\n      // Complex number term.\n      if (!term._number.isDeterministic) return;\n      if (!term._number._evaluated) term._number.evaluateSync();\n    }\n    term.number = term.options.baseNumber ?? term.number;\n    if (term.options.baseModifiers) {\n      term.modifiers = foundry.utils.deepClone(term.options.baseModifiers);\n    }\n  });\n  this.resetFormula();\n  if (!this.configured) applyDamageModifiers(this);\n  let useDefaultCritical = getCriticalDamage() === \"default\";\n  useDefaultCritical ||= (getCriticalDamage() === \"explodeCharacter\" && this.data.actorType !== \"character\");\n  useDefaultCritical ||= (getCriticalDamage() === \"explodeNPC\" && this.data.actorType !== \"npc\");\n  const criticalNotAllowed = this.options.critical?.allow === false || options.critical?.allow === false;\n  if (criticalNotAllowed || !this.isCritical || useDefaultCritical) {\n    const effectiveIsCritical = criticalNotAllowed ? false : this.isCritical;\n    options.critical.allow = effectiveIsCritical;\n    this.options.isCritical = effectiveIsCritical;\n    //@ts-expect-error \"dnd5e\"\n    options.critical.multiplyNumeric ??= game.settings.get(\"dnd5e\", \"criticalDamageModifiers\");\n    //@ts-expect-error \"dnd5e\"\n    options.critical.powerfulCritical ??= game.settings.get(\"dnd5e\", \"criticalDamageMaxDice\");\n    wrapped({ critical: options.critical });\n    // if (this.data.actorType === configSettings.averageDamage || configSettings.averageDamage === \"all\") averageDice(this);\n    return;\n  }\n  this.simplify();\n  const OperatorTerm = foundry.dice.terms.OperatorTerm\n  const DiceTerm = foundry.dice.terms.DiceTerm;\n  const Die = foundry.dice.terms.Die;\n\n  // if (this.options.configured) return; seems this is not required.\n  let bonusTerms: foundry.dice.terms.RollTerm[] = [];\n  /* criticalDamage is one of \n    \"default\": \"DND5e Settings Only\",\n    \"maxDamage\": \"Max Normal Damage\",\n    \"maxCrit\": \"Max Critical Dice (flat number)\",\n    \"maxCritRoll\": \"Max Critical Dice (roll dice)\",\n    \"maxAll\": \"Max All Dice\",\n    \"doubleDice\": \"Double Rolled Damage\",\n    \"explode\": \"Explode all critical dice\",\n    \"explodePlayer\": \"Explode Player critical dice\",\n    \"explodeGM\": \"Explode GM crtical dice\",\n    \"baseDamage\": \"Only Weapon Extra Critical\",\n    \"maxBaseRollCrit\": \"Max base damage and roll critical dice\",\n    \"bestOfTwo\": \"Best of two rolls\",\n  },\n */\n  // if (criticalDamage === \"doubleDice\") this.options.multiplyNumeric = true;\n  this.simplify();\n\n\n  for (let [i, term] of this.terms.entries()) {\n    let cm = this.options.critical?.multiplier ?? 2;\n    let cb = (this.options.critical?.bonusDice && (i === 0)) ? this.options.critical?.bonusDice : 0;\n    if (term._number instanceof Roll) {\n      // Complex number term.\n      if (!term._number.isDeterministic) continue;\n      if (!term._number._evaluated) term._number.evaluateSync();\n    }\n    if (term.modifiers && !term.options.baseModifiers) {\n      term.options.baseModifiers = foundry.utils.deepClone(term.modifiers);\n    }\n    if (term.modifiers) {\n      term.modifiers = foundry.utils.deepClone(term.options.baseModifiers);\n    }\n    term.options.baseNumber = term.options.baseNumber ?? term.number;\n    term.number = term.options.baseNumber;\n\n    switch (getCriticalDamage()) {\n      case \"maxDamage\":\n        if (term instanceof DiceTerm) term.modifiers.push(`min${term.faces}`);\n        break;\n      case \"maxDamageExplode\":\n        if (term instanceof DiceTerm) term.modifiers.push(`min${term.faces}`);\n        if (term instanceof DiceTerm) {\n          //@ts-expect-error no dnd5e-types\n          bonusTerms.push(new OperatorTerm({ operator: \"+\", options: { criticalBonusDamage: true } }));\n          const newTerm = new Die({ number: term.number + cb, faces: term.faces })\n          newTerm.modifiers.push(`x${term.faces}`);\n          newTerm.options = foundry.utils.deepClone(term.options)\n          //@ts-expect-error no dnd5e-types\n          newTerm.options.criticalBonusDamage = true;\n          // foundry.utils.setProperty(newTerm.options, \"sourceTerm\", term);\n          bonusTerms.push(newTerm);\n        }\n        break;\n      case \"maxCrit\":  // Powerful critical\n      case \"maxCritRoll\":\n        if (term instanceof DiceTerm) {\n          let critTerm;\n          //@ts-expect-error no dnd5e-types\n          bonusTerms.push(new OperatorTerm({ operator: \"+\", options: { criticalBonusDamage: true } }));\n          if (getCriticalDamage() === \"maxCrit\")\n            critTerm = new NumericTerm({ number: (term.number + cb) * (term.faces ?? 1) });\n          else {\n            critTerm = new Die({ number: term.number + cb, faces: term.faces });\n            critTerm.modifiers = foundry.utils.deepClone(term.modifiers);\n            critTerm.modifiers.push(`min${term.faces}`);\n          }\n          critTerm.options = foundry.utils.deepClone(term.options);\n          critTerm.options.criticalBonusDamage = true;\n          bonusTerms.push(critTerm);\n        } else if (term instanceof NumericTerm && options.multiplyNumeric) {\n          term.number *= cm;\n        }\n        break;\n      case \"maxAll\":\n        if (term instanceof DiceTerm) {\n          term.alter(cm, cb);\n          term.modifiers.push(`min${term.faces}`);\n        } else if (term instanceof NumericTerm && this.options.multiplyNumeric) {\n          term.number *= cm;\n        }\n        break;\n      case \"bestOfTwo\":\n        if (term instanceof DiceTerm) {\n          term.modifiers.push(`kh${term.number !== 1 ? term.number : \"\"}`);\n          term.number = (term.number ?? 1) * 2;\n        }\n        break;\n      case \"doubleDice\":\n        if (term instanceof DiceTerm) {\n          //term.alter(cm, cb);\n          term.modifiers.push(\"mx2\");\n        } else if (term instanceof NumericTerm && this.options.multiplyNumeric) {\n          term.number *= cm;\n        }\n        break;\n      case \"explode\":\n      case \"explodeCharacter\":\n      case \"explodeNPC\":\n        if (term instanceof DiceTerm) {\n          //@ts-expect-error no dnd5e-types\n          bonusTerms.push(new OperatorTerm({ operator: \"+\", options: { criticalBonusDamage: true } }));\n          const newTerm = new Die({ number: term.number + cb, faces: term.faces })\n          newTerm.modifiers.push(`x${term.faces}`);\n          newTerm.options = foundry.utils.deepClone(term.options);\n          //@ts-expect-error no dnd5e-types\n          newTerm.options.criticalBonusDamage = true;\n          // foundry.utils.setProperty(newTerm.options, \"sourceTerm\", term);\n          bonusTerms.push(newTerm);\n        }\n        break;\n      case \"maxBaseRollCrit\":\n        if (term instanceof DiceTerm) term.modifiers.push(`min${term.faces}`);\n        if (term instanceof DiceTerm) {\n          //@ts-expect-error no dnd5e-types\n          bonusTerms.push(new OperatorTerm({ operator: \"+\", options: { criticalBonusDamage: true } }));\n          const newTerm = new Die({ number: term.number, faces: term.faces })\n          newTerm.options = foundry.utils.deepClone(term.options);\n          // @ts-expect-error no dnd5e-types\n          newTerm.options.criticalBonusDamage = true;\n          // foundry.utils.setProperty(newTerm.options, \"sourceTerm\", term);\n          bonusTerms.push(newTerm);\n        }\n        break;\n      case \"baseDamage\":\n      default:\n        break;\n    }\n  }\n  if (bonusTerms.length > 0) this.terms.push(...bonusTerms);\n  if (this.options.critical?.bonusDamage) {\n    const extra = new Roll(this.options.critical.bonusDamage, this.data);\n    for (let term of extra.terms) {\n      if (term instanceof DiceTerm || term instanceof NumericTerm)\n        if (!term.options?.flavor) term.options = foundry.utils.deepClone(this.terms[0].options);\n      //@ts-expect-error\n      term.options.criticalBonusDamage = true;\n    }\n    if (!(extra.terms[0] instanceof OperatorTerm))\n      //@ts-expect-error no dnd5e-types\n      this.terms.push(new OperatorTerm({ operator: \"+\", options: { criticalBonusDamage: true } }));\n    this.terms.push(...extra.terms);\n  }\n  while (this.terms.length > 0 && this.terms[this.terms.length - 1] instanceof OperatorTerm)\n    this.terms.pop();\n  this.resetFormula();\n  this.options.configured = true;\n  // if (this.data.actorType === configSettings.averageDamage || configSettings.averageDamage === \"all\") averageDice(this);\n}\n\nasync function doRollAbility(this: Actor.Implementation, wrapped, rollType: string, config: RollProcessConfig & { ability?: string } = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n  let oldFormat = false;\n  if (config.midiOptions?.target) config.target = config.midiOptions.target;\n  if (config.midiOptions?.isConcentrationCheck) {\n    foundry.utils.setProperty(message, \"data.flags.midi-qol.isConcentrationCheck\", true);\n    config.midiOptions.isConcentrationCheck = false; // remove the isConcentrationCheck option so we won't infinitely recurse\n    // Note to self concentration max/min value is now handled directly by dnd5e - so the flag has changed\n    // @ts-expect-error no dnd5e-types\n    return this.rollConcentration(config, dialog, message);\n  }\n  message.data ??= {};\n  config.midiOptions ??= {};\n  let abilityId = config.ability;\n  const rollAbilities: string[] = config.midiOptions?.rollAbilities ?? (abilityId ? [abilityId] : []);\n  let overtimeActorUuid: string | undefined;\n  let preRollAbilityHookId: number | undefined;\n  let rollAbilityHookId: number | undefined;\n  const saveRollMode: keyof CONFIG.Dice.RollModes = safeGetGameSetting(\"core\", \"rollMode\");\n  let result: Roll[] | undefined;\n  let type: \"SavingThrow\" | \"AbilityCheck\" = \"SavingThrow\";\n  try {\n    if (rollAbilities.length === 0 && rollType === \"save\")\n      throw new Error(`doRollAbility called with no abilities to roll for ${this.name}`);\n    if (config.event) {\n      // Checks if we rolled from a concentration request dialog. If so use the actor specified in the request card\n      // @ts-expect-error we know better\n      const target = config?.event?.target?.closest('.roll-link, [data-action=\"rollRequest\"], [data-action=\"concentration\"]');\n      if (target?.dataset?.midiOvertimeActorUuid) {\n        overtimeActorUuid = target.dataset.midiOvertimeActorUuid;\n        message.rollMode = target.dataset.midiRollMode ?? message.rollMode;\n      }\n      if (overtimeActorUuid && this.uuid !== overtimeActorUuid) {\n        const actualActor = fromUuidSync(overtimeActorUuid) as Actor.Implementation | undefined;\n        if (actualActor && rollType === \"save\")\n          //@ts-expect-error no dnd5e types\n          return actualActor.rollSavingThrow(config, dialog, message);\n        //@ts-expect-error no dnd5e types\n        else if (actualActor) return actualActor.rollAbilityCheck(config, dialog, message);\n      }\n    }\n\n    if (config.target !== undefined && !checkRule(\"criticalSaves\") && config.midiOptions) { // We have a target value, which means we are checking for success and not criticals\n      config.midiOptions.critical = 21;\n      config.midiOptions.fumble = 0;\n    }\n\n    // Check if advantage was pre-computed by an external module (Monks Token Bar, Flash Rolls, Epic Rolls)\n    const sourceInfo = getAdvantageSourceInfo(config);\n    const isExternalModuleRoll = sourceInfo.isExternalModule;\n\n    let hasPreComputedAdvantage = false;\n    if (!config.midiOptions.recomputeAdvantage) {\n      hasPreComputedAdvantage = applyPreComputedAdvantage(config);\n      if (hasPreComputedAdvantage && isAutoFastForward(rollType as FastForwardRollType)) {\n        config.midiOptions.fastForward = true;\n      }\n    }\n    // Ensure workflow is set up from workflowId if needed (for grants flag checking)\n    if (!config.midiOptions.workflow && config.midiOptions.workflowId) {\n      config.midiOptions.workflow = Workflow.getWorkflow(config.midiOptions.workflowId);\n    }\n\n    type = rollType === \"save\" ? \"SavingThrow\" : \"AbilityCheck\";\n    let success: boolean | undefined;\n    const saveCreate = message.create;\n    message.create = false;\n\n    // Set originatingMessage so dnd5e's MessageRegistry and getOriginatingMessage() work correctly\n    const originatingCardId = config.midiOptions.workflow?.itemCardId\n      ?? (config.midiOptions.itemCardUuid ? fromUuidSync(config.midiOptions.itemCardUuid)?.id : undefined);\n    if (originatingCardId) foundry.utils.setProperty(message, \"data.flags.dnd5e.originatingMessage\", originatingCardId);\n\n    let abilityModifiers: RollModifierResult | undefined;\n    const midiOptions = config.midiOptions;\n\n    // Check if advantageByChoice was passed in (from Workflow via GMAction with deserialized trackers)\n    const passedAdvantageMap = config.midiOptions?.advantageByChoice as Record<string, PreComputedAdvantage> | undefined;\n    const hasPassedAdvantage = passedAdvantageMap && Object.keys(passedAdvantageMap).length > 0 &&\n      Object.values(passedAdvantageMap).some(v => v.tracker instanceof RollModifierTracker);\n    // Concentration saves use the \"concentration\" roll type which composes with \"save\"\n    const effectiveRollType = (rollType === \"save\" && config.hookNames?.includes(\"concentration\")) ? \"concentration\" : rollType;\n\n    // Skip building advantage map for external module rolls - they already computed advantage\n    const preComputedAdvantageMap: Record<string, PreComputedAdvantage> = isExternalModuleRoll\n      ? {} // External modules handle their own advantage - don't recompute\n      : hasPassedAdvantage && passedAdvantageMap\n        ? passedAdvantageMap\n        : await buildPreComputedAdvantageMap(this, effectiveRollType, rollAbilities, config.midiOptions ?? {});\n\n    // Setup dialog with MidiRollChoiceDialog helper\n    let userExplicitChoice: string | undefined;\n    const { hasMultiple: hasMultipleChoices } = setupChoiceDialog(\n      this, config, dialog, \"ability\", rollAbilities,\n      preComputedAdvantageMap, hasPreComputedAdvantage, rollType as \"save\" | \"check\",\n      (choice) => { userExplicitChoice = choice; }\n    );\n\n    preRollAbilityHookId = Hooks.once(`dnd5e.preRoll${type}`, (configData, dialogData, _message) => {\n      configData.midiOptions = { ...(configData.midiOptions ?? {}), ...(midiOptions ?? {}) };\n\n      const advantageValues = Object.values(preComputedAdvantageMap);\n      const allAutoFail = advantageValues.length > 0 && advantageValues.every(d => d.tracker instanceof RollModifierTracker && d.tracker.modifiers.willFail);\n      if (hasMultipleChoices && !allAutoFail && dialogData.configure !== false) {\n        dialogData.configure = true;\n      } else {\n        const chosenAbility = configData.ability ?? abilityId;\n        const chosenAdvantage = preComputedAdvantageMap[chosenAbility!];\n        if (chosenAdvantage) {\n          if (!hasPreComputedAdvantage) {\n            configData.advantage = chosenAdvantage.hasAdvantage;\n            configData.disadvantage = chosenAdvantage.hasDisadvantage;\n          }\n          if (chosenAdvantage.tracker instanceof RollModifierTracker) {\n            abilityModifiers = applyRollModifiers(chosenAdvantage.tracker, configData, dialogData);\n            if (abilityModifiers.autoFail) success = false;\n          }\n        }\n      }\n      setRollDialogOptions(configData, dialogData, rollType as FastForwardRollType);\n    });\n\n    rollAbilityHookId = Hooks.once(`dnd5e.post${type}RollConfiguration`, (rolls, configData, dialogData, messageDetails) => {\n      // record the configured message data for later display\n      message = messageDetails;\n\n      // Detect ability change from choice dialog and check auto-fail/auto-success\n      if (configData.ability && configData.ability !== abilityId) {\n        abilityId = configData.ability;\n      }\n      const chosenAbilityData = preComputedAdvantageMap[abilityId ?? \"\"];\n      const chosenAbilityTracker = chosenAbilityData?.tracker instanceof RollModifierTracker ? chosenAbilityData.tracker : undefined;\n      if (chosenAbilityTracker?.modifiers.willFail) success = false;\n      else if (chosenAbilityTracker?.modifiers.willSucceed) success = true;\n\n      // Apply blind roll mode based on chosen ability\n      const blindRollSettings = rollType === \"check\" ? configSettings.rollChecksBlind : configSettings.rollSavesBlind;\n      messageDetails.rollMode = applyBlindRollMode(blindRollSettings, abilityId, messageDetails.rollMode);\n    });\n    if (this.token) foundry.utils.setProperty(dialog, \"options.window.subtitle\", this.token.name);\n\n    result = await wrapped(config, dialog, message);\n    message.create = saveCreate;\n\n    if (!result) return result;\n    if (result instanceof Roll) {\n      console.warn(\"midi-qol | doRollAbility: result is a Roll, not an array of Rolls\");\n      result = [result];\n    }\n    let rollMode: keyof CONFIG.Dice.RollModes = message.rollMode ?? safeGetGameSetting(\"core\", \"rollMode\");\n    // @ts-expect-error\n    result.forEach(r => r.options.rollMode = rollMode);\n    await displayDSNForRoll(result, rollType, rollMode);\n    DSNMarkDiceDisplayed(result);\n    foundry.utils.mergeObject(message.data, { \"flags\": config.flags ?? {} });\n    // Set overtimeActorUuid AFTER message object is replaced by hook and merged\n    if (overtimeActorUuid) {\n      foundry.utils.setProperty(message.data, \"flags.midi-qol.overtimeActorUuid\", overtimeActorUuid);\n    }\n    if (!config.midiOptions.simulate) {\n      result[0] = await bonusCheck(this, result[0], rollType, abilityId, message.data);\n      DSNMarkDiceDisplayed(result);\n      // @ts-expect-error no dnd5e-types\n      if (Number.isNumeric(result[0].options.target) && result[0].isSuccess === false) {\n        const failFlagsLength = collectBonusFlags(this, rollType, \"fail.all\").length;\n        const failAbilityFlagsLength = collectBonusFlags(this, rollType, `fail.${abilityId}`).length\n        if (failFlagsLength || failAbilityFlagsLength) {\n          // If the roll fails and there is an flags.midi-qol.save.fail then apply the bonus\n          result[0] = await bonusCheck(this, result[0], rollType, failAbilityFlagsLength ? `fail.${abilityId}` : \"fail.all\", message.data);\n        }\n      }\n    }\n\n    // Stamp the chosen ability on the rolls (after bonusCheck) so the save display can show which ability was used\n    // userExplicitChoice is set by buildConfig wrapper when user changes dropdown; config.ability is the auto-selected best\n    const chosenAbility = userExplicitChoice ?? config.ability;\n    //@ts-expect-error midiChosenId is a custom roll option\n    if (hasMultipleChoices) result.forEach(r => { if (r?.options) r.options.midiChosenId = chosenAbility; });\n\n    // Set originatingMessage on roll options so modules can access it without .parent\n    const rollOriginatingId = foundry.utils.getProperty(message, \"data.flags.dnd5e.originatingMessage\") as string | undefined\n      ?? originatingCardId;\n    //@ts-expect-error originatingMessage is a custom roll option\n    if (rollOriginatingId) result.forEach(r => { if (r?.options) r.options.originatingMessage = rollOriginatingId; });\n\n    if (message.create !== false && result) {\n      if (foundry.utils.getProperty(result, \"flags.midi-qol.chatMessageShown\") !== true) {\n        const messageData: any = foundry.utils.mergeObject({ sound: CONFIG.sounds.dice }, message.data ?? {});\n        messageData.rolls = result;\n        const chatMsg = await ChatMessage.create(messageData, { rollMode });\n        // dnd5e sets roll.parent in buildPost; replicate here since we bypass buildPost\n        if (chatMsg) result.forEach(r => (r as any).parent = chatMsg);\n      }\n    }\n    if (saveRollMode) game.settings.set(\"core\", \"rollMode\", saveRollMode);\n    if (abilityId) await expireRollEffect.bind(this)(rollType, abilityId, success);\n    if (config.midiOptions.isConcentrationCheck) {\n      // @ts-expect-error no dnd5e-types\n      if (success === undefined && result?.[0]?.isSuccess !== undefined) success = result[0].isSuccess;\n      expireRollEffect.bind(this)(\"isConcentrationSave\", \"\", success);\n    }\n  } catch (err) {\n    const message = `doRollAbility error ${this.name} ${abilityId} ${rollType} ${this.uuid}`;\n    TroubleShooter.recordError(err, message);\n    error(message, err);\n    throw err;\n  } finally {\n    if (preRollAbilityHookId) Hooks.off(`dnd5e.preRoll${type}`, preRollAbilityHookId);\n    if (rollAbilityHookId) Hooks.off(`dnd5e.post${type}RollConfiguration`, rollAbilityHookId);\n    if (saveRollMode) game.settings.set(\"core\", \"rollMode\", saveRollMode);\n  }\n  return oldFormat ? result?.[0] : result\n}\n\nexport async function rollSavingThrow(this: Actor.Implementation, wrapped, config: RollProcessConfig = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n  // Death saves are handled by the rollDeathSave wrapper, not doRollAbility\n  // Death saves have hookNames: [\"deathSave\"] and no ability, so skip doRollAbility processing\n  if (config.hookNames?.includes(\"deathSave\")) {\n    return wrapped(config, dialog, message);\n  }\n  return doRollAbility.bind(this)(wrapped, \"save\", config, dialog, message);\n}\n\nasync function rollAbilityCheck(this: Actor.Implementation, wrapped, config: RollProcessConfig = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n  return doRollAbility.bind(this)(wrapped, \"check\", config, dialog, message);\n}\n\nasync function rollDeathSave(this: Actor.Implementation, wrapped, config: RollProcessConfig = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n  config.midiOptions ??= {};\n  const deathSaveBonus = this.flags?.[MODULE_ID]?.deathSaveBonus;\n\n  let hasPreComputedAdvantage = false;\n  if (!config.midiOptions.recomputeAdvantage) {\n    hasPreComputedAdvantage = applyPreComputedAdvantage(config);\n    if (hasPreComputedAdvantage && isAutoFastForward(\"save\")) {\n      config.midiOptions.fastForward = true;\n    }\n  }\n  if (!hasPreComputedAdvantage) {\n    // Build death save advantage/disadvantage flags\n    const advantageFlags: AdvantageFlags = {\n      advantageFlags: [\"advantage.all\", \"advantage.deathSave\"],\n      disadvantageFlags: [\"disadvantage.all\", \"disadvantage.deathSave\"],\n      // Actor noAdvantage/noDisadvantage flags (prevent actor's own advantage/disadvantage)\n      noAdvantageFlags: [\"noAdvantage.all\", \"noAdvantage.deathSave\"],\n      noDisadvantageFlags: [\"noDisadvantage.all\", \"noDisadvantage.deathSave\"],\n      systemRollModeFields: [\"attributes.death.roll.mode\"]\n    };\n\n    // Process advantage/disadvantage flags using centralized helper\n    // For death saves, the grants actor is the caster (if any workflow exists)\n    const tracker = await computeAdvantageFlags(this, advantageFlags, {\n      ...config.midiOptions,\n      grantsActor: config.midiOptions.workflow?.actor\n    });\n    config.advantage = tracker.hasAdvantage;\n    config.disadvantage = tracker.hasDisadvantage;\n  }\n\n  let advantage = config.advantage;\n  let disadvantage = config.disadvantage;\n\n  const options: MidiOptions = { advantage, disadvantage };\n\n  // Handle death save bonus\n  if (deathSaveBonus) {\n    const conditionData = createConditionData({ workflow: undefined, target: undefined, actor: this });\n    let bonus: any;\n    if (typeof deathSaveBonus === \"number\") {\n      bonus = deathSaveBonus;\n    } else {\n      bonus = await evalAllConditionsAsync(this, \"flags.midi-qol.deathSaveBonus\", conditionData);\n    }\n    if (bonus) {\n      options.parts = [bonus];\n    }\n  }\n\n  foundry.utils.mergeObject(config.midiOptions, options);\n  config.advantage = advantage;\n  config.disadvantage = disadvantage;\n  const blindSaveRoll = configSettings.rollSavesBlind.includes(\"all\") || configSettings.rollSavesBlind.includes(\"death\");\n  const actor = this;\n\n  const rollModifierTracker = new RollModifierTracker();\n  const preRollHookId = Hooks.once(\"dnd5e.preRollDeathSave\", (configData, dialogData, messageData) => {\n    // Merge midiOptions to ensure advantage/disadvantage and other values are preserved\n    configData.midiOptions = { ...(configData.midiOptions ?? {}), ...(config.midiOptions ?? {}) };\n\n    // Set advantage/disadvantage on configData so dnd5e rolls 2 dice when appropriate\n    configData.advantage = advantage;\n    configData.disadvantage = disadvantage;\n\n    // Apply roll modifiers (auto-fail/auto-success) for death saves\n    const modifierFlags: RollModifierFlags = {\n      failFlags: [\"fail.all\", \"fail.deathSave\"],\n      successFlags: [\"success.all\", \"success.deathSave\"],\n      maxFlags: [],\n      minFlags: []\n    };\n    computeRollModifiers(actor, modifierFlags, rollModifierTracker);\n    const modifiers = applyRollModifiers(rollModifierTracker, configData, dialogData, { failValue: 2, successValue: 19 });\n    const { autoFail, autoSuccess } = modifiers;\n\n    for (let roll of configData.rolls ?? []) {\n      roll.options ??= {};\n      roll.options.advantage = advantage;\n      roll.options.disadvantage = disadvantage;\n      if (!autoFail && !autoSuccess && configData.midiOptions?.parts?.length) roll.parts = [...(roll.parts ?? []), ...configData.midiOptions.parts];\n      if (blindSaveRoll) roll.options.rollMode = CONST.DICE_ROLL_MODES.BLIND;\n    }\n    setRollDialogOptions(configData, dialogData, \"save\");\n    if (blindSaveRoll) messageData.rollMode = CONST.DICE_ROLL_MODES.BLIND;\n  });\n\n  try {\n    return await wrapped(config, dialog, message);\n  } finally {\n    if (preRollHookId) Hooks.off(\"dnd5e.preRollDeathSave\", preRollHookId);\n  }\n}\n\nexport function deathSaveHook(rolls: Roll[], { chatString, subject: actor }: { chatString: string; updates: Actor.UpdateData; subject: Actor.Implementation }) {\n  if (configSettings.keepRollStats && actor) {\n    if (rolls instanceof Roll) rolls = [rolls];\n    let successes = 0;\n    let failures = 0;\n    for (const roll of rolls) {\n      // @ts-expect-error no dnd5e-types\n      if (roll.isCritical) successes += 2;\n      // @ts-expect-error no dnd5e-types\n      else if (roll.isFumble) failures += 2;\n      // @ts-expect-error no dnd5e-types\n      else if (roll.isFailure) failures += 1;\n      else successes += 1;\n    }\n    gameStats.addDeathSaveResult(actor, successes, failures);\n  }\n  if (chatString === \"DND5E.DeathSaveFailure\") {\n    if (hasCondition(actor, \"unconscious\")) {\n      const _id = CONFIG.statusEffects.find(e => e.id === \"unconscious\")?._id;\n      const effect = actor.effects.find(e => e._id === _id);\n      if (effect) effect.setFlag(\"core\", \"overlay\", false);\n    }\n    const status = getDeadStatus();\n    if (!status) return;\n    setDeadStatus(actor, { effect: status, useDefeated: true, makeDead: true, overlay: true });\n  }\n}\n\nexport async function computeAbilityAdvantage(actor: Actor.Implementation, rollType: string, abilityId: string, options: MidiOptions, tracker?: RollModifierTracker): Promise<{ tracker: RollModifierTracker, magicResistance: boolean, magicVulnerability: boolean }> {\n  // Create RollModifierTracker if not provided (will be discarded by caller if they don't need attribution)\n  tracker = tracker ?? new RollModifierTracker();\n\n  // Create a copy of relevant options to avoid modifying the original\n  const effectiveOptions = { ...options };\n  let magicResistance = false;\n  let magicVulnerability = false;\n\n  // Check magic resistance/vulnerability for magic saves first using centralized function\n  if (rollType === \"save\" && options.isMagicSave) {\n    const magicCheck = await checkMagicResistanceAndVulnerability(actor, abilityId);\n    if (magicCheck.advantage) {\n      tracker.advantage.add(\"magicResistance\", \"Magic Resistance\");\n    }\n    if (magicCheck.disadvantage) {\n      tracker.disadvantage.add(\"magicVulnerability\", \"Magic Vulnerability\");\n    }\n    magicResistance = magicCheck.magicResistance;\n    magicVulnerability = magicCheck.magicVulnerability;\n  }\n\n  // Build advantage/disadvantage flags to check\n  const abilityFlags: AdvantageFlags = {\n    advantageFlags: [\n      \"advantage.all\",\n      \"advantage.ability.all\",\n      `advantage.${rollType}.all`,\n      `advantage.${rollType}.${abilityId}`,\n    ],\n    disadvantageFlags: [\n      \"disadvantage.all\",\n      \"disadvantage.ability.all\",\n      `disadvantage.${rollType}.all`,\n      `disadvantage.${rollType}.${abilityId}`,\n    ],\n    // Actor noAdvantage/noDisadvantage flags (prevent actor's own advantage/disadvantage)\n    noAdvantageFlags: [\n      \"noAdvantage.all\",\n      `noAdvantage.${rollType}.all`,\n      `noAdvantage.${rollType}.${abilityId}`\n    ],\n    noDisadvantageFlags: [\n      \"noDisadvantage.all\",\n      `noDisadvantage.${rollType}.all`,\n      `noDisadvantage.${rollType}.${abilityId}`\n    ],\n    systemRollModeFields: [`abilities.${abilityId}.${rollType}.roll.mode`],\n  };\n\n  // Add spell school-specific save advantage/disadvantage flags\n  // @ts-expect-error .system.school\n  const saveSchool = options.workflow?.saveItem?.system?.school;\n  if (rollType === \"save\" && saveSchool) {\n    abilityFlags.advantageFlags.push(`advantage.save.school.${saveSchool}`);\n    abilityFlags.disadvantageFlags.push(`disadvantage.save.school.${saveSchool}`);\n    abilityFlags.noAdvantageFlags?.push(`noAdvantage.save.school.${saveSchool}`);\n    abilityFlags.noDisadvantageFlags?.push(`noDisadvantage.save.school.${saveSchool}`);\n  }\n\n  // Add source actor grants flags for saves and checks\n  if (rollType === \"save\" || rollType === \"check\") {\n    abilityFlags.sourceAdvantageFlags = [\"grants.advantage.all\", `grants.advantage.${rollType}.all`, `grants.advantage.${rollType}.${abilityId}`];\n    abilityFlags.sourceDisadvantageFlags = [\"grants.disadvantage.all\", `grants.disadvantage.${rollType}.all`, `grants.disadvantage.${rollType}.${abilityId}`];\n    abilityFlags.sourceNoAdvantageFlags = [\"grants.noAdvantage.all\", `grants.noAdvantage.${rollType}.all`, `grants.noAdvantage.${rollType}.${abilityId}`];\n    abilityFlags.sourceNoDisadvantageFlags = [\"grants.noDisadvantage.all\", `grants.noDisadvantage.${rollType}.all`, `grants.noDisadvantage.${rollType}.${abilityId}`];\n    if (rollType === \"save\" && saveSchool) {\n      abilityFlags.sourceAdvantageFlags.push(`grants.advantage.save.school.${saveSchool}`);\n      abilityFlags.sourceDisadvantageFlags.push(`grants.disadvantage.save.school.${saveSchool}`);\n      abilityFlags.sourceNoAdvantageFlags.push(`grants.noAdvantage.save.school.${saveSchool}`);\n      abilityFlags.sourceNoDisadvantageFlags.push(`grants.noDisadvantage.save.school.${saveSchool}`);\n    }\n  }\n\n  // For saves/checks, the grants actor is the caster (workflow.actor)\n  // Pass tracker to be populated with attribution\n  await computeAdvantageFlags(actor, abilityFlags, {\n    ...effectiveOptions,\n    grantsActor: effectiveOptions.workflow?.actor\n  }, tracker);\n  return { tracker: tracker, magicResistance, magicVulnerability };\n}\n\n/**\n * Roll type handler configuration for buildPreComputedAdvantageMap.\n * Data-driven approach for easy extension to new roll types.\n */\ninterface RollTypeHandler {\n  computeAdvantage: (actor: Actor.Implementation, id: string, options: MidiOptions) => Promise<RollModifierTracker>;\n  getModifierFlags: (actor: Actor.Implementation, id: string, options?: MidiOptions) => RollModifierFlags;\n}\n\nconst rollTypeHandlers: Record<string, RollTypeHandler> = {\n  save: {\n    computeAdvantage: async (actor, id, options) => {\n      const result = await computeAbilityAdvantage(actor, \"save\", id, options);\n      return result.tracker;\n    },\n    getModifierFlags: (_actor, id, options) => {\n      const flags: RollModifierFlags = {\n        failFlags: [\"fail.all\", \"fail.ability.all\", \"fail.ability.save.all\", `fail.ability.save.${id}`],\n        successFlags: [\"success.all\", \"success.ability.all\", \"success.ability.save.all\", `success.ability.save.${id}`],\n        maxFlags: [\"max.ability.save.all\", `max.ability.save.${id}`],\n        minFlags: [\"min.ability.save.all\", `min.ability.save.${id}`]\n      };\n      // @ts-expect-error .system.school\n      const saveSchool = options?.workflow?.saveItem?.system?.school;\n      if (saveSchool) {\n        flags.failFlags.push(`fail.save.school.${saveSchool}`);\n        flags.successFlags.push(`success.save.school.${saveSchool}`);\n      }\n      return flags;\n    }\n  },\n  check: {\n    computeAdvantage: async (actor, id, options) => {\n      const result = await computeAbilityAdvantage(actor, \"check\", id, options);\n      return result.tracker;\n    },\n    getModifierFlags: (_actor, id) => ({\n      failFlags: [\"fail.all\", \"fail.ability.all\", \"fail.ability.check.all\", `fail.ability.check.${id}`],\n      successFlags: [\"success.all\", \"success.ability.all\", \"success.ability.check.all\", `success.ability.check.${id}`],\n      maxFlags: [\"max.ability.check.all\", `max.ability.check.${id}`],\n      minFlags: [\"min.ability.check.all\", `min.ability.check.${id}`]\n    })\n  },\n  skill: {\n    computeAdvantage: async (actor, id, options) => {\n      return computeSkillAdvantage(actor, id, options);\n    },\n    getModifierFlags: (actor, id) => {\n      // @ts-expect-error no dnd5e-types\n      const abilityId = actor.system?.skills?.[id]?.ability ?? \"\";\n      const flags: RollModifierFlags = {\n        failFlags: [\"fail.all\", \"fail.skill.all\", `fail.skill.${id}`],\n        successFlags: [\"success.all\", \"success.skill.all\", `success.skill.${id}`],\n        maxFlags: [\"max.skill.all\", `max.skill.${id}`],\n        minFlags: [\"min.skill.all\", `min.skill.${id}`]\n      };\n      // Include ability check flags if skillAbilityCheckAdvantage is enabled\n      if (configSettings.skillAbilityCheckAdvantage && abilityId) {\n        flags.failFlags.push(\"fail.ability.all\", \"fail.ability.check.all\", `fail.ability.check.${abilityId}`);\n        flags.successFlags.push(\"success.ability.all\", \"success.ability.check.all\", `success.ability.check.${abilityId}`);\n        flags.maxFlags.push(\"max.ability.check.all\", `max.ability.check.${abilityId}`);\n        flags.minFlags.push(\"min.ability.check.all\", `min.ability.check.${abilityId}`);\n      }\n      return flags;\n    }\n  },\n  tool: {\n    computeAdvantage: async (actor, id, options) => {\n      // @ts-expect-error no dnd5e-types\n      const abilityId = actor.system?.tools?.[id]?.ability || GameSystemConfig.tools[id]?.ability || \"\";\n      return computeToolAdvantage(actor, id, abilityId, options);\n    },\n    getModifierFlags: (actor, id) => {\n      // @ts-expect-error no dnd5e-types\n      const abilityId = actor.system?.tools?.[id]?.ability || GameSystemConfig.tools[id]?.ability || \"\";\n      const flags: RollModifierFlags = {\n        failFlags: [\"fail.all\", \"fail.tool.all\", `fail.tool.${id}`],\n        successFlags: [\"success.all\", \"success.tool.all\", `success.tool.${id}`],\n        maxFlags: [\"max.tool.all\", `max.tool.${id}`],\n        minFlags: [\"min.tool.all\", `min.tool.${id}`]\n      };\n      // Include ability check flags if the tool has an associated ability\n      if (abilityId) {\n        flags.failFlags.push(\"fail.ability.all\", \"fail.ability.check.all\", `fail.ability.check.${abilityId}`);\n        flags.successFlags.push(\"success.ability.all\", \"success.ability.check.all\", `success.ability.check.${abilityId}`);\n        flags.maxFlags.push(\"max.ability.check.all\", `max.ability.check.${abilityId}`);\n        flags.minFlags.push(\"min.ability.check.all\", `min.ability.check.${abilityId}`);\n      }\n      return flags;\n    }\n  },\n  // Concentration saves are ability saves (default CON) with additional concentration-specific flags\n  concentration: {\n    computeAdvantage: async (actor, id, options) => {\n      // Use actor's configured concentration ability, falling back to passed id or default\n      // @ts-expect-error .attributes.concentration\n      const abilityId = actor.system?.attributes?.concentration?.ability || id || GameSystemConfig.defaultAbilities?.concentration || \"con\";\n      // Get the ability save advantage\n      const saveResult = await computeAbilityAdvantage(actor, \"save\", abilityId, options);\n\n      // Add concentration-specific flags to the same tracker\n      const concentrationFlags: AdvantageFlags = {\n        advantageFlags: [\"advantage.concentration\"],\n        disadvantageFlags: [\"disadvantage.concentration\"],\n        noAdvantageFlags: [\"noAdvantage.concentration\"],\n        noDisadvantageFlags: [\"noDisadvantage.concentration\"],\n        systemRollModeFields: [\"attributes.concentration.roll.mode\"]\n      };\n      await computeAdvantageFlags(actor, concentrationFlags, options, saveResult.tracker);\n\n      return saveResult.tracker;\n    },\n    getModifierFlags: (actor, id) => {\n      // Use actor's configured concentration ability, falling back to passed id or default\n      // @ts-expect-error .attributes.concentration\n      const abilityId = actor.system?.attributes?.concentration?.ability || id || GameSystemConfig.defaultAbilities?.concentration || \"con\";\n      // Start with ability save modifiers\n      const saveModifiers = rollTypeHandlers.save.getModifierFlags(actor, abilityId);\n      // Add concentration-specific modifiers\n      return {\n        failFlags: [...saveModifiers.failFlags, \"fail.concentration\"],\n        successFlags: [...saveModifiers.successFlags, \"success.concentration\"],\n        maxFlags: [...saveModifiers.maxFlags, \"max.concentration\"],\n        minFlags: [...saveModifiers.minFlags, \"min.concentration\"]\n      };\n    }\n  }\n};\n\n/**\n * Build a pre-computed advantage map for multiple roll IDs (abilities, skills, or tools).\n * Each entry contains a full RollModifierTracker with:\n * - Advantage/disadvantage (from the appropriate compute function)\n * - Roll modifiers: fail, success, max, min flags\n *\n * Used by Workflow.ts (checkSaves) and doRollAbility/doRollSkill/doRollTool when no pre-computed map is passed.\n *\n * @param actor - The actor making the roll\n * @param rollType - \"save\", \"check\", \"skill\", or \"tool\"\n * @param rollIds - Array of ability/skill/tool IDs to compute\n * @param options - MidiOptions including workflow context\n */\nexport async function buildPreComputedAdvantageMap(\n  actor: Actor.Implementation,\n  rollType: string,\n  rollIds: string[],\n  options: MidiOptions\n): Promise<Record<string, PreComputedAdvantage>> {\n  const result: Record<string, PreComputedAdvantage> = {};\n  const workflow = options.workflow;\n\n  const handler = rollTypeHandlers[rollType];\n  if (!handler) {\n    console.warn(`midi-qol | buildPreComputedAdvantageMap: Unknown rollType \"${rollType}\"`);\n    return result;\n  }\n\n  for (const id of rollIds) {\n    // Compute advantage/disadvantage with attribution tracking\n    const tracker = await handler.computeAdvantage(actor, id, options);\n\n    // Add roll modifiers (fail/success/max/min) to the same tracker\n    const modifierFlags = handler.getModifierFlags(actor, id, options);\n    computeRollModifiers(actor, modifierFlags, tracker, { workflow });\n\n    const hasAdv = !!tracker.hasAdvantage;\n    const hasDisadv = !!tracker.hasDisadvantage;\n    result[id] = {\n      hasAdvantage: hasAdv,\n      hasDisadvantage: hasDisadv,\n      defaultButton: hasAdv && !hasDisadv ? \"advantage\" : !hasAdv && hasDisadv ? \"disadvantage\" : \"normal\",\n      tracker\n    };\n  }\n\n  return result;\n}\n\nexport async function computeSkillAdvantage(actor: Actor.Implementation, skillId: string, options: MidiOptions, tracker?: RollModifierTracker): Promise<RollModifierTracker> {\n  // @ts-expect-error no dnd5e-types\n  const abilityId = actor.system?.skills?.[skillId]?.ability ?? \"\";\n\n  // Build skill advantage/disadvantage flags\n  const skillFlags: AdvantageFlags = {\n    advantageFlags: [\n      \"advantage.all\",\n      \"advantage.skill.all\",\n      `advantage.skill.${skillId}`\n    ],\n    disadvantageFlags: [\n      \"disadvantage.all\",\n      \"disadvantage.skill.all\",\n      `disadvantage.skill.${skillId}`\n    ],\n    // Actor noAdvantage/noDisadvantage flags (prevent actor's own advantage/disadvantage)\n    noAdvantageFlags: [\n      \"noAdvantage.all\",\n      \"noAdvantage.skill.all\",\n      `noAdvantage.skill.${skillId}`\n    ],\n    noDisadvantageFlags: [\n      \"noDisadvantage.all\",\n      \"noDisadvantage.skill.all\",\n      `noDisadvantage.skill.${skillId}`\n    ],\n    systemRollModeFields: [`skills.${skillId}.roll.mode`],\n    // Source grants flags for skills (checked on workflow.actor, e.g., caster)\n    sourceAdvantageFlags: [\"grants.advantage.all\", \"grants.advantage.skill.all\", `grants.advantage.skill.${skillId}`],\n    sourceDisadvantageFlags: [\"grants.disadvantage.all\", \"grants.disadvantage.skill.all\", `grants.disadvantage.skill.${skillId}`],\n    sourceNoAdvantageFlags: [\"grants.noAdvantage.all\", \"grants.noAdvantage.skill.all\", `grants.noAdvantage.skill.${skillId}`],\n    sourceNoDisadvantageFlags: [\"grants.noDisadvantage.all\", \"grants.noDisadvantage.skill.all\", `grants.noDisadvantage.skill.${skillId}`]\n  };\n\n  // If the skill has an associated ability, also check ability-based flags\n  if (abilityId) {\n    // Add skill flags for the ability (e.g., advantage.skill.dex for all dex-based skills)\n    skillFlags.advantageFlags.push(`advantage.skill.${abilityId}`);\n    skillFlags.disadvantageFlags.push(`disadvantage.skill.${abilityId}`);\n    // Add noAdvantage/noDisadvantage for ability-based skill\n    skillFlags.noAdvantageFlags?.push(`noAdvantage.skill.${abilityId}`);\n    skillFlags.noDisadvantageFlags?.push(`noDisadvantage.skill.${abilityId}`);\n    // Add source grants for ability-based skill\n    skillFlags.sourceAdvantageFlags?.push(`grants.advantage.skill.${abilityId}`);\n    skillFlags.sourceDisadvantageFlags?.push(`grants.disadvantage.skill.${abilityId}`);\n    skillFlags.sourceNoAdvantageFlags?.push(`grants.noAdvantage.skill.${abilityId}`);\n    skillFlags.sourceNoDisadvantageFlags?.push(`grants.noDisadvantage.skill.${abilityId}`);\n\n    // If skillAbilityCheckAdvantage is enabled, also check ability check flags\n    if (configSettings.skillAbilityCheckAdvantage) {\n      // New flag names (preferred)\n      skillFlags.advantageFlags.push(\"advantage.ability.all\", \"advantage.check.all\", `advantage.check.${abilityId}`);\n      skillFlags.disadvantageFlags.push(\"disadvantage.ability.all\", \"disadvantage.check.all\", `disadvantage.check.${abilityId}`);\n    }\n  }\n\n  // For skills, source actor is the caster (workflow.actor) if any\n  // Create RollModifierTracker if not provided\n  tracker ??= new RollModifierTracker();\n  await computeAdvantageFlags(actor, skillFlags, {\n    ...options,\n    grantsActor: options.workflow?.actor\n  }, tracker);\n  return tracker;\n}\n\nexport async function computeToolAdvantage(actor: Actor.Implementation, toolId: string, abilityId: string, options: MidiOptions, tracker?: RollModifierTracker): Promise<RollModifierTracker> {\n  // Build tool advantage/disadvantage flags\n  const toolFlags: AdvantageFlags = {\n    advantageFlags: [\n      \"advantage.all\",\n      \"advantage.tool.all\",\n      `advantage.tool.${toolId}`\n    ],\n    disadvantageFlags: [\n      \"disadvantage.all\",\n      \"disadvantage.tool.all\",\n      `disadvantage.tool.${toolId}`\n    ],\n    // Actor noAdvantage/noDisadvantage flags (prevent actor's own advantage/disadvantage)\n    noAdvantageFlags: [\n      \"noAdvantage.all\",\n      \"noAdvantage.tool.all\",\n      `noAdvantage.tool.${toolId}`\n    ],\n    noDisadvantageFlags: [\n      \"noDisadvantage.all\",\n      \"noDisadvantage.tool.all\",\n      `noDisadvantage.tool.${toolId}`\n    ],\n    systemRollModeFields: [], // dnd5e doesn't have native tool roll modes\n    // Source grants flags for tools (checked on workflow.actor, e.g., caster)\n    sourceAdvantageFlags: [\"grants.advantage.all\", \"grants.advantage.tool.all\", `grants.advantage.tool.${toolId}`],\n    sourceDisadvantageFlags: [\"grants.disadvantage.all\", \"grants.disadvantage.tool.all\", `grants.disadvantage.tool.${toolId}`],\n    sourceNoAdvantageFlags: [\"grants.noAdvantage.all\", \"grants.noAdvantage.tool.all\", `grants.noAdvantage.tool.${toolId}`],\n    sourceNoDisadvantageFlags: [\"grants.noDisadvantage.all\", \"grants.noDisadvantage.tool.all\", `grants.noDisadvantage.tool.${toolId}`]\n  };\n\n  // If the tool has an associated ability, also check ability check flags\n  if (abilityId) {\n    // New flag names (preferred)\n    toolFlags.advantageFlags.push(\"advantage.ability.all\", \"advantage.check.all\", `advantage.check.${abilityId}`);\n    toolFlags.disadvantageFlags.push(\"disadvantage.ability.all\", \"disadvantage.check.all\", `disadvantage.check.${abilityId}`);\n    // Add noAdvantage/noDisadvantage for ability-based check\n    toolFlags.noAdvantageFlags?.push(`noAdvantage.check.all`, `noAdvantage.check.${abilityId}`);\n    toolFlags.noDisadvantageFlags?.push(`noDisadvantage.check.all`, `noDisadvantage.check.${abilityId}`);\n  }\n\n  // For tools, source actor is the caster (workflow.actor) if any\n  // Create RollModifierTracker if not provided\n  tracker ??= new RollModifierTracker();\n  await computeAdvantageFlags(actor, toolFlags, {\n    ...options,\n    grantsActor: options.workflow?.actor\n  }, tracker);\n  return tracker;\n}\n\n// Throttle timer for anchored template movement (mirrors dnd5e's private #moveTime)\nlet anchoredMoveTime = 0;\n// Throttle timer for range-clamped template movement\nlet rangeClampesMoveTime = 0;\n\n/**\n * Snap a point for template placement based on the templateSnapping setting.\n * \"full\" snaps to grid intersections (vertices) only, \"half\" adds centers and side midpoints.\n */\nfunction snapTemplatePosition(point: { x: number; y: number }): { x: number; y: number } {\n  if (!canvas?.grid) return point;\n  const M = CONST.GRID_SNAPPING_MODES;\n  const mode = configSettings.templateSnapping === \"half\"\n    ? M.CENTER | M.VERTEX | M.CORNER | M.SIDE_MIDPOINT\n    : M.VERTEX;\n  return canvas.grid.getSnappedPoint({ x: point.x, y: point.y }, { mode, resolution: 1 });\n}\n\n/**\n * Get the maximum range for a template from its midi-qol flags.\n * Returns undefined if range should not be enforced.\n * The maxRange is pre-calculated and set in the dnd5e.preCreateActivityTemplate hook.\n */\nfunction getTemplateMaxRange(templateDoc: MeasuredTemplateDocument.Implementation): number | undefined {\n  const midiFlags = templateDoc.flags?.[MODULE_ID] as any;\n  return midiFlags?.maxRange as number | undefined;\n}\n\n/**\n * Clamp a point to be within maxRange distance from the token's perimeter.\n * Measures the raw grid distance from the closest perimeter point to the target\n * using canvas.grid.measurePath (respects the scene's diagonal measurement mode).\n * Returns the clamped point, or the original point if within range.\n */\nfunction clampPointToRange(token: Token.Implementation, targetX: number, targetY: number, maxRange: number): { x: number, y: number, clamped: boolean } {\n  if (!canvas?.grid || !canvas.dimensions) return { x: targetX, y: targetY, clamped: false };\n\n  // Find closest point on token perimeter and measure raw grid distance to target\n  const poly = getTokenPerimeterPolygon(token);\n  const closest = closestPointOnPerimeter(poly, targetX, targetY);\n  const distance = measurePointDistance(closest, { x: targetX, y: targetY });\n  if (distance <= maxRange) {\n    return { x: targetX, y: targetY, clamped: false };\n  }\n\n  // Scale the displacement vector so grid-measured distance equals maxRange\n  const dx = targetX - closest.x;\n  const dy = targetY - closest.y;\n  if (dx === 0 && dy === 0) return { x: targetX, y: targetY, clamped: false };\n\n  const scale = maxRange / distance;\n  return {\n    x: closest.x + dx * scale,\n    y: closest.y + dy * scale,\n    clamped: true\n  };\n}\n\n/**\n * Calculate the point on a token's border where a ray from center to target intersects.\n * @param token - The token to find the border point on\n * @param targetX - Target X coordinate (e.g., mouse position)\n * @param targetY - Target Y coordinate\n * @returns {x, y} coordinates on the token's border\n */\nfunction getTokenBorderPoint(token: Token.Implementation, targetX: number, targetY: number): { x: number, y: number } {\n  const centerX = token.center.x;\n  const centerY = token.center.y;\n\n  const poly = getTokenPerimeterPolygon(token);\n  const pts = poly.points;\n  const numPts = pts.length;\n\n  // If target is at center, return the rightmost point on the polygon\n  if (targetX === centerX && targetY === centerY) {\n    let bestX = -Infinity;\n    let bestY = centerY;\n    for (let i = 0; i < numPts; i += 2) {\n      if (pts[i] > bestX) {\n        bestX = pts[i];\n        bestY = pts[i + 1];\n      }\n    }\n    return { x: bestX, y: bestY };\n  }\n\n  // Cast ray from center toward target and find first polygon edge intersection\n  const a = { x: centerX, y: centerY };\n  const b = { x: targetX, y: targetY };\n\n  let tMin = Infinity;\n  let result = { x: centerX, y: centerY };\n\n  for (let i = 0; i < numPts; i += 2) {\n    const ni = (i + 2) % numPts;\n    const c = { x: pts[i], y: pts[i + 1] };\n    const d = { x: pts[ni], y: pts[ni + 1] };\n\n    const intersection = foundry.utils.lineLineIntersection(a, b, c, d, { t1: true });\n    if (!intersection) continue;\n\n    // t0 > 0: forward along ray from center toward target\n    // 0 <= t1 <= 1: intersection is on this polygon edge segment\n    const t1 = intersection.t1 ?? 0;\n    if (intersection.t0 > 0 && t1 >= 0 && t1 <= 1 && intersection.t0 < tMin) {\n      tMin = intersection.t0;\n      result = { x: intersection.x, y: intersection.y };\n    }\n  }\n\n  return result;\n}\n\n/**\n * Get the caster's token from a template's midi-qol flags.\n * The sourceTokenUuid is pre-set in the dnd5e.preCreateActivityTemplate hook.\n * @returns The token, or undefined if not found\n */\nexport function getTemplateSourceToken(templateDoc: MeasuredTemplateDocument.Implementation): Token.Implementation | undefined {\n  const midiFlags = templateDoc.flags?.[MODULE_ID] as any;\n  const sourceTokenUuid = midiFlags?.sourceTokenUuid as string | undefined;\n  if (!sourceTokenUuid) return undefined;\n\n  const tokenDoc = fromUuidSync(sourceTokenUuid) as TokenDocument.Implementation | null;\n  return tokenDoc?.object ?? undefined;\n}\n\n/**\n * Wrapper for AbilityTemplate._onMovePlacement to:\n * 1. Anchor cone/ray templates to the caster's token when anchorToToken flag is set\n * 2. Clamp template placement to activity range when checkRange is enabled\n * 3. Apply midi template snapping setting for all template placements\n */\nfunction midiATOnMovePlacement(this: foundry.canvas.placeables.MeasuredTemplate.Implementation, wrapped, event: PIXI.FederatedPointerEvent) {\n  // Check if this template should be anchored to a token (cones/rays from token border)\n  const anchorToToken = this.document.flags?.[MODULE_ID]?.anchorToToken;\n\n  if (anchorToToken) {\n    // Handle anchored template movement (cones/rays from token border)\n    return handleAnchoredTemplateMovement.call(this, event);\n  }\n\n  // For range-clamped templates, we must handle placement ourselves\n  const maxRange = getTemplateMaxRange(this.document);\n  const sourceToken = getTemplateSourceToken(this.document);\n  if (maxRange && sourceToken) {\n    // Apply throttling like the original method (20ms)\n    event.stopPropagation();\n    const now = Date.now();\n    if (now - rangeClampesMoveTime <= 20) return;\n\n    // Get mouse position in canvas coordinates\n    const mouse = event.data?.getLocalPosition(this.layer) ?? (event as any).getLocalPosition(this.layer);\n\n    // Clamp position to be within range\n    const position = clampPointToRange(sourceToken, mouse.x, mouse.y, maxRange);\n\n    // Snap to grid based on templateSnapping setting\n    const snapped = snapTemplatePosition(position);\n    const updates: { x: number; y: number; distance?: number } = { x: snapped.x, y: snapped.y };\n\n    // Handle adjusted size for radius templates (same as dnd5e)\n    const dnd5eFlags = this.document.flags.dnd5e as any;\n    const baseDistance = dnd5eFlags?.dimensions?.size;\n    if (dnd5eFlags?.dimensions?.adjustedSize && baseDistance && canvas?.tokens) {\n      const rectangle = new PIXI.Rectangle(position.x, position.y, 1, 1);\n      const hoveredToken = canvas.tokens.quadtree?.getObjects(rectangle, {\n        collisionTest: ({ t }: any) => t.visible && !t.document.isSecret\n      }).first();\n      if (hoveredToken) {\n        const size = Math.max(hoveredToken.document.width, hoveredToken.document.height);\n        updates.distance = baseDistance + (size * (canvas.grid?.distance ?? 5) / 2);\n      } else {\n        updates.distance = baseDistance;\n      }\n    }\n\n    this.document.updateSource(updates);\n    this.refresh();\n    rangeClampesMoveTime = now;\n    return;\n  }\n\n  // No range restriction - let the wrapper chain run (dnd5e + other modules),\n  // then re-snap the position using our templateSnapping setting\n  wrapped(event);\n  const snapped = snapTemplatePosition({ x: this.document.x, y: this.document.y });\n  if (snapped.x !== this.document.x || snapped.y !== this.document.y) {\n    this.document.updateSource({ x: snapped.x, y: snapped.y });\n    this.refresh();\n  }\n}\n\n/**\n * Handle movement for anchored templates (cones/rays originating from token border).\n */\nfunction handleAnchoredTemplateMovement(this: foundry.canvas.placeables.MeasuredTemplate.Implementation, event: PIXI.FederatedPointerEvent) {\n  const sourceToken = getTemplateSourceToken(this.document);\n  if (!sourceToken) return;\n\n  event.stopPropagation();\n\n  // Apply throttling like the original method (20ms)\n  const now = Date.now();\n  if (now - anchoredMoveTime <= 20) return;\n\n  // Get mouse position in canvas coordinates\n  const mouse = event.data?.getLocalPosition(this.layer) ?? (event as any).getLocalPosition(this.layer);\n\n  // Calculate the point on the token border closest to the mouse direction\n  const borderPoint = getTokenBorderPoint(sourceToken, mouse.x, mouse.y);\n\n  // Calculate direction from border point to mouse (in degrees)\n  const dx = mouse.x - borderPoint.x;\n  const dy = mouse.y - borderPoint.y;\n  const direction = Math.toDegrees(Math.atan2(dy, dx));\n\n  // Snap to grid based on templateSnapping setting\n  const snapped = snapTemplatePosition(borderPoint);\n\n  // Update source and refresh like dnd5e does\n  this.document.updateSource({\n    x: snapped.x,\n    y: snapped.y,\n    direction\n  });\n  this.refresh();\n\n  anchoredMoveTime = now;\n}\n\nexport function _prepareDerivedData(this: Actor.Implementation, wrapped, ...args) {\n  wrapped(...args);\n  try {\n    // @ts-expect-error no dnd5e-types\n    if (!this.system.abilities?.dex) return;\n    if (![false, undefined, \"none\"].includes(checkRule(\"challengeModeArmor\") as boolean | undefined | string)) {\n      // @ts-expect-error no dnd5e-types\n      const armorDetails = this.system.attributes.ac ?? {};\n      const ac = armorDetails?.value ?? 10;\n      const equippedArmor = armorDetails.equippedArmor;\n      let armorAC = equippedArmor?.system.armor.value ?? 10;\n      const equippedShield = armorDetails.equippedShield;\n      const shieldAC = equippedShield?.system.armor.value ?? 0;\n\n      if (checkRule(\"challengeModeArmor\") !== \"challenge\") {\n        switch (armorDetails.calc) {\n          // @ts-expect-error no dnd5e-types\n          case 'flat': armorAC = (ac.flat ?? 10) - this.system.abilities.dex.mod; break;\n          case 'draconic': armorAC = 13; break;\n          // @ts-expect-error no dnd5e-types\n          case 'natural': armorAC = (armorDetails.value ?? 10) - this.system.abilities.dex.mod; break;\n          case 'custom': armorAC = equippedArmor?.system.armor.value ?? 10; break;\n          case 'mage': armorAC = 13; break; // perhaps this should be 10 if mage armor is magic bonus\n          case 'unarmoredMonk': armorAC = 10; break;\n          case 'unarmoredBarb': armorAC = 10; break;\n          default: armorAC = armorDetails.equippedArmor?.system.armor.value ?? 10; break;\n        };\n        const armorReduction = armorAC - 10 + shieldAC;\n        const ec = ac - armorReduction;\n        // @ts-expect-error no dnd5e-types\n        this.system.attributes.ac.EC = ec;\n        // @ts-expect-error no dnd5e-types\n        this.system.attributes.ac.AR = armorReduction;\n      } else {\n        // @ts-expect-error no dnd5e-types\n        if (!this.system.abilities) {\n          error(\"challenge mode armor failed to find abilities\");\n          error(this);\n          return;\n        }\n        // @ts-expect-error no dnd5e-types\n        let dexMod = this.system.abilities.dex.mod;\n        if (equippedArmor?.system.armor.type === \"heavy\") dexMod = 0;\n        if (equippedArmor?.system.armor.type === \"medium\") dexMod = Math.min(dexMod, 2);\n        // @ts-expect-error no dnd5e-types\n        this.system.attributes.ac.EC = 10 + dexMod + shieldAC;\n        // @ts-expect-error no dnd5e-types\n        this.system.attributes.ac.AR = ac - 10 - dexMod;\n      }\n    }\n  } catch (err) {\n    const message = \"midi-qol failed to prepare derived data\";\n    error(message, err);\n    TroubleShooter.recordError(err, message);\n  }\n}\n\nfunction _prepareItem(wrapped, item, ctx) {\n  wrapped(item, ctx);\n  // Filter from ctx.activities to preserve dnd5e's visibility filtering (including level limits)\n  // Fixes issue #1548: Activity Visibility \"Level Limit\" ignored when midi-qol is enabled\n  if (ctx.activities) {\n    ctx.activities = ctx.activities.filter((a: Activity) => !a.midiProperties?.automationOnly);\n  }\n}\n\nfunction getAttackModifiers(roll: Roll /* D20Roll */): string[] {\n  //@ts-expect-error\n  const modifiers: string[] = roll.d20.modifiers ?? [];\n  const actor: Actor = fromUuidSync(roll.data?.actorUuid as string) as Actor;\n  if (!actor) return modifiers;\n  //@ts-expect-error\n  const itemType = roll.data?.item?.itemType;\n  //@ts-expect-error\n  const type = roll.data?.activity?.attack?.type\n  if (!itemType || !type) return modifiers;\n  const actionType = `${type?.value === \"ranged\" ? \"r\" : \"m\"}${type?.classification === \"spell\" ? \"sak\" : \"wak\"}`;\n  const changes: any[] = [];\n  for (let effect of actor.allApplicableEffects()) {\n    if (effect.disabled || effect.isSuppressed) continue;\n    for (let change of effect.changes) {\n      if (change.key.startsWith(\"flags.midi-qol.rollModifiers.attack.\")) changes.push(change);\n    }\n  }\n  changes.sort((a, b) => a.priority - b.priority);\n  for (let change of changes) {\n    const [_, __, ___, ____, actionOrItem] = change.key.split(\".\");\n    if (actionOrItem === \"all\" || actionOrItem === actionType || actionOrItem === itemType) {\n      modifiers.push(change.value);\n    }\n  }\n  return modifiers;\n}\n\nfunction _configureModifiers(this: Roll /*D20Roll*/, wrapped) {\n  wrapped();\n  // @ts-expect-error no dnd5e-types\n  if (this.data?.activity?.type !== \"attack\") return;\n  // @ts-expect-error no dnd5e-types\n  this.d20.modifiers = getAttackModifiers(this);\n}\n\nexport function actorPrepareData(this: Actor.Implementation, wrapped) {\n  try {\n    foundry.utils.setProperty(this, \"flags.midi-qol.onUseMacroName\", this._source.flags?.[MODULE_ID]?.onUseMacroName);\n    if (debugEnabled > 0) for (let effect of this.appliedEffects) {\n      for (let change of effect.changes) {\n        if (change.key === \"flags.midi-qol.onUseMacroName\") {\n          if (change.mode !== CONST.ACTIVE_EFFECT_MODES.CUSTOM) {\n            error(\"onUseMacro effect mode is not custom\", `Actor ${this.name} Effect: ${effect.name} ${this.uuid}`);\n            TroubleShooter.recordError(new Error(\"onUseMacro effect mode is not custom\"), `Actor ${this.name} Effect: ${effect.name} ${this.uuid} `);\n            change.mode = CONST.ACTIVE_EFFECT_MODES.CUSTOM;\n          }\n        }\n      }\n    }\n    processTraits(this);\n    wrapped();\n    prepareOnUseMacroData(this);\n  } catch (err) {\n    const message = `actor prepare data ${this?.name}`;\n    TroubleShooter.recordError(err, message);\n  }\n}\n\nexport function itemPrepareData(this: Item.Implementation, wrapped) {\n  foundry.utils.setProperty(this, \"flags.midi-qol.onUseMacroName\", this._source.flags?.[MODULE_ID]?.onUseMacroName);\n  // Migrate PascalCase friendlySave values to camelCase\n  // @ts-expect-error\n  const activities = this.system?.activities;\n  if (activities) {\n    for (const activity of Object.values(activities) as any[]) {\n      if (activity.friendlySave === \"FriendlyFail\") activity.friendlySave = \"friendlyFail\";\n      else if (activity.friendlySave === \"FriendlySuccess\") activity.friendlySave = \"friendlySuccess\";\n    }\n  }\n  if (debugEnabled > 0) for (let effect of this.effects) {\n    for (let change of effect.changes) {\n      if (change.key === \"flags.midi-qol.onUseMacroName\") {\n        if (change.mode !== CONST.ACTIVE_EFFECT_MODES.CUSTOM) {\n          error(\"onUseMacro effect mode is not custom\", `Actor: ${this.parent?.name} Item: ${this.name} Effect: ${effect.name} ${this.uuid} `);\n          TroubleShooter.recordError(new Error(\"onUseMacro effect mode is not custom - mode treated as custom\"), `Actor: ${this.parent?.name} Item: ${this.name} Effect: ${effect.name} ${this.uuid} `);\n          change.mode = CONST.ACTIVE_EFFECT_MODES.CUSTOM;\n        }\n      }\n    }\n  }\n  wrapped();\n  prepareOnUseMacroData(this);\n}\n\nexport function prepareOnUseMacroData(actorOrItem: Actor.Implementation | Item.Implementation) {\n  try {\n    const macros = actorOrItem.flags?.[MODULE_ID]?.onUseMacroName;\n    foundry.utils.setProperty(actorOrItem, \"flags.midi-qol.onUseMacroParts\", new OnUseMacros(macros ?? null));\n  } catch (err) {\n    const message = `midi-qol | failed to prepare onUse macro data ${actorOrItem?.name}`;\n    console.warn(message, err);\n    TroubleShooter.recordError(err, message);\n  }\n}\n\nexport function preUpdateItemActorOnUseMacro(\n  itemOrActor: Actor.Implementation | Item.Implementation,\n  changes: Actor.UpdateData | Item.UpdateData,\n  options: Actor.Database.PreUpdateOperation | Item.Database.PreUpdateOptions,\n  userId: string\n) {\n  try {\n    const macroChanges = changes.flags?.[MODULE_ID]?.onUseMacroParts;\n    if (!macroChanges || foundry.utils.isEmpty(macroChanges)) return true;\n    const macros = itemOrActor._source.flags?.[MODULE_ID]?.onUseMacroName;\n    const macroParts = new OnUseMacros(macros ?? null);\n\n    if (!Array.isArray(macroChanges.items)) { // we have an update from editing the macro changes\n      for (let keyString in macroChanges.items as Record<string, OnUseMacro>) {\n        let key = Number(keyString);\n        if (Number.isNaN(key)) continue; // just in case\n        if (!macroParts.items[key]) {\n          macroParts.items.push(OnUseMacro.parsePart({\n            macroName: (macroChanges.items as Record<string, OnUseMacro>)[key]?.macroName ?? \"\",\n            option: (macroChanges.items as Record<string, OnUseMacro>)[key]?.option ?? \"\"\n          }));\n          key = macroParts.items.length - 1;\n        }\n        if ((macroChanges.items as Record<string, OnUseMacro>)[keyString].macroName) macroParts.items[key].macroName = (macroChanges.items as Record<string, OnUseMacro>)[keyString].macroName;\n        if ((macroChanges.items as Record<string, OnUseMacro>)[keyString].option) macroParts.items[key].option = (macroChanges.items as Record<string, OnUseMacro>)[keyString].option;\n      }\n    }\n    let macroString = OnUseMacros.parseParts(macroParts).items.map(oum => oum.toString()).join(\",\");\n    if (changes.flags?.[MODULE_ID]?.onUseMacroName) changes.flags[MODULE_ID].onUseMacroName = macroString;\n    delete changes.flags?.[MODULE_ID]?.onUseMacroParts;\n  } catch (err) {\n    delete changes.flags?.[MODULE_ID]?.onUseMacroParts;\n    const message = `midi-qol | failed in preUpdateItemActor onUse Macro for ${itemOrActor?.name} ${itemOrActor?.uuid}`\n    console.warn(message, err);\n    TroubleShooter.recordError(err, message);\n  }\n  return true;\n};\n\nexport function getItemEffectsToDelete(args: { actor: Actor.Implementation, origin: string, ignore: string[], ignoreTransfer: boolean, options: any }): string[] {\n  warn(\"getItemEffectsToDelete: started\", globalThis.DAE?.actionQueue);\n  let effectsToDelete: string[] | undefined;\n  let { actor, origin, ignore, ignoreTransfer, options } = args;\n  try {\n    if (!actor) {\n      return [];\n    }\n    const actorEffects: ActiveEffect[] | undefined = actor?.appliedEffects;\n    effectsToDelete = actorEffects?.filter(ef => {\n      if (installedModules.get(\"times-up\")) {\n        if (globalThis.TimesUp.isEffectExpired(ef, { combat: game.combat })) return false;\n      }\n      return ef.origin === origin\n        && !ignore.includes(ef.uuid)\n        && (!ignoreTransfer || ef.flags?.dae?.transfer !== true)\n    }).map(ef => ef.id!);\n    warn(\"getItemEffectsToDelete: effectsToDelete \", actor.name, effectsToDelete, options);\n    return effectsToDelete;\n  } catch (err) {\n    const message = `getItemEffectsToDelete item effects failed for ${actor.name} ${origin} ${effectsToDelete}`;\n    console.warn(message, err);\n    TroubleShooter.recordError(err, message);\n    return [];\n  }\n}\n\nexport async function zeroHPExpiry(actor: Actor.Implementation, update: Actor.UpdateData, options: Actor.Database.UpdateOptions, user: string) {\n  const hpUpdate = foundry.utils.getProperty(update, \"system.attributes.hp.value\");\n  if (hpUpdate !== 0) return;\n  const expiredEffects: ActiveEffect[] = [];\n  for (let effect of actor.appliedEffects) {\n    if (effect.flags?.dae?.specialDuration?.includes(\"zeroHP\")) expiredEffects.push(effect)\n  }\n  if (expiredEffects.length > 0) await expireEffects(actor, expiredEffects, { \"expiry-reason\": \"midi-qol:zeroHP\" })\n}\n\n/**\n * Legacy wrapper for processWoundedStatus.\n * Called from Hooks.ts updateItem handler for vitality changes.\n * @deprecated Use processWoundedStatus directly for new code.\n */\nexport async function checkWounded(actor: Actor.Implementation, _update: Actor.UpdateData, _options: Actor.Database.UpdateOptions, _user: string, _vitalityValue?: number) {\n  // Use the per-actor semaphore to serialize with actorOnUpdate\n  const semaphore = getActorWoundedSemaphore(actor.uuid);\n  await semaphore.add(async () => {\n    await processWoundedStatus(actor);\n  });\n}\n\nasync function setDeadStatus(actor: Actor.Implementation, options: { effect: CONFIG.StatusEffect | ActiveEffect.Implementation; useDefeated: boolean; makeDead: boolean; overlay?: boolean; }) {\n  let { effect, useDefeated, makeDead } = options;\n  if (!effect?.id) return;\n\n  if (makeDead) {\n    // Remove unconscious effect before adding dead (if present)\n    // Check for actual effect, not just status (which could come from a rider)\n    const unconsciousEffect = actor.effects.find(e => e.statuses.has(\"unconscious\"));\n    if (unconsciousEffect) {\n      await actor.toggleStatusEffect(\"unconscious\", { active: false });\n    }\n  }\n\n  // toggleStatusEffect handles both cases gracefully:\n  // - active: true when already exists → returns true, no error\n  // - active: false when doesn't exist → returns undefined, no error\n  const result = await actor.toggleStatusEffect(effect.id, { overlay: (configSettings.addDead === \"overlay\") || options.overlay, active: makeDead });\n\n  // Only update defeated status if the toggle actually changed something\n  if (useDefeated && result !== undefined) {\n    const combatants = game.combat?.getCombatantsByActor(actor) ?? [];\n    for (let combatant of combatants) await combatant.update({ defeated: makeDead }, {});\n  }\n}\n\nfunction createConcentrationEffectData(this: ActiveEffect.Implementation, wrapped, activity: Activity, data: any = {}) {\n  const effectData: ActiveEffect.CreateData = wrapped(activity, data);\n  if (!effectData.flags?.dnd5e?.itemUuid) {\n    foundry.utils.setProperty(effectData, \"flags.dnd5e.itemUuid\", activity.uuid);\n  }\n  return effectData;\n}\n\nexport async function challengeConcentration(this: Actor.Implementation, wrapped, { dc = 10, ability = null } = {}) {\n  // Set.delete() returns true if the uuid was in the set (check + remove in one operation)\n  if (skipConcentrationActorUuids.delete(this.uuid)) {\n    return;\n  }\n  if ([\"chatOnly\"].includes(configSettings.doConcentrationCheck))\n    return wrapped({ dc, ability });\n  // @ts-expect-error no dnd5e-types\n  const isConcentrating = this.concentration.effects.size > 0;\n  if (!isConcentrating) return null;\n  // @ts-expect-error no dnd5e-types\n  if (configSettings.concentrationIncapacitatedConditionCheck && (hasCondition(this, \"incapacitated\") || this.system.attributes.hp.value <= 0)) return;\n  if ([\"chat\"].includes(configSettings.doConcentrationCheck)) {\n    const dataset = {\n      action: \"concentration\",\n      dc,\n    };\n    //@ts-expect-error no dnd5e-types\n    if (ability && ability in game.system?.config.abilities) dataset.ability = ability;\n    const config = {\n      type: \"concentration\",\n      format: \"short\",\n      icon: true\n    }\n    //@ts-expect-error no dnd5e-types\n    const enrichers = game.system?.enrichers;\n    return ChatMessage.implementation.create({\n      content: `<div class=\"dnd5e chat-card request-card\" data-action=\"concentration\" data-dc=\"${dc}\" data-type=\"midi-concentration\">\n      <div><span class=\"visible-dc\">${enrichers.createRollLabel({ ...dataset, ...config })} ${i18n(\"DND5E.Roll\")}</span></div>\n      <div><span class=\"hidden-dc\">${enrichers.createRollLabel({ ...dataset, ...config, hideDC: true })} ${i18n(\"DND5E.Roll\")}</span></div>\n      </div>`,\n      whisper: game.users?.filter(user => this.testUserPermission(user, \"OWNER\")).map(user => user.id),\n      speaker: ChatMessage.implementation.getSpeaker({ actor: this })\n    });\n  }\n  // item rolls are picked up when the damage is updated in dnd5e.damageActor\n  return;\n}\n\nexport async function checkDeleteTemplate(templateDocument: MeasuredTemplateDocument, options: any, user: string) {\n  if (user !== game.user?.id) return;\n  if (options.undo) return;\n\n  // Cascade delete dependents of this template via MidiDependentsRegistry (only active GM should do this)\n  if (preferredActiveGM()?.isSelf) {\n    await MidiDependentsRegistry.deleteDependents(templateDocument.uuid);\n  }\n\n  // Check if this template was dependent on a concentration effect - if so, clean up the effect if no more dependents\n  if (options.noConcentrationCheck || configSettings.removeConcentrationEffects === \"none\") return;\n\n  const dependentOn = templateDocument.getFlag(\"dnd5e\", \"dependentOn\");\n  if (!dependentOn) return;\n\n  const parentEffect = fromUuidSync(dependentOn);\n  if (parentEffect instanceof ActiveEffect) {\n    // @ts-expect-error no dnd5e-types\n    if (parentEffect.getDependents()?.length === 0) {\n      await parentEffect.delete();\n    }\n  }\n};\n\nexport async function rollToolCheck(this: Actor.Implementation, wrapped, config: RollProcessConfig & { ability?: string, tool?: string } = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n  let result: Roll[] | undefined;\n  let preRollHookId: number | undefined;\n  let postRollHookId: number | undefined;\n  try {\n    config.midiOptions ??= {};\n    message.data ??= {};\n    let toolId = config.tool;\n    const rollTools: string[] = config.midiOptions?.rollTools ?? (toolId ? [toolId] : []);\n    if (rollTools.length === 0)\n      throw new Error(`rollToolCheck called with no tools to roll for ${this.name}`);\n    const chatMessage = message.create;\n    message.create = false;\n\n    // Set originatingMessage so dnd5e's MessageRegistry and getOriginatingMessage() work correctly\n    const originatingCardId = config.midiOptions?.workflow?.itemCardId\n      ?? (config.midiOptions?.itemCardUuid ? fromUuidSync(config.midiOptions.itemCardUuid)?.id : undefined);\n    if (originatingCardId) foundry.utils.setProperty(message, \"data.flags.dnd5e.originatingMessage\", originatingCardId);\n\n    if (dialog.configure === undefined && isAutoFastForward(\"tool\")) dialog.configure = false;\n\n    // Check if advantage was pre-computed by an external module (Monks Token Bar, Flash Rolls, Epic Rolls)\n    const sourceInfo = getAdvantageSourceInfo(config);\n    const isExternalModuleRoll = sourceInfo.isExternalModule;\n\n    let hasPreComputedAdvantage = false;\n    if (!config.midiOptions.recomputeAdvantage) {\n      hasPreComputedAdvantage = applyPreComputedAdvantage(config);\n      if (hasPreComputedAdvantage && isAutoFastForward(\"tool\")) {\n        config.midiOptions.fastForward = true;\n      }\n    }\n    // Only compute advantage from flags if not from external module and not pre-computed\n    if (!hasPreComputedAdvantage && !isExternalModuleRoll) {\n      if (!config.midiOptions.workflow && config.midiOptions.workflowId) {\n        config.midiOptions.workflow = Workflow.getWorkflow(config.midiOptions.workflowId);\n      }\n      const toolRollModifierTracker = await computeToolAdvantage(this, config.tool ?? \"\", config.ability ?? \"\", config.midiOptions);\n      config.advantage = toolRollModifierTracker.hasAdvantage;\n      config.disadvantage = toolRollModifierTracker.hasDisadvantage;\n    }\n\n    let toolModifiers: RollModifierResult | undefined;\n    const midiOptions = config.midiOptions;\n    let success: boolean | undefined = undefined;\n\n    // Check if advantageByChoice was passed in (from Workflow via GMAction with deserialized trackers)\n    const passedToolAdvantageMap = config.midiOptions?.advantageByChoice as Record<string, PreComputedAdvantage> | undefined;\n    const hasPassedToolAdvantage = passedToolAdvantageMap && Object.keys(passedToolAdvantageMap).length > 0 &&\n      Object.values(passedToolAdvantageMap).some(v => v.tracker instanceof RollModifierTracker);\n\n    // Skip building advantage map for external module rolls - they already computed advantage\n    const preComputedToolAdvantageMap: Record<string, PreComputedAdvantage> = isExternalModuleRoll\n      ? {} // External modules handle their own advantage - don't recompute\n      : hasPassedToolAdvantage && passedToolAdvantageMap\n        ? passedToolAdvantageMap\n        : await buildPreComputedAdvantageMap(this, \"tool\", rollTools, config.midiOptions ?? {});\n\n    // Setup dialog with MidiRollChoiceDialog helper\n    let userExplicitChoice: string | undefined;\n    const { hasMultiple: hasMultipleTools } = setupChoiceDialog(\n      this, config, dialog, \"tool\", rollTools,\n      preComputedToolAdvantageMap, hasPreComputedAdvantage, \"tool\",\n      (choice) => { userExplicitChoice = choice; }\n    );\n\n    preRollHookId = Hooks.once(\"dnd5e.preRollTool\", (configData, dialogData, messageData) => {\n      configData.midiOptions = { ...(configData.midiOptions ?? {}), ...(midiOptions ?? {}) };\n\n      const toolAdvantageValues = Object.values(preComputedToolAdvantageMap);\n      const allAutoFail = toolAdvantageValues.length > 0 && toolAdvantageValues.every(d => d.tracker instanceof RollModifierTracker && d.tracker.modifiers.willFail);\n      if (hasMultipleTools && !allAutoFail && dialogData.configure !== false) {\n        dialogData.configure = true;\n      } else {\n        const chosenTool = configData.tool ?? toolId;\n        const chosenAdvantage = preComputedToolAdvantageMap[chosenTool!];\n        if (chosenAdvantage) {\n          if (!hasPreComputedAdvantage) {\n            configData.advantage = chosenAdvantage.hasAdvantage;\n            configData.disadvantage = chosenAdvantage.hasDisadvantage;\n          }\n          if (chosenAdvantage.tracker instanceof RollModifierTracker) {\n            toolModifiers = applyRollModifiers(chosenAdvantage.tracker, configData, dialogData);\n          }\n        }\n      }\n      setRollDialogOptions(configData, dialogData, \"tool\");\n      message = messageData;\n    });\n\n    postRollHookId = Hooks.once(\"dnd5e.postToolRollConfiguration\", (rolls, configData, dialogData, messageDetails) => {\n      // record message configuration details for later display\n      message = messageDetails;\n\n      // Detect tool change from choice dialog and check auto-fail/auto-success\n      if (configData.tool && configData.tool !== toolId) {\n        toolId = configData.tool;\n      }\n      const chosenToolData = preComputedToolAdvantageMap[toolId ?? \"\"];\n      const chosenToolTracker = chosenToolData?.tracker instanceof RollModifierTracker ? chosenToolData.tracker : undefined;\n      if (chosenToolTracker?.modifiers.willFail) success = false;\n      else if (chosenToolTracker?.modifiers.willSucceed) success = true;\n\n      // Apply blind roll mode based on chosen tool (uses check settings since tools are ability checks)\n      messageDetails.rollMode = applyBlindRollMode(configSettings.rollChecksBlind, toolId, messageDetails.rollMode);\n\n      return true;\n    });\n\n    if (this.token) foundry.utils.setProperty(dialog, \"options.window.subtitle\", this.token.name);\n    result = await wrapped(config, dialog, message);\n    let rollMode = message.rollMode ?? safeGetGameSetting(\"core\", \"rollMode\");\n    if (result) {\n      await displayDSNForRoll(result, \"toolCheck\", rollMode);\n      DSNMarkDiceDisplayed(result);\n      result![0] = await bonusCheck(this, result![0], \"check\", config.ability ?? \"\", message.data);\n      DSNMarkDiceDisplayed(result);\n    }\n    if (!result) return result;\n    // Stamp the chosen tool on the rolls (after bonusCheck) so the save display can show which tool was used\n    // userExplicitChoice is set by buildConfig wrapper when user changes dropdown; config.tool is the auto-selected best\n    const _chosenTool = userExplicitChoice ?? config.tool;\n    //@ts-expect-error midiChosenId is a custom roll option\n    if (hasMultipleTools) result.forEach(r => { if (r?.options) r.options.midiChosenId = _chosenTool; });\n\n    // Set originatingMessage on roll options so modules can access it without .parent\n    const rollOriginatingId = foundry.utils.getProperty(message, \"data.flags.dnd5e.originatingMessage\") as string | undefined\n      ?? originatingCardId;\n    //@ts-expect-error originatingMessage is a custom roll option\n    if (rollOriginatingId) result.forEach(r => { if (r?.options) r.options.originatingMessage = rollOriginatingId; });\n\n    if (chatMessage !== false && result) {\n      if (foundry.utils.getProperty(result, \"flags.midi-qol.chatMessageShown\") !== true) {\n        const messageData: any = foundry.utils.mergeObject({ sound: CONFIG.sounds.dice }, message.data ?? {});\n        messageData.rolls = result;\n        const chatMsg = await ChatMessage.create(messageData, { rollMode });\n        // dnd5e sets roll.parent in buildPost; replicate here since we bypass buildPost\n        if (chatMsg) result.forEach(r => (r as any).parent = chatMsg);\n      }\n    }\n    return result;\n  } catch (err) {\n    const message = \"midi-qol | error in rollToolCheck\";\n    TroubleShooter.recordError(err, message);\n    throw err;\n  } finally {\n    if (preRollHookId) Hooks.off(\"dnd5e.preRollTool\", preRollHookId);\n    if (postRollHookId) Hooks.off(\"dnd5e.postToolRollConfiguration\", postRollHookId);\n  }\n}\n\n// This is done as a wrapper so that there is no race condition when hp reaches 0 also trying to remove condition\n// This version will always fire first, remove concentration if needed and complete before the hp update is processed.\nasync function _preCreateActiveEffect(this: ActiveEffect.Implementation, wrapped, data: ActiveEffect.CreateData, options: ActiveEffect.Database.PreCreateOptions, user: User.Implementation): Promise<void> {\n  try {\n    if (!configSettings.concentrationIncapacitatedConditionCheck) return;\n    const parent: any = this.parent;\n    const checkConcentration = configSettings.removeConcentration || !safeGetGameSetting(\"dnd5e\", \"disableConcentration\");\n    // @ts-expect-error\n    if (!checkConcentration || options.noConcentrationCheck) return;\n    if (!(parent instanceof CONFIG.Actor.documentClass)) return;\n    if (globalThis.MidiQOL.incapacitatedConditions.some(condition => this.statuses.has(condition))) {\n      if (debugEnabled > 0) warn(`on createActiveEffect ${this.name} ${this.id} removing concentration for ${parent.name}`)\n      // @ts-expect-error no dnd5e-types\n      if (parent.system.attributes?.hp?.value > 0) {\n        // @ts-expect-error no dnd5e-types\n        await parent.endConcentration();\n      }\n    }\n  } catch (err) {\n    const message = \"midi-qol | error in preCreateActiveEffect\";\n    error(message, err);\n    TroubleShooter.recordError(err, message);\n  } finally {\n    return wrapped(data, options, user);\n  }\n}\n\nexport async function _preDeleteCombat(this: Combat.Implementation, wrapped, ...args) {\n  try {\n    for (let combatant of this.combatants) {\n      if (combatant.actor) {\n        if (hasUsedReaction(combatant.actor)) await removeReactionUsed(combatant.actor, true);\n        if (hasUsedBonusAction(combatant.actor)) await removeBonusActionUsed(combatant.actor, true);\n        if (hasUsedAction(combatant.actor)) await removeActionUsed(combatant.actor);\n      }\n    }\n  } catch (err) {\n    const message = `midi-qol | error in preDeleteCombat`;\n    console.warn(message, err);\n    TroubleShooter.recordError(err, message);\n  } finally {\n    return wrapped(...args)\n  }\n}\n\nexport async function doItemUse(this: Item.Implementation, wrapped, config: ActivityUseConfiguration & { chooseActivity?: boolean } = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n  if (this.pack) return;\n  const { chooseActivity, ...activityConfig } = config;\n  // @ts-expect-error no dnd5e-types\n  // Filter usable activities: exclude riders, automationOnly, inProgress, and activities that fail visibility checks (canUse)\n  const activities = this.system.activities?.filter(a =>\n    a.canUse !== false &&\n    !this.flags.dnd5e?.riders?.activity?.includes(a.id) &&\n    !a.midiProperties?.automationOnly &&\n    !a.inProgress\n  );\n  const attackActivities = activities?.filter(a => a instanceof MidiAttackActivity);\n  if (attackActivities?.length === 1) { // if there is a single attack activity and no other non-automation activities use it\n    const attackActivity = attackActivities[0];\n    const extraActivities = activities?.filter(a => a !== attackActivity && a !== attackActivity?.otherActivity);\n    if (extraActivities?.length === 0) {\n      return await attackActivity.use(config, dialog, message);\n    }\n  }\n  //@ts-expect-error\n  const areKeysPressed = game.system?.utils.areKeysPressed;\n  const skipPressed = areKeysPressed(config.event, \"skipDialogAdvantage\") || areKeysPressed(config.event, \"skipDialogDisadvantage\") || areKeysPressed(config.event, \"skipDialogNormal\");\n  if (skipPressed) {\n    const attackActivity = attackActivities[0];\n    if (attackActivity) return await attackActivity.use(config, dialog, message);\n    else return await activities?.[0]?.use(config, dialog, message);\n  }\n  if (activities?.length) {\n    // Apply the module prune hook (midi-qol.itemUseActivitySelect) before deciding: create() skips\n    // the dialog for a single survivor and returns null (skip the roll) if modules removed them all.\n    const activity = await MidiActivityChoiceDialog.create(this, { chooseActivity });\n    return await activity?.use(config, dialog, message);\n  }\n  // @ts-expect-error no dnd5e-types\n  if (this.actor) return this.displayCard(message);\n}\n\nexport function processTraits(actor: Actor.Implementation) {\n  try {\n    // @ts-expect-error no dnd5e-types\n    if (!actor.system.traits) return;\n    for (let traitId of [\"di\", \"dr\", \"dv\", \"sdi\", \"sdr\", \"sdv\"]) {\n      // @ts-expect-error no dnd5e-types\n      let trait = actor.system.traits[traitId];\n      if (!trait) continue;\n      if (!trait.value) trait.value = new Set();\n      for (let traitString of trait.value) {\n        switch (traitString) {\n          case \"silver\":\n            trait.bypasses.add(\"sil\");\n            addPhysicalDamages(trait.value);\n            break\n          case \"adamant\":\n            trait.bypasses.add(\"adm\");\n            addPhysicalDamages(trait.value);\n            break\n          case \"physical\":\n            addPhysicalDamages(trait.value);\n            break;\n          case \"nonmagic\":\n            addPhysicalDamages(trait.value);\n            trait.bypasses.add(\"mgc\");\n            break;\n          case \"spell\":\n            // trait.custom = addCustomTrait(trait.custom, i18n(\"midi-qol.spell-damage\"));\n            break\n          // \"power\" type removed in v13\n          case \"magic\":\n            // trait.custom = addCustomTrait(trait.custom, i18n(\"midi-qol.Magical\"));\n            break\n          case \"healing\":\n            // trait.custom = addCustomTrait(trait.custom, systemConfig.healingTypes.healing);\n            break\n          case \"temphp\":\n            // trait.custom = addCustomTrait(trait.custom, systemConfig.healingTypes.temphp);\n            break\n          default:\n            trait.value.add(traitString);\n        }\n      }\n    }\n\n  } catch (err) {\n    const message = `midi-qol | processTraits | error for ${actor?.name}`;\n    console.warn(message, this, err);\n    TroubleShooter.recordError(err, message);\n  } finally {\n  }\n}\nfunction addPhysicalDamages(traitValue: string[] | Set<string>) {\n  let physicalDamageTypes;\n  physicalDamageTypes = Object.keys(GameSystemConfig.damageTypes).filter(dt => GameSystemConfig.damageTypes[dt].isPhysical);\n  for (let dt of physicalDamageTypes) {\n    if (traitValue instanceof Set) traitValue.add(dt);\n    else if (!traitValue.includes(dt)) traitValue.push(dt);\n  }\n}\n\nfunction actorGetRollData(this: Actor.Implementation, wrapped, ...args) {\n  const data = wrapped(...args);\n  data.actorType = this.type;\n  data.name = this.name;\n  data.flags ??= {};\n  data.flags[\"midi-qol\"] = this.flags?.[\"midi-qol\"] ?? {};\n  data.midiFlags = data.flags[\"midi-qol\"];\n  // data.items = this.items;\n  data.cfg ??= {};\n  data.cfg.armorClasses = GameSystemConfig.armorClasses;\n  data.cfg.actorSizes = GameSystemConfig.actorSizes;\n  data.cfg.skills = GameSystemConfig.skills;\n  if (data.traits) {\n    // @ts-expect-error no dnd5e types\n    data.traits.sizeNumeric = GameSystemConfig.actorSizes[this.system.traits?.size]?.numerical ?? 2;\n  }\n  return data;\n}\n\nfunction itemGetRollData(this: Item.Implementation, wrapped, ...args) {\n  const data = wrapped(...args);\n  if (!data) return data;\n  data.item.flags = this.flags ?? {};\n  data.item.flags[\"midi-qol\"] = this.flags?.[\"midi-qol\"] ?? {};\n  data.item.midiFlags = data.item.flags[\"midi-qol\"];\n  data.item.name = this.name;\n  data.item.itemType = this.type;\n  return data;\n}\nfunction _filterItems(wrapped, items, filters) {\n  if (!filters.has(\"reaction\")) return wrapped(items, filters);\n  const revisedFilters = new Set(filters);\n  revisedFilters.delete(\"reaction\");\n  let filteredItems = wrapped(items, revisedFilters);\n  filteredItems = filteredItems.filter(item => {\n    if (item.system.activation?.type?.includes(\"reaction\")) return true;\n    return false\n  });\n  return filteredItems\n};","import { MODULE_ID, i18n } from \"../../midi-qol.js\";\nimport { Workflow } from \"../Workflow.js\";\nimport { getCurrentSourceMacros, OnUseMacro, OnUseMacros } from \"./Item.js\";\nimport ApplicationV2 = foundry.applications.api.ApplicationV2;\nimport { onUseMacroOptions } from \"../settings.js\";\nconst { HandlebarsApplicationMixin } = foundry.applications.api;\n\nexport class ActorOnUseMacrosConfig extends HandlebarsApplicationMixin(ApplicationV2) {\n  document: Actor.Implementation\n  constructor(options: Partial<ApplicationV2.Configuration> & {document: Actor.Implementation}) {\n    super(options);\n    this.document = options.document;\n  }\n\n  // old \"form\" \"active-effect-sheet\" \"sheet\"\n  static override PARTS = {\n    dialog: {\n      id: \"dialog-onuse-config\",\n      classes: [\"dialog\", \"active-effect-sheet\", \"midi-qol\"],\n      template: \"modules/midi-qol/templates/apps/ActorOnUseMacroConfig/actorOnUseMacrosConfig.hbs\"\n    }\n  }\n\n  // TODO: dragDrop? dropSelector .key\n  static override DEFAULT_OPTIONS = {\n    window: {\n      resizable: false,\n      title: \"midi-qol.ActorOnUseMacros\"\n    },\n    position: {\n      height: \"auto\" as \"auto\",\n      width: 550\n    },\n    form: {\n      closeOnSubmit: false,\n      submitOnClose: true\n    },\n    actions: {\n      add: this.#onAddMacro,\n      delete: this.#onDeleteMacro\n    }\n  };\n\n  get isEditable() {\n    if ( this.document.pack ) {\n      const pack = game.packs?.get(this.document.pack);\n      if ( pack?.locked ) return false;\n    }\n    return this.document.testUserPermission(game.user as User, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER);\n  }\n\n  async _prepareContext(options) {\n    let context: any = await super._prepareContext(options);\n    context.onUseMacroName = foundry.utils.getProperty(this.document._source, \"flags.midi-qol.onUseMacroName\");\n    if (context.onUseMacroName !== undefined) context.onUseMacroParts = new OnUseMacros(context.onUseMacroName);\n    else context.onUseMacroParts = new OnUseMacros(null);\n    context.MacroPassOptions = foundry.utils.mergeObject(onUseMacroOptions, Workflow.stateHooks);\n    Object.keys(context.MacroPassOptions).forEach((k) => {\n      context.MacroPassOptions[k] = i18n(context.MacroPassOptions[k]);\n    })\n    return context;\n  }\n\n  _onDragStart(ev) {}\n\n  _onDrop(ev) {\n    ev.preventDefault();\n    const data: any = foundry.applications.ux.TextEditor.getDragEventData(ev);\n    if (data.uuid) ev.target.value += data.uuid;\n  }\n\n  static async #onAddMacro(this: ActorOnUseMacrosConfig) {\n    if (!this.isEditable) return;\n    const macros = getCurrentSourceMacros(this.document);\n    const formMacros = Object.entries(new foundry.applications.ux.FormDataExtended(this.element.querySelector(\"form\") as HTMLFormElement)?.object) ?? [];\n    for (const [k, v] of formMacros) {\n      foundry.utils.setProperty(macros, k.split('.').slice(1).join('.'), v);\n    }\n    macros.items.push(new OnUseMacro(\"\"));\n    await this.document.setFlag(MODULE_ID, \"onUseMacroName\", macros.toString());\n    this.render({force: true});\n  }\n\n  static async #onDeleteMacro(this: ActorOnUseMacrosConfig, event: MouseEvent) {\n    if (!this.isEditable) return;\n    const macros = getCurrentSourceMacros(this.document);\n    const formMacros = Object.entries(new foundry.applications.ux.FormDataExtended(this.element.querySelector(\"form\") as HTMLFormElement)?.object) ?? [];\n    for (const [k, v] of formMacros) {\n      foundry.utils.setProperty(macros, k.split('.').slice(1).join('.'), v);\n    }\n    const li = (event.target as HTMLAnchorElement)!.closest<HTMLLIElement>(\"[data-macroPart]\")!;\n    macros.items.splice(Number(li!.dataset!.macropart), 1);\n    await this.document.setFlag(MODULE_ID, \"onUseMacroName\", macros.toString());\n    this.render({force: true});\n  }\n\n  async _preClose(options) {\n    await super._preClose(options);\n    const macros = getCurrentSourceMacros(this.document);\n    const formMacros = Object.entries(new foundry.applications.ux.FormDataExtended(this.element.querySelector(\"form\") as HTMLFormElement)?.object) ?? [];\n    for (const [k, v] of formMacros) {\n      foundry.utils.setProperty(macros, k.split('.').slice(1).join('.'), v);\n    }\n    await this.document.setFlag(MODULE_ID, \"onUseMacroName\", macros.toString());\n  }\n}","import { i18n } from \"../../midi-qol.js\";\nimport { Workflow } from \"../Workflow.js\";\nimport { OnUseMacro, OnUseMacros } from \"./Item.js\";\n\nconst { DocumentSheetV2, HandlebarsApplicationMixin } = foundry.applications.api\n\nexport class ItemOnUseMacrosConfig extends HandlebarsApplicationMixin(DocumentSheetV2)<\n  Item.Implementation,\n  foundry.applications.api.DocumentSheetV2.RenderContext<any>\n> {\n  static override PARTS = {\n    form: {\n      id: \"item-on-use-config\",\n      classes: [\"midi-qol\", \"item-on-use-sheet\", \"standard-form\"],\n      template: \"modules/midi-qol/templates/apps/ItemOnUseMacrosConfig/itemOnUseMacrosConfig.hbs\"\n    }\n  };\n\n  static override DEFAULT_OPTIONS = {\n    form: {\n      handler: this.#onSubmit,\n      submitOnChange: true,\n      closeOnSubmit: false\n    },\n    position: {\n      width: 600\n    },\n    tag: \"form\",\n    actions: {\n      addMacro: this.#onAddMacro,\n      deleteMacro: this.#onDeleteMacro,\n      editMacro: this.#onEditMacro\n    }\n  }\n\n  /*\n  New way to store on use macros, maybe:\n  flags.midi-qol.onUseMacros: [\n    {\n      macro: \"ItemMacro\" or \"ActivityMacro-ActivityId\" or \"Custom\"\n      customMacro: \"Some Macro\" or nullish\n      macroPass: \"the selected one of above\"\n    }\n  ]\n  */\n\n  override async _prepareContext(options) {\n    const context = await super._prepareContext(options);\n    // @ts-expect-error no dnd5e-types\n    const activityMacros = this.document.system.activities.reduce((acc, activity) => ({\n      ...acc,\n      [`ActivityMacro-${activity.id}`]: `${activity.name} DIME`\n    }), {});\n    const macros = {\n      ItemMacro: `${i18n(\"DOCUMENT.Item\")} DIME`,\n      ...activityMacros,\n      Custom: i18n(\"midi-qol.CustomMacro\")\n    }\n    const onUseMacros = (foundry.utils.getProperty(this.document, \"flags.midi-qol.onUseMacroParts\") as OnUseMacros)?.items ?? [];\n    for (const currMacro of onUseMacros) {\n      if (currMacro.macroName.startsWith(\"ActivityMacro-\")) {\n        currMacro.macro = currMacro.macroName;\n        const activityId = currMacro.macroName.split(\"-\").slice(1).join(\"-\");\n        // @ts-expect-error no dnd5e-types\n        const activityType = this.document.system.activities.get(activityId)?.type;\n        // TODO: dynamically populate based on activity type\n        currMacro.macroPassOptions = Workflow.allMacroPasses;\n      } else {\n        currMacro.macroPassOptions = Workflow.allMacroPasses;\n        if (currMacro.macroName === \"ItemMacro\") currMacro.macro = currMacro.macroName;\n        else currMacro.macro = \"Custom\";\n      }\n    }\n    foundry.utils.mergeObject(context, {\n      onUseMacros,\n      macros\n    });\n    return context;\n  }\n\n  static #onSubmit(\n    this: ItemOnUseMacrosConfig,\n    _event: Event | SubmitEvent,\n    _form: HTMLFormElement,\n    formData: FormDataExtended\n  ) {\n    const expandedData = foundry.utils.expandObject(formData.object);\n    // @ts-expect-error can't know about flags\n    if (!expandedData) return void this.document.update({ \"flags.midi-qol.onUseMacroName\": \"\" });\n    // @ts-expect-error can't know about form data\n    const onUseMacros = Object.values(expandedData.onUseMacros);\n    // @ts-expect-error untyped i\n    onUseMacros.forEach(i => i.macroName ??= i.macro);\n    const newOnUseMacros = OnUseMacros.parseParts({ items: onUseMacros });\n    // @ts-expect-error can't know about flags\n    this.document.update({ \"flags.midi-qol.onUseMacroName\": newOnUseMacros.toString() });\n  }\n\n  static #onAddMacro(\n    this: ItemOnUseMacrosConfig,\n    _event: PointerEvent,\n    _target: HTMLElement\n  ) {\n    const currOnUseMacros = foundry.utils.getProperty(this.document, \"flags.midi-qol.onUseMacroParts\") as OnUseMacros ?? new OnUseMacros();\n    currOnUseMacros.items.push(new OnUseMacro());\n    // @ts-expect-error can't know about flags\n    this.document.update({ \"flags.midi-qol.onUseMacroName\": currOnUseMacros.toString() });\n  }\n\n  static #onDeleteMacro(\n    this: ItemOnUseMacrosConfig,\n    _event: PointerEvent,\n    target: HTMLElement\n  ) {\n    const currOnUseMacros = (foundry.utils.getProperty(this.document, \"flags.midi-qol.onUseMacroParts\") as OnUseMacros)?.items ?? [];\n    const macroIndex = target.closest<HTMLDivElement>(\"[data-macro-index]\")?.dataset.macroIndex;\n    if (macroIndex === undefined) return;\n    const newOnUseMacros = OnUseMacros.parseParts({ items: currOnUseMacros.toSpliced(Number(macroIndex), 1) });\n    // @ts-expect-error can't know about flags\n    this.document.update({ \"flags.midi-qol.onUseMacroName\": newOnUseMacros.toString() });\n  }\n\n  static #onEditMacro(\n    this: ItemOnUseMacrosConfig,\n    _event: PointerEvent,\n    target: HTMLElement\n  ) {\n    const macroIndex = target.closest<HTMLDivElement>(\"[data-macro-index]\")?.dataset.macroIndex;\n    if (macroIndex === undefined) return;\n    const currOnUse = (foundry.utils.getProperty(this.document, \"flags.midi-qol.onUseMacroParts\") as OnUseMacros)?.items?.[macroIndex];\n    if (!currOnUse) return;\n    const DIMEditor = globalThis.DAE?.DIMEditor;\n    if (!DIMEditor) return ui.notifications?.error(\"DIMEditor not available - install Dynamic Active Effects\");\n    if (currOnUse.macroName === \"ItemMacro\") {\n      return new DIMEditor({ document: this.document }).render({ force: true });\n    } else {\n      const activityId = currOnUse.macroName.split(\"-\").slice(1).join(\"-\");\n      // @ts-expect-error no dnd5e-types\n      const activity = this.document.system.activities.get(activityId);\n      if (activity) return new DIMEditor({ document: activity }).render({ force: true });\n    }\n  }\n}","import { warn, error, debug, i18n, debugEnabled, overTimeEffectsToDelete, savedOverTimeEffectsToDelete, log, gameStats, GameSystemConfig, MODULE_ID } from \"../midi-qol.js\";\nimport { colorChatMessageHandler, nsaMessageHandler, hideStuffHandler, hideRollUpdate, hideRollRender, processCreateDDBGLMessages, ddbglPendingHook, checkOverTimeSaves } from \"./chatMessageHandling.js\";\nimport { preferredActiveGM, processUndoDamageCard } from \"./GMAction.js\";\nimport { untargetDeadTokens, untargetAllTokens, midiCustomEffect, removeReactionUsed, removeBonusActionUsed, chackFlanking as checkFlanking, expireRollEffect, removeActionUsed, expirePerTurnBonusActions, getCachedDocument, getUpdatesCache, clearUpdatesCache, expireEffects, createConditionData, processConcentrationRequestMessage, evalAllConditions, doConcentrationCheck, _processOverTime, getCEEffectByName, setRollMaxDiceTerm, setRollMinDiceTerm, _processActivityOverTime, completeActivityUse, isAutoFastForward, areMidiKeysPressed, throttledScrollBottom, getVitalityItem, tokenForActor, resolveItemMacro, resolveActivityMacro, resolveDAEItemData, doSyncRoll, getTokenPerimeterPolygon, closestPointOnPerimeter, measurePointDistance, getActivityAutoTargetAction, getAoETargetType, updateFlankingHighlight, onUserManualTarget, rangeToSceneUnits } from \"./utils.js\";\nimport { checkMechanic, checkRule, configSettings, dragDropTargeting, isDnd5e53, setDnd5e53 } from \"./settings.js\";\nimport { checkWounded, checkDeleteTemplate, preUpdateItemActorOnUseMacro, zeroHPExpiry, deathSaveHook, getTemplateSourceToken } from \"./patching.js\";\nimport { TroubleShooter } from \"./apps/TroubleShooter.js\";\nimport { Workflow } from \"./Workflow.js\";\nimport { ActorOnUseMacrosConfig } from \"./apps/ActorOnUseMacroConfig.js\";\nimport { installedModules } from \"./setupModules.js\";\nimport { preActivityConsumptionHook, activityConsumptionHook, selectTargetsFromTemplates, isAoETargetable } from \"./activities/activityHelpers.js\";\nimport { ItemOnUseMacrosConfig } from \"./apps/ItemOnUseMacrosConfig.js\";\nimport { Activity, DamageApplicationOptions, DamageDescription } from \"../globals.js\";\nimport { MidiDependentsRegistry } from \"./lib/MidiDependentsRegistry.js\";\n\nexport const concentrationCheckItemName = \"Concentration Check - Midi QOL\";\nexport var concentrationCheckItemDisplayName = \"Concentration Check\";\n\nexport let readyHooks = async () => {\n  // Handle removing effects when the token is moved.\n  // @ts-expect-error not yet typed in fvtt-types\n  Hooks.on(\"moveToken\", (tokenDocument: TokenDocument.Implementation, movement, operation, user: User.Implementation) => {\n    if (!user.isSelf) return;\n    const actor = tokenDocument.actor;\n    const expiredEffects = actor?.effects.filter(ef => {\n      const specialDuration = ef.flags?.dae?.specialDuration;\n      return !!specialDuration?.includes(\"isMoved\");\n    }) ?? [];\n    if (expiredEffects.length > 0) expireEffects(actor!, expiredEffects, { \"expiry-reason\": \"midi-qol:isMoved\" });\n\n  });\n\n  //@ts-expect-error\n  Hooks.on(\"template3dUpdatePreview\", (at, t) => {\n    globalThis.VolumetricTemplates?.compute3Dtemplate(t);\n  });\n\n  Hooks.on(\"targetToken\", foundry.utils.debounce(checkFlanking, 150));\n  Hooks.on(\"targetToken\", (user, token, targeted) => onUserManualTarget(user));\n\n  // Flanking visualization — update when token selection, targeting, or position changes\n  const debouncedFlankingHighlight = foundry.utils.debounce(updateFlankingHighlight, 150);\n  Hooks.on(\"controlToken\", debouncedFlankingHighlight);\n  Hooks.on(\"targetToken\", debouncedFlankingHighlight);\n  Hooks.on(\"refreshToken\", debouncedFlankingHighlight);\n\n  //@ts-expect-error\n  Hooks.on(\"ddb-game-log.pendingRoll\", (data) => {\n    ddbglPendingHook(data);\n  });\n\n  //@ts-expect-error\n  Hooks.on(\"ddb-game-log.fulfilledRoll\", (data) => {\n    ddbglPendingHook(data);\n  });\n\n  Hooks.on(\"preUpdateChatMessage\", (message, update, options, user) => {\n    try {\n      const cachedUpdates = foundry.utils.flattenObject(getUpdatesCache(message.uuid));\n      if (cachedUpdates) {\n        // console.error(\"preUpdateChatMessage cached updates for\", message.uuid, update);\n        // clearUpdatesCache(message.uuid);\n        // hideStuffHandler(message, $(message.content), user);\n        if (!foundry.utils.isEmpty(cachedUpdates) && false) {\n          const insertedUpdates = {};\n          Object.keys(cachedUpdates).forEach(key => {\n            if (cachedUpdates[key] !== undefined && foundry.utils.getProperty(update, key) === undefined) {\n              if (debugEnabled) insertedUpdates[key] = cachedUpdates[key];\n              foundry.utils.setProperty(update, key, cachedUpdates[key])\n            }\n          });\n          if (debugEnabled && !foundry.utils.isEmpty(insertedUpdates)) warn(\"preUpdateChatMessage inserting updates\", message.uuid, insertedUpdates);\n        }\n      }\n      return true;\n    } finally {\n      return true;\n    }\n  });\n\n  Hooks.on(\"deleteMeasuredTemplate\", checkDeleteTemplate);\n\n  // Auto-target tokens when a template is refreshed (moved/reshaped during preview or after placement)\n  // Only the user who placed the template should update targeting, otherwise all clients\n  // would set their own game.user.targets causing every player to target the AoE tokens.\n  // @ts-expect-error fvtt-types missing flags parameter on refreshMeasuredTemplate hook\n  Hooks.on(\"refreshMeasuredTemplate\", (template: foundry.canvas.placeables.MeasuredTemplate.Implementation, flags: Record<string, boolean>) => {\n    if (!flags.refreshPosition && !flags.refreshShape) return;\n    if (!canvas?.tokens) return;\n    if (template.document.author?.id !== game.user?.id) return;\n\n    // Only auto-target for templates created by dnd5e activities (midi or native).\n    // template.activity is set during preview; flags.dnd5e.origin is set after placement.\n    // Skip manually placed or non-activity templates entirely.\n    // @ts-expect-error no dnd5e-types\n    if (!template.activity && !template.document.flags?.dnd5e?.origin) return;\n\n    // @ts-expect-error no dnd5e-types\n    const autoTarget = getActivityAutoTargetAction(template.activity);\n    if (autoTarget === \"none\") return;\n\n    if (installedModules.get(\"levelsvolumetrictemplates\") && autoTarget !== \"walledtemplates\") {\n      //@ts-expect-error CONFIG.Levels\n      const levelsTemplateData = CONFIG.Levels.handlers.TemplateHandler.getTemplateData(false);\n      if (template.document.elevation !== levelsTemplateData.elevation) {\n        template.document.elevation = levelsTemplateData.elevation;\n      }\n      // Resolve the activity and source token for disposition filtering\n      // @ts-expect-error no dnd5e-types\n      const activity = template.activity\n        ?? (template.document.flags?.dnd5e?.origin ? fromUuidSync(template.document.flags.dnd5e.origin) : undefined);\n      const sourceToken = getTemplateSourceToken(template.document);\n      const selfToken = sourceToken ?? undefined;\n      const AoETargetType = activity ? getAoETargetType(activity) : \"any\";\n      const ignoreSelf = activity\n        ? (activity?.target.affects.special ?? \"\").split(\";\").some((spec: string) => [\"-self\"].includes(spec))\n        : false;\n\n      // Filter which tokens to pass - not too far; wall blocking is left to levels.\n      let distance = template.document.distance;\n      const dimensions = canvas.dimensions || { size: 1, distance: 1 };\n      distance *= dimensions.size / dimensions.distance;\n      const tokensToCheck = canvas.tokens.placeables?.filter(tk => {\n        const r = new foundry.canvas.geometry.Ray(\n          { x: template.document?.x ?? template.x, y: template.document?.y ?? template.y },\n          { x: tk.x + tk.document.width * dimensions.size, y: tk.y + tk.document.height * dimensions.size }\n        );\n        const maxExtension = (1 + Math.max(tk.document.width, tk.document.height)) * dimensions.size;\n        if (r.distance > distance + maxExtension) return false;\n        if (!isAoETargetable(tk, { selfToken, ignoreSelf, AoETargetType, autoTarget })) return false;\n        return true;\n      });\n      if (tokensToCheck && tokensToCheck.length > 0) {\n        //@ts-expect-error VolumetricTemplates\n        VolumetricTemplates.compute3Dtemplate(template, tokensToCheck);\n      }\n    } else {\n      // template.activity is set by dnd5e on AbilityTemplate during preview, but not on\n      // the standard MeasuredTemplate created after placement. Fall back to looking up\n      // the activity from the template's dnd5e.origin flag (the activity UUID).\n      // @ts-expect-error no dnd5e-types\n      const activity = template.activity\n        ?? (template.document.flags?.dnd5e?.origin ? fromUuidSync(template.document.flags.dnd5e.origin) : undefined);\n      const sourceToken = getTemplateSourceToken(template.document);\n      if (activity && sourceToken) {\n        const ignoreSelf = (activity?.target.affects.special ?? \"\").split(\";\").some((spec: string) => [\"-self\"].includes(spec));\n        selectTargetsFromTemplates([template], sourceToken, ignoreSelf, getAoETargetType(activity), autoTarget);\n      } else {\n        selectTargetsFromTemplates([template]);\n      }\n    }\n  });\n\n  // Handle updates to the characters HP\n  // Note: Wounded/dead status is now handled by _onUpdate wrapper in patching.ts\n  // This hook handles zeroHPExpiry and concentration removal\n  Hooks.on(\"updateActor\", async (actor, update, options: any, user) => {\n    if (user !== game.user?.id) return;\n    const hpUpdate = foundry.utils.getProperty(update, \"system.attributes.hp.value\");\n    const temphpUpdate = foundry.utils.getProperty(update, \"system.attributes.hp.temp\");\n    if (hpUpdate !== undefined || temphpUpdate !== undefined) {\n      await zeroHPExpiry(actor, update, options, user);\n      // @ts-expect-error no dnd5e-types\n      if (actor.system.attributes.hp.value <= 0 && configSettings.removeConcentration) {\n        // @ts-expect-error no dnd5e-types\n        await actor.endConcentration();\n      }\n      return;\n    }\n  });\n\n  // Handle vitality item updates - check wounded/dead status when vitality changes\n  Hooks.on(\"updateItem\", async (item, update, options, userId) => {\n    if (userId !== game.user?.id) return;\n    // Check if this is a vitality item update (uses.spent changed)\n    const spentUpdate = foundry.utils.getProperty(update, \"system.uses.spent\") as number | undefined;\n    if (spentUpdate === undefined) return;\n\n    const actor = item.actor;\n    if (!actor) return;\n\n    // Check if this item is the vitality item for the actor\n    const vitalityItem = getVitalityItem(actor);\n    if (!vitalityItem || vitalityItem.id !== item.id) return;\n\n    // Calculate new vitality value\n    // @ts-expect-error uses exists on items with uses\n    const maxUses = item.system.uses?.max ?? 0;\n    const newVitality = maxUses - spentUpdate;\n\n    // Re-check wounded/dead status with the new vitality value\n    await checkWounded(actor, {}, {} as any, userId, newVitality);\n  });\n\n  //TODO: if/when options are passed to dnd5e.damageActor can use that hook instead and not do any calculations.\n  // Note: Vitality overflow for direct HP edits is NOT handled because the value is clamped before application.\n  // Vitality is only affected through damage application (GMAction.ts or actor.applyDamage()) which has explicit damage amounts.\n  Hooks.on(\"preUpdateActor\", (actor, changes, options: any, userId) => {\n    if (userId !== game.user?.id) return true;\n\n    const shouldCheckTempHP = configSettings.tempHPDamageConcentrationCheck;\n    // @ts-expect-error no dnd5e-types\n    const relevantHpChange = changes.system?.attributes?.hp;\n\n    const isHpChangeInvalid =\n      relevantHpChange &&\n      !(\"value\" in relevantHpChange) &&\n      (!shouldCheckTempHP || !(\"temp\" in relevantHpChange));\n\n    if (\n      isHpChangeInvalid ||\n      // @ts-expect-error no dnd5e-types\n      !actor.concentration.effects.size ||\n      configSettings.doConcentrationCheck === \"none\" ||\n      game.settings.get(\"dnd5e\", \"disableConcentration\") ||\n      options.noConcentrationCheck ||\n      options.dnd5e?.concentrationCheck === false\n    ) {\n      options.noConcentrationCheck = true;\n      foundry.utils.setProperty(options, \"dnd5e.concentrationCheck\", false);\n      return true;\n    }\n\n    const hpUpdate = relevantHpChange?.value;\n    const tempHpUpdate = relevantHpChange?.temp;\n    //@ts-expect-error no dnd5e-types\n    const hpDamage = (hpUpdate !== undefined) ? actor.system.attributes.hp.value - hpUpdate : 0;\n    //@ts-expect-error no dnd5e-types\n    const tempHPDamage = (tempHpUpdate !== undefined) ? actor.system.attributes.hp.temp - tempHpUpdate : 0;\n    const totalDamage = tempHPDamage + hpDamage;\n    if (hpDamage <= 0 && !configSettings.tempHPDamageConcentrationCheck) {\n      options.noConcentrationCheck = true;\n      foundry.utils.setProperty(options, \"dnd5e.concentrationCheck\", false);\n      return true;\n    }\n    const isConcentrationCheck = (hpDamage > 0 || (tempHPDamage > 0 && configSettings.tempHPDamageConcentrationCheck));\n    foundry.utils.setProperty(options, \"dnd5e.concentrationCheck\", isConcentrationCheck);\n    try {\n      if (configSettings.doConcentrationCheck === \"item\" && isConcentrationCheck) {\n        //@ts-expect-error no dnd5e-types\n        const concentrationDc = actor.getConcentrationDC(totalDamage);\n        doConcentrationCheck(actor, concentrationDc);\n      }\n    } catch (err) {\n      error(\"Error in preUpdateActor\", err);\n    } finally {\n      return true;\n    }\n  })\n\n  //@ts-expect-error\n  Hooks.on(\"renderActorArmorConfig\", (app: never, html: HTMLElement, data) => {\n    if (![\"none\", undefined, false].includes(checkRule(\"challengeModeArmor\") as string | boolean | undefined)) {\n      const ac = data.ac;\n      const element = html.querySelector(\".card\");\n      const arTemplate = document.createElement(\"template\");\n      arTemplate.innerHTML = `<div>EC: ${ac.EC}</div><div>AR: ${ac.AR}</div>`;\n      element?.append(...Array.from(arTemplate.content.children));\n    }\n  });\n\n  // Handle removal of concentration\n  Hooks.on(\"deleteActiveEffect\", (deletedEffect, options: any, user) => {\n    if (options.undo) return; // TODO check that this is right\n    if (debugEnabled > 0) console.warn(\"deleteActiveEffect\", deletedEffect, options, user);\n    if (!preferredActiveGM()?.isSelf) return;\n    if (!(deletedEffect.parent instanceof CONFIG.Actor.documentClass)) return;\n    if (debugEnabled > 0) warn(\"deleteActiveEffectHook\", deletedEffect, deletedEffect.parent.name, options);\n    async function changeFunc() {\n      try {\n        let origin = fromUuidSync(deletedEffect.origin as any);\n        if (origin instanceof ActiveEffect && !options.noConcentrationCheck && configSettings.removeConcentrationEffects !== \"none\") {\n          // @ts-expect-error no dnd5e-types\n          if (origin.statuses?.has(CONFIG.specialStatusEffects.CONCENTRATING) && origin.getDependents()?.length === 0) {\n            // @ts-expect-error duration.remaining\n            if (!installedModules.get(\"times-up\") || (origin?.duration?.remaining ?? 1) > 0) {\n              await origin.delete();\n            }\n          }\n        }\n        // transformedActorUuids stores the ORIGINAL (pre-transform) actor UUIDs.\n        // Find whatever polymorphed form currently exists for each original and revert it.\n        // Skip if the parent actor is being deleted (e.g., revertOriginalForm deletes the polymorphed\n        // actor, cascading to its effects — we don't want to re-enter the revert flow).\n        let transformedActorUuids = foundry.utils.getProperty(deletedEffect, \"flags.midi-qol.transformedActorUuids\") as string[];\n        const parentActor = deletedEffect.parent as Actor.Implementation;\n        const parentStillExists = parentActor?.id && (parentActor.isToken\n          ? canvas.scene?.tokens?.get(parentActor.token?.id ?? \"\")\n          : game.actors?.get(parentActor.id));\n        if (transformedActorUuids && transformedActorUuids.length > 0 && parentStillExists) {\n          for (let uuid of transformedActorUuids) {\n            let originalActor = await fromUuid(uuid) as Actor.Implementation;\n            if (!originalActor) continue;\n            const actorsToRevert: Actor.Implementation[] = [];\n            // Search game.actors for linked polymorphed actors referencing this original\n            for (const a of game.actors ?? []) {\n              //@ts-expect-error isPolymorphed - dnd5e property\n              if (a.isPolymorphed && a.getFlag(\"dnd5e\", \"originalActor\") === originalActor.id) {\n                actorsToRevert.push(a);\n              }\n            }\n            // Search canvas tokens for unlinked polymorphed actors\n            if (canvas.ready) {\n              for (const token of canvas.scene?.tokens ?? []) {\n                //@ts-expect-error isPolymorphed - dnd5e property\n                if (token.actor?.isPolymorphed\n                  && token.actor?.getFlag(\"dnd5e\", \"originalActor\") === originalActor.id\n                  && !actorsToRevert.some(a => a.id === token.actor!.id)) {\n                  actorsToRevert.push(token.actor);\n                }\n              }\n            }\n            for (const polyActor of actorsToRevert) {\n              try {\n                //@ts-expect-error no dnd5e-types\n                await polyActor.revertOriginalForm({});\n              } catch (err) {\n                console.error(\"Error reverting actor to original form\", polyActor, err);\n              }\n            }\n            // After revert, clean up concentration on the restored original actor.\n            // transformInto() copies effects (including concentration) from original to\n            // polymorphed form, so the original still has its concentration effect.\n            if (actorsToRevert.length > 0) {\n              const restoredActor = await fromUuid(uuid) as Actor.Implementation;\n              if (restoredActor) {\n                const remainingConcentration = restoredActor.effects.filter(ef =>\n                  // @ts-expect-error no dnd5e-types\n                  ef.statuses?.has(CONFIG.specialStatusEffects.CONCENTRATING)\n                );\n                for (const ce of remainingConcentration) {\n                  // @ts-expect-error extra option silliness\n                  await ce.delete({ noConcentrationCheck: true });\n                }\n              }\n            }\n          }\n        }\n        return true;\n      } catch (err) {\n        console.warn(\"Error in deleteActiveEffect\", err, deletedEffect, options);\n        return true;\n      }\n    }\n    return changeFunc();\n  })\n\n  // Handle deletion of Actors - cascade delete dependents via MidiDependentsRegistry\n  Hooks.on(\"deleteActor\", (deletedActor: Actor.Implementation, options: any, user) => {\n    if (!preferredActiveGM()?.isSelf) return;\n    if (options.undo) return;\n    MidiDependentsRegistry.deleteDependents(deletedActor.uuid);\n  });\n\n  // Handle deletion of Items - cascade delete dependents via MidiDependentsRegistry\n  Hooks.on(\"deleteItem\", (deletedItem: Item.Implementation, options: any, user) => {\n    if (!preferredActiveGM()?.isSelf) return;\n    if (options.undo) return;\n    MidiDependentsRegistry.deleteDependents(deletedItem.uuid);\n  });\n\n  // Handle deletion of AmbientLights - cascade delete dependents via MidiDependentsRegistry\n  Hooks.on(\"deleteAmbientLight\", (deletedLight: any, options: any, user) => {\n    if (!preferredActiveGM()?.isSelf) return;\n    if (options.undo) return;\n    MidiDependentsRegistry.deleteDependents(deletedLight.uuid);\n  });\n\n  // Handle deletion of Tokens - cascade delete dependents via MidiDependentsRegistry\n  Hooks.on(\"deleteToken\", (deletedToken: any, options: any, user) => {\n    if (!preferredActiveGM()?.isSelf) return;\n    if (options.undo) return;\n    MidiDependentsRegistry.deleteDependents(deletedToken.uuid);\n  });\n\n  // Handle deletion of Regions - cascade delete dependents via MidiDependentsRegistry\n  Hooks.on(\"deleteRegion\", (deletedRegion: any, options: any, user) => {\n    if (!preferredActiveGM()?.isSelf) return;\n    if (options.undo) return;\n    MidiDependentsRegistry.deleteDependents(deletedRegion.uuid);\n  });\n\n  // Hooks.on(\"restCompleted\", restManager); I think this means 1.6 is required.\n  Hooks.on(\"dnd5e.restCompleted\", restManager);\n  Hooks.on(\"dnd5e.preActivityConsumption\", preActivityConsumptionHook);\n  Hooks.on(\"dnd5e.activityConsumption\", activityConsumptionHook);\n  Hooks.on(\"dnd5e.rollDeathSave\", deathSaveHook);\n  Hooks.on(\"updateCombat\", (combat, update, options, userId) => {\n    if (userId != preferredActiveGM()?.id) return;\n    if (!update.hasOwnProperty(\"round\")) return;\n    if (!checkMechanic(\"autoRerollInitiative\")) return;\n    let combatantIds: any = combat.combatants.map(c => c.id);\n    if (combat.combatants?.size > 0 && combat.id) {\n      const combatId = combat.id;\n      combat.rollInitiative(combatantIds, { updateTurn: true }).then(() => {\n        // Check if combat was deleted during async operation\n        if (game.combats?.get(combatId)) combat.update({ turn: 0 });\n      }).catch(err => TroubleShooter.recordError(err, \"autoRerollInitiative\"));\n    }\n  });\n}\n\nexport async function restManager(actor: Actor.Implementation, result: { longRest: boolean; newDay: boolean }) {\n  if (!actor || !result)\n    return;\n  const specialDuration = (effect): string[] | undefined => { return foundry.utils.getProperty(effect, \"flags.dae.specialDuration\") as string[] };\n  const effectsToExpire = (actorRef) => {\n    const effects = actorRef.appliedEffects;\n    const validEffects = effects.filter(effect => (specialDuration(effect) ?? []).length > 0);\n    return {\n      newDay: validEffects.filter(ef => result.newDay && specialDuration(ef)?.includes(`newDay`)),\n      longRest: validEffects.filter(ef => result.longRest && specialDuration(ef)?.includes(`longRest`) && !specialDuration(ef)?.includes(`newDay`)),\n      shortRest: validEffects.filter(ef => specialDuration(ef)?.includes(`shortRest`) && !specialDuration(ef)?.includes(`newDay`)),\n    }\n  }\n  const myExpiredEffects = effectsToExpire(actor);\n  if (result.longRest && myExpiredEffects.longRest.length) await expireEffects(actor, myExpiredEffects.longRest, { \"expiry-reason\": \"midi-qol:longRest\" });\n  if (result.longRest && myExpiredEffects.shortRest.length) await expireEffects(actor, myExpiredEffects.shortRest, { \"expiry-reason\": \"midi-qol:shortRest\" });\n  if (!result.longRest && myExpiredEffects.shortRest.length) await expireEffects(actor, myExpiredEffects.shortRest, { \"expiry-reason\": \"midi-qol:shortRest\" });\n  if (result.newDay && myExpiredEffects.newDay.length) await expireEffects(actor, myExpiredEffects.newDay, { \"expiry-reason\": \"midi-qol:newDay\" });\n  if (foundry.utils.getProperty(actor, \"flags.midi-qol.actions.reactionsReset\") !== \"never\") await removeReactionUsed(actor, true); // remove reaction used for a rest\n  if (foundry.utils.getProperty(actor, \"flags.midi-qol.actions.bonusActionsReset\") !== \"never\")\n    await removeActionUsed(actor);\n}\n\nexport function initHooks() {\n  if (debugEnabled > 0) warn(\"Init Hooks processing\");\n  Hooks.on(\"preCreateChatMessage\", (message, data, options, user) => {\n    if (debugEnabled > 1) debug(\"preCreateChatMessage entering\", message, data, options, user)\n    nsaMessageHandler(message, data, options, user);\n    checkOverTimeSaves(message, data, options, user);\n    return true;\n  });\n\n  Hooks.on(\"createChatMessage\", (message, options, user) => {\n    if (debugEnabled > 1) debug(\"Create Chat Message \", message.id, message, options, user)\n    processCreateDDBGLMessages(message, options, user);\n    return true;\n  });\n\n  Hooks.on(\"updateChatMessage\", (message, update, options, user) => {\n    hideRollUpdate(message, update, options, user);\n    if (!update.content) return;\n    const updateChatMessageStart = Date.now();\n    //@ts-expect-error fvtt-isAtBottom\n    if (message.content && (ui.chat?.isAtBottom)) {\n      throttledScrollBottom();\n    }\n    if (debugEnabled > 1) debug(\"updateChatMessage processing time\", Date.now() - updateChatMessageStart);\n  });\n\n\n  Hooks.on(\"updateCombat\", (combat, data, options, user) => {\n    if (data.round === undefined && data.turn === undefined) return;\n    untargetAllTokens(combat);\n    untargetDeadTokens();\n    if (preferredActiveGM()?.isSelf) {\n      _processOverTime(combat, data, options, user);\n      _processActivityOverTime(combat, data, options, user);\n    }\n    // updateReactionRounds(combat, data, options, user); This is handled in processOverTime\n  });\n\n  Hooks.on(\"renderChatMessageHTML\", (message, html, data) => {\n    if (debugEnabled > 1) debug(\"render message hook \", message.id, message, html, data);\n    // chatDamageButtons(message, html, data); This no longer works since the html is rewritten\n    processUndoDamageCard(message, html, data);\n    colorChatMessageHandler(message, html, data);\n    hideRollRender(message, html, data);\n    hideStuffHandler(message, html, data);\n    processConcentrationRequestMessage(message, html, data);\n  });\n\n  Hooks.on(\"deleteChatMessage\", (message, options, user) => {\n    Workflow.deleteWorkflow(message.uuid);\n    clearUpdatesCache(message.uuid);\n  });\n\n  // Helper to apply a replacement effect - supports status effect IDs, effect UUIDs, and macro specifications\n  // Syntax: \"statusId\" or \"effectUuid\" or \"statusId|overlay\" or \"effectUuid|overlay\"\n  // Macro syntax: \"function.functionName\", \"Macro.macroName\", \"ItemMacro\", \"ItemMacro.itemNameOrUuid\",\n  //               \"ActivityMacro\", \"ActivityMacro.uuid\"\n  async function applyReplacementEffect(actor: Actor.Implementation, effectSpec: string, effect?: ActiveEffect.Implementation): Promise<void> {\n    // Parse the effect spec for optional parameters using | as separator\n    const parts = effectSpec.split(\"|\");\n    const effectIdOrUuid = parts[0].trim();\n    let overlay = false;\n\n    // Parse optional parameters (e.g., \"overlay\" or \"overlay=true\")\n    for (let i = 1; i < parts.length; i++) {\n      const param = parts[i].trim().toLowerCase();\n      if (param === \"overlay\" || param === \"overlay=true\") {\n        overlay = true;\n      } else if (param === \"overlay=false\") {\n        overlay = false;\n      }\n    }\n\n    // Check if it's a macro specification\n    if (effectIdOrUuid.startsWith(\"function.\") || effectIdOrUuid.startsWith(\"Macro.\") ||\n      effectIdOrUuid.startsWith(\"ItemMacro\") || effectIdOrUuid.startsWith(\"ActivityMacro\")) {\n      // Execute macro with actor context\n      await executeMacroSpec(effectIdOrUuid, actor, effect);\n    } else {\n      // Check if it's a status effect ID (from CONFIG.statusEffects)\n      const statusEffect = CONFIG.statusEffects.find(se => se.id === effectIdOrUuid);\n      if (statusEffect) {\n        // Apply as status effect using toggleStatusEffect\n        await actor.toggleStatusEffect(effectIdOrUuid, { active: true, overlay });\n      } else {\n        // Assume it's an effect UUID - fetch and apply\n        const sourceEffect = await fromUuid(effectIdOrUuid) as ActiveEffect.Implementation | undefined;\n        if (sourceEffect) {\n          const effectData = sourceEffect.toObject();\n          if (overlay) {\n            foundry.utils.setProperty(effectData, \"flags.core.overlay\", true);\n          }\n          await actor.createEmbeddedDocuments(\"ActiveEffect\", [effectData]);\n        }\n      }\n    }\n  }\n\n  // Helper to execute a macro specification for replacement effects\n  // Supports: \"function.functionName\", \"Macro.macroName\", \"ItemMacro\", \"ItemMacro.itemNameOrUuid\",\n  //           \"ActivityMacro\", \"ActivityMacro.uuid\"\n  async function executeMacroSpec(macroSpec: string, actor: Actor.Implementation, effect?: ActiveEffect.Implementation): Promise<any> {\n    let macro: Macro.Implementation | undefined;\n    let macroData: Macro.CreateData | undefined;\n    let macroItem: Item.Implementation | undefined;\n    let macroActivity: Activity | undefined;\n\n    // Get the origin item/activity from the effect if available\n    let originItem: Item.Implementation | undefined;\n    let originActivity: Activity | undefined;\n    if (effect?.origin) {\n      const origin = await fromUuid(effect.origin);\n      if (origin instanceof Item) {\n        originItem = origin;\n        // @ts-expect-error no dnd5e-types\n        originActivity = origin.system.activities?.contents[0];\n      } else if ((origin as any)?.item) {\n        // It's an activity\n        originActivity = origin as unknown as Activity;\n        originItem = (origin as any).item;\n      }\n    }\n\n    try {\n      if (macroSpec.startsWith(\"function.\")) {\n        // Create a script macro that calls the named function\n        const funcName = macroSpec.replace(\"function.\", \"\").trim();\n        macroData = {\n          name: \"replacement effect function call\",\n          type: \"script\",\n          command: `return await ${funcName}({ speaker, actor, token, character, item, args, scope })`\n        };\n        macroItem = originItem;\n      } else if (macroSpec.startsWith(\"Macro.\")) {\n        // Get macro by name from game.macros\n        const macroName = macroSpec.replace(\"Macro.\", \"\").trim();\n        macro = game.macros?.getName(macroName);\n        if (!macro) {\n          // Try as UUID\n          const macroEntity = await fromUuid(macroName);\n          if (macroEntity instanceof Macro) macro = macroEntity;\n        }\n        if (!macro) {\n          warn(`applyReplacementEffect | Could not find macro ${macroName}`);\n          return;\n        }\n        if (macro.type === \"chat\") {\n          macro.execute();\n          return;\n        }\n        macroItem = originItem;\n      } else if (macroSpec.startsWith(\"ItemMacro\")) {\n        // Use helper function to resolve ItemMacro\n        const resolved = await resolveItemMacro(macroSpec, { actor, originItem });\n        if (resolved) {\n          macroItem = resolved.item;\n          macroData = resolved.macroData;\n        } else if (effect?.origin) {\n          // DAE itemData fallback - look for item data stored in effect flags\n          const itemData = resolveDAEItemData(actor, effect.origin);\n          if (itemData) {\n            macroItem = itemData as unknown as Item.Implementation;\n            macroData = itemData.flags?.dae?.macro ?? itemData.flags?.itemacro?.macro;\n          }\n        }\n        if (!macroData) {\n          warn(`applyReplacementEffect | Could not resolve ItemMacro: ${macroSpec}`);\n          return;\n        }\n      } else if (macroSpec.startsWith(\"ActivityMacro\")) {\n        // Use helper function to resolve ActivityMacro\n        const resolved = await resolveActivityMacro(macroSpec, { originItem, originActivity });\n        if (!resolved) {\n          warn(`applyReplacementEffect | Could not resolve ActivityMacro: ${macroSpec}`);\n          return;\n        }\n        macroItem = resolved.item;\n        macroActivity = resolved.activity;\n        macro = resolved.macro;\n      }\n\n      // Create macro if we have macroData but no macro\n      if (macroData && !macro) {\n        const OWNER = CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER;\n        macroData.ownership = { default: OWNER };\n        macroData.author = game.user?.id;\n        macro = new CONFIG.Macro.documentClass(macroData);\n      }\n\n      if (!macro?.command) return;\n\n      // Build execution context\n      const token = tokenForActor(actor);\n      const speaker = ChatMessage.getSpeaker({ actor, token: token?.document });\n      const args = [{ actor, token, effect, item: macroItem, activity: macroActivity, reason: \"replacementEffect\" }];\n\n      const scope: Macro.UnknownScope = {};\n      scope.actor = actor;\n      scope.token = token;\n      scope.effect = effect;\n      scope.item = macroItem;\n      scope.activity = macroActivity;\n      scope.args = args;\n\n      return macro.execute(scope);\n    } catch (err) {\n      TroubleShooter.recordError(err, \"executeMacroSpec: Error evaluating macro\");\n      error(\"Error evaluating replacement effect macro\", err);\n    }\n  }\n\n  Hooks.on(\"midi-qol.RollComplete\", async (workflow) => {\n    const activityUuid = workflow.activity.uuid ?? \"\";\n    if (savedOverTimeEffectsToDelete[activityUuid]) {\n      const effectData = savedOverTimeEffectsToDelete[activityUuid];\n      let effect = fromUuidSync(effectData.uuid) as ActiveEffect.Implementation | undefined;\n\n      if (effect) {\n        const saved = workflow.saves.size === 1;\n        const failed = workflow.failedSaves.size === 1;\n        const { saveCount, saveCountAction, saveConsecutive,\n                failCount, failCountAction, failConsecutive } = effectData;\n        const actor = effect.parent as Actor.Implementation;\n\n        if (saved || !workflow.hasSave) {\n          // Handle saveCount - need multiple saves to trigger action\n          if (saved && saveCount !== undefined) {\n            let savesRemaining = foundry.utils.getProperty(effect, `flags.${MODULE_ID}.overtime.savesRemaining`) as number | undefined;\n            // Initialize if not set\n            if (savesRemaining === undefined) savesRemaining = saveCount;\n            savesRemaining -= 1;\n\n            if (savesRemaining <= 0) {\n              // Required saves reached - apply action\n              // Action format: [c][-+]effectSpec (e.g., \"-\", \"+\", \"c-petrified\", \"c+prone\")\n              const action = (saveCountAction ?? \"-\").replace(/^c/, \"\"); // Strip consecutive flag\n              const isRemove = action.startsWith(\"-\");\n              const effectSpec = action.length > 1 ? action.slice(1) : undefined;\n\n              // Apply effectSpec if specified (always added to actor)\n              if (effectSpec) await applyReplacementEffect(actor, effectSpec, effect);\n\n              // Then handle the mode\n              if (isRemove) {\n                expireEffects(actor, [effect], { \"expiry-reason\": \"midi-qol:overTime:saveCount\" });\n              } else {\n                const permanentUpdate: Record<string, any> = { [`flags.${MODULE_ID}.overtime.permanent`]: true };\n                await effect.update(permanentUpdate);\n              }\n            } else {\n              // Decrement counter on effect\n              // If failCount is consecutive, a save resets the fail streak\n              const updates: Record<string, any> = {\n                [`flags.${MODULE_ID}.overtime.savesRemaining`]: savesRemaining\n              };\n              if (failConsecutive && failCount !== undefined) {\n                updates[`flags.${MODULE_ID}.overtime.failsRemaining`] = failCount;\n              }\n              await effect.update(updates);\n            }\n          } else {\n            // No saveCount specified - check if effect is already permanent\n            const isAlreadyPermanent = !!effect.flags?.[MODULE_ID]?.overtime?.permanent;\n            if (!isAlreadyPermanent) {\n              // Original behavior: single save removes the effect\n              expireEffects(actor, [effect], { \"expiry-reason\": \"midi-qol:overTime\" });\n            }\n            // If already permanent, do nothing - just let the overtime damage continue\n          }\n        } else if (failed && failCount !== undefined) {\n          // Handle failCount - multiple fails trigger action\n          let failsRemaining = foundry.utils.getProperty(effect, `flags.${MODULE_ID}.overtime.failsRemaining`) as number | undefined;\n          // Initialize if not set\n          if (failsRemaining === undefined) failsRemaining = failCount;\n          failsRemaining -= 1;\n\n          if (failsRemaining <= 0) {\n            // Required fails reached - apply action\n            const action = (failCountAction ?? \"+\").replace(/^c/, \"\"); // Strip consecutive flag\n            const isRemove = action.startsWith(\"-\");\n            const effectSpec = action.length > 1 ? action.slice(1) : undefined;\n\n            // Apply effectSpec if specified (always added to actor)\n            if (effectSpec) await applyReplacementEffect(actor, effectSpec, effect);\n\n            // Then handle the mode\n            if (isRemove) {\n              expireEffects(actor, [effect], { \"expiry-reason\": \"midi-qol:overTime:failCount\" });\n            } else {\n              const permanentUpdate: Record<string, any> = { [`flags.${MODULE_ID}.overtime.permanent`]: true };\n              await effect.update(permanentUpdate);\n            }\n          } else {\n            // Decrement counter on effect\n            // If saveCount is consecutive, a failure resets the save streak\n            const updates: Record<string, any> = {\n              [`flags.${MODULE_ID}.overtime.failsRemaining`]: failsRemaining\n            };\n            if (saveConsecutive && saveCount !== undefined) {\n              updates[`flags.${MODULE_ID}.overtime.savesRemaining`] = saveCount;\n            }\n            await effect.update(updates);\n          }\n        } else if (failed && saveConsecutive && saveCount !== undefined) {\n          // Failed but no failCount to process — still need to reset consecutive save streak\n          const resetUpdate: Record<string, any> = { [`flags.${MODULE_ID}.overtime.savesRemaining`]: saveCount };\n          await effect.update(resetUpdate);\n        }\n      }\n      delete savedOverTimeEffectsToDelete[activityUuid];\n    }\n    if (overTimeEffectsToDelete[activityUuid]) {\n      let effect = fromUuidSync(overTimeEffectsToDelete[activityUuid].uuid) as ActiveEffect.Implementation | undefined;\n      if (effect) expireEffects(effect.parent as Actor.Implementation, [effect], { \"expiry-reason\": \"midi-qol:overTime\" });\n      delete overTimeEffectsToDelete[activityUuid];\n    }\n    if (debugEnabled > 1) debug(\"Finished the roll\", activityUuid, workflow.id)\n  });\n\n  Hooks.on(\"applyActiveEffect\", midiCustomEffect);\n  // Hooks.on(\"preCreateActiveEffect\", checkImmunity); Disabled in lieu of having effect marked suppressed\n  Hooks.on(\"preUpdateItem\", preUpdateItemActorOnUseMacro);\n  Hooks.on(\"preUpdateActor\", preUpdateItemActorOnUseMacro);\n  Hooks.on(\"combatRound\", expirePerTurnBonusActions); // TODO Move this to the update combat hook?\n  Hooks.on(\"combatTurn\", expirePerTurnBonusActions);\n  Hooks.on(\"updateCombatant\", (combatant, updates, options, user) => {\n    if (game.user?.id !== user) return true;\n    if (combatant.actor && updates.initiative) expireRollEffect.bind(combatant.actor)(\"Initiative\", \"none\");\n    return true;\n  });\n\n  // Handle start/end of turn, long/short rest auto triggered activities.\n  Hooks.on(\"preCreateChatMessage\", (message, messageData, options, userId) => {\n    //@ts-expect-error no dnd5e-types\n    if (!message.system?.activations) return true;\n    if (configSettings.activationAutomation === \"chat\") return true;\n    if (configSettings.activationAutomation === \"none\") {\n      //@ts-expect-error no dnd5e-types\n      message.updateSource({ \"system.activations\": [] });\n      if (message.content?.length === 0) return false;\n      return true\n    }\n    try {\n      const activations: Set<string> = new Set();\n      const activityList: any[] = [];\n      //@ts-expect-error\n      const actor = message.system.actor;\n      //@ts-expect-error\n      if (message?.system?.activations?.size > 0) {\n        //@ts-expect-error\n        for (let activation of message.system.activations) {\n          const activity = fromUuidSync(activation, { relative: actor }) as any;\n          const item = activity.item;\n          const itemEnabled = item?.system.equipped !== false && (item?.system.attuned === true || item?.system.attunement !== \"required\");\n          if (itemEnabled && activity?.target?.affects.type === \"self\") activityList.push(activity);\n          else if (itemEnabled) activations.add(activation);\n        }\n      }\n      //@ts-expect-error\n      message.updateSource({ \"system.activations\": activations });\n      const processActivations = async () => {\n        // if (activityList.length > 0) await busyWait(10);\n        for (let activity of activityList) {\n          await completeActivityUse(activity, { midiOptions: { noUseWarning: true } }, {}, {});\n          // await unTimedExecuteAsGM(\"completeActivityUse\", { activityUuid: activity.uuid, actorUuid: actor.uuid, usage: {}, dialog: {}, message: {} });\n        }\n      }\n      processActivations();\n    } catch (err) {\n      const errMessage = \"Activation Automation | preCreateChatMessage error\";\n      error(errMessage, err);\n      TroubleShooter.recordError(err, errMessage);\n    } finally {\n      //@ts-expect-error no dnd5e-types\n      return message.content.length === 0 && message.system.activations.size === 0 ? false : true;\n    }\n  });\n\n  Hooks.once('tidy5e-sheet.ready', (api) => {\n    //@ts-expect-error\n    Hooks.on('tidy5e-sheet.getActivitiesForPlay', (parent, data) => {\n      if (data.activities && data.activities instanceof Array) {\n        // Filter out automationOnly activities and rider activities\n        // Also filter by canUse to preserve dnd5e visibility settings (level limits, etc.) - fixes #1548\n        data.activities = data.activities.filter(activity =>\n          activity?.canUse !== false &&\n          !activity?.midiProperties?.automationOnly &&\n          !parent.flags.dnd5e?.riders?.activity?.includes(activity.id)\n        );\n      }\n    });\n    api.config.itemSummary.registerCommands([\n      {\n        label: i18n(\"midi-qol.buttons.showChatInfo\"),\n        enabled: (params) => true,\n        iconClass: 'fas fa-info-circle',\n        execute: (params) => {\n          if (debugEnabled > 1) log('displayCard', params.item);\n          params.item.displayCard();\n        },\n      },\n      {\n        label: i18n(\"midi-qol.buttons.roll\"),\n        enabled: (params) => [\"weapon\", \"spell\", \"feat\", \"tool\", \"consumable\"].includes(params.item.type),\n        iconClass: 'fas fa-dice-d20',\n        execute: (params) => {\n          if (debugEnabled > 1) log('roll', params.item);\n          Workflow.removeWorkflow(params.item.uuid);\n          params.item.use({ legacy: false, event: params.event, configureDialog: true, systemCard: true }, {}, { systemCard: true });\n        },\n      },\n      {\n        label: i18n(\"midi-qol.buttons.attack\"),\n        enabled: (params) => params.item.system.activities?.some(a => a.hasAttack),\n        iconClass: 'fas fa-dice-d20',\n        execute: (params) => {\n          if (debugEnabled > 1) log('rollAttack', params.item);\n          const activity = params.item.system.activities.find(a => a.hasAttack);\n          if (!activity) return;\n          let configure = !isAutoFastForward(\"attack\");\n          if (areMidiKeysPressed(params.event, \"RollToggle\")) configure = !configure;\n          activity.rollAttack({ event: params.event }, { configure }, { create: true })\n        }\n      },\n      {\n        label: i18n(\"midi-qol.buttons.damage\"),\n        enabled: (params) => params.item.system.activities?.some(a => a.hasDamage),\n        iconClass: 'fas fa-dice-d20',\n        execute: (params) => {\n          if (debugEnabled > 1) log('rollDamage', params.item);\n          const activity = params.item.system.activities.find(a => a.hasDamage);\n          if (!activity) return;\n          let configure = !isAutoFastForward(\"damage\");\n          if (areMidiKeysPressed(params.event, \"RollToggle\")) configure = !configure;\n          activity.rollDamage({ event: params.event }, { configure }, { create: true })\n        }\n      },\n      {\n        label: i18n(\"midi-qol.buttons.versatileDamage\"),\n        enabled: (params) => params.item.isVersatile && params.item.system.activities?.some(a => a.hasDamage),\n        iconClass: 'fas fa-hand-fist',\n        execute: (params) => {\n          if (debugEnabled > 1) log('rollVersatileDamage', params.item);\n          const activity = params.item.system.activities.find(a => a.hasDamage);\n          if (!activity) return;\n          let configure = !isAutoFastForward(\"damage\");\n          if (areMidiKeysPressed(params.event, \"RollToggle\")) configure = !configure;\n          activity.rollDamage({ event: params.event, versatile: true }, { configure }, { create: true })\n        }\n      }\n    ]);\n    return;\n  });\n\n  Hooks.once(\"tidy5e-sheet.ready\", api => {\n    if ((game.user?.role ?? CONST.USER_ROLES.PLAYER) < (configSettings.midiPropertiesTabRole ?? CONST.USER_ROLES.PLAYER)) return;\n\n    api.registerItemHeaderControls?.({\n      controls: [\n        {\n          icon: \"fa-solid fa-gears\", // TODO: better icon?\n          label: \"Midi-QOL\",\n          async onClickAction() {\n            new ItemOnUseMacrosConfig({ document: this.document }).render({ force: true });\n          }\n        }\n      ]\n    });\n  });\n\n  Hooks.on(\"getHeaderControlsActorSheetV2\", (app, controls) => {\n    if (configSettings.allowActorUseMacro) {\n      //@ts-expect-error ApplicationV2.HeaderControlsEntry not properly defined in fvtt-types\n      controls.push({\n        label: i18n(\"midi-qol.ActorOnUseMacros\"),\n        icon: \"fa-solid fa-gears\", // TODO: better icon?\n        onClick: () => {\n          new ActorOnUseMacrosConfig({ document: app.document }).render({ force: true });\n        }\n      });\n    }\n  })\n\n  //@ts-expect-error\n  Hooks.on(\"getHeaderControlsItemSheet5e\", (\n    app: foundry.applications.api.DocumentSheetV2<Item>,\n    controls: foundry.applications.api.ApplicationV2.HeaderControlsEntry[]\n  ) => {\n    if ((game.user?.role ?? CONST.USER_ROLES.PLAYER) < (configSettings.midiPropertiesTabRole ?? CONST.USER_ROLES.PLAYER)) return;\n    // TODO: Localize this to maybe be on-use macros? Needs to be clear it's a midi thing\n    // TODO: permissions\n    const title = \"Midi-qol\";\n    controls.push({\n      label: title,\n      icon: \"fa-solid fa-gears\", // TODO: better icon?\n      // @ts-expect-error v13-ism\n      onClick: () => new ItemOnUseMacrosConfig({ document: app.document }).render({ force: true })\n    });\n  });\n\n  Hooks.on('dropCanvasData', function (canvas, dropData: any) {\n    if (!dragDropTargeting) return true;\n    if (dropData.type !== \"Item\") return true;\n    if (!canvas.grid?.grid) return;\n    let grid_size = canvas.scene?.grid.size ?? 100;\n    // This will work for all grids except gridless\n    // TODO: swap to `getTopLeftPoint` - should simplify some\n    let coords = { x: dropData.x, y: dropData.y };\n    if (canvas.scene?.grid.type !== CONST.GRID_TYPES.GRIDLESS) {\n      coords = canvas.grid.getCenterPoint(coords);\n    }\n    const targetCount = canvas.tokens?.targetObjects({\n      x: coords.x - 5,\n      y: coords.y - 5,\n      height: 10,\n      width: 10,\n    }, { releaseOthers: true });\n    if (targetCount === 0) {\n      ui.notifications?.warn(\"No target selected\");\n      return true;\n    }\n    const item = fromUuidSync(dropData.uuid) as Item | undefined;\n    if (!item) {\n      const message = `actor / item broke for ${dropData?.uuid}`;\n      error(message);\n      TroubleShooter.recordError(new Error(message), message);\n    }\n    //@ts-expect-error no dnd5e types\n    item?.use({ legacy: false }, {}, {});\n    return true;\n  })\n\n  // Set dnd5e version flag and register version-appropriate damage hooks\n  setDnd5e53(foundry.utils.isNewerVersion(game.system.version, \"5.2.99\"));\n  if (isDnd5e53) {\n    Hooks.on(\"dnd5e.preCalculateDamage\", preCalculateDamageHandler_53);\n    Hooks.on(\"dnd5e.calculateDamage\", calculateDamageHandler_53);\n  } else {\n    Hooks.on(\"dnd5e.preCalculateDamage\", preCalculateDamageHandler);\n    Hooks.on(\"dnd5e.calculateDamage\", calculateDamageHandler);\n  }\n}\n\nexport function setupHooks() {\n}\n\nHooks.on(\"dnd5e.preRollDamage\", (rollConfig, dialogConfig, messageConfig) => {\n  if (!rollConfig.subject) return true;\n  // @ts-expect-error no dnd5e-types\n  if (rollConfig.subject.actor && rollConfig.subject.isSpell) {\n    const actorSpellBonus = foundry.utils.getProperty(rollConfig.subject as Actor.Implementation, \"system.bonuses.spell.all.damage\");\n    // @ts-expect-error no dnd5e-types\n    if (actorSpellBonus) rollConfig.rolls[0].parts.push(actorSpellBonus);\n  }\n  // return preRollDamageHook(item, rollConfig)\n  return true;\n});\n\n\n/** Parameters passed to damage calculation functions */\ninterface DamageCalcParams {\n  actor: Actor.Implementation;\n  sourceActor?: Actor.Implementation;\n  damages: DamageDescription[];\n  options: DamageApplicationOptions;\n}\n\n/** Source actor trait codes that can ignore target traits */\nconst SOURCE_TRAIT_CONFIG: Record<string, string> = {\n  idi: \"immunity\",\n  idr: \"resistance\",\n  idv: \"vulnerability\",\n  ida: \"absorption\",\n  idm: \"modification\",\n};\n\n/** Custom resistance type matchers - maps custom resistance names to damage predicates */\ntype DamagePredicate = (damage: DamageDescription, bypasses?: Set<string>) => boolean;\n\nconst CUSTOM_RESISTANCE_MATCHERS: Record<string, { match: DamagePredicate; label: string }> = {\n  spell: {\n    match: (d) => d.properties?.has(\"spell\") ?? false,\n    label: \"midi-qol.SpellDamage\",\n  },\n  \"non-spell\": {\n    match: (d) => !d.properties?.has(\"spell\"),\n    label: \"midi-qol.NonSpellDamage\",\n  },\n  nonSpell: {\n    match: (d) => !d.properties?.has(\"spell\"),\n    label: \"midi-qol.NonSpellDamage\",\n  },\n  magical: {\n    match: (d) => d.properties?.has(\"mgc\") ?? false,\n    label: \"midi-qol.Magical\",\n  },\n  \"non-magical\": {\n    match: (d) => !d.properties?.has(\"mgc\"),\n    label: \"midi-qol.NonMagical\",\n  },\n  nonMagical: {\n    match: (d) => !d.properties?.has(\"mgc\"),\n    label: \"midi-qol.NonMagical\",\n  },\n  physical: {\n    match: (d, bypasses) => {\n      const bypassesPresent = (d.properties ?? new Set()).intersection(bypasses ?? new Set());\n      return (GameSystemConfig.damageTypes[d.type]?.isPhysical ?? false) && bypassesPresent.size === 0;\n    },\n    label: \"midi-qol.Physical\",\n  },\n  \"non-physical\": {\n    match: (d) => !GameSystemConfig.damageTypes[d.type]?.isPhysical,\n    label: \"midi-qol.NonPhysical\",\n  },\n  nonPhysical: {\n    match: (d) => !GameSystemConfig.damageTypes[d.type]?.isPhysical,\n    label: \"midi-qol.NonPhysical\",\n  },\n  \"non-magical-physical\": {\n    match: (d) => (GameSystemConfig.damageTypes[d.type]?.isPhysical ?? false) && !d.properties?.has(\"mgc\"),\n    label: \"midi-qol.NonMagicalPhysical\",\n  },\n  nonMagicalPhysical: {\n    match: (d) => (GameSystemConfig.damageTypes[d.type]?.isPhysical ?? false) && !d.properties?.has(\"mgc\"),\n    label: \"midi-qol.NonMagicalPhysical\",\n  },\n  \"non-silver-physical\": {\n    match: (d) => (GameSystemConfig.damageTypes[d.type]?.isPhysical ?? false) && !d.properties?.has(\"sil\"),\n    label: \"midi-qol.NonSilverPhysical\",\n  },\n  nonSilverPhysical: {\n    match: (d) => (GameSystemConfig.damageTypes[d.type]?.isPhysical ?? false) && !d.properties?.has(\"sil\"),\n    label: \"midi-qol.NonSilverPhysical\",\n  },\n  \"non-adamant-physical\": {\n    match: (d) => (GameSystemConfig.damageTypes[d.type]?.isPhysical ?? false) && !d.properties?.has(\"ada\"),\n    label: \"midi-qol.NonAdamantinePhysical\",\n  },\n  nonAdamantPhysical: {\n    match: (d) => (GameSystemConfig.damageTypes[d.type]?.isPhysical ?? false) && !d.properties?.has(\"ada\"),\n    label: \"midi-qol.NonAdamantinePhysical\",\n  },\n  mwak: {\n    match: (d, bypasses) => {\n      const bypassesPresent = (d.properties ?? new Set()).intersection(bypasses ?? new Set());\n      return (d.properties?.has(\"mwak\") ?? false) && bypassesPresent.size === 0;\n    },\n    label: \"mwak\",\n  },\n  rwak: {\n    match: (d, bypasses) => {\n      const bypassesPresent = (d.properties ?? new Set()).intersection(bypasses ?? new Set());\n      return (d.properties?.has(\"rwak\") ?? false) && bypassesPresent.size === 0;\n    },\n    label: \"rwak\",\n  },\n  msak: {\n    match: (d) => d.properties?.has(\"msak\") ?? false,\n    label: \"msak\",\n  },\n  rsak: {\n    match: (d) => d.properties?.has(\"rsak\") ?? false,\n    label: \"rsak\",\n  },\n  all: {\n    match: () => true,\n    label: \"All\",\n  },\n};\n\nfunction isDRType(type: string): boolean {\n  return [\"none\", \"midi-none\"].includes(type);\n}\n\n/**\n * Set a boolean flag on damage.active in the version-appropriate structure.\n * On dnd5e 5.3+, flags are nested under `type` or `all` (e.g., `active.type.resistance`).\n * On dnd5e 5.2.x, flags are flat (e.g., `active.resistance`).\n * `multiplier` and `threshold` remain flat in both versions — do NOT use this for those.\n */\nfunction setDamageActiveFlag(damage: DamageDescription, flag: string, scope: \"type\" | \"all\" = \"type\"): void {\n  damage.active ??= {};\n  if (isDnd5e53) {\n    damage.active[scope] ??= {};\n    damage.active[scope]![flag] = true;\n  } else {\n    damage.active[flag] = true;\n  }\n}\n\n/** Read a boolean flag from damage.active in the version-appropriate structure. */\nfunction getDamageActiveFlag(damage: DamageDescription, flag: string): boolean {\n  if (isDnd5e53) {\n    return !!(damage.active?.type?.[flag] || damage.active?.all?.[flag]);\n  }\n  return !!damage.active?.[flag];\n}\n\nfunction shouldDowngrade(options: DamageApplicationOptions, type: string): boolean {\n  return options.downgrade === true || (options.downgrade as Set<string>)?.has?.(type) === true;\n}\n\nfunction shouldIgnore(\n  options: DamageApplicationOptions,\n  category: string,\n  type: string,\n  actorTraits?: any,\n  skipDowngrade = false\n): boolean {\n  if (options.ignore === true) return true;\n  if (options.ignore?.[category] === true) return true;\n  if (options.ignore?.[category]?.has?.(type)) return true;\n  if (options.ignore?.[category]?.has?.(\"all\")) return true;\n  if (category === \"immunity\" && shouldDowngrade(options, type) && !skipDowngrade) return true;\n  if (category === \"resistance\" && shouldDowngrade(options, type)) {\n    if (actorTraits?.di?.value?.has(type)) return false;\n    return true;\n  }\n  return false;\n}\n\nfunction hasTraitEffect(\n  actorTraits: any,\n  category: string,\n  type: string,\n  properties?: Set<string>,\n  options?: DamageApplicationOptions\n): boolean {\n  if (category === \"dr\" && shouldDowngrade(options ?? {}, type)) {\n    if (hasTraitEffect(actorTraits, \"di\", type, properties) && !shouldIgnore(options ?? {}, \"immunity\", type, actorTraits, true)) {\n      return true;\n    }\n  }\n  const config = actorTraits[category];\n  if (!config?.value?.has(type)) return false;\n  if (!CONFIG.DND5E.damageTypes[type]?.isPhysical || !properties?.size) return true;\n  return !(config.bypasses?.intersection(properties)?.size);\n}\n\nfunction computeSourceIgnores({ actor, sourceActor, damages, options }: DamageCalcParams): void {\n  if (!sourceActor || options.midiIgnoreComputed) return;\n\n  //@ts-expect-error no dnd5e types\n  const actorTraits = actor.system?.traits ?? {};\n\n  for (const [traitCode, category] of Object.entries(SOURCE_TRAIT_CONFIG)) {\n    //@ts-expect-error no dnd5e types\n    const trait = sourceActor.system?.traits?.[traitCode];\n    if (!trait?.value?.size) continue;\n\n    if (!options.ignore?.[category]) {\n      foundry.utils.setProperty(options, `ignore.${category}`, new Set());\n    }\n\n    for (const dt of Object.keys(GameSystemConfig.damageTypes)) {\n      if (!trait.value.has(dt) && !trait.all) continue;\n      if (!damages.some(di => di.type === dt)) continue;\n\n      if (category === \"immunity\" && hasTraitEffect(actorTraits, \"di\", dt) && !hasTraitEffect(actorTraits, \"dr\", dt)) {\n        if (!(options.downgrade instanceof Set)) options.downgrade = new Set();\n        (options.downgrade as Set<string>).add(dt);\n      } else if (options.ignore) {\n        options.ignore[category].add(dt);\n      }\n    }\n  }\n  options.midiIgnoreComputed = true;\n}\n\nfunction applySaves({ damages, options }: DamageCalcParams): void {\n  const mo = options.midi;\n  if (!mo || options.ignore === true) return;\n\n  for (const damage of damages) {\n    if (isDRType(damage.type)) continue;\n\n    const ignoringSuperSaver = mo.superSaver && shouldIgnore(options, \"superSaver\", damage.type);\n    const ignoringSemiSuperSaver = mo.semiSuperSaver && shouldIgnore(options, \"semiSuperSaver\", damage.type);\n    const ignoringSaved = mo.saved && shouldIgnore(options, \"saved\", damage.type);\n\n    if (mo.superSaver && !ignoringSuperSaver) {\n      setDamageActiveFlag(damage, \"superSaver\");\n    }\n    if (mo.semiSuperSaver && !ignoringSemiSuperSaver && (mo.saveMultiplier ?? 1) !== 1) {\n      setDamageActiveFlag(damage, \"semiSuperSaver\");\n    }\n    if (mo.saved && !ignoringSaved && (mo.saveMultiplier ?? 1) !== 1) {\n      setDamageActiveFlag(damage, \"saved\");\n    }\n\n    if (mo.saved && !ignoringSaved) {\n      const multiplier = ignoringSuperSaver\n        ? configSettings.defaultSaveMultiplier\n        : (mo.superSaver ? 0 : (mo.saveMultiplier ?? 1));\n      damage.value = damage.value * multiplier;\n      foundry.utils.setProperty(damage, \"active.multiplier\", (damage.active?.multiplier ?? 1) * multiplier);\n    } else if (mo.superSaver && !ignoringSuperSaver) {\n      damage.value = damage.value * configSettings.defaultSaveMultiplier;\n      foundry.utils.setProperty(damage, \"active.multiplier\", (damage.active?.multiplier ?? 1) * configSettings.defaultSaveMultiplier);\n    }\n  }\n}\n\nfunction applyUncannyDodge({ actor, damages, options }: DamageCalcParams): void {\n  const mo = options.midi;\n  if (!mo?.uncannyDodge || options.ignore === true) return;\n\n  //@ts-expect-error no dnd5e types\n  const actorTraits = actor.system?.traits ?? {};\n\n  for (const damage of damages) {\n    if (shouldIgnore(options, \"uncannyDodge\", damage.type, actorTraits, true)) continue;\n    setDamageActiveFlag(damage, \"uncannyDodge\");\n    //@ts-expect-error multiplier exists\n    foundry.utils.setProperty(damage, \"multiplier\", (damage.multiplier ?? 1) * 0.5);\n    damage.value = damage.value * 0.5;\n  }\n}\n\nfunction applyTraitMultipliers({ actor, damages, options }: DamageCalcParams): void {\n  if (options.midi?.noCalc) return;\n\n  //@ts-expect-error no dnd5e types\n  const actorTraits = actor.system?.traits ?? {};\n\n  for (const damage of damages) {\n    if (damage.active?.resistance) {\n      damage.value = damage.value * 2 * configSettings.damageResistanceMultiplier;\n      damage.active.multiplier = (damage.active.multiplier ?? 1) * 2 * configSettings.damageResistanceMultiplier;\n    }\n    if (damage.active?.vulnerability) {\n      damage.active.multiplier = (damage.active.multiplier ?? 1) / 2 * configSettings.damageVulnerabilityMultiplier;\n      damage.value = damage.value / 2 * configSettings.damageVulnerabilityMultiplier;\n    }\n    const absorptionValue = actorTraits.da?.[damage.type];\n    if (absorptionValue !== undefined && !shouldIgnore(options, \"absorption\", damage.type, actorTraits)) {\n      const multiplier = Number(absorptionValue) ?? -1;\n      damage.active ??= {};\n      damage.active.multiplier = (damage.active.multiplier ?? 1) * multiplier;\n      damage.value *= multiplier;\n      damage.damage = damage.value;\n      damage.active.absorption = true;\n    }\n  }\n}\n\nfunction applyCustomResistances({ actor, damages, options }: DamageCalcParams): void {\n  const categories = { di: \"immunity\", dr: \"resistance\", dv: \"vulnerability\", da: \"absorption\" };\n  const traitMultipliers = {\n    dr: configSettings.damageResistanceMultiplier,\n    di: configSettings.damageImmunityMultiplier,\n    da: -1,\n    dv: configSettings.damageVulnerabilityMultiplier,\n  };\n\n  //@ts-expect-error no dnd5e types\n  const actorTraits = actor.system?.traits ?? {};\n\n  for (const trait of [\"da\", \"dv\", \"di\", \"dr\"] as const) {\n    const traitData = actorTraits[trait];\n    if (!traitData) continue;\n\n    const bypasses = traitData.bypasses ?? new Set();\n    const customs = [\n      ...((traitData.custom ?? \"\").split(\";\").map((s: string) => s.trim())),\n      ...Object.keys(traitData.midi ?? {}),\n    ].filter((c: string) => c !== \"\");\n\n    for (let custom of customs) {\n      const normalizedCustom = Object.keys(GameSystemConfig.customDamageResistanceTypes ?? {})\n        .find(key => (GameSystemConfig.customDamageResistanceTypes[key] as string).toLowerCase() === custom.toLowerCase()) ?? custom;\n\n      const matcher = CUSTOM_RESISTANCE_MATCHERS[custom] ?? CUSTOM_RESISTANCE_MATCHERS[normalizedCustom];\n\n      for (const damage of damages) {\n        if (damage.type === \"midi-none\") continue;\n        if (GameSystemConfig.healingTypes[damage.type]) continue;\n        if (damage.active?.[categories[trait]]) continue;\n        if (damage.active?.[custom]) continue;\n        if (shouldIgnore(options, categories[trait], damage.type, actorTraits)) continue;\n        if (shouldIgnore(options, custom, damage.type, actorTraits)) continue;\n\n        const matches = matcher\n          ? matcher.match(damage, bypasses)\n          : damage.properties?.has(custom);\n\n        if (!matches) continue;\n\n        damage.active ??= {};\n        damage.active[GameSystemConfig.customDamageResistanceTypes?.[normalizedCustom] ?? custom] = true;\n        damage.active[categories[trait]] = true;\n\n        let multiplier = traitMultipliers[trait];\n        const daOverride = actorTraits.da?.midi?.[custom] ?? actorTraits.da?.midi?.all;\n        if (daOverride && Number.isNumeric(daOverride)) {\n          multiplier = Number(daOverride);\n        }\n\n        damage.active.multiplier = (damage.active.multiplier ?? 1) * multiplier;\n        damage.value = damage.value * multiplier;\n        damage.damage = damage.value;\n      }\n    }\n  }\n}\n\nfunction applyDamageReduction({ actor, damages, options }: DamageCalcParams): boolean {\n  if (options.ignore === true) return true;\n  if (options.ignore?.DR?.has(\"none\") || options.ignore?.DR?.has(\"all\")) return true;\n\n  //@ts-expect-error no dnd5e types\n  const actorTraits = actor.system?.traits ?? {};\n  const specials = Object.keys(actorTraits?.dm?.midi ?? {});\n  if (!specials.length) return true;\n\n  // For DRSaveDr, distribute DR proportionally into individual damage entries\n  // so that subsequent saves and resistance/vulnerability see reduced values.\n  if (configSettings.saveDROrder === \"DRSaveDr\") {\n    return applyDamageReductionInline({ actor, damages, options }, specials, actorTraits);\n  }\n\n  let drAllActives: string[] = [];\n  let dmAll = 0;\n\n  const selectDamages = (predicate: (d: DamageDescription, bypasses?: Set<string>) => boolean): number => {\n    const bypasses = actorTraits.dm?.bypasses ?? new Set();\n    return damages.reduce((total, damage) => {\n      if (damage.value === 0 || isDRType(damage.type)) return total;\n      return total + (predicate(damage, bypasses) ? damage.value : 0);\n    }, 0);\n  };\n\n  for (const special of specials) {\n    if (options.ignore?.modification === true) continue;\n    if (options.ignore?.modification?.has?.(special)) continue;\n\n    const bypasses = actorTraits.dm?.bypasses ?? new Set();\n    const dmRoll = new Roll(`${actorTraits.dm.midi[special]}`, actor.getRollData() as any);\n    const dm = doSyncRoll(dmRoll, `traits.dm.midi.${special}`)?.total ?? 0;\n\n    if (!dm) continue;\n\n    const matcher = CUSTOM_RESISTANCE_MATCHERS[special];\n    let selectedDamage: number;\n    let dmActive = \"\";\n\n    if (matcher) {\n      selectedDamage = selectDamages((d) => !GameSystemConfig.healingTypes[d.type] && matcher.match(d, bypasses));\n      if (selectedDamage > 0) dmActive = i18n(matcher.label);\n    } else {\n      selectedDamage = 0;\n    }\n\n    if (selectedDamage > 0 && dm) {\n      let appliedDm = dm;\n      if (Math.sign(selectedDamage + appliedDm) !== Math.sign(selectedDamage)) {\n        appliedDm = -selectedDamage;\n      }\n\n      if (checkRule(\"maxDRValue\") && (appliedDm < dmAll || dmAll === 0)) {\n        dmAll = appliedDm;\n        drAllActives = [dmActive];\n      } else if (!checkRule(\"maxDRValue\")) {\n        drAllActives.push(dmActive);\n        dmAll += appliedDm;\n      }\n    }\n  }\n\n  if (!dmAll) return true;\n\n  const { totalDamage } = damages.reduce((acc, d) => {\n    if (d.type === \"temphp\") acc.temp += d.value;\n    else if (d.type !== \"midi-none\" && d.type !== \"vitality\") acc.totalDamage += d.value;\n    return acc;\n  }, { totalDamage: 0, temp: 0 });\n\n  if (Math.sign(totalDamage) !== Math.sign(dmAll + totalDamage)) {\n    dmAll = -totalDamage;\n  }\n\n  if (dmAll) {\n    const drEntry: DamageDescription = {\n      type: \"none\",\n      value: dmAll,\n      active: { multiplier: 1 },\n      allActives: drAllActives,\n      properties: new Set(),\n    };\n    setDamageActiveFlag(drEntry, \"DR\");\n    damages.push(drEntry);\n  }\n\n  for (let i = damages.length - 1; i >= 0; i--) {\n    if (damages[i].type === \"midi-none\") {\n      damages.splice(i, 1);\n    }\n  }\n  return true;\n}\n\n/**\n * For DRSaveDr mode: distribute DR proportionally across individual damage entries\n * rather than pushing a separate \"none\" entry. This ensures saves and resistance/vulnerability\n * applied afterward operate on the already-reduced per-type values.\n *\n * Two passes: specific DRs first (non-\"all\"), then dm.midi.all on remaining values.\n */\nfunction applyDamageReductionInline(\n  { actor, damages, options }: DamageCalcParams,\n  specials: string[],\n  actorTraits: any\n): boolean {\n  const useMaxDR = checkRule(\"maxDRValue\");\n  let totalDRApplied = 0;\n  const drAllActives: string[] = [];\n\n  /** Distribute drAmount (negative) proportionally across matching damage entries. Returns actual (negative) amount applied. */\n  function distributeProportionally(drLabel: string, drAmount: number, predicate: (d: DamageDescription, bypasses?: Set<string>) => boolean): number {\n    const bypasses = actorTraits.dm?.bypasses ?? new Set();\n    const matching = damages.filter(d =>\n      d.value > 0 && !isDRType(d.type) && !GameSystemConfig.healingTypes[d.type] && predicate(d, bypasses)\n    );\n    const totalMatching = matching.reduce((sum, d) => sum + d.value, 0);\n    if (totalMatching <= 0 || drAmount >= 0) return 0;\n\n    let effectiveDR = drAmount;\n    if (Math.abs(effectiveDR) > totalMatching) effectiveDR = -totalMatching;\n\n    for (const entry of matching) {\n      const share = (entry.value / totalMatching) * Math.abs(effectiveDR);\n      entry.value -= share;\n    }\n    return effectiveDR;\n  }\n\n  function computeDR(special: string): number {\n    if (options.ignore === true) return 0;\n    if (options.ignore?.modification === true) return 0;\n    if (options.ignore?.modification?.has?.(special)) return 0;\n    const dmRoll = new Roll(`${actorTraits.dm.midi[special]}`, actor.getRollData() as any);\n    return doSyncRoll(dmRoll, `traits.dm.midi.${special}`)?.total ?? 0;\n  }\n\n  // --- Pass 1: Specific DRs (non-\"all\") ---\n  const specificSpecials = specials.filter(s => s !== \"all\");\n\n  if (useMaxDR) {\n    // Pick the specific DR with greatest effective impact\n    let bestDR = 0;\n    let bestSpecial = \"\";\n    let bestMatcher: { match: DamagePredicate; label: string } | undefined;\n\n    for (const special of specificSpecials) {\n      const dm = computeDR(special);\n      if (!dm) continue;\n      const matcher = CUSTOM_RESISTANCE_MATCHERS[special];\n      if (!matcher) continue;\n\n      const bypasses = actorTraits.dm?.bypasses ?? new Set();\n      const selectedDamage = damages\n        .filter(d => d.value > 0 && !isDRType(d.type) && !GameSystemConfig.healingTypes[d.type] && matcher.match(d, bypasses))\n        .reduce((sum, d) => sum + d.value, 0);\n\n      const effectiveImpact = Math.min(Math.abs(dm), selectedDamage);\n      if (effectiveImpact > Math.abs(bestDR)) {\n        bestDR = dm;\n        bestSpecial = special;\n        bestMatcher = matcher;\n      }\n    }\n\n    if (bestDR && bestMatcher) {\n      const applied = distributeProportionally(bestSpecial, bestDR, (d, bypasses) => bestMatcher!.match(d, bypasses));\n      totalDRApplied += Math.abs(applied);\n      drAllActives.push(i18n(bestMatcher.label));\n    }\n  } else {\n    // Stack all specific DRs sequentially (each sees values left by previous)\n    for (const special of specificSpecials) {\n      const dm = computeDR(special);\n      if (!dm) continue;\n      const matcher = CUSTOM_RESISTANCE_MATCHERS[special];\n      if (!matcher) continue;\n\n      const applied = distributeProportionally(special, dm, (d, bypasses) => matcher.match(d, bypasses));\n      if (applied) {\n        totalDRApplied += Math.abs(applied);\n        drAllActives.push(i18n(matcher.label));\n      }\n    }\n  }\n\n  // --- Pass 2: dm.midi.all (after specifics) ---\n  if (specials.includes(\"all\")) {\n    const dm = computeDR(\"all\");\n    if (dm) {\n      if (useMaxDR) {\n        // Compare effective impact of \"all\" against already-applied specific DR\n        const remaining = damages\n          .filter(d => d.value > 0 && !isDRType(d.type) && !GameSystemConfig.healingTypes[d.type])\n          .reduce((sum, d) => sum + d.value, 0);\n        const allImpact = Math.min(Math.abs(dm), remaining);\n\n        if (allImpact > totalDRApplied) {\n          // \"all\" provides more reduction — apply the difference as top-up\n          const topUp = -(allImpact - totalDRApplied);\n          const applied = distributeProportionally(\"all (top-up)\", topUp, () => true);\n          totalDRApplied += Math.abs(applied);\n          drAllActives.push(i18n(CUSTOM_RESISTANCE_MATCHERS[\"all\"].label));\n        }\n      } else {\n        // Stack: apply \"all\" on remaining values\n        const applied = distributeProportionally(\"all\", dm, () => true);\n        if (applied) {\n          totalDRApplied += Math.abs(applied);\n          drAllActives.push(i18n(CUSTOM_RESISTANCE_MATCHERS[\"all\"].label));\n        }\n      }\n    }\n  }\n\n  // Push display-only entry so the damage card/tooltip shows the DR amount\n  if (totalDRApplied) {\n    const drEntry: DamageDescription = {\n      type: \"none\",\n      value: 0,\n      active: { multiplier: 1, inlined: true },\n      allActives: drAllActives,\n      properties: new Set(),\n      displayValue: -totalDRApplied,\n    };\n    setDamageActiveFlag(drEntry, \"DR\");\n    damages.push(drEntry);\n  }\n\n  for (let i = damages.length - 1; i >= 0; i--) {\n    if (damages[i].type === \"midi-none\") damages.splice(i, 1);\n  }\n  return true;\n}\n\nfunction recalculateTotals({ damages }: DamageCalcParams): void {\n  //@ts-expect-error amount exists on damages array\n  damages.amount = 0;\n  //@ts-expect-error temp exists on damages array\n  damages.temp = 0;\n\n  for (const damage of damages) {\n    if (damage.active?.inlined) continue;\n    if (damage.type === \"temphp\") {\n      //@ts-expect-error\n      damages.temp += damage.value;\n    } else {\n      //@ts-expect-error\n      damages.amount += damage.value;\n    }\n  }\n\n  //@ts-expect-error\n  damages.amount = damages.amount > 0 ? Math.floor(damages.amount) : Math.ceil(damages.amount);\n\n  //@ts-expect-error\n  if (damages.amount < 0) {\n    for (const damage of damages) {\n      if (damage.type === \"none\" && damage.active?.DR && !damage.active?.inlined) {\n        //@ts-expect-error\n        damage.value -= damages.amount;\n        //@ts-expect-error\n        damages.amount = 0;\n        break;\n      }\n    }\n  }\n}\n\nfunction calculateTotalDamage({ damages, options }: DamageCalcParams): number {\n  return damages.reduce((total, damage) => {\n    if (damage.active?.inlined) return total;\n    let value = damage.value;\n    if (options.invertHealing !== false && damage.type === \"healing\") value = -value;\n    if (damage.type === \"temphp\" || damage.type === \"midi-none\") value = 0;\n    return total + value;\n  }, 0);\n}\n\n// --- dnd5e 5.3+ variants ---\n\nfunction applyTraitMultipliers_53({ actor, damages, options }: DamageCalcParams): void {\n  if (options.midi?.noCalc) return;\n\n  //@ts-expect-error no dnd5e types\n  const actorTraits = actor.system?.traits ?? {};\n\n  for (const damage of damages) {\n    const hasResistance = damage.active?.type?.resistance || damage.active?.all?.resistance;\n    const hasVulnerability = damage.active?.type?.vulnerability || damage.active?.all?.vulnerability;\n    if (hasResistance) {\n      damage.value = damage.value * 2 * configSettings.damageResistanceMultiplier;\n      damage.active ??= {};\n      damage.active.multiplier = (damage.active.multiplier ?? 1) * 2 * configSettings.damageResistanceMultiplier;\n    }\n    if (hasVulnerability) {\n      damage.active ??= {};\n      damage.active.multiplier = (damage.active.multiplier ?? 1) / 2 * configSettings.damageVulnerabilityMultiplier;\n      damage.value = damage.value / 2 * configSettings.damageVulnerabilityMultiplier;\n    }\n    const absorptionValue = actorTraits.da?.[damage.type];\n    if (absorptionValue !== undefined && !shouldIgnore(options, \"absorption\", damage.type, actorTraits)) {\n      const multiplier = Number(absorptionValue) ?? -1;\n      damage.active ??= {};\n      damage.active.multiplier = (damage.active.multiplier ?? 1) * multiplier;\n      damage.value *= multiplier;\n      damage.damage = damage.value;\n      setDamageActiveFlag(damage, \"absorption\");\n    }\n  }\n}\n\nfunction applyCustomResistances_53({ actor, damages, options }: DamageCalcParams): void {\n  const categories = { di: \"immunity\", dr: \"resistance\", dv: \"vulnerability\", da: \"absorption\" };\n  const traitMultipliers = {\n    dr: configSettings.damageResistanceMultiplier,\n    di: configSettings.damageImmunityMultiplier,\n    da: -1,\n    dv: configSettings.damageVulnerabilityMultiplier,\n  };\n\n  //@ts-expect-error no dnd5e types\n  const actorTraits = actor.system?.traits ?? {};\n\n  for (const trait of [\"da\", \"dv\", \"di\", \"dr\"] as const) {\n    const traitData = actorTraits[trait];\n    if (!traitData) continue;\n\n    const bypasses = traitData.bypasses ?? new Set();\n    const customs = [\n      ...((traitData.custom ?? \"\").split(\";\").map((s: string) => s.trim())),\n      ...Object.keys(traitData.midi ?? {}),\n    ].filter((c: string) => c !== \"\");\n\n    for (let custom of customs) {\n      const normalizedCustom = Object.keys(GameSystemConfig.customDamageResistanceTypes ?? {})\n        .find(key => (GameSystemConfig.customDamageResistanceTypes[key] as string).toLowerCase() === custom.toLowerCase()) ?? custom;\n\n      const matcher = CUSTOM_RESISTANCE_MATCHERS[custom] ?? CUSTOM_RESISTANCE_MATCHERS[normalizedCustom];\n\n      for (const damage of damages) {\n        if (damage.type === \"midi-none\") continue;\n        if (GameSystemConfig.healingTypes[damage.type]) continue;\n        // Check nested (dnd5e 5.3+) active keys using helper\n        if (getDamageActiveFlag(damage, categories[trait])) continue;\n        if (getDamageActiveFlag(damage, custom)) continue;\n        if (shouldIgnore(options, categories[trait], damage.type, actorTraits)) continue;\n        if (shouldIgnore(options, custom, damage.type, actorTraits)) continue;\n\n        const matches = matcher\n          ? matcher.match(damage, bypasses)\n          : damage.properties?.has(custom);\n\n        if (!matches) continue;\n\n        setDamageActiveFlag(damage, GameSystemConfig.customDamageResistanceTypes?.[normalizedCustom] ?? custom);\n        setDamageActiveFlag(damage, categories[trait]);\n\n        damage.active ??= {};\n        let multiplier = traitMultipliers[trait];\n        const daOverride = actorTraits.da?.midi?.[custom] ?? actorTraits.da?.midi?.all;\n        if (daOverride && Number.isNumeric(daOverride)) {\n          multiplier = Number(daOverride);\n        }\n\n        damage.active.multiplier = (damage.active.multiplier ?? 1) * multiplier;\n        damage.value = damage.value * multiplier;\n        damage.damage = damage.value;\n      }\n    }\n  }\n}\n\nfunction recalculateTotals_53({ damages }: DamageCalcParams): void {\n  //@ts-expect-error amount exists on damages array\n  damages.amount = 0;\n  //@ts-expect-error temp exists on damages array\n  damages.temp = 0;\n  //@ts-expect-error tempMax exists on damages array\n  damages.tempMax = 0;\n\n  for (const damage of damages) {\n    if (damage.active?.inlined) continue;\n    if (damage.type === \"temphp\") {\n      //@ts-expect-error\n      damages.temp += damage.value;\n    } else if (damage.type === \"maximum\") {\n      //@ts-expect-error\n      damages.tempMax += damage.value;\n    } else {\n      //@ts-expect-error\n      damages.amount += damage.value;\n    }\n  }\n\n  //@ts-expect-error\n  damages.amount = damages.amount > 0 ? Math.floor(damages.amount) : Math.ceil(damages.amount);\n\n  //@ts-expect-error\n  if (damages.amount < 0) {\n    for (const damage of damages) {\n      if (damage.type === \"none\" && getDamageActiveFlag(damage, \"DR\") && !damage.active?.inlined) {\n        //@ts-expect-error\n        damage.value -= damages.amount;\n        //@ts-expect-error\n        damages.amount = 0;\n        break;\n      }\n    }\n  }\n}\n\nfunction calculateTotalDamage_53({ damages, options }: DamageCalcParams): number {\n  return damages.reduce((total, damage) => {\n    if (damage.active?.inlined) return total;\n    let value = damage.value;\n    if (options.invertHealing !== false && damage.type === \"healing\") value = -value;\n    if (damage.type === \"temphp\" || damage.type === \"midi-none\" || damage.type === \"maximum\") value = 0;\n    return total + value;\n  }, 0);\n}\n\nfunction preCalculateDamageHandler(actor: Actor.Implementation, damages: DamageDescription[], options: DamageApplicationOptions) {\n  try {\n    if (options.midi?.noCalc) return true;\n\n    const sourceActor = options.midi?.sourceActorUuid\n      ? fromUuidSync(options.midi.sourceActorUuid) as Actor.Implementation | undefined\n      : undefined;\n    const params = { actor, sourceActor, damages, options };\n\n    const saveDROrder = configSettings.saveDROrder;\n    computeSourceIgnores(params);\n    applyUncannyDodge(params);\n\n    // Apply saves and/or DR based on order setting\n    if (saveDROrder === \"DRSaveDr\") {\n      if (!applyDamageReduction(params)) return false;\n    } else if ([\"SaveDrDR\", \"SaveDRDr\"].includes(saveDROrder)) {\n      applySaves(params);\n      if (saveDROrder === \"SaveDRDr\") {\n        if (!applyDamageReduction(params)) return false;\n      }\n    }\n\n    foundry.utils.setProperty(options, \"midi.totalDamage\", calculateTotalDamage(params));\n    if (Hooks.call(\"midi-qol.dnd5ePreCalculateDamage\", actor, damages, options) === false) return false;\n  } catch (err) {\n    const message = `Error in preCalculateDamage`;\n    error(message, err);\n    TroubleShooter.recordError(err, message);\n  }\n  return true;\n}\n\nfunction calculateDamageHandler(actor: Actor.Implementation, damages: DamageDescription[], options: DamageApplicationOptions) {\n  try {\n    if (options.midi?.noCalc) return true;\n\n    const sourceActor = options.midi?.sourceActorUuid\n      ? fromUuidSync(options.midi.sourceActorUuid) as Actor.Implementation | undefined\n      : undefined;\n    const params = { actor, sourceActor, damages, options };\n\n    const saveDROrder = configSettings.saveDROrder;\n\n    // Apply saves if not already done\n    if (saveDROrder === \"DRSaveDr\") {\n      applySaves(params);\n    }\n\n    applyTraitMultipliers(params);\n    applyCustomResistances(params);\n\n    // Apply DR if not already done\n    if (saveDROrder === \"SaveDrDR\") {\n      if (!applyDamageReduction(params)) return false;\n    }\n\n    recalculateTotals(params);\n    if (Hooks.call(\"midi-qol.dnd5eCalculateDamage\", actor, damages, options) === false) return false;\n  } catch (err) {\n    error(err);\n  }\n  return true;\n}\n\nfunction preCalculateDamageHandler_53(actor: Actor.Implementation, damages: DamageDescription[], options: DamageApplicationOptions) {\n  try {\n    if (options.midi?.noCalc) return true;\n\n    const sourceActor = options.midi?.sourceActorUuid\n      ? fromUuidSync(options.midi.sourceActorUuid) as Actor.Implementation | undefined\n      : undefined;\n    const params = { actor, sourceActor, damages, options };\n\n    const saveDROrder = configSettings.saveDROrder;\n    computeSourceIgnores(params);\n    applyUncannyDodge(params);\n\n    // Apply saves and/or DR based on order setting\n    if (saveDROrder === \"DRSaveDr\") {\n      if (!applyDamageReduction(params)) return false;\n    } else if ([\"SaveDrDR\", \"SaveDRDr\"].includes(saveDROrder)) {\n      applySaves(params);\n      if (saveDROrder === \"SaveDRDr\") {\n        if (!applyDamageReduction(params)) return false;\n      }\n    }\n\n    foundry.utils.setProperty(options, \"midi.totalDamage\", calculateTotalDamage_53(params));\n    if (Hooks.call(\"midi-qol.dnd5ePreCalculateDamage\", actor, damages, options) === false) return false;\n  } catch (err) {\n    const message = `Error in preCalculateDamage`;\n    error(message, err);\n    TroubleShooter.recordError(err, message);\n  }\n  return true;\n}\n\nfunction calculateDamageHandler_53(actor: Actor.Implementation, damages: DamageDescription[], options: DamageApplicationOptions) {\n  try {\n    if (options.midi?.noCalc) return true;\n\n    const sourceActor = options.midi?.sourceActorUuid\n      ? fromUuidSync(options.midi.sourceActorUuid) as Actor.Implementation | undefined\n      : undefined;\n    const params = { actor, sourceActor, damages, options };\n\n    const saveDROrder = configSettings.saveDROrder;\n\n    // Apply saves if not already done\n    if (saveDROrder === \"DRSaveDr\") {\n      applySaves(params);\n    }\n\n    applyTraitMultipliers_53(params);\n    applyCustomResistances_53(params);\n\n    // Apply DR if not already done\n    if (saveDROrder === \"SaveDrDR\") {\n      if (!applyDamageReduction(params)) return false;\n    }\n\n    recalculateTotals_53(params);\n    if (Hooks.call(\"midi-qol.dnd5eCalculateDamage\", actor, damages, options) === false) return false;\n  } catch (err) {\n    error(err);\n  }\n  return true;\n}\n\nHooks.on(\"dnd5e.preApplyDamage\", (actor, amount, updates, options) => {\n  if (updates[\"system.attributes.hp.temp\"]) updates[\"system.attributes.hp.temp\"] = Math.floor(updates[\"system.attributes.hp.temp\"]);\n\n  // Handle vitality overflow when HP reaches 0 (for actor.applyDamage() calls)\n  // Skip if midi-qol already handled vitality (e.g., via workflow with direct vitality damage + overflow)\n  // This hook handles non-midi damage calls (actor.applyDamage()) that need vitality overflow\n  const vitalityItem = getVitalityItem(actor);\n  if (amount > 0 && vitalityItem && !options.midiVitalityHandled) {\n    // @ts-expect-error no dnd5e-types\n    const currentHP = actor.system.attributes.hp.value ?? 0;\n    // @ts-expect-error no dnd5e-types\n    const currentTempHP = actor.system.attributes.hp.temp ?? 0;\n    const totalHP = currentTempHP + currentHP;\n\n    // Check if damage exceeds total HP (causes overflow into vitality)\n    if (amount > totalHP) {\n      const overflowDamage = amount - totalHP;\n\n      // @ts-expect-error uses exists on items with uses\n      const currentSpent = vitalityItem.system.uses?.spent ?? 0;\n      // @ts-expect-error uses exists on items with uses\n      const maxUses = vitalityItem.system.uses?.max ?? 0;\n      const newSpent = Math.min(maxUses, currentSpent + overflowDamage);\n\n      // Mark that vitality was handled to prevent double-counting in preUpdateActor\n      options.midiVitalityHandled = true;\n      // Flag that vitality update is pending so updateActor hook skips checkWounded\n      options.midiVitalityUpdatePending = true;\n\n      // Queue vitality item update (will execute after actor update)\n      // Use setTimeout to ensure it happens after the actor update completes\n      // Note: checkWounded is called by the updateItem hook when vitality changes,\n      // so we don't need to call it explicitly here\n      setTimeout(async () => {\n        // @ts-expect-error item update for uses.spent\n        await vitalityItem.update({ \"system.uses.spent\": newSpent });\n      }, 100);\n    }\n  }\n\n  if (options.midi) {\n    foundry.utils.setProperty(options, \"midi.amount\", amount);\n    foundry.utils.setProperty(options, \"midi.updates\", updates);\n  }\n  return true;\n});\n\nHooks.on(\"dnd5e.preRollConcentration\", (rollConfig, dialogConfig, messageConfig) => {\n  // Advantage/disadvantage for concentration saves is now handled by rollTypeHandlers[\"concentration\"]\n  // in patching.ts, which composes with the save handler and adds concentration-specific flags.\n  // This hook only needs to handle the noConcentrationCheck workflow option.\n  if (rollConfig.workflowOptions?.noConcentrationCheck) return false;\n  return true;\n})\n\nHooks.on(\"dnd5e.rollConcentration\", (rolls, { subject }) => {\n  if (!subject || !(subject instanceof CONFIG.Actor.documentClass)) {\n    const message = \"dnd5e.rollConcentration hook called with non-actor\";\n    TroubleShooter.recordError(new Error(message), message);\n    error(message, subject);\n    return;\n  }\n  if (rolls instanceof Roll) rolls = [rolls];\n  // Assume concentration fails if any of the concentration rolls fail.\n  let failed = false;\n  for (let roll of rolls) {\n    // @ts-expect-error no dnd5e-types\n    if (roll.isFailure) failed = true;\n  }\n  if (configSettings.keepRollStats) {\n    gameStats.addConcentrationResult(subject, !failed);\n  }\n  // The \"item\" path handles criticalSaves and endConcentration via its own workflow/macros\n  if (configSettings.doConcentrationCheck === \"item\") return;\n  for (let roll of rolls) {\n    // @ts-expect-error no dnd5e-types\n    if (checkRule(\"criticalSaves\") && roll.isCritical) roll.options.success = true;\n  }\n  if (configSettings.removeConcentration && failed) {\n    // @ts-expect-error no dnd5e-types\n    subject.endConcentration();\n  }\n});\n\n// Set midi-qol flags on activity templates for use during preview and placement.\n// When constrainTemplatePlacement is enabled:\n// - Sets sourceTokenUuid for all templates\n// - Sets maxRange for templates with limited range (clamps placement during preview)\n// - Sets anchorToToken for cone/ray templates with range Self/None\nHooks.on(\"dnd5e.preCreateActivityTemplate\", (activity, templateData) => {\n  templateData.distance! += 0.000001; // Make the template fractionally larger to avoid rounding errors\n\n  if (!configSettings.constrainTemplatePlacement) return true;\n\n  // Get the caster's token and store its UUID for later use\n  const actor = activity.actor;\n  const token = actor ? tokenForActor(actor) : undefined;\n  if (token) {\n    foundry.utils.setProperty(templateData, \"flags.midi-qol.sourceTokenUuid\", token.document.uuid);\n  }\n\n  const range = activity.range;\n  const rangeUnits = range?.units;\n\n  // Calculate and store max range for templates that should be range-limited\n  // Only set maxRange for range types that should be limited (not self/none/any)\n  if (rangeUnits && rangeUnits !== \"self\" && rangeUnits !== \"none\" && rangeUnits !== \"any\") {\n    let maxRange = range.long || range.value;\n    if (maxRange && maxRange > 0) {\n      if (rangeUnits === \"touch\") maxRange = canvas?.dimensions?.distance ?? 5;\n      else maxRange = rangeToSceneUnits(maxRange, rangeUnits);\n      foundry.utils.setProperty(templateData, \"flags.midi-qol.maxRange\", maxRange);\n    }\n  }\n\n  // Check if this template should be anchored to the caster's token\n  // Cones and rays with range self/none/0 should be anchored\n  const templateType = templateData.t;\n  if (templateType === \"cone\" || templateType === \"ray\") {\n    const isSelfRange = rangeUnits === \"self\"\n      || rangeUnits === \"none\"\n      || (!range?.value && !range?.long && rangeUnits !== \"touch\");\n\n    if (isSelfRange) {\n      foundry.utils.setProperty(templateData, \"flags.midi-qol.anchorToToken\", true);\n    }\n  }\n  return true;\n});\n\n// Check template placement range - prevent placing templates beyond the activity's range\n// This is a safety check - the preview movement should already clamp position within range\nHooks.on(\"preCreateMeasuredTemplate\", (templateDoc: MeasuredTemplateDocument.Implementation, templateData: MeasuredTemplateDocument.CreateData, options: object, userId: string) => {\n  if (userId !== game.user?.id) return true;\n\n  // Use pre-set midi-qol flags from preCreateActivityTemplate hook\n  const midiFlags = templateDoc.flags?.[MODULE_ID] as { maxRange?: number, sourceTokenUuid?: string } | undefined;\n  const maxRange = midiFlags?.maxRange;\n  if (!maxRange) return true;\n\n  const sourceTokenUuid = midiFlags?.sourceTokenUuid;\n  if (!sourceTokenUuid) return true;\n\n  // Get the source token\n  const tokenDoc = fromUuidSync(sourceTokenUuid) as TokenDocument.Implementation | null;\n  const token = tokenDoc?.object;\n  if (!token) return true;\n\n  // Calculate raw grid distance from token perimeter to template position\n  const templateX = templateDoc.x;\n  const templateY = templateDoc.y;\n  if (templateX === undefined || templateY === undefined) return true;\n\n  const poly = getTokenPerimeterPolygon(token);\n  const closest = closestPointOnPerimeter(poly, templateX, templateY);\n  const distance = measurePointDistance(closest, { x: templateX, y: templateY });\n  // Allow half a grid square tolerance for grid snapping moving the position slightly beyond range\n  const tolerance = (canvas?.dimensions?.distance ?? 5) / 2;\n  if (distance <= maxRange + tolerance) return true;\n\n  // Out of range - notify and cancel\n  ui.notifications?.warn(i18n(\"midi-qol.TemplateOutOfRange\"));\n  return false;\n});\n\n// insert midi initiative changes into the initiative config.\nHooks.on(\"dnd5e.preConfigureInitiative\", (actor, rollConfig) => {\n  let { parts, data, options } = rollConfig;\n  //@ts-expect-error no dnd5e-types\n  const init: string = actor.system.attributes.init.value ?? \"dex\";\n  const conditionData = createConditionData({ workflow: undefined, target: undefined, actor: actor });\n\n  // Check for advantage\n  if (evalAllConditions(actor, \"flags.midi-qol.advantage.all\", conditionData)\n    || evalAllConditions(actor, \"flags.midi-qol.advantage.check.all\", conditionData)\n    || evalAllConditions(actor, `flags.midi-qol.advantage.check.${init}`, conditionData)\n    || evalAllConditions(actor, `flags.${game.system?.id}.initiativeAdv`, conditionData)) {\n    options.advantage ||= true;\n  }\n\n  // Check for disadvantage\n  if (evalAllConditions(actor, \"flags.midi-qol.disadvantage.all\", conditionData)\n    || evalAllConditions(actor, \"flags.midi-qol.disadvantage.check.all\", conditionData)\n    || evalAllConditions(actor, `flags.midi-qol.disadvantage.check.${init}`, conditionData)\n    || evalAllConditions(actor, `flags.${game.system?.id}.initiativeDisadv`, conditionData)) {\n    options.disadvantage ||= true;\n  }\n\n  // Check for noAdvantage (prevents advantage)\n  if (evalAllConditions(actor, \"flags.midi-qol.noAdvantage.all\", conditionData)\n    || evalAllConditions(actor, \"flags.midi-qol.noAdvantage.initiative\", conditionData)\n    || evalAllConditions(actor, `flags.${game.system?.id}.initiativeNoAdv`, conditionData)) {\n    options.advantage = false;\n  }\n\n  // Check for noDisadvantage (prevents disadvantage)\n  if (evalAllConditions(actor, \"flags.midi-qol.noDisadvantage.all\", conditionData)\n    || evalAllConditions(actor, \"flags.midi-qol.noDisadvantage.initiative\", conditionData)\n    || evalAllConditions(actor, `flags.${game.system?.id}.initiativeNoDisadv`, conditionData)) {\n    options.disadvantage = false;\n  }\n\n  if (foundry.utils.getProperty(actor, `flags.${game.system?.id}.initiativeHalfProficiency`) && !parts.includes(\"@prof\")) {\n    parts.push(\"@prof\");\n    // @ts-expect-error\n    data.prof = new globalThis.dnd5e.documents.Proficiency(data.attributes.prof, 0.5, false);\n  }\n});\n\n\n","import { debug, i18n, error, warn, busyWait, allAttackTypes, debugEnabled, overTimeEffectsToDelete, getStaticID, savedOverTimeEffectsToDelete, GameSystemConfig, systemConcentrationId, MQItemMacroLabel, MODULE_ID, midiReactionEffect, midiBonusActionEffect, MQActivityMacroLabel, ceInterface } from \"../midi-qol.js\";\nimport { configSettings, autoRemoveTargets, checkRule, criticalDamage, criticalDamageGM, checkMechanic, safeGetGameSetting, debounceInterval, autoRollDamageOptions, showReactionAttackRollOptions, shouldDisplaySaveDC } from \"./settings.js\";\nimport { log } from \"../midi-qol.js\";\nimport { AttributionEntry, AttributionMap, AttributionType, AugmentedEvent, DummyWorkflow, Workflow, WorkflowOptions, WorkflowRollOptions } from \"./Workflow.js\";\nimport { preferredActiveGM, prepareDamageListToJSON, socketlibSocket, timedAwaitExecuteAsGM, unTimedExecuteAsGM } from \"./GMAction.js\";\nimport { dice3dEnabled, installedModules } from \"./setupModules.js\";\nimport { concentrationCheckItemDisplayName } from \"./Hooks.js\";\n\nimport { OnUseMacros } from \"./apps/Item.js\";\nimport { TroubleShooter } from \"./apps/TroubleShooter.js\";\nimport { MidiActivityChoiceDialog } from \"./apps/MidiActivityChoiceDialog.js\";\nimport { Activity, ActivityUseConfiguration, CalcDamageOptions, DamageDescription, DamageListEntry, PreComputedAdvantageData, PreSetupDamageListEntry, RollDialogConfig, RollMessageConfig, TokenOrDocument, DND5ETargetDescriptor, SaveDetails } from \"../globals.js\";\n\nimport Token = foundry.canvas.placeables.Token;\nimport { AnyMutableObject, AnyObject } from \"fvtt-types/utils\";\n\nconst { ApplicationV2, DialogV2, HandlebarsApplicationMixin } = foundry.applications.api;\n\nconst defaultTimeout = 30;\nexport type ReactionItemReference = { itemName: string, itemId: string, actionName: string, img: string, id: string, uuid: string } | String;\nexport type ReactionItem = { itemName: string, itemId: string, actionName: string, img: string, id: string, uuid: string, baseItem: Item } | Activity;\n\n// Helper to create full flag path from a short flag name\nexport function midiFlag(flag: string): string {\n  return `flags.${MODULE_ID}.${flag}`;\n}\n\nexport function getDamageType(flavorString: string = ''): string | undefined {\n  if (flavorString === '') return \"none\";\n  if (GameSystemConfig.damageTypes[flavorString] !== undefined) {\n    return flavorString;\n  }\n  if (GameSystemConfig.healingTypes[flavorString] !== undefined) {\n    return flavorString;\n  }\n  const validDamageTypes = Object.entries(GameSystemConfig.damageTypes).map(([key, { label }]) => [label.toLowerCase(), key]);\n  const validHealingTypes = Object.entries(GameSystemConfig.healingTypes).map(([key, { label }]) => [label.toLowerCase(), key]);\n  const allTypes = Object.fromEntries(validDamageTypes.concat(validHealingTypes));\n  return allTypes[flavorString.toLowerCase()];\n}\n\n// This doesn't seem to be used anywhere\n// export function getDamageFlavor(damageType): string | undefined {\n//   const validDamageTypes = Object.entries(GameSystemConfig.damageTypes).deepFlatten().concat(Object.entries(GameSystemConfig.healingTypes).deepFlatten())\n//   const allDamageTypeEntries = Object.entries(GameSystemConfig.damageTypes).concat(Object.entries(GameSystemConfig.healingTypes));\n//   if (validDamageTypes.includes(damageType)) {\n//     const damageEntry: any = allDamageTypeEntries?.find(e => e[0] === damageType);\n//     return damageEntry ? damageEntry[1].label : damageType\n//   }\n//   return undefined;\n// }\n\n/**\n*  Modifies the provided damageItem! For use during the isDamaged macro passes.\n*/\nexport function modifyDamageBy({\n  damageItem,\n  value,\n  multiplier = 1,\n  type = \"none\",\n  reason\n}: {\n  damageItem: DamageListEntry;\n  value: number;\n  multiplier: number;\n  type: string;\n  reason?: string;\n}): {} {\n  //reminder: For use during the isDamaged macro passes ONLY!\n  if (!damageItem || foundry.utils.isEmpty(damageItem)) return {};\n  if (!value) return {};\n  const damageModification = { value, active: { multiplier }, type, properties: new Set<string>() };\n  if (!configSettings.useDamageDetail) damageItem.hpDamage += value;\n  damageItem.damageDetail.push(damageModification);\n  if (reason) damageItem.details.push(reason);\n  return damageModification;\n}\n\nexport function createDamageDetail({\n  roll,\n  activity,\n  defaultType = MidiQOL.MQdefaultDamageType\n}: {\n  roll: Roll | Roll[];\n  activity: Activity | null;\n  defaultType: string;\n}): DamageDescription[] {\n  let rolls = roll;\n  if (rolls instanceof Roll) {\n    rolls = [rolls];\n  }\n  if (activity?.damage?.parts[0]) {\n    defaultType = activity.damage.parts[0].types.first() ?? defaultType;\n  }\n  rolls = rolls.map(r => {\n    r = foundry.utils.deepClone(r);\n    // @ts-expect-error no dnd5e-types\n    if (!r.options.type) r.options.type = defaultType;\n    return r;\n  })\n\n  //@ts-expect-error no dnd5e-types\n  const aggregatedRolls: CONFIG.Dice.DamageRoll[] = game.system.dice.aggregateDamageRolls(rolls, { respectProperties: true });\n  let detail = aggregatedRolls.map(roll => {\n    const value = roll.options.type !== \"healing\" ? Math.max(0, roll.total) : roll.total;\n    return { value, damage: value, type: roll.options.type as string, formula: roll.formula as string, properties: new Set(roll.options.properties as string[] ?? []) }\n  });\n  return detail;\n}\n\nexport function getOrCreateTokenForActor(actor?: Actor.Implementation) {\n  if (!actor) return;\n  if (actor.token?.object) return actor.token.object; //actor.token is a token document.\n  const token = tokenForActor(actor);\n  if (token) return token;\n  const tokenData = actor.prototypeToken.toObject();\n  tokenData.actorId = actor.id!;\n  const cls = globalThis.getDocumentClass(\"Token\");\n  // TODO check this - not sure if actor is set correctly\n  const tokenDocument = new cls(tokenData, { parent: canvas.scene });\n  return new CONFIG.Token.objectClass(tokenDocument);\n}\n\nexport function getOrCreateTokenForActorAsSet(actor: Actor.Implementation): Set<Token.Implementation> {\n  const selfTarget = getOrCreateTokenForActor(actor);\n  if (selfTarget) return new Set([selfTarget]);\n  return new Set();\n}\n\n/** \n * Work out the appropriate multiplier for DamageTypeString on actor\n * If configSettings.damageImmunities are not being checked always return 1\n * \n */\n\nexport let getTraitMult = (actor: Actor.Implementation, dmgTypeString: string, item: Item.Implementation, damageProperties: string[] = []): number => {\n  dmgTypeString = getDamageType(dmgTypeString) ?? \"\";\n  let totalMult = 1;\n  if ([\"healing\", \"temphp\"].includes(dmgTypeString)) totalMult = -1;\n  if (dmgTypeString === \"midi-none\") return 0;\n  if (configSettings.damageImmunities === \"none\") return totalMult;\n  const physicalDamageTypes = Object.keys(GameSystemConfig.damageTypes).filter(dt => GameSystemConfig.damageTypes[dt].isPhysical);\n\n  if (dmgTypeString !== \"\") {\n    // if not checking all damage counts as magical\n    // @ts-expect-error no dnd5e-types\n    let magicalDamage = item.system.magicAvailable;\n    // @ts-expect-error no dnd5e-types\n    magicalDamage ??= item?.system.properties?.has(\"mgc\");\n    // @ts-expect-error no dnd5e-types\n    magicalDamage ||= (configSettings.requireMagical === \"off\" && (item?.system.magicalBonus > 0 || item?.system.attackBonus > 0));\n    // @ts-expect-error no dnd5e-types\n    magicalDamage ||= (configSettings.requireMagical === \"off\" && item?.type !== \"weapon\");\n    // @ts-expect-error no dnd5e-types\n    magicalDamage ||= (configSettings.requireMagical === \"nonspell\" && item?.type === \"spell\");\n    magicalDamage ||= damageProperties.includes(\"mgc\");\n    // @ts-expect-error no dnd5e-types\n    const silverDamage = item?.system.properties.has(\"sil\") || magicalDamage || damageProperties.includes(\"sil\");\n    // @ts-expect-error no dnd5e-types\n    const adamantineDamage = item?.system.properties?.has(\"ada\") || damageProperties.includes(\"ada\");\n    const physicalDamage = physicalDamageTypes.includes(dmgTypeString);\n\n    let traitList = [\n      { type: \"di\", mult: configSettings.damageImmunityMultiplier },\n      { type: \"dr\", mult: configSettings.damageResistanceMultiplier },\n      { type: \"dv\", mult: configSettings.damageVulnerabilityMultiplier }];\n\n    for (let { type, mult } of traitList) {\n      // @ts-expect-error no dnd5e-types\n      if (!actor.system.traits) continue;\n      // @ts-expect-error no dnd5e-types\n      let trait = foundry.utils.deepClone(actor.system.traits[type].value);\n      // trait = trait.map(dt => dt.toLowerCase());\n      let customs: string[] = [];\n      // @ts-expect-error no dnd5e-types\n      if (actor.system.traits[type].custom?.length > 0) {\n        // @ts-expect-error no dnd5e-types\n        customs = actor.system.traits[type].custom.split(\";\").map(s => s.trim())\n      }\n\n      // @ts-expect-error no dnd5e-types\n      const bypasses = actor.system.traits[type].bypasses ?? new Set();\n      // @ts-expect-error no dnd5e-types\n      const itemProperties = item?.system.properties ?? new Set()\n      let bypassTrait = itemProperties.intersection(bypasses).size > 0;\n      if (physicalDamage && bypassTrait) continue;\n      // process new custom field versions\n      if (![\"healing\", \"temphp\"].includes(dmgTypeString)) {\n        if (customs.includes(dmgTypeString) || trait.has(dmgTypeString)) {\n          totalMult = totalMult * mult;\n          continue;\n        }\n        if (!magicalDamage && (trait.has(\"nonmagic\") || customs.includes(GameSystemConfig.customDamageResistanceTypes?.nonmagic))) {\n          totalMult = totalMult * mult;\n          continue;\n        } else if (!magicalDamage && physicalDamage && (trait.has(\"physical\") || customs.includes(GameSystemConfig.customDamageResistanceTypes?.physical))) {\n          totalMult = totalMult * mult;\n          continue;\n        } else if (magicalDamage && trait.has(\"magic\")) {\n          totalMult = totalMult * mult;\n          continue;\n        }\n\n        // @ts-expect-error no dnd5e-types\n        else if (item?.type === \"spell\" && trait.has(\"spell\")) {\n          totalMult = totalMult * mult;\n          continue;\n        }\n        if (customs.length > 0) {\n          if (!magicalDamage && (customs.includes(\"nonmagic\") || customs.includes(GameSystemConfig.customDamageResistanceTypes?.nonmagic))) {\n            totalMult = totalMult * mult;\n            continue;\n          } else if (!magicalDamage && physicalDamage && (customs.includes(\"physical\") || customs.includes(GameSystemConfig.customDamageResistanceTypes?.physical))) {\n            totalMult = totalMult * mult;\n            continue;\n          } else if (magicalDamage && (customs.includes(\"magic\") || customs.includes(GameSystemConfig.customDamageResistanceTypes.magic))) {\n            totalMult = totalMult * mult;\n            continue;\n            // @ts-expect-error no dnd5e-types\n          } else if (item?.type === \"spell\" && (customs.includes(\"spell\") || customs.includes(GameSystemConfig.customDamageResistanceTypes.spell))) {\n            totalMult = totalMult * mult;\n            continue;\n          }\n        }\n\n        // Support old style leftover settings\n        if (configSettings.damageImmunities === \"immunityPhysical\") {\n          if (!magicalDamage && trait.has(\"physical\"))\n            physicalDamageTypes.forEach(dt => trait.add(dt))\n          if (!(magicalDamage || silverDamage) && trait.has(\"silver\"))\n            physicalDamageTypes.forEach(dt => trait.add(dt))\n          if (!(magicalDamage || adamantineDamage) && trait.has(\"adamant\"))\n            physicalDamageTypes.forEach(dt => trait.add(dt))\n        }\n\n      }\n      if (trait.has(dmgTypeString))\n        totalMult = totalMult * mult;\n    }\n  }\n  return totalMult;\n  // Check the custom immunities\n}\nexport async function applyTokenDamage(\n  damageDetail: DamageDescription[],\n  totalDamage: number,\n  theTargets: Set<Token.Implementation>,\n  item: Item.Implementation | null | undefined,\n  saves: Set<Token.Implementation>,\n  options: any = {\n    label: \"defaultDamage\",\n    existingDamage: [],\n    superSavers: new Set(),\n    semiSuperSavers: new Set(),\n    workflow: undefined,\n    updateOptions: { awaitDamageApplication: configSettings.waitForDamageApplication },\n    forceApply: false,\n    noConcentrationCheck: false,\n  }\n): Promise<any[]> {\n  let allDamages: Record<string, DamageListEntry> = {};\n  damageDetail = damageDetail.map(de => ({ ...de, value: (de.value ?? de.damage) }))\n  let workflow: Workflow | undefined = options.workflow;\n  if (item && !options.workflow) workflow = Workflow.getWorkflow(item.uuid);\n\n  for (let token of theTargets) {\n    const actor = token.actor;\n    if (!actor) continue;\n    const isHit = true;\n    const saved = !!saves?.has(token);\n    const superSaver = !!options.superSavers?.has(token);\n    const semiSuperSaver = !!options.semiSuperSavers?.has(token);\n    let saveMultiplier = 1;\n\n    if (saved) {\n      saveMultiplier = getSaveMultiplierForItem(item, \"defaultDamage\");\n    }\n    /*    if (superSaver && getSaveMultiplierForItem(item, \"defaultDamage\") === configSettings.defaultSaveMultiplier) {\n          saveMultiplier = saves.has(token) ? 0 : configSettings.defaultSaveMultiplier;\n        }\n    */\n\n    if (semiSuperSaver && saved) {\n      saveMultiplier = 0;\n    }\n    const calcDamageOptions = {\n      invertHealing: true,\n      multiplier: 1,\n      midi: {\n        saved,\n        itemType: item?.type,\n        saveMultiplier,\n        isHit: true,\n        superSaver,\n        semiSuperSaver,\n        sourceActorUuid: actor?.uuid,\n        // @ts-expect-error no dnd5e-types\n        uncannyDodge: foundry.utils.getProperty(actor, `flags.${MODULE_ID}.uncanny-dodge`) && item?.hasAttack,\n        // some options for ripper's module\n        save: saved,\n        targetUuid: token?.document.uuid,\n        fumbleSave: false,\n        criticalSave: false,\n        isCritical: false,\n        isFumble: false\n      }\n    };\n    if (configSettings.saveDROrder === \"DRSavedr\") {\n      calcDamageOptions.midi.saveMultiplier = saveMultiplier;\n    } else {\n      calcDamageOptions.midi.saveMultiplier = 1;\n      calcDamageOptions.multiplier = saveMultiplier;\n    }\n    // @ts-expect-error no dnd5e-types\n    const combinedDamage: DamageDescription[] = foundry.utils.deepClone(actor.calculateDamage(damageDetail, calcDamageOptions));\n    const fullDamage = setupDamageDetails({\n      actorId: actor.id!,\n      actorUuid: actor.uuid,\n      critical: false,\n      damageDetail: combinedDamage,\n      damageDetails: {\n        combinedDamage,\n        rawcombinedDamage: damageDetail,\n        calcDamageOptions: { combinedDamage: calcDamageOptions }\n      },\n      isHit,\n      rawDamageDetail: damageDetail,\n      saved,\n      sceneId: canvas.scene?.id ?? \"\",\n      semiSuperSaver,\n      superSaver,\n      totalDamage,\n      targetUuid: token.document.uuid,\n    }, \"combinedDamage\", actor);\n    if (fullDamage) allDamages[actor.uuid] = fullDamage;\n  }\n\n  if (!options.updateOptions?.awaitDamageApplication) {\n    options.updateOptions ??= {};\n    options.updateOptions.awaitDamageApplication = true;\n  }\n  const cardIds: string[] = await timedAwaitExecuteAsGM(\"createReverseDamageCard\", {\n    autoApplyDamage: configSettings.autoApplyDamage,\n    sender: game.user?.name,\n    actorId: workflow?.actor?.id,\n    actorUuid: workflow?.actor?.uuid,\n    charName: workflow?.token?.name ?? workflow?.actor?.name ?? game.user?.name,\n    damageList: prepareDamageListToJSON(Object.values(allDamages)),\n    chatCardUuid: workflow?.itemCardUuid,\n    flagTags: workflow?.flagTags,\n    updateOptions: options.updateOptions,\n    forceApply: options.forceApply,\n  });\n  return cardIds;\n}\n\n/**\n * Apply different damage/healing amounts to multiple targets, producing a single damage card.\n * Each entry specifies a token and its own damageDetail/totalDamage.\n * @param targetDamages Array of per-target damage specifications\n * @param item The item responsible for the damage (used for card display)\n * @param options Same options as applyTokenDamage (workflow, forceApply, updateOptions, etc.)\n */\nexport async function applyTokenDamageMany(\n  targetDamages: { token: Token.Implementation, damageDetail: DamageDescription[], totalDamage: number }[],\n  item: Item.Implementation | null | undefined,\n  options: any = {\n    workflow: undefined,\n    updateOptions: { awaitDamageApplication: configSettings.waitForDamageApplication },\n    forceApply: false,\n  }\n): Promise<any[]> {\n  let allDamages: Record<string, DamageListEntry> = {};\n  let workflow: Workflow | undefined = options.workflow;\n  if (item && !options.workflow) workflow = Workflow.getWorkflow(item.uuid);\n\n  for (const entry of targetDamages) {\n    const actor = entry.token.actor;\n    if (!actor) continue;\n    const damageDetail = entry.damageDetail.map(de => ({ ...de, value: (de.value ?? de.damage) }));\n    const calcDamageOptions = {\n      invertHealing: true,\n      multiplier: 1,\n      midi: {\n        saved: false,\n        itemType: item?.type,\n        saveMultiplier: 1,\n        isHit: true,\n        superSaver: false,\n        semiSuperSaver: false,\n        sourceActorUuid: actor?.uuid,\n        uncannyDodge: false,\n        save: false,\n        targetUuid: entry.token?.document.uuid,\n        fumbleSave: false,\n        criticalSave: false,\n        isCritical: false,\n        isFumble: false\n      }\n    };\n    // @ts-expect-error no dnd5e-types\n    const combinedDamage: DamageDescription[] = foundry.utils.deepClone(actor.calculateDamage(damageDetail, calcDamageOptions));\n    const fullDamage = setupDamageDetails({\n      actorId: actor.id!,\n      actorUuid: actor.uuid,\n      critical: false,\n      damageDetail: combinedDamage,\n      damageDetails: {\n        combinedDamage,\n        rawcombinedDamage: damageDetail,\n        calcDamageOptions: { combinedDamage: calcDamageOptions }\n      },\n      isHit: true,\n      rawDamageDetail: damageDetail,\n      saved: false,\n      sceneId: canvas.scene?.id ?? \"\",\n      semiSuperSaver: false,\n      superSaver: false,\n      totalDamage: entry.totalDamage,\n      targetUuid: entry.token.document.uuid,\n    }, \"combinedDamage\", actor);\n    if (fullDamage) allDamages[actor.uuid] = fullDamage;\n  }\n\n  if (!options.updateOptions?.awaitDamageApplication) {\n    options.updateOptions ??= {};\n    options.updateOptions.awaitDamageApplication = true;\n  }\n  const cardIds: string[] = await timedAwaitExecuteAsGM(\"createReverseDamageCard\", {\n    autoApplyDamage: configSettings.autoApplyDamage,\n    sender: game.user?.name,\n    actorId: workflow?.actor?.id,\n    actorUuid: workflow?.actor?.uuid,\n    charName: workflow?.token?.name ?? workflow?.actor?.name ?? game.user?.name,\n    damageList: prepareDamageListToJSON(Object.values(allDamages)),\n    chatCardUuid: workflow?.itemCardUuid,\n    flagTags: workflow?.flagTags,\n    updateOptions: options.updateOptions,\n    forceApply: options.forceApply,\n  });\n  return cardIds;\n}\n\nexport interface applyDamageDetails {\n  label: string;\n  damageDetail: any[];\n  damageTotal: number;\n  saves?: Set<Token | TokenDocument>;\n  superSavers?: Set<Token | TokenDocument>;\n  semiSuperSavers?: Set<Token | TokenDocument>;\n}\nexport function mergeDamageDetail(damageDetail: any[]) {\n  // merge the damage details into a single array, removing duplicates\n  const merged: Record<string, DamageDescription> = {};\n  for (const dd of damageDetail) {\n    const makeHash = (type, properties = [], active: AnyObject) => [type, ...(true ? Array.from(properties).sort() : []), Array.from(active ? Object.entries(active) : [])].join();\n    const key = makeHash(dd.type, dd.properties ?? new Set(), dd.active)\n    if (dd.type === \"midi-none\") continue;\n    if (merged[key]) {\n      merged[key].value += dd.value;\n      merged[key].damage = merged[key].value; // deprecated\n      merged[key].formula += \" + \" + dd.formula;\n      if (dd.properties)\n        merged[key].properties = merged[key].properties.union(dd.properties);\n    } else {\n      merged[key] = { ...dd };\n    }\n  }\n  return Object.values(merged);\n}\nexport function setupDamageDetails(actorDamage: PreSetupDamageListEntry, selector: \"combinedDamage\" | \"otherDamage\", actor: Actor.Implementation) {\n  const mergedDetails = mergeDamageDetail(actorDamage.damageDetails[selector] ?? []);\n  let { damage, temp, healing } = (mergedDetails).reduce((acc, d) => {\n    if (d.type === \"temphp\") acc.temp += d.value;\n    else if (d.type === \"healing\") acc.healing += d.value;\n    else if (![\"midi-none\", \"vitality\"].includes(d.type)) acc.damage += d.value; // Exclude vitality from HP damage\n    return acc;\n  }, { damage: 0, temp: 0, healing: 0 });\n  damage = Math.max(0, damage);\n  let totalDamage = damage;\n  let healingAdjustedTotalDamage = damage + healing;\n  healingAdjustedTotalDamage = healingAdjustedTotalDamage < 0 ? Math.ceil(healingAdjustedTotalDamage) : Math.floor(healingAdjustedTotalDamage);\n  const as = actor?.system;\n  // @ts-expect-error no dnd5e-types\n  if (!as || !as.attributes.hp) return;\n  // @ts-expect-error no dnd5e-types\n  let effectiveTemp = as.attributes.hp.temp ?? 0;\n  const deltaTemp = healingAdjustedTotalDamage > 0 ? Math.min(effectiveTemp, healingAdjustedTotalDamage) : 0;\n  // @ts-expect-error no dnd5e-types\n  const deltaHP = Math.clamp(healingAdjustedTotalDamage - deltaTemp, -as.attributes.hp.damage, as.attributes.hp.value);\n  // @ts-expect-error no dnd5e-types\n  const oldTempHP = as.attributes.hp.temp ?? 0;\n  const newTempHP = Math.floor(Math.max(0, effectiveTemp - deltaTemp, temp))\n  const completeActorDamage: DamageListEntry = {\n    damageSelector: selector,\n    ...actorDamage,\n    updateOptions: {},\n    calcDamageOptions: actorDamage.damageDetails.calcDamageOptions[selector] as CalcDamageOptions,\n    // @ts-expect-error no dnd5e-types\n    oldHP: as.attributes.hp.value,\n    // @ts-expect-error no dnd5e-types\n    newHP: as.attributes.hp.value - deltaHP,\n    oldTempHP,\n    useDamageDetail: configSettings.useDamageDetail,\n    hpDamage: deltaHP,\n    newTempHP,\n    // damages.tempDamage = deltaTemp,\n    tempDamage: oldTempHP - newTempHP,\n    totalDamage: totalDamage,\n    healingAdjustedTotalDamage: healingAdjustedTotalDamage,\n    details: [],\n    wasHit: actorDamage.isHit,\n  };\n  return completeActorDamage;\n}\n\nexport async function processDamageRoll(workflow: Workflow, defaultDamageType: string) {\n  if (debugEnabled > 0) warn(\"processDamageRoll |\", workflow)\n  let hitTargets = new Set([...(workflow.hitTargets ?? []), ...(workflow.hitTargetsEC ?? [])]);\n  let theTargets = new Set(workflow.targets);\n  // TODO becomes activity.target.affects.type === \"self\"\n  // if (activity.target.affects.type === \"self\") theTargets = await getOrCreateTokenForActorAsSet(actor) || theTargets;\n  let effectsToExpire: string[] = [];\n  if (hitTargets.size > 0 && workflow.activity.attack) effectsToExpire.push(\"1Hit\");\n  if (hitTargets.size > 0 && workflow.activity.damage) effectsToExpire.push(\"DamageDealt\");\n  if (effectsToExpire.length > 0) {\n    await expireMyEffects.bind(workflow)(effectsToExpire);\n  }\n\n  if (debugEnabled > 0) warn(\"processDamageRoll | damage details pre merge are \", workflow.rawDamageDetail, workflow.rawBonusDamageDetail ?? []);\n  let totalDamage = 0;\n\n  const baseNoDamage = workflow.rawDamageDetail?.length === 0 || (workflow.rawDamageDetail?.length === 1 && workflow?.rawDamageDetail[0]?.type === \"midi-none\");\n  const bonusNoDamage = workflow.rawBonusDamageDetail?.length === 0 || (workflow.rawBonusDamageDetail?.length === 1 && workflow.rawBonusDamageDetail[0]?.type === \"midi-none\");\n  const otherNoDamage = workflow.rawOtherDamageDetail?.length === 0 || (workflow.rawOtherDamageDetail?.length === 1 && workflow.rawOtherDamageDetail[0]?.type === \"midi-none\");\n  if (baseNoDamage && bonusNoDamage && otherNoDamage) return;\n\n  const damagePerActor: Record<string, PreSetupDamageListEntry> = {};\n  workflow.damageList = [];\n  totalDamage = 0;\n  totalDamage = workflow.rawDamageDetail?.reduce((acc, di) => acc + (di.type === \"temphp\" ? 0 : di.type === \"healing\" ? -di.value : di.value), 0) ?? 0;\n  if (workflow.rawOtherDamageDetail) totalDamage += workflow.rawOtherDamageDetail.reduce((acc, di) => acc + (di.type === \"temphp\" ? 0 : di.value), 0) ?? 0;\n  if (workflow.rawBonusDamageDetail) totalDamage += workflow.rawBonusDamageDetail.reduce((acc, di) => acc + (di.type === \"temphp\" ? 0 : di.value), 0) ?? 0;\n  const defaultSaveMultiplier = getSaveMultiplierForActivity(workflow.activity);\n  for (let token of theTargets) {\n    const actor = token.actor;\n    if (!actor) continue;\n    const tokenDocument = token.document;\n    let challengeModeScale = 1;\n    let challengeModeAR = 0;\n    if ([\"scale\", \"scaleNoAR\"].includes(checkRule(\"challengeModeArmor\") as string) && workflow.attackRoll && workflow.hitTargetsEC?.has(token)) {\n      //scale the damage detail for a glancing blow - only for the first damage list? or all?\n      const scale = workflow.challengeModeScale?.[tokenDocument?.uuid ?? \"dummy\"] ?? 1;\n      challengeModeScale = scale;\n    } else if (checkRule(\"challengeModeArmor\") === \"challenge\" && workflow.hitTargetsEC?.has(token)) {\n      //@ts-expect-error no dnd5e-types\n      challengeModeAR = token.actor?.system.attributes.ac.AR ?? 0;\n    }\n\n    const semiSuperSaver = workflow.semiSuperSavers.has(token);\n    const superSaver = workflow.superSavers.has(token);\n    const hasSaved = workflow.saves.has(token);\n    const saveMultiplier = hasSaved\n      ? superSaver || semiSuperSaver\n        ? 0\n        : defaultSaveMultiplier\n      : superSaver\n        ? defaultSaveMultiplier\n        : 1;\n    damagePerActor[actor.uuid] = {\n      actorId: actor.id!,\n      actorUuid: actor.uuid,\n      challengeModeScale,\n      challengeModeAR,\n      critical: workflow.isCritical,\n      damageDetail: [],\n      damageDetails: { combinedDamage: [], rawcombinedDamage: [], defaultDamage: [], rawdefaultDamage: workflow.rawDamageDetail ?? [], otherDamage: [], rawotherDamage: workflow.rawOtherDamageDetail ?? [], bonusDamage: [], rawbonusDamage: workflow.rawBonusDamageDetail ?? [], calcDamageOptions: {} },\n      isHit: hitTargets.has(token),\n      rawDamageDetail: [],\n      saved: hasSaved,\n      sceneId: canvas.scene?.id ?? \"\",\n      semiSuperSaver,\n      superSaver,\n      totalDamage,\n      targetUuid: tokenDocument?.uuid,\n    };\n    if (!foundry.utils.getProperty(workflow.activity.item, `flags.${MODULE_ID}.noProvokeReaction`) && !workflow?.workflowOptions?.noProvokeReaction) {\n      if (totalDamage !== 0 && (workflow.hitTargets.has(token) || workflow.hitTargetsEC.has(token) || workflow.hasSave)) {\n        const isHealing = (\"heal\" === workflow.activity.actionType) || totalDamage < 0;\n        await doReactions(token, workflow.tokenUuid, workflow.damageRoll ?? workflow.bonusDamageRoll ?? workflow.otherDamageRoll ?? new Roll(\"0\"), !isHealing ? \"reactiondamage\" : \"reactionheal\", { activity: workflow.activity, item: workflow.item, workflow, workflowOptions: { damageDetail: workflow.rawDamageDetail, damageTotal: totalDamage, sourceActorUuid: workflow.actor.uuid, sourceItemUuid: workflow.item.uuid, sourceAmmoUuid: workflow.ammunition?.uuid } });\n      }\n    }\n    const damageDetails = damagePerActor[actor.uuid].damageDetails;\n    let combinedRawDamageDetails: DamageDescription[] = [];\n    let combinedDamageDetails: DamageDescription[] = [];\n\n\n    const damageArr: [DamageDescription[] | undefined, string][] = [[workflow.damageDetail ?? [], \"defaultDamage\"], [(workflow.otherDamageMatches?.has(token) ?? true) ? (workflow.otherDamageDetail ?? []) : [], \"otherDamage\"], [workflow.bonusDamageDetail ?? [], \"bonusDamage\"]];\n    for (let [damages, type] of damageArr) {\n      if (!damages) {\n        const message = `processDamageRoll | ${type} damages is not defined`;\n        TroubleShooter.recordError(new Error(\"no valid damage\"), message);\n        error(message);\n        continue;\n      }\n      let calcDamageOptions: CalcDamageOptions = {\n        invertHealing: true,\n        multiplier: challengeModeScale,\n        // Always initialize ignore to ensure dnd5e calculateDamage processes traits correctly\n        ignore: {\n          immunity: new Set<string>(),\n          resistance: new Set<string>(),\n          vulnerability: new Set<string>(),\n          modification: new Set<string>(),\n          absorption: new Set<string>(),\n        },\n        midi: {\n          challengeModeAR,\n          applyDamage: true,\n          criticalSave: workflow.criticalSaves.has(token),\n          fumbleSave: workflow.fumbleSaves.has(token),\n          isCritical: workflow.isCritical,\n          isFumble: workflow.isFumble,\n          isHit: hitTargets.has(token),\n          itemType: workflow.item.type,\n          save: hasSaved,\n          saved: hasSaved,\n          saveMultiplier, // default\n          semiSuperSaver,\n          sourceActorUuid: workflow.actor.uuid,\n          superSaver,\n          targetUuid: token.document.uuid,\n          // @ts-expect-error no dnd5e-types\n          uncannyDodge: actor.flags?.[MODULE_ID]?.[\"uncanny-dodge\"] && workflow.item?.hasAttack\n        }\n      };\n\n      // calcDamageOptions = foundry.utils.duplicate(damagePerActor[actor.uuid].damageDetails.calcDamageOptions[type]) as CalcDamageOptions;\n      if (type === \"otherDamage\" && (workflow.otherActivity?.save || workflow.otherActivity?.check)) {\n        const defaultSaveMultiplier = getSaveMultiplierForActivity(workflow.otherActivity);\n        const saveMultiplier = hasSaved\n          ? superSaver || semiSuperSaver\n            ? 0\n            : defaultSaveMultiplier\n          : superSaver\n            ? defaultSaveMultiplier\n            : 1;\n        calcDamageOptions.midi.saveMultiplier = saveMultiplier;\n      }\n\n      const categories: Record<string, string> = { \"idi\": \"immunity\", \"idr\": \"resistance\", \"idv\": \"vulnerability\", \"ida\": \"absorption\", \"idm\": \"modification\" };\n      if (workflow?.activity) {\n        const ignoreTraits = workflow.activity.midiProperties?.ignoreTraits;\n        if (ignoreTraits) {\n          for (let key of Object.keys(categories)) {\n            const category = categories[key];\n            // Check for base key (e.g., \"idi\") - applies to all damage types\n            if (ignoreTraits.has(key)) {\n              if (!calcDamageOptions.ignore?.[category]) foundry.utils.setProperty(calcDamageOptions, `ignore.${category}`, new Set())\n              for (let dt of Object.keys(GameSystemConfig.damageTypes)) {\n                calcDamageOptions.ignore![category].add(dt);\n              }\n            }\n          }\n          // Check for damage-type specific keys (e.g., \"idi.fire\")\n          for (const trait of ignoreTraits) {\n            if (trait.includes('.')) {\n              const [categoryKey, damageType] = trait.split('.');\n              const category = categories[categoryKey];\n              if (category && GameSystemConfig.damageTypes[damageType]) {\n                if (!calcDamageOptions.ignore?.[category]) foundry.utils.setProperty(calcDamageOptions, `ignore.${category}`, new Set())\n                calcDamageOptions.ignore![category].add(damageType);\n              }\n            }\n          }\n        }\n      }\n\n      //@ts-expect-error no dnd5e-types\n      let returnDamages = token.actor.calculateDamage(damages, calcDamageOptions);\n      damageDetails[type] = returnDamages;\n      damageDetails[`raw${type}`] = damages;\n      damageDetails.calcDamageOptions[type] = calcDamageOptions;\n      if (configSettings.singleConcentrationRoll) {\n        combinedDamageDetails = combinedDamageDetails.concat(returnDamages);\n        combinedRawDamageDetails = combinedRawDamageDetails.concat(damages);\n      }\n    }\n    damageDetails.calcDamageOptions.combinedDamage = damageDetails.calcDamageOptions.defaultDamage;\n    if (configSettings.singleConcentrationRoll) {\n      damageDetails[\"rawcombinedDamage\"] = mergeDamageDetail(combinedRawDamageDetails);\n      damageDetails[\"combinedDamage\"] = combinedDamageDetails;\n    } else {\n      damageDetails.rawcombinedDamage = mergeDamageDetail((damageDetails.rawdefaultDamage ?? []).concat(damageDetails.rawbonusDamage ?? []));\n      damageDetails.combinedDamage = (damageDetails?.defaultDamage ?? []).concat(damageDetails.bonusDamage ?? []);\n    }\n  }\n\n  const preDamageList = Object.values(damagePerActor);\n  // Explicitly typed because it only ever gets called with this, currently\n  const toCheck: (\"combinedDamage\" | \"otherDamage\")[] = [\"combinedDamage\"];\n  if (!configSettings.singleConcentrationRoll && workflow.otherDamageRolls) toCheck.push(\"otherDamage\");\n  let chatCardUuids: string[] = [];\n  for (let selector of toCheck) {\n    workflow.damageList = [];\n    preDamageList.forEach(damageEntry => {\n      damageEntry.damageDetail = damageEntry.damageDetails[selector] ?? damageEntry.damageDetail;\n      damageEntry.rawDamageDetail = damageEntry.damageDetails[`raw${selector}`] ?? damageEntry.rawDamageDetail;\n      // damageEntry.calcDamageOptions = damageEntry.damageDetails[`calcDamageOptions.${selector}`] ?? damageEntry.calcDamageOptions;\n    });\n\n    for (let token of theTargets) {\n      const actor = token.actor;\n      if (!actor) continue;\n      const preDamageDetails = damagePerActor[actor.uuid];\n      const damageDetails = setupDamageDetails(preDamageDetails, selector, actor);\n      if (damageDetails) {\n        damageDetails.damageDetails[selector] = damageDetails.damageDetail;\n        workflow.damageList.push(damageDetails);\n        await workflow?.callDamageHooksAndMacros(damageDetails, token);\n      }\n    }\n    await timedAwaitExecuteAsGM(\"createReverseDamageCard\", {\n      autoApplyDamage: configSettings.autoApplyDamage,\n      sender: game.user?.name,\n      actorId: workflow.actor.id,\n      actorUuid: workflow.actor.uuid,\n      charName: workflow.token?.name ?? workflow.actor.name ?? game.user?.name,\n      damageList: prepareDamageListToJSON(workflow.damageList),\n      chatCardUuid: workflow.itemCardUuid,\n      flagTags: workflow.flagTags,\n      updateOptions: { noConcentrationCheck: workflow?.workflowOptions?.noConcentrationCheck ?? false, awaitDamageApplication: configSettings.waitForDamageApplication },\n      forceApply: false\n    }).then(cardIds => {\n      if (cardIds) chatCardUuids.push(...cardIds);\n      if (workflow && configSettings.undoWorkflow) {\n        // Assumes workflow.undoData.chatCardUuids has been initialised\n        if (workflow.undoData) {\n          workflow.undoData.chatCardUuids = workflow.undoData.chatCardUuids.concat(chatCardUuids);\n          unTimedExecuteAsGM(\"updateUndoChatCardUuids\", workflow.undoData);\n        }\n      }\n    });\n  }\n  if (debugEnabled > 1) debug(`process damage roll complete for ${workflow.item.name} `, workflow.damageList)\n}\n\nexport function getSaveMultiplierForActivity(activity: Activity) {\n  if (!activity) {\n    error(\"getSaveMultiplierForActivity called with no activity\");\n    return 1;\n  }\n  if (activity?.damage?.onSave === undefined) return 1;\n\n  let damageOnSave = activity.damage?.onSave;\n  // @ts-expect-error no dnd5e-types\n  if (activity.item.type === \"spell\" && activity.item.system.level === 0 && damageOnSave === \"none\") {\n    const midiFlags = activity.actor?.flags?.[MODULE_ID];\n    if (midiFlags?.potentCantrip) return configSettings.defaultSaveMultiplier;\n  }\n  switch (activity.damage.onSave) {\n    case \"half\":\n      return configSettings.defaultSaveMultiplier;\n    case \"none\":\n      return 0;\n    case \"full\":\n      return 1;\n    default:\n      return configSettings.defaultSaveMultiplier;\n  }\n}\n\nexport let getSaveMultiplierForItem = (item?: Item.Implementation | null, itemDamageType?: string) => {\n  // There are no per items settings anymore so just return default saves\n  console.warn(\"getSaveMultiplierForItem is deprecated, use getSaveMultiplierForActivity instead\");\n  if (!item) return 1;\n  // @ts-expect-error no dnd5e-types\n  if (item.actor && item.type === \"spell\" && item.system.level === 0) { // cantrip\n    const midiFlags = item.actor?.flags?.[MODULE_ID];\n    if (midiFlags?.potentCantrip) return configSettings.defaultSaveMultiplier;\n    return 0;\n  }\n  return configSettings.defaultSaveMultiplier;\n};\n\nexport interface pcSaveOptions {\n  flavor: string,\n  requestId: string,\n  GMprompt,\n  isMagicSave: boolean,\n  rollAbilities?: string[],\n  rollSkills?: string[],\n  rollTools?: string[],\n  saveDetails: {\n    advantage: boolean | undefined,\n    disadvantage: boolean | undefined,\n    isFriendly: boolean,\n    isMagicSave: boolean,\n    isConcentrationCheck: boolean | undefined,\n    rollDC: number,\n    saveItemUuid: string,\n    workflowId: string,\n    workflowUuid: string, // deprecated\n    workflowOptions: object,\n    itemCardUuid: string\n  }\n};\n\n/**\n * Get the localized label for a tool from the compendium index.\n * dnd5e tools don't have a static `label` property like skills/abilities - their names come from compendium items.\n * @param toolId The tool identifier (e.g., \"alchemist\", \"thief\")\n * @returns The tool name, or the toolId as fallback if not found\n */\nexport function getToolLabel(toolId: string): string {\n  const toolUUID = GameSystemConfig.tools[toolId]?.id;\n  //@ts-expect-error no dnd5e-types\n  const toolIndex = toolUUID ? dnd5e.documents.Trait.getBaseItem(toolUUID, { indexOnly: true }) : null;\n  return toolIndex?.name ?? toolId;\n}\n\n/**\n * Build an array of choice options for a multi-ability save/check dialog.\n * Each entry includes the ability ID, localized label, and formatted modifier string.\n */\nexport function buildRollChoices(\n  actor: Actor.Implementation,\n  rollType: \"save\" | \"check\" | \"skill\" | \"tool\",\n  ids: string[]\n): { value: string, label: string, modifier: string }[] {\n  if (rollType === \"skill\") {\n    return ids.map(skillId => {\n      const label = GameSystemConfig.skills[skillId]?.label ?? skillId;\n      //@ts-expect-error no dnd5e-types\n      const total: number = actor.system.skills?.[skillId]?.total ?? 0;\n      const modifier = total >= 0 ? `+${total}` : `${total}`;\n      return { value: skillId, label, modifier };\n    });\n  }\n  if (rollType === \"tool\") {\n    return ids.map(toolId => {\n      const label = getToolLabel(toolId);\n      //@ts-expect-error no dnd5e-types\n      const total: number = actor.system.tools?.[toolId]?.total ?? 0;\n      const modifier = total >= 0 ? `+${total}` : `${total}`;\n      return { value: toolId, label, modifier };\n    });\n  }\n  return ids.map(abilityId => {\n    const label = GameSystemConfig.abilities[abilityId]?.label ?? abilityId;\n    let total: number;\n    //@ts-expect-error no dnd5e-types\n    const abilityData = actor.system.abilities?.[abilityId];\n    if (rollType === \"save\") {\n      total = abilityData?.save?.value ?? abilityData?.mod ?? 0;\n    } else {\n      total = (abilityData?.mod ?? 0) + (abilityData?.checkBonus ?? 0);\n    }\n    const modifier = total >= 0 ? `+${total}` : `${total}`;\n    return { value: abilityId, label, modifier };\n  });\n}\n\nexport function selectBestRollChoice(\n  rollChoices: { value: string; label: string; modifier: string }[],\n  advantageMap?: Record<string, { hasAdvantage: boolean; hasDisadvantage: boolean }>\n): { value: string; label: string; modifier: string } | undefined {\n  if (rollChoices.length === 0) return undefined;\n  if (rollChoices.length === 1) return rollChoices[0];\n\n  // Calculate effective value: modifier + advantage adjustment (+3.325 for adv, -3.325 for disadv)\n  const getEffectiveValue = (choice: typeof rollChoices[0]) => {\n    const mod = parseInt(choice.modifier) || 0;\n    const advData = advantageMap?.[choice.value];\n    if (advData?.hasAdvantage && !advData?.hasDisadvantage) return mod + 3.325;\n    if (advData?.hasDisadvantage && !advData?.hasAdvantage) return mod - 3.325;\n    return mod; // normal or both cancel out\n  };\n\n  return rollChoices.reduce((a, b) => getEffectiveValue(b) > getEffectiveValue(a) ? b : a);\n}\n\nexport function requestPCSave(ability: string, rollType: string | undefined, player: string, actor: Actor.Implementation | null, options: pcSaveOptions): Promise<ChatMessage.Implementation | undefined> | undefined {\n  try {\n    // display a chat message to the user telling them to save\n    const actorName = actor?.name ?? \"Unknown\";\n    // Build display string - show all choices if multiple abilities or skills available\n    let abilityString: string;\n    const rollAbilities = options.rollAbilities;\n    const rollSkills = options.rollSkills;\n    const rollTools = options.rollTools;\n    if (rollTools && rollTools.length > 0) {\n      const labels = rollTools.map(t => getToolLabel(t));\n      abilityString = labels.join(` ${i18n(\"midi-qol.or\")} `);\n    } else if (rollSkills && rollSkills.length > 0) {\n      const labels = rollSkills.map(s => GameSystemConfig.skills[s]?.label ?? s);\n      abilityString = labels.join(` ${i18n(\"midi-qol.or\")} `);\n    } else if (rollAbilities && rollAbilities.length > 0) {\n      const labels = rollAbilities.map(a => GameSystemConfig.abilities[a]?.label ?? a);\n      abilityString = labels.join(` ${i18n(\"midi-qol.or\")} `);\n    } else {\n      // Fallback when no arrays provided (e.g., external callers)\n      abilityString = ability || i18n(\"midi-qol.plain-d20-roll\");\n      let abilityDetails = GameSystemConfig.abilities[ability];\n      if (!abilityDetails) abilityDetails = { ...GameSystemConfig.skills[ability], label: \"\" };\n      if (!abilityDetails) abilityDetails = { ...GameSystemConfig.tools[ability], label: \"\" };\n      if (abilityDetails?.label) abilityString = abilityDetails.label;\n    }\n    const rollLabel = rollType === \"tool\" ? i18n(\"midi-qol.tool-check\") : rollType === \"skill\" ? i18n(\"midi-qol.skill-check\") : rollType === \"check\" ? i18n(\"midi-qol.ability-check\") : i18n(\"midi-qol.saving-throw\");\n    let content = ` ${actorName} ${shouldDisplaySaveDC() ? \"DC \" + options.saveDetails.rollDC : \"\"} ${abilityString} ${rollLabel}`;\n    if (options.saveDetails.advantage && !options.saveDetails.disadvantage) content = content + ` (${i18n(\"DND5E.Advantage\")}) - ${options.flavor})`;\n    else if (!options.saveDetails.advantage && options.saveDetails.disadvantage) content = content + ` (${i18n(\"DND5E.Disadvantage\")}) - ${options.flavor})`;\n    else content = content + ` - ${options.flavor})`;\n    const chatData = {\n      content,\n      whisper: [player]\n    }\n    // think about how to do this if (workflow?.flagTags) chatData.flags = foundry.utils.mergeObject(chatData.flags ?? \"\", workflow.flagTags);\n    return ChatMessage.create(chatData);\n  } catch (err) {\n    const message = `midi-qol | request PC save`;\n    TroubleShooter.recordError(err, message);\n    error(message, err);\n    return undefined;\n  }\n}\n\nexport function requestPCActiveDefence(player: User, actor: Actor, saveItemName: string, requestId: string, options: { formula: string, bonus: number, coverBonus: number, rollOptions: any, workflow: Workflow }) {\n  const useUuid = true;\n  const actorId = useUuid ? actor.uuid : actor.id;\n\n  let rollMode = checkRule(\"activeDefenceShow\") ?? CONST.DICE_ROLL_MODES.SELF;\n  // TODO: Right check?\n  let flavor = `${saveItemName} ${configSettings.optionalRules.activeDefence ? \"DC \" + options.rollOptions.target : \"\"} ${i18n(\"midi-qol.ActiveDefenceString\")}`;\n  const midiType = \"defenceRoll\";\n  /*  const options = {\n      criticalSuccess: criticalTarget,\n      criticalFailure: fumbleTarget,\n      advantageMode,\n      target: this.activeDefenceDC\n    };*/\n  socketlibSocket.executeAsUser(\"D20Roll\", player.id, { targetUuid: actor.uuid, formula: options.formula, bonus: options.bonus, coverBonus: options.coverBonus, rollOptions: options.rollOptions, rollMode, midiType, flavor, messageData: { speaker: getSpeaker(actor) } }).then(result => {\n    if (debugEnabled > 1) debug(\"D20Roll result \", result);\n    log(\"midi-qol | D20Roll result \", result);\n    const handler = options.workflow.defenceRequests[requestId];\n    if (!handler) // Roll must have timed out so we can ignore the return value;\n      return;\n    delete options.workflow.defenceRequests[requestId];\n    delete options.workflow.defenceTimeouts[requestId];\n    let returnValue;\n    try {\n      //@ts-expect-error D20Roll\n      returnValue = CONFIG.Dice.D20Roll.fromJSON(JSON.stringify(result));\n    } catch (err) { returnValue = {} }\n    handler(returnValue);\n  });\n}\n\n// ==================== Midi Flag Types ====================\n// Maps flag keys to their value types for effect processing in midiCustomEffect\nexport var midiFlagTypes: Record<string, string> = {};\n\nexport function setupMidiFlagTypes() {\n  let attackTypes = allAttackTypes.concat([\"heal\", \"other\", \"save\", \"util\"])\n\n  attackTypes.forEach(at => {\n    midiFlagTypes[`flags.midi-qol.DR.${at}`] = \"number\"\n  });\n  midiFlagTypes[\"flags.midi-qol.onUseMacroName\"] = \"string\";\n\n  if (game.system?.id === \"dnd5e\") {\n    midiFlagTypes[`flags.midi-qol.DR.all`] = \"string\";\n    midiFlagTypes[`flags.midi-qol.DR.non-magical`] = \"string\";\n    midiFlagTypes[`flags.midi-qol.DR.non-silver`] = \"string\";\n    midiFlagTypes[`flags.midi-qol.DR.non-adamant`] = \"string\";\n    midiFlagTypes[`flags.midi-qol.DR.non-physical`] = \"string\";\n    midiFlagTypes[`flags.midi-qol.DR.final`] = \"number\";\n\n    Object.keys(GameSystemConfig.damageTypes).forEach(dt => {\n      midiFlagTypes[`flags.midi-qol.DR.${dt}`] = \"string\";\n    })\n  }\n}\n\nexport function midiCustomEffect(actor: Actor.Implementation, change: ActiveEffect.ChangeData & { effect?: ActiveEffect.Implementation }, current: unknown, delta: unknown, changes: unknown) {\n  if (!change.key) return true;\n  if (typeof change?.key !== \"string\") return true;\n  // For passive effects originUuid should point to the parent item, rather than the original item.\n  const originUuid = change.effect?.transfer ? change.effect.parent?.uuid : change.effect?.origin;\n  if (!change.key?.startsWith(`flags.${MODULE_ID}`) && !change.key?.startsWith(\"system.traits.da.\")) return true;\n  const deferredEvaluation = [\n    `flags.${MODULE_ID}.OverTime`,\n    `flags.${MODULE_ID}.optional`,\n    `flags.${MODULE_ID}.advantage`,\n    `flags.${MODULE_ID}.disadvantage`,\n    `flags.${MODULE_ID}.superSaver`,\n    `flags.${MODULE_ID}.semiSuperSaver`,\n    `flags.${MODULE_ID}.grants`,\n    `flags.${MODULE_ID}.fail`,\n    `flags.${MODULE_ID}.max.damage`,\n    `flags.${MODULE_ID}.min.damage`,\n    `flags.${MODULE_ID}.critical`,\n    `flags.${MODULE_ID}.noCritical`,\n    `flags.${MODULE_ID}.ignoreCover`,\n    `flags.${MODULE_ID}.ignoreWalls`,\n    `flags.${MODULE_ID}.rangeOverride`\n  ];\n  // These have trailing data in the change values and should always just be a string\n  if (change.key === \"flags.dnd5e.DamageBonusMacro\") {\n    // DAEdnd5e - daeCustom processes these\n  } else if (change.key === `flags.${MODULE_ID}.onUseMacroName`) {\n    const args = change.value.split(\",\")?.map(arg => arg.trim());\n    const currentFlag = foundry.utils.getProperty(actor, `flags.${MODULE_ID}.onUseMacroName`) as string ?? \"\";\n    if (args[0] === \"ActivityMacro\" || args[0] === MQActivityMacroLabel) {\n      if (change.effect?.flags.dae?.activity) args[0] = `ActivityMacro.${change.effect.flags.dae.activity}`;\n      // @ts-expect-error no dnd5e-types\n      if (change.effect.transfer) args[0] = `ActivityMacro.${change.effect.parent!.system.activities.contents[0].uuid}`;\n      else {\n        const origin = fromUuidSync(change.effect?.origin) as Item.Implementation | ActiveEffect.Implementation | Activity | undefined;\n        if (origin instanceof Item) {\n          // @ts-expect-error no dnd5e-types\n          const activities = origin.system.activities?.contents;\n          if (activities[0]?.uuid) args[0] = `ActivityMacro.${activities[0].uuid}`;\n        } else if (origin instanceof ActiveEffect) {\n          // @ts-expect-error no dnd5e-types\n          const activities = origin.parent?.system?.activities?.contents;\n          if (activities[0]?.uuid) args[0] = `ActivityMacro.${activities[0].uuid}`;\n        } else if (origin?.item) {\n          args[0] = `ActivityMacro.${change.effect?.origin}`;\n        }\n      }\n    } else if (args[0].startsWith(\"ActivityMacro\") || args[0].startsWith(MQActivityMacroLabel)) {\n      const potentialUuid = args[0].split(\".\").slice(1).join(\".\");\n      if (potentialUuid.includes(\"Activity.\")) { // ActivityMacro.activityUuid\n        // since it's already an activity uuid do nothing\n      } else {\n        const item = fromUuidSync(potentialUuid);\n        if (item instanceof Item) {\n          // @ts-expect-error no dnd5e-types\n          const activities = item.system.activities?.contents;\n          if (activities[0]?.uuid) args[0] = `ActivityMacro.${activities[0].uuid}`;\n        } else { // Activity.Name or Activity.identifier\n          const origin = fromUuidSync(change.effect?.origin);\n          if (change.effect?.flags.dae?.activity) {\n            // @ts-expect-error no dnd5e-types\n            const activities: Collection<Activity> = (fromUuidSync(change.effect.flags.dae.activity) as Activity).item.system.activities;\n            const activity = activities.find(a => a.name === potentialUuid || a.identifier === potentialUuid);\n            if (activity?.uuid) args[0] = `ActivityMacro.${activity.uuid}`;\n          } else if (origin instanceof Item) {\n            // @ts-expect-error no dnd5e-types\n            const activities: Activity[] = origin.system.activities?.contents;\n            const activity = activities.find(a => a.name === potentialUuid || a.identifier === potentialUuid);\n            if (activity?.uuid) args[0] = `ActivityMacro.${activity.uuid}`;\n          }\n        }\n      }\n    } else if (args[0] === \"ItemMacro\" || args[0] === MQItemMacroLabel) { // rewrite the ItemMacro if possible\n      if (change.effect?.transfer) args[0] = `ItemMacro.${change.effect.parent?.uuid}`;\n      // else if (sourceId) args[0] = `ItemMacro.${sourceId}`;\n      else {\n        if (originUuid?.includes(\"Item.\")) {\n          args[0] = `ItemMacro.${originUuid}`;\n        } else {\n          const origin = fromUuidSync(change.effect?.origin) as Item.Implementation | ActiveEffect.Implementation | undefined;\n          if (origin instanceof Item) args[0] = `ItemMacro.${origin.uuid}`;\n          else if (origin instanceof ActiveEffect) args[0] = `ItemMacro.${origin.origin}`;\n        }\n      }\n    }\n    if (originUuid?.includes(\"Item.\")) {\n      args[0] = `${args[0]}|${originUuid}`;\n    }\n    const extraFlag = `[${args[1]}]${args[0]}`;\n    const macroString = (currentFlag?.length > 0) ? [currentFlag, extraFlag].join(\",\") : extraFlag;\n    foundry.utils.setProperty(actor, `flags.${MODULE_ID}.onUseMacroName`, macroString)\n    return true;\n  } else if (change.key.startsWith(`flags.${MODULE_ID}.optional.`) && (change.value.trim() === \"ItemMacro\" || change.value.trim() === MQItemMacroLabel)) {\n    let macroString = change.value;\n    if (originUuid?.includes(\"Item.\")) {\n      const itemUuid = originUuid?.includes(\"ActiveEffect.\") ? originUuid.split(\".\").slice(0, -2).join(\".\") : originUuid;\n      macroString = `ItemMacro.${itemUuid}`;\n    } else {\n      const origin = fromUuidSync(change.effect?.origin) as Item.Implementation | ActiveEffect.Implementation | undefined;\n      if (origin instanceof Item) macroString = `ItemMacro.${origin.uuid}`;\n      else if (origin instanceof ActiveEffect) macroString = `ItemMacro.${origin.origin}`;\n    }\n    foundry.utils.setProperty(actor, change.key, macroString);\n    return true;\n    /*\n     TODO revisit this if going to allow item macro in flags evaluation\n     else if (change.key.startsWith(`flags.${MODULE_ID}.`) && (change.value.trim().includes(\"ItemMacro\") || change.value.trim().includes(MQItemMacroLabel))) {\n       if (originUuid?.includes(\"Item.\")) {\n         const macroString = `ItemMacro.${originUuid}`;\n         foundry.utils.setProperty(actor, change.key, macroString)\n       } else foundry.utils.setProperty(actor, change.key, change.value);\n     } */\n  } else if (deferredEvaluation.some(k => change.key.startsWith(k))) {\n    if (typeof change.value !== \"string\") foundry.utils.setProperty(actor, change.key, change.value);\n    else if ([\"true\", \"1\"].includes(change.value.trim())) foundry.utils.setProperty(actor, change.key, true);\n    else if ([\"false\", \"0\"].includes(change.value.trim())) foundry.utils.setProperty(actor, change.key, false);\n    else foundry.utils.setProperty(actor, change.key, change.value);\n  } else if (change.key.match(/system.traits.*custom/)) {\n    // do the trait application here - think about how to update both trait and bypass\n  } else if (typeof change.value === \"string\" && change.key.startsWith(\"flags.midi-qol\")) {\n    let val: any;\n    try {\n      switch (midiFlagTypes[change.key]) {\n        case \"string\":\n          val = change.value; break;\n        case \"number\":\n          val = Number.isNumeric(change.value) ? JSON.parse(change.value) : 0; break;\n        default: // boolean by default\n          val = evalCondition(change.value, actor.getRollData(), { async: false })\n      }\n      if (debugEnabled > 0) warn(\"midiCustomEffect | setting \", change.key, \" to \", val, \" from \", change.value, \" on \", actor.name);\n      foundry.utils.setProperty(actor, change.key, val);\n      foundry.utils.setProperty(actor, change.key.replace(`flags.${MODULE_ID}`, `flags.${MODULE_ID}.evaluated`), { value: val, effects: [change.effect?.name] });\n    } catch (err) {\n      const message = `midi-qol | midiCustomEffect | custom flag eval error ${change.key} ${change.value}`;\n      TroubleShooter.recordError(err, message);\n      console.warn(message, err);\n    }\n  }\n  return true;\n}\n\n// Currently unused\n// export function checkImmunity(candidate, data, options, user) {\n//   // Not using this in preference to marking effect unavailable\n//   const parent: Actor | undefined = candidate.parent;\n//   if (!parent || !(parent instanceof CONFIG.Actor.documentClass)) return true;\n\n//   // @ts-expect-error no dnd5e-types\n//   const ci = parent.system.traits?.ci?.value;\n//   const statusId = (data.name ?? (data.label ?? \"no effect\")).toLocaleLowerCase(); // TODO 11 check this\n//   const returnvalue = !(ci.length && ci.some(c => c === statusId));\n//   return returnvalue;\n// }\n\nexport function untargetDeadTokens() {\n  if (autoRemoveTargets !== \"none\") {\n    game.user?.targets.forEach((t) => {\n      //@ts-expect-error no dnd5e-types\n      if (t.actor?.system.attributes.hp.value <= 0) {\n        t.setTarget(false, { releaseOthers: false });\n      }\n    });\n  }\n}\n\nfunction replaceAtFields<T>(value: T, context: Record<string, string>, options: { blankValue: string | number, maxIterations: number } = { blankValue: \"\", maxIterations: 4 }) {\n  if (typeof value !== \"string\") return value;\n  let count = 0;\n  if (!value.includes(\"@\")) return value;\n  let re = /@[\\w\\._\\-]+/g\n  let result = foundry.utils.duplicate(value) as string;\n  result = result.replace(\"@item.level\", \"@itemLevel\") // fix for outdated item.level\n  result = result.replace(`@flags.${MODULE_ID}`, \"@flags.midiqol\"); // allow expressions to ignore the \"-\" in midi-qol\n  // Remove @data references allow a little bit of recursive lookup\n  do {\n    count += 1;\n    for (let match of result.match(re) || []) {\n      result = result.replace(match.replace(\"@data.\", \"@\"), (foundry.utils.getProperty(context, match.slice(1)) as string) ?? options.blankValue)\n    }\n  } while (count < options.maxIterations && result.includes(\"@\"));\n  return result;\n}\n\nexport async function doOverTimeEffect(actor: Actor.Implementation, effect: ActiveEffect.Implementation, startTurn: boolean = true, options: any = { saveToUse: undefined, rollFlags: undefined, isActionSave: false }) {\n  if (game.user?.isGM)\n    return gmOverTimeEffect(actor, effect, startTurn, options);\n  else\n    return unTimedExecuteAsGM(\"gmOverTimeEffect\", { actorUuid: actor.uuid, effectUuid: effect.uuid, startTurn, options })\n}\nexport async function doActivityOverTimeEffect(actor: Actor.Implementation, effect: ActiveEffect.Implementation, startTurn: boolean = true, options: any = { saveToUse: undefined, rollFlags: undefined, isActionSave: false }) {\n  if (effect.disabled || effect.isSuppressed) return;\n  const auraFlags = effect.flags?.ActiveAuras ?? {};\n  if (auraFlags.isAura && auraFlags.ignoreSelf) return;\n  const ROLL_MODES = CONST.DICE_ROLL_MODES;\n  const owner = playerForActor(actor);\n  const changes = effect.changes;\n  let requiresUserExecution = false;\n  for (let change of changes) {\n    const activity = await getOvertimeActivity(actor, effect, change, startTurn);\n    if (!activity) continue;\n    if (([ROLL_MODES.PRIVATE, ROLL_MODES.SELF] as string[]).includes(activity.midiProperties?.rollMode ?? \"\")) {\n      requiresUserExecution = owner !== undefined;\n      break;\n    }\n  }\n  if (!requiresUserExecution || !owner || owner === game.user || !owner.active)\n    return localActivityOverTimeEffect(actor, effect, startTurn, options);\n  else {\n    return socketlibSocket.executeAsUser(\"localActivityOverTimeEffect\", owner.id, { actorUuid: actor.uuid, effectUuid: effect.uuid, startTurn, options })\n  }\n}\n\nasync function getOvertimeActivity(actor: Actor.Implementation, effect: ActiveEffect.Implementation, change: ActiveEffect.ChangeData, startTurn: boolean) {\n  const changeValue = String(change.value ?? \"\");\n  let activity /* MidiActivityMixin */ = await fromUuid(changeValue) as Activity | null;\n  if (!activity && effect.transfer) {\n    //@ts-expect-error no dnd5e-types\n    activity = effect.parent?.system.activities?.find(a => a.identifier === changeValue);\n  }\n  if (!activity && effect.origin) {\n    const originItem = getItemFromEffectOrigin(effect.origin);\n    if (originItem) {\n      // @ts-expect-error no dnd5e-types\n      activity = originItem.system.activities.find(a => a.identifier === changeValue);\n    }\n  }\n  if (!activity) {\n    console.error(`getOvertimeActivity | activity not found for changeValue: \"${changeValue}\"`);\n    return undefined;\n  }\n  const turnChoice = activity.overTimeProperties?.turnChoice ?? \"start\";\n  console.error(`getOvertimeActivity | found activity: ${activity.name}, turnChoice: ${turnChoice}, startTurn: ${startTurn}`);\n  // Check start/end turn\n  if (turnChoice === \"start\" && !startTurn) return undefined;\n  if (turnChoice === \"end\" && startTurn) return undefined;\n  return activity;\n\n}\nexport async function localActivityOverTimeEffect(actor: Actor.Implementation, effect: ActiveEffect.Implementation, startTurn: boolean = true, options: any = { saveToUse: undefined, rollFlags: undefined, rollMode: undefined }) {\n  // Get the activity\n  let changes = effect.changes.filter(change => change.key.startsWith(`flags.${MODULE_ID}.ActivityOverTime`));\n  changes = changes.sort((c1, c2) => (c1.priority ?? 10) - (c2.priority ?? 10));\n  const castLevel = effect.flags?.[MODULE_ID]?.castData?.castLevel ?? 0;\n  const spellLevel = effect.flags?.[MODULE_ID]?.castData?.baseLevel ?? 0;\n  for (let change of changes) {\n    const activity = await getOvertimeActivity(actor, effect, change, startTurn);\n    if (!activity) {\n      console.warn(`midi-qol | localActivityOverTime | for actor ${actor} activity ${change.value} not found or not overTime`);\n      continue;\n    }\n    // Determine which actor should roll the overtime activity\n    const rollAsChoice = activity.overTimeProperties?.rollAs ?? \"target\";\n    let rollActor = actor; // default: target actor (the actor bearing the effect)\n    if (rollAsChoice === \"source\") {\n      const originItem = getItemFromEffectOrigin(effect.origin ?? \"\");\n      if (originItem?.actor) rollActor = originItem.actor;\n    }\n\n    // Create an item owned by the rolling actor which has all of the details\n    const itemData: any = activity.item.toObject();\n    if (castLevel > spellLevel) foundry.utils.setProperty(itemData, \"flags.dnd5e.scaling\", castLevel - spellLevel);\n    foundry.utils.setProperty(itemData, \"system.properties\", itemData.system.properties.filter(p => p !== \"concentration\"));\n    foundry.utils.setProperty(itemData, \"flags.midi-qol.syntheticItem\", true);\n    const newItem = new CONFIG.Item.documentClass(itemData, { parent: rollActor });\n    newItem.prepareData();\n    // @ts-expect-error no dnd5e-types\n    newItem.prepareFinalAttributes(); // since the actor prepareData is not being called need to call this by hand\n    //@ts-expect-error no dnd5e-types\n    let overTimeActivity = newItem.system.activities.find(a => a.id === activity.id) as Activity;\n\n    // Check remove Condition\n    if ((overTimeActivity.overTimeProperties?.preRemoveConditionText ?? \"\") !== \"\" && overTimeActivity.overTimeProperties!.removeConditionBeforeActivity) {\n      const conditionData = createConditionData({ actor, workflow: undefined, target: actor, effect });\n      if (await evalCondition(activity.overTimeProperties?.preRemoveConditionText ?? \"false\", conditionData, { async: true })) {\n        await effect.delete();\n        return;\n      }\n    }\n    if ((overTimeActivity?.useCondition ?? \"\") !== \"\") {\n      const conditionData = createConditionData({ actor, workflow: undefined, target: actor, effect });\n      if (!await evalCondition(activity.useCondition ?? \"true\", conditionData, { async: true, errorReturn: true })) {\n        return; // use condition failed but don't want to thrown an notification warning\n      }\n    }\n    let targetsToUse: Set<Token> | undefined = undefined;\n    const checkGMstatus = rollAsChoice === \"source\" && rollActor !== actor && !rollActor.isOwner;\n    // Overtime effects always target the actor bearing the effect\n    const token = tokenForActor(actor);\n    if (token) targetsToUse = new Set([token]);\n\n    const overTimeWorkflow: Workflow = await completeActivityUse(overTimeActivity,\n      { midiOptions: { targetsToUse, checkGMstatus, workflowOptions: { noProvokeReaction: true, autoConsumeResource: \"both\" } } },\n      { configure: overTimeActivity.consumption?.spellSlot === true },\n      { create: true }) as Workflow;\n\n    // Check save condition\n    if (activity.overTimeProperties?.saveRemoves && overTimeWorkflow?.saves.has(getOrCreateTokenForActor(actor)!)) {\n      await effect.delete();\n      return;\n    }\n    // Check remove condition\n    if ((activity.overTimeProperties?.postRemoveConditionText ?? \"\") !== \"\" && !activity.overTimeProperties!.removeConditionBeforeActivity) {\n      const conditionData = createConditionData({ actor, workflow: overTimeWorkflow, target: actor, effect });\n      if (await evalCondition(activity.overTimeProperties!.postRemoveConditionText ?? \"false\", conditionData, { async: true })) {\n        await effect.delete();\n        return;\n      }\n    }\n  }\n}\n\n/** Structured representation of count action (saveCount/failCount) */\nexport interface CountAction {\n  count: number;\n  mode: \"remove\" | \"permanent\";\n  consecutive: boolean;  // If true, counter resets on opposite result\n  effectSpec?: string;  // If specified, this effect/status is added to the actor when count is reached\n}\n\n/** Result of resolving an ItemMacro specification */\nexport interface ResolvedItemMacro {\n  item: Item.Implementation;\n  macroData: Macro.CreateData;\n}\n\n/** Result of resolving an ActivityMacro specification */\nexport interface ResolvedActivityMacro {\n  item: Item.Implementation;\n  activity: Activity;\n  macro: Macro.Implementation;\n}\n\n/**\n * Resolve an ItemMacro specification to an item and its macro data.\n * Supports: \"ItemMacro\", \"ItemMacro.itemName\", \"ItemMacro.itemUuid\"\n *\n * @param macroSpec - The macro specification string (e.g., \"ItemMacro.Fireball\")\n * @param context - Context for resolution\n * @param context.actor - Actor to search for items by name\n * @param context.originItem - Default item to use when spec is just \"ItemMacro\"\n * @returns The resolved item and macro data, or undefined if not found\n */\nexport async function resolveItemMacro(\n  macroSpec: string,\n  context: { actor?: Actor.Implementation; originItem?: Item.Implementation }\n): Promise<ResolvedItemMacro | undefined> {\n  const { actor, originItem } = context;\n  let item: Item.Implementation | undefined;\n\n  if (macroSpec === \"ItemMacro\" || macroSpec === MQItemMacroLabel) {\n    // Use origin item\n    item = originItem;\n  } else {\n    // ItemMacro.itemNameOrUuid\n    const itemSpec = macroSpec.replace(/^(ItemMacro|midi-qol\\.ItemMacroText)\\./, \"\").trim();\n\n    // Try as UUID first\n    const resolved = await fromUuid(itemSpec);\n    if (resolved instanceof Item) {\n      item = resolved;\n    } else if (resolved instanceof ActiveEffect && resolved.parent instanceof Item) {\n      item = resolved.parent;\n    } else if ((resolved as any)?.item) {\n      // Activity UUID - get parent item\n      item = (resolved as any).item;\n    }\n\n    // Fall back to finding by name on actor\n    if (!item && actor) {\n      item = actor.items.find(i => i.name === itemSpec && !!(i.flags?.dae?.macro ?? i.flags?.itemacro?.macro));\n    }\n  }\n\n  if (!item) return undefined;\n\n  const macroData = item.flags?.dae?.macro ?? item.flags?.itemacro?.macro;\n  if (!macroData) return undefined;\n\n  return { item, macroData };\n}\n\n/**\n * Resolve an ActivityMacro specification to an activity and its macro.\n * Supports: \"ActivityMacro\", \"ActivityMacro.uuid\", \"ActivityMacro.identifier\", \"ActivityMacro.name\", \"ActivityMacro-id\"\n *\n * @param macroSpec - The macro specification string (e.g., \"ActivityMacro.cast\")\n * @param context - Context for resolution\n * @param context.originItem - Item to search for activities\n * @param context.originActivity - Default activity to use when spec is just \"ActivityMacro\"\n * @returns The resolved item, activity and macro, or undefined if not found\n */\nexport async function resolveActivityMacro(\n  macroSpec: string,\n  context: { originItem?: Item.Implementation; originActivity?: Activity }\n): Promise<ResolvedActivityMacro | undefined> {\n  const { originItem, originActivity } = context;\n  let item: Item.Implementation | undefined = originItem;\n  let activity: Activity | undefined;\n\n  if (macroSpec === \"ActivityMacro\" || macroSpec === MQActivityMacroLabel) {\n    // Use origin activity\n    activity = originActivity;\n    item = originItem;\n  } else if (macroSpec.startsWith(\"ActivityMacro-\")) {\n    // ActivityMacro-id format (from the app)\n    const activityId = macroSpec.split(\"-\").slice(1).join(\"-\");\n    if (originActivity?.id === activityId) {\n      activity = originActivity;\n    } else if (originItem) {\n      // @ts-expect-error no dnd5e-types\n      activity = originItem.system.activities?.find((a: Activity) => a.id === activityId);\n    }\n    item = originItem;\n  } else {\n    // ActivityMacro.uuid or ActivityMacro.identifier or ActivityMacro.name\n    const activitySpec = macroSpec.replace(/^(ActivityMacro|midi-qol\\.ActivityMacroText)\\./, \"\").trim();\n\n    // Try as UUID first\n    const resolved: any = await fromUuid(activitySpec);\n    if (resolved instanceof Item) {\n      item = resolved;\n      // @ts-expect-error no dnd5e-types\n      activity = item.system.activities?.contents[0];\n    } else if (resolved?.item) {\n      // It's an activity\n      activity = resolved;\n      item = resolved.item;\n    }\n\n    // Fall back to finding by identifier/id/name on origin item\n    if (!activity && originItem) {\n      // @ts-expect-error no dnd5e-types\n      activity = originItem.system.activities?.find(a =>\n        a.identifier === activitySpec || a.id === activitySpec || a.name === activitySpec\n      );\n      item = originItem;\n    }\n  }\n\n  if (!activity || !item) return undefined;\n\n  const macro = activity.macro;\n  if (!macro?.command) return undefined;\n\n  return { item, activity, macro };\n}\n\n/**\n * Resolves DAE itemData stored in effect flags.\n * DAE stores item data in effect flags when transferring effects, allowing\n * ItemMacro resolution even when the original item is not on the actor.\n *\n * @param actor - The actor to search for effects with itemData\n * @param uuid - The UUID to extract the item ID from\n * @returns The stored item data, or undefined if not found\n */\nexport function resolveDAEItemData(\n  actor: Actor.Implementation,\n  uuid: string\n): Item.InitializedData | undefined {\n  let itemId: string;\n  if (uuid.includes(\"Activity.\") || uuid.includes(\"ActiveEffect.\")) {\n    itemId = uuid.split(\".\").slice(-3)[0];\n  } else {\n    itemId = uuid.split(\".\").slice(-1)[0];\n  }\n  return actor.effects.find(e => e.flags?.dae?.itemData?._id === itemId)?.flags?.dae?.itemData as Item.InitializedData | undefined;\n}\n\nexport interface OvertimeDetails {\n  turn: \"start\" | \"end\";\n  label: string;\n  // Roll configuration\n  rollType: \"save\" | \"check\" | \"skill\" | \"damage\";\n  rollTypeString: string;  // Raw rollType string for multi-type matching\n  saveAbility: string[];\n  saveAbilityString: string;  // Raw ability string for message flavor\n  saveDC: number;\n  saveMagic: boolean;\n  // Damage configuration\n  damageRoll?: string;\n  damageType: string;\n  damageBeforeSave: boolean;\n  saveDamage: \"nodamage\" | \"halfdamage\" | \"fulldamage\";\n  // Count thresholds\n  saveCount?: CountAction;\n  failCount?: CountAction;\n  // Action save\n  actionSave?: \"dialog\" | \"roll\";\n  // Conditions\n  applyCondition?: string;\n  removeCondition?: string;\n  // Other options\n  allowIncapacitated: boolean;\n  killAnim: boolean;\n  macro?: string;\n  itemName?: string;\n  chatFlavor: string;\n  rollMode?: string;\n  fastForwardDamage: boolean;\n  fastForwardAttack: boolean;\n  autoRollAttack: boolean;\n  autoRollDamage: boolean;\n}\n\n/** Parse a boolean from overtime spec string */\nexport function parseBool(value: string | undefined, defaultValue: boolean): boolean {\n  if (value === undefined) return defaultValue;\n  return value === \"true\" || value === \"1\";\n}\n\n/**\n * Parse \"N\" or \"N[-+]options\" syntax into structured CountAction\n * @param value - The raw string value (e.g., \"2\", \"2-\", \"2+\", \"2-petrified\", \"2+prone\")\n * @param defaultMode - Default mode if no action specified (\"remove\" for saves, \"permanent\" for fails)\n */\nexport function parseCountAction(value: string, defaultMode: \"remove\" | \"permanent\"): CountAction {\n  // Format: n[c][-+]effectSpec where - or + is required, c = consecutive\n  // - means remove, + means permanent\n  // c means counter resets on opposite result\n  // effectSpec (if present) is always added to the actor when count is reached\n  // Examples: 2-, 2+, 2c-, 3c+prone, 2-petrified\n\n  // Strip consecutive flag if present (letter 'c' immediately after digits)\n  let consecutive = false;\n  let working = value;\n  const digitEnd = working.search(/\\D/);\n  if (digitEnd > 0 && working[digitEnd] === \"c\") {\n    consecutive = true;\n    working = working.substring(0, digitEnd) + working.substring(digitEnd + 1);\n  }\n\n  const minusIndex = working.indexOf(\"-\");\n  const plusIndex = working.indexOf(\"+\");\n\n  // Determine which action indicator comes first (after digits)\n  let actionIndex = -1;\n  let mode: \"remove\" | \"permanent\" = defaultMode;\n  if (minusIndex > 0 && (plusIndex === -1 || minusIndex < plusIndex)) {\n    actionIndex = minusIndex;\n    mode = \"remove\";\n  } else if (plusIndex > 0) {\n    actionIndex = plusIndex;\n    mode = \"permanent\";\n  }\n\n  // If no action indicator found, use default mode\n  if (actionIndex === -1) {\n    return { count: Number(working), mode: defaultMode, consecutive };\n  }\n\n  const count = Number(working.substring(0, actionIndex));\n  const effectSpec = working.substring(actionIndex + 1) || undefined; // Everything after - or +\n\n  return { count, mode, effectSpec, consecutive };\n}\n\n/**\n * Convert a CountAction back to its action string representation for storage\n * Format: [-+]effectSpec (e.g., \"-\", \"+\", \"-petrified\", \"+prone\")\n */\nexport function countActionToString(action: CountAction): string {\n  const base = (action.consecutive ? \"c\" : \"\") + (action.mode === \"remove\" ? \"-\" : \"+\");\n  return action.effectSpec ? `${base}${action.effectSpec}` : base;\n}\n\n/** Parameters for actionSave handler functions */\ninterface ActionSaveContext {\n  actor: Actor.Implementation;\n  effect: ActiveEffect.Implementation;\n  details: OvertimeDetails;\n  owner: User.Implementation | null | undefined;\n  messageFlavor: Record<string, string>;\n}\n\n/**\n * Handle actionSave=\"dialog\" - prompts player with dialog to roll save\n * @returns true if effect should be processed further, false to skip\n */\nasync function handleActionSaveDialog(ctx: ActionSaveContext): Promise<boolean> {\n  const { actor, effect, details, owner } = ctx;\n  const { saveDC, saveAbility, saveMagic, rollMode, rollTypeString } = details;\n\n  if (!owner?.active) {\n    error(`No active owner to request overtime save for ${actor.name} ${effect.name}`);\n    return false;\n  }\n\n  // Build SaveDetails with ALL abilities — doRollAbility/setupChoiceDialog handles the choice UI\n  const saveDetails: SaveDetails = {\n    actorUuid: actor.uuid,\n    advantage: undefined,\n    disadvantage: undefined,\n    modifierTracker: undefined,\n    isFriendly: false,\n    isMagicSave: saveMagic,\n    isConcentrationCheck: false,\n    rollDC: saveDC,\n    saveItemUuid: \"\",\n    workflowId: \"\",\n    itemCardUuid: \"\",\n    workflowOptions: {},\n    rollType: rollTypeString,\n    rollAbilities: rollTypeString !== \"skill\" ? saveAbility : [],\n    rollSkills: rollTypeString === \"skill\" ? saveAbility : [],\n    rollTools: [],\n    itemId: \"\",\n  };\n\n  // Prompt player for confirmation, then roll via rollAbility on their client\n  let saveResult: any = await socketlibSocket.executeAsUser(\"rollActionSave\", owner?.id, {\n    actorUuid: actor.uuid,\n    effectName: effect.name,\n    saveDetails,\n    displayOptions: {\n      fastForward: false,\n      chatMessage: true,\n      showTargetDC: true,\n      rollMode,\n    }\n  });\n\n  // Reconstruct Roll from socketlib serialization — same pattern as normalizeRollResults in checkSaves\n  //@ts-expect-error no dnd5e types\n  const D20Roll = CONFIG.Dice.D20Roll;\n  let roll: Roll | undefined;\n  if (saveResult instanceof Array) {\n    roll = saveResult[0] instanceof Roll ? saveResult[0] : D20Roll.fromJSON(JSON.stringify(saveResult[0]));\n  } else if (saveResult && !(saveResult instanceof Roll)) {\n    roll = D20Roll.fromJSON(JSON.stringify(saveResult));\n  } else {\n    roll = saveResult;\n  }\n  const success = roll?.total !== undefined && roll.total >= saveDC;\n  foundry.utils.setProperty(effect, `flags.${MODULE_ID}.actionSaveSuccess`, success === true);\n  return true;\n}\n\n/**\n * Handle actionSave=\"roll\" response - process player's save roll\n * @returns effect.id if processing should stop, null to continue to next effect\n */\nasync function handleActionSaveRollResponse(\n  ctx: ActionSaveContext,\n  options: { saveToUse?: any; rollFlags?: any },\n  rollType: string[]\n): Promise<string | null | undefined> {\n  const { actor, effect, details } = ctx;\n  const { saveAbility, saveDC } = details;\n\n  if (!options.rollFlags) return effect.id;\n  if (options.rollFlags.type === \"ability\") options.rollFlags.type = \"check\";\n  if (!rollType.includes(options.rollFlags.type) || !saveAbility.includes(options.rollFlags.ability ?? options.rollFlags.skillId)) {\n    return null; // continue to next effect\n  }\n\n  const success = options.saveToUse?.options?.success || options.saveToUse?.total >= saveDC || (checkRule(\"criticalSaves\") && options.saveToUse.isCritical);\n  if (success !== undefined) {\n    const chatCardUuids = effect.getFlag(MODULE_ID, \"overtimeChatCardUuids\");\n    for (let chatcardUuid of chatCardUuids ?? []) {\n      const chatCard = fromUuidSync(chatcardUuid) as ChatMessage.Implementation | undefined;\n      await chatCard?.delete();\n    }\n  }\n\n  if (success) {\n    await expireEffects(actor, [effect], { \"expiry-reason\": \"midi-qol:overTime:actionSave\" });\n    return effect.id;\n  } else {\n    await effect.setFlag(MODULE_ID, \"actionSaveSuccess\", success === true);\n  }\n  return effect.id;\n}\n\n/**\n * Handle actionSave=\"roll\" request - create roll request chat cards\n * @returns effect.id if processing should stop, undefined to continue\n */\nasync function handleActionSaveRollRequest(ctx: ActionSaveContext, changeTurnEnd: boolean): Promise<string | null | undefined> {\n  const { actor, effect, details, owner, messageFlavor } = ctx;\n  const { saveAbility, saveDC, rollMode, label, rollTypeString } = details;\n\n  const MessageClass = getDocumentClass(\"ChatMessage\");\n  let dataset;\n  const chatCardUuids: string[] = [];\n\n  for (let ability of saveAbility) {\n    dataset = {\n      type: rollTypeString,\n      dc: saveDC,\n      item: effect.name,\n      action: \"rollRequest\",\n      midiOvertimeActorUuid: actor.uuid,\n      midiRollMode: rollMode\n    };\n    if ([\"check\", \"save\"].includes(rollTypeString)) dataset.ability = ability;\n    else if (rollTypeString === \"skill\") dataset.skill = ability;\n\n    let whisper = ChatMessage.getWhisperRecipients(owner?.name ?? \"\");\n    if (owner?.isGM) {\n      whisper = ChatMessage.getWhisperRecipients(\"GM\");\n    }\n\n    const buttonDataset = { ...dataset, action: \"rollRequest\", visibility: \"all\" };\n    const chatData = {\n      user: game.user?.id,\n      whisper: whisper.map(u => u.id ?? \"\"),\n      rollMode: rollMode ?? \"public\",\n      content: await foundry.applications.handlebars.renderTemplate(\"systems/dnd5e/templates/chat/roll-request-card.hbs\", {\n        buttons: [{\n          // @ts-expect-error no dnd5e-types\n          buttonLabel: game.system.enrichers.createRollLabel({ ...dataset, format: \"long\", icon: true, hideDC: !owner?.isGM && !shouldDisplaySaveDC() }),\n          // @ts-expect-error no dnd5e-types\n          hiddenLabel: game.system.enrichers.createRollLabel({ ...dataset, format: \"long\", icon: true, hideDC: true }),\n          dataset: buttonDataset\n        }]\n      }),\n      flavor: `Action: ${label ?? effect.name} ${i18n(messageFlavor[details.rollType])}`,\n      speaker: MessageClass.getSpeaker({ actor })\n    };\n\n    const chatCard = await ChatMessage.create(chatData);\n    if (chatCard) {\n      chatCardUuids.push(chatCard.uuid);\n      await chatCard?.setFlag(MODULE_ID, \"actorUuid\", actor.uuid);\n    }\n  }\n\n  foundry.utils.setProperty(effect, `flags.${MODULE_ID}.actionSaveSuccess`, undefined);\n  await effect.setFlag(MODULE_ID, \"overtimeChatCardUuids\", chatCardUuids);\n  await effect.setFlag(MODULE_ID, \"actionSaveSuccess\", undefined);\n\n  if (changeTurnEnd) return effect.id;\n  return undefined;\n}\n\n/** Parameters for building overtime item data */\ninterface OvertimeItemBuildContext {\n  actor: Actor.Implementation;\n  effect: ActiveEffect.Implementation;\n  details: OvertimeDetails;\n  label: string;\n  isPermanent: boolean;\n}\n\n/**\n * Build item and activity data for overtime effect execution\n * @returns Object containing itemData and activityData ready for item creation\n */\nasync function buildOvertimeItemData(ctx: OvertimeItemBuildContext): Promise<{ itemData: any; activityData: any }> {\n  const { actor, effect, details, label, isPermanent } = ctx;\n  const { damageRoll, damageType, damageBeforeSave, saveMagic, itemName, chatFlavor, saveDamage } = details;\n\n  // Initialize item data, optionally from existing item\n  let itemData: any = {};\n  itemData.img = \"icons/svg/aura.svg\";\n  if (typeof itemName === \"string\") {\n    let theItem = await fromUuid(itemName) as Item.Implementation | undefined;\n    if (!theItem && itemName.startsWith(\"Actor.\")) {\n      const localName = itemName.replace(\"Actor.\", \"\");\n      theItem = actor.items.getName(localName);\n    }\n    if (!theItem) {\n      theItem = game.items?.getName(itemName);\n    }\n    if (theItem) itemData = theItem.toObject();\n  }\n\n  // Build activity data\n  let activityData: any = {\n    name: label,\n    id: \"overtime\",\n    type: \"damage\"\n  };\n  if (damageRoll) {\n    activityData.damage = {\n      parts: [{\n        custom: {\n          enabled: true,\n          formula: damageRoll,\n        },\n        types: [damageType]\n      }]\n    };\n  }\n\n  // Set properties on both\n  activityData.img = effect.img;\n  itemData.img = effect.img;\n  foundry.utils.setProperty(itemData, \"target.affects.type\", \"self\");\n  itemData.type = \"feat\";\n  foundry.utils.setProperty(itemData, \"system.type.value\", \"feat\");\n  foundry.utils.setProperty(itemData, `flags.${MODULE_ID}.noProvokeReaction`, true);\n  if (saveMagic) {\n    itemData.type = \"spell\";\n    foundry.utils.setProperty(itemData, \"system.preparation\", { mode: \"atwill\" });\n  }\n\n  // Add save/check/skill activity data if not permanent\n  if (!isPermanent) {\n    const rollActivityData = buildRollActivityData(details);\n    Object.assign(activityData, rollActivityData);\n  }\n\n  // Configure damage save behavior\n  if (activityData.damage) {\n    if (damageBeforeSave || saveDamage === \"fulldamage\") {\n      activityData.damage.onSave = \"full\";\n    } else if (saveDamage === \"halfdamage\") {\n      activityData.damage.onSave = \"half\";\n    } else {\n      activityData.damage.onSave = \"none\";\n    }\n  }\n\n  // Set final properties\n  itemData.name = label;\n  activityData.description = { chat: chatFlavor };\n  foundry.utils.setProperty(itemData, \"system.description.chat\", effect.description ?? \"\");\n  itemData._id = foundry.utils.randomID();\n\n  return { itemData, activityData };\n}\n\n/**\n * Parse raw overtime spec string into typed OvertimeDetails\n */\nexport function parseOvertimeDetails(specString: string, rollData: Record<string, any>, effectName: string): OvertimeDetails | null {\n  let spec = replaceAtFields(specString, rollData, { blankValue: 0, maxIterations: 3 });\n  spec = spec.replace(/\\s*=\\s*/g, \"=\").replace(/\\s*,\\s*/g, \",\").replace(\"\\n\", \"\");\n\n  let parts: string[];\n  if (spec.includes(\"#\")) parts = spec.split(\"#\");\n  else parts = spec.split(\",\");\n\n  const raw: Record<string, any> = {};\n  for (let part of parts) {\n    const p = part.split(\"=\");\n    raw[p[0]] = p.slice(1).join(\"=\");\n  }\n\n  // Parse turn\n  const turn = (raw.turn === \"end\" ? \"end\" : \"start\") as \"start\" | \"end\";\n\n  // Parse save ability\n  const saveAbilityString = raw.saveAbility ?? \"\";\n  const saveAbility = (saveAbilityString.includes(\"|\") ? saveAbilityString.split(\"|\") : [saveAbilityString])\n    .map((s: string) => s.trim().toLowerCase());\n\n  // Parse roll type\n  const rollTypeString = raw.rollType ?? (saveAbility[0] ? \"save\" : \"damage\");\n  const rollType = (rollTypeString.includes(\"|\") ? rollTypeString.split(\"|\") : [rollTypeString])\n    .map((s: string) => s.trim().toLowerCase())[0] as \"save\" | \"check\" | \"skill\" | \"damage\";\n\n  // Parse saveDC\n  let saveDC = -1;\n  if (raw.saveDC) {\n    try {\n      const dcValue = replaceAtFields(raw.saveDC, rollData, { blankValue: 0, maxIterations: 3 });\n      saveDC = dcValue ? Roll.safeEval(dcValue) : -1;\n    } catch (err) {\n      TroubleShooter.recordError(err, `overTime effect | error evaluating saveDC ${raw.saveDC}`);\n    }\n  }\n\n  // Parse actionSave with validation\n  let actionSave: \"dialog\" | \"roll\" | undefined = undefined;\n  if (raw.actionSave) {\n    if ([\"dialog\", \"roll\"].includes(raw.actionSave)) {\n      actionSave = raw.actionSave as \"dialog\" | \"roll\";\n    } else {\n      console.warn(`midi-qol | parseOvertimeDetails | invalid actionSave: ${raw.actionSave}`);\n      if (![\"0\", \"false\"].includes(raw.actionSave)) {\n        actionSave = \"roll\";\n      }\n    }\n  }\n\n  // Parse count actions\n  let saveCount: CountAction | undefined;\n  let failCount: CountAction | undefined;\n\n  // Handle saveCount parameter (e.g., saveCount=1, saveCount=2:petrified)\n  if (raw.saveCount !== undefined) {\n    saveCount = parseCountAction(raw.saveCount, \"remove\");\n  }\n  // Handle saveRemove parameter (deprecated — use saveCount instead)\n  else if (raw.saveRemove !== undefined) {\n    foundry.utils.logCompatibilityWarning(`midi-qol | parseOvertimeDetails | saveRemove is deprecated, use saveCount instead (saveRemove=${raw.saveRemove})`,\n      { since: \"midi-qol 13.0.43\", until: \"midi-qol 13.1.0\" });\n    if (raw.saveRemove === \"true\" || raw.saveRemove === \"1\") {\n      saveCount = { count: 1, mode: \"remove\", consecutive: false };\n    } else if (raw.saveRemove === \"false\" || raw.saveRemove === \"0\") {\n      // saveRemove=false means don't remove on save - use \"permanent\" mode with count 0\n      saveCount = { count: 0, mode: \"permanent\", consecutive: false };\n    } else {\n      // Otherwise parse as count action (e.g., \"2\", \"3:-\", etc.)\n      saveCount = parseCountAction(raw.saveRemove, \"remove\");\n    }\n  }\n  // Handle failCount parameter\n  if (raw.failCount !== undefined) {\n    failCount = parseCountAction(raw.failCount, \"permanent\");\n  }\n  // Handle failRemove parameter (deprecated — use failCount instead)\n  else if (raw.failRemove !== undefined) {\n    foundry.utils.logCompatibilityWarning(`midi-qol | parseOvertimeDetails | failRemove is deprecated, use failCount instead (failRemove=${raw.failRemove})`,\n      { since: \"midi-qol 13.0.43\", until: \"midi-qol 13.1.0\" });\n    failCount = parseCountAction(raw.failRemove, \"permanent\");\n  }\n\n  // Default: if neither saveCount nor failCount is specified and there's a valid saveDC,\n  // remove the effect on a single successful save.\n  if (saveCount === undefined && failCount === undefined && saveDC > -1) {\n    saveCount = { count: 1, mode: \"remove\", consecutive: false };\n  }\n\n  return {\n    turn,\n    label: (raw.name ?? raw.label ?? effectName).replace(/\"/g, \"\"),\n    rollType,\n    rollTypeString,\n    saveAbility,\n    saveAbilityString,\n    saveDC,\n    saveMagic: parseBool(raw.saveMagic, false),\n    damageRoll: raw.damageRoll,\n    damageType: raw.damageType ?? \"\",\n    damageBeforeSave: parseBool(raw.damageBeforeSave, false),\n    saveDamage: (raw.saveDamage ?? \"nodamage\") as \"nodamage\" | \"halfdamage\" | \"fulldamage\",\n    saveCount,\n    failCount,\n    actionSave,\n    applyCondition: raw.applyCondition ?? raw.condition,\n    removeCondition: raw.removeCondition,\n    allowIncapacitated: parseBool(raw.allowIncapacitated, false),\n    killAnim: parseBool(raw.killAnim, false),\n    macro: raw.macro,\n    itemName: raw.itemName,\n    chatFlavor: raw.chatFlavor ?? \"\",\n    rollMode: raw.rollMode,\n    fastForwardDamage: parseBool(raw.fastForwardDamage, true),\n    fastForwardAttack: parseBool(raw.fastForwardAttack, true),\n    autoRollAttack: parseBool(raw.autoRollAttack, true),\n    autoRollDamage: parseBool(raw.autoRollDamage, true),\n  };\n}\n\n/**\n * Serialize overtime form data back to a comma-separated OverTime spec string.\n * Only emits fields that differ from defaults, keeping the string concise.\n */\nexport function serializeOvertimeDetails(data: Record<string, any>): string {\n  const parts: string[] = [];\n\n  if (data.turn && data.turn !== \"start\") parts.push(`turn=${data.turn}`);\n  else parts.push(`turn=start`);\n\n  if (data.label) parts.push(`label=${data.label}`);\n\n  // Roll configuration\n  if (data.rollType && data.rollType !== \"save\") parts.push(`rollType=${data.rollType}`);\n  if (data.saveAbility) parts.push(`saveAbility=${data.saveAbility}`);\n  if (data.saveDC !== undefined && data.saveDC !== \"\" && data.saveDC !== \"-1\") parts.push(`saveDC=${data.saveDC}`);\n  if (data.saveMagic) parts.push(`saveMagic=true`);\n\n  // Damage\n  if (data.damageRoll) parts.push(`damageRoll=${data.damageRoll}`);\n  if (data.damageType) parts.push(`damageType=${data.damageType}`);\n  if (data.damageBeforeSave) parts.push(`damageBeforeSave=true`);\n  if (data.saveDamage && data.saveDamage !== \"nodamage\") parts.push(`saveDamage=${data.saveDamage}`);\n\n  // Count thresholds\n  if (data.saveCountEnabled && data.saveCountNum) {\n    const countStr = `${data.saveCountNum}${data.saveCountConsecutive ? \"c\" : \"\"}${data.saveCountMode === \"remove\" ? \"-\" : \"+\"}${data.saveCountEffectSpec || \"\"}`;\n    parts.push(`saveCount=${countStr}`);\n  }\n  if (data.failCountEnabled && data.failCountNum) {\n    const countStr = `${data.failCountNum}${data.failCountConsecutive ? \"c\" : \"\"}${data.failCountMode === \"remove\" ? \"-\" : \"+\"}${data.failCountEffectSpec || \"\"}`;\n    parts.push(`failCount=${countStr}`);\n  }\n\n  // Action save\n  if (data.actionSave && data.actionSave !== \"none\") parts.push(`actionSave=${data.actionSave}`);\n\n  // Conditions\n  if (data.applyCondition) parts.push(`applyCondition=${data.applyCondition}`);\n  if (data.removeCondition) parts.push(`removeCondition=${data.removeCondition}`);\n\n  // Advanced options — only emit non-defaults\n  if (data.macro) parts.push(`macro=${data.macro}`);\n  if (data.itemName) parts.push(`itemName=${data.itemName}`);\n  if (data.chatFlavor) parts.push(`chatFlavor=${data.chatFlavor}`);\n  if (data.rollMode && data.rollMode !== \"default\") parts.push(`rollMode=${data.rollMode}`);\n  if (!data.fastForwardDamage) parts.push(`fastForwardDamage=false`);\n  if (!data.fastForwardAttack) parts.push(`fastForwardAttack=false`);\n  if (!data.autoRollAttack) parts.push(`autoRollAttack=false`);\n  if (!data.autoRollDamage) parts.push(`autoRollDamage=false`);\n  if (data.allowIncapacitated) parts.push(`allowIncapacitated=true`);\n  if (data.killAnim) parts.push(`killAnim=true`);\n\n  return parts.join(\", \");\n}\n\n/**\n * Build activity data for save/check/skill rolls\n */\nexport function buildRollActivityData(details: OvertimeDetails): Record<string, any> {\n  const { rollType, saveAbility, saveDC, saveMagic } = details;\n  const activityData: Record<string, any> = {};\n\n  if (rollType === \"save\" && saveAbility[0] && saveDC > -1) {\n    activityData.type = \"save\";\n    activityData.save = {\n      ability: saveAbility,\n      dc: { calculation: \"\", formula: String(saveDC) }\n    };\n    // Note: saveMagic is handled separately (affects magic resistance, not DC calculation)\n  } else if (rollType === \"check\" && saveAbility[0] && saveDC > -1) {\n    activityData.type = \"check\";\n    activityData.check = {\n      ability: saveAbility[0],\n      dc: { calculation: \"\", formula: String(saveDC) }\n    };\n  } else if (rollType === \"skill\" && saveAbility[0] && saveDC > -1) {\n    activityData.type = \"check\";\n    activityData.check = {\n      associated: saveAbility,\n      dc: { calculation: \"\", formula: String(saveDC) }\n    };\n  }\n\n  return activityData;\n}\n\nexport async function gmOverTimeEffect(actor: Actor.Implementation, effect: ActiveEffect.Implementation, startTurn: boolean = true, options: any = { saveToUse: undefined, rollFlags: undefined, rollMode: undefined }) {\n  const endTurn = !startTurn;\n  if (effect.disabled || effect.isSuppressed) return;\n  const auraFlags = effect.flags?.ActiveAuras ?? {};\n  if (auraFlags.isAura && auraFlags.ignoreSelf) return;\n  const rollData = createConditionData({ actor, workflow: undefined, target: actor, effect });\n  if (!rollData.flags) rollData.flags = actor.flags;\n  rollData.flags.midiqol = rollData.flags[MODULE_ID];\n  const changes = effect.changes.filter(change => change.key.startsWith(`flags.${MODULE_ID}.OverTime`));\n  if (changes.length > 0) for (let change of changes) {\n    // flags.midi-qol.OverTime turn=start/end, damageRoll=rollspec, damageType=string, saveDC=number, saveAbility=str/dex/etc, damageBeforeSave=true/[false], label=\"String\"\n    const details = parseOvertimeDetails(change.value, rollData, effect.name);\n    if (!details) continue;\n\n    // Evaluate applyCondition\n    if (details.applyCondition) {\n      let value = replaceAtFields(details.applyCondition, rollData, { blankValue: 0, maxIterations: 3 });\n      let result;\n      try {\n        result = await evalCondition(value, rollData, { async: true });\n      } catch (err) {\n        const message = `midi-qol | gmOverTimeEffect | error when evaluating overtime apply condition ${value} - assuming true`;\n        TroubleShooter.recordError(err, message);\n        console.warn(message, err);\n        result = true;\n      }\n      if (!result) continue;\n    }\n\n    // Extract commonly used values from details\n    const { turn, label, rollTypeString, saveAbility, saveAbilityString, saveDC, rollMode, actionSave } = details;\n    const changeTurnStart = turn === \"start\";\n    const changeTurnEnd = turn === \"end\";\n\n    // Build message flavor for different roll types\n    const messageFlavor: Record<string, string> = {\n      \"save\": `${GameSystemConfig.abilities[saveAbilityString]?.label ?? saveAbilityString} ${i18n(\"midi-qol.saving-throw\")}`,\n      \"check\": `${GameSystemConfig.abilities[saveAbilityString]?.label ?? saveAbilityString} ${i18n(\"midi-qol.ability-check\")}`,\n      \"skill\": `${GameSystemConfig.skills[saveAbilityString]?.label ?? saveAbilityString} ${i18n(\"midi-qol.skill-check\")}`\n    };\n    // For rollType as array matching later\n    const rollTypeArray = (rollTypeString.includes(\"|\") ? rollTypeString.split(\"|\") : [rollTypeString]).map(s => s.trim().toLowerCase());\n\n    if (endTurn) {\n      const chatCardUuids = effect.getFlag(MODULE_ID, \"overtimeChatCardUuids\");\n      if (chatCardUuids) for (let chatCardUuid of chatCardUuids) {\n        const chatCard = fromUuidSync(chatCardUuid) as ChatMessage.Implementation | undefined;\n        chatCard?.delete();\n      }\n    }\n\n    if (options.isActionSave && actionSave === \"dialog\") {\n      // generated by a save roll so we can ignore\n      continue;\n    }\n\n    // Get actor owner for actionSave handling\n    let owner = playerForActor(actor) ?? preferredActiveGM();\n    if (!owner?.active) owner = preferredActiveGM();\n\n    // Create context for actionSave handlers\n    const actionSaveCtx: ActionSaveContext = { actor, effect, details, owner, messageFlavor };\n\n    // Handle actionSave variants using helper functions\n    if (actionSave && startTurn && actionSave === \"dialog\") {\n      const shouldContinue = await handleActionSaveDialog(actionSaveCtx);\n      if (!shouldContinue) return effect.id;\n    } else if (actionSave && actionSave === \"roll\" && options.isActionSave && options.saveToUse) {\n      const result = await handleActionSaveRollResponse(actionSaveCtx, options, rollTypeArray);\n      if (result !== undefined) {\n        if (result === null) continue; // continue to next effect\n        return result;\n      }\n    } else if (actionSave === \"roll\" && startTurn) {\n      const result = await handleActionSaveRollRequest(actionSaveCtx, changeTurnEnd);\n      if (result !== undefined) return result;\n    }\n\n    let actionSaveSuccess = effect.flags?.[MODULE_ID]?.actionSaveSuccess;\n    if (actionSaveSuccess === true && changeTurnEnd) {\n      await expireEffects(actor, [effect], { \"expiry-reason\": \"midi-qol:overTime:actionSave\" });\n      return effect.id;\n    }\n    if ((endTurn && changeTurnEnd) || (startTurn && changeTurnStart)) {\n      // Extract values from typed details object (already parsed)\n      const { damageRoll, damageType, damageBeforeSave, macro: macroToCall, allowIncapacitated, killAnim, saveCount, failCount, fastForwardAttack, fastForwardDamage, autoRollAttack, autoRollDamage } = details;\n\n      if (debugEnabled > 0) warn(`gmOverTimeEffect | Overtime provided data is `, details);\n      if (debugEnabled > 0) warn(`gmOverTimeEffect | OverTime label=${label} startTurn=${startTurn} endTurn=${endTurn} damageBeforeSave=${damageBeforeSave} saveDC=${saveDC} saveAbility=${saveAbility} damageRoll=${damageRoll} damageType=${damageType}`);\n\n      // Build item and activity data using helper function\n      // isPermanent is true for actionSave items OR if effect was marked permanent by saveCount/failCount\n      const effectMarkedPermanent = !!effect.flags?.[MODULE_ID]?.overtime?.permanent;\n      const isPermanent = !!actionSave || effectMarkedPermanent;\n      const { itemData, activityData } = await buildOvertimeItemData({ actor, effect, details, label, isPermanent });\n\n      // roll the damage and save....\n      const theTargetToken = getOrCreateTokenForActor(actor)!;\n      // Target is passed via targetsToUse in the options below — no need to modify game.user.targets\n      // which would clobber the GM's real targets before completeActivityUse can save them.\n\n      // Handle stacking damage rolls\n      if (damageRoll && activityData.damage?.parts?.[0]) {\n        let damageRollString = damageRoll;\n        let stackCount = effect.flags.dae?.stacks ?? 1;\n        if (globalThis.EffectCounter && theTargetToken) {\n          // This only runs for combatants and\n          const counter = globalThis.EffectCounter.findCounter(getTokenDocument(theTargetToken), effect.img ?? effect.icon) //v12 icon -> img\n          if (counter) stackCount = counter.getValue();\n        }\n        for (let i = 1; i < stackCount; i++)\n          damageRollString = `${damageRollString} + ${damageRoll}`;\n        activityData.damage.parts[0].custom.formula = damageRollString;\n      }\n\n      // Set additional item flags\n      foundry.utils.setProperty(itemData.flags, \"midi-qol.forceCEOff\", true);\n      if (killAnim) foundry.utils.setProperty(itemData.flags, \"autoanimations.killAnim\", true)\n      if (macroToCall) {\n        foundry.utils.setProperty(itemData, `flags.${MODULE_ID}.onUseMacroName`, macroToCall);\n        foundry.utils.setProperty(itemData, `flags.${MODULE_ID}.onUseMacroParts`, new OnUseMacros(macroToCall));\n      }\n\n      // Try and find the source actor for the overtime effect so that optional bonuses etc can fire.\n      let origin: any = fromUuidSync(effect.origin);\n      while (origin && !(origin instanceof Actor)) {\n        origin = origin?.parent;\n      }\n      itemData.system.activities = { \"overtime\": activityData };\n      foundry.utils.setProperty(itemData, `flags.${MODULE_ID}.syntheticItem`, true);\n      let ownedItem: Item = new CONFIG.Item.documentClass(itemData, { parent: ((origin instanceof Actor) ? origin : actor) });\n      ownedItem.prepareData();\n      // @ts-expect-error no dnd5e-types\n      ownedItem.prepareFinalAttributes();\n      // Register effect for save/fail count tracking if either is specified\n      // Skip registration if effect is already permanent (no save processing needed)\n      if (!actionSave && !isPermanent && (saveCount || failCount) && saveDC > -1) {\n        // @ts-expect-error no dnd5e-types\n        const activityUuid = ownedItem.system.activities.contents[0].uuid;\n        savedOverTimeEffectsToDelete[activityUuid] = {\n          uuid: effect.uuid,\n          saveCount: saveCount?.count,\n          saveCountAction: saveCount ? countActionToString(saveCount) : undefined,\n          saveConsecutive: saveCount?.consecutive ?? false,\n          failCount: failCount?.count,\n          failCountAction: failCount ? countActionToString(failCount) : undefined,\n          failConsecutive: failCount?.consecutive ?? false,\n        };\n      }\n\n      if (details.removeCondition) {\n        let value = replaceAtFields(details.removeCondition, rollData, { blankValue: 0, maxIterations: 3 });\n        let remove;\n        try {\n          remove = await evalCondition(value, rollData, { errorReturn: true, async: true });\n          // remove = Roll.safeEval(value);\n        } catch (err) {\n          const message = `midi-qol | gmOverTimeEffect | error when evaluating overtime remove condition ${value} - assuming true`;\n          TroubleShooter.recordError(err, message);\n          console.warn(message, err);\n          remove = true;\n        }\n        if (remove) {\n          // @ts-expect-error no dnd5e-types\n          const otKey = ownedItem.system.activities.contents[0].uuid;\n          overTimeEffectsToDelete[otKey] = { uuid: effect.uuid }\n        }\n      }\n      try {\n        const options = {\n          createWorkflow: true,\n          configureDialog: false,\n          saveDC,\n          fastForwardAttack,\n          fastForwardDamage,\n          autoRollAttack,\n          autoRollDamage: autoRollDamage ? \"onHit\" : \"none\",\n          checkGMStatus: true,\n          targetsToUse: new Set([theTargetToken]),\n          // targetUuids: [theTargetUuid],\n          ignoreUserTargets: true,\n          workflowOptions: { targetConfirmation: \"none\", isOverTime: true, allowIncapacitated },\n          flags: {\n            dnd5e: { \"itemData\": ownedItem.toObject() },\n          }\n        };\n        foundry.utils.setProperty(options, `flags.${MODULE_ID}.isOverTime`, true);\n        await completeItemUse(ownedItem, { midiOptions: options }, { configure: false }, { rollMode: rollMode as keyof CONFIG.Dice.RollModes | undefined, systemCard: false }); // worried about multiple effects in flight so do one at a time\n        if (actionSaveSuccess) {\n          await expireEffects(actor, [effect], { \"expiry-reason\": \"midi-qol:overTime:actionSave\" });\n        }\n        /*\n        if (actionSaveSuccess !== undefined && !saveResultDisplayed) {\n          let content;\n          if (actionSaveSuccess) {\n            content = `${effect.name} ${messageFlavor[details.rollType]} ${i18n(\"midi-qol.save-success\")}`;\n          } else {\n            content = `${effect.name} ${messageFlavor[details.rollType]} ${i18n(\"midi-qol.save-failure\")}`;\n          }\n          ChatMessage.create({ content, speaker: ChatMessage.getSpeaker({ actor }) });\n        }\n        */\n        return effect.id;\n      } catch (err) {\n        const message = \"midi-qol | completeItemUse | error\";\n        TroubleShooter.recordError(err, message);\n        console.warn(message, err);\n      } finally {\n      }\n    }\n  }\n}\n\nexport async function _processActivityOverTime(combat: Combat.Implementation, data: Combat.UpdateData, options: Combat.Database.UpdateOptions, userId: string) {\n  if (!preferredActiveGM()?.isSelf) return;\n  const combatStart = combat.round === 1 && combat.turn === 0;\n  let prev = (combat.previous?.round ?? 0) * 100 + (combat.previous?.turn ?? 0);\n  let testTurn = combat.previous?.turn ?? 0;\n  let testRound = combat.previous?.round ?? 0;\n  const last = (data.round ?? combat.current.round ?? 0) * 100 + (data.turn ?? combat.current.turn ?? 0);\n\n  let toTest = prev;\n  let count = 0;\n  const maxIterations = combatStart ? 1 : 200;\n  while (toTest <= last && count < maxIterations) { // step through each turn from prev to current\n    count += 1; // make sure we don't do an infinite loop\n    // Check if combat was deleted during processing (can happen with async operations)\n    if (!combat.id || !game.combats?.get(combat.id)) return;\n    const actor = combat.turns[testTurn]?.actor;\n    const endTurn = toTest < last;\n    const startTurn = toTest > prev || combatStart;\n\n    if (actor) for (let effect of actor.appliedEffects) {\n      if (effect.changes.some(change => change.key.startsWith(`flags.${MODULE_ID}.ActivityOverTime`))) {\n        await doActivityOverTimeEffect(actor, effect, startTurn);\n      }\n    }\n    testTurn += 1;\n    if (testTurn === combat.turns.length) {\n      testTurn = 0;\n      testRound += 1;\n      toTest = testRound * 100;\n    } else toTest += 1;\n  }\n}\nexport async function _processOverTime(combat: Combat.Implementation, data: Combat.UpdateData, options: Combat.Database.UpdateOptions, userId: string) {\n  if (!preferredActiveGM()?.isSelf) return;\n  const combatStart = combat.round === 1 && combat.turn === 0;\n  let prev = (combat.previous?.round ?? 0) * 100 + (combat.previous?.turn ?? 0);\n  let testTurn = combat.previous?.turn ?? 0;\n  let testRound = combat.previous?.round ?? 0;\n  const last = (data.round ?? combat.current.round ?? 0) * 100 + (data.turn ?? combat.current.turn ?? 0);\n\n  let toTest = prev;\n  let count = 0;\n  const maxIterations = combatStart ? 1 : 200;\n  while (toTest <= last && count < maxIterations) { // step through each turn from prev to current\n    count += 1; // make sure we don't do an infinite loop\n    // Check if combat was deleted during processing (can happen with async operations)\n    if (!combat.id || !game.combats?.get(combat.id)) return;\n    const actor = combat.turns[testTurn]?.actor;\n    const endTurn = toTest < last;\n    const startTurn = toTest > prev || combatStart;\n\n    // Remove reaction used status from each combatant\n    if (actor && toTest !== prev && !installedModules.get(\"times-up\")) {\n      // do the whole thing as a GM to avoid multiple calls to the GM to set/remove flags/conditions\n      await unTimedExecuteAsGM(\"removeActionBonusReaction\", { actorUuid: actor.uuid });\n    }\n    if (actor && toTest !== prev) {\n      removeActionUsed(actor);\n    }\n\n    if (actor) for (let effect of actor.appliedEffects) {\n      if (effect.changes.some(change => change.key.startsWith(`flags.${MODULE_ID}.OverTime`))) {\n        await doOverTimeEffect(actor, effect, startTurn);\n      }\n    }\n    testTurn += 1;\n    if (testTurn === combat.turns.length) {\n      testTurn = 0;\n      testRound += 1;\n      toTest = testRound * 100;\n    } else toTest += 1;\n  }\n}\nexport async function completeActivityUse(activityRef: Activity | string | undefined,\n  usage: ActivityUseConfiguration = {},\n  dialog: RollDialogConfig = {},\n  message: RollMessageConfig = {}\n): Promise<Workflow | undefined> {\n  activityRef = foundry.utils.deepClone(activityRef);\n  usage.midiOptions ??= {};\n  let targetsToUse: Set<Token.Implementation> = new Set();\n  if (usage.midiOptions.targetsToUse && !(usage.midiOptions.targetsToUse instanceof Set)) {\n    error(\"completeActivityUse | targetsToUse is not a Set\");\n  } else if (usage.midiOptions.targetsToUse) {\n    targetsToUse = (usage.midiOptions.targetsToUse).map(t => getToken(t)).filter(t => !!t);\n  }\n  if (usage.midiOptions.targetUuids) {\n    for (let targetUuid of usage.midiOptions.targetUuids) {\n      const theTarget = getToken(targetUuid);\n      if (theTarget) {\n        targetsToUse.add(theTarget);\n      }\n    }\n  }\n  // Targets to use will be the union of usage.midiOptions.targetsToUse and usage.midiOptions.targetUuids\n  const activity = (typeof activityRef === \"string\") ? fromUuidSync(activityRef) as Activity | undefined : activityRef;\n  if (!activity) return;\n  let asUser: User.Implementation | undefined | null = (typeof usage.midiOptions.asUser === \"string\") ? game.users?.get(usage.midiOptions.asUser) : usage.midiOptions.asUser;\n  const asUserActive = asUser?.active;\n  if (!asUserActive && (usage.midiOptions.checkGMstatus && !game.user?.isGM))\n    asUser = preferredActiveGM();\n  if (!asUser) asUser = game.user;\n  // asUser will be the requested user, a GM user if there is one active or self\n  foundry.utils.setProperty(usage, \"midiOptions.workflowOptions.forceCompletion\", true);\n  let localRoll = asUser?.id === game.user?.id;\n  if (localRoll) {\n    return await new Promise((resolve) => {\n      const maxWait = 90; // If the activity usage doesn't complete in 90 seconds then we have a problem\n      // Local save of current targets — restored on cleanup\n      const localSavedTargetIds = Array.from(game.user?.targets ?? []).map(t => t.id);\n      if (usage.midiOptions!.ignoreUserTargets) updateUserTargets([]);\n      if (game.user && targetsToUse.size === 0 && activity.target?.affects?.type === \"self\") {\n        const selfTarget = getToken(activity.item.actor);\n        if (selfTarget) {\n          updateUserTargets([selfTarget.id]);\n          targetsToUse = new Set([selfTarget]);\n        } else {\n          updateUserTargets([]);\n        }\n      } else if (targetsToUse.size === 0 && !usage.midiOptions!.ignoreUserTargets) {\n        targetsToUse = new Set(game.user?.targets);\n      }\n\n      let abortHookName = `midi-qol.preAbort.${activity?.uuid}`;\n      if (!(activity)) {\n        // Magic items create a pseudo item when doing the roll so have to hope we get the right completion\n        abortHookName = \"midi-qol.preAbort\";\n      }\n      usage.sequenceId = foundry.utils.randomID();\n      let completeHookName = `midi-qol.postCleanup.${activity.uuid}`;\n      // @ts-expect-error no clue\n      if (!activity || activity.activity?.id || activity.type === \"cast\") {\n        // Magic items create a pseudo item when doing the roll so have to hope we get the right completion\n        // Forward activities and CastActivity won't fire postCleanup with the cast activity's UUID —\n        // the spell workflow fires it with the spell activity's UUID instead.\n        // Use the generic hook and rely on sequenceId gating to match the correct workflow.\n        completeHookName = \"midi-qol.postCleanup\";\n      }\n\n      // Both hooks and the timeout do the same cleanup: unregister hooks, restore targets, resolve.\n      let timeoutId: ReturnType<typeof setTimeout> | undefined;\n      const cleanupAndResolve = (result: any, source?: string) => {\n        if (timeoutId !== undefined) { clearTimeout(timeoutId); timeoutId = undefined; }\n        //@ts-expect-error dynamic hook name\n        Hooks.off(abortHookName, abortHookId);\n        //@ts-expect-error dynamic hook name\n        Hooks.off(completeHookName, completeHookId);\n        if (source && debugEnabled > 0) warn(`completeActivityUse ${source}: ${activity?.item?.name} ${completeHookName}`);\n        updateUserTargets(localSavedTargetIds);\n        resolve(result);\n      };\n\n      //@ts-expect-error dynamic hook name\n      const abortHookId = Hooks.on(abortHookName, (workflow: Workflow) => {\n        if (workflow.sequenceId !== usage.sequenceId) return;\n        cleanupAndResolve(workflow, \"preAbort\");\n      });\n      //@ts-expect-error dynamic hook name\n      const completeHookId = Hooks.on(completeHookName, (workflow: Workflow) => {\n        if (workflow.sequenceId !== usage.sequenceId) return;\n        cleanupAndResolve(workflow, \"postCleanup\");\n      });\n      timeoutId = setTimeout(() => {\n        cleanupAndResolve(undefined, \"timeout\");\n      }, maxWait * 1000);\n      usage.midiOptions!.targetsToUse = targetsToUse;\n      // @ts-expect-error no dnd5e-types\n      activity.use(usage, dialog, message).then(result => {\n        if (!result) {\n          cleanupAndResolve(result);\n        }\n      }).catch(err => {\n        TroubleShooter.recordError(err, \"completeActivityUse | activity.use failed\");\n        cleanupAndResolve(undefined, \"error\");\n      });\n    });\n  } else {\n    const newUsage = foundry.utils.deepClone(usage) as unknown as { sequenceId?: string; workflow?: Workflow; midiOptions: SerializedMidiOptions };\n    newUsage.midiOptions ??= {};\n    newUsage.midiOptions.targetsToUse = Array.from(targetsToUse).map(t => t.document.uuid);\n    if (usage.midiOptions.rollAs) newUsage.midiOptions.rollAs = usage.midiOptions.rollAs.uuid;\n    const data = {\n      activityUuid: activity.uuid,\n      actorUuid: activity.item.parent?.uuid,\n      usage: newUsage,\n      dialog,\n      message\n    }\n    if (asUser)\n      return await socketlibSocket.executeAsUser(\"completeActivityUse\", asUser.id, data);\n    else\n      return await timedAwaitExecuteAsGM(\"completeActivityUse\", data);\n  }\n}\n\nexport type MidiOptions = {\n  activityId?: string;\n  activityIdentifier?: string;\n  advantage?: boolean;\n  asUser?: User.Implementation | string;\n  chatMessage?: boolean;\n  checkGMstatus?: boolean;\n  configureDialog?: boolean;\n  critical?: number;\n  disadvantage?: boolean;\n  event?: AugmentedEvent;\n  fastForward?: boolean;\n  fastForwardAttack?: boolean;\n  fastForwardDamage?: boolean;\n  fastForwardHeal?: boolean;\n  fastForwardSet?: boolean;\n  fumble?: boolean | number;\n  recomputeAdvantage?: boolean;\n  ignoreUserTargets?: boolean;\n  isConcentrationCheck?: boolean;\n  isCritical?: boolean;\n  isDummy?: boolean;\n  isFumble?: boolean;\n  isMagicSave?: boolean;\n  isTriggered?: boolean;\n  item?: Item.Implementation;\n  itemCardUuid?: string;\n  itemUuid?: string;\n  noUseWarning?: boolean;\n  parts?: string[];\n  powerLevel?: number;\n  proceedChecks?: {\n    checkBonusAction?: boolean;\n    checkReaction?: boolean;\n    none?: boolean;\n  };\n  rollAs?: Actor.Implementation | null;\n  rollOptions?: WorkflowRollOptions;\n  saveItem?: Item.Implementation;\n  saveItemUuid?: string;\n  simulate?: boolean;\n  // grantsActor/grantsToken: The opposing entity that grants advantage/disadvantage.\n  // For attacks: the defender (target). For saves/checks: the caster (workflow.actor).\n  // Falls back to the actor themselves when there is no opposing entity.\n  grantsActor?: Actor.Implementation;\n  grantsToken?: Token.Implementation;\n  spellLevel?: number;\n  target?: number;\n  targets?: Set<foundry.canvas.placeables.Token.Implementation>;\n  targetsToUse?: Set<foundry.canvas.placeables.Token.Implementation>;\n  targetUuids?: string[];\n  triggeredActivity?: boolean;\n  addOptionalBonuses?: boolean;\n  updateWorkflow?: boolean;\n  workflow?: Workflow;\n  workflowId?: string;\n  workflowOptions?: WorkflowOptions;\n  /** Multiple abilities available for a save/check (e.g., [\"str\", \"dex\"]) */\n  rollAbilities?: string[];\n  /** Multiple skills available for a skill check (e.g., [\"ath\", \"acr\"]) */\n  rollSkills?: string[];\n  /** Multiple tools available for a tool check (e.g., [\"thief\", \"smith\"]) */\n  rollTools?: string[];\n  /** Pre-computed advantage data per choice (ability/skill/tool), populated by Workflow.ts and deserialized by GMAction.\n   *  A roll is always ONE type, so one object suffices for abilities, skills, or tools.\n   */\n  advantageByChoice?: Record<string, PreComputedAdvantageData>;\n};\ntype SerializedMidiOptions = Omit<MidiOptions, \"targetsToUse\" | \"rollAs\" | \"asUser\"> & {\n  targetsToUse?: string[];\n  rollAs?: string;\n}\n\nexport async function completeItemUse(itemRef: Item.Implementation | string, config: ActivityUseConfiguration & { legacy?: boolean, chooseActivity?: boolean } = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n  const item = (typeof itemRef === \"string\") ? (await fromUuid(itemRef) as Item.Implementation | undefined) : itemRef;\n  const { legacy, chooseActivity, ...activityConfig } = config;\n  if (legacy) {\n    error(\"completeItemUse | legacy rolls are no longer supported\");\n    return;\n  }\n  config.midiOptions ??= {};\n  if (!(item instanceof CONFIG.Item.documentClass)) {\n    error(\"completeItemUse only works for items\", item);\n    return;\n  }\n  if (config.midiOptions.activityId || config.midiOptions.activityIdentifier) {\n    // @ts-expect-error no dnd5e-types\n    const selected: Activity = item.system.activities.find(a => a.id === config.midiOptions.activityId || a.identifier === config.midiOptions.activityIdentifier)\n    if (selected) return completeActivityUse(selected, activityConfig, dialog, message);\n  }\n  // If this spell was created by a CastActivity (cached spell), redirect through the\n  // CastActivity so its consumption targets (e.g. Paladin's Smite limited uses) are consumed.\n  // This handles the case where external modules call completeItemUse(spell) directly.\n  // @ts-expect-error no dnd5e-types\n  const linkedCastActivity = item.type === \"spell\" && item.system.linkedActivity;\n  if (linkedCastActivity) {\n    return completeActivityUse(linkedCastActivity, activityConfig, dialog, message);\n  }\n  // @ts-expect-error no dnd5e-types\n  // Filter usable activities: exclude riders, automationOnly, and activities that fail visibility checks (canUse)\n  const activities = item.system.activities?.filter(a =>\n    a.canUse !== false &&\n    !item.flags.dnd5e?.riders?.activity?.includes(a.id) &&\n    !a.midiProperties?.automationOnly\n  );\n  if (activities.length === 0) {\n    //@ts-expect-error no dnd5e-types\n    return item.displayCard(message);\n    // error(`completeItemUse | item ${item.name} ${item.uuid} does not have a suitable activity`);\n    // return undefined;\n  }\n  // Apply the module prune hook (midi-qol.itemUseActivitySelect) before deciding: create() skips the\n  // dialog for a single survivor and returns null (skip the roll) if modules removed them all.\n  const activity = await MidiActivityChoiceDialog.create(item, { chooseActivity });\n  if (activity) return completeActivityUse(activity, activityConfig, dialog, message);\n  return undefined;\n}\n\nexport function untargetAllTokens(combat: Combat.Implementation) {\n  let prevTurn = (combat.current.turn ?? 0) - 1;\n  if (prevTurn === -1)\n    prevTurn = combat.turns.length - 1;\n\n  const previous = combat.turns[prevTurn];\n  if ((game.user?.isGM && [\"allGM\", \"all\"].includes(autoRemoveTargets)) || (autoRemoveTargets === \"all\" && canvas.tokens?.controlled.find(t => t.id === previous.token?.id))) {\n    // release current targets\n    game.user?.targets.forEach((t: Token) => {\n      t.setTarget(false, { releaseOthers: false });\n    });\n  }\n}\n\n/**\n * Get the vitality item for an actor (a feature with uses that serves as a vitality pool)\n * @param actor The actor to get the vitality item for\n * @returns The vitality item if found, undefined otherwise\n */\nexport function getVitalityItem(actor: Actor.Implementation | null | undefined): Item.Implementation | undefined {\n  if (!actor) return undefined;\n  const itemName = checkRule(\"vitalityItem\");\n  if (typeof itemName !== \"string\" || !itemName) return undefined;\n  return actor.items.getName(itemName) ?? undefined;\n}\n\n/**\n * Get the current vitality value for an actor\n * @param actor The actor to get vitality for\n * @returns The current vitality value, or undefined if no vitality system is configured\n */\nexport function getVitalityValue(actor: Actor.Implementation | null | undefined): number | undefined {\n  if (!actor) return undefined;\n\n  const vitalityItem = getVitalityItem(actor);\n  if (vitalityItem) {\n    // @ts-expect-error uses exists on items with uses\n    return vitalityItem.system.uses?.value ?? 0;\n  }\n\n  return undefined;\n}\n\n/**\n * Get the maximum vitality value for an actor\n * @param actor The actor to get max vitality for\n * @returns The maximum vitality value, or undefined if no vitality system is configured\n */\nexport function getVitalityMax(actor: Actor.Implementation | null | undefined): number | undefined {\n  if (!actor) return undefined;\n\n  const vitalityItem = getVitalityItem(actor);\n  if (vitalityItem) {\n    // @ts-expect-error uses exists on items with uses\n    return vitalityItem.system.uses?.max ?? 0;\n  }\n\n  return undefined;\n}\n\n/**\n * Check if the actor has a vitality system configured\n */\nexport function hasVitalitySystem(actor: Actor.Implementation | null | undefined): boolean {\n  if (!actor) return false;\n  return !!getVitalityItem(actor);\n}\n\nexport function checkDefeated(actorRef: Actor.Implementation | TokenOrDocument | string): 0 | 1 {\n  const actor = getActor(actorRef);\n  if (!actor) return 0;\n\n  return hasCondition(actor, CONFIG.specialStatusEffects.DEFEATED)\n    || hasCondition(actor, configSettings.midiDeadCondition);\n}\n\nexport function checkIncapacitated(actorRef?: Actor.Implementation | TokenOrDocument | string | null, logResult: boolean = true, warning: boolean = false): string | false {\n  const actor: Actor | null | undefined = getActor(actorRef);\n  if (!actor) return false;\n  let status: string | false = false;\n  // @ts-expect-error no dnd5e-types\n  if (actor.system.traits?.ci?.value?.has(\"incapacitated\")) return false;\n\n  // Check vitality system\n  const vitality = getVitalityValue(actor as Actor.Implementation);\n  if (vitality !== undefined) {\n    // Check vitalityDeathRequires setting: \"vitalityOnly\" = dead when vitality=0, \"vitalityAndHP\" = dead when both are 0\n    const deathRequires = configSettings.optionalRules.vitalityDeathRequires || \"vitalityOnly\";\n    // @ts-expect-error no dnd5e-types\n    const hpValue = actor?.system.attributes?.hp?.value ?? 0;\n    if (deathRequires === \"vitalityOnly\") {\n      // Dead when vitality reaches 0, regardless of HP\n      if (vitality <= 0) {\n        status = \"dead\";\n      }\n    } else {\n      // Dead only when both vitality and HP are 0\n      if (vitality <= 0 && hpValue <= 0) {\n        status = \"dead\";\n      }\n    }\n  } else {\n    // No vitality system - just check HP\n    // @ts-expect-error no dnd5e-types\n    if (!actor.system?.attributes?.hp?.value) {\n      (debug(\"No hp attribute for \", actor));\n    }\n    // @ts-expect-error no dnd5e-types\n    if (actor?.system?.attributes?.hp?.value <= 0) {\n      status = \"dead\";\n    }\n  }\n\n  if (configSettings.midiUnconsciousCondition && hasCondition(actor, configSettings.midiUnconsciousCondition)) {\n    status = configSettings.midiUnconsciousCondition;\n  }\n  if (configSettings.midiDeadCondition && hasCondition(actor, configSettings.midiDeadCondition)) {\n    status = configSettings.midiDeadCondition;\n  }\n  const incapCondition = (globalThis.MidiQOL.incapacitatedConditions ?? [\"incapacitated\"]).find(cond => hasCondition(actor, cond));\n  if (incapCondition) {\n    status = incapCondition;\n  }\n  if (status) logIncapacitatedCheckResult(actor.name ?? \"unknown\", status, logResult, warning);\n  return status;\n}\n\nexport function logIncapacitatedCheckResult(actorName: string, status: string, logResult: boolean = true, warning: boolean = false) {\n  const displayString = status === \"incapacitated\" ? `${actorName} is ${getStatusName(status)}` : `${actorName} is ${getStatusName(status)} and therefore ${getStatusName(\"incapacitated\")}`;\n  if (logResult) log(displayString);\n  if (warning) ui.notifications?.warn(displayString);\n}\n\nexport function getUnitDist(x1: number, y1: number, z1: number, token2): number {\n  if (!canvas.dimensions) return 0;\n  const unitsToPixel = canvas.dimensions.size / canvas.dimensions.distance;\n  z1 = z1 * unitsToPixel;\n  const x2 = token2.center.x;\n  const y2 = token2.center.y;\n  const z2 = token2.document.elevation * unitsToPixel;\n\n  const d =\n    Math.sqrt(\n      Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2) + Math.pow(z2 - z1, 2)\n    ) / unitsToPixel;\n  return d;\n}\n\nexport function distancePointToken({ x, y, elevation = 0 }, token, wallblocking = false): number | undefined {\n  if (!canvas || !canvas.scene) return undefined;\n  let coverACBonus = 0;\n  let tokenTileACBonus = 0;\n\n  let coverData;\n  if (!canvas.grid || !canvas.dimensions) undefined;\n  if (!token || x === undefined || y === undefined) return undefined;\n  if (!canvas || !canvas.grid || !canvas.dimensions) return undefined;\n  const t2StartX = -Math.max(0, token.document.width / 2 - 0.5);\n  const t2StartY = -Math.max(0, token.document.height / 2 - 0.5);\n  //  const [row, col] = canvas.grid?.getGridPositionFromPixels(x, y) || [0, 0];\n  //  const [xBase, yBase] = canvas.grid?.getPixelsFromGridPosition(row, col) || [0, 0];\n  let xc, yc;\n  let distance = +Infinity;\n  for (let xStep = t2StartX; xStep < token.document.width / 2; xStep += 1) {\n    for (let yStep = t2StartY; yStep < token.document.height / 2; yStep += 1) {\n      const xBase = xStep * canvas.grid.size + token.center.x;\n      const yBase = yStep * canvas.grid.size + token.center.y;\n      ({ x: xc, y: yc } = canvas.grid.getCenterPoint({ x: xBase, y: yBase }) || { x: 0, y: 0 });\n      // ({ x: xc, y: yc } = canvas.grid.getCenterPoint.bind(canvas.grid)({ x, y }) || { x: 0, y: 0 });\n      const newDistance = canvas.grid.measurePath([new PIXI.Point(x, y), { x: xc, y: yc }], {}).distance;\n      if (newDistance < 1) {\n        coverACBonus += 1;\n        tokenTileACBonus += 1;\n      }\n      if (newDistance < distance) distance = newDistance;\n    }\n  }\n  return distance;\n}\n\nexport function checkDistance(t1: any, t2: any, distance: number, options: { wallsBlock?: boolean, includeCover?: boolean } = { wallsBlock: false, includeCover: true }): boolean {\n  const { wallsBlock = false, includeCover = true } = options;\n  const dist = getDistance(t1, t2, { wallsBlock, includeCover });\n  return 0 <= dist && dist <= distance;\n}\n\n// ==================== PERIMETER DISTANCE HELPERS ====================\n// These functions compute the minimum distance between token perimeters (actual shapes)\n// rather than between grid square centers. Supports all v13 token shapes:\n// rectangles, hexagonal polygons, circles, and ellipses.\n\n/**\n * Get a token's perimeter as a PIXI.Polygon in world coordinates.\n * Uses token.getShape() for the actual shape (hex, circle, ellipse, rectangle)\n * and translates from local to world coordinates.\n */\nexport function getTokenPerimeterPolygon(token: Token): PIXI.Polygon {\n  const shape = token.getShape();\n  const { x, y } = token.document;\n\n  let polygon: PIXI.Polygon;\n  if (shape instanceof PIXI.Polygon) {\n    polygon = shape;\n  } else if (shape instanceof PIXI.Circle) {\n    //@ts-expect-error Foundry extends PIXI.Circle with toPolygon()\n    polygon = shape.toPolygon();\n  } else if (shape instanceof PIXI.Ellipse) {\n    polygon = ellipseToPolygon(shape);\n  } else {\n    // PIXI.Rectangle — Foundry extends with toPolygon()\n    polygon = (shape as any).toPolygon();\n  }\n\n  // Translate from local (origin 0,0) to world coordinates\n  const pts = polygon.points;\n  const worldPts: number[] = new Array(pts.length);\n  for (let i = 0; i < pts.length; i += 2) {\n    worldPts[i] = pts[i] + x;\n    worldPts[i + 1] = pts[i + 1] + y;\n  }\n  return new PIXI.Polygon(worldPts);\n}\n\n/**\n * Approximate a PIXI.Ellipse as a PIXI.Polygon.\n * Foundry provides toPolygon() for Circle and Rectangle but not Ellipse.\n */\nfunction ellipseToPolygon(ellipse: PIXI.Ellipse, segments: number = 24): PIXI.Polygon {\n  const pts: number[] = [];\n  // PIXI.Ellipse stores half-widths in .width and .height properties\n  for (let i = 0; i < segments; i++) {\n    const angle = (2 * Math.PI * i) / segments;\n    pts.push(ellipse.x + ellipse.width * Math.cos(angle));\n    pts.push(ellipse.y + ellipse.height * Math.sin(angle));\n  }\n  return new PIXI.Polygon(pts);\n}\n\n/**\n * Find the closest point on a polygon's perimeter to a given point.\n * Uses foundry.utils.closestPointToSegment for each edge.\n * @param polygon - The polygon (in world coordinates, closed or open)\n * @param px - X coordinate of the point\n * @param py - Y coordinate of the point\n * @returns The closest point on the polygon's perimeter\n */\nexport function closestPointOnPerimeter(polygon: PIXI.Polygon, px: number, py: number): { x: number, y: number } {\n  const pts = polygon.points;\n  const numPts = pts.length;\n  if (numPts < 4) return { x: px, y: py };\n\n  const c = { x: px, y: py };\n  let bestDistSq = Infinity;\n  let best = { x: px, y: py };\n\n  for (let i = 0; i < numPts; i += 2) {\n    const ni = (i + 2) % numPts;\n    const a = { x: pts[i], y: pts[i + 1] };\n    const b = { x: pts[ni], y: pts[ni + 1] };\n    // Skip degenerate zero-length edges\n    if (a.x === b.x && a.y === b.y) continue;\n    const closest = foundry.utils.closestPointToSegment(c, a, b);\n    const dx = closest.x - px;\n    const dy = closest.y - py;\n    const distSq = dx * dx + dy * dy;\n    if (distSq < bestDistSq) {\n      bestDistSq = distSq;\n      best = closest;\n    }\n  }\n  return best;\n}\n\n/**\n * Compute the closest points on two polygon perimeters.\n * @param poly1 - First polygon (in world coordinates)\n * @param poly2 - Second polygon (in world coordinates)\n * @returns The closest points on each polygon's perimeter\n */\nexport function closestPerimeterPoints(poly1: PIXI.Polygon, poly2: PIXI.Polygon): { p1: { x: number, y: number }, p2: { x: number, y: number } } {\n  // Quick overlap check using bounding boxes\n  const b1 = poly1.getBounds();\n  const b2 = poly2.getBounds();\n  const overlapX = b1.left < b2.right && b1.right > b2.left;\n  const overlapY = b1.top < b2.bottom && b1.bottom > b2.top;\n\n  if (overlapX && overlapY) {\n    // Bounding boxes overlap — check if polygons actually overlap\n    // Use centroid containment as a fast check for convex shapes\n    const c1 = polygonCentroid(poly1);\n    const c2 = polygonCentroid(poly2);\n    if (poly1.contains(c2.x, c2.y) || poly2.contains(c1.x, c1.y)) {\n      const midX = (c1.x + c2.x) / 2;\n      const midY = (c1.y + c2.y) / 2;\n      return { p1: { x: midX, y: midY }, p2: { x: midX, y: midY } };\n    }\n  }\n\n  // Iterative closest-point refinement (converges for convex shapes)\n  const c2 = polygonCentroid(poly2);\n  let p1 = closestPointOnPerimeter(poly1, c2.x, c2.y);\n  let p2 = closestPointOnPerimeter(poly2, p1.x, p1.y);\n  p1 = closestPointOnPerimeter(poly1, p2.x, p2.y);\n  p2 = closestPointOnPerimeter(poly2, p1.x, p1.y);\n\n  return { p1, p2 };\n}\n\n/**\n * Get the centroid of a polygon.\n */\nfunction polygonCentroid(poly: PIXI.Polygon): { x: number, y: number } {\n  const pts = poly.points;\n  let cx = 0, cy = 0;\n  const count = pts.length / 2;\n  for (let i = 0; i < pts.length; i += 2) {\n    cx += pts[i];\n    cy += pts[i + 1];\n  }\n  return { x: cx / count, y: cy / count };\n}\n\n\n\n/**\n * Options for wall collision checking.\n */\nexport interface WallCollisionOptions {\n  /** Source document for the collision check (typically token document) */\n  source?: any;\n  /** The wallsBlockRange setting value */\n  wallsBlockRange: string;\n  /** Pre-computed cover visibility (from external modules like simbuls, levelsautocover) */\n  coverVisible?: boolean;\n  /** Origin point elevation (for Levels API) */\n  originElevation?: number;\n  /** Destination point elevation (for Levels API) */\n  destElevation?: number;\n  /** Origin top elevation (for Levels API) */\n  originTopElevation?: number;\n  /** Destination top elevation (for Levels API) */\n  destTopElevation?: number;\n}\n\n/**\n * Check if a wall blocks the path between two points.\n * Respects the wallsBlockRange setting and handles different collision modes.\n *\n * @param origin - Starting point {x, y}\n * @param dest - Destination point {x, y}\n * @param options - Collision check options\n * @returns true if collision detected (path blocked), false if clear\n */\nexport function checkWallCollision(\n  origin: { x: number, y: number },\n  dest: { x: number, y: number },\n  options: WallCollisionOptions\n): boolean {\n  const { wallsBlockRange, coverVisible, source } = options;\n  let blocked: boolean;\n\n  switch (wallsBlockRange) {\n    case \"center\": {\n      blocked = !!CONFIG.Canvas.polygonBackends.sight.testCollision(origin, dest, {\n        source,\n        mode: \"any\",\n        type: \"sight\"\n      });\n      return blocked;\n    }\n\n    case \"centerLevels\":\n    case \"levelsautocover\":\n      if (installedModules.get(\"levels\")) {\n        if (coverVisible === false) {\n          return true;\n        }\n        if (coverVisible === undefined) {\n          const p1 = { x: origin.x, y: origin.y, z: options.originElevation ?? 0 };\n          const p2 = { x: dest.x, y: dest.y, z: options.destElevation ?? 0 };\n          //@ts-expect-error Levels API not typed\n          const baseToBase = CONFIG.Levels.API.testCollision(p1, p2, \"collision\");\n          const p1Top = { x: origin.x, y: origin.y, z: options.originTopElevation ?? p1.z };\n          const p2Top = { x: dest.x, y: dest.y, z: options.destTopElevation ?? p2.z };\n          //@ts-expect-error Levels API not typed\n          const topToBase = CONFIG.Levels.API.testCollision(p1Top, p2Top, \"collision\");\n          blocked = baseToBase && topToBase;\n          return blocked;\n        }\n        return false;\n      }\n      // Fallback to basic check if Levels not installed\n      blocked = !!CONFIG.Canvas.polygonBackends.sight.testCollision(origin, dest, {\n        source,\n        mode: \"any\",\n        type: \"sight\"\n      });\n      return blocked;\n\n    case \"alternative\":\n    case \"simbuls-cover-calculator\":\n      if (coverVisible === undefined) {\n        blocked = !!CONFIG.Canvas.polygonBackends.sight.testCollision(origin, dest, {\n          source,\n          mode: \"any\",\n          type: \"sight\"\n        });\n        return blocked;\n      }\n      return false;\n\n    case \"simplecover5e\":\n      // simplecover5e wall blocking is handled entirely by the pre-check (getCover with losCheck: true)\n      // No per-ray fallback — if the pre-check didn't resolve, we don't block\n      return false;\n\n    case \"tokencover\":\n      // tokencover is handled entirely by pre-check, no per-segment check needed\n      return false;\n\n    case \"none\":\n    default:\n      return false;\n  }\n}\n\n/**\n * Compute the minimum grid distance between two token perimeters.\n * This finds the closest points on each token's bounding rectangle perimeter\n * and measures the grid distance between them.\n *\n * @param t1 - First token (or token reference)\n * @param t2 - Second token (or token reference)\n * @param options - Options for distance calculation\n * @returns The grid distance between perimeters, or -1 if blocked/invalid\n */\n/**\n * Check if two token shapes overlap.\n * Uses bounding box check then centroid containment for convex shapes.\n */\nfunction shapesOverlap(poly1: PIXI.Polygon, poly2: PIXI.Polygon): boolean {\n  const b1 = poly1.getBounds();\n  const b2 = poly2.getBounds();\n  if (b1.right < b2.left || b1.left > b2.right || b1.bottom < b2.top || b1.top > b2.bottom) return false;\n  const c1 = polygonCentroid(poly1);\n  const c2 = polygonCentroid(poly2);\n  return poly1.contains(c2.x, c2.y) || poly2.contains(c1.x, c1.y);\n}\n\n/**\n * Run module-level pre-checks (levelsautocover, simbuls, tokencover, simplecover5e)\n * to determine if a target is fully blocked before doing per-ray wall checks.\n * Returns { blocked: true } if the module says total cover,\n * or { coverVisible } to pass through to per-ray checks.\n */\nfunction computeWallBlockPreCheck(\n  t1: Token.Implementation,\n  t2: Token.Implementation,\n  wallsBlock: boolean,\n  includeCover: boolean\n): { blocked: boolean, coverVisible?: boolean | undefined } {\n  const wallsBlockRange = configSettings.optionalRules.wallsBlockRange;\n  //@ts-expect-error\n  if (installedModules.get(\"levelsautocover\") && game.settings.get(\"levelsautocover\", \"apiMode\") && wallsBlock && wallsBlockRange === \"levelsautocover\" && includeCover) {\n    //@ts-expect-error\n    const levelsautocoverData = AutoCover.calculateCover(t1, t2, getLevelsAutoCoverOptions());\n    const coverVisible = levelsautocoverData.rawCover > 0;\n    const result = coverVisible ? { blocked: false, coverVisible: true } : { blocked: true };\n    return result;\n  } else if (globalThis.CoverCalculator && wallsBlockRange === \"simbuls-cover-calculator\" && includeCover) {\n    if (t1 === t2) return { blocked: false, coverVisible: undefined };\n    const coverData = globalThis.CoverCalculator.Cover(t1, t2);\n    if (debugEnabled > 0) warn(\"wallBlockPreCheck | simbuls cover calculator \", t1.name, t2.name, coverData);\n    const result = (coverData?.data.results.cover === 3 && wallsBlock) ? { blocked: true } : { blocked: false, coverVisible: true };\n    return result;\n  } else if (installedModules.get(\"tokencover\") && wallsBlockRange === \"tokencover\" && includeCover) {\n    const coverValue = calcTokenCover(t1, t2);\n    const result = (coverValue === 3 && wallsBlock) ? { blocked: true } : { blocked: false, coverVisible: true };\n    return result;\n  } else if (installedModules.get(\"simplecover5e\") && wallsBlockRange === \"simplecover5e\" && wallsBlock) {\n    //@ts-expect-error\n    const simpleCoverApi = game.modules.get(\"simplecover5e\")?.api;\n    if (simpleCoverApi) {\n      // If we're using simple cover to determine walls block have to use losCheck: true, otherwise will never return more than 3/4 cover\n      // const losCheck = !!safeGetGameSetting(\"simplecover5e\", \"losCheck\");\n      const coverResult = simpleCoverApi.getCover({\n        attacker: t1,\n        target: t2,\n        scene: t1.scene,\n        losCheck: true\n      });\n      const result = (coverResult?.bonus === null || coverResult?.cover === \"total\") ? { blocked: true } : { blocked: false, coverVisible: true };\n      return result;\n    }\n  }\n  return { blocked: false, coverVisible: undefined };\n}\n\n\nexport function computePerimeterDistance(\n  t1: any,\n  t2: any,\n  options: DistanceOptions = {}\n): number {\n  let { wallsBlock = false, includeElevation = true, includeCover = true } = options;\n\n  if (!canvas?.scene || !canvas.grid || !canvas.dimensions) return -1;\n\n  const token1 = getPlaceable(t1);\n  const token2 = getPlaceable(t2);\n  if (!token1 || !token2) return -1;\n\n  // Same token - distance is 0\n  if (token1 === token2) return 0;\n\n  // Check ignoreWalls flag\n  const actor = (token1 as Token).actor;\n  const ignoreWallsFlag = actor ? foundry.utils.getProperty(actor, `flags.${MODULE_ID}.ignoreWalls`) : false;\n  if (ignoreWallsFlag) {\n    wallsBlock = false;\n  }\n\n  const poly1 = getTokenPerimeterPolygon(token1 as Token);\n  const poly2 = getTokenPerimeterPolygon(token2 as Token);\n\n  const gridDistance = canvas.dimensions.distance; // typically 5 feet\n\n  // Check if tokens overlap - if so, distance is 0\n  if (shapesOverlap(poly1, poly2)) {\n    return 0;\n  }\n\n  // Find the closest points on each perimeter\n  const { p1, p2 } = closestPerimeterPoints(poly1, poly2);\n\n  // Convert to PIXI.Point to match computeDistance behavior\n  const origin = new PIXI.Point(p1.x, p1.y);\n  const dest = new PIXI.Point(p2.x, p2.y);\n\n  // Check for walls blocking if requested\n  if (wallsBlock) {\n    const wallsBlockRange = configSettings.optionalRules.wallsBlockRange;\n    if (wallsBlockRange !== \"none\") {\n      // Run module pre-checks (simplecover5e, levelsautocover, simbuls, tokencover)\n      const preCheck = computeWallBlockPreCheck(token1 as Token, token2 as Token, wallsBlock, includeCover);\n      if (preCheck.blocked) return -1;\n\n      // If no module pre-check resolved it, cast rays from attacker center to\n      // a grid of 17 boundary test points on the target (same pattern as _canSenseModes).\n      // Block only if ALL rays are blocked by walls.\n      if (preCheck.coverVisible === undefined) {\n        const srcCenter = (token1 as Token).center;\n        const tgtCenter = (token2 as Token).center;\n        const t = Math.min((token2 as Token).w, (token2 as Token).h) / 4;\n        const t2half = Math.min((token2 as Token).w, (token2 as Token).h) / 2 - 2;\n        const offsets = t > 0 ? [\n          [0, 0], [-t, -t], [-t, t], [t, t], [t, -t], [-t, 0], [t, 0], [0, -t], [0, t],\n          [-t2half, -t2half], [-t2half, t2half], [t2half, t2half], [t2half, -t2half], [-t2half, 0], [t2half, 0], [0, -t2half], [0, t2half]\n        ] : [[0, 0]];\n        const testPoints = offsets.map(o => new PIXI.Point(tgtCenter.x + o[0], tgtCenter.y + o[1]));\n        const srcOrigin = new PIXI.Point(srcCenter.x, srcCenter.y);\n\n        const t1Elevation = (token1 as Token).document.elevation ?? 0;\n        const t2Elevation = (token2 as Token).document.elevation ?? 0;\n        const t1DocSize = Math.max((token1 as Token).document.height ?? 1, (token1 as Token).document.width ?? 1);\n        const t2DocSize = Math.min((token2 as Token).document.height ?? 1, (token2 as Token).document.width ?? 1);\n        const t1TopElevation = t1Elevation + t1DocSize * (canvas.dimensions?.distance ?? 5);\n        const t2TopElevation = t2Elevation + t2DocSize * (canvas.dimensions?.distance ?? 5);\n\n        let allBlocked = true;\n        for (const tgtPt of testPoints) {\n          const collision = checkWallCollision(srcOrigin, tgtPt, {\n            source: (token1 as Token).document,\n            wallsBlockRange,\n            coverVisible: preCheck.coverVisible,\n            originElevation: t1Elevation,\n            destElevation: t2Elevation,\n            originTopElevation: t1TopElevation,\n            destTopElevation: t2TopElevation\n          });\n          if (!collision) { allBlocked = false; break; }\n        }\n        if (allBlocked) {\n          return -1;\n        }\n      }\n      // coverVisible === true means module says not blocked — continue to distance calc\n    }\n  }\n\n  // Calculate raw distance between closest perimeter points\n  // The approach depends on the grid type and diagonal mode setting\n  const isGridless = canvas.grid.isGridless;\n  const useGriddedGridless = isGridless && configSettings.griddedGridless;\n\n  let distance: number;\n\n  if (isGridless && !useGriddedGridless) {\n    // Pure gridless: calculate raw euclidean distance directly\n    const dx = dest.x - origin.x;\n    const dy = dest.y - origin.y;\n    const pixelDistance = Math.sqrt(dx * dx + dy * dy);\n    const gridSize = canvas.dimensions?.size ?? 100;\n    distance = (pixelDistance / gridSize) * gridDistance;\n  } else if (useGriddedGridless) {\n    // Gridless with griddedGridless: use proxy to treat as SquareGrid\n    // measurePath on the proxy will use SquareGrid's _measurePath which respects diagonal mode\n    const canvasGridProxy = createSquareGridProxy();\n    const result = canvasGridProxy.measurePath([origin, dest], {});\n    distance = result?.distance ?? 0;\n  } else {\n    // Gridded scene: measurePath calculates distance respecting diagonal mode\n    const result = canvas.grid.measurePath([origin, dest], {});\n    distance = result?.distance ?? 0;\n  }\n\n  // Include elevation difference if requested, using diagonal-aware combination\n  if (includeElevation) {\n    const heightDifference = computeTokenHeightDifference(token1 as Token, token2 as Token);\n    distance = combineDistanceWithHeight(distance, heightDifference);\n  }\n\n  return distance;\n}\n\n/**\n * Measure point-to-point distance using the current grid mode.\n * On gridless scenes with griddedGridless enabled, uses the SquareGrid proxy.\n * Otherwise uses canvas.grid.measurePath directly.\n */\nexport function measurePointDistance(p1: { x: number, y: number }, p2: { x: number, y: number }): number {\n  if (!canvas?.grid) return 0;\n  const isGridless = canvas.grid.isGridless;\n  if (isGridless && configSettings.griddedGridless) {\n    const proxy = createSquareGridProxy();\n    return proxy.measurePath([p1, p2], {})?.distance ?? 0;\n  }\n  return canvas.grid.measurePath([p1, p2], {})?.distance ?? 0;\n}\n\n/**\n * Measure distance from a token to a point using perimeter mode.\n * Finds the closest point on the token's perimeter polygon to the destination point,\n * then measures the grid distance between them.\n */\nfunction measureTokenToPointPerimeter(token: Token, destPoint: { x: number, y: number }): number {\n  if (!canvas?.grid || !canvas.dimensions) return -1;\n  const poly = getTokenPerimeterPolygon(token);\n\n  // Check if the point is inside the token's perimeter\n  if (poly.contains(destPoint.x, destPoint.y)) return 0;\n\n  // Find closest point on the token perimeter to the destination\n  const closest = closestPointOnPerimeter(poly, destPoint.x, destPoint.y);\n  return measurePointDistance(closest, destPoint);\n}\n\nconst SCENE_UNIT_TO_DND5E: Record<string, string> = {\n  ft: \"ft\", feet: \"ft\", foot: \"ft\",\n  m: \"m\", meter: \"m\", meters: \"m\", metre: \"m\", metres: \"m\",\n};\n\nexport function rangeToSceneUnits(value: number | undefined | null, units: string | undefined | null): number {\n  if (!value || !units) return value ?? 0;\n  const sceneUnit = canvas?.scene?.grid?.units?.toLowerCase() ?? \"\";\n  const sceneUnitDnd = SCENE_UNIT_TO_DND5E[sceneUnit] ?? sceneUnit;\n  return (globalThis as any).dnd5e?.utils?.convertLength?.(value, units, sceneUnitDnd, { strict: false }) ?? value;\n}\n\n/**\n * Get the perimeter-based distance from a token to a point, with gridification.\n * This applies the same gridification formula as getDistance in perimeter mode:\n *   distance = gridDistance + max(0, rawDistance - fudgeFactor)\n * Used for template placement range checks and clamping, always measuring from perimeter.\n * @param token - The token to measure from\n * @param point - The destination point\n * @returns The gridified distance, or -1 if invalid, or 0 if point is inside the token\n */\nexport function getPerimeterDistanceToPoint(token: Token, point: { x: number, y: number }): number {\n  if (!canvas?.grid || !canvas.dimensions) return -1;\n  const rawDistance = measureTokenToPointPerimeter(token, point);\n  if (rawDistance < 0) return -1;\n  if (rawDistance === 0) return 0;\n  const gridDistance = canvas.dimensions.distance;\n  const fudgeFactor = configSettings.gridlessFudge ?? 0;\n  return gridDistance + Math.max(0, rawDistance - fudgeFactor);\n}\n\nexport interface DistanceOptions {\n  /** If true, return -1 if walls block line of sight between closest points */\n  wallsBlock?: boolean;\n  /** If true, include cover calculations (for modules like levelsautocover) */\n  includeCover?: boolean;\n  /** If true, include elevation difference in distance calculation */\n  includeElevation?: boolean;\n}\n\n/**\n * Get the distance between two tokens using the configured measurement method.\n * This is the main token-to-token distance function used throughout midi-qol.\n * It respects the configSettings.optionalRules.distanceMeasurement setting.\n *\n * For token-to-point distance (e.g. template placement), use getPerimeterDistanceToPoint() instead.\n *\n * @param t1 - First token (or token reference)\n * @param t2 - Second token (or token reference)\n * @param options - Options for distance calculation\n * @returns The distance between the tokens, or -1 if invalid/blocked\n */\nexport function getDistance(t1: any, t2: any, options: DistanceOptions = {}): number {\n  const { wallsBlock = false, includeCover = true, includeElevation = configSettings.optionalRules.distanceIncludesHeight } = options;\n  const measurementMode = configSettings.optionalRules.distanceMeasurement ?? \"center\";\n  const wallsBlockRange = configSettings.optionalRules.wallsBlockRange;\n  const gridDistance = canvas?.dimensions?.distance ?? 5;\n  const fudgeFactor = configSettings.gridlessFudge ?? 0;\n\n  let distance: number = 0;\n\n  if (measurementMode === \"default\") {\n    // Default: use Foundry's core measurePath between token centers\n    const token1 = getPlaceable(t1);\n    const token2 = getPlaceable(t2);\n    if (!token1 || !token2 || !canvas?.grid) return -1;\n    if (token1 === token2) return 0;\n    // Still run wall blocking checks even in default mode\n    if (wallsBlock) {\n      const preCheck = computeWallBlockPreCheck(token1 as Token.Implementation, token2 as Token.Implementation, wallsBlock, includeCover);\n      if (preCheck.blocked) return -1;\n      // If no module pre-check resolved (coverVisible is undefined), do a basic center-to-center sight check\n      if (preCheck.coverVisible === undefined) {\n        const origin = new PIXI.Point(token1.center.x, token1.center.y);\n        const dest = new PIXI.Point(token2.center.x, token2.center.y);\n        const collision = checkWallCollision(origin, dest, {\n          source: token1.document,\n          wallsBlockRange: configSettings.optionalRules.wallsBlockRange,\n          coverVisible: undefined,\n          originElevation: (token1.document as TokenDocument).elevation ?? 0,\n          destElevation: (token2.document as TokenDocument).elevation ?? 0,\n        });\n        if (collision) return -1;\n      }\n    }\n    const result = canvas.grid.measurePath([token1.center, token2.center], {});\n    distance = result?.distance ?? 0;\n  } else if (measurementMode === \"center\") {\n    distance = computeDistance(t1, t2, { wallsBlock, includeCover, includeElevation });\n  } else if (measurementMode === \"perimeter\") {\n    // computePerimeterDistance returns raw perimeter-to-perimeter distance (0 for adjacent/overlapping)\n    const rawPerimeterDistance = computePerimeterDistance(t1, t2, {\n      wallsBlock,\n      includeCover,\n      includeElevation\n    });\n\n    if (rawPerimeterDistance < 0) {\n      distance = -1;\n    } else {\n      // 0 to fudgeFactor → 5 feet (one grid unit)\n      // >fudgeFactor → 5 + (rawDistance - fudgeFactor)\n      distance = gridDistance + Math.max(0, rawPerimeterDistance - fudgeFactor);\n    }\n  }\n  return distance;\n}\n\n/**\n * Compute the height difference between two tokens, accounting for token volume.\n * Returns 0 if elevation ranges overlap, otherwise the gap plus one grid unit.\n */\nfunction computeTokenHeightDifference(token1: Token, token2: Token): number {\n  if (!canvas?.dimensions) return 0;\n  const gridDistance = canvas.dimensions.distance ?? 5;\n\n  const t1Elevation = token1.document.elevation ?? 0;\n  const t2Elevation = token2.document.elevation ?? 0;\n  const t1DocWidth = token1.document.width ?? 1;\n  const t1DocHeight = token1.document.height ?? 1;\n  const t2DocWidth = token2.document.width ?? 1;\n  const t2DocHeight = token2.document.height ?? 1;\n  const t1TopElevation = t1Elevation + Math.max(t1DocHeight, t1DocWidth) * gridDistance;\n  const t2TopElevation = t2Elevation + Math.min(t2DocHeight, t2DocWidth) * gridDistance;\n\n  // If bottom elevation of either token is within the other's elevation range, no height difference\n  if ((t2Elevation > t1Elevation && t2Elevation < t1TopElevation) || (t1Elevation > t2Elevation && t1Elevation < t2TopElevation)) {\n    return 0;\n  }\n  if (t1Elevation < t2Elevation) { // t2 above t1\n    return Math.max(0, t2Elevation - t1TopElevation) + gridDistance;\n  }\n  if (t1Elevation > t2Elevation) { // t1 above t2\n    return Math.max(0, t1Elevation - t2TopElevation) + gridDistance;\n  }\n  return 0;\n}\n\n/**\n * Combine a flat (horizontal) distance with a height difference using the\n * current diagonal movement rule. Treats the shorter of the two as the\n * \"diagonal\" component and the remainder as the \"straight\" component.\n */\nfunction combineDistanceWithHeight(distance: number, heightDifference: number): number {\n  if (heightDifference <= 0) return distance;\n\n  let nd = Math.min(distance, heightDifference);\n  let ns = Math.abs(distance - heightDifference);\n  const diagonals = safeGetGameSetting(\"core\", \"gridDiagonals\");\n  const GRID_DIAGONALS = CONST.GRID_DIAGONALS;\n\n  let cd: number;\n  switch (diagonals) {\n    case GRID_DIAGONALS.EQUIDISTANT: cd = nd; break;\n    case GRID_DIAGONALS.EXACT: cd = Math.SQRT2 * nd; break;\n    case GRID_DIAGONALS.APPROXIMATE: cd = 1.5 * nd; break;\n    case GRID_DIAGONALS.RECTILINEAR: cd = 2 * nd; break;\n    case GRID_DIAGONALS.ALTERNATING_1:\n      cd = ((nd + 1) & -2) + (nd >> 1);\n      break;\n    case GRID_DIAGONALS.ALTERNATING_2:\n      cd = ((nd + 1) & -2) + (nd >> 1);\n      break;\n    case GRID_DIAGONALS.ILLEGAL:\n      cd = 2 * nd;\n      nd = 0;\n      ns = distance + heightDifference;\n      break;\n    default:\n      cd = nd;\n      break;\n  }\n  return ns + cd;\n}\n\n/** takes two tokens of any size and calculates the distance between them\n*** gets the shortest distance betwen two tokens taking into account both tokens size\n*** if wallblocking is set then wall are checked\n**/\nexport function computeDistance(t1: any /*Token*/, t2: any /*Token*/, options: { wallsBlock?: boolean, includeCover?: boolean, includeElevation?: boolean } = { wallsBlock: false, includeCover: true }): number {\n  if (!canvas?.scene || !canvas.grid || !canvas.dimensions) return -1;\n  t1 = getPlaceable(t1);\n  t2 = getPlaceable(t2);\n  if (!t1 || !t2) return -1;\n  let { wallsBlock = false, includeCover = true, includeElevation = configSettings.optionalRules.distanceIncludesHeight } = options;\n  const actor = t1.actor;\n  const ignoreWallsFlag = foundry.utils.getProperty(actor, `flags.${MODULE_ID}.ignoreWalls`);\n  if (ignoreWallsFlag) {\n    wallsBlock = false;\n  }\n  let t1DocWidth = t1.document.width ?? 1;\n  let t1DocHeight = t1.document.height ?? 1;\n  let t2DocWidth = t2.document.width ?? 1;\n  let t2DocHeight = t2.document.height ?? 1;\n\n  const t1StartX = t1DocWidth >= 1 ? 0.5 : t1DocWidth / 2;\n  const t1StartY = t1DocHeight >= 1 ? 0.5 : t1DocHeight / 2;\n  const t2StartX = t2DocWidth >= 1 ? 0.5 : t2DocWidth / 2;\n  const t2StartY = t2DocHeight >= 1 ? 0.5 : t2DocHeight / 2;\n  const t1Elevation = t1.document.elevation ?? 0;\n  const t2Elevation = t2.document.elevation ?? 0;\n  const t1TopElevation = t1Elevation + Math.max(t1DocHeight, t1DocWidth) * (canvas.dimensions?.distance ?? 5);\n  const t2TopElevation = t2Elevation + Math.min(t2DocHeight, t2DocWidth) * (canvas.dimensions?.distance ?? 5); // assume t2 is trying to make itself small\n  const wallsBlockRange = configSettings.optionalRules.wallsBlockRange;\n  // Module pre-check: full cover means no attack, otherwise skip per-ray los checks\n  const preCheck = wallsBlock ? computeWallBlockPreCheck(t1, t2, wallsBlock, includeCover) : { blocked: false, coverVisible: undefined };\n  if (preCheck.blocked) return -1;\n  const coverVisible = preCheck.coverVisible;\n\n  let segments: { ray: Ray }[] = [];\n  let rayDistance, distance;\n  let heightDifference = 0;\n  if (!(t2.document instanceof WallDocument)) {\n    for (let x = t1StartX; x < t1DocWidth; x++) {\n      for (let y = t1StartY; y < t1DocHeight; y++) {\n        if (y === t1StartY + 1) {\n          if (x > t1StartX && x < t1DocWidth - t1StartX) {\n            // skip to the last y position;\n            y = t1DocHeight - t1StartY;\n          }\n        }\n        const point1 = canvas.grid.getCenterPoint({ x: Math.round(t1.document.x + (canvas.dimensions.size * x)), y: Math.round(t1.document.y + (canvas.dimensions.size * y)) });\n        const origin = new PIXI.Point(point1.x, point1.y);\n        for (let x1 = t2StartX; x1 < t2DocWidth; x1++) {\n          for (let y1 = t2StartY; y1 < t2DocHeight; y1++) {\n            if (y1 === t2StartY + 1) {\n              if (x1 > t2StartX && x1 < t2DocWidth - t2StartX) {\n                // skip to the last y position;\n                y1 = t2DocHeight - t2StartY;\n              }\n            }\n            const point2 = canvas.grid.getCenterPoint({ x: Math.round(t2.document.x + (canvas.dimensions.size * x1)), y: Math.round(t2.document.y + (canvas.dimensions.size * y1)) });\n            const dest = new PIXI.Point(point2.x, point2.y);\n            const r = new foundry.canvas.geometry.Ray(origin, dest);\n            if (wallsBlock) {\n              const collision = checkWallCollision(origin, dest, {\n                source: t1.document,\n                wallsBlockRange: configSettings.optionalRules.wallsBlockRange,\n                coverVisible,\n                originElevation: t1Elevation,\n                destElevation: t2Elevation,\n                originTopElevation: t1TopElevation,\n                destTopElevation: t2TopElevation\n              });\n              if (collision) continue;\n            }\n            segments.push({ ray: r });\n          }\n        }\n      }\n    }\n    if (segments.length === 0) {\n      return -1;\n    }\n    rayDistance = segments.map(ray => midiMeasureDistances([ray], { gridSpaces: true }));\n    distance = Math.min(...rayDistance);\n    if (includeElevation) {\n      heightDifference = computeTokenHeightDifference(t1 as Token, t2 as Token);\n    }\n  } else {\n    const w = t2.document\n    const closestPoint = foundry.utils.closestPointToSegment(t1.center, w.object.edge.a, w.object.edge.b);\n    distance = midiMeasureDistances([{ ray: new foundry.canvas.geometry.Ray(t1.center, closestPoint) }], { gridSpaces: true });\n    if (includeElevation) {\n      if (!w.flags?.[\"wall-height\"]) heightDifference = 0;\n      else {\n        const wh = w.flags?.[\"wall-height\"]\n        if (wh.top === null && wh.bottom === null) heightDifference = 0;\n        else if (wh.top === null) heightDifference = Math.max(0, wh.bottom - t1Elevation);\n        else if (wh.bottom === null) heightDifference = Math.max(0, t1Elevation - wh.top);\n        else heightDifference = Math.max(0, wh.bottom - t1TopElevation, t1Elevation - wh.top);\n      }\n    }\n  }\n  if (includeElevation) {\n    distance = combineDistanceWithHeight(distance, heightDifference);\n  }\n  return Math.max(distance, 0);\n}\n\nlet pointWarn = foundry.utils.debounce(() => {\n  ui.notifications?.warn(\"4 Point LOS check selected but dnd5e-helpers not installed\")\n}, 100)\n\nexport function checkActivityRange(activityIn: Activity, tokenRef: TokenOrDocument | string | undefined, targetsRef: Set<TokenOrDocument | string> | undefined, showWarning: boolean = true): { result: string, attackingToken?: Token.Implementation, range?: number | undefined, longRange?: number | undefined } {\n  if (!canvas || !canvas.scene) return { result: \"normal\" };\n  const checkRangeFunction = (activity: Activity, token: Token.Implementation, targets: Set<Token.Implementation>): { result: string, reason?: string, range?: number | undefined, longRange?: number | undefined } => {\n    if (!canvas || !canvas.scene) return {\n      result: \"normal\",\n    }\n    // check that a range is specified at all\n    if (!activity.range) return {\n      result: \"normal\",\n    };\n\n    if (!token) {\n      if (debugEnabled > 0) warn(`checkRange | ${game.user?.name} no token selected cannot check range`)\n      return {\n        result: \"fail\",\n        reason: `${game.user?.name} no token selected`,\n      }\n    }\n\n    let actor = token.actor;\n    // look at undefined versus !\n    // Note: currently dnd5e can set value to an empty string instead of a number\n    if (!(activity.range.value || activity.range.reach) && !activity.range.long && activity.range.units !== \"touch\") return {\n      result: \"normal\",\n      reason: \"no range specified\"\n    };\n    if (activity.target?.affects.type === \"self\") return {\n      result: \"normal\",\n      reason: \"self attack\",\n      range: 0\n    };\n    // skip non mwak/rwak/rsak/msak types that do not specify a target type\n    if (!allAttackTypes.includes(activity.actionType) && ![\"creature\", \"ally\", \"enemy\"].includes(activity.target?.affects.type)) return {\n      result: \"normal\",\n      reason: \"not an attack\"\n    };\n\n    const attackType = activity.actionType;\n    let range = ((activity.range?.value || activity.range?.reach) ?? 0);\n    let longRange = (activity.range?.long ?? 0);\n    if (activity.actor?.system) { // TODO revisit when/if flags move to activities\n      let conditionData;\n      let rangeBonus = activity.actor?.flags?.[MODULE_ID]?.range?.[attackType] ?? \"0\"\n      rangeBonus = rangeBonus + \" + \" + (activity.actor?.flags?.[MODULE_ID]?.range?.all ?? \"0\");\n      if (rangeBonus !== \"0 + 0\") {\n        conditionData = createConditionData({ item: activity.item, activity, actor: activity.actor, target: token })\n        const bonusValue = evalCondition(rangeBonus, conditionData, { errorReturn: 0, async: false });\n        range = Math.max(0, range + bonusValue);\n      };\n      let longRangeBonus: string = activity.actor?.flags?.[MODULE_ID]?.long?.[attackType] ?? \"0\"\n      longRangeBonus = longRangeBonus + \" + \" + (activity.actor?.flags?.[MODULE_ID]?.long?.all ?? \"0\");\n      if (longRangeBonus !== \"0 + 0\") {\n        if (!conditionData)\n          conditionData = createConditionData({ item: activity.item, actor: activity.actor, activity, target: token })\n        const bonusValue = evalCondition(longRangeBonus, conditionData, { errorReturn: 0, async: false });\n        longRange = Math.max(0, longRange + bonusValue);\n      };\n    }\n    if (longRange > 0 && longRange < range) longRange = range;\n    if (activity.range?.units) {\n      switch (activity.range.units) {\n        case \"mi\": // miles - assume grid units are feet or miles - ignore furlongs/chains whatever\n          if ([\"feet\", \"ft\"].includes(canvas.scene?.grid.units?.toLocaleLowerCase())) {\n            range *= 5280;\n            longRange *= 5280;\n          } else if ([\"yards\", \"yd\", \"yds\"].includes(canvas.scene?.grid.units?.toLocaleLowerCase())) {\n            range *= 1760;\n            longRange *= 1760;\n          }\n          break;\n        case \"km\": // kilometers - assume grid units are meters or kilometers\n          if ([\"meter\", \"m\", \"meters\", \"metre\", \"metres\"].includes(canvas.scene?.grid.units?.toLocaleLowerCase())) {\n            range *= 1000;\n            longRange *= 1000;\n          }\n          break;\n        // \"none\" \"self\" \"ft\" \"m\" \"any\" \"spec\" undefined\n        default:\n          break;\n      }\n    }\n    if (range < longRange && activity.actionType === \"rwak\" &&\n      (actor?.flags?.dnd5e?.sharpShooter || actor?.flags?.[MODULE_ID]?.sharpShooter)) {\n      const conditionData = createConditionData({ item: activity.item, actor, activity, target: targets.first() });\n      let sharpShooterEnabled = evalCondition(actor?.flags?.dnd5e?.sharpShooter, conditionData);\n      sharpShooterEnabled ||= evalCondition(actor?.flags?.[MODULE_ID]?.sharpShooter, conditionData);\n      if (sharpShooterEnabled) range = longRange;\n    }\n\n    if (activity.actionType === \"rsak\" && actor?.flags?.dnd5e?.spellSniper) {\n      const conditionData = createConditionData({ item: activity.item, actor, activity, target: targets.first() });\n      let enabled = evalCondition(actor.flags.dnd5e.spellSniper, conditionData);\n      if (enabled) {\n        range = 2 * range;\n        longRange = 2 * longRange;\n      }\n    }\n    if (activity.range.units === \"touch\") {\n      range = canvas.dimensions?.distance ?? 5;\n      // @ts-expect-error no dnd5e-types\n      if (activity.item.system.range?.reach) range = activity.item.system.range.reach;\n      longRange = 0;\n    }\n\n    const meleeActions = new Set([\"mwak\", \"msak\"]);\n    const isMeleeAttack = meleeActions.has(activity.actionType);\n    // @ts-expect-error no dnd5e-types\n    const hasThrownProperty = activity.item.labels.properties?.some(p => p.abbr === \"thr\");\n\n    if (isMeleeAttack && !hasThrownProperty) {\n      longRange = 0;\n    }\n\n    const isMetric = game.settings.get(\"dnd5e\", \"metricLengthUnits\") ?? false;\n\n    for (let target of targets) {\n      if (target === token) continue;\n      // check if target is burrowing\n      if (configSettings.optionalRules.wallsBlockRange !== 'none'\n        && globalThis.MidiQOL.WallsBlockConditions.some(status => hasCondition(target.actor, status))) {\n        return {\n          result: \"fail\",\n          reason: `${actor?.name}'s has one or more of ${globalThis.MidiQOL.WallsBlockConditions} so can't be targeted`,\n          range,\n          longRange\n        }\n      }\n      // check the range TODO riview total cover flag and activity as part of midi properties\n      const ignoreTotalCover = activity.midiProperties?.ignoreFullCover;\n\n      const coverOptions = {\n        wallsBlock: configSettings.optionalRules.wallsBlockRange !== \"none\" && !ignoreTotalCover,\n        includeCover: !ignoreTotalCover,\n      };\n\n      const rawDistance = getDistance(token, target, coverOptions);\n\n      // Wall blocking is indicated by rawDistance < 0, check it first before applying fudge factor\n      if (rawDistance < 0) {\n        log(`${target.name} is blocked by a wall`)\n        return {\n          result: \"fail\",\n          reason: `${actor?.name}'s target is blocked by a wall`,\n          range,\n          longRange\n        }\n      }\n\n      // Fudge factor is applied in getDistance - no additional adjustment needed here\n      const distance = Math.max(0, parseFloat(rawDistance.toFixed(isMetric ? 1 : 0)));\n\n      if ((longRange !== 0 && distance > longRange) || (distance > range && longRange === 0)) {\n        log(`${target.name} is too far ${distance} from your character you cannot hit`)\n        if (checkMechanic(\"checkRange\") === \"longdisadv\" && [\"rwak\", \"rsak\"].includes(activity.actionType)) {\n          return {\n            result: \"dis\",\n            reason: `${actor?.name}'s target is ${Math.round(distance * 10) / 10} away and your range is only ${longRange || range}`,\n            range,\n            longRange\n          }\n        } else {\n          return {\n            result: \"fail\",\n            reason: `${actor?.name}'s target is ${Math.round(distance * 10) / 10} away and your range is only ${longRange || range}`,\n            range,\n            longRange\n          }\n        }\n      }\n      if (distance > range) return {\n        result: \"dis\",\n        reason: `${actor?.name}'s target is ${Math.round(distance * 10) / 10} away and your range is only ${longRange || range}`,\n        range,\n        longRange\n      }\n    }\n    return {\n      result: \"normal\",\n      range,\n      longRange\n    }\n  }\n\n  const tokenIn = getToken(tokenRef);\n  const targetsIn = targetsRef?.map(t => getToken(t)).filter(t => !!t);\n  if (!tokenIn || !targetsIn) return { result: \"fail\", attackingToken: undefined };\n  let attackingToken = tokenIn;\n  if (!canvas || !canvas.tokens || !tokenIn || !targetsIn) return {\n    result: \"fail\",\n    attackingToken: tokenIn,\n  }\n\n  let canOverride = tokenIn.actor?.flags?.[MODULE_ID]?.rangeOverride?.attack?.all || tokenIn.actor?.flags?.[MODULE_ID]?.rangeOverride?.attack?.[activityIn.actionType];\n  if (typeof canOverride === \"string\") {\n    const tokenInActor = tokenIn.actor;\n    const conditionData = createConditionData({ item: activityIn.item, activity: activityIn, actor: tokenInActor });\n    canOverride = evalCondition(canOverride, conditionData)\n  }\n\n  const { result, reason, range, longRange } = checkRangeFunction(activityIn, attackingToken, targetsIn);\n  if (!canOverride) { // no overrides so just do the check\n    if (result === \"fail\" && reason) {\n      if (showWarning) ui.notifications?.warn(reason);\n    }\n    return { result, attackingToken, range, longRange }\n  }\n\n  const ownedTokens = canvas.tokens.ownedTokens;\n  // Initial Check\n  // Now we loop through all owned tokens\n  let possibleAttackers = ownedTokens.filter(t => {\n    let canOverride = t.actor?.flags?.[MODULE_ID]?.rangeOverride?.attack?.all || t.actor?.flags?.[MODULE_ID]?.rangeOverride?.attack?.[activityIn.actionType];\n    if (typeof canOverride === \"string\") {\n      const tActor = t.actor;\n      const conditionData = createConditionData({ item: activityIn.item, activity: activityIn, actor: tActor });\n      canOverride = evalCondition(canOverride, conditionData)\n    }\n    return canOverride;\n  });\n\n  const successToken = possibleAttackers.find(attacker => checkRangeFunction(activityIn, attacker, targetsIn).result === \"normal\");\n  if (successToken) return { result: \"normal\", attackingToken: successToken, range, longRange };\n  // TODO come back and fix this: const disToken = possibleAttackers.find(attacker => checkRangeFunction(itemIn, attacker, targetsIn).result === \"dis\");\n  return { result: \"fail\", attackingToken, range, longRange };\n}\n\nfunction getLevelsAutoCoverOptions() {\n  const options: {\n    tokensProvideCover: boolean;\n    ignoreFriendly: boolean;\n    // Is this typo present in the actual module?\n    copsesProvideCover: boolean;\n    tokenCoverAA: unknown;\n    precision: unknown;\n  } = {\n    //@ts-expect-error\n    tokensProvideCover: game.settings.get(\"levelsautocover\", \"tokensProvideCover\"),\n    //@ts-expect-error\n    ignoreFriendly: game.settings.get(\"levelsautocover\", \"ignoreFriendly\"),\n    //@ts-expect-error\n    copsesProvideCover: game.settings.get(\"levelsautocover\", \"copsesProvideCover\"),\n    //@ts-expect-error\n    tokenCoverAA: game.settings.get(\"levelsautocover\", \"tokenCoverAA\"),\n    //@ts-expect-error\n    precision: game.settings.get(\"levelsautocover\", \"coverRestriction\")\n  };\n  return options;\n}\n\nexport const TOTAL_COVER = Infinity;\n// Initialized from CONFIG.DND5E.statusEffects in initCoverConstants(), fallback to dnd5e 2024 defaults\nexport let THREE_QUARTERS_COVER: number = 5;\nexport let HALF_COVER: number = 2;\n\n/** Initialize cover constants from CONFIG.DND5E.statusEffects. Call after dnd5e init. */\nexport function initCoverConstants() {\n  //@ts-expect-error CONFIG.DND5E not typed\n  THREE_QUARTERS_COVER = CONFIG.DND5E?.statusEffects?.coverThreeQuarters?.coverBonus ?? 5;\n  //@ts-expect-error CONFIG.DND5E not typed\n  HALF_COVER = CONFIG.DND5E?.statusEffects?.coverHalf?.coverBonus ?? 2;\n}\n\n/** Check if an actor has any dnd5e cover status (coverHalf, coverThreeQuarters, or coverTotal). */\nexport function hasCoverStatus(actor: Actor | null | undefined): boolean {\n  const statuses = actor?.statuses;\n  return !!(statuses?.has(\"coverHalf\") || statuses?.has(\"coverThreeQuarters\") || statuses?.has(\"coverTotal\"));\n}\n\n/** Check if an actor has the coverTotal status (impossible to hit). */\nexport function hasCoverTotal(actor: Actor | null | undefined): boolean {\n  return !!actor?.statuses?.has(\"coverTotal\");\n}\n\n/**\n * Get the effective cover bonus for a target, from any source.\n * Returns the higher of the dnd5e status-based cover and the module-computed cover.\n */\nexport function getCoverBonus(attacker: TokenOrDocument, target: TokenOrDocument, activity?: Activity): number {\n  const targetActor = target instanceof TokenDocument ? target.actor : (target as Token)?.actor;\n  if (hasCoverTotal(targetActor)) return TOTAL_COVER;\n  //@ts-expect-error no dnd5e-types\n  const statusCoverBonus: number = targetActor?.system?.attributes?.ac?.cover ?? 0;\n  const moduleCoverBonus = computeCoverBonus(attacker, target, activity);\n  return Math.max(statusCoverBonus, moduleCoverBonus);\n}\n\n/**\n * Returns the raw cover bonus from the configured cover module.\n * Does NOT check cover statuses, apply attack-specific reductions (sharpshooter, etc.),\n * or reconcile with status-based cover.\n */\nexport function computeCoverBonus(attackerIn: TokenOrDocument, targetIn: TokenOrDocument, activity?: Activity): number {\n  const attacker = attackerIn instanceof TokenDocument ? attackerIn.object : attackerIn;\n  const target = targetIn instanceof TokenDocument ? targetIn.object : targetIn;\n  if (activity instanceof Item) {\n    const item = activity;\n    activity = undefined;\n    foundry.utils.logCompatibilityWarning(\"computeCoverBonus(attacker, target, item) is deprecated in favor of computeCoverBonus(attacker, target, activity)\");\n  }\n  if (!attacker || !target) return 0;\n\n  let coverBonus = 0;\n  try {\n    switch (configSettings.optionalRules.coverCalculation) {\n      case \"levelsautocover\":\n        //@ts-expect-error\n        if (!installedModules.get(\"levelsautocover\") || !game.settings.get(\"levelsautocover\", \"apiMode\") || !AutoCover) return 0;\n        //@ts-expect-error\n        const coverData = AutoCover.calculateCover(attacker, target);\n        //@ts-expect-error\n        const coverDetail = AutoCover.getCoverData();\n        if (coverData.rawCover === 0) coverBonus = TOTAL_COVER;\n        else if (coverData.rawCover > coverDetail[1].percent) coverBonus = 0;\n        else if (coverData.rawCover < coverDetail[0].percent) coverBonus = THREE_QUARTERS_COVER;\n        else if (coverData.rawCover < coverDetail[1].percent) coverBonus = HALF_COVER;\n        if (coverData.obstructingToken) coverBonus = Math.max(2, coverBonus);\n        break;\n\n      case \"simbuls-cover-calculator\":\n        if (!installedModules.get(\"simbuls-cover-calculator\")) return 0;\n        if (globalThis.CoverCalculator) {\n          const coverData = globalThis.CoverCalculator.Cover(attacker, target);\n          if (attacker === target) {\n            coverBonus = 0;\n            break;\n          }\n          if (coverData?.data?.results.cover === 3) coverBonus = TOTAL_COVER;\n          else coverBonus = -coverData?.data?.results.value || 0;\n        }\n        break;\n        \n      case \"simplecover5e\":\n        //@ts-expect-error\n        const simpleCoverApi = game.modules.get(\"simplecover5e\")?.api;\n        if (!installedModules.get(\"simplecover5e\") || !simpleCoverApi) return 0;\n          // simplecover5e caps at 3/4 cover from occluders — check LOS first via wallsBlockRange\n          if (attacker !== target && configSettings.optionalRules.wallsBlockRange !== \"none\") {\n            const preCheck = computeWallBlockPreCheck(attacker as Token.Implementation, target as Token.Implementation, true, true);\n            if (preCheck.blocked) {\n              coverBonus = TOTAL_COVER;\n              break;\n            }\n          }\n          const coverOptions: any = {\n            attacker,\n            target,\n            scene: attacker.scene,\n            losCheck: true\n          };\n          if (activity) coverOptions.activity = activity;\n          const coverResult = simpleCoverApi.getCover(coverOptions);\n          if (!coverResult || coverResult.bonus == null) return TOTAL_COVER;\n          coverBonus = coverResult.bonus;\n        break;\n\n      case \"tokencover\":\n        if (!installedModules.get(\"tokencover\")) coverBonus = 0;\n        else {\n          const coverValue = calcTokenCover(attacker, target);\n          if (coverValue === 4 || coverValue === 3) coverBonus = TOTAL_COVER;\n          else if (coverValue === 2) coverBonus = THREE_QUARTERS_COVER;\n          else if (coverValue === 1) coverBonus = HALF_COVER;\n          else coverBonus = 0;\n        }\n        break;\n      case \"none\":\n      default:\n        coverBonus = 0;\n        break;\n    }\n    return coverBonus;\n  } catch (err) {\n    const message = \"Error in computeCoverBonus\";\n    error(message, err);\n    TroubleShooter.recordError(err, message)\n    return 0;\n  }\n}\n\n/**\n * Result of computing the effective AC for a target in an attack.\n */\nexport interface TargetACResult {\n  effectiveAC: number;          // Final AC to compare against attack roll\n  baseAC: number;               // ac.value minus status cover\n  statusCoverBonus: number;     // From dnd5e cover status (already baked into ac.value)\n  moduleCoverBonus: number;     // Raw value from cover module\n  appliedCoverDelta: number;    // Extra cover added beyond status (module - status, if positive)\n  effectiveCoverBonus: number;  // Total effective cover after reductions (0 if ignored)\n  coverIgnored: boolean;        // Whether cover was stripped by a feat/flag\n  flankingMod: number;          // Flanking reduction\n  targetACMod: number;          // From targetDescriptors\n}\n\n/**\n * Compute the effective AC for a target, reconciling status-based cover with module-computed\n * cover (status acts as minimum), applying attack-specific reductions (ignoreFullCover,\n * sharpShooter, spellSniper, ignoreCover), and incorporating flanking and targetACMod.\n */\nexport function computeTargetAC(\n  attacker: Token,\n  target: Token,\n  activity: Activity | undefined,\n  options: {\n    ignoreCover?: boolean;\n    flankingMod?: number;\n    targetACMod?: number;\n  } = {}\n): TargetACResult {\n  const targetActor = target.actor;\n  const item = activity?.item;\n  const { ignoreCover = false, flankingMod = 0, targetACMod = 0 } = options;\n\n  //@ts-expect-error no dnd5e-types\n  const acValue: number = targetActor?.system?.attributes?.ac?.value ?? 10;\n  //@ts-expect-error no dnd5e-types\n  let statusCoverBonus: number = targetActor?.system?.attributes?.ac?.cover ?? 0;\n  const baseAC = acValue - statusCoverBonus;\n\n  // TOTAL_COVER not set by dnd5e for tokens with total cover\n  if (hasCoverTotal(targetActor)) statusCoverBonus = TOTAL_COVER;\n\n  // Get raw module cover\n  const moduleCoverBonus = computeCoverBonus(attacker, target, activity);\n\n  // Effective cover is the higher of status vs module\n  let effectiveCoverBonus = Math.max(statusCoverBonus, moduleCoverBonus);\n  // Delta is what we need to ADD beyond what dnd5e already baked into ac.value\n  let appliedCoverDelta = Math.max(moduleCoverBonus - statusCoverBonus, 0);\n\n  // --- Attack-specific reductions ---\n\n  // ignoreFullCover (midi property on activity)\n  if (activity?.midiProperties?.ignoreFullCover) {\n    //@ts-expect-error item.type includes dnd5e subtypes\n    if (item?.type === \"spell\") {\n      // Spells with ignoreFullCover: ignore all cover\n      effectiveCoverBonus = 0;\n      appliedCoverDelta = 0;\n    } else if (effectiveCoverBonus === TOTAL_COVER) {\n      // Non-spells: downgrade total cover to three-quarters\n      effectiveCoverBonus = THREE_QUARTERS_COVER;\n      appliedCoverDelta = Math.max(THREE_QUARTERS_COVER - statusCoverBonus, 0);\n    }\n  }\n\n  // Sharpshooter (rwak only, not total cover)\n  //@ts-expect-error no dnd5e-types\n  if ((activity?.actionType ?? item?.system?.actionType) === \"rwak\"\n    && attacker.actor\n    && effectiveCoverBonus !== TOTAL_COVER && effectiveCoverBonus !== 0\n    && (attacker.actor.flags?.[MODULE_ID]?.sharpShooter || attacker.actor.flags?.dnd5e?.sharpShooter)) {\n    const conditionData = createConditionData({ item, actor: attacker.actor, activity, target });\n    let enabled = evalCondition(attacker.actor.flags?.dnd5e?.sharpShooter, conditionData);\n    enabled ||= evalCondition(attacker.actor.flags?.[MODULE_ID]?.sharpShooter, conditionData);\n    if (enabled) {\n      effectiveCoverBonus = 0;\n      appliedCoverDelta = 0;\n    }\n  }\n\n  // Spell Sniper (rsak only, not total cover)\n  //@ts-expect-error no dnd5e-types\n  if ([\"rsak\"].includes(activity?.actionType ?? item?.system?.actionType)\n    && attacker.actor\n    && attacker.actor.flags?.dnd5e?.spellSniper\n    && effectiveCoverBonus !== TOTAL_COVER && effectiveCoverBonus !== 0) {\n    const conditionData = createConditionData({ item, actor: attacker.actor, activity, target });\n    const enabled: boolean | undefined = evalCondition(attacker.actor.flags.dnd5e.spellSniper, conditionData);\n    if (enabled) {\n      effectiveCoverBonus = 0;\n      appliedCoverDelta = 0;\n    }\n  }\n\n  // ignoreCover flag (from midi flag evaluation in checkHits)\n  let coverIgnored = false;\n  if (ignoreCover && effectiveCoverBonus < TOTAL_COVER) {\n    coverIgnored = true;\n    effectiveCoverBonus = 0;\n    appliedCoverDelta = 0;\n  }\n\n  // Final AC: start from ac.value (includes status cover except total covere),\n  // add delta (module cover above status), subtract status if cover ignored,\n  // add targetACMod, subtract flanking\n  let effectiveAC = acValue + targetACMod;\n  if (coverIgnored) {\n    // Remove the status cover baked into ac.value\n    effectiveAC -= statusCoverBonus;\n  } else {\n    // Add any module cover above the status\n    effectiveAC += appliedCoverDelta;\n  }\n  effectiveAC -= flankingMod;\n\n  // Total cover from module/status → auto-miss\n  if (effectiveCoverBonus === TOTAL_COVER) effectiveAC = Infinity;\n\n  const result = {\n    effectiveAC,\n    baseAC,\n    statusCoverBonus,\n    moduleCoverBonus,\n    appliedCoverDelta,\n    effectiveCoverBonus,\n    coverIgnored,\n    flankingMod,\n    targetACMod\n  };\n  return result;\n}\nexport type FastForwardRollType = \"attack\" | \"damage\" | \"check\" | \"save\" | \"skill\" | \"tool\";\n\nexport function isAutoFastForward(rollType: FastForwardRollType, { workflow, user }: { workflow?: Workflow, user?: User } = {}): boolean {\n  if (rollType === \"attack\") {\n    if (workflow?.rollOptions?.fastForwardAttack !== undefined) return workflow.rollOptions.fastForwardAttack;\n    if (workflow?.workflowOptions?.autoFastAttack !== undefined) return workflow.workflowOptions.autoFastAttack;\n    if (workflow?.workflowType === \"DummyWorkflow\") return !!workflow.rollOptions.fastForward;\n  } else if (rollType === \"damage\") {\n    if (workflow?.rollOptions?.fastForwardDamage !== undefined) return workflow.rollOptions.fastForwardDamage;\n    if (workflow?.workflowOptions?.fastForwardDamage !== undefined) return workflow.workflowOptions.fastForwardDamage;\n    if (workflow?.workflowType === \"DummyWorkflow\") return !!workflow.rollOptions.fastForwardDamage;\n  }\n  return (user ?? game.user)?.isGM ? configSettings.gmAutoFastForward.includes(rollType) : configSettings.autoFastForward.includes(rollType);\n}\n\nexport function autoConsumeResource(workflow?: Workflow): string {\n  if (workflow?.workflowOptions?.autoConsumeResource !== undefined) return workflow.workflowOptions.autoConsumeResource;\n  return game.user?.isGM ? configSettings.gmConsumeResource : configSettings.consumeResource;\n}\n\n/**\n * Retrieve consumption deltas from a ChatMessage or a messageConfig object.\n * dnd5e 5.3+ stores consumption in system.deltas / data.system.deltas.\n * dnd5e 5.2.x stored consumption in flags.dnd5e.use.consumed / data.flags.dnd5e.use.consumed.\n */\nexport function getConsumptionData(source: any): any {\n  if (!source) return undefined;\n  // ChatMessage case\n  if (source.system?.deltas != null) return source.system.deltas;\n  if (typeof source.getFlag === \"function\") return source.getFlag(\"dnd5e\", \"use.consumed\");\n  // messageConfig case (plain object with .data passed to activity.consume())\n  return source.data?.system?.deltas ?? source.data?.flags?.dnd5e?.use?.consumed;\n}\n\nexport function getAutoRollDamage(workflow?: Workflow): string {\n  if (workflow?.actor?.type === configSettings.averageDamage || configSettings.averageDamage === \"all\") return \"onHit\";\n  if (workflow?.workflowOptions?.autoRollDamage) {\n    const damageOptions = Object.keys(autoRollDamageOptions);\n    if (damageOptions.includes(workflow.workflowOptions.autoRollDamage))\n      return workflow.workflowOptions.autoRollDamage;\n    console.warn(`midi-qol | getAutoRollDamage | could not find ${workflow.workflowOptions.autoRollDamage} workflowOptions.autoRollDamage must be ond of ${damageOptions} defaulting to \"onHit\"`)\n    return \"onHit\";\n  }\n  return game.user?.isGM ? configSettings.gmAutoDamage : configSettings.autoRollDamage;\n}\n\nexport function getAutoRollAttack(workflow?: Workflow): boolean {\n  if (workflow?.systemCard) return false;\n  if (workflow?.workflowOptions?.autoRollAttack !== undefined) {\n    return workflow.workflowOptions.autoRollAttack;\n  }\n\n  return game.user?.isGM ? configSettings.gmAutoAttack : configSettings.autoRollAttack;\n}\n\nexport function getRemoveAllButtons(activity?: Activity): boolean {\n  if (activity) {\n    const activitySetting = activity.midiProperties?.removeChatButtons;\n    if (activitySetting && activitySetting !== \"default\") {\n      return activitySetting === \"everything\";\n    }\n  }\n  return game.user?.isGM ?\n    configSettings.gmRemoveButtons === \"everything\" :\n    configSettings.removeButtons === \"everything\";\n}\n\nexport function getRemoveAttackButtons(activity?: Activity): boolean {\n  if (activity) {\n    const activitySetting = activity.midiProperties?.removeChatButtons;\n    if (activitySetting) {\n      if ([\"all\", \"attack\", \"everything\"].includes(activitySetting)) return true;\n      if (activitySetting !== \"default\") return false;\n    }\n  }\n  return game.user?.isGM ?\n    [\"all\", \"attack\", \"everything\"].includes(configSettings.gmRemoveButtons) :\n    [\"all\", \"attack\", \"everything\"].includes(configSettings.removeButtons);\n}\nexport function getRemoveDamageButtons(activity?: Activity): boolean {\n  if (activity) {\n    const activitySetting = activity.midiProperties?.removeChatButtons;\n    if (activitySetting) {\n      if ([\"all\", \"damage\", \"everything\"].includes(activitySetting)) return true;\n      if (activitySetting !== \"default\") return false;\n    }\n  }\n  return game.user?.isGM ?\n    [\"all\", \"damage\", \"everything\"].includes(configSettings.gmRemoveButtons) :\n    [\"all\", \"damage\", \"everything\"].includes(configSettings.removeButtons);\n}\n\nexport function getReactionSetting(player?: User.Implementation | null): string {\n  if (!player) return \"none\";\n  return player.isGM ? configSettings.gmDoReactions : configSettings.doReactions;\n}\n\nexport function getTokenPlayerName(token: TokenOrDocument, checkGM: boolean = false) {\n  if (game.user) return getTokenPlayerNameForUser(game.user, token, checkGM);\n  return getTokenName(token);\n}\nexport function getTokenPlayerNameForUser(user: User.Implementation, token: TokenOrDocument, checkGM: boolean = false) {\n  if (!token) return game.user?.name;\n  let name = getTokenName(token);\n  if (checkGM && user?.isGM) return name;\n  if (game.modules.get(\"anonymous\")?.active) {\n    // @ts-expect-error\n    const api: any = game.modules.get(\"anonymous\")?.api;\n    if (api?.playersSeeName(token.actor)) return name;\n    else return api?.getName(token.actor) as string;\n  } else if (game.modules.get(\"hide-npc-names\")?.active) {\n    return getPlayerNPCNameHideNPCNAmes(token);\n  }\n  return name;\n}\n\nfunction getPlayerNPCNameHideNPCNAmes(token: TokenOrDocument) {\n  const actorFlags: any = foundry.utils.getProperty(token.actor ?? {}, \"flags.hide-npc-names\");\n  if (actorFlags?.nameHiddenOverride === true) return actorFlags.replacementNameOverride as string;\n  if (actorFlags?.nameHiddenOverride === false) return getTokenName(token);\n  /*\n    hideHostile: \"hideHostileNames\",\n    hideNeutral: \"hideNeutralNames\",\n    hideFriendly: \"hideFriendlyNames\",\n    hideSecret: \"hideSecretNames\",\n    hostileNameReplacement: \"hostileNameReplacement\",\n    neutralNameReplacement: \"neutralNameReplacement\",\n    friendlyNameReplacement: \"friendlyNameReplacement\",\n    secretNameReplacement: \"secretNameReplacement\",\n    tokenHiddenSuffix: \"tokenHiddenSuffix\",\n    hideParts: \"hideParts\",\n    showOnActorDirectory: \"showOnActorDirectory\"\n  */\n  if (actorFlags === undefined) {\n    let hideSetting: boolean;\n    switch ((token instanceof TokenDocument ? token : token.document).disposition) {\n      case CONST.TOKEN_DISPOSITIONS.FRIENDLY:\n        hideSetting = safeGetGameSetting(\"hide-npc-names\", \"hideFriendlyNames\");\n        if (hideSetting) return safeGetGameSetting(\"hide-npc-names\", \"friendlyNameReplacement\") as string;\n        break;\n      case CONST.TOKEN_DISPOSITIONS.HOSTILE:\n        hideSetting = safeGetGameSetting(\"hide-npc-names\", \"hideHostileNames\");\n        if (hideSetting) return safeGetGameSetting(\"hide-npc-names\", \"hostileNameReplacement\") as string;\n        break;\n      case CONST.TOKEN_DISPOSITIONS.SECRET:\n        hideSetting = safeGetGameSetting(\"hide-npc-names\", \"hideSecretNames\");\n        if (hideSetting) return safeGetGameSetting(\"hide-npc-names\", \"secretNameReplacement\") as string;\n        break;\n      case CONST.TOKEN_DISPOSITIONS.NEUTRAL:\n        hideSetting = safeGetGameSetting(\"hide-npc-names\", \"hideNeutralNames\");\n        if (hideSetting) return safeGetGameSetting(\"hide-npc-names\", \"neutralNameReplacement\") as string;\n        break;\n    }\n  }\n  return getTokenName(token)\n}\n\nexport function getSpeaker(actor: Actor.Implementation) {\n  const speaker = ChatMessage.getSpeaker({ actor });\n  if (!configSettings.useTokenNames) return speaker;\n  let token = actor.token;\n  if (!token) token = actor.getActiveTokens(false, true)[0];\n  if (token) speaker.alias = token.name;\n  return speaker;\n}\n\n/** \n * Find tokens nearby\n * @param {number|null} disposition. same(1), opposite(-1), neutral(0), ignore(null) token disposition\n * @param {Token} token The token to search around\n * @param {number} distance in game units to consider near\n * @param {options} canSee Require that the potential target can sense the token\n * @param {options} isSeen Require that the token can sense the potential target\n * @param {options} includeIcapacitated: boolean count incapacitated tokens\n */\n\nfunction mapTokenString(disposition: string | number): number | null {\n  if (typeof disposition === \"number\") return disposition\n  if (disposition.toLocaleLowerCase().trim() === i18n(\"TOKEN.DISPOSITION.FRIENDLY\")?.toLocaleLowerCase()) return 1;\n  else if (disposition.toLocaleLowerCase().trim() === i18n(\"TOKEN.DISPOSITION.HOSTILE\")?.toLocaleLowerCase()) return -1;\n  else if (disposition.toLocaleLowerCase().trim() === i18n(\"TOKEN.DISPOSITION.NEUTRAL\")?.toLocaleLowerCase()) return 0;\n  else if (disposition.toLocaleLowerCase().trim() === i18n(\"TOKEN.DISPOSITION.SECRET\")?.toLocaleLowerCase()) return -2;\n  else if (disposition.toLocaleLowerCase().trim() === i18n(\"all\")?.toLocaleLowerCase()) return null;\n  const validStrings = [\"TOKEN.DISPOSITION.FRIENDLY\", \"TOKEN.DISPOSITION.HOSTILE\", \"TOKEN.DISPOSITION.NEUTRAL\", \"TOKEN.DISPOSITION.SECRET\", \"all\"].map(s => i18n(s))\n  throw new Error(`Midi-qol | findNearby ${disposition} is invalid. Disposition must be one of \"${validStrings}\"`)\n}\n\ntype FindNearbyOptions = {\n  maxSize?: number,\n  includeIncapacitated?: boolean,\n  canSee?: boolean,\n  isSeen?: boolean,\n  includeToken?: boolean,\n  relative?: boolean\n}\nexport function findNearbyCount(\n  disposition: number | string | null | Array<string | number>,\n  token: Token.Implementation | string,\n  distance: number,\n  options: FindNearbyOptions = {\n    includeIncapacitated: false,\n    canSee: false,\n    isSeen: false,\n    includeToken: false,\n    relative: true\n  }): number {\n  return findNearby(disposition, token, distance, options)?.length ?? 0;\n}\n\n/**\n * findNearby\n * @param {number} [disposition]          What disposition to match - one of CONST.TOKEN.DISPOSITIONS\n \n * @param {string} [disposition]          What disposition to match - one of (localize) Friendly, Neutral, Hostile, Secret, all\n * @param {null} [disposition]            Match any disposition\n * @param {Array<string>} [disposition]   Match any of the dispostion strings\n * @param {Array<number>} [disposition]   Match any of the disposition numbers\n * @param {Token} [token]                 The token to use for the search\n * @param {string} [token]                A token UUID\n * @param {number} [distance]             The distance from token that will match\n * @param {object} [options]\n * @param {number} [options.MaxSize]      Only match tokens whose width * length < MaxSize\n * @param {boolean} [includeIncapacitated]  Should incapacitated actors be include?\n * @param {boolean} [canSee]              Must the potential target be able to see the token?\n * @param {boolean} isSeen                Must the token token be able to see the potential target?\n * @param {boolean} [includeToken]        Include token in the return array?\n * @param {boolean} [relative]            If set, the specified disposition is compared with the token disposition. \n *  A specified dispostion of HOSTILE and a token disposition of HOSTILE means find tokens whose disposition is FRIENDLY\n \n*/\n\nexport function findNearby(\n  disposition: number | string | null | Array<string | number>,\n  tokenRef: Token.Implementation | string,\n  distance: number,\n  options: FindNearbyOptions = {\n    includeIncapacitated: false,\n    canSee: false,\n    isSeen: false,\n    includeToken: false,\n    relative: true\n  }\n) {\n  const token = getToken(tokenRef);\n  if (!token) return [];\n  if (!canvas || !canvas.scene) return [];\n  try {\n    if (!(token instanceof Token)) { throw new Error(\"find nearby token is not of type token or the token uuid is invalid\") };\n    let relative = options.relative ?? true;\n    let targetDisposition: number[] | undefined;\n    if (typeof disposition === \"string\") disposition = mapTokenString(disposition);\n    if (disposition instanceof Array) {\n      if (disposition.some(s => s === \"all\")) disposition = [-1, 0, 1];\n      else disposition = disposition.map(s => mapTokenString(s) ?? 0);\n      targetDisposition = disposition.map(i => typeof i === \"number\" && [-1, 0, 1].includes(i) && relative ? token.document.disposition * i : (Number.isNumeric(i) ? Number(i) : 0));\n    } else if (typeof disposition === \"number\" && [-1, 0, 1].includes(disposition)) {\n      targetDisposition = relative ? [token.document.disposition * disposition] : [disposition];\n    } else targetDisposition = [CONST.TOKEN_DISPOSITIONS.HOSTILE, CONST.TOKEN_DISPOSITIONS.NEUTRAL, CONST.TOKEN_DISPOSITIONS.FRIENDLY];\n\n    const canvasPlaceables = canvas.tokens?.placeables ?? [];\n    let nearby = canvasPlaceables.filter(t => {\n      const tActor = t.actor;\n      const tDocument = t.document;\n      if (!isValidTarget(t)) return false;\n      if (options.maxSize && (tDocument.height ?? 1) * (tDocument.width ?? 1) > options.maxSize) return false;\n      if (!options.includeIncapacitated && checkIncapacitated(tActor, debugEnabled > 0, false)) return false;\n      let inRange = false;\n      if (t.actor &&\n        (t.id !== token.id || options?.includeToken) && // not the token\n        (disposition === null || targetDisposition.includes(t.document.disposition))) {\n        const tokenDistance = getDistance(t, token, { wallsBlock: true });\n        inRange = 0 <= tokenDistance && tokenDistance <= distance\n      } else return false; // wrong disposition\n      if (inRange && options.canSee && !canSense(t, token)) return false; // Only do the canSee check if the token is inRange\n      if (inRange && options.isSeen && !canSense(token, t)) return false;\n      return inRange;\n    });\n\n    return nearby ?? [];\n  } catch (err) {\n    TroubleShooter.recordError(err, \"findnearby error\");\n    error(err);\n    return [];\n  }\n}\n\nexport function checkNearby(\n  disposition: number | null | string,\n  tokenRef: TokenOrDocument | string | undefined,\n  distance: number,\n  options: FindNearbyOptions = {\n    includeIncapacitated: false,\n    canSee: false,\n    isSeen: false,\n    includeToken: false,\n    relative: true\n  }\n): boolean {\n  const token = getToken(tokenRef);\n  const tokenDisposition = token?.document.disposition;\n  if (tokenDisposition === 0) options.relative = false;\n  if (!token) return false;\n  return findNearby(disposition, token, distance, options).length !== 0;\n}\n\nexport function hasCondition(\n  actorRef: Actor.Implementation | TokenOrDocument | string | undefined | null,\n  condition: string\n): 0 | 1 {\n  let actor = getActor(actorRef);\n  if (!actor) return 0;\n  // @ts-expect-error no dnd5e-types\n  if (!actor.system.traits || !actor.statuses) return 0;\n  // @ts-expect-error no dnd5e-types\n  if (actor.system.traits.ci?.value?.has(condition)) return 0;\n  if (actor.statuses.has(condition)) return 1;\n  const specials = CONFIG.specialStatusEffects;\n  switch (condition?.toLocaleLowerCase()) {\n    case \"blind\":\n      if (actor.statuses.has(specials.BLIND)) return 1;\n      break;\n    case \"burrow\":\n    case \"burrowing\":\n      if (actor.statuses.has(specials.BURROW)) return 1;\n      break;\n    case \"dead\":\n      if (actor.statuses.has(specials.DEFEATED)) return 1;\n      break\n    case \"deaf\":\n      // @ts-expect-error no dnd5e-types\n      if (actor.statuses.has(specials.DEAF)) return 1;\n      break;\n    case \"disease\":\n    case \"diseased\":\n      // @ts-expect-error no dnd5e-types\n      if (actor.statuses.has(specials.DISEASE)) return 1;\n      break;\n    case \"fly\":\n    case \"flying\":\n      if (actor.statuses.has(specials.FLY)) return 1;\n      break;\n    case \"hidden\":\n    case \"hiding\":\n      if (actor.statuses.has(\"hidden\") || actor.statuses.has(\"hiding\")) return 1;\n      break;\n    case \"inaudible\":\n    case \"silent\":\n      // @ts-expect-error no dnd5e-types\n      if (actor.statuses.has(specials.INAUDIBLE)) return 1;\n      break;\n    case \"invisible\":\n      if (actor.statuses.has(specials.INVISIBLE)) return 1;\n      break;\n    case \"poison\":\n    case \"poisoned\":\n      // @ts-expect-error no dnd5e-types\n      if (actor.statuses.has(specials.POISON)) return 1;\n      break;\n  }\n  if (actor.statuses.has(condition.toLocaleLowerCase()) || actor.statuses.has(condition)) return 1;\n  return 0;\n}\n\nexport async function removeInvisible(this: Workflow) {\n  if (!canvas || !canvas.scene) return;\n  const token = this.attackingToken ?? (fromUuidSync(this.tokenUuid) as TokenDocument.Implementation | undefined);\n  removeInvisibleCondition(token);\n}\n\nexport async function removeInvisibleCondition(tokenRef?: TokenOrDocument | string) {\n  const token = getToken(tokenRef);\n  if (!token) return;\n\n  await removeTokenConditionEffect(token, i18n(`midi-qol.invisible`) ?? \"\");\n\n  const invisId = CONFIG.specialStatusEffects.INVISIBLE ?? \"invisible\";\n  if (CONFIG.statusEffects.find(se => se.id === invisId)) {\n    await (token.actor)?.toggleStatusEffect(invisId, { active: false })\n  }\n  if (debugEnabled > 0) log(`Invisibility removed for ${token.name}`)\n}\n\nexport async function removeHidden(this: Workflow) {\n  if (!canvas?.scene) return;\n  const token = this.attackingToken ?? (fromUuidSync(this.tokenUuid) as TokenDocument.Implementation | undefined);\n  if (!token) return;\n  removeHiddenCondition(token);\n}\n\nexport async function removeHiddenCondition(tokenRef?: TokenOrDocument | string) {\n  const token = getToken(tokenRef);\n  if (!token) return;\n  if (!token.actor) return\n  if (CONFIG.statusEffects.find(se => se.id === \"hidden\")) {\n    await token.actor.toggleStatusEffect(\"hidden\", { active: false });\n  }\n  if (CONFIG.statusEffects.find(se => se.id === \"hiding\")) {\n    await token.actor.toggleStatusEffect(\"hiding\", { active: false });\n  }\n  // Try and remove hidden if set by another active effect\n  await removeTokenConditionEffect(token, i18n(`midi-qol.hidden`) ?? \"\");\n  if (installedModules.get(\"perceptive\")) {\n    //@ts-expect-error\n    const api: any = game.modules.get(\"perceptive\")?.api;\n    api?.PerceptiveFlags.setPerceptiveStealthing(token.document, false);\n  }\n  if (debugEnabled > 0) log(`Hidden removed for ${token.name}`)\n}\n\nexport async function removeTokenConditionEffect(token: Token.Implementation, condition: string) {\n  if (!token) return;\n  const hasEffect = token.actor?.appliedEffects.find(ef => ef.name === condition);\n  if (hasEffect) await expireEffects(token.actor!, [hasEffect], { \"expiry-reason\": `midi-qol:removeTokenCondition:${condition}` });\n}\n\nexport async function expireMyEffects(this: Workflow, effectsToExpire: string[]) {\n  // Concentration checks are automated system responses, not player actions — don't expire effects.\n  if (this.item?.flags?.[MODULE_ID]?.isConcentrationCheck) return;\n  const expireHit = effectsToExpire.includes(\"1Hit\") && !this.effectsAlreadyExpired.includes(\"1Hit\");\n  const expireCritical = effectsToExpire.includes(\"1Critical\") && !this.effectsAlreadyExpired.includes(\"1Critical\");\n  const expireFumble = effectsToExpire.includes(\"1Fumble\") && !this.effectsAlreadyExpired.includes(\"1Fumble\");\n  let expireAnyAction = effectsToExpire.includes(\"1Action\") && !this.effectsAlreadyExpired.includes(\"1Action\");\n  const expireBonusAction = (effectsToExpire.includes(\"1Action\") || effectsToExpire.includes(\"Bonus Action\")) && !this.effectsAlreadyExpired.includes(\"Bonus Action\");\n  const expireReaction = (effectsToExpire.includes(\"1Action\") || effectsToExpire.includes(\"Reaction\")) && !this.effectsAlreadyExpired.includes(\"Reaction\");\n  const expireTurnAction = (effectsToExpire.includes(\"1Action\") || effectsToExpire.includes(\"Turn Action\")) && !this.effectsAlreadyExpired.includes(\"Turn Action\");\n  const expireSpell = effectsToExpire.includes(\"1Spell\") && !this.effectsAlreadyExpired.includes(\"1Spell\");\n  const expireAttack = effectsToExpire.includes(\"1Attack\") && !this.effectsAlreadyExpired.includes(\"1Attack\");\n  const expireDamage = effectsToExpire.includes(\"DamageDealt\") && !this.effectsAlreadyExpired.includes(\"DamageDealt\");\n  const expireInitiative = effectsToExpire.includes(\"Initiative\") && !this.effectsAlreadyExpired.includes(\"Initiative\");\n  //\n  expireAnyAction ||= expireBonusAction || expireReaction || expireTurnAction;\n  if (expireAnyAction) effectsToExpire.push(\"1Action\");\n  // expire any effects on the actor that require it\n  // if (debugEnabled && false) {\n  //   const test = this.actor.effects.map(ef => {\n  //     const specialDuration = foundry.utils.getProperty(ef.flags, \"dae.specialDuration\") as string[];\n  //     return [(expireAnyAction && specialDuration?.includes(\"1Action\")),\n  //     (expireAttack && specialDuration?.includes(\"1Attack\") && this.item?.hasAttack),\n  //     (expireHit && this.item?.hasAttack && specialDuration?.includes(\"1Hit\") && this.hitTargets.size > 0)]\n  //   })\n  //   if (debugEnabled > 1) debug(\"expiry map is \", test)\n  // }\n\n  let allEffects = getAppliedEffects(this.actor, { includeEnchantments: true });\n  const myExpiredEffects = allEffects?.filter(ef => {\n    const specialDuration = foundry.utils.getProperty(ef.flags, \"dae.specialDuration\") as string[];\n    if (!specialDuration || !specialDuration?.length) return false;\n    return (expireAnyAction && specialDuration.includes(\"1Action\")) ||\n      (expireBonusAction && specialDuration.includes(\"Bonus Action\") && this.activity.activation.type === \"bonus\") ||\n      (expireReaction && specialDuration.includes(\"Reaction\") && this.activity.activation.type === \"reaction\") ||\n      (expireTurnAction && specialDuration.includes(\"Turn Action\") && this.activity.activation.type === \"action\") ||\n      (expireAttack && this.activity?.hasAttack && specialDuration.includes(\"1Attack\")) ||\n      // @ts-expect-error no dnd5e-types\n      (expireSpell && this.item?.type === \"spell\" && specialDuration.includes(\"1Spell\")) ||\n      (expireAttack && this.activity?.hasAttack && specialDuration.includes(`1Attack:${this.activity?.actionType}`)) ||\n      (expireHit && this.activity?.hasAttack && specialDuration.includes(\"1Hit\") && this.hitTargets.size > 0) ||\n      (expireHit && this.activity?.hasAttack && specialDuration.includes(`1Hit:${this.activity?.actionType}`) && this.hitTargets.size > 0) ||\n      (expireCritical && this.activity?.hasAttack && specialDuration.includes(\"1Critical\") && this.isCritical) ||\n      (expireFumble && this.activity?.hasAttack && specialDuration.includes(\"1Fumble\") && this.isFumble) ||\n      (expireDamage && this.activity?.hasDamage && specialDuration.includes(\"DamageDealt\")) ||\n      (expireInitiative && specialDuration.includes(\"Initiative\"))\n  });\n  if (debugEnabled > 1) debug(\"expire my effects\", myExpiredEffects, expireAnyAction, expireAttack, expireHit);\n  this.effectsAlreadyExpired = this.effectsAlreadyExpired.concat(effectsToExpire);\n  if (myExpiredEffects?.length > 0) await expireEffects(this.actor, myExpiredEffects, { \"expiry-reason\": `midi-qol:${effectsToExpire}` });\n}\n\nexport async function expireRollEffect(this: Actor.Implementation, rolltype: string, abilityId: string, success?: boolean) {\n  const rollType = rolltype.charAt(0).toUpperCase() + rolltype.slice(1)\n  const expiredEffects = this.appliedEffects?.filter(ef => {\n    const specialDuration = ef.flags?.dae?.specialDuration;\n    if (!specialDuration) return false;\n    if (specialDuration.includes(`is${rollType}`)) return true;\n    if (specialDuration.includes(`is${rollType}.${abilityId}`)) return true;\n    if (success === true && specialDuration.includes(`is${rollType}Success`)) return true;\n    if (success === true && specialDuration.includes(`is${rollType}Success.${abilityId}`)) return true;\n    if (success === false && specialDuration.includes(`is${rollType}Failure`)) return true;\n    if (success === false && specialDuration.includes(`is${rollType}Failure.${abilityId}`)) return true;\n    return false;\n  }).map(ef => ef.uuid);\n  if (expiredEffects?.length > 0) {\n    await timedAwaitExecuteAsGM(\"removeEffectUuids\", {\n      actorUuid: this.uuid,\n      effects: expiredEffects,\n      options: { \"expiry-reason\": `midi:special-duration:${rollType}:${abilityId}` }\n    });\n  }\n}\n\n// This doesn't actually _need_ to be used anywhere as long as we're strict about things\nexport function validTargetTokens(tokenSet?: Set<TokenOrDocument>): Set<Token.Implementation> {\n  if (!tokenSet) return new Set();\n  return tokenSet\n    .map(tk => tk instanceof TokenDocument ? tk.object! : tk)\n    .filter(tk => !!tk?.actor && isValidTarget(tk));\n}\n\nexport function fromActorUuid(uuid?: string): Actor.Implementation | null {\n  let doc = fromUuidSync(uuid);\n  if (doc instanceof Actor) return doc;\n  if (doc instanceof TokenDocument) return doc.actor;\n  return null;\n}\n\nexport function actorFromUuid(uuid?: string): any {\n  let doc = fromUuidSync(uuid);\n  if (doc instanceof Actor) return doc;\n  if (doc instanceof TokenDocument) return doc.actor;\n  if (doc instanceof Item) return doc.parent;\n  if (doc instanceof ActiveEffect) {\n    if (doc.parent instanceof Actor) return doc.parent;\n    if (doc.parent?.parent instanceof Actor) return doc.parent.parent;\n  }\n  return null;\n}\n\n// TODO: This\nexport class RollModifyDialog extends HandlebarsApplicationMixin(ApplicationV2) {\n  rollExpanded: boolean;\n  timeRemaining: number;\n  timeoutId: NodeJS.Timeout | undefined;\n  secondTimeoutId: NodeJS.Timeout | undefined;\n  aborted: boolean = false;\n\n  data: {\n    actor: Actor.Implementation,\n    flags: string[],\n    flagSelector: string,\n    targetObject: any,\n    // rollId: string,\n    // rollTotalId: string,\n    // rollHTMLId: string,\n    title: string,\n    content: HTMLElement | string,\n    currentRoll: Roll,\n    rollHTML: string,\n    callback: () => {},\n    close: () => {},\n    buttons: any,\n    rollMode: string | undefined,\n    timeout: number,\n    item: Item | undefined,\n    flagOwners?: Record<string, any>\n  }\n\n  constructor(data) {\n    super(data);\n    this.data = data;\n    this.timeRemaining = this.data.timeout;\n    this.rollExpanded = false;\n    if (!data.rollMode) data.rollMode = safeGetGameSetting(\"core\", \"rollMode\");\n    this.timeoutId = setTimeout(() => {\n      if (this.secondTimeoutId) clearTimeout(this.secondTimeoutId);\n      this.timeoutId = undefined;\n      this.close();\n    }, this.data.timeout * 1000);\n    this.set1SecondTimeout();\n  }\n\n  static PARTS = {\n    dialog: {\n      id: \"dialog-optional\",\n      classes: [\"dialog\", \"midi-qol\", \"optional\"],\n      template: \"modules/midi-qol/templates/dialog.hbs\"\n    }\n  };\n\n  static DEFAULT_OPTIONS = {\n    window: {\n      resizable: true\n    },\n    position: {\n      height: \"auto\" as \"auto\",\n      width: 400\n    }\n  };\n\n  get title() {\n    let maxPad = 1;\n    if (this.data.timeout < maxPad) maxPad = this.data.timeout\n    if (this.data.timeout) {\n      const padCount = Math.ceil(this.timeRemaining / (this.data.timeout ?? defaultTimeout) * maxPad);\n      const pad = \"-\".repeat(padCount);\n      return `${this.data.title ?? \"Dialog\"} ${pad} ${this.timeRemaining}`;\n    }\n    else return this.data.title ?? \"Dialog\";\n  }\n\n  async _onRender(context, options) {\n    await super._onRender(context, options);\n    for (const button of Array.from(this.element.querySelectorAll(\".dialog-button\"))) {\n      button.addEventListener(\"click\", this._onClickButton.bind(this));\n    }\n    // Michael note: I don't think this was doing anything?\n    // document.addEventListener(\"keydown.chooseDefault\", this._onKeyDown.bind(this));\n    for (const diceRoll of Array.from(this.element.querySelectorAll<HTMLDivElement>(\".dice-roll\"))) {\n      diceRoll.addEventListener(\"click\", this._onDiceRollClick.bind(this));\n    }\n  }\n\n  async _prepareContext(options) {\n    const context = await super._prepareContext(options);\n    const flagOwners = this.data.flagOwners ?? {};\n    const ownerOf = (flagName: string): any => flagOwners[flagName] ?? this.data.actor;\n    this.data.flags = this.data.flags.filter(flagName => {\n      const owner = ownerOf(flagName);\n      if ((getOptionalCountRemaining(this.data.actor, `${flagName}.count`, owner)) < 1) return false;\n      return foundry.utils.getProperty(owner, flagName) !== undefined\n    });\n    if (this.data.flags.length === 0) this.close();\n    this.data.buttons = this.data.flags.reduce((obj, flag) => {\n      const owner = ownerOf(flag);\n      let flagData: any = foundry.utils.getProperty(owner ?? {}, flag) as any; // TODO This should be tightened up\n      let value: string | undefined = foundry.utils.getProperty(flagData ?? {}, this.data.flagSelector) as string;\n      // Skip object values — can happen if a flag key like \"damage.save\" gets an extra \".all\"\n      // appended by DAE deprecation logic, creating a nested object instead of a string\n      if (typeof value === \"object\") value = undefined;\n      let icon = \"fas fa-dice-d20\";\n      if (value !== undefined) {\n        let labelDetail;\n        if (typeof value === \"string\") {\n          labelDetail = Roll.replaceFormulaData(value, this.data.actor.getRollData() as Record<string, unknown>);\n          if (value.startsWith(\"ItemMacro\")) {\n            icon = CONFIG.Macro.sidebarIcon;\n            if (value === \"ItemMacro\")\n              labelDetail = this.data.item?.name ?? \"Macro\";\n            else {\n              const uuid = value.split(\".\").slice(1).join(\".\");\n              const item = fromUuidSync(uuid);\n              if (item)\n                labelDetail = item.name;\n              else\n                labelDetail = uuid;\n            }\n          }\n          else if (value.startsWith(\"function\")) {\n            icon = CONFIG.Macro.sidebarIcon;\n            labelDetail = value.split(\".\").slice(-1);\n          } else if (value.startsWith(\"Macro\")) {\n            icon = CONFIG.Macro.sidebarIcon;\n            labelDetail = value.split(\".\").slice(1).join(\".\");\n          }\n        } else labelDetail = `${value}`\n        obj[foundry.utils.randomID()] = {\n          icon: `<i class=\"${icon}\"></i>`,\n          //          label: (flagData.label ?? \"Bonus\") + `  (${foundry.utils.getProperty(flagData, this.data.flagSelector) ?? \"0\"})`,\n          label: (flagData?.label ?? \"Bonus\") + ` (${labelDetail})`,\n          value: `${value}`,\n          key: flag,\n          callback: this.data.callback\n        }\n      }\n      let selector = this.data.flagSelector.split(\".\");\n      if (selector[selector.length - 1] !== \"all\") {\n        selector[selector.length - 1] = \"all\";\n        const allSelector = selector.join(\".\");\n        value = foundry.utils.getProperty(flagData ?? {}, allSelector) as string | undefined;\n        if (typeof value === \"object\") value = undefined;\n        if (value !== undefined) {\n          if (typeof value !== \"string\") value = `${value}`\n          let labelDetail = Roll.replaceFormulaData(value, this.data.actor.getRollData() as Record<string, unknown>);\n          if (value.startsWith(\"ItemMacro\")) {\n            icon = CONFIG.Macro.sidebarIcon;\n            if (value === \"ItemMacro\")\n              labelDetail = this.data.item?.name ?? \"Macro\";\n            else {\n              const uuid = value.split(\".\").slice(1).join(\".\");\n              const item = fromUuidSync(uuid) as Item.Implementation | undefined;\n              if (item)\n                labelDetail = item.name;\n              else\n                labelDetail = uuid;\n            }\n          } else if (value.startsWith(\"function\")) {\n            icon = CONFIG.Macro.sidebarIcon;\n            labelDetail = value.split(\".\").slice(-1).join(\".\");\n          } else if (value.startsWith(\"Macro\")) {\n            icon = CONFIG.Macro.sidebarIcon;\n            labelDetail = value.split(\".\").slice(1).join(\".\");\n          } else labelDetail = value;\n          // check force condition. if true call the callback and return obj\n\n          obj[foundry.utils.randomID()] = {\n            icon: `<i class=\"${icon}\"></i>`,\n            //          label: (flagData.label ?? \"Bonus\") + `  (${foundry.utils.getProperty(flagData, allSelector) ?? \"0\"})`,\n            label: (flagData?.label ?? \"Bonus\") + (debugEnabled > 0 ? `: ${labelDetail}` : \"\"),\n            value,\n            key: flag,\n            callback: this.data.callback\n          }\n        }\n      }\n      return obj;\n    }, {})\n    this.data.buttons.no = {\n      icon: '<i class=\"fas fa-xmark\"></i>',\n      label: i18n(\"Cancel\"),\n      callback: () => {\n        this.data.flags = [];\n        this.close();\n      }\n    }\n\n    // this.data.content = await midiRenderRoll(this.data.currentRoll);\n    // this.data.content = await this.data.currentRoll.render();\n    return {\n      ...context,\n      content: this.data.content, // This is set by the callback\n      buttons: this.data.buttons\n    }\n  }\n\n  set1SecondTimeout() {\n    this.secondTimeoutId = setTimeout(() => {\n      clearTimeout(this.secondTimeoutId)\n      if (!this.timeoutId) return;\n      this.timeRemaining -= 1;\n      let color = \"red\";\n      if (this.timeRemaining >= this.data.timeout * 0.75) color = \"chartreuse\";\n      else if (this.timeRemaining >= this.data.timeout * 0.50) color = \"yellow\";\n      else if (this.timeRemaining >= this.data.timeout * 0.25) color = \"orange\";\n      this._updateFrame({ window: { title: this.title } });\n      const title = this.element?.querySelector(\".window-title\");\n      if (title) title.setAttribute(\"style\", `color: ${color}`);\n      if (this.timeRemaining > 0 && title) this.set1SecondTimeout();\n    }, 1000)\n  }\n\n  _onDiceRollClick(event: Event) {\n    event.preventDefault();\n    // Toggle the message flag\n    let roll = event.currentTarget as HTMLDivElement;\n    this.rollExpanded = !this.rollExpanded\n\n    // Expand or collapse tooltips\n    roll?.querySelectorAll(\".dice-tooltip\")?.forEach(tip => {\n      tip.classList.toggle(\"expanded\", this.rollExpanded);\n    });\n  }\n\n  _onClickButton(event: Event) {\n    if (this.secondTimeoutId) {\n      clearTimeout(this.secondTimeoutId);\n      this.secondTimeoutId = undefined;\n    }\n    // @ts-expect-error I know better\n    const id = event.currentTarget!.dataset?.button;\n    const button = this.data.buttons[id];\n    this.submit(button);\n  }\n\n  // _onKeyDown(event: KeyboardEvent) {\n  //   // Close dialog\n  //   if (event.key === \"Escape\" || event.key === \"Enter\") {\n  //     event.preventDefault();\n  //     event.stopPropagation();\n  //     this.close();\n  //   }\n  // }\n\n  async submit(button) {\n    if (this.secondTimeoutId) {\n      clearTimeout(this.secondTimeoutId);\n    }\n    try {\n      if (button.callback) {\n        await button.callback(this, button);\n        // await this.getData({}; Render will do a get data, doing it twice breaks the button data?\n\n        if (this.secondTimeoutId) {\n          clearTimeout(this.secondTimeoutId);\n          this.secondTimeoutId = undefined;\n        }\n        // this.render({force: true});\n      }\n      // this.close();\n    } catch (err) {\n      const message = \"midi-qol | Optional flag roll error see console for details \";\n      ui.notifications?.error(message);\n      TroubleShooter.recordError(err, message);\n      error(err);\n    }\n  }\n\n  async close() {\n    if (this.timeoutId) clearTimeout(this.timeoutId);\n    this.timeoutId = undefined;\n    if (this.secondTimeoutId) clearTimeout(this.secondTimeoutId);\n    this.secondTimeoutId = undefined;\n    if (this.data.close) this.data.close();\n    $(document).off('keydown.chooseDefault');\n    return super.close();\n  }\n}\n\nasync function displayBeforeAfterRolls(data: {\n  originalRoll: Roll,\n  newRoll: Roll,\n  rollMode: string,\n  title: string,\n  player: User.Implementation | undefined,\n  options: any,\n  actor: Actor.Implementation\n}) {\n  let { originalRoll, newRoll, rollMode, title, player, options, actor } = data;\n  options ??= {};  //TODO match the renderRoll to the roll type\n  options.messageData ??= {};\n  const newRollHTML = await midiRenderRoll(newRoll);\n  const originalRollHTML = await midiRenderRoll(originalRoll);\n  const chatData: any = foundry.utils.mergeObject(options.messageData ?? {}, {\n    flavor: `${title}`,\n    speaker: ChatMessage.getSpeaker({ actor: actor }),\n    content: `${originalRollHTML}<br>${newRollHTML}`,\n    whisper: [player?.id ?? \"\"],\n    rolls: [originalRoll, newRoll],\n    sound: CONFIG.sounds.dice,\n  }, { inplace: false });\n  // @ts-expect-error\n  if (originalRoll.options.rollMode) ChatMessage.applyRollMode(chatData, originalRoll.options.rollMode);\n  else ChatMessage.applyRollMode(chatData, rollMode as ChatMessage.PassableRollMode);\n  foundry.utils.setProperty(newRoll, `flags.${MODULE_ID}.chatMessageShown`, true);\n  return await ChatMessage.create(chatData);\n}\n\nexport async function bonusDialog(\n  bonusFlags: string[],\n  flagSelector: string,\n  showRoll: boolean,\n  title: string,\n  roll: Roll | undefined,\n  rollType: string,\n  options: any = {}\n): Promise<Roll | undefined> {\n  const showDiceSoNice = !options.hideDSN && dice3dEnabled();\n  let timeoutId: NodeJS.Timeout | undefined;\n  if (!roll) return undefined;\n  let newRoll = roll;\n  let originalRoll = roll;\n  let rollHTML = await midiRenderRoll(roll);\n  const player = playerForActor(this.actor);\n  // Map full flag path -> owning document (item enchantment) for flags whose data\n  // does not live on the actor. Defaults to actor when not present in the map.\n  const flagOwners: Record<string, any> = options.flagOwners ?? {};\n  const ownerOf = (flagName: string): any => flagOwners[flagName] ?? this.actor;\n\n  const callback = async (dialog, button) => {\n    if (this.secondTimeoutId) {\n      clearTimeout(this.secondTimeoutId);\n    }\n\n    let reRoll: Roll | undefined;\n    let chatMessage: ChatMessage.Implementation | undefined;\n    const undoId = foundry.utils.randomID();\n    const undoData = {\n      id: undoId,\n      userId: player?.id ?? \"\",\n      userName: player?.name ?? \"Gamemaster\",\n      itemName: button.label,\n      itemUuid: \"\",\n      actorUuid: this.actor.uuid,\n      actorName: this.actor.name,\n      isReaction: true\n    }\n    await unTimedExecuteAsGM(\"queueUndoDataDirect\", undoData)\n\n    const buttonOwner = ownerOf(button.key);\n    // const rollMode = foundry.utils.getProperty(buttonOwner ?? {}, button.key)?.rollMode ?? safeGetGameSetting(\"core\", \"rollMode\");\n    // @ts-expect-error no dnd5e-types\n    let rollMode = roll.options.rollMode;\n    rollMode = (foundry.utils.getProperty(buttonOwner ?? {}, button.key) as any)?.rollMode ?? rollMode ?? safeGetGameSetting(\"core\", \"rollMode\");\n    if (!hasEffectGranting(this.actor, button.key, flagSelector, buttonOwner)) return;\n    let resultApplied = false; // This is just for macro calls\n    let macroToCall: string = \"\";\n    const allFlagSelector = flagSelector.split(\".\").slice(0, -1).join(\".\") + \".all\";\n    let specificMacro = false;\n    const possibleMacro = foundry.utils.getProperty(buttonOwner ?? {}, `${button.key}.${flagSelector}`) ||\n      foundry.utils.getProperty(buttonOwner ?? {}, `${button.key}.${allFlagSelector}`);\n    if (possibleMacro && typeof button.value === \"string\" && (button.value.trim().startsWith(\"ItemMacro\") || button.value.trim().startsWith(\"Macro\") || button.value.trim().startsWith(\"function\"))) {\n      macroToCall = button.value;\n      if (macroToCall.startsWith(\"Macro.\")) macroToCall = macroToCall.replace(\"Macro.\", \"\");\n      specificMacro = true;\n    } else if ((foundry.utils.getProperty(buttonOwner ?? {}, `${button.key}.macroToCall`) as string)?.trim()) {\n      macroToCall = (foundry.utils.getProperty(buttonOwner ?? {}, `${button.key}.macroToCall`) as string)?.trim();\n    }\n    if (macroToCall) {\n      let result: any;\n      let workflow: Workflow;\n      if (this instanceof Workflow) {\n        workflow = this;\n      } else {\n        const itemUuidOrName = macroToCall.split(\".\").slice(1).join(\".\");\n        let item = fromUuidSync(itemUuidOrName);\n        if (!item && this.actor) item = this.actor.items.getName(itemUuidOrName);\n        if (!item && this instanceof Actor) item = this.items.getName(itemUuidOrName);\n        workflow = new DummyWorkflow(this.actor ?? this, {}, ChatMessage.getSpeaker({ actor: this.actor }), [], { item });\n      }\n      const macroData = workflow.getMacroData();\n      macroData.macroPass = `${button.key}.${flagSelector}`;\n      macroData.workflow = workflow;\n      macroData.tag = \"optional\";\n      macroData.roll = roll;\n\n      result = await workflow.callMacro(workflow?.item, macroToCall, macroData, { roll, bonus: (!specificMacro ? button.value : undefined) });\n      if (typeof result === \"string\")\n        button.value = result;\n      else if (typeof result === \"number\")\n        button.value = `${result}`;\n      else if (result instanceof Roll) {\n        newRoll = result;\n        resultApplied = true;\n      }\n      if (result === undefined && debugEnabled > 0) warn(`bonusDialog | macro ${button.value} return undefined`)\n    }\n\n    // do the roll modifications\n    if (!resultApplied) switch (button.value) {\n      case \"reroll\": reRoll = await roll!.reroll();\n        if (showDiceSoNice) await displayDSNForRoll(reRoll, rollType, rollMode);\n        newRoll = reRoll; break;\n      case \"reroll-query\":\n        reRoll = reRoll = await roll!.reroll();\n        if (showDiceSoNice) await displayDSNForRoll(reRoll, rollType, rollMode);\n        const newRollHTML = await midiRenderRoll(reRoll);\n        if (await DialogV2.confirm({ window: { title: \"Confirm reroll\" }, content: `Replace ${rollHTML} with ${newRollHTML}`, defaultYes: true }))\n          newRoll = reRoll\n        else\n          newRoll = roll!;\n        break;\n      case \"reroll-kh\": reRoll = await roll!.reroll();\n        if (showDiceSoNice) await displayDSNForRoll(reRoll, rollType === \"attackRoll\" ? \"attackRollD20\" : rollType, rollMode);\n        newRoll = reRoll;\n        if (reRoll.total! <= (roll!.total ?? 0)) newRoll = roll!;\n        break;\n      case \"reroll-kl\": reRoll = await roll!.reroll();\n        newRoll = reRoll;\n        if (reRoll.total! > (roll!.total ?? 0)) newRoll = roll!;\n        if (showDiceSoNice) await displayDSNForRoll(reRoll, rollType === \"attackRoll\" ? \"attackRollD20\" : rollType, rollMode);\n        break;\n      case \"reroll-max\": newRoll = await roll!.reroll({ maximize: true });\n        if (showDiceSoNice) await displayDSNForRoll(newRoll, rollType === \"attackRoll\" ? \"attackRollD20\" : rollType, rollMode);\n        break;\n      case \"reroll-min\": newRoll = await roll!.reroll({ minimize: true });\n        if (showDiceSoNice) await displayDSNForRoll(newRoll, rollType === \"attackRoll\" ? \"attackRollD20\" : rollType, rollMode);\n        break;\n\n      case \"success\":\n        newRoll = newRoll = await roll!.clone().evaluate();\n        //@ts-expect-error\n        newRoll.terms[0].results.forEach(res => res.result = 99);\n        //@ts-expect-error\n        newRoll._total = 99;\n        foundry.utils.setProperty(newRoll, \"options\", foundry.utils.duplicate(roll!.options))\n        foundry.utils.setProperty(newRoll, \"options.success\", true);\n        break;\n      case \"fail\":\n        newRoll = newRoll = await roll!.clone().evaluate();\n        foundry.utils.setProperty(newRoll, \"options\", foundry.utils.duplicate(roll!.options))\n        foundry.utils.setProperty(newRoll, \"options.success\", false);\n        //@ts-expect-error\n        newRoll.terms[0].results.forEach(res => res.result = -1);\n        //@ts-expect-error\n        newRoll._total = -1;\n        break;\n      case \"critical\":\n        foundry.utils.setProperty(newRoll, \"options\", foundry.utils.duplicate(roll!.options));\n        //@ts-expect-error\n        if (newRoll.options.rollType === \"damage\") {\n          foundry.utils.setProperty(newRoll, \"options.isCritical\", true);\n          foundry.utils.setProperty(newRoll, \"options.configured\", false);\n          newRoll = await newRoll.reroll();\n        } else {\n          const term = newRoll.terms[0] as foundry.dice.terms.Die;\n          const result = term?.results?.find(r => r.active)?.result ?? newRoll.total;\n          foundry.utils.setProperty(term, \"options.critical\", result);\n          foundry.utils.setProperty(term, \"options.criticalSuccess\", result);\n          foundry.utils.setProperty(newRoll, \"options.criticalSuccess\", result);\n        }\n        if (this instanceof Workflow) this.tracker.critical.force(`${button.key}.${flagSelector}`, \"Optional bonus\");\n        break;\n      default:\n        if (typeof button.value === \"string\" && button.value.startsWith(\"replace \")) {\n          const rollParts = button.value.split(\" \");\n          newRoll = new Roll(rollParts.slice(1).join(\" \"), { ...((this.activity ?? this.item ?? this.actor)?.getRollData() ?? {}), ...roll!.data });\n          newRoll = await newRoll.evaluate();\n          if (showDiceSoNice) await displayDSNForRoll(newRoll, rollType, rollMode);\n        } else if (typeof button.value == \"string\" && button.value.startsWith(\"reroll-withBonus\")) {\n          let bonus = button.value.split(\"reroll-withBonus \").slice(1).join(\" \");\n          if (!bonus.startsWith(\"+\")) bonus = \"+\" + bonus;\n          //@ts-expect-error\n          newRoll = await new roll.constructor(`${roll.formula} ${bonus}`, { ...((this.activity ?? this.item ?? this.actor)?.getRollData() ?? {}), ...roll.data }).roll();\n          if (showDiceSoNice) await displayDSNForRoll(newRoll, rollType, rollMode);\n        } else if (flagSelector.startsWith(\"damage.\")) {\n          //@ts-expect-error .DamageRoll\n          const DamageRoll = CONFIG.Dice.DamageRoll\n          let rollOptions = foundry.utils.duplicate(roll!.options);\n          if (foundry.utils.getProperty(buttonOwner ?? this.actor ?? this, `${button.key}.criticalDamage`))\n            //@ts-expect-error\n            rollOptions.configured = false;\n          // rollOptions = { critical: (this.isCritical || this.rollOptions.critical), configured: false };\n          //@ts-expect-error D20Roll\n          newRoll = CONFIG.Dice.D20Roll.fromRoll(roll);\n          const tempRoll = new DamageRoll(`${button.value}`, { ...((this.activity ?? this.item ?? this.actor)?.getRollData() ?? {}), ...roll!.data }, rollOptions);\n          await tempRoll.evaluate();\n          setRollOperatorEvaluated(tempRoll);\n          if (showDiceSoNice) await displayDSNForRoll(tempRoll, rollType, rollMode);\n          newRoll = addRollTo(roll!, tempRoll);\n        } else if (flagSelector === \"ac\") {\n          let rollOptions = foundry.utils.duplicate(roll!.options);\n          //@ts-expect-error\n          rollOptions.configured = false;\n          //@ts-expect-error D20Roll\n          newRoll = CONFIG.Dice.D20Roll.fromRoll(roll);\n          const tempRoll = new Roll(`${button.value}`, { ...((this.activity ?? this.item ?? this.actor)?.getRollData() ?? {}), ...roll!.data }, rollOptions);\n          await tempRoll.evaluate();\n          setRollOperatorEvaluated(tempRoll);\n          if (showDiceSoNice) await displayDSNForRoll(tempRoll, rollType, rollMode);\n          newRoll = addRollTo(roll!, tempRoll);\n        } else {\n          //@ts-expect-error\n          newRoll = CONFIG.Dice.D20Roll.fromRoll(roll);\n          const tempRoll = await (new Roll(`${button.value}`, { ...((this.activity ?? this.item ?? this.actor)?.getRollData() ?? {}), ...roll!.data })).roll();\n          if (showDiceSoNice) await displayDSNForRoll(tempRoll, rollType, rollMode);\n          newRoll = addRollTo(newRoll, tempRoll);\n        }\n        break;\n    }\n\n    if (showRoll && this.category === \"ac\") { // TODO do a more general fix for displaying this stuff\n      const newRollHTML = await midiRenderRoll(newRoll);\n      const chatData: ChatMessage.CreateData = {\n        flavor: i18n(\"DND5E.ArmorClass\"),\n        content: `${newRollHTML}`,\n        whisper: [player?.id ?? \"\"]\n      };\n      ChatMessage.applyRollMode(chatData, rollMode);\n      chatMessage = await ChatMessage.create(chatData);\n    }\n\n    await removeEffectGranting(this.actor, button.key);\n    roll = newRoll;\n    const optionalsUsed: string[] = foundry.utils.getProperty(roll, `flags.${MODULE_ID}.optionalsUsed`) as string[] ?? [];\n    optionalsUsed.push(`${button.key}.${flagSelector}`);\n    foundry.utils.setProperty(roll, `flags.${MODULE_ID}.optionalsUsed`, optionalsUsed);\n    if (dialog) {\n      validFlags = validFlags.filter(bf => bf !== button.key);\n      if (validFlags.length === 0) {\n        dialog?.close();\n        return;\n      }\n\n      const newRollHTML = /*reRoll ? await midiRenderRoll(reRoll) :*/ await midiRenderRoll(newRoll);\n      dialog.data.flags = validFlags;\n      dialog.data.currentRoll = newRoll;\n      if (game.user?.isGM) {\n        dialog.data.content = newRollHTML;\n      } else {\n        if ([\"publicroll\", \"gmroll\", \"selfroll\"].includes(rollMode)) dialog.data.content = newRollHTML;\n        else dialog.data.content = \"Hidden Roll\";\n      }\n      dialog.render(true);\n      // dialog.close();\n    }\n    if (chatMessage) unTimedExecuteAsGM(\"updateUndoChatCardUuidsById\", { id: undoId, chatCardUuids: [(await chatMessage).uuid] });\n  }\n\n  let parameters: { [key: string]: any } = {};\n  if (!(this instanceof Workflow) && this.optionalBonusEffectsAC) {\n    let sourceToken = (fromUuidSync(this.triggerTokenUuid) as TokenDocument.Implementation | undefined)?.object;\n    const sourceActor = sourceToken?.actor ?? fromUuidSync(this.optionalBonusEffectsAC.workflowOptions?.sourceActorUuid) as Actor.Implementation | undefined;\n    if (!sourceToken && sourceActor) sourceToken = getOrCreateTokenForActor(sourceActor);\n    parameters = {\n      ...this.optionalBonusEffectsAC,\n      actor: sourceActor,\n      tokenUuid: sourceToken?.document?.uuid,\n      target: fromUuidSync(this.tokenUuid) as TokenDocument.Implementation | undefined,\n      triggeringRoll: this.roll,\n      triggeringRollTotal: this.rollTotal,\n      triggeringRollHTML: this.rollHTML,\n      options\n    }\n  } else {\n    parameters = {\n      activity: this.activity,\n      item: this.item,\n      actor: this.actor,\n      target: this.targets?.first(),\n      options\n    };\n  };\n  const conditionData = createConditionData({ workflow: (this instanceof Workflow ? this : undefined), ...parameters });\n  let validFlags: string[] = [];\n  let lastForceFlag = \"\"\n  const oldRoll = foundry.utils.deepClone(roll);\n  for (let flagName of bonusFlags) {\n    const owner = ownerOf(flagName);\n    if ((getOptionalCountRemaining(this.actor, `${flagName}.count`, owner)) < 1) continue;\n    let activationCondition: string | undefined = foundry.utils.getProperty(owner ?? {}, `${flagName}.activation`) as string;\n    if (activationCondition !== undefined) {\n      activationCondition = await evalCondition(activationCondition, conditionData, { errorReturn: true, async: true });\n      if (!activationCondition) continue;\n    }\n    let forcedCondition: string | undefined = foundry.utils.getProperty(owner ?? {}, `${flagName}.force`) as string;\n    if (forcedCondition !== undefined) {\n      forcedCondition = await evalCondition(forcedCondition, conditionData, { errorReturn: true, async: true });\n      if (forcedCondition) {\n        const altFlag = flagSelector.split(\".\").slice(0, -1).join(\".\") + \".all\";\n        await callback(undefined, {\n          key: flagName,\n          value: foundry.utils.getProperty(owner ?? {}, `${flagName}.${flagSelector}`) ?? foundry.utils.getProperty(owner ?? {}, `${flagName}.${altFlag}`) ?? \"\",\n          label: \"none\"\n        });\n        lastForceFlag = flagName;\n      }\n      continue;\n    }\n    if (foundry.utils.getProperty(owner, flagName) !== undefined) validFlags.push(flagName);\n  }\n  if (showRoll && lastForceFlag !== \"\") {\n    DSNMarkDiceDisplayed(roll);\n    // const rollMode = foundry.utils.getProperty(this.actor ?? {}, lastForceFlag)?.rollMode ?? options.rollMode ?? safeGetGameSetting(\"core\", \"rollMode\");\n    //@ts-expect-error\n    const rollMode = foundry.utils.getProperty(ownerOf(lastForceFlag) ?? {}, lastForceFlag)?.rollMode ?? oldRoll.options.rollMode ?? safeGetGameSetting(\"core\", \"rollMode\");\n    const card = await displayBeforeAfterRolls({ originalRoll: oldRoll, newRoll: roll, rollMode, title, player, options, actor: this.actor });\n    if (card?.uuid && this instanceof Workflow) { // this does not work currently since the undoId has not yet been set\n      await unTimedExecuteAsGM(\"updateUndoChatCardUuidsById\", { id: this.undoId, chatCardUuids: [card.uuid] });\n    }\n  }\n  if (validFlags.length === 0) return roll;\n  let timeout = options.timeout ?? configSettings.reactionTimeout ?? defaultTimeout;\n  return new Promise((resolve, reject) => {\n    async function onClose() {\n      if (timeoutId) clearTimeout(timeoutId);\n      // The original roll is dsn displayed before the bonus dialog is called so mark it as displayed\n      DSNMarkDiceDisplayed(originalRoll);\n      // The new roll has had dsn display done for each bonus term/reroll so mark it as displayed\n      DSNMarkDiceDisplayed(newRoll);\n\n      if (showRoll && newRoll !== originalRoll) {\n        //@ts-expect-error\n        const card = await displayBeforeAfterRolls({ originalRoll, newRoll, rollMode: originalRoll.options.rollMode, title, player, options, actor: this.actor });\n        if (card?.uuid && this instanceof Workflow) { // this does not work currently since the undoId has not yet been set\n          await unTimedExecuteAsGM(\"updateUndoChatCardUuidsById\", { id: this.undoId, chatCardUuids: [card.uuid] });\n        }\n      }\n      resolve(newRoll)\n    }\n    if (options.timeout) {\n      timeoutId = setTimeout(() => {\n        resolve(newRoll);\n      }, timeout * 1000);\n    }\n\n    let content: string;\n    let rollMode: any = options?.rollMode ?? safeGetGameSetting(\"core\", \"rollMode\");\n    if (game.user?.isGM) {\n      content = rollHTML;\n    } else {\n      if ([\"publicroll\", \"gmroll\", \"selfroll\"].includes(rollMode)) content = rollHTML;\n      else content = \"Hidden Roll\";\n    }\n    const dialog = new RollModifyDialog(\n      {\n        actor: this.actor,\n        flags: validFlags,\n        flagSelector,\n        targetObject: this,\n        title,\n        content,\n        currentRoll: roll,\n        rollHTML,\n        rollMode: rollType,\n        callback,\n        close: onClose.bind(this),\n        timeout,\n        item: this.item,\n        workflow: this instanceof Workflow ? this : undefined,\n        flagOwners\n      }).render({ force: true });\n  });\n}\n\nexport function getOptionalCountRemainingShortFlag(actor: Actor.Implementation, flag: string, owner?: any) {\n  const flagPrefix = `flags.${MODULE_ID}.optional.${flag}`;\n  const countRemaining = getOptionalCountRemaining(actor, `${flagPrefix}.count`, owner) && getOptionalCountRemaining(actor, `${flagPrefix}.countAlt`, owner);\n  return countRemaining;\n}\n\nfunction getOptionalItemUsesItemMatch(actor: Actor.Implementation, countValue: string, returnItem = false) {\n  let itemNames = countValue.split(\".\");\n  let itemName: string;\n  let item: Item.Implementation;\n  if (itemNames[1] === \"identifier\") {\n    itemName = itemNames[2];\n    // @ts-expect-error no dnd5e-types\n    item = actor.items.find(i => i.identifier === itemName);\n  } else if (itemNames[1] === \"partialNameMatch\") {\n    itemName = itemNames[2];\n    // @ts-expect-error no dnd5e-types\n    item = actor.items.find(i => i.name.includes(itemName));\n  } else if (itemNames[1] === \"exactNameMatch\") {\n    itemName = itemNames[2];\n    // @ts-expect-error no dnd5e-types\n    item = actor.items.getName(itemName);\n  } else {\n    itemName = itemNames[1];\n    // @ts-expect-error no dnd5e-types\n    item = actor.items.getName(itemName);\n  }\n  if (returnItem) {\n    if (!item) {\n      const message = `midi-qol | removeEffectGranting | could not decrement uses for ${itemName} on actor ${actor.name}`;\n      error(message);\n      TroubleShooter.recordError(new Error(message), message);\n      return undefined;\n    } else {\n      return item;\n    }\n  } else {\n    // @ts-expect-error no dnd5e-types\n    return item?.system.uses.value;\n  }\n}\n\nfunction getOptionalActivityUsesActivityMatch(actor: Actor.Implementation, countValue: string, returnActivity = false) {\n  let activityNames = countValue.split(\".\");\n  let itemName: string;\n  let activityName: string;\n  let item: Item.Implementation | undefined;\n  let activity: Activity | undefined;\n  if (activityNames[1] === \"identifier\") {\n    // Example: ActivityUses.identifier.special-mace.super-attack\n    itemName = activityNames[2];\n    activityName = activityNames[3];\n    // @ts-expect-error no dnd5e-types\n    item = actor.items.find(i => i.identifier === itemName);\n    // @ts-expect-error no dnd5e-types\n    activity = item?.system.activities?.contents?.find(a => a.identifier === activityName);\n  } else if (activityNames[1] === \"partialNameMatch\") {\n    // Example: ActivityUses.partialNameMatch.mace.super\n    itemName = activityNames[2];\n    activityName = activityNames[3];\n    item = actor.items.find(i => i.name.includes(itemName));\n    // @ts-expect-error no dnd5e-types\n    activity = item?.system.activities?.contents?.find(a => a.name.includes(activityName));\n  } else if (activityNames[1] === \"id\") {\n    // Example: ActivityUses.id.iLKpfoGF7rGpvNWD.NegUUOdFH35S3xNi\n    itemName = activityNames[2];\n    activityName = activityNames[3];\n    // @ts-expect-error no dnd5e-types\n    activity = actor.items.get(itemName)?.system.activities?.get(activityName);\n  } else if (activityNames[1] === \"exactNameMatch\") {\n    // Example: ActivityUses.exactNameMatch.Special Mace.Super Attack\n    itemName = activityNames[2];\n    activityName = activityNames[3];\n    item = actor.items.getName(itemName);\n    // @ts-expect-error no dnd5e-types\n    activity = item?.system.activities?.getName(activityName);\n  } else {\n    // Example: ActivityUses.Special Mace.Super Attack\n    itemName = activityNames[1];\n    activityName = activityNames[2];\n    item = actor.items.getName(itemName);\n    // @ts-expect-error no dnd5e-types\n    activity = item?.system.activities?.getName(activityName);\n  }\n  if (returnActivity) {\n    if (!activity) {\n      const message = `midi-qol | removeEffectGranting | could not decrement uses for ${itemName}'s activity ${activityName} on actor ${actor.name}`;\n      error(message);\n      TroubleShooter.recordError(new Error(message), message);\n      return undefined;\n    } else {\n      return activity;\n    }\n  } else {\n    return activity?.uses.value;\n  }\n}\n// `owner` is the document that holds the flag value (defaults to actor). Game-state checks\n// (combat turns, reactions, item/activity uses) always use the actor.\nexport function getOptionalCountRemaining(actor: Actor.Implementation, flag: string, owner?: any) {\n  const countValue = foundry.utils.getProperty(owner ?? actor, flag) as string;\n  if (!countValue) return 1;\n  if (Number.isNumeric(countValue)) return countValue;\n  if ([\"each-round\", \"each-turn\"].includes(countValue) && game.combat) {\n    let usedFlag = flag.replace(\".count\", \".used\");\n    // check for the flag\n    if (foundry.utils.getProperty(actor, usedFlag) === game.combat.uuid) return 0;\n  } else if ([\"turn\"].includes(countValue) && game.combat) {\n    let usedFlag = flag.replace(\".count\", \".used\");\n    if (foundry.utils.getProperty(actor, usedFlag) === game.combat.uuid || game.combat?.turns[game.combat?.turn ?? \"\"]?.actor?.uuid !== actor?.uuid) return 0;\n  } else if (countValue === \"reaction\") {\n    // return await hasUsedReaction(actor)\n    return actor.flags?.[MODULE_ID]?.actions?.reactionCombatRound && needsReactionCheck(actor) ? 0 : 1;\n  } else if (countValue === \"bonusAction\") {\n    return actor.flags?.[MODULE_ID]?.actions?.bonusActionCombatRound && needsBonusActionCheck(actor) ? 0 : 1;\n  } else if (countValue === \"every\") return 1;\n  else if (countValue.startsWith(\"ActivityUses.\")) return getOptionalActivityUsesActivityMatch(actor, countValue, false);\n  else if (countValue.startsWith(\"ItemUses.\")) return getOptionalItemUsesItemMatch(actor, countValue, false);\n  if (countValue.startsWith(\"@\")) {\n    let result = foundry.utils.getProperty(actor?.system ?? {}, countValue.slice(1))\n    return result;\n  }\n  return 1;\n}\n\nexport async function removeEffectGranting(actor: Actor.Implementation, changeKey: string) {\n  const effect = actor.appliedEffects.find(ef => ef.changes.some(c => c.key.includes(changeKey)))\n  if (effect === undefined) return;\n  const effectData = effect.toObject();\n\n  const count = effectData.changes.find(c => c.key.includes(changeKey) && c.key.endsWith(\".count\"));\n  const countAlt = effectData.changes.find(c => c.key.includes(changeKey) && c.key.endsWith(\".countAlt\"));\n  if (!count) {\n    return expireEffects(actor, [effect], { \"expiry-reason\": \"midi-qol:optionalConsumed\" })\n  }\n  if (Number.isNumeric(count.value) || Number.isNumeric(countAlt?.value)) {\n    if (Number(count.value) <= 1 || Number(countAlt?.value) <= 1)\n      return expireEffects(actor, [effect], { \"expiry-reason\": \"midi-qol:optionalConsumed\" })\n    else if (Number.isNumeric(count.value)) {\n      count.value = `${Number(count.value) - 1}`; // must be a string\n    } else if (Number.isNumeric(countAlt?.value)) {\n      countAlt!.value = `${Number(countAlt!.value) - 1}`; // must be a string\n    }\n    await effect.update({ changes: effectData.changes });\n  }\n  if (typeof count.value === \"string\" && count.value.startsWith(\"ItemUses.\")) {\n    const item = getOptionalItemUsesItemMatch(actor, count.value, true);\n    if (!item) return;\n    await item.update({ \"system.uses.spent\": Math.max(0, item.system.uses.spent + 1) });\n  }\n  if (typeof countAlt?.value === \"string\" && countAlt.value.startsWith(\"ItemUses.\")) {\n    const item = getOptionalItemUsesItemMatch(actor, countAlt.value, true);\n    if (!item) return;\n    await item.update({ \"system.uses.spent\": Math.max(0, item.system.uses.spent + 1) });\n  }\n  if (typeof count.value === \"string\" && count.value.startsWith(\"ActivityUses.\")) {\n    const activity = getOptionalActivityUsesActivityMatch(actor, count.value, true);\n    if (!activity) return;\n    // @ts-expect-error no dnd5e-types\n    await activity.update({ \"uses.spent\": Math.max(0, activity.uses.spent + 1) });\n  }\n  if (typeof countAlt?.value === \"string\" && countAlt.value.startsWith(\"ActivityUses.\")) {\n    const activity = getOptionalActivityUsesActivityMatch(actor, countAlt.value, true);\n    if (!activity) return;\n    // @ts-expect-error no dnd5e-types\n    await activity.update({ \"uses.spent\": Math.max(0, activity.uses.spent + 1) });\n  }\n  const actorUpdates: any = {};\n  if (typeof count.value === \"string\" && count.value.startsWith(\"@\")) {\n    let key = count.value.slice(1);\n    if (key.startsWith(\"system.\")) key = key.replace(\"system.\", \"\")\n    // we have an @field to consume\n    let charges = foundry.utils.getProperty(actor?.system ?? {}, key) as number;\n    if (charges) {\n      charges -= 1;\n      actorUpdates[`system.${key}`] = charges;\n    }\n  }\n  if (typeof countAlt?.value === \"string\" && countAlt.value.startsWith(\"@\")) {\n    let key = countAlt.value.slice(1);\n    if (key.startsWith(\"system.\")) key = key.replace(\"system.\", \"\")\n    // we have an @field to consume\n    let charges = foundry.utils.getProperty(actor?.system ?? {}, key) as number;\n    if (charges) {\n      charges -= 1;\n      actorUpdates[`system.${key}`] = charges;\n    }\n  }\n\n  if ([\"turn\", \"each-round\", \"each-turn\"].includes(count.value)) {\n    const flagKey = `${changeKey}.used`.replace(`flags.${MODULE_ID}.`, \"\");\n    actorUpdates[`${changeKey}.used`] = game.combat?.uuid;\n    // await actor.setFlag(MODULE_ID, flagKey, true);\n  }\n  if ([\"turn\", \"each-round\", \"each-turn\"].includes(countAlt?.value ?? \"\")) {\n    const flagKey = `${changeKey}.used`.replace(`flags.${MODULE_ID}.`, \"\");\n    actorUpdates[`${changeKey}.used`] = game.combat?.uuid;\n    // await actor.setFlag(MODULE_ID, flagKey, true);\n  }\n  if (!foundry.utils.isEmpty(actorUpdates)) await actor.update(actorUpdates);\n\n  if (count.value === \"reaction\" || countAlt?.value === \"reaction\") {\n    await setReactionUsed(actor);\n  }\n\n  if (count.value === \"bonusAction\" || countAlt?.value === \"bonusAction\") {\n    await setBonusActionUsed(actor);\n  }\n}\n\nexport function hasEffectGranting(actor: Actor.Implementation, key: string, selector: string, owner?: any) {\n  // Actually check for the flag being set...\n  if (getOptionalCountRemainingShortFlag(actor, key, owner) <= 0) return false;\n  const source = owner ?? actor;\n  let changeKey = `${key}.${selector}`;\n  let hasKey = foundry.utils.getProperty(source ?? {}, changeKey);\n  if (hasKey !== undefined) return true;\n  let allKey = selector.split(\".\");\n  allKey[allKey.length - 1] = \"all\";\n  changeKey = `${key}.${allKey.join(\".\")}`;\n  hasKey = foundry.utils.getProperty(source ?? {}, changeKey);\n  if (hasKey !== undefined) return hasKey;\n  return false;\n}\n\nfunction maxCastLevel(actor: Actor.Implementation) {\n  if (configSettings.ignoreSpellReactionRestriction) return 9;\n  // @ts-expect-error no dnd5e-types\n  const spells = actor.system.spells;\n  if (!spells) return 0;\n  let pactLevel = spells.pact?.value ? spells.pact?.level : 0;\n  for (let i = 9; i > pactLevel; i--) {\n    if (spells[`spell${i}`]?.value > 0) return i;\n  }\n  return pactLevel;\n}\n\nexport const reactionTypes = {\n  \"reaction\": { prompt: \"midi-qol.reactionFlavorHit\", triggerLabel: \"isHit\" },\n  \"reactiontargeted\": { prompt: \"midi-qol.reactionFlavorTargeted\", triggerLabel: \"isTargeted\" },\n  \"reactionhit\": { prompt: \"midi-qol.reactionFlavorHit\", triggerLabel: \"isHit\" },\n  \"reactionmissed\": { prompt: \"midi-qol.reactionFlavorMiss\", triggerLabel: \"isMissed\" },\n  \"reactioncritical\": { prompt: \"midi-qol.reactionFlavorCrit\", triggerLabel: \"isCrit\" },\n  \"reactionfumble\": { prompt: \"midi-qol.reactionFlavorFumble\", triggerLabel: \"isFumble\" },\n  \"reactionheal\": { prompt: \"midi-qol.reactionFlavorHeal\", triggerLabel: \"isHealed\" },\n  \"reactiondamage\": { prompt: \"midi-qol.reactionFlavorDamage\", triggerLabel: \"isDamaged\" },\n  \"reactionpreattack\": { prompt: \"midi-qol.reactionFlavorPreAttack\", triggerLabel: \"preAttack\" },\n  \"reactionattacked\": { prompt: \"midi-qol.reactionFlavorAttacked\", triggerLabel: \"isAttacked\" },\n  \"reactionsave\": { prompt: \"midi-qol.reactionFlavorSave\", triggerLabel: \"isSave\" },\n  \"reactionsavefail\": { prompt: \"midi-qol.reactionFlavorSaveFail\", triggerLabel: \"isSaveFail\" },\n  \"reactionsavesuccess\": { prompt: \"midi-qol.reactionFlavorSaveSuccess\", triggerLabel: \"isSaveSuccess\" },\n  \"reactionmoved\": { prompt: \"midi-qol.reactionFlavorMoved\", triggerLabel: \"isMoved\" }\n};\n\nexport function reactionPromptFor(triggerType: string): string {\n  if (reactionTypes[triggerType]) return reactionTypes[triggerType].prompt;\n  return \"midi-qol.reactionFlavorAttack\";\n}\nexport function reactionTriggerLabelFor(triggerType: string): string {\n  if (reactionTypes[triggerType]) return reactionTypes[triggerType].triggerLabel;\n  return \"reactionHit\";\n}\n\nexport async function doReactions(targetRef: TokenOrDocument | string, triggerTokenUuid: string | undefined, triggeringRoll: Roll | null | undefined, triggerType: string, options: any = {}): Promise<{ name?: string, uuid?: string, ac?: number, itemName?: string }> {\n  const target = getToken(targetRef);\n  try {\n    const noResult = { name: undefined, uuid: undefined, ac: undefined };\n    if (!target) return noResult;\n    if (!target.actor || !target.actor.flags) return noResult;\n\n    if (checkIncapacitated(target.actor, debugEnabled > 0, false)) return noResult;\n    let player = playerFor(getTokenDocument(target));\n    const usedReaction = hasUsedReaction(target.actor);\n    if (getReactionSetting(player) === \"none\") return noResult;\n    if (!player || !player.active) player = ChatMessage.getWhisperRecipients(\"GM\").find(u => u.active);\n    if (!player) return noResult;\n    const maxLevel = maxCastLevel(target.actor);\n    // enableNotifications(false);\n    let reactions: ReactionItem[] = [];\n    let reactionCount = 0;\n    let reactionActivityList: ReactionItemReference[] = [];\n    try {\n      const items = target.actor.items;\n      for (let item of items) {\n        // @ts-expect-error no clue when this can happen\n        const theItem: Item.Implementation = item instanceof Item ? item : item.baseItem;\n        // @ts-expect-error no dnd5e-types\n        if (!theItem.system.activities) continue;\n        // If the spell is a proxy for a cast ativity skip\n        if (!!item.getFlag(\"dnd5e\", \"cachedFor\")) continue;\n        // @ts-expect-error no dnd5e-types\n        for (let activity of theItem.system.activities) {\n          const activationType = activity.effectiveActivationType ?? activity.activation?.type;\n          if (!activationType?.includes(\"reaction\")) continue;\n          if (activationType !== \"reaction\") {\n            console.warn(`midi-qol | itemReaction | item ${item.name} ${activity.name} has a reaction type of ${activationType} which is deprecated - please update to reaction and reaction conditions`)\n          }\n          // Item uses a reaction and actor has used a reaction.\n          if ((activity.activation?.value ?? 1) > 0 && usedReaction) continue; // TODO can't specify 0 cost reactions in dnd5e 4.x - have to find another way\n          // @ts-expect-error no dnd5e-types\n          if (!item.system.attuned && item.system.attunement === \"required\") continue;\n          let reactionCondition = activity.reactionCondition;\n          // For cast activities, also check the spell's reaction condition from the activity that will be used\n          if (activity.type === \"cast\" && activity.cachedSpell) {\n            const spell = activity.cachedSpell;\n            // Get the first usable activity - this is what spell.use() will use\n            const spellActivity = spell.system?.activities?.filter((a: any) => a.canUse)?.[0];\n            const spellCondition = spellActivity?.reactionCondition || \"\";\n            if (reactionCondition && spellCondition) {\n              reactionCondition = `(${reactionCondition}) && (${spellCondition})`;\n            } else {\n              reactionCondition = reactionCondition || spellCondition;\n            }\n          }\n          // @ts-expect-error no dnd5e-types\n          if (item.type === \"spell\") {\n            if (configSettings.ignoreSpellReactionRestriction) {\n              // Skip all validation for spells when this setting is enabled\n              reactions.push(activity);\n              continue;\n            }\n            // Filter out unprepared spells\n            // @ts-expect-error no dnd5e-types\n            if (item.system.prepared === 0 && item.system.method === \"spell\") continue;\n            // Filter spells that can't be cast due to no available slots of required level\n            // @ts-expect-error no dnd5e-types\n            if (item.system.level > 0 && ![\"atwill\", \"innate\"].includes(item.system.method) && item.system.level > maxLevel) continue;\n          }\n\n          // Use dnd5e's consumption checks for all items/spells\n          const config = activity._prepareUsageConfig({ create: false });\n          if (item.type === \"spell\") foundry.utils.setProperty(config, \"consume.spellSlot\", false);\n          const canUse = await activity._prepareUsageUpdates(config, { returnErrors: true });\n          if (canUse instanceof Array) continue; // insufficient uses available\n          // If no condition is specified, default to requiring isHit\n          if (!reactionCondition) {\n            reactionCondition = 'reaction === \"isHit\"';\n          }\n          const returnvalue = await evalReactionActivationCondition(options.workflow, reactionCondition, target, { async: true, extraData: { reaction: reactionTriggerLabelFor(triggerType) } });\n          if (debugEnabled > 0) warn(`for ${target.actor.name} ${theItem.name} using condition ${reactionCondition} condition ${returnvalue}`, options.workflow?.conditionData);\n          if (!returnvalue) continue;\n          reactions.push(activity);\n        }\n      };\n\n      if (debugEnabled > 0)\n        warn(`doReactions ${triggerType} for ${target.actor.name} ${target.name}`, reactions);\n      reactionActivityList = reactions.map(activity => {\n        return activity.uuid;\n        // magic item details return { \"itemName\": item.itemName, itemId: item.itemId, \"actionName\": item.actionName, \"img\": item.img, \"id\": item.id, \"uuid\": item.uuid };\n      });\n    } catch (err) {\n      const message = `midi-qol | fetching reactions`;\n      error(message);\n      TroubleShooter.recordError(err, message);\n    } finally {\n      enableNotifications(true);\n    }\n\n    if (await asyncHooksCall(\"midi-qol.ReactionFilter\", reactions, options, triggerType, reactionActivityList) === false) {\n      console.warn(\"midi-qol | Reaction processing cancelled by Hook\");\n      return { name: \"Filter\", ac: 0, uuid: undefined };\n    }\n    reactionCount = reactionActivityList?.length ?? 0;\n    if (!usedReaction) {\n      const midiFlags = target.actor.flags[MODULE_ID];\n      reactionCount = reactionCount + Object.keys(midiFlags?.optional ?? [])\n        .filter(flag => {\n          if (!(triggerType === \"reactionattacked\" && midiFlags?.optional?.[flag].ac)) return false;\n          if (!midiFlags?.optional[flag].count) return true;\n          return getOptionalCountRemainingShortFlag(target.actor!, flag) > 0;\n        }).length\n    }\n\n    if (reactionCount <= 0) return noResult;\n\n    let chatMessage: ChatMessage.Implementation;\n    const reactionFlavor = game.i18n?.format(reactionPromptFor(triggerType), { itemName: (options.item?.name ?? \"unknown\"), actorName: target.name });\n    const chatData: ChatMessage.CreateData = {\n      content: reactionFlavor,\n      whisper: [player.id]\n    };\n    const workflow: Workflow | undefined = options.workflow ?? Workflow.getWorkflow(options?.activity?.uuid);\n\n    if (configSettings.showReactionChatMessage) {\n      const targetDocument = target.document;\n      if (configSettings.enableDDBGL && installedModules.get(\"ddb-game-log\")) {\n        if (workflow?.flagTags) chatData.flags = workflow.flagTags;\n      }\n      chatMessage = await ChatMessage.create(chatData) as ChatMessage.Implementation;\n    }\n    const rollOptions = showReactionAttackRollOptions;\n    // {\"none\": \"Attack Hit\", \"d20\": \"d20 roll only\", \"d20Crit\": \"d20 + Critical\", \"all\": \"Whole Attack Roll\"},\n\n    let content: string | undefined = reactionFlavor;\n    if ([\"isHit\", \"isMissed\", \"isCrit\", \"isFumble\", \"isAttacked\"].includes(reactionTriggerLabelFor(triggerType))) {\n      switch (configSettings.showReactionAttackRoll) {\n        case \"all\":\n          content = `${reactionFlavor} - ${i18n(rollOptions.all)} ${triggeringRoll?.total ?? \"\"}`;\n          break;\n        case \"allCrit\":\n          //@ts-expect-error\n          const criticalString = triggeringRoll?.isCritical ? `<span style=\"color: green\">(${i18n(\"DND5E.Critical\")})</span>` : \"\";\n          content = `${reactionFlavor} - ${i18n(rollOptions.all)} ${triggeringRoll?.total ?? \"\"} ${criticalString}`;\n          break;\n        case \"d20\":\n          //@ts-expect-error\n          const theRoll = triggeringRoll?.terms[0]?.results ? triggeringRoll.terms[0].results[0].result : triggeringRoll?.terms[0]?.total ? triggeringRoll.terms[0].total : \"\";\n          content = `${reactionFlavor} ${i18n(rollOptions.d20)} ${theRoll}`;\n          break;\n        default:\n          content = reactionFlavor;\n      }\n    }\n\n    let result: any = await new Promise((resolve) => {\n      // set a timeout for taking over the roll\n      const timeoutId = setTimeout(() => {\n        resolve(noResult);\n      }, (configSettings.reactionTimeout ?? defaultTimeout) * 1000 * 2);\n\n      // Compiler does not realise player can't be undefined to get here\n      player && requestReactions(target, player, triggerTokenUuid, content ?? \"\", triggerType, reactionActivityList, resolve, chatMessage, options).then((result) => {\n        clearTimeout(timeoutId);\n      })\n    });\n    if (result?.name) {\n      let count = 100;\n      do {\n        await busyWait(50); // allow pending transactions to complete\n        count -= 1;\n      } while (globalThis.DAE.actionQueue.remaining && count);\n      target.actor.reset();\n      workflow?.actor.reset();\n      // (target.actor as Actor).prepareData(); // allow for any items applied to the actor - like shield spell\n    }\n    return result;\n  } catch (err) {\n    const message = `doReactions error ${triggerType} for ${target?.name} ${triggerTokenUuid}`;\n    TroubleShooter.recordError(err, message);\n    throw err;\n  }\n}\n\nexport async function requestReactions(\n  target: Token.Implementation,\n  player: User.Implementation,\n  triggerTokenUuid: string | undefined,\n  reactionFlavor: string,\n  triggerType: string,\n  reactionActivityList: ReactionItemReference[],\n  resolve: ({ }) => void,\n  chatPromptMessage: ChatMessage.Implementation,\n  options: any = {}\n) {\n  try {\n    const startTime = Date.now();\n    if (options.item && options.item instanceof CONFIG.Item.documentClass) {\n      options.itemUuid = options.item.uuid;\n      delete options.item;\n    }\n\n    if (options.workflow) {\n      options.workflowId = options.workflow.id;\n      delete options.workflow;\n    }\n\n    let result;\n    if (player.isGM) {\n      result = await unTimedExecuteAsGM(\"chooseReactions\", {\n        tokenUuid: target.document.uuid,\n        reactionFlavor,\n        triggerTokenUuid,\n        triggerType,\n        options,\n        reactionActivityList\n      });\n    } else {\n      result = await socketlibSocket.executeAsUser(\"chooseReactions\", player.id, {\n        tokenUuid: target.document.uuid,\n        reactionFlavor,\n        triggerTokenUuid,\n        triggerType,\n        options,\n        reactionActivityList\n      });\n    }\n    const endTime = Date.now();\n    if (debugEnabled > 0) warn(\"requestReactions | returned after \", endTime - startTime, result);\n    resolve(result);\n    if (chatPromptMessage) chatPromptMessage.delete();\n  } catch (err) {\n    const message = `requestReactions | error ${triggerType} for ${target?.name} ${triggerTokenUuid}`;\n    TroubleShooter.recordError(err, message);\n    error(message, err)\n    throw err;\n  }\n}\n\nexport async function promptReactions(\n  tokenUuid: string,\n  reactionActivityList: ReactionItemReference[],\n  triggerTokenUuid: string | undefined,\n  reactionFlavor: string,\n  triggerType: string,\n  options: any = {}\n) {\n  try {\n    const startTime = Date.now();\n    const target = fromUuidSync(tokenUuid) as TokenDocument.Implementation | undefined;\n    const actor = target?.actor;\n    if (!actor) return;\n    const usedReaction = hasUsedReaction(actor);\n    // if ( usedReaction && needsReactionCheck(actor)) return false;\n    const midiFlags: any = foundry.utils.getProperty(actor ?? {}, `flags.${MODULE_ID}`);\n    let result;\n    let reactionActivities: Activity[] = [];\n    enableNotifications(false);\n    try {\n      enableNotifications(false);\n      for (let ref of reactionActivityList) {\n        if (typeof ref === \"string\") reactionActivities.push((await fromUuid(ref)) as unknown as Activity);\n        // Inaccurate, but simplifies things\n        else reactionActivities.push(ref as unknown as Activity);\n      };\n    } finally {\n      enableNotifications(true);\n    }\n    if (reactionActivities.length > 0) {\n      if (await asyncHooksCall(\"midi-qol.ReactionFilter\", reactionActivities, options, triggerType, reactionActivityList) === false) {\n        console.warn(\"midi-qol | Reaction processing cancelled by Hook\");\n        return { name: \"Filter\" };\n      }\n      result = await reactionDialog(actor, triggerTokenUuid, reactionActivities, reactionFlavor, triggerType, options);\n      const endTime = Date.now();\n      if (debugEnabled > 0) warn(\"promptReactions | reaction processing returned after \", endTime - startTime, result)\n      if (result.uuid) return result; //TODO look at multiple choices here\n    }\n    if (usedReaction) return { name: \"None\" };\n    if (!midiFlags) return { name: \"None\" };\n    const validFlags = Object.keys(midiFlags?.optional ?? {})\n      .filter(flag => {\n        if (!midiFlags.optional[flag].ac) return false;\n        if (!midiFlags.optional[flag].count) return true;\n        return getOptionalCountRemainingShortFlag(actor, flag) > 0;\n      }).map(flag => `flags.${MODULE_ID}.optional.${flag}`);\n    if (validFlags.length > 0 && triggerType === \"reactionattacked\") {\n      // @ts-expect-error no dnd5e-types\n      let acRoll = await new Roll(`${actor.system.attributes.ac.value}`).roll();\n      const data = {\n        actor,\n        tokenUuid,\n        optionalBonusEffectsAC: options,\n        triggerTokenUuid,\n        roll: acRoll,\n        rollHTML: reactionFlavor,\n        rollTotal: acRoll.total,\n      }\n      let displayBonusRolls: boolean | undefined = validFlags.reduce((acc: boolean | undefined, flag: string) => (acc || (foundry.utils.getProperty(actor ?? {}, `${flag}.displayBonusRolls`) as boolean)), undefined);\n      if (!displayBonusRolls) displayBonusRolls = checkMechanic(\"displayBonusRolls\") as boolean;\n      // @ts-expect-error no dnd5e-types\n      const newAC = await bonusDialog.bind(data)(validFlags, \"ac\", displayBonusRolls !== false, `${actor.name} - ${i18n(\"DND5E.AC\")} ${actor.system.attributes.ac.value}`, acRoll, \"roll\");\n      const endTime = Date.now();\n      if (debugEnabled > 0) warn(\"promptReactions | returned via bonus dialog \", endTime - startTime)\n      // Only return the AC result if the user actually used an optional bonus (AC changed)\n      if (newAC?.total !== acRoll.total) {\n        return { name: actor.name, uuid: actor.uuid, ac: newAC?.total };\n      }\n      return { name: \"None\" };\n    }\n    const endTime = Date.now();\n    if (debugEnabled > 0) warn(\"promptReactions | returned no result \", endTime - startTime)\n    return { name: \"None\" };\n  } catch (err) {\n    const message = `promptReactions ${tokenUuid} ${triggerType} ${reactionActivityList}`;\n    TroubleShooter.recordError(err, message);\n    throw err;\n  }\n}\n\nexport function playerFor(target?: TokenOrDocument | null): User | null | undefined {\n  return playerForActor(target?.actor); // just here for syntax checker\n}\n\nexport function playerForActor(actor?: Actor | null): User | undefined {\n  if (!actor) return undefined;\n  let user: User.Implementation | undefined;\n  const OWNERSHIP_LEVELS = CONST.DOCUMENT_OWNERSHIP_LEVELS\n  const ownwership = actor.ownership;\n  // find an active user whose character is the actor\n  if (actor.hasPlayerOwner) user = game.users?.find(u => u.character?.id === actor?.id && u.active);\n  if (!user) // no controller - find the first owner who is active\n    user = game.users?.players.find(p => p.active && ownwership[p.id ?? \"\"] === OWNERSHIP_LEVELS.OWNER)\n  if (!user) // find a non-active owner\n    user = game.users?.players.find(p => p.character?.id === actor?.id);\n  if (!user) // no controlled - find an owner that is not active\n    user = game.users?.players.find(p => ownwership[p.id ?? \"\"] === OWNERSHIP_LEVELS.OWNER)\n  if (!user && ownwership.default === OWNERSHIP_LEVELS.OWNER) {\n    // does anyone have default owner permission who is active\n    user = game.users?.players.find(p => p.active && ownwership[p.id as string] === OWNERSHIP_LEVELS.INHERIT)\n  }\n  // if all else fails it's an active gm.\n  if (!user) user = preferredActiveGM() ?? undefined;\n  return user;\n}\n\nexport async function reactionDialog(\n  actor: Actor.Implementation,\n  triggerTokenUuid: string | undefined,\n  reactionActivities: Activity[],\n  rollFlavor: string,\n  triggerType: string,\n  options: any = {}\n) {\n  const noResult = { name: \"None\" };\n  try {\n    let timeout = (options.timeout ?? configSettings.reactionTimeout ?? defaultTimeout);\n    return new Promise((resolve, reject) => {\n      let timeoutId = setTimeout(() => {\n        dialog.close();\n        resolve({});\n      }, timeout * 1000);\n      const callback = async function (dialog, button) {\n        clearTimeout(timeoutId);\n        const activity = reactionActivities.find(i => i.uuid === button.key);\n        if (activity) {\n          dialog.close();\n          // For Cast activities that don't override targeting, resolve the effective target type from the spell\n          let effectiveTargetType = activity.target?.affects?.type;\n          // @ts-expect-error no dnd5e-types for _source.target.override\n          if (activity.type === \"cast\" && !activity._source?.target?.override) {\n            // @ts-expect-error no dnd5e-types for CastActivity.cachedSpell / spell\n            const spell: Item.Implementation | undefined = activity.cachedSpell ?? fromUuidSync(activity.spell?.uuid);\n            if (spell) {\n              // @ts-expect-error no dnd5e-types for item.system.activities\n              const activities = spell.system?.activities;\n              const activityList = (activities instanceof Collection) ? activities.contents : Object.values(activities ?? {});\n              const spellActivity = activityList.find((a: any) => a.canUse) ?? activityList[0];\n              if (spellActivity?.target?.affects?.type) effectiveTargetType = spellActivity.target.affects.type;\n            }\n          }\n          const itemRollOptions = foundry.utils.mergeObject({\n            createWorkflow: true,\n            configureDialog: true,\n            checkGMStatus: false,\n            targetUuids: effectiveTargetType !== \"self\" ? [triggerTokenUuid] : [getOrCreateTokenForActor(actor)?.document?.uuid],\n            isReaction: true,\n            workflowOptions: { targetConfirmation: \"none\" },\n            ignoreUserTargets: true\n          }, options);\n\n          let useTimeoutId = setTimeout(() => {\n            clearTimeout(useTimeoutId);\n            resolve({})\n          }, ((timeout) - 1) * 1000);\n          let result: any = noResult;\n          clearTimeout(useTimeoutId);\n          if (activity.item instanceof CONFIG.Item.documentClass) { // a nomral item}\n            const config = { midiOptions: itemRollOptions };\n            result = await completeActivityUse(activity, config, {}, { systemCard: false });\n            const workflow = result;  // completeActivityUse returns a workflow when called locally which for reactions it always is\n            if (workflow && workflow.currentAction !== workflow.WorkflowState_Cleanup) resolve(noResult);\n            else if (workflow) resolve({ name: workflow.activity.name, uuid: workflow.activity.uuid, itemName: workflow.activity.item.name, itemUuid: activity.item.uuid })\n            else resolve(noResult);\n          }\n        }\n        // actor.reset();\n        resolve(noResult)\n      };\n      const noReaction = async function (dialog, button) {\n        clearTimeout(timeoutId);\n        resolve(noResult);\n      }\n      const dialog = new ReactionDialog({\n        actor,\n        targetObject: this,\n        title: `${actor.name}`,\n        activities: reactionActivities,\n        content: rollFlavor,\n        callback,\n        close: noReaction,\n        timeout\n      });\n\n      dialog.render({ force: true });\n    });\n  } catch (err) {\n    const message = `reaactionDialog error ${actor?.name} ${actor?.uuid} ${triggerTokenUuid}`;\n    TroubleShooter.recordError(err, message);\n    throw err;\n  }\n}\n\n// TODO: Probably this\nexport class ReactionDialog extends HandlebarsApplicationMixin(ApplicationV2) {\n  startTime: number;\n  endTime: number;\n  timeoutId: any;\n  timeRemaining: number;\n\n  data: {\n    actor: Actor.Implementation,\n    activities: Activity[],\n    title: string,\n    content: HTMLElement,\n    callback: () => {},\n    close: (args0: any) => {},\n    buttons: any,\n    completed: boolean,\n    timeout: number,\n    timeRemaining: number\n  }\n\n  constructor(data) {\n    super(data);\n    this.data = data;\n    this.timeRemaining = this.data.timeout;\n    this.startTime = this.endTime = Date.now();\n    this.data.completed = false;\n    this.timeoutId = this.set1Secondtimeout();\n  }\n\n  static PARTS = {\n    dialog: {\n      id: \"dialog-reaction\",\n      classes: [\"dialog\", \"midi-qol\", \"reaction\"],\n      template: \"modules/midi-qol/templates/dialog.hbs\"\n    }\n  };\n\n  static DEFAULT_OPTIONS = {\n    position: {\n      width: 400,\n      height: \"auto\" as \"auto\"\n    }\n  };\n\n  get title() {\n    let maxPad = 45;\n    if (this.data.timeout) {\n      if (this.data.timeout < maxPad) maxPad = this.data.timeout;\n      const padCount = Math.ceil(this.timeRemaining / (this.data.timeout ?? defaultTimeout) * maxPad);\n      const pad = \"-\".repeat(padCount);\n      return `${this.data.actor?.name} ${this.data.title ?? \"Dialog\"} ${pad} ${this.timeRemaining}`;\n    }\n    else return this.data.title ?? \"Dialog\";\n  }\n\n  async _onRender(context, options) {\n    await super._onRender(context, options);\n    for (const button of Array.from(this.element.querySelectorAll(\".dialog-button\"))) {\n      button.addEventListener(\"click\", this._onClickButton.bind(this));\n    }\n    // Michael note: I don't think this was doing anything?\n    // document.addEventListener(\"keydown.chooseDefault\", this._onKeyDown.bind(this));\n    // if ( this.data.render instanceof Function ) this.data.render(this.options.jQuery ? html : html[0]);\n  }\n\n  async _prepareContext(options) {\n    const context = await super._prepareContext(options);\n    this.data.buttons = this.data.activities.reduce((acc: {}, activity) => {\n      let name = `${activity.item.name}: ${activity.name ?? activity.actionName}`;\n      // @ts-expect-error no dnd5e-types\n      if (activity.item.system.linkedActivity) {\n        // @ts-expect-error no dnd5e-types\n        const linked = activity.item.system.linkedActivity;\n        name = `${linked.item.name}: ${linked.name ?? linked.actionName}`;\n      }\n      acc[foundry.utils.randomID()] = {\n        // icon: `<image src=${item.img} width=\"30\" height=\"30\">`,\n        label: `<div style=\"display: flex; align-items: center; margin: 5px;\"> <image src=${activity.item.img} width=\"40\" height=\"40\"> &nbsp ${name} </div>`,\n        value: activity.name ?? activity.actionName,\n        key: activity.uuid,\n        callback: this.data.callback,\n      }\n      return acc;\n    }, {})\n    return {\n      ...context,\n      content: this.data.content,\n      buttons: this.data.buttons,\n      timeRemaining: this.timeRemaining\n    }\n  }\n\n  set1Secondtimeout() {\n    this.timeoutId = setTimeout(() => {\n      this.timeRemaining -= 1;\n      let color = \"red\";\n      if (this.timeRemaining >= this.data.timeout * 0.75) color = \"chartreuse\";\n      else if (this.timeRemaining >= this.data.timeout * 0.50) color = \"yellow\";\n      else if (this.timeRemaining >= this.data.timeout * 0.25) color = \"orange\";\n      this._updateFrame({ window: { title: this.title } });\n      const title = this.element?.querySelector(\".window-title\");\n      if (title) title.setAttribute(\"style\", `color: ${color}`);\n      if (this.timeRemaining > 0 && title) this.set1Secondtimeout();\n    }, 1000)\n  }\n\n  _onClickButton(event: Event) {\n    // @ts-expect-error I know more than you, machine\n    const id = event.currentTarget!.dataset.button;\n    const button = this.data.buttons[id];\n    debug(\"Reaction dialog button clicked\", id, button, Date.now() - this.startTime)\n    this.submit(button);\n  }\n\n  // _onKeyDown(event) {\n  //   // Close dialog\n  //   if (event.key === \"Escape\" || event.key === \"Enter\") {\n  //     debug(\"Reaction Dialog onKeyDown esc/enter pressed\", event.key, Date.now() - this.startTime);\n  //     event.preventDefault();\n  //     event.stopPropagation();\n  //     this.data.completed = true;\n  //     if (this.data.close) this.data.close({ name: \"keydown\", uuid: undefined });\n  //     this.close();\n  //   }\n  // }\n\n  async submit(button) {\n    try {\n      clearTimeout(this.timeoutId);\n      debug(\"ReactionDialog submit\", Date.now() - this.startTime, button.callback)\n      if (button.callback) {\n        this.data.completed = true;\n        await button.callback(this, button)\n        this.close();\n      }\n    } catch (err: any) {\n      const message = `Reaction dialog submit`;\n      TroubleShooter.recordError(err, message);\n      ui.notifications?.error(err);\n      error(err);\n      this.data.completed = false;\n      this.close()\n    }\n  }\n\n  async close() {\n    clearTimeout(this.timeoutId);\n    debug(\"Reaction Dialog close \", Date.now() - this.startTime, this.data.completed)\n    if (!this.data.completed && this.data.close) {\n      this.data.close({ name: \"Close\", uuid: undefined });\n    }\n    $(document).off('keydown.chooseDefault');\n    return super.close();\n  }\n}\n\n/**\n * \n * @param actor the actor to check\n * @param itemRef the item to check. An item, an item uuid or an item name.\n * @returns the concentration effect if present and null otherwise\n */\nexport function getConcentrationEffect(actor?: Actor.Implementation | null, itemRef?: Item.Implementation | string): ActiveEffect.Implementation | undefined {\n  let item: Item.Implementation | undefined;\n  if (!actor) return;\n  if (typeof itemRef === \"string\") {\n    item = fromUuidSync(itemRef) as Item.Implementation | undefined;\n    // @ts-expect-error no dnd5e-types\n    if (!item) item = actor.concentration.items?.find(i => i.name === itemRef)\n  } else item = itemRef;\n  // concentration should not be a passive effect so don't need to do applied effects\n  if (!item?.id)\n    return actor?.effects.find(ef => ef.statuses.has(systemConcentrationId));\n  else {\n    return actor?.effects.find(ef => ef.statuses.has(systemConcentrationId)\n      && (ef.flags?.dnd5e?.item?.id === item.id)\n    );\n  }\n}\n\nasync function confirm(title: string = \"Are you sure\", { content, defaultYes } = { content: \"\", defaultYes: true }): Promise<any> {\n  return DialogV2.confirm({\n    window: { title: title ?? \"Confirm\" },\n    content,\n    defaultYes\n  });\n}\nfunction buildEvalSandbox(sandbox: AnyMutableObject, asyncEval: boolean): AnyMutableObject {\n  const extras: AnyMutableObject = {\n    Roll,\n    findNearby,\n    findNearbyCount,\n    checkNearby,\n    hasCondition,\n    checkDefeated,\n    checkIncapacitated,\n    canSee,\n    canSense,\n    computeDistance,\n    checkActivityRange,\n    checkDistance,\n    fromUuidSync,\n    nonWorkflowTargetedToken: game.user?.targets.first()?.document.uuid,\n    combat: game.combat,\n    evalRaceOrType: raceOrType,\n    evalTypeOrRace: typeOrRace,\n    evalTypeOrRaceEval: typeOrRace, // legacy alias - sync eval historically only exposed this name\n    sizeNumeric,\n    error: console.error,\n    warn: console.warn,\n    log: console.log\n  };\n  if (asyncEval) {\n    // promise-returning helpers only work where the expression can await them\n    extras.contestedRoll = contestedRoll;\n    extras.confirm = confirm;\n  }\n  return foundry.utils.mergeObject(sandbox, extras);\n}\n\nfunction mySafeEvalImpl(expression: string, sandbox: AnyMutableObject, onErrorReturn: any, asyncEval: boolean): any {\n  const label = asyncEval ? \"asyncMySafeEval\" : \"mySafeEval\";\n  const coerceNumeric = (result: any) => Number.isNumeric(result) ? Number(result) : result;\n  const handleError = (err: any) => {\n    // @ts-expect-error sandbox confuses\n    const message = `midi-qol | ${label} | activation condition (${expression}) error, actorUuid: ${sandbox.actorUuid} itemUuid: ${sandbox.item?.uuid} targetUuid: ${sandbox.targetUuid}`;\n    console.warn(message, err);\n    TroubleShooter.recordError(err, message);\n    return coerceNumeric(onErrorReturn);\n  };\n  try {\n    if (asyncEval) {\n      expression = expression.replace(/confirm\\((.*)\\)/g, \"await confirm($1)\");\n    } else if (expression.includes(\"Roll(\")) {\n      error(\"safeEval | Roll expressions are not supported\", expression)\n      expression = expression.replaceAll(/evaluate\\s*\\({\\s*async:\\s* false\\s*}\\)/g, \"evaluateSync({strict: false})\")\n      error(\"Expression replaced with \", expression);\n    }\n    const src = 'with (sandbox) { return ' + expression + '}';\n    // @ts-expect-error\n    const evl: (sandboxArg: any) => any = asyncEval ? foundry.utils.AsyncFunction(\"sandbox\", src) : new Function(\"sandbox\", src);\n    sandbox = buildEvalSandbox(sandbox, asyncEval);\n    const sandboxProxy = new Proxy(sandbox, {\n      has: () => true, // Include everything\n      get: (t, k) => k === Symbol.unscopables ? undefined : (t[k as string] ?? Math[k]),\n      set: () => { error(`midi-qol | ${label} | You may not set properties of the sandbox environment`); return false } // No-op\n    });\n    if (MidiQOL.logEvaluationData) console.log(`MidiQOL ${label}`, { expression, sandboxProxy });\n    const result = evl.call(null, sandboxProxy);\n    if (asyncEval) return Promise.resolve(result).then((r: any) => {\n      if (MidiQOL.logEvaluationData) console.log(`MidiQOL ${label}`, { result: r });\n      return coerceNumeric(r);\n    }, handleError);\n    if (MidiQOL.logEvaluationData) console.log(`MidiQOL ${label}`, { result });\n    return coerceNumeric(result);\n  } catch (err) {\n    return handleError(err);\n  }\n}\n\nasync function asyncMySafeEval(expression: string, sandbox: AnyMutableObject, onErrorReturn?: any): Promise<any> {\n  return mySafeEvalImpl(expression, sandbox, onErrorReturn, true);\n};\n\nfunction mySafeEval(expression: string, sandbox: AnyMutableObject, onErrorReturn?: any): any {\n  return mySafeEvalImpl(expression, sandbox, onErrorReturn, false);\n};\n\nexport async function evalReactionActivationCondition(workflow: Workflow, condition: string | undefined | boolean, target: TokenOrDocument, options: any = {}): Promise<boolean> {\n  if (options.errorReturn === undefined) options.errorReturn = false\n  // if (condition === undefined || condition === \"\" || condition === false) return false;\n  return evalActivationCondition(workflow, condition, target, options);\n}\nexport async function evalActivationCondition(workflow: Workflow | undefined, condition: string | undefined | boolean, target?: TokenOrDocument, options: any = {}): Promise<boolean> {\n  if (condition === undefined || condition === \"\" || condition === true) return true;\n  if (condition === false) return false;\n  const conditionData = createConditionData({ workflow, target, actor: workflow?.actor, extraData: options?.extraData, item: options.item });\n  options.errorReturn ??= true;\n  const returnValue = await evalCondition(condition, conditionData, options);\n  return returnValue;\n}\n\nexport function typeOrRace(entity: TokenOrDocument | Actor | string): string {\n  const actor = getActor(entity);\n  const systemData = actor?.system;\n  if (!systemData) return \"\";\n  // @ts-expect-error no dnd5e-types\n  if (systemData.details.type?.value) return systemData.details.type?.value?.toLocaleLowerCase() ?? \"\";\n  // cater to dnd5e 2.4+ where race can be a string or an Item\n  // @ts-expect-error no dnd5e-types\n  else return (systemData.details?.race?.name ?? systemData.details?.race)?.toLocaleLowerCase() ?? \"\";\n}\n\nexport function sizeNumeric(size: string): number | undefined {\n  const s = size?.toLowerCase();\n  if (!s) return undefined;\n  const actorSizes = GameSystemConfig.actorSizes;\n  // Direct key match (e.g. \"sm\", \"lg\", \"grg\")\n  if (actorSizes[s]?.numerical !== undefined) return actorSizes[s].numerical;\n  // Long form match (e.g. \"small\", \"gargantuan\") — compare against labels\n  for (const [, config] of Object.entries(actorSizes)) {\n    if (game.i18n!.localize(config.label).toLowerCase() === s) return config.numerical;\n  }\n  return undefined;\n}\n\nexport function raceOrType(entity: TokenOrDocument | Actor | string): string {\n  const actor = getActor(entity);\n  const systemData = actor?.system;\n  if (!systemData) return \"\";\n  // @ts-expect-error no dnd5e-types\n  if (systemData.details.race) return (systemData.details?.race?.name ?? systemData.details?.race)?.toLocaleLowerCase() ?? \"\";\n  // @ts-expect-error no dnd5e-types\n  return systemData.details.type?.value?.toLocaleLowerCase() ?? \"\";\n}\n\n/**\n * Collects damage types from damage rolls and updates `rollData` if provided,\n * otherwise returns the computed result.\n *\n * @param damageRolls.\n * @param rollData Optional object to which damageTypes and defaultDamageType will be assigned.\n * @returns Void if `rollData` is provided; otherwise an object containing `damageTypes` and `defaultDamageType`.\n */\nexport function collectDamageTypes(\n  damageRolls: {\n    options?: { type?: string };\n    parts?: string[];\n  }[] = [],\n  activity?: Activity,\n  rollData?: {\n    damageTypes?: { [key: string]: boolean };\n    defaultDamageType?: { [key: string]: boolean };\n    [key: string]: any;\n  }\n): void | { damageTypes: { [key: string]: boolean }, defaultDamageType?: { [key: string]: boolean } } {\n  if (damageRolls.length) return collectDamageRollsDamageTypes(damageRolls, rollData);\n  else if (activity) return collectActivityDamageTypes(activity, rollData);\n  else if (rollData) {\n    rollData.defaultDamageType ??= {};\n    rollData.damageTypes ??= {};\n    return;\n  }\n  return { damageTypes: {}, defaultDamageType: {} };\n}\n\nfunction collectDamageRollsDamageTypes(\n  damageRolls: {\n    options?: { type?: string };\n    parts?: string[];\n  }[] = [],\n  rollData?: {\n    damageTypes?: { [key: string]: boolean };\n    defaultDamageType?: { [key: string]: boolean };\n    [key: string]: any;\n  }\n): void | { damageTypes: { [key: string]: boolean }, defaultDamageType?: { [key: string]: boolean } } {\n  const existingTypes = rollData?.damageTypes ?? {};\n  const damageTypes: { [key: string]: boolean } = { ...existingTypes };\n  let defaultType: string | undefined = undefined;\n\n  for (const roll of damageRolls) {\n    const type = roll.options?.type;\n    if (type && !defaultType) defaultType = type;\n    if (type) damageTypes[type] = true;\n\n    for (const part of roll.parts ?? []) {\n      if (!part?.length) continue;\n      const match = [...part.matchAll(/\\[([^\\]]+)\\]/g)].map(m => m[1].trim().toLowerCase());\n      for (const partType of match) {\n        if (!defaultType) defaultType = partType;\n        damageTypes[partType] = true;\n      }\n    }\n  }\n\n  const defaultDamageType = defaultType ? { [defaultType]: true } : {};\n\n  if (rollData) {\n    rollData.damageTypes = damageTypes;\n    rollData.defaultDamageType ??= defaultDamageType;\n    return;\n  }\n  return { damageTypes, defaultDamageType };\n}\n\nfunction collectActivityDamageTypes(\n  activity: Activity,\n  rollData?: {\n    damageTypes?: { [key: string]: boolean };\n    defaultDamageType?: { [key: string]: boolean };\n    [key: string]: any;\n  }\n): void | { damageTypes: { [key: string]: boolean }, defaultDamageType?: { [key: string]: boolean } } {\n  if (!activity || ![\"attack\", \"damage\", \"heal\", \"save\"].includes(activity.type)) {\n    if (rollData) {\n      rollData.defaultDamageType ??= {};\n      rollData.damageTypes ??= {};\n      return;\n    }\n    return { defaultDamageType: {}, damageTypes: {} };\n  }\n  const returnDamageTypes = {};\n  let returnDefaultDamageType: { type?: boolean } | undefined = undefined;\n\n  const partTypes = (part: any) => {\n    if (part.types.size > 1) console.debug(\"MidiQOL collectActivityDamageTypes: Multiple damage types available for selection; cannot properly evaluate; damageTypes will grab the first of multiple ones\");\n\n    const type = part.types.first();\n    if (type) {\n      if (!returnDefaultDamageType) returnDefaultDamageType = { [type]: true };\n      returnDamageTypes[type] = true;\n    }\n    const formula = part.custom?.formula;\n    if (formula && formula !== \"\") {\n      const match = [...formula.matchAll(/\\[([^\\]]+)\\]/g)].map((m) => m[1].trim().toLowerCase());\n      for (const m of match) {\n        if (!returnDefaultDamageType) returnDefaultDamageType = { [m]: true };\n        returnDamageTypes[m] = true;\n      }\n    }\n  }\n\n  const activityType = activity.type === \"heal\" ? \"healing\" : \"damage\";\n  if (activityType === \"healing\") {\n    const part = activity[activityType];\n  } else {\n  }\n  if (rollData) {\n    rollData.damageTypes = returnDamageTypes;\n    rollData.defaultDamageType ??= returnDefaultDamageType;\n    return;\n  }\n  return { damageTypes: returnDamageTypes, defaultDamageType: returnDefaultDamageType ?? {} };\n\n}\n\nexport function createConditionData(data: {\n  workflow?: Workflow,\n  target?: TokenOrDocument | Actor | string,\n  actor?: Actor.Implementation | null,\n  item?: Item | string,\n  extraData?: any,\n  activity?: Activity,\n  tokenUuid?: string,\n  targetUuid?: string,\n  options?: any | undefined,\n  token?: TokenOrDocument, // pretty sure this never actually gets passed but eh\n  effect?: ActiveEffect.Implementation,\n}) {\n  const actor = data.workflow?.actor ?? data.actor;\n  let item: Item.Implementation | undefined;\n  if (data.item) {\n    if (data.item instanceof Item) item = data.item;\n    else if (typeof data.item === \"string\") item = fromUuidSync(data.item) as Item.Implementation | undefined;\n  }\n  if (!item) item = data.activity?.item ?? data.workflow?.activity?.item ?? data.workflow?.item;\n  let rollData: any = data.activity?.getRollData() ?? item?.getRollData() ?? actor?.getRollData() ?? {};\n  // Use options.damageRolls as fallback when workflow.damageRolls is empty (not yet populated during bonus processing)\n  const damageRolls = data.workflow?.damageRolls?.length ? data.workflow.damageRolls : data.options?.damageRolls;\n  collectDamageTypes(damageRolls, data.workflow?.activity, rollData);\n  rollData = foundry.utils.mergeObject(rollData, data.extraData ?? {});\n  rollData.isAttuned = rollData.item?.attuned || rollData.item?.attunement === \"\";\n  rollData.options = data?.options;\n  rollData.isConcentrationCheck = foundry.utils.getProperty(rollData, \"options.messageData.flags.midi-qol.isConcentrationCheck\");\n  rollData.isDeathSave = foundry.utils.getProperty(rollData, \"options.messageData.flags.dnd5e.roll.type\") === \"death\";\n  rollData.actor = {};\n  rollData.actor.raceOrType = actor ? raceOrType(actor) : \"\";\n  rollData.actor.typeOrRace = actor ? typeOrRace(actor) : \"\";\n  rollData.items = actor?.items?.map(i => i.getRollData().item) ?? [];\n  rollData.equippedItems = rollData.items.filter(i => i.equipped) ?? [];\n  rollData.worldTime = game.time?.worldTime;\n  try {\n    if (data.target) {\n      const theTarget = getToken(data.target);\n      if (theTarget) {\n        const theTargetActor = theTarget.actor as Actor;\n\n        rollData.target = {\n          get system() { return theTargetActor?.system },\n          ...theTargetActor?.getRollData()\n        };\n        rollData.targetUuid = data.targetUuid ?? theTarget.document.uuid\n        rollData.targetId = theTarget.id;\n        rollData.targetActorUuid = theTargetActor?.uuid;\n        rollData.targetActorId = theTargetActor?.id;\n        rollData.raceOrType = theTargetActor ? raceOrType(theTargetActor) : \"\";\n        rollData.typeOrRace = theTargetActor ? typeOrRace(theTargetActor) : \"\";\n        rollData.target.raceOrType = theTarget.actor ? raceOrType(theTargetActor) : \"\";\n        rollData.target.typeOrRace = theTarget.actor ? typeOrRace(theTargetActor) : \"\";\n        rollData.target.items = theTargetActor?.items?.map(i => i.getRollData().item) ?? [];\n        rollData.target.equippedItems = rollData.target.items.filter(i => i.equipped) ?? [];\n        rollData.target.saved = data.workflow?.saves.has(theTarget);\n        rollData.target.failedSave = data.workflow?.failedSaves.has(theTarget);\n        rollData.target.superSaver = data.workflow?.superSavers.has(theTarget);\n        rollData.target.semiSuperSaver = data.workflow?.semiSuperSavers.has(theTarget);\n        rollData.target.isHit = data.workflow?.hitTargets.has(theTarget);\n        rollData.target.isHitEC = data.workflow?.hitTargets.has(theTarget);\n        rollData.target.canSense = data.workflow?.token && data.workflow.targetsCanSense.has(data.workflow.token);\n        rollData.target.canSee = data.workflow?.token && data.workflow.targetsCanSee.has(data.workflow.token);\n        rollData.canSense = data.workflow?.tokenCanSense?.has(theTarget);\n        rollData.canSee = data.workflow?.tokenCanSee?.has(theTarget);\n        if (theTarget) rollData.target.isCombatTurn = game.combat?.combatant?.tokenId === theTarget.id;\n      }\n    }\n    rollData.humanoid = globalThis.MidiQOL.humanoid;\n    rollData.tokenUuid = data.workflow?.tokenUuid ?? data.tokenUuid;\n    rollData.tokenId = (data.token as (TokenOrDocument))?.id ?? data.workflow?.token?.id; // deprecated\n    if (data.workflow) {\n      rollData.w = data.workflow;\n      rollData.workflow = data.workflow;\n      rollData.activity = data.workflow.activity;\n      rollData.riderStatuses = {};\n      data.workflow.activity.applicableEffects?.forEach((effect) => {\n        Array.from(effect?.statuses).forEach((status) => (rollData.riderStatuses[status] = true));\n        effect.flags?.dnd5e?.riders?.statuses?.forEach((rider) => (rollData.riderStatuses[rider] = true));\n      });\n      rollData.otherDamageActivity = data.workflow?.otherActivity;\n      rollData.hasSave = data.workflow.hasSave;\n      rollData.item = data.workflow.item.getRollData().item;\n      rollData.shouldRollDamage = data.workflow.shouldRollDamage;\n      rollData.hasAttack = data.workflow.activity.attack;\n      rollData.hasDamage = data.workflow.activity.hasDamage;\n    }\n    if (!data.activity && data.workflow) data.activity = data.workflow.activity;\n    if (data.activity) {\n      rollData.activity = data.activity;\n      rollData.a = data.activity;\n    }\n    if (item) {\n      // define like this so it's only called if needed to avoid deprecation warnings\n      // @ts-expect-error no dnd5e-types\n      Object.defineProperty(rollData.item, \"actionType\", { get() { return item.system.actionType } });\n    }\n    if (data.effect) {\n      rollData.effect = data.effect;\n    }\n    if (game.combat) {\n      const combat = game.combat;\n      rollData.combatRound = combat.round;\n      rollData.combatTurn = combat.turn;\n      rollData.combatTime = combat.round + (combat.turn ?? 0) / 100;\n      rollData.actor.isCombatTurn = combat.combatant?.tokenId === data.workflow?.token?.id;\n      rollData.isCombatTurn = rollData.actor.isCombatTurn;\n    } else rollData.combatTime = 0;\n    rollData.CONFIG = CONFIG;\n    rollData.CONST = {};\n    let exclusions: string[] = [\"DOCUMENT_TYPES\"];\n    Object.keys(CONST).forEach(key => !exclusions.includes[key] && (rollData.CONST[key] = CONST[key]));\n    //Only here to avoid deprecation warnings - remove when we get to v14\n  } catch (err) {\n    const message = `midi-qol | createConditionData`;\n    TroubleShooter.recordError(err, message);\n    console.warn(message, err);\n  } finally {\n    if (data.workflow) data.workflow.conditionData = rollData;\n  }\n  return rollData;\n}\n\nexport async function evalAllConditionsAsync(\n  actorRef: TokenOrDocument | Actor | string | undefined | null,\n  flag: string,\n  conditionData: AnyObject,\n  errorReturn: any = false\n): Promise<any> {\n  if (!flag) return errorReturn;\n  let actor = getActor(actorRef);\n  if (!actor) return errorReturn;\n  const effects = actor.appliedEffects.filter(ef => ef.changes.some(change => change.key === flag));\n  let keyToUse = flag.replace(`flags.${MODULE_ID}.`, \"flags.midi.evaluated.\");\n  keyToUse = keyToUse.replace(\"flags.dnd5e.\", \"flags.midi.evaluated.dnd5e.\");\n  let returnValue = errorReturn;\n  foundry.utils.setProperty(actor, `${keyToUse}.value`, false);\n  foundry.utils.setProperty(actor, `${keyToUse}.effects`, [])\n  for (let effect of effects) {\n    for (let change of effect.changes) {\n      if (change.key === flag) {\n        const condValue = await evalCondition(change.value, conditionData, { errorReturn, async: true });\n        if (debugEnabled > 0) warn(\"evalAllConditions Async\", actor.name, flag, change.value, condValue, conditionData, errorReturn);\n        if (condValue) {\n          returnValue = condValue;\n          foundry.utils.setProperty(actor, `${keyToUse}.value`, condValue);\n          (foundry.utils.getProperty(actor, `${keyToUse}.effects`) as string[]).push(effect.name);\n        }\n      }\n    }\n  }\n  if (effects.length === 0 && foundry.utils.getProperty(actor, flag)) {\n    returnValue = await evalCondition(foundry.utils.getProperty(actor, flag) as string, conditionData, { errorReturn, async: true });\n    if (returnValue) {\n      foundry.utils.setProperty(actor, `${keyToUse}.value`, returnValue);\n      (foundry.utils.getProperty(actor, `${keyToUse}.effects`) as string[]).push(\"flag\");\n    }\n  }\n  return returnValue;\n}\n\nexport function evalAllConditions(\n  actorRef: TokenOrDocument | Actor | string,\n  flag: string,\n  conditionData: any,\n  errorReturn: any = false\n): any {\n  if (!flag) return errorReturn;\n  let actor = getActor(actorRef);\n  if (!actor) return errorReturn;\n  const effects = actor.appliedEffects.filter(ef => ef.changes.some(change => change.key === flag));\n  let keyToUse = flag.replace(`flags.${MODULE_ID}.`, \"flags.midi.evaluated.\");\n  keyToUse = keyToUse.replace(\"flags.dnd5e.\", \"flags.midi.evaluated.dnd5e.\");\n  let returnValue = errorReturn;\n  foundry.utils.setProperty(actor, `${keyToUse}.value`, false);\n  foundry.utils.setProperty(actor, `${keyToUse}.effects`, [])\n  for (let effect of effects) {\n    for (let change of effect.changes) {\n      if (change.key === flag) {\n        const condValue = evalCondition(change.value, conditionData, { errorReturn, async: false });\n        if (debugEnabled > 0) warn(\"evalAllConditions \", actor.name, flag, change.value, condValue, conditionData, errorReturn);\n        if (condValue) {\n          returnValue = condValue;\n          foundry.utils.setProperty(actor, `${keyToUse}.value`, condValue);\n          (foundry.utils.getProperty(actor, `${keyToUse}.effects`) as string[]).push(effect.name);\n        }\n      }\n    }\n  }\n  if (effects.length === 0 && foundry.utils.getProperty(actor, flag)) {\n    returnValue = evalCondition(foundry.utils.getProperty(actor, flag) as string, conditionData, { errorReturn, async: false })\n    if (returnValue) {\n      foundry.utils.setProperty(actor, `${keyToUse}.value`, returnValue);\n      (foundry.utils.getProperty(actor, `${keyToUse}.effects`) as string[]).push(\"flag\");\n    }\n  }\n  return returnValue;\n}\n\n/**\n * Check magic resistance and vulnerability for an actor\n * @param actor The actor to check\n * @param rollAbility The ability being used for the save (optional, for ability-specific flags)\n * @param conditionData Condition data for flag evaluation (optional, will be created if not provided)\n * @returns Object with advantage, disadvantage, magicResistance, and magicVulnerability flags\n */\nexport async function checkMagicResistanceAndVulnerability(\n  actor: Actor.Implementation | undefined | null,\n  rollAbility?: string | null,\n  conditionData?: ReturnType<typeof createConditionData>\n): Promise<{\n  advantage: boolean | undefined;\n  disadvantage: boolean | undefined;\n  magicResistance: boolean;\n  magicVulnerability: boolean;\n}> {\n  if (!actor) {\n    return { advantage: undefined, disadvantage: undefined, magicResistance: false, magicVulnerability: false };\n  }\n\n  // Create condition data if not provided\n  const effectiveConditionData = conditionData ?? createConditionData({ actor, workflow: undefined, target: actor });\n\n  let advantage: boolean | undefined = undefined;\n  let disadvantage: boolean | undefined = undefined;\n  let magicResistance = false;\n  let magicVulnerability = false;\n\n  const mrCustom = (i18n(\"midi-qol.MagicResistant\") ?? \"Magic Resistant\").trim();\n  const mvCustom = (i18n(\"midi-qol.MagicVulnerable\") ?? \"Magic Vulnerable\").trim();\n\n  // Check magic resistance in custom damage reduction traits\n  //@ts-expect-error no dnd5e-types\n  if ((actor.system?.traits?.dr?.custom || \"\").includes(mrCustom)) {\n    advantage = true;\n  }\n\n  // Check magic resistance as a feature (based on the SRD name as provided by the DnD5e system)\n  // @ts-expect-error no dnd5e-types\n  if (actor.items?.find(a => a.type === \"feat\" && a.name === i18n(\"midi-qol.MagicResistanceFeat\")?.trim())) {\n    advantage = true;\n  }\n\n  // Check magic vulnerability in custom damage vulnerability traits\n  //@ts-expect-error no dnd5e-types\n  if ((actor.system?.traits?.dv?.custom || \"\").includes(mvCustom)) {\n    disadvantage = true;\n  }\n\n  // Check magic resistance flags\n  if (await evalAllConditionsAsync(actor, midiFlag(`magicResistance.all`), effectiveConditionData)\n    || (rollAbility && await evalAllConditionsAsync(actor, midiFlag(`magicResistance.${rollAbility}`), effectiveConditionData))) {\n    advantage = true;\n    magicResistance = true;\n  }\n\n  // Check magic vulnerability flags\n  if (await evalAllConditionsAsync(actor, midiFlag(`magicVulnerability.all`), effectiveConditionData)\n    || (rollAbility && await evalAllConditionsAsync(actor, midiFlag(`magicVulnerability.${rollAbility}`), effectiveConditionData))) {\n    disadvantage = true;\n    magicVulnerability = true;\n  }\n\n  if (!advantage) advantage = undefined;\n  if (!disadvantage) disadvantage = undefined;\n\n  if (debugEnabled > 1) debug(`${actor.name} resistant to magic : ${advantage}`);\n  if (debugEnabled > 1) debug(`${actor.name} vulnerable to magic : ${disadvantage}`);\n\n  return { advantage, disadvantage, magicResistance, magicVulnerability };\n}\n\nexport function evalCondition(condition: string | number | boolean | undefined, conditionData: any, options: any = { errorReturn: false, async: false }): any | Promise<any> {\n  if (typeof condition === \"number\" || typeof condition === \"boolean\") return condition;\n  if (condition === undefined || condition === \"\" || typeof condition !== \"string\") return options?.errorReturn;\n  let returnValue;\n  try {\n    if (condition.includes(\"@\")) {\n      condition = Roll.replaceFormulaData(condition, conditionData, { missing: \"0\" });\n    }\n\n    if (options?.async) returnValue = asyncMySafeEval(condition, conditionData, options?.errorReturn);\n    else returnValue = mySafeEval(condition, conditionData, options?.errorReturn ?? false);\n    if (debugEnabled > 0) warn(\"evalCondition \", returnValue, condition, conditionData);\n\n  } catch (err) {\n    returnValue = options?.errorReturn ?? false;\n    const message = `midi-qol | evalCondition | activation condition (${condition}) error, actorUuid: ${conditionData.actorUuid} itemUuid: ${conditionData.item?.uuid} targetUuid: ${conditionData.targetUuid}`;\n    TroubleShooter.recordError(err, message);\n    console.warn(message, err, conditionData);\n  }\n  return returnValue;\n}\n\nexport function computeTemplateShapeDistance(templateDocument: MeasuredTemplateDocument) {\n  let { x, y, direction, distance } = templateDocument;\n  // let { direction, distance, angle, width } = templateDocument;\n  if (!canvas || !canvas.scene) return { shape: undefined, distance: 0 };\n  distance ??= 0;\n  distance *= canvas.dimensions?.distancePixels ?? 1;\n  direction = Math.toRadians(direction);\n  if (!templateDocument.object) {\n    throw new Error(\"Template document has no object\");\n  }\n  //@ts-expect-error doesn't like `object.ray`\n  templateDocument.object.ray = foundry.canvas.geometry.Ray.fromAngle(x, y, direction, distance);\n\n  let shape: any;\n  // @ts-expect-error protected\n  templateDocument.object.shape = templateDocument.object._computeShape();\n  return { shape: templateDocument.object.shape, distance: templateDocument.distance };\n}\n\nlet _enableNotifications = true;\n\nexport function notificationNotify(wrapped, ...args) {\n  if (_enableNotifications) return wrapped(...args);\n}\nexport function enableNotifications(enable: boolean) {\n  _enableNotifications = enable;\n}\n\nexport function getStatusName(statusId: string | undefined): string {\n  if (!statusId) return \"undefined\";\n  const se = CONFIG.statusEffects.find(efData => efData.id === statusId);\n  return i18n(se?.name ?? statusId) ?? `${statusId}`;\n}\n\nexport function getWoundedStatus() {\n  let condition = CONFIG.statusEffects.find(efData => efData.id === configSettings.midiWoundedCondition);\n  if (condition || !ceInterface) return condition;\n  return ceInterface.findEffect({ effectId: configSettings.midiWoundedCondition?.replace(\"zce-\", \"ce-\") });\n}\n\nexport function getUnconsciousStatus() {\n  let condition = CONFIG.statusEffects.find(efData => efData.id === configSettings.midiUnconsciousCondition);\n  if (condition || !ceInterface) return condition;\n  return ceInterface.findEffect({ effectId: configSettings.midiUnconsciousCondition?.replace(\"zce-\", \"ce-\") });\n}\n\nexport function getDeadStatus() {\n  let condition = CONFIG.statusEffects.find(efData => efData.id === configSettings.midiDeadCondition);\n  if (condition || !ceInterface) return condition;\n  return ceInterface.findEffect({ effectId: configSettings.midiDeadCondition?.replace(\"zce-\", \"ce-\") });\n}\n\nexport function getVitalityDeadStatus() {\n  const conditionId = configSettings.optionalRules.vitalityDeadCondition || \"dead\";\n  let condition = CONFIG.statusEffects.find(efData => efData.id === conditionId);\n  if (condition || !ceInterface) return condition;\n  return ceInterface.findEffect({ effectId: conditionId?.replace(\"zce-\", \"ce-\") });\n}\n\nexport function ConvenientEffectsHasEffect(effectName: string, actor: Actor.Implementation, ignoreInactive: boolean = true) {\n  if (ignoreInactive) {\n    return CEHasEffectApplied({ effectName, uuid: actor.uuid })\n  } else {\n    const effect = actor.appliedEffects.find(ef => ef.name === effectName);\n    if (!effect) return false;\n    return !!isConvenientEffect(effect);\n  }\n}\n\nexport function isInCombat(actor: Actor.Implementation) {\n  const actorUuid = actor.uuid;\n  let combats: Combat[] | undefined;\n  if (actorUuid.startsWith(\"Scene\")) { // actor is a token synthetic actor\n    const tokenId = actorUuid.split(\".\")[3]\n    combats = game.combats?.combats.filter(combat =>\n      combat.combatants.filter(combatant => combatant?.tokenId === tokenId).length !== 0\n    );\n  } else { // actor is not a synthetic actor so can use actor Uuid \n    const actorId = actor.id;\n    combats = game.combats?.combats.filter(combat =>\n      combat.combatants.filter(combatant => combatant?.actorId === actorId).length !== 0\n    );\n  }\n  return (combats?.length ?? 0) > 0;\n}\n\nexport async function setActionUsed(actor: Actor.Implementation) {\n  await actor.setFlag(MODULE_ID, \"actions\", { action: true });\n}\n\nexport async function setReactionUsed(actor: Actor.Implementation, active: boolean = true) {\n  if (!getReactionEffect()) return;\n  const id = \"reaction\";\n  if (!active) {\n    await actor.effects.get(getStaticID(id))?.delete();\n  } else {\n    if (![\"all\", \"displayOnly\"].includes(configSettings.enforceReactions) && configSettings.enforceReactions !== actor.type) return;\n    const actions = actor.getFlag(MODULE_ID, \"actions\");\n    const newCount = (actions?.reactionsUsed ?? 0) + 1;\n    await actor.effects.get(getStaticID(id))?.delete();\n    const effect = foundry.utils.deepClone(getReactionEffect());\n    const allReactionsUsed = newCount >= (actor.getFlag(MODULE_ID, \"actions\")?.reactionsMax ?? 1);\n    if (!effect) return;\n    effect.updateSource({\n      origin: actor.uuid,\n      changes: [\n        { key: 'flags.midi-qol.actions.reaction', mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE, value: String(allReactionsUsed) },\n        { key: 'flags.midi-qol.actions.reactionsUsed', mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE, value: String(newCount) },\n        { key: 'flags.midi-qol.actions.reactionCombatRound', mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE, value: String(game.combat?.round ?? false) }\n      ]\n    });\n    if (actions?.reactionsReset === \"eachTurn\") {\n      effect.updateSource({ duration: { turns: 1 } })\n    }\n    if (actions?.reactionsReset === \"rest\") {\n      effect.updateSource({ flags: { dae: { specialDuration: [\"shortRest\"] } } });\n    }\n    if (actions?.reactionsReset === \"never\") {\n      effect.updateSource({ flags: { dae: { specialDuration: [] } } });\n    }\n    if (await asyncHooksCall(\"midi-qol.preSetReactionUsed\", actor, effect) === false) return;\n    await ActiveEffect.implementation.create(effect.toObject(), { parent: actor, keepId: true });\n    await asyncHooksCallAll(\"midi-qol.setReactionUsed\", actor, effect);\n  }\n}\n\nexport async function setBonusActionUsed(actor: Actor.Implementation) {\n  if (debugEnabled > 0) warn(\"setBonusActionUsed | starting\");\n  if (![\"all\", \"displayOnly\"].includes(configSettings.enforceBonusActions) && configSettings.enforceBonusActions !== actor.type) return;\n  const id = \"bonusaction\";\n  const actions = (actor.getFlag(MODULE_ID, \"actions\"));\n  const newCount = (actions?.bonusActionsUsed ?? 0) + 1;\n  const bonusActionsMax = actions?.bonusActionsMax ?? 1;\n  const allBonusActionsUsed = newCount >= bonusActionsMax;\n  await actor.effects.get(getStaticID(id))?.delete();\n  const effect = foundry.utils.deepClone(getBonusActionEffect());\n  if (!effect) return;\n  effect.updateSource({\n    origin: actor.uuid,\n    changes: [\n      { key: 'flags.midi-qol.actions.bonus', mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE, value: String(allBonusActionsUsed) },\n      { key: 'flags.midi-qol.actions.bonusActionsUsed', mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE, value: String(newCount) },\n      { key: 'flags.midi-qol.actions.bonusActionCombatRound', mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE, value: String(game.combat?.round ?? false) }\n    ]\n  });\n  if (actions?.bonusActionsReset === \"eachTurn\") {\n    effect.updateSource({ duration: { turns: 1 } })\n  }\n  if (actions?.bonusActionsReset === \"rest\") {\n    effect.updateSource({ flags: { dae: { specialDuration: [\"shortRest\"] } } });\n  }\n  if (actions?.bonusActionsReset === \"never\") {\n    effect.updateSource({ flags: { dae: { specialDuration: [] } } });\n  }\n  effect.origin = actor.uuid;\n\n  if (await asyncHooksCall(\"midi-qol.preSetBonusActionUsed\", actor, effect) === false) return;\n  await ActiveEffect.implementation.create(effect as any, { parent: actor, keepId: true });\n  await asyncHooksCallAll(\"midi-qol.setBonusActionUsed\", actor, effect);\n}\n\nexport async function removeActionUsed(actor: Actor.Implementation) {\n  if (game.user?.isGM || actor.isOwner) return await actor?.setFlag(MODULE_ID, \"actions\", { action: false });\n  else return await unTimedExecuteAsGM(\"_gmSetFlag\", { base: MODULE_ID, key: \"actions.action\", value: false, actorUuid: actor.uuid })\n}\n\nexport async function removeReactionUsed(actor: Actor.Implementation, force = false) {\n  if (debugEnabled > 0) warn(\"removeReactionUsed | starting\", actor);\n  if (force || !installedModules.get(\"times-up\")) { // if times-up installed the special duration will expire the effect\n    await actor.effects.get(getStaticID(\"reaction\"))?.delete(); // reaction always non-transfer\n  }\n  // safety net unset of flags - just in case.\n  // @ts-expect-error types doesn't recognize `-=validKey` as a valid key\n  if (actor.flags?.[MODULE_ID]?.actions?.reaction) await actor.update({ flags: { [MODULE_ID]: { actions: { reactionUsed: 0, \"-=reactionCombatRound\": null } } } });\n}\n\nexport function hasUsedAction(actor: Actor.Implementation) {\n  return actor?.getFlag(MODULE_ID, \"actions\")?.action;\n}\n\nexport function hasUsedReaction(actor: Actor.Implementation) {\n  return (actor.getFlag(MODULE_ID, \"actions\")?.reactionsUsed ?? 0) >= (actor.getFlag(MODULE_ID, \"actions\")?.reactionsMax ?? 1);\n}\n\nexport function hasUsedAnyReaction(actor: Actor.Implementation) {\n  return (actor.getFlag(MODULE_ID, \"actions\")?.reactionsUsed ?? 0) > 0;\n}\n\nexport function reactionsRemaining(actor: Actor.Implementation) {\n  const used = actor.getFlag(MODULE_ID, \"actions\")?.reactionsUsed ?? 0;\n  const max = actor.getFlag(MODULE_ID, \"actions\")?.reactionsMax ?? 1;\n  return Math.max(0, max - used);\n}\n\nexport async function expirePerTurnBonusActions(\n  combat: Combat.Implementation,\n  data: { round: number; turn: number | null },\n  options: { advanceTime: number; direction: number }\n) {\n  const optionalFlagRe = /flags.midi-qol.optional.[^.]+.(count|countAlt)$/;\n  for (let combatant of (combat.turns ?? [])) { // monks combat details does not pass the combat as it should so put in a guard\n    const actor = combatant.actor;\n    if (!actor) continue;\n    const actorAllApplicableEffects = actor.allApplicableEffects();\n    for (let effect of actorAllApplicableEffects) {\n      for (let change of effect.changes) {\n        if (change.key.match(optionalFlagRe)\n          && ((change.value === \"each-turn\")\n            || (change.value === \"each-round\" && data.round !== combat.round))\n          || (change.value === \"turn\" && (data.turn !== null) && combat?.turns[data.turn ?? combat.turn].actor === actor)) {\n          const usedKey = change.key.replace(/.(count|countAlt)$/, \".used\")\n          const isUsed = foundry.utils.getProperty(actor, usedKey);\n          if (isUsed) {\n            const key = usedKey.replace(`flags.${MODULE_ID}.`, \"\");\n            //TODO turn this into actor updates instead of each flag\n            await unTimedExecuteAsGM(\"_gmUnsetFlag\", { actorUuid: actor.uuid, base: MODULE_ID, key });\n          }\n        }\n      }\n    }\n  }\n}\n\nexport function hasUsedBonusAction(actor: Actor.Implementation) {\n  const currentUsed = actor.getFlag(MODULE_ID, \"actions\")?.bonusActionsUsed ?? 0;\n  const max = actor.getFlag(MODULE_ID, \"actions\")?.bonusActionsMax ?? 1;\n  return currentUsed >= max;\n}\nexport function hasUsedAnyBonusAction(actor: Actor.Implementation) {\n  return (actor.getFlag(MODULE_ID, \"actions\")?.bonusActionsUsed ?? 0) > 0;\n}\nexport async function removeBonusActionUsed(actor: Actor, force = false) {\n  if (force || !installedModules.get(\"times-up\")) { // bonus action will be expired by times-up if installed\n    await actor.effects.get(getStaticID(\"bonusaction\"))?.delete()\n  }\n  // Safety net flag reset just in case\n  // @ts-expect-error\n  if (force) await actor.update({ flags: { [MODULE_ID]: { actions: { bonusActionsUsed: 0, bonus: false, \"-=bonusActionCombatRound\": null } } } });\n}\n\n\nexport function needsReactionCheck(actor: Actor.Implementation) {\n  return (configSettings.enforceReactions === \"all\" || configSettings.enforceReactions === actor.type)\n}\n\nexport function needsAOOCheck(actor: Actor.Implementation) {\n  return (configSettings.recordAOO === \"all\" || configSettings.recordAOO === actor.type)\n}\n\nexport function needsBonusActionCheck(actor: Actor.Implementation) {\n  return (configSettings.enforceBonusActions === \"all\" || configSettings.enforceBonusActions === actor.type)\n}\n\nexport async function asyncHooksCallAll(hook: string, ...args): Promise<boolean | undefined> {\n  if (CONFIG.debug.hooks) {\n    console.log(`DEBUG | midi-qol async Calling ${hook} hook with args:`);\n    console.log(args);\n  }\n  // console.warn(`DEBUG | midi-qol async Calling ${hook} hook with args:`, ...args);\n  const hookEvents = Hooks.events[hook];\n  if (debugEnabled > 1) debug(\"asyncHooksCall\", hook, \"hookEvents:\", hookEvents, args)\n  if (!hookEvents) return undefined;\n  if (debugEnabled > 0) {\n    warn(`asyncHooksCall calling ${hook}`, hookEvents, args)\n  }\n  for (let entry of Array.from(hookEvents)) {\n    //TODO see if this might be better as a Promises.all - disadvantage is that order is not guaranteed.\n    // NOTE (Michael): That feels fine. Order's never _really_ guaranteed, and `CallAll` should be calling all anyway\n    try {\n      if (debugEnabled > 1) {\n        log(`asyncHooksCall for Hook ${hook} calling`, entry, args)\n      }\n      await hookCall(entry, args);\n    } catch (err) {\n      const message = `hooked function for hook ${hook}`;\n      error(message, err);\n      TroubleShooter.recordError(err, message);\n    }\n  }\n  return true;\n}\n\n/**\n * Call a cancellable midi hook with all standard variants:\n * base, .item.uuid, .activity.uuid, and premades equivalents.\n * Returns false if any hook returns false (short-circuits).\n */\nexport async function callActivityHooks(activity: { uuid: string; item: { uuid: string } }, hookName: string, ...args): Promise<boolean> {\n  if (await asyncHooksCall(hookName, ...args) === false) return false;\n  if (await asyncHooksCall(`${hookName}.${activity.item.uuid}`, ...args) === false) return false;\n  if (await asyncHooksCall(`${hookName}.${activity.uuid}`, ...args) === false) return false;\n  const premadesHook = hookName.replace(\"midi-qol.\", \"midi-qol.premades.\");\n  if (await asyncHooksCall(premadesHook, ...args) === false) return false;\n  if (await asyncHooksCall(`${premadesHook}.${activity.item.uuid}`, ...args) === false) return false;\n  if (await asyncHooksCall(`${premadesHook}.${activity.uuid}`, ...args) === false) return false;\n  return true;\n}\n\nexport async function asyncHooksCall(hook: string, ...args): Promise<boolean | undefined> {\n  if (CONFIG.debug.hooks) {\n    console.log(`DEBUG | midi-qol async Calling ${hook} hook with args:`);\n    console.log(args);\n  }\n  // console.warn(`DEBUG | midi-qol async Calling ${hook} hook with args:`, ...args);\n\n  const hookEvents = Hooks.events[hook];\n  if (debugEnabled > 1) log(\"asyncHooksCall\", hook, \"hookEvents:\", hookEvents, args)\n  if (!hookEvents) return undefined;\n  if (debugEnabled > 0) {\n    warn(`asyncHooksCall calling ${hook}`, args, hookEvents)\n  }\n  for (let entry of Array.from(hookEvents)) {\n    let callAdditional: boolean | undefined;\n    try {\n      if (debugEnabled > 1) {\n        log(`asyncHooksCall for Hook ${hook} calling`, entry, args)\n      }\n      callAdditional = await hookCall(entry, args) as boolean;\n    } catch (err) {\n      const message = `midi-qol | hooked function for hook ${hook} error`;\n      error(message, err, entry);\n      TroubleShooter.recordError(err, message);\n      callAdditional = true;\n    }\n    if (callAdditional === false) return false;\n  }\n  return true;\n}\nfunction hookCall(entry: Hooks.HookedFunction, args: any[]) {\n  const { hook, id, fn, once } = entry;\n\n  // @ts-expect-error can't know this is valid\n  if (once) Hooks.off(hook, id);\n  try {\n    // @ts-expect-error\n    return entry.fn(...args);\n  } catch (err: any) {\n    const message = `Error thrown in hooked function '${fn?.name}' for hook '${hook}'`;\n    TroubleShooter.recordError(err, message);\n    error(`midi | ${message}`);\n    if (hook !== \"error\") Hooks.onError(\"Hooks.#call\", err, { message, hook, fn, log: \"error\" });\n  }\n}\n\n/**\n * Localization map for attribution types\n */\nconst attributionTypeLocalization: Record<string, string> = {\n  \"ADV\": \"midi-qol.AttribADV\",\n  \"DIS\": \"midi-qol.AttribDIS\",\n  \"NOADV\": \"midi-qol.AttribNOADV\",\n  \"NODIS\": \"midi-qol.AttribNODIS\",\n  \"CRIT\": \"midi-qol.AttribCRIT\",\n  \"NOCRIT\": \"midi-qol.AttribNOCRIT\",\n  \"FUMBLE\": \"midi-qol.AttribFUMBLE\",\n  \"NOFUMBLE\": \"midi-qol.AttribNOFUMBLE\",\n  \"SUCCESS\": \"midi-qol.AttribSUCCESS\",\n  \"FAIL\": \"midi-qol.AttribFAIL\",\n  \"MIN\": \"midi-qol.AttribMIN\",\n  \"MAX\": \"midi-qol.AttribMAX\"\n};\n\n/**\n * Convert an AttributionMap to an array of AttributionEntry for display.\n * @param map - The attribution map (type -> source -> displayName)\n * @returns Array of AttributionEntry objects\n */\nexport function attributionMapToArray(map: AttributionMap): AttributionEntry[] {\n  const entries: AttributionEntry[] = [];\n  for (const [type, sources] of Object.entries(map)) {\n    if (sources) {\n      for (const [source, displayName] of Object.entries(sources)) {\n        entries.push({ type: type as AttributionType, source, displayName });\n      }\n    }\n  }\n  return entries;\n}\n\n/**\n * Add structured attribution to a roll for tooltip display.\n * @param roll - The roll to add attribution to\n * @param attributions - AttributionMap (type -> source -> displayName)\n */\nexport function addAttribution(roll: Roll, attributions: AttributionMap) {\n  if (attributions && Object.keys(attributions).length > 0) {\n    // Convert map to array and store on roll options for tooltip rendering\n    const entries = attributionMapToArray(attributions);\n    foundry.utils.setProperty(roll, \"options.attributions\", entries);\n  }\n}\n\n/**\n * Get localized title for a resolved d20 advantage mode.\n * @param mode - Resolved roll advantage mode (`-1` DIS, `0` NORMAL, `1` ADV)\n * @returns Localized title string\n */\nexport function getAdvantageModeTitle(mode: number | null | undefined): string {\n  // @ts-expect-error CONFIG.Dice.D20Roll not typed\n  const ADV_MODE: { DISADVANTAGE: number, NORMAL: number, ADVANTAGE: number } = CONFIG.Dice.D20Roll.ADV_MODE;\n  if (mode === ADV_MODE.ADVANTAGE) return i18n(\"DND5E.Advantage\");\n  if (mode === ADV_MODE.DISADVANTAGE) return i18n(\"DND5E.Disadvantage\");\n  return i18n(\"DND5E.Normal\");\n}\n\n/**\n * Render an attribution tooltip HTML from an AttributionMap.\n * @param attributions - The attribution map (type -> source -> displayName)\n * @param title - Optional title for the tooltip (e.g., \"Advantage\" or \"Disadvantage\")\n * @returns Promise resolving to the rendered HTML string\n */\nexport async function renderAttributionTooltip(attributions: AttributionMap, title?: string): Promise<string> {\n  const entries = attributionMapToArray(attributions);\n\n  const localizedEntries = entries.map(attr => ({\n    ...attr,\n    localizedType: i18n(attributionTypeLocalization[attr.type] ?? attr.type)\n  }));\n\n  // Always render the tooltip, even if empty (will show title or \"Normal\" state)\n  return foundry.applications.handlebars.renderTemplate(\n    \"modules/midi-qol/templates/attribution-tooltip.html\",\n    { attributions: localizedEntries, title }\n  );\n}\n\n/**\n * Legacy function for backwards compatibility.\n * Converts Set-based attribution to structured format and adds to roll.\n * @deprecated Use addAttribution with AttributionEntry[] instead\n */\nexport function addAdvAttribution(roll: Roll, advAttribution: Set<string>) {\n  // <section class=\"tooltip-part\">\n  let advHtml: string = \"\";\n  if (advAttribution && advAttribution.size > 0) {\n    // Localize the attribution prefixes\n    const prefixMap: Record<string, string> = {\n      \"ADV:\": `${i18n(\"midi-qol.AttribADV\")}:`,\n      \"DIS:\": `${i18n(\"midi-qol.AttribDIS\")}:`,\n      \"CRIT:\": `${i18n(\"midi-qol.AttribCRIT\")}:`,\n      \"NOCRIT:\": `${i18n(\"midi-qol.AttribNOCRIT\")}:`,\n      \"FUMBLE:\": `${i18n(\"midi-qol.AttribFUMBLE\")}:`,\n      \"NOFUMBLE:\": `${i18n(\"midi-qol.AttribNOFUMBLE\")}:`\n    };\n    advHtml = Array.from(advAttribution).reduce((prev, s) => {\n      let localized = s;\n      for (const [prefix, localizedPrefix] of Object.entries(prefixMap)) {\n        if (s.startsWith(prefix)) {\n          localized = localizedPrefix + s.slice(prefix.length);\n          break;\n        }\n      }\n      return prev + `${localized}<br>`;\n    }, \"\");\n    foundry.utils.setProperty(roll, \"options.advTooltip\", advHtml);\n  }\n}\n\nfunction getTooltip(roll: Roll, options: any = {}) {\n  const parts = roll.dice?.map(d => d.getTooltipData()) ?? [];\n\n  // Prepare structured attributions with localized type names\n  // @ts-expect-error options.attributions\n  const rawAttributions: AttributionEntry[] = roll.options?.attributions ?? [];\n  const attributions = rawAttributions.map(attr => ({\n    ...attr,\n    localizedType: i18n(attributionTypeLocalization[attr.type] ?? attr.type)\n  }));\n\n  const templateData = {\n    // @ts-expect-error\n    advTooltip: roll.options?.advTooltip,\n    attributions,\n    tooltipFormula: options?.tooltipFormula ?? false,\n    formula: roll.formula,\n    parts\n  };\n  return foundry.applications.handlebars.renderTemplate(\"modules/midi-qol/templates/tooltip.html\", templateData);\n}\n\nexport async function midiRenderRoll(roll: Roll) {\n  return roll.render();\n}\nexport async function midiRenderAttackRoll(roll: Roll, options?: any) {\n  options = foundry.utils.mergeObject(options ?? {}, { tooltipFormula: [\"formula\", \"formulaadv\"].includes(configSettings.rollAlternate) });\n  return midiRenderTemplateRoll(roll, \"modules/midi-qol/templates/attack-roll.html\", options)\n}\n\nexport async function midiRenderDamageRoll(roll: Roll, options?: any) {\n  options = foundry.utils.mergeObject(options ?? {}, { tooltipFormula: [\"formula\", \"formulaadv\"].includes(configSettings.rollAlternate) });\n  let html = midiRenderTemplateRoll(roll, \"modules/midi-qol/templates/damage-roll.html\", options)\n  return html;\n}\n\nexport function midiRenderOtherDamageRoll(roll: Roll, options?: any) {\n  options = foundry.utils.mergeObject(options ?? {}, { tooltipFormula: [\"formula\", \"formulaadv\"].includes(configSettings.rollAlternate) });\n  let html = midiRenderTemplateRoll(roll, \"modules/midi-qol/templates/other-damage-roll.html\", options);\n  return html;\n}\nexport function midiRenderBonusDamageRoll(roll: Roll, options?: any) {\n  options = foundry.utils.mergeObject(options ?? {}, { tooltipFormula: [\"formula\", \"formulaadv\"].includes(configSettings.rollAlternate) });\n  let html = midiRenderTemplateRoll(roll, \"modules/midi-qol/templates/bonus-damage-roll.html\", options);\n  return html;\n}\n\nexport function midiRenderFormulaRoll(roll: Roll, options?: any) {\n  options = foundry.utils.mergeObject(options ?? {}, { tooltipFormula: [\"formula\", \"formulaadv\"].includes(configSettings.rollAlternate) });\n  return midiRenderTemplateRoll(roll, \"modules/midi-qol/templates/roll.html\", options);\n}\n\nexport async function midiRenderTemplateRoll(roll: Roll | undefined, template: string, options?: any) {\n  if (!roll) return \"\";\n  const advantageMode = roll.options?.advantageMode;\n  let advantageModeStr: string | undefined;\n  if (advantageMode === 1) advantageModeStr = \"advantage\";\n  else if (advantageMode === -1) advantageModeStr = \"disadvantage\";\n\n  // Generate attribution tooltip content if there are attributions\n  let attributionTooltip = \"\";\n  // @ts-expect-error options.attributions\n  const rawAttributions: AttributionEntry[] = roll.options?.attributions ?? [];\n  if (rawAttributions.length > 0) {\n    const attributions = rawAttributions.map(attr => ({\n      ...attr,\n      localizedType: i18n(attributionTypeLocalization[attr.type] ?? attr.type)\n    }));\n    const title = advantageModeStr === \"advantage\" ? i18n(\"DND5E.Advantage\") :\n                  advantageModeStr === \"disadvantage\" ? i18n(\"DND5E.Disadvantage\") : \"\";\n    attributionTooltip = await foundry.applications.handlebars.renderTemplate(\n      \"modules/midi-qol/templates/attribution-tooltip.html\",\n      { attributions, title }\n    );\n  }\n\n  // Extract damage type icon for display next to total\n  // @ts-expect-error no dnd5e types\n  const damageType: string | undefined = roll.options?.type;\n  const damageConfig = damageType\n    ? (GameSystemConfig.damageTypes[damageType] ?? GameSystemConfig.healingTypes?.[damageType])\n    : undefined;\n\n  const chatData = {\n    formula: roll.formula,\n    user: game.user?.id,\n    tooltip: await getTooltip(roll, options),\n    tooltipFormula: options?.tooltipFormula ?? false,\n    // @ts-expect-error no dnd5e-types\n    flavor: options?.flavor ?? roll.options?.flavor,\n    total: (roll.total !== undefined) ? Math.round((roll.total) * 100) / 100 : \"???\",\n    advantageMode: advantageModeStr,\n    attributionTooltip,\n    damageTypeIcon: damageConfig?.icon,\n    damageTypeLabel: damageConfig?.label\n  };\n  return foundry.applications.handlebars.renderTemplate(template, chatData);\n}\nexport function heightIntersects(targetDocument: TokenDocument.Implementation, flankerDocument: TokenDocument.Implementation): boolean {\n  const targetElevation = targetDocument.elevation ?? 0;\n  const flankerElevation = flankerDocument.elevation ?? 0;\n  const targetTopElevation = targetElevation + Math.max(targetDocument.height, targetDocument.width) * (canvas.dimensions?.distance ?? 5);\n  const flankerTopElevation = flankerElevation + Math.min(flankerDocument.height, flankerDocument.width) * (canvas.dimensions?.distance ?? 5); // assume t2 is trying to make itself small\n  /* This is for requiring the centers to intersect the height range \n     Which is an alternative rule possiblity\n  const flankerCenter = (flankerElevation + flankerTopElevation) / 2;\n  if (flankerCenter >= targetElevation || flankerCenter <= targetTopElevation) return true;\n  return false;\n  */\n  if (flankerTopElevation < targetElevation || flankerElevation > targetTopElevation) return false;\n  return true;\n}\n/**\n * Check if a grid cell (identified by pixel coordinates of a point within it) is adjacent to a target token,\n * using purely geometric bounding-box distance. This avoids measurement-mode-dependent calculations\n * (center vs perimeter) that cause inconsistencies with diagonal adjacency under different grid diagonal settings.\n *\n * @param cellPoint - A point within the candidate grid cell (e.g. a token's grid-square center)\n * @param target - The target token to check adjacency against\n * @param maxDistCells - Maximum distance in grid cells (1 for adjacent/5ft, 2 for reach/10ft)\n * @returns true if the cell's bounding box is within maxDistCells of the target's bounding box\n */\nfunction isCellAdjacentToToken(cellPoint: { x: number; y: number }, target: Token.Implementation, maxDistCells: number = 1): boolean {\n  if (!canvas?.grid) return false;\n  const gridW = canvas.grid.sizeX;\n  const gridH = canvas.grid.sizeY;\n\n  // Get the cell's top-left from the point, then compute its bounding box\n  const cellTopLeft = canvas.grid.getTopLeftPoint(cellPoint);\n  const cellLeft = cellTopLeft.x;\n  const cellTop = cellTopLeft.y;\n  const cellRight = cellLeft + gridW;\n  const cellBottom = cellTop + gridH;\n\n  // Target bounding box\n  const targetLeft = target.x;\n  const targetTop = target.y;\n  const targetRight = target.x + target.document.width * gridW;\n  const targetBottom = target.y + target.document.height * gridH;\n\n  // Compute the gap between the two bounding boxes along each axis\n  const dx = Math.max(0, cellLeft - targetRight, targetLeft - cellRight);\n  const dy = Math.max(0, cellTop - targetBottom, targetTop - cellBottom);\n\n  // For adjacent cells (maxDistCells=1), gap must be 0 (touching/overlapping)\n  // For reach cells (maxDistCells=2), gap must be at most 1 grid cell\n  const maxGap = (maxDistCells - 1) * Math.max(gridW, gridH);\n  // Use Chebyshev-style check: both dx and dy must be within maxGap\n  // (since grid adjacency is 8-directional, not Euclidean)\n  return dx <= maxGap && dy <= maxGap;\n}\n\n/**\n * Get the distance between two tokens for flanking purposes.\n * On gridless scenes, always uses perimeter measurement so that tokens\n * whose borders are close together are correctly identified as adjacent,\n * even when their centers are far apart (e.g. large tokens).\n */\nfunction getFlankingDistance(t1: Token.Implementation, t2: Token.Implementation): number {\n  const gridDist = canvas?.dimensions?.distance ?? 5;\n  const fudge = configSettings.gridlessFudge ?? 0;\n  if (canvas?.scene?.grid.type === CONST.GRID_TYPES.GRIDLESS) {\n    const raw = computePerimeterDistance(t1, t2, { wallsBlock: true, includeElevation: false });\n    if (raw < 0) return -1;\n    return gridDist + Math.max(0, raw - fudge);\n  }\n  return getDistance(t1, t2, { wallsBlock: true });\n}\n\nexport function findPotentialFlankers(target: Token.Implementation) {\n  const gridDist = canvas?.dimensions?.distance ?? 5;\n  const isGridless = canvas?.scene?.grid.type === CONST.GRID_TYPES.GRIDLESS;\n  const requiresVisibility = configSettings.optionalRules.flankingRequiresVisibility;\n\n  let allies: Token.Implementation[];\n  let reachAllies: Token.Implementation[];\n\n  if (isGridless) {\n    // On gridless, use perimeter-based distance for finding nearby flankers\n    const canvasPlaceables = canvas?.tokens?.placeables ?? [];\n    const allNearby = canvasPlaceables.filter(t => {\n      if (!isValidTarget(t)) return false;\n      if (!t.actor) return false;\n      if (t.id === target.id) return false;\n      if (checkIncapacitated(t.actor, debugEnabled > 0, false)) return false;\n      // Check disposition: must be hostile to target\n      if (t.document.disposition === target.document.disposition) return false;\n      if (requiresVisibility && !canSense(target, t)) return false;\n      const dist = getFlankingDistance(t, target);\n      return dist >= 0 && dist <= gridDist;\n    });\n    const reachNearby = canvasPlaceables.filter(t => {\n      if (!isValidTarget(t)) return false;\n      if (!t.actor) return false;\n      if (t.id === target.id) return false;\n      if (checkIncapacitated(t.actor, debugEnabled > 0, false)) return false;\n      if (t.document.disposition === target.document.disposition) return false;\n      if (requiresVisibility && !canSense(target, t)) return false;\n      if (allNearby.some(a => a === t)) return false;\n      //@ts-expect-error no dnd5e-types\n      if (!t.actor.items.contents.some(item => item.system?.properties?.has(\"rch\") && item.system.equipped)) return false;\n      const dist = getFlankingDistance(t, target);\n      return dist >= 0 && dist <= 2 * gridDist;\n    });\n    allies = allNearby.concat(reachNearby);\n  } else {\n    allies = findNearby(-1, target, gridDist, requiresVisibility ? { isSeen: true } : {});\n    reachAllies = findNearby(-1, target, 2 * gridDist, requiresVisibility ? { isSeen: true } : {}).filter(\n      ally => !(allies.some(tk => tk === ally)) &&\n        //@ts-expect-error no dnd5e-types\n        ally.actor?.items.contents.some(item => item.system?.properties?.has(\"rch\") && item.system.equipped)\n    );\n    allies = allies.concat(reachAllies);\n  }\n  return allies;\n}\n\n/**\n * Compute the centroid (average pixel position) of a token's occupied hex centers.\n * Falls back to token.center if the grid is not hexagonal or offsets can't be obtained.\n */\nfunction getHexCentroid(target: Token.Implementation): { x: number; y: number } {\n  if (!canvas?.grid?.isHexagonal) return target.center;\n  const offsets = target.document.getOccupiedGridSpaceOffsets();\n  if (!offsets.length) return target.center;\n  let sumX = 0, sumY = 0;\n  for (const offset of offsets) {\n    const center = canvas.grid.getCenterPoint(offset);\n    sumX += center.x;\n    sumY += center.y;\n  }\n  return { x: sumX / offsets.length, y: sumY / offsets.length };\n}\n\n/**\n * Angle-based flanking test: checks if token and ally are >= 150° apart\n * as seen from a reference point (centroid for hex, center for gridless).\n * Used for hex grids and gridless scenes where ray-through-edges doesn't apply.\n */\nfunction isAngleFlanking(\n  token: Token.Implementation,\n  ally: Token.Implementation,\n  target: Token.Implementation\n): boolean {\n  // Use hex centroid for hex grids, target center for gridless\n  const referencePoint = canvas?.grid?.isHexagonal ? getHexCentroid(target) : target.center;\n  const angleToken = Math.atan2(token.center.y - referencePoint.y, token.center.x - referencePoint.x);\n  const angleAlly = Math.atan2(ally.center.y - referencePoint.y, ally.center.x - referencePoint.x);\n  let diff = Math.abs(angleToken - angleAlly);\n  if (diff > Math.PI) diff = 2 * Math.PI - diff; // normalize to [0, π]\n  const MIN_FLANKING_ANGLE = (150 / 180) * Math.PI; // 150° in radians\n  return diff >= MIN_FLANKING_ANGLE;\n}\n\n\n// TODO: Can definitely probably clean this up some\nexport async function computeFlankedStatus(target: Token.Implementation): Promise<boolean> {\n  if (!checkRule(\"checkFlanking\") || ![\"ceflanked\", \"ceflankedNoconga\", \"midiFlanked\", \"midiFlankedNoConga\"].includes(checkRule(\"checkFlanking\") as string)) return false;\n  if (!canvas || !target) return false;\n  const allies = findPotentialFlankers(target);\n  if (allies.length <= 1) return false; // length 1 means no other allies nearby\n  const gridW = canvas.grid?.sizeX ?? 100;\n  const gridH = canvas.grid?.sizeY ?? 100;\n  const tl = { x: target.x, y: target.y };\n  const tr = { x: target.x + target.document.width * gridW, y: target.y };\n  const bl = { x: target.x, y: target.y + target.document.height * gridH };\n  const br = { x: target.x + target.document.width * gridW, y: target.y + target.document.height * gridH };\n  const top: [x0: number, y0: number, x1: number, y1: number] = [tl.x, tl.y, tr.x, tr.y];\n  const bottom: [x0: number, y0: number, x1: number, y1: number] = [bl.x, bl.y, br.x, br.y];\n  const left: [x0: number, y0: number, x1: number, y1: number] = [tl.x, tl.y, bl.x, bl.y];\n  const right: [x0: number, y0: number, x1: number, y1: number] = [tr.x, tr.y, br.x, br.y];\n\n  while (allies.length > 1) {\n    const token = allies.pop();\n    if (!token) break;\n    if (!heightIntersects(target.document, token.document)) continue;\n    if (checkRule(\"checkFlanking\") === \"ceflankedNoconga\" && installedModules.get(\"dfreds-convenient-effects\")) {\n      const CEFlanked = getFlankedEffect();\n      const hasFlanked = token.actor && CEFlanked && CEHasEffectApplied({ effectName: CEFlanked.name, uuid: token.actor.uuid });\n      if (hasFlanked) continue;\n    } else if (checkRule(\"checkFlanking\") === \"midiFlankedNoConga\") {\n      const hasFlanked = token.actor && hasCondition(token.actor, \"flanked\");\n      if (hasFlanked) continue;\n    }\n    if (token.actor?.flags?.[MODULE_ID]?.canFlank !== undefined) {\n      const conditionData = createConditionData({ actor: token.actor, token, target });\n      const tokenCanFlank = await evalCondition(token.actor.flags[MODULE_ID]?.canFlank, conditionData, undefined);\n      if (tokenCanFlank === false) continue;\n    }\n    // Loop through each square covered by attacker and ally\n    // Use geometric bounding-box adjacency instead of distancePointToken to avoid\n    // measurement-mode-dependent distance calculations (center vs perimeter)\n    const tokenStartX = -Math.max(0, token.document.width / 2 - 0.5);\n    const tokenStartY = -Math.max(0, token.document.height / 2 - 0.5);\n    const tokenPoints: any[] = [];\n    for (let x = tokenStartX; x < token.document.width / 2; x++) {\n      for (let y = tokenStartY; y < token.document.height / 2; y++) {\n        let tx = token.center.x + x * gridW;\n        let ty = token.center.y + y * gridH;\n        if (!isCellAdjacentToToken({ x: tx, y: ty }, target)) continue;\n        tokenPoints.push({ x: tx, y: ty });\n      }\n    }\n    for (let ally of allies) {\n      if (ally.document.uuid === token.document.uuid) continue;\n      const actor: any = ally.actor;\n      if (actor?.system.attributes?.hp?.value <= 0) continue;\n      if (!heightIntersects(target.document, ally.document)) continue;\n      if (hasCondition(actor, \"incapacitated\")) continue;\n      if (checkRule(\"checkFlanking\") === \"ceflankedNoconga\" && installedModules.get(\"dfreds-convenient-effects\")) {\n        const CEFlanked = getFlankedEffect();\n        const hasFlanked = CEFlanked && CEHasEffectApplied({ effectName: CEFlanked.name, uuid: ally.actor?.uuid ?? \"\" });\n        if (hasFlanked) continue;\n      }\n      if (checkRule(\"checkFlanking\") === \"midiFlankedNoConga\") {\n        const hasFlanked = hasCondition(actor, \"flanked\");\n        if (hasFlanked) continue\n      }\n      // Hex grid or gridless: use angle-based flanking instead of ray-edge intersection\n      if (canvas.grid?.isHexagonal || canvas.scene?.grid.type === CONST.GRID_TYPES.GRIDLESS) {\n        if (isAngleFlanking(token, ally, target)) return true;\n        continue;\n      }\n      const allyStartX = -Math.max(0, ally.document.width / 2 - 0.5);\n      const allyStartY = -Math.max(0, ally.document.height / 2 - 0.5);\n      const allyPoints: any[] = [];\n      for (let x1 = allyStartX; x1 < ally.document.width / 2; x1++) {\n        for (let y1 = allyStartY; y1 < ally.document.height / 2; y1++) {\n          let ax = ally.center.x + x1 * gridW;\n          let ay = ally.center.y + y1 * gridH;\n          if (!isCellAdjacentToToken({ x: ax, y: ay }, target)) continue;\n          allyPoints.push({ x: ax, y: ay });\n        }\n      }\n      for (let tokenPoint of tokenPoints) {\n        for (let allyPoint of allyPoints) {\n          const p1 = canvas.grid?.getCenterPoint(tokenPoint)\n          const p2 = canvas.grid?.getCenterPoint(allyPoint);\n          if (!p1 || !p2) continue;\n          const rayToCheck = new foundry.canvas.geometry.Ray(p1, p2);\n          const flankingTop = rayToCheck.intersectSegment(top) && rayToCheck.intersectSegment(bottom);\n          const flankingLeft = rayToCheck.intersectSegment(left) && rayToCheck.intersectSegment(right);\n          if (flankingLeft || flankingTop) {\n            return true;\n          }\n        }\n      }\n    }\n  }\n  return false;\n}\n\n// TODO Can definitely probably clean this up\nexport async function computeFlankingStatus(token: Token.Implementation, target: Token.Implementation): Promise<boolean> {\n  if (!checkRule(\"checkFlanking\") || checkRule(\"checkFlanking\") === \"off\") return false;\n  if (!canvas) return false;\n  if (!token) return false;\n  // For the target see how many square between this token and any friendly targets\n  // Find all tokens hostile to the target\n  if (!target) return false;\n  if (!heightIntersects(target.document, token.document)) return false;\n  let range = 1;\n  // @ts-expect-error no dnd5e-types\n  if (token.actor?.items.contents.some(item => item.system?.properties?.has(\"rch\") && item.system.equipped)) {\n    range = 2;\n  }\n  const flankDist = getFlankingDistance(token, target);\n  if (flankDist > range * (canvas.dimensions?.distance ?? 5)) return false;\n  // an enemy's enemies are my friends.\n  const allies = findPotentialFlankers(target)\n  if (!token.document.disposition) return false;\n  if (allies.length <= 1) return false;\n  const gridW = canvas.grid?.sizeX ?? 100;\n  const gridH = canvas.grid?.sizeY ?? 100;\n  const tl = { x: target.x, y: target.y };\n  const tr = { x: target.x + target.document.width * gridW, y: target.y };\n  const bl = { x: target.x, y: target.y + target.document.height * gridH };\n  const br = { x: target.x + target.document.width * gridW, y: target.y + target.document.height * gridH };\n  const top: [x0: number, y0: number, x1: number, y1: number] = [tl.x, tl.y, tr.x, tr.y];\n  const bottom: [x0: number, y0: number, x1: number, y1: number] = [bl.x, bl.y, br.x, br.y];\n  const left: [x0: number, y0: number, x1: number, y1: number] = [tl.x, tl.y, bl.x, bl.y];\n  const right: [x0: number, y0: number, x1: number, y1: number] = [tr.x, tr.y, br.x, br.y];\n\n  // Loop through each square covered by attacker and ally\n  // Use geometric bounding-box adjacency instead of distancePointToken to avoid\n  // measurement-mode-dependent distance calculations (center vs perimeter)\n  const tokenStartX = -Math.max(0, token.document.width / 2 - 0.5);\n  const tokenStartY = -Math.max(0, token.document.height / 2 - 0.5);\n  const tokenPoints: any[] = [];\n  for (let x = tokenStartX; x < token.document.width / 2; x++) {\n    for (let y = tokenStartY; y < token.document.height / 2; y++) {\n      let tx = token.center.x + x * gridW;\n      let ty = token.center.y + y * gridH;\n      if (!isCellAdjacentToToken({ x: tx, y: ty }, target)) continue;\n      tokenPoints.push({ x: tx, y: ty });\n    }\n  }\n  for (let ally of allies) {\n    if (ally.document.uuid === token.document.uuid) continue;\n    if (!heightIntersects(ally.document, target.document)) continue;\n    const actor: any = ally.actor;\n    if (checkIncapacitated(ally.actor, debugEnabled > 0, false)) continue;\n    if (hasCondition(actor, \"incapacitated\")) continue;\n    if (ally.actor?.flags?.[MODULE_ID]?.canFlank !== undefined) {\n      const conditionData = createConditionData({ actor: ally.actor, token: ally, target });\n      const allyCanFlank = await evalCondition(ally.actor.flags[MODULE_ID]?.canFlank, conditionData, undefined);\n      if (allyCanFlank === false) continue;\n    }\n    // Hex grid or gridless: use angle-based flanking instead of ray-edge intersection\n    if (canvas.grid?.isHexagonal || canvas.scene?.grid.type === CONST.GRID_TYPES.GRIDLESS) {\n      if (isAngleFlanking(token, ally, target)) return true;\n      continue;\n    }\n    const allyStartX = -Math.max(0, ally.document.width / 2 - 0.5);\n    const allyStartY = -Math.max(0, ally.document.height / 2 - 0.5);\n\n    const allyPoints: any[] = [];\n    for (let x1 = allyStartX; x1 < ally.document.width / 2; x1++) {\n      for (let y1 = allyStartY; y1 < ally.document.height / 2; y1++) {\n        let ax = ally.center.x + x1 * gridW;\n        let ay = ally.center.y + y1 * gridH;\n        if (!isCellAdjacentToToken({ x: ax, y: ay }, target)) {\n          continue;\n        }\n        allyPoints.push({ x: ax, y: ay });\n      }\n    }\n    for (let tokenPoint of tokenPoints) {\n      for (let allyPoint of allyPoints) {\n        const p1 = canvas.grid?.getCenterPoint(tokenPoint)\n        const p2 = canvas.grid?.getCenterPoint(allyPoint);\n        if (!p1 || !p2) continue;\n        const rayToCheck = new foundry.canvas.geometry.Ray(p1, p2);\n        const flankingTop = rayToCheck.intersectSegment(top) && rayToCheck.intersectSegment(bottom);\n        const flankingLeft = rayToCheck.intersectSegment(left) && rayToCheck.intersectSegment(right);\n        if (flankingLeft || flankingTop) {\n          return true;\n        }\n      }\n    }\n  }\n  return false;\n}\n\nexport function getFlankingEffect() {\n  return ceInterface?.findEffect({ effectName: \"Flanking\" });\n}\n\nexport function getFlankedEffect() {\n  return ceInterface?.findEffect({ effectName: \"Flanked\" });\n}\n\nexport function getReactionEffect() {\n  if (!midiReactionEffect) return undefined;\n  return getCPREffect(midiReactionEffect._id!) ?? midiReactionEffect;\n}\nexport function getBonusActionEffect() {\n  if (!midiBonusActionEffect) return undefined;\n  return getCPREffect(midiBonusActionEffect._id!) ?? midiBonusActionEffect;\n}\n\nexport function getIncapacitatedStatusEffect() {\n  let incapEffect = CONFIG.statusEffects.find(se => se.id === \"incapacitated\");\n  //@ts-expect-error odd\n  if (!incapEffect) incapEffect = CONFIG.statusEffects.find(se => se.statuses?.has(\"incapacitated\"));\n  if (!incapEffect) incapEffect = CONFIG.statusEffects.find(se => se.name === i18n(\"DND5E.ConIncapacitated\"))\n  return incapEffect;\n}\n\nexport async function markFlanking(token?: Token.Implementation | null, target?: Token.Implementation | null): Promise<boolean> {\n  if (!canvas) return false;\n  if (!target || !target?.actor) return false;\n  const flankingMode = checkRule(\"checkFlanking\") as string;\n  if (!flankingMode || flankingMode === \"off\") return false;\n\n  const isFlankingMode = [\"advonly\", \"ceonly\", \"midiFlanking\"].includes(flankingMode);\n  const isFlankedMode = [\"ceflanked\", \"ceflankedNoconga\", \"midiFlanked\", \"midiFlankedNoConga\"].includes(flankingMode);\n  const skipAttackerStatus = (configSettings.optionalRules?.flankingBonus ?? \"advantage\") !== \"advantage\";\n\n  if (isFlankingMode) {\n    // Attacker-side flanking: requires both token and target\n    if (!token || token === target) return false;\n    const needsFlanking = await computeFlankingStatus(token, target);\n    if (skipAttackerStatus) return needsFlanking;\n\n    // Apply flanking status to attacker (advantage mode only)\n    if (flankingMode === \"ceonly\") {\n      if (installedModules.get(\"dfreds-convenient-effects\")) {\n        let CEFlanking = getFlankingEffect();\n        if (!CEFlanking) return needsFlanking;\n        const hasFlanking = CEHasEffectApplied({ effectName: CEFlanking.name ?? \"Flanking\", uuid: token.actor?.uuid ?? \"\" });\n        if (needsFlanking && !hasFlanking && token.actor) {\n          await CEAddEffectWith({ effectName: CEFlanking.name ?? \"Flanking\", uuid: token.actor.uuid, overlay: false });\n        } else if (!needsFlanking && hasFlanking && token.actor) {\n          await CERemoveEffect({ effectName: CEFlanking.name ?? \"Flanking\", uuid: token.actor.uuid });\n        }\n      }\n    } else if (flankingMode === \"midiFlanking\") {\n      const MidiFlanking: any = CONFIG.statusEffects.find(se => se.id === \"flanking\");\n      if (!MidiFlanking) return false;\n      let cprEffect: ActiveEffect | undefined = getCPREffect(MidiFlanking?._id as string)\n      if (!cprEffect) {\n        if (!token.actor?.isOwner) await unTimedExecuteAsGM(\"toggleStatusEffect\", { actorUuid: token.actor?.uuid, statusId: MidiFlanking.id, options: { active: needsFlanking } });\n        else await token.actor.toggleStatusEffect(MidiFlanking.id, { active: needsFlanking });\n      } else if (needsFlanking) {\n        if (!token.actor?.effects.get(cprEffect.id!)) {\n          if (!token.actor?.isOwner) await unTimedExecuteAsGM(\"createEffects\", { actorUuid: token.actor?.uuid, effects: [cprEffect.toObject()], options: { keepId: true } });\n          else await token.actor.createEmbeddedDocuments(\"ActiveEffect\", [cprEffect.toObject()], { keepId: true });\n        }\n      } else {\n        if (token.actor?.effects.get(cprEffect.id!)) {\n          if (!target.actor.isOwner) await unTimedExecuteAsGM(\"removeEffects\", { actorUuid: token.actor.uuid, effects: [cprEffect.id], options: {} });\n          await token.actor.deleteEmbeddedDocuments(\"ActiveEffect\", [cprEffect.id!]);\n        }\n      }\n    }\n    // advonly: no status to apply\n    return needsFlanking;\n\n  } else if (isFlankedMode) {\n    // Target-side flanked: applies status to target\n    if (!target.actor) return false;\n    const needsFlanked = await computeFlankedStatus(target);\n\n    if ([\"ceflanked\", \"ceflankedNoconga\"].includes(flankingMode)) {\n      if (installedModules.get(\"dfreds-convenient-effects\")) {\n        let CEFlanked = getFlankedEffect();\n        if (!CEFlanked) return false;\n        const hasFlanked = CEHasEffectApplied({ effectName: CEFlanked.name ?? \"Flanked\", uuid: target.actor.uuid });\n        if (needsFlanked && !hasFlanked && target.actor) {\n          await CEAddEffectWith({ effectName: CEFlanked.name ?? \"Flanked\", uuid: target.actor.uuid, overlay: false });\n        } else if (!needsFlanked && hasFlanked && token?.actor) {\n          await CERemoveEffect({ effectName: CEFlanked.name ?? \"Flanked\", uuid: target.actor.uuid });\n        }\n      }\n    } else if ([\"midiFlanked\", \"midiFlankedNoConga\"].includes(flankingMode)) {\n      const MidiFlanked = CONFIG.statusEffects.find(se => se.id === \"flanked\");\n      if (!MidiFlanked) return false;\n      const cprEffect: ActiveEffect | undefined = getCPREffect(MidiFlanked?._id as string)\n      if (!cprEffect) {\n        if (!target.actor.isOwner) await unTimedExecuteAsGM(\"toggleStatusEffect\", { actorUuid: target.actor.uuid, statusId: MidiFlanked.id, options: { active: needsFlanked } });\n        else await target.actor.toggleStatusEffect(MidiFlanked.id, { active: needsFlanked });\n      } else if (needsFlanked) {\n        if (!target.actor.effects.get(cprEffect.id!)) {\n          if (!target.actor.isOwner) await unTimedExecuteAsGM(\"createEffects\", { actorUuid: target.actor.uuid, effects: [cprEffect.toObject()], options: { keepId: true } });\n          else await target.actor.createEmbeddedDocuments(\"ActiveEffect\", [cprEffect.toObject()], { keepId: true });\n        }\n      } else {\n        if (target.actor.effects.get(cprEffect.id!)) {\n          if (!target.actor.isOwner) await unTimedExecuteAsGM(\"removeEffects\", { actorUuid: target.actor.uuid, effects: [cprEffect.id], options: {} });\n          else await target.actor.deleteEmbeddedDocuments(\"ActiveEffect\", [cprEffect.id!]);\n        }\n      }\n    }\n  }\n  return false;\n}\n\nexport async function chackFlanking(user: User.Implementation, target: Token.Implementation, targeted: boolean): Promise<boolean> {\n  if (user.id !== game.user?.id) return false;\n  let token = canvas.tokens?.controlled[0];\n  if (user.targets.size === 1) return markFlanking(token, target);\n  return false\n\n}\n\nlet flankingHighlightContainer: PIXI.Container | null = null;\n\n/**\n * Get the flanking icon path based on the current flanking mode.\n */\nfunction getFlankingHighlightIcon(): string {\n  const flankingMode = checkRule(\"checkFlanking\") as string;\n  const isFlankedMode = [\"ceflanked\", \"ceflankedNoconga\", \"midiFlanked\", \"midiFlankedNoConga\"].includes(flankingMode);\n  return isFlankedMode ? \"modules/midi-qol/icons/encirclement.svg\" : \"icons/svg/sword.svg\";\n}\n\n/**\n * Update the flanking highlight overlay. Called when token selection or targeting changes.\n * Highlights grid cells around the current target where an ally could stand to create\n * a flanking condition with the currently selected token using icon sprites.\n */\nexport async function updateFlankingHighlight(): Promise<void> {\n  if (!canvas?.grid || !canvas.interface?.grid) return;\n\n  // Clear previous sprites\n  if (flankingHighlightContainer) {\n    flankingHighlightContainer.destroy({ children: true });\n    flankingHighlightContainer = null;\n  }\n\n  // Early exits: setting disabled, flanking mode off, gridless (no cells to highlight)\n  if (!configSettings.optionalRules?.showFlankingHighlight) return;\n  const flankingMode = checkRule(\"checkFlanking\") as string;\n  if (!flankingMode || flankingMode === \"off\") return;\n  if (canvas.scene?.grid.type === CONST.GRID_TYPES.GRIDLESS) return;\n\n  // Need exactly one controlled token and one target\n  const token = canvas.tokens?.controlled?.[0];\n  const target = game.user?.targets?.first();\n  if (!token || !target || token === target) return;\n  if (!canvas.dimensions) return;\n\n  // Check selected token is within melee range of target (allow reach if equipped)\n  const gridDist = canvas.dimensions.distance ?? 5;\n  let tokenRange = 1;\n  // @ts-expect-error no dnd5e-types\n  if (token.actor?.items.contents.some(item => item.system?.properties?.has(\"rch\") && item.system.equipped)) {\n    tokenRange = 2;\n  }\n  const tokenDist = getDistance(token, target, { wallsBlock: true });\n  if (tokenDist > tokenRange * gridDist) return;\n\n  const gridW = canvas.grid.sizeX ?? 100;\n  const gridH = canvas.grid.sizeY ?? 100;\n\n  // Adjacency distance — matches computeFlankingStatus logic\n  let maxDist = gridDist;\n  // @ts-expect-error not in types yet\n  if (game.settings.get(\"core\", \"gridDiagonals\") === 1) maxDist *= Math.sqrt(2);\n\n  // Get target's occupied offsets and their centers for adjacency checks\n  const targetOffsets = target.document.getOccupiedGridSpaceOffsets();\n  const targetOffsetSet = new Set(targetOffsets.map((o: {i: number, j: number}) => `${o.i},${o.j}`));\n  const targetCellCenters = targetOffsets.map((o: {i: number, j: number}) => canvas.grid!.getCenterPoint(o));\n\n  // Expand target bounds by 2 cells in each direction to find candidate cells\n  const bounds = {\n    x: target.x - 2 * gridW,\n    y: target.y - 2 * gridH,\n    width: target.document.width * gridW + 4 * gridW,\n    height: target.document.height * gridH + 4 * gridH,\n  };\n  const [i0, j0, i1, j1] = canvas.grid.getOffsetRange(bounds);\n\n  // Build target edge segments for square grid ray testing\n  let top: [number, number, number, number] | undefined;\n  let bottom: [number, number, number, number] | undefined;\n  let left: [number, number, number, number] | undefined;\n  let right: [number, number, number, number] | undefined;\n\n  if (!canvas.grid.isHexagonal) {\n    const tl = { x: target.x, y: target.y };\n    const tr = { x: target.x + target.document.width * gridW, y: target.y };\n    const bl = { x: target.x, y: target.y + target.document.height * gridH };\n    const br = { x: target.x + target.document.width * gridW, y: target.y + target.document.height * gridH };\n    top = [tl.x, tl.y, tr.x, tr.y];\n    bottom = [bl.x, bl.y, br.x, br.y];\n    left = [tl.x, tl.y, bl.x, bl.y];\n    right = [tr.x, tr.y, br.x, br.y];\n  }\n\n  // Build token grid points (same multi-square logic as computeFlankingStatus)\n  // Use measurePath against target cell centers for hex-grid compatibility\n  const tokenPoints: { x: number; y: number }[] = [];\n  const tokenStartX = -Math.max(0, token.document.width / 2 - 0.5);\n  const tokenStartY = -Math.max(0, token.document.height / 2 - 0.5);\n  const tokenMaxDist = tokenRange * maxDist + 1; // +1 tolerance for hex precision\n  for (let x = tokenStartX; x < token.document.width / 2; x++) {\n    for (let y = tokenStartY; y < token.document.height / 2; y++) {\n      const tx = token.center.x + x * gridW;\n      const ty = token.center.y + y * gridH;\n      let closeEnough = false;\n      for (const tc of targetCellCenters) {\n        const d = canvas.grid.measurePath([{ x: tx, y: ty }, tc], {}).distance;\n        if (d <= tokenMaxDist) { closeEnough = true; break; }\n      }\n      if (!closeEnough) continue;\n      tokenPoints.push({ x: tx, y: ty });\n    }\n  }\n  if (tokenPoints.length === 0) return;\n\n  // Hex flanking uses centroid + angle\n  const centroid = canvas.grid.isHexagonal ? getHexCentroid(target) : undefined;\n  const MIN_FLANKING_ANGLE = (150 / 180) * Math.PI;\n\n  // Collect valid cell positions\n  const validCells: { i: number; j: number }[] = [];\n  for (let i = i0; i <= i1; i++) {\n    for (let j = j0; j <= j1; j++) {\n      // Skip cells occupied by the target\n      if (targetOffsetSet.has(`${i},${j}`)) continue;\n\n      const cellCenter = canvas.grid.getCenterPoint({ i, j });\n\n      // Check candidate is adjacent to target using measurePath against occupied cell centers\n      // Add small tolerance (1ft) for floating-point imprecision in hex center coordinates\n      let isAdjacent = false;\n      for (const tc of targetCellCenters) {\n        const d = canvas.grid.measurePath([cellCenter, tc], {}).distance;\n        if (d > 0 && d <= maxDist + 1) { isAdjacent = true; break; }\n      }\n      if (!isAdjacent) continue;\n\n      let isValid = false;\n\n      if (canvas.grid.isHexagonal && centroid) {\n        // Hex flanking: check angle from centroid\n        for (const tp of tokenPoints) {\n          const tokenCenter = canvas.grid.getCenterPoint(tp);\n          const angleToken = Math.atan2(tokenCenter.y - centroid.y, tokenCenter.x - centroid.x);\n          const angleCandidate = Math.atan2(cellCenter.y - centroid.y, cellCenter.x - centroid.x);\n          let diff = Math.abs(angleToken - angleCandidate);\n          if (diff > Math.PI) diff = 2 * Math.PI - diff;\n          if (diff >= MIN_FLANKING_ANGLE) {\n            isValid = true;\n            break;\n          }\n        }\n      } else if (top && bottom && left && right) {\n        // Square grid: ray through opposite edges test\n        for (const tp of tokenPoints) {\n          const p1 = canvas.grid.getCenterPoint(tp);\n          const p2 = cellCenter;\n          const ray = new foundry.canvas.geometry.Ray(p1, p2);\n          const throughTopBottom = ray.intersectSegment(top) && ray.intersectSegment(bottom);\n          const throughLeftRight = ray.intersectSegment(left) && ray.intersectSegment(right);\n          if (throughTopBottom || throughLeftRight) {\n            isValid = true;\n            break;\n          }\n        }\n      }\n\n      if (isValid) validCells.push({ i, j });\n    }\n  }\n\n  if (validCells.length === 0) return;\n\n  // Load the flanking icon texture and place sprites\n  const iconPath = getFlankingHighlightIcon();\n  let texture: PIXI.Texture;\n  try {\n    texture = await PIXI.Assets.load(iconPath);\n  } catch {\n    return;\n  }\n  if (!texture?.valid) return;\n\n  // Re-check state after async load — selection/target may have changed\n  if (!canvas?.interface?.grid) return;\n  if (canvas.tokens?.controlled?.[0] !== token) return;\n  if (game.user?.targets?.first() !== target) return;\n\n  flankingHighlightContainer = new PIXI.Container();\n  flankingHighlightContainer.name = \"midi-qol-flanking-highlight\";\n  flankingHighlightContainer.zIndex = (CONFIG.Canvas.groups.interface.zIndexScrollingText ?? 1100) - 1;\n  flankingHighlightContainer.sortableChildren = false;\n  flankingHighlightContainer.eventMode = \"none\";\n  canvas.interface.addChild(flankingHighlightContainer);\n\n  const spriteSize = Math.min(gridW, gridH) * 0.8;\n  for (const { i, j } of validCells) {\n    const center = canvas.grid.getCenterPoint({ i, j });\n    const sprite = new PIXI.Sprite(texture);\n    sprite.anchor.set(0.5);\n    sprite.position.set(center.x, center.y);\n    sprite.width = spriteSize;\n    sprite.height = spriteSize;\n    sprite.alpha = 0.6;\n    sprite.tint = 0xFF6600;\n    flankingHighlightContainer.addChild(sprite);\n  }\n}\n\nexport function getChanges(actorOrItem: Actor.Implementation | Item.Implementation, key: string) {\n  let contents = actorOrItem.effects.contents;\n  if (actorOrItem instanceof Actor) contents = actorOrItem.appliedEffects;\n  return actorOrItem.effects.contents\n    .flat()\n    .map(e => {\n      let c: Array<any> = foundry.utils.duplicate(e.changes);\n      c = c.map(change => { change.effect = e; return change; })\n      return c\n    })\n    .flat()\n    .filter(c => c.key.includes(key))\n    .sort((a, b) => a.key < b.key ? -1 : 1)\n}\n\n/**\n * \n * @param token \n * @param target \n * \n * @returns {boolean}\n */\nexport function canSense(tokenEntity: TokenOrDocument | string, targetEntity: TokenOrDocument | string, validModes: Array<string> = [\"all\"]): boolean {\n  return canSenseModes(tokenEntity, targetEntity, validModes).length > 0;\n}\nexport function canSenseModes(tokenEntity: TokenOrDocument | string, targetEntity: TokenOrDocument | string, validModes: Array<string> = [\"all\"]): Array<string> {\n  const token = getToken(tokenEntity);\n  const target = getToken(targetEntity);\n  if (!token || !target) return [];\n  return _canSenseModes(token, target, validModes);\n}\nexport function initializeVision(tk: Token.Implementation, force = false) {\n  tk.document.sight.enabled = true;\n  // @ts-expect-error protected\n  tk.document._prepareDetectionModes();\n  const sourceId = tk.sourceId;\n  tk.vision = new CONFIG.Canvas.visionSourceClass({ sourceId, object: tk });\n\n  tk.vision.initialize({\n    x: tk.center.x,\n    y: tk.center.y,\n    elevation: tk.document.elevation,\n    radius: Math.clamp(tk.sightRange, 0, canvas.dimensions?.maxR ?? 0),\n    externalRadius: tk.externalRadius, // Math.max(tk.mesh.width, tk.mesh.height) / 2,\n    angle: tk.document.sight.angle,\n    contrast: tk.document.sight.contrast,\n    saturation: tk.document.sight.saturation,\n    brightness: tk.document.sight.brightness,\n    attenuation: tk.document.sight.attenuation,\n    rotation: tk.document.rotation,\n    visionMode: tk.document.sight.visionMode as foundry.canvas.perception.VisionMode.ConfiguredModes,\n    preview: !!tk._original,\n    color: tk.document.sight.color?.toNearest(),\n    blinded: tk.document.hasStatusEffect(CONFIG.specialStatusEffects.BLIND)\n  });\n  if (!tk.vision.los) {\n    // @ts-expect-error protected\n    tk.vision.shape = tk.vision._createRestrictedPolygon();\n    tk.vision.los = tk.vision.shape;\n  }\n  if (tk.vision.visionMode) tk.vision.visionMode.animated = false;\n  tk.vision.add();\n  return true;\n}\nexport function _canSenseModes(token: Token.Implementation, target: Token.Implementation, validModesParam: Array<string> = [\"all\"]): Array<string> {\n  const detectionModes = CONFIG.Canvas.detectionModes;\n  const DetectionModeCONST = foundry.canvas.perception.DetectionMode;\n  if (!token || !target) return [\"noToken\"];\n  if (target.document.hidden || token.document.hidden) return [];\n  if (!token.hasSight && !configSettings.optionalRules.invisVision) return [\"senseAll\"];\n  if ((!token.vision || !token.vision.los) && !initializeVision(token)) return [\"noSight\"];\n  const matchedModes: Set<string> = new Set();\n  // Determine the array of offset points to test.\n  // Inner ring at t (min dimension / 4) matches Foundry's standard tolerance.\n  // Outer ring at t2 (min dimension / 2 - 2) tests near the token boundary,\n  // catching narrow visible slivers that the inner ring misses.\n  const t = Math.min(target.w, target.h) / 4;\n  const t2 = Math.min(target.w, target.h) / 2 - 2;\n  const targetPoint = target.center;\n  const offsets = t > 0 ? [\n    [0, 0], [-t, -t], [-t, t], [t, t], [t, -t], [-t, 0], [t, 0], [0, -t], [0, t],\n    [-t2, -t2], [-t2, t2], [t2, t2], [t2, -t2], [-t2, 0], [t2, 0], [0, -t2], [0, t2]\n  ] : [[0, 0]];\n  const tests = offsets.map(o => ({\n    point: new PIXI.Point(targetPoint.x + o[0], targetPoint.y + o[1]),\n    elevation: target?.document.elevation ?? 0,\n    los: new Map()\n  }));\n  const config = { tests, object: target };\n  const tokenDetectionModes = token.detectionModes;\n  const modes = CONFIG.Canvas.detectionModes;\n  let validModes = new Set(validModesParam);\n\n  // Pre-populate the LOS cache using direct ray casting against walls.\n  // This is more precise than visionSource.los.contains() which uses a polygon\n  // approximation (ClockwiseSweepPolygon) that can miss narrow visible corridors\n  // through wall gaps. Foundry uses this same testCollision approach for restricted\n  // vision angles; we extend it to 360° vision for accuracy.\n  if (token.vision) {\n    const origin = { x: token.vision.x, y: token.vision.y };\n    for (const test of tests) {\n      const collision = CONFIG.Canvas.polygonBackends.sight.testCollision(\n        origin,\n        test.point,\n        { type: \"sight\", mode: \"any\", source: token.vision, useThreshold: true, priority: token.vision.priority }\n      );\n      test.los.set(token.vision, !collision);\n    }\n  }\n\n  const lightSources = canvas.effects?.lightSources;\n  for (const lightSource of (lightSources ?? [])) {\n    if (/*!lightSource.data.vision ||*/ !lightSource.active || lightSource.data.disabled) continue;\n    if (!validModes.has(detectionModes.lightPerception?.id ?? DetectionModeCONST.BASIC_MODE_ID) && !validModes.has(\"all\")) continue;\n    const result = lightSource.testVisibility && lightSource.testVisibility(config);\n    if (result === true) matchedModes.add(detectionModes.lightPerception?.id ?? DetectionModeCONST.BASIC_MODE_ID);\n  }\n\n  const lightPerception = tokenDetectionModes.find(m => m.id === modes.lightPerception?.id);\n  if (lightPerception && [\"lightPerception\", \"all\"].some(mode => validModes.has(mode))) {\n    // @ts-expect-error DetectionMode somehow different from TokenDetectionMode?\n    const result = (lightPerception && token.vision) ? modes.lightPerception.testVisibility(token.vision, lightPerception, config) : false;\n    if (result === true)\n      matchedModes.add(detectionModes.lightPerception?.id ?? DetectionModeCONST.BASIC_MODE_ID);\n  }\n\n  const basic = tokenDetectionModes.find(m => m.id === DetectionModeCONST.BASIC_MODE_ID);\n  if (basic && [\"basicSight\", \"all\"].some(mode => validModes.has(mode))) {\n    // @ts-expect-error DetectionMode somehow different from TokenDetectionMode?\n    const result = token.vision ? modes.basicSight.testVisibility(token.vision, basic, config) : false;\n    if (result === true)\n      matchedModes.add(detectionModes.basicSight?.id ?? DetectionModeCONST.BASIC_MODE_ID);\n  }\n  for (const detectionMode of tokenDetectionModes) {\n    if (detectionMode.id === DetectionModeCONST.BASIC_MODE_ID) continue;\n    if (!detectionMode.enabled) continue;\n    const dm = modes[detectionMode.id as string];\n    if (validModes.has(\"all\") || validModes.has(detectionMode.id as string)) {\n      // @ts-expect-error DetectionMode somehow different from TokenDetectionMode?\n      const result = token.vision ? dm?.testVisibility(token.vision, detectionMode, config) : false;\n      if (result === true) {\n        matchedModes.add(detectionMode.id as string);\n      }\n    }\n  }\n  for (let tk of [token, target]) {\n    if (!tk.document.sight.enabled) {\n      const sourceId = tk.sourceId;\n      canvas.effects?.visionSources.delete(sourceId);\n    }\n  }\n  return Array.from(matchedModes);\n}\n\nexport function tokensForActor(actorRef: Actor.Implementation | string | undefined | null): Token.Implementation[] {\n  let actor: Actor | null;\n  if (!actorRef) return []\n  if (typeof actorRef === \"string\") actor = fromActorUuid(actorRef);\n  else actor = actorRef;\n  if (!(actor instanceof Actor)) return [];\n  if (actor.token) return [actor.token.object].filter(t => !!t);\n  const tokens = actor.getActiveTokens();\n  if (!tokens.length) return [];\n  const controlled = tokens.filter(t => t.controlled);\n  return controlled.length ? controlled : tokens;\n}\n\nexport function tokenForActor(actor: Actor.Implementation | string | undefined | null): Token | undefined {\n  const tokens = tokensForActor(actor);\n  return tokens[0];\n}\n\nexport async function doConcentrationCheck(actor: Actor.Implementation, saveDC: number) {\n  // actually activity uuids\n  //@ts-expect-error no dnd5e-types\n  const concentratingOnItemNames = Array.from(actor.concentration.items).map((item) => item.name);\n  if (!concentratingOnItemNames.length) concentratingOnItemNames.push(\"No item\");\n\n  const itemDisplayName = `${concentrationCheckItemDisplayName}: ${concentratingOnItemNames.join(\", \")}`;\n  const itemData: Item.CreateData = {\n    name: itemDisplayName,\n    // @ts-expect-error no dnd5e-types\n    type: \"feat\",\n    img: \"./modules/midi-qol/icons/concentrate.png\",\n    system: {\n      activities: {\n        concentrationCheck: {\n          type: \"save\",\n          activation: {\n            type: \"special\",\n          },\n          target: {\n            affects: {\n              choice: false,\n              count: \"\",\n              type: \"self\"\n            },\n            override: true,\n            prompt: false\n          },\n          damage: {\n            parts: [],\n            onSave: \"half\"\n          },\n          save: {\n            // @ts-expect-error no dnd5e-types\n            ability: actor.system.attributes.concentration.ability || \"con\",\n            dc: {\n              calculation: \"\",\n              formula: `${saveDC}`,\n            }\n          },\n          useConditionText: \"\",\n          forceDialog: false,\n          effectConditionText: \"\",\n        }\n      },\n      identifier: \"concentration-check-midi-qol\",\n    },\n    flags: {\n      \"midi-qol\": {\n        onUseMacroName: \"[postActiveEffects]ItemMacro\",\n        isConcentrationCheck: true,\n        noProvokeReaction: true,\n      },\n      dae: {\n        macro: {\n          _id: null,\n          name: \"Concentration Check - Midi QOL\",\n          type: \"script\",\n          author: \"devnIbfBHb74U9Zv\",\n          img: \"icons/svg/dice-target.svg\",\n          scope: \"global\",\n          command: `\n            if (MidiQOL.configSettings().autoCheckSaves === 'none') return;\n            for (let targetUuid of args[0].targetUuids) {\n              let target = await fromUuid(targetUuid);\n              if (MidiQOL.configSettings().removeConcentration && (target.actor.system.attributes.hp.value === 0 || args[0].failedSaveUuids.find(uuid => uuid === targetUuid))) {\n                await target.actor.endConcentration();\n              }\n            }`\n          ,\n          folder: null,\n          sort: 0,\n          flags: {}\n        }\n      }\n    }\n  }\n\n  // foundry.utils.setProperty(itemData, \"name\", itemDisplayName);\n  return await _doConcentrationCheck(actor, itemData)\n}\n\nasync function _doConcentrationCheck(actor: Actor.Implementation, itemData: Item.CreateData) {\n  let result: any;\n  // actor took damage and is concentrating....\n  foundry.utils.setProperty(itemData, `flags.${MODULE_ID}.syntheticItem`, true);\n  let ownedItem = new CONFIG.Item.documentClass(itemData, { parent: actor });\n  ownedItem.prepareData();\n  // @ts-expect-error no dnd5e-types\n  ownedItem.prepareFinalAttributes();\n  try {\n    const midiOptions = { checkGMStatus: true, isConcentrationCheck: true, createWorkflow: true, workflowOptions: { versatile: false, targetConfirmation: \"none\" } }\n    result = await completeItemUse(ownedItem, { midiOptions }, { configure: false }, { systemCard: false }); // worried about multiple effects in flight so do one at a time\n  } catch (err) {\n    const message = \"midi-qol | doConcentrationCheck\";\n    TroubleShooter.recordError(err, message);\n    console.warn(message, err);\n  } finally {\n    return result;\n  }\n}\n\nexport function hasDAE(workflow: Workflow) {\n  return installedModules.get(\"dae\") && (\n    workflow.item.effects?.some(ef => ef?.transfer === false)\n    || workflow.ammunition?.effects?.some(ef => ef?.transfer === false)\n  );\n}\n\n\nexport async function displayDSNForRoll(rolls?: Roll | Roll[], rollType?: string, defaultRollMode?: string) {\n  if (!rolls) return;\n  if (!(rolls instanceof Array)) rolls = [rolls];\n  /*\n  \"midi-qol.hideRollDetailsOptions\": {\n    \"none\": \"None\",\n    \"detailsDSN\": \"Roll Formula but show DSN roll\",\n    \"details\": \"Roll Formula\",\n    \"d20Only\": \"Show attack D20 + Damage total\",\n    \"hitDamage\": \"Show Hit/Miss + damage total\",\n    \"hitCriticalDamage\": \"Show Hit/Miss/Critical/Fumble + damage total\",\n    \"d20AttackOnly\": \"Show attack D20 Only\",\n    \"all\": \"Entire Roll\"\n  },*/\n  const promises: Promise<any>[] = [];\n\n  for (let roll of rolls) {\n    if (dice3dEnabled()) {\n      //@ts-expect-error game.dice3d\n      const dice3d = game.dice3d;\n      let ghostRoll = false;\n      let whisperUsers: User.Implementation[] | null = null;\n      const rollMode = defaultRollMode || game.settings.get(\"core\", \"rollMode\");\n      let hideRoll = false;\n      if (game.user?.isGM) {\n        let dsnSetting: string = \"show\";\n        switch (rollType) {\n          case \"attackRollD20\":\n          case \"attackRoll\":\n            dsnSetting = configSettings.gmAttackDsn ?? \"show\";\n            break;\n          case \"damageRoll\":\n            dsnSetting = configSettings.gmDamageDsn ?? \"show\";\n            break;\n          default:\n            dsnSetting = \"show\";\n            break;\n        }\n        if (dsnSetting === \"none\") {\n          hideRoll = true;\n        } else if (dsnSetting === \"ghost\") {\n          ghostRoll = true;\n        } else if (rollType === \"attackRollD20\") {\n          // For d20-only display, hide non-d20 dice from the animation\n          for (let i = 1; i < roll.dice.length; i++) {\n            roll.dice[i].results.forEach(r => foundry.utils.setProperty(r, \"hidden\", true));\n          }\n        }\n      }\n      if (!ghostRoll) {\n        ghostRoll = rollMode === \"blindroll\";\n      }\n\n      if (rollMode === \"selfroll\" || rollMode === \"gmroll\" || rollMode === \"blindroll\") {\n        whisperUsers = ChatMessage.getWhisperRecipients(\"GM\") as unknown as User[];\n        if (rollMode !== \"blindroll\" && game.user) whisperUsers.concat(game.user as unknown as User);\n      }\n      if (!hideRoll) {\n        let displayRoll = Roll.fromData(JSON.parse(JSON.stringify(roll))); // make a copy of the roll\n        if (game.user?.isGM && configSettings.addFakeDice) {\n          for (let term of displayRoll.terms) {\n            if (term instanceof foundry.dice.terms.Die) {\n              // for attack rolls only add a d20 if only one was rolled - else it becomes clear what is happening\n              if ([\"attackRoll\", \"attackRollD20\"].includes(rollType ?? \"\") && term.faces === 20 && term.number !== 1) continue;\n              let numExtra = Math.ceil((term.number ?? 1) * Math.random());\n              let extraDice = await (new foundry.dice.terms.Die({ faces: term.faces, number: numExtra }).evaluate());\n              term.number = (term.number ?? 1) + numExtra;\n              term.results = term.results.concat(extraDice.results);\n            }\n          }\n        }\n        displayRoll.terms.forEach(term => {\n          if (term.options?.flavor) term.options.flavor = (term.options.flavor as string).toLocaleLowerCase();\n          // @ts-expect-error no dnd5e-types\n          else term.options.flavor = displayRoll.options.type;\n        });\n        if (ghostRoll) {\n          promises.push(dice3d?.showForRoll(displayRoll, game.user, true, ChatMessage.getWhisperRecipients(\"GM\"), !game.user?.isGM));\n          //@ts-expect-error\n          if (game.settings.get(\"dice-so-nice\", \"showGhostDice\")) {\n            // @ts-expect-error\n            displayRoll.ghost = true;\n            promises.push(dice3d?.showForRoll(displayRoll, game.user, true, game.users?.players.map(u => (u as User).id), game.user?.isGM));\n          }\n        } else\n          promises.push(dice3d?.showForRoll(displayRoll, game.user, true, whisperUsers, rollMode === \"blindroll\" && !game.user?.isGM));\n      }\n    }\n\n  }\n  if (promises.length) await Promise.all(promises);\n  //mark all dice as shown - so that toMessage does not trigger additional display on other clients\n  DSNMarkDiceDisplayed(rolls);\n}\n\nexport function DSNMarkDiceDisplayed(rolls: Roll | Roll[]) {\n  if (rolls instanceof Roll) rolls = [rolls];\n  for (let roll of rolls)\n    roll.dice.forEach(d => d.results.forEach(r => foundry.utils.setProperty(r, \"hidden\", true)));\n}\n\nexport function isReactionItem(item?: Item.Implementation): boolean {\n  if (!item) return false;\n  // @ts-expect-error no dnd5e-types\n  return item.system.activities.some(activity => activity.activation?.type?.includes(\"reaction\"));\n}\n\nexport function getCriticalDamage() {\n  return game.user?.isGM ? criticalDamageGM : criticalDamage;\n}\n\nexport function isValidTarget(target: TokenOrDocument): boolean {\n  if (!target.actor) return false; // Tokens without actors are not valid targets\n  // @ts-expect-error no dnd5e-types\n  if (target.actor.type === \"group\") return false;\n  if (target.actor.getFlag(MODULE_ID, \"neverTarget\")) return false;\n  if (target instanceof TokenDocument) {\n    if (target.isSecret) return false;\n    if (target.hidden) return false; // hidden tokens are not valid targets\n  } else {\n    if (target.document.isSecret) return false;\n    if (target.document.hidden) return false; // hidden tokens are not valid targets\n  }\n  return true;\n}\n\nfunction contestedRollFlavor(baseFlavor: string | undefined, rollType: string, ability: string): string {\n  let flavor: string | undefined;\n  if (rollType === \"test\" || rollType === \"abil\") {\n    const label = GameSystemConfig.abilities[ability]?.label ?? ability;\n    flavor = game.i18n?.format(\"DND5E.AbilityPromptTitle\", { ability: label });\n  } else if (rollType === \"save\") {\n    const label = GameSystemConfig.abilities[ability].label;\n    flavor = game.i18n?.format(\"DND5E.SavePromptTitle\", { ability: label });\n  } else if (rollType === \"skill\") {\n    flavor = game.i18n?.format(\"DND5E.SkillPromptTitle\", { skill: GameSystemConfig.skills[ability]?.label ?? \"\" });\n  }\n  return `${baseFlavor ?? i18n(\"midi-qol.ContestedRoll\")} ${flavor}`;\n}\n\nexport function validRollAbility(rollType: string, ability: string): string | undefined {\n  if (typeof ability !== \"string\") return undefined;\n  ability = ability.toLocaleLowerCase().trim();\n  switch (rollType) {\n    case \"test\":\n    case \"abil\":\n    case \"save\":\n      if (GameSystemConfig.abilities[ability]) return ability;\n      return Object.keys(GameSystemConfig.abilities).find(abl => GameSystemConfig.abilities[abl].label.toLocaleLowerCase() === ability.trim().toLocaleLowerCase())\n    case \"skill\":\n      if (GameSystemConfig.skills[ability]) return ability;\n      return Object.keys(GameSystemConfig.skills).find(skl => GameSystemConfig.skills[skl].label.toLocaleLowerCase() === ability.trim().toLocaleLowerCase())\n    default: return undefined;\n  }\n}\n\nexport async function contestedRoll(data: {\n  source: { rollType: string, ability: string, token: TokenOrDocument | string, rollOptions: any },\n  target: { rollType: string, ability: string, token: TokenOrDocument | string, rollOptions: any },\n  displayResults: boolean,\n  itemCardUuid: string,\n  flavor: string,\n  rollOptions: any,\n  success: (results) => {}, failure: (results) => {}, drawn: (results) => {}\n}): Promise<{ result: number | undefined, rolls: any[] }> {\n  const source = data.source;\n  const target = data.target;\n  const sourceToken = getToken(source?.token);\n  const targetToken = getToken(target?.token);\n  const { rollOptions, success, failure, drawn, displayResults, itemCardUuid, flavor } = data;\n\n  let canProceed = true;\n  if (!source || !target || !sourceToken || !targetToken || !source.rollType || !target.rollType || !source.ability || !target.ability || !validRollAbility(source.rollType, source.ability) || !validRollAbility(target.rollType, target.ability)) {\n    error(`contestRoll | source[${sourceToken?.name}], target[${targetToken?.name}], source.rollType[${source.rollType}], target.rollType[${target?.rollType}], source.ability[${source.ability}], target.ability[${target?.ability}] must all be defined`);\n    canProceed = false;\n  }\n  if (![\"test\", \"abil\", \"save\", \"skill\"].includes(source?.rollType ?? \"\")) {\n    error(`contestedRoll | sourceRollType must be one of test/abil/skill/save not ${source.rollType}`);\n    canProceed = false;\n  }\n  if (![\"test\", \"abil\", \"save\", \"skill\"].includes(target?.rollType ?? \"\")) {\n    error(`contestedRoll | target.rollType must be one of test/abil/skill/save not ${target.rollType}`);\n    canProceed = false;\n  }\n  if (!canProceed) return { result: undefined, rolls: [] }\n\n  const sourceDocument = sourceToken!.document;\n  const targetDocument = targetToken!.document;\n\n  source.ability = validRollAbility(source.rollType, source.ability) ?? \"\";\n  target.ability = validRollAbility(target.rollType, target.ability) ?? \"\";\n\n  let player1 = playerFor(sourceToken);\n  if (!player1?.active) player1 = preferredActiveGM();\n  let player2 = playerFor(targetToken);\n  if (!player2?.active) player2 = preferredActiveGM();\n  if (!player1 || !player2) return { result: undefined, rolls: [] };\n  // Normalize roll types for SaveDetails\n  const normalizeRollType = (rt: string): string => {\n    if (rt === \"abil\" || rt === \"test\") return \"check\";\n    return rt.trim();\n  };\n\n  // Build SaveDetails for each participant\n  const buildContestedSaveDetails = (\n    actorUuid: string,\n    rollType: string,\n    abilityOrSkill: string\n  ): SaveDetails => {\n    const normalizedType = normalizeRollType(rollType);\n    const isSkill = rollType === \"skill\";\n    return {\n      actorUuid,\n      advantage: undefined,\n      disadvantage: undefined,\n      modifierTracker: undefined,\n      isFriendly: false,\n      isMagicSave: false,\n      isConcentrationCheck: undefined,\n      rollDC: 0,\n      saveItemUuid: \"\",\n      workflowId: \"\",\n      itemCardUuid: itemCardUuid ?? \"\",\n      workflowOptions: {},\n      rollType: normalizedType,\n      rollAbilities: isSkill ? [] : [abilityOrSkill.trim()],\n      rollSkills: isSkill ? [abilityOrSkill.trim()] : [],\n      rollTools: [],\n      itemId: \"\",\n    };\n  };\n\n  const sourceSaveDetails = buildContestedSaveDetails(\n    sourceDocument?.actor?.uuid ?? \"\",\n    source.rollType,\n    source.ability\n  );\n  const targetSaveDetails = buildContestedSaveDetails(\n    targetDocument?.actor?.uuid ?? \"\",\n    target.rollType,\n    target.ability\n  );\n\n  const resultPromises = [\n    socketlibSocket.executeAsUser(\"rollAbility\", player1.id, {\n      saveDetails: sourceSaveDetails,\n      displayOptions: { chatMessage: true }\n    }),\n    socketlibSocket.executeAsUser(\"rollAbility\", player2.id, {\n      saveDetails: targetSaveDetails,\n      displayOptions: { chatMessage: true }\n    }),\n  ];\n\n  let results = await Promise.all(resultPromises);\n  let roll1 = results[0];\n  let roll2 = results[1];\n  if (roll1 instanceof Array) roll1 = roll1[0];\n  if (roll2 instanceof Array) roll2 = roll2[0];\n  let result: number | undefined = roll1.total - roll2.total;\n  if (isNaN(result)) result = undefined;\n  if (displayResults !== false) {\n    let resultString: string;\n    if (result === undefined) resultString = \"\";\n    else resultString = result > 0 ? i18n(\"midi-qol.save-success\") : result < 0 ? i18n(\"midi-qol.save-failure\") : result === 0 ? i18n(\"midi-qol.save-drawn\") : \"no result\"\n    const skippedString = i18n(\"midi-qol.Skipped\");\n    const content = `${flavor ?? i18n(\"midi-qol.ContestedRoll\")} ${resultString} ${roll1.total ?? skippedString} ${i18n(\"midi-qol.versus\")} ${roll2.total ?? skippedString}`;\n    displayContestedResults(itemCardUuid, content, ChatMessage.getSpeaker({ token: sourceToken }), flavor);\n  }\n\n  const rollsToReturn = [roll1, roll2];\n  if (result === undefined) return { result, rolls: rollsToReturn };\n  if (result > 0 && success) success(rollsToReturn);\n  else if (result < 0 && failure) failure(rollsToReturn);\n  else if (result === 0 && drawn) drawn(rollsToReturn)\n  return { result, rolls: rollsToReturn };\n}\n\nfunction displayContestedResults(chatCardUuid: string | undefined, resultContent: string, speaker: ChatMessage.SpeakerData, flavor: string | undefined) {\n  let itemCard = (getCachedDocument(chatCardUuid) ?? fromUuidSync(chatCardUuid)) as ChatMessage.Implementation | undefined;\n  if (itemCard) {\n    let content: string = foundry.utils.duplicate(itemCard.content ?? \"\")\n    const searchRE = /<div class=\"midi-qol-saves-display\">[\\s\\S]*?<div class=\"end-midi-qol-saves-display\">/;\n    const replaceString = `<div class=\"midi-qol-saves-display\">${resultContent}<div class=\"end-midi-qol-saves-display\">`;\n    content = content.replace(searchRE, replaceString);\n    itemCard.update({ content });\n  } else {\n    // const title = `${flavor ?? i18n(\"miidi-qol:ContestedRoll\")} results`;\n    ChatMessage.create({ content: `<p>${resultContent}</p>`, speaker });\n  }\n}\n\nexport function hasWallBlockingCondition(target: TokenOrDocument): boolean {\n  return globalThis.MidiQOL.WallsBlockConditions.some(cond => hasCondition(target.actor, cond));\n}\n\nexport function getActor(actorRef?: Actor.Implementation | TokenOrDocument | string | null): Actor.Implementation | undefined | null {\n  if (!actorRef) return null;\n  const entity = (typeof actorRef === \"string\") ? fromUuidSync(actorRef) : actorRef;\n  if (entity instanceof Actor) return entity;\n  if (entity instanceof Token) return entity.actor;\n  if (entity instanceof TokenDocument) return entity.actor;\n  if (entity instanceof Item && entity.parent instanceof Actor) return entity.parent;\n  if (entity instanceof ActiveEffect && entity.parent instanceof Actor) return entity.parent;\n  if (entity instanceof ActiveEffect && entity.parent instanceof Item && entity.parent.parent instanceof Actor) return entity.parent.parent;\n  return null;\n}\n\nexport function getTokenDocument(tokenRef?: Actor.Implementation | TokenOrDocument | string | null): TokenDocument.Implementation | undefined {\n  if (!tokenRef) return undefined;\n  const entity = (typeof tokenRef === \"string\") ? fromUuidSync(tokenRef) : tokenRef;\n  if (entity instanceof TokenDocument) return entity;\n  if (entity instanceof Token) return entity.document;\n  if (entity instanceof Actor) return tokenForActor(entity)?.document;\n  return undefined;\n}\n\nexport function getToken(tokenRef?: Actor.Implementation | TokenOrDocument | string | null): Token.Implementation | undefined {\n  if (!tokenRef) return undefined;\n  const entity = (typeof tokenRef === \"string\") ? fromUuidSync(tokenRef) : tokenRef;\n  if (entity instanceof Token) return entity;\n  if (entity instanceof TokenDocument) return entity.object ?? undefined;\n  if (entity instanceof Actor) return tokenForActor(entity);\n  if (entity instanceof Item && entity.parent instanceof Actor) return tokenForActor(entity.parent);\n  if (entity instanceof ActiveEffect && entity.parent instanceof Actor) return tokenForActor(entity.parent);\n  if (entity instanceof ActiveEffect && entity.parent instanceof Item && entity.parent.parent instanceof Actor) return tokenForActor(entity.parent?.parent);\n  return undefined;\n}\n\nexport function getPlaceable(tokenRef?: Actor.Implementation | TokenOrDocument | string | foundry.canvas.placeables.PlaceableObject | undefined): foundry.canvas.placeables.PlaceableObject | undefined | null {\n  if (!tokenRef) return undefined;\n  const entity = (typeof tokenRef === \"string\") ? fromUuidSync(tokenRef) : tokenRef;\n  if (entity instanceof foundry.canvas.placeables.PlaceableObject) return entity;\n  if (entity instanceof Actor) return tokenForActor(entity);\n  if (entity instanceof Item && entity.parent instanceof Actor) return tokenForActor(entity.parent);\n  if (entity instanceof ActiveEffect && entity.parent instanceof Actor) return tokenForActor(entity.parent);\n  if (entity instanceof ActiveEffect && entity.parent instanceof Item && entity.parent.parent instanceof Actor) return tokenForActor(entity.parent?.parent);\n  if (entity instanceof TokenDocument) return entity.object ?? undefined;\n  return undefined;\n}\n\nexport function calcTokenCover(attacker: TokenOrDocument, target: TokenOrDocument): number {\n  const attackerToken = getToken(attacker);\n  const targetToken = getToken(target);\n\n  //@ts-expect-error .coverCalc\n  const coverCalc = attackerToken?.coverCalculator;\n  if (!attackerToken || !targetToken || !coverCalc) {\n    let message = \"midi-qol | calcTokenCover | failed\";\n    if (!coverCalc)\n      message += \" tokencover not installed or cover calculator not found\";\n    if (!attackerToken)\n      message += \" atacker token not valid\";\n    if (!targetToken)\n      message += \" target token not valid\";\n    const err = new Error(\"calcTokenCover failed\");\n    TroubleShooter.recordError(err, message);\n    console.warn(message, err);\n    return 0;\n  }\n  let targetCover = coverCalc.targetCover(target);\n  return targetCover;\n}\n\nconst MaxNameLength = 20;\nexport function getLinkText(entity?: TokenOrDocument | Actor.Implementation | Item.Implementation | null) {\n  if (!entity) return \"<unknown>\";\n  let name = entity.name ?? \"unknown\";\n  if (entity instanceof Token && !configSettings.useTokenNames) name = entity.actor?.name ?? name;\n  const uuid = entity instanceof Token ? entity.document.uuid : entity.uuid;\n  if (entity instanceof Token) return `@UUID[${uuid}]{${name.slice(0, MaxNameLength - 5)}}`;\n  return `@UUID[${uuid}]{${name?.slice(0, MaxNameLength - 5)}}`;\n}\n\nexport function getTokenName(entity?: TokenOrDocument | null): string {\n  const token = getToken(entity);\n  if (!token) return \"<unknown>\";\n  return getTokenNameExact(token) ?? \"<unkown>\";\n}\n\nexport function getTokenNameExact(entity?: Token.Implementation): string | undefined {\n  // Somehow?\n  if (!(entity instanceof Token)) return undefined;\n  let name: string;\n  if (configSettings.useTokenNames) name = entity.name ?? entity.actor?.name ?? \"<unknown>\";\n  else name = entity.actor?.name ?? entity.name ?? \"<unknown>\";\n  const suffix = safeGetGameSetting(\"hide-npc-names\", \"tokenHiddenSuffix\");\n  if (suffix) name = name.replace(` ${suffix}`, \"\");\n  return name;\n}\n\nexport function getIconFreeLink(entity?: TokenOrDocument | Item | Actor | null) {\n  if (!entity) return \"<unknown>\";\n  let name = entity.name ?? \"unknown\";\n  if (entity instanceof Token && !configSettings.useTokenNames) name = entity.actor?.name ?? name;\n  if (entity instanceof Token) {\n    return name;\n    // return `<a class=\"content-link midi-qol\" data-uuid=\"${entity.actor?.uuid}\">${name?.slice(0, MaxNameLength)}</a>`;\n  } else {\n    return name;\n    // return `<a class=\"content-link midi-qol\" data-uuid=\"${entity.uuid}\">${name?.slice(0, MaxNameLength)}</a>`\n  }\n}\n\n/**\n * Creates a proxy around canvas.grid that makes it behave like a SquareGrid.\n * Used for griddedGridless mode to apply square grid measurement rules to gridless scenes.\n * @returns A proxy that redirects grid methods to SquareGrid.prototype\n */\nexport function createSquareGridProxy(): foundry.grid.BaseGrid {\n  if (!canvas.grid) throw new Error(\"createSquareGridProxy called without canvas.grid\");\n  const diagonals = safeGetGameSetting(\"core\", \"gridDiagonals\");\n  const canvasGridProxy: foundry.grid.BaseGrid = new Proxy(canvas.grid, {\n    get: function (target, prop, _receiver) {\n      if (foundry.grid.SquareGrid.prototype[prop] instanceof Function) {\n        return foundry.grid.SquareGrid.prototype[prop].bind(canvasGridProxy);\n      } else if (prop === \"diagonals\") {\n        return diagonals;\n      } else if (prop === \"isSquare\") return true;\n      else if (prop === \"isGridless\") return false;\n      else if (prop === \"isHex\") return false;\n      return Reflect.get(target, prop);\n    }\n  });\n  return canvasGridProxy;\n}\n\nexport function midiMeasureDistances(segments: { ray: Ray }[], options: any = {}) {\n  let isGridless = canvas.grid?.constructor.name === \"GridlessGrid\";\n  if (!isGridless || !options.gridSpaces || !configSettings.griddedGridless || !canvas.grid) {\n    return segments.map(s => canvas.grid?.measurePath([s.ray.A, s.ray.B], {})).map(d => d?.distance ?? 0);\n  }\n  if (!canvas.grid) return [0];\n  const diagonals = safeGetGameSetting(\"core\", \"gridDiagonals\");\n  const canvasGridProxy = createSquareGridProxy();\n  const GridDiagonals = CONST.GRID_DIAGONALS;\n  // First snap the poins to the nearest center point for equidistant/1,2,1/2,1,2\n  // I expected this would happen automatically in the proxy call - but didn't and not sure why.\n  if ([GridDiagonals.APPROXIMATE, GridDiagonals.EQUIDISTANT, GridDiagonals.ALTERNATING_1, GridDiagonals.ALTERNATING_2].includes(diagonals)) {\n    segments = segments.map(s => {\n      const gridPosA = canvasGridProxy.getOffset(s.ray.A);\n      const aCenter = canvasGridProxy.getCenterPoint(gridPosA);\n      const gridPosB = canvasGridProxy.getOffset(s.ray.B);\n      const bCenter = canvasGridProxy.getCenterPoint(gridPosB);\n      return { ray: new foundry.canvas.geometry.Ray(aCenter, bCenter) };\n    });\n  }\n  let distances = segments.map(s => canvasGridProxy.measurePath([s.ray.A, s.ray.B], {}));\n  return distances.map(d => {\n    let distance = d.distance;\n    let fudgeFactor = configSettings.gridlessFudge ?? 0;\n    switch (diagonals) {\n      case GridDiagonals.EQUIDISTANT:\n      case GridDiagonals.ALTERNATING_1:\n      case GridDiagonals.ALTERNATING_2:\n        // already fudged by snapping so no extra adjustment\n        break;\n      case GridDiagonals.EXACT:\n      case GridDiagonals.RECTILINEAR:\n        // @ts-expect-error yes it does\n        if (d.diagonals > 0)\n          distance = Math.max(0, d.distance - (Math.SQRT2 * fudgeFactor));\n        else distance = Math.max(0, d.distance - fudgeFactor);\n        break;\n      case GridDiagonals.APPROXIMATE:\n        // @ts-expect-error yes it does\n        if (d.diagonals > 0)\n          distance = Math.max(0, d.distance - fudgeFactor);\n        break;\n      case GridDiagonals.ILLEGAL:\n      default:\n        distance = d.distance;\n    }\n    return distance;\n  });\n}\n\nexport function getActivityAutoTargetAction(activity?: Activity): string {\n  const item = activity?.item;\n  if (!item) return configSettings.autoTarget;\n  const autoTarget = activity.midiProperties?.autoTargetAction;\n  if (!autoTarget || autoTarget === \"default\") return configSettings.autoTarget;\n  return autoTarget;\n}\n\nexport function getAoETargetType(activity: Activity): string {\n  let AoETargetType: string = \"any\";\n  // think about special = allies, self = all but self and any means everyone.\n  const activityTarget = activity.target;\n  if (activityTarget) {\n    if (activityTarget.affects.type === \"ally\") AoETargetType = \"ally\";\n    if (activityTarget.affects.type === \"enemy\") AoETargetType = \"enemy\";\n    if (activityTarget.affects.type === \"creature\") AoETargetType = \"any\";\n  }\n  if (activity.midiProperties?.autoTargetType !== \"any\") {\n    AoETargetType = activity.midiProperties?.autoTargetType ?? \"\";\n  }\n  return AoETargetType;\n}\n\nexport function hasAutoPlaceTemplate(item: Item.Implementation): boolean {\n  // @ts-expect-error no dnd5e-types\n  return item && item.hasAreaTarget && [\"self\", undefined].includes(item.system.range?.units) && [\"radius\", \"squareRadius\"].includes(item.system.target?.type);\n}\n\nexport function activityHasAutoPlaceTemplate(activity: Activity) {\n  return activity && [\"self\", undefined].includes(activity.range?.units) && [\"radius\", \"squareRadius\"].includes(activity.target?.template.type);\n}\n\nexport function activityHasEmanationNoTemplate(activity: Activity) {\n  return activity && activity.target?.template.type === \"emanationNoTemplate\";\n}\n\nexport function addRollTo(roll: Roll, bonusRoll: Roll | Roll.Evaluated<Roll.Any>): Roll {\n  const OperatorTerm = foundry.dice.terms.OperatorTerm;\n  if (!bonusRoll) return roll;\n  if (!roll) return bonusRoll;\n  //@ts-expect-error protected\n  if (!roll._evaluated) roll = roll.clone().evaluate({ async: false }); // V12\n  else {\n    for (let term of roll.terms) {\n      //@ts-expect-error protected\n      if (!term._evaluated && term instanceof OperatorTerm) {\n        term.evaluate();\n      }\n    }\n  }\n  //@ts-expect-error protected\n  if (!bonusRoll._evaluated) bonusRoll = bonusRoll.clone().evaluate({ async: false }) // V12\n  let terms;\n  for (let term of bonusRoll.terms) {\n    //@ts-expect-error protected\n    if (!term._evaluated && term instanceof OperatorTerm) {\n      term.evaluate();\n    }\n  }\n  if (bonusRoll.terms[0] instanceof OperatorTerm) {\n    terms = roll.terms.concat(bonusRoll.terms);\n  } else {\n    const operatorTerm = new OperatorTerm({ operator: \"+\" });\n    // v13 not required operatorTerm.evaluate();\n    terms = roll.terms.concat([operatorTerm]);\n    terms = terms.concat(bonusRoll.terms);\n  }\n  //@ts-expect-error\n  let newRoll = roll.constructor.fromTerms(terms);\n  newRoll.resetFormula();\n  newRoll.options = roll.options;\n  return newRoll;\n}\n\nexport async function chooseEffect({ actor, token, item, workflow, options }: {\n  actor: Actor.Implementation;\n  token: Token.Implementation;\n  item: Item.Implementation;\n  workflow: Workflow;\n  options?: {\n    chooseAll?: boolean;\n    timeout?: number;\n  }\n}) {\n  if (!item) return false;\n  const effects = item.effects.filter(\n    (e) => !e.transfer && !!(options?.chooseAll || e.flags?.dae?.dontApply)\n  );\n  if (effects.length === 0) {\n    if (debugEnabled > 0)\n      warn(`chooseEffect | no effects found for ${item.name}`);\n    return false;\n  }\n  let targets = workflow.effectTargets;\n  let origin = effects[0].uuid; // item?.uuid;\n  if (workflow?.chatCard.getFlag(\"dnd5e\", \"use.concentrationId\")) {\n    origin = workflow.actor.effects.get(workflow.chatCard.getFlag(\"dnd5e\", \"use.concentrationId\") ?? \"\")?.uuid ?? item?.uuid;\n  }\n  if (!targets || targets.size === 0) return;\n\n  const { DialogV2 } = foundry.applications.api;\n  const timeout = options?.timeout ?? configSettings.reactionTimeout ?? defaultTimeout;\n  let timeRemaining = timeout;\n  let second1TimeoutId: NodeJS.Timeout;\n  let timeoutId: NodeJS.Timeout;\n\n  const titleBase = `${i18n('CONTROLS.CommonSelect')} ${i18n('DOCUMENT.ActiveEffect')}`;\n  const targetContent = `<p style=\"text-align:center\"><b>${i18n('EFFECT.StatusTarget')}: [</b>${[...targets].map((t) => t.name)}<b>]</b></p>`;\n\n  const buttons = effects.map(effect => ({\n    action: effect.uuid,\n    label: effect.name,\n    callback: () => effect,\n  }));\n\n  const chosenEffect = await DialogV2.wait({\n    window: { title: `${titleBase}: ${timeRemaining}s` },\n    classes: [\"midi-qol-choose-effect\"],\n    position: { width: 220 },\n    content: targetContent,\n    buttons,\n    render: (_event, dialog) => {\n      dialog.element.querySelectorAll<HTMLButtonElement>(\".form-footer button\").forEach((btn) => {\n        const eff = fromUuidSync(btn.dataset.action ?? \"\") as ActiveEffect;\n        if (!eff) return;\n        const img = document.createElement('img');\n        img.src = eff.img as string;\n        const span = btn.querySelector(\"span\");\n        if (span) span.dataset.tooltip = eff.name;\n        btn.prepend(img);\n      });\n      // Start countdown timer\n      const titleEl = dialog.element.querySelector(\".window-title\");\n      const set1SecondTimeout = function () {\n        second1TimeoutId = setTimeout(() => {\n          if (!timeoutId) return;\n          timeRemaining -= 1;\n          if (titleEl) titleEl.textContent = `${titleBase}: ${timeRemaining}s`;\n          if (timeRemaining > 0) set1SecondTimeout();\n        }, 1000);\n      };\n      timeoutId = setTimeout(() => {\n        if (debugEnabled > 0) warn(`chooseEffect | timeout fired closing dialog`);\n        clearTimeout(second1TimeoutId);\n        dialog.close();\n      }, timeout * 1000);\n      set1SecondTimeout();\n    },\n    close: () => {\n      clearTimeout(timeoutId);\n      clearTimeout(second1TimeoutId);\n    },\n  });\n\n  if (!chosenEffect || !(chosenEffect instanceof ActiveEffect)) return false;\n\n  const effectData = chosenEffect.toObject();\n  effectData.origin = item.uuid;\n  foundry.utils.setProperty(effectData, \"flags.dae.dontApply\", false);\n  const applyItem = item.clone({ effects: [effectData] }, { keepId: true })\n  await globalThis.DAE.doEffects(\n    applyItem, true, targets, {\n    damageTotal: 0,\n    origin,\n    critical: false,\n    fumble: false,\n    itemCardUuid: \"\",\n    metaData: {},\n    selfEffects: \"none\",\n    // @ts-expect-error no dnd5e-types\n    spellLevel: (workflow?.spellLevel ?? applyItem.level ?? 0),\n    toggleEffect: workflow?.activity.midiProperties?.toggleEffect,\n    tokenUuid: token.document.uuid,\n    actorUuid: actor.uuid,\n    whisper: false,\n    workflowOptions: workflow?.workflowOptions,\n    context: {\n    }\n  });\n  if (chosenEffect.toObject()) {\n    if (debugEnabled)\n      warn(\n        `chooseEffect | applying effect ${chosenEffect.name} to ${targets.size} targets`,\n        targets\n      );\n  }\n  return chosenEffect;\n}\n\nexport function canSee(tokenEntity: TokenOrDocument, targetEntity: TokenOrDocument) {\n  const NON_SIGHT_CONSIDERED_SIGHT = [\"blindsight\"];\n  const detectionModes = CONFIG.Canvas.detectionModes;\n  const sightDetectionModes = Object.keys(detectionModes).filter(\n    (d) =>\n      detectionModes[d].type === foundry.canvas.perception.DetectionMode.DETECTION_TYPES.SIGHT ||\n      NON_SIGHT_CONSIDERED_SIGHT.includes(d)\n  );\n  return canSense(tokenEntity, targetEntity, sightDetectionModes);\n}\n\nexport function sumRolls(rolls: Array<Roll> | undefined = [], countHealing?: \"ignore\" | \"negative\" | \"positive\" | \"negativeIgnoreTemp\" | \"positiveIgnoreTemp\"): number {\n  if (!rolls) return 0;\n  if (countHealing === undefined) countHealing = \"positive\";\n  return rolls.reduce((total, roll) => {\n    // @ts-expect-error no dnd5e-types\n    const type = roll.options.type;\n    if (type === \"midi-none\") return total;\n    if ([\"temphp\"].includes(type) && countHealing === \"negativeIgnoreTemp\") return total;\n    if ([\"temphp\"].includes(type) && countHealing === \"positiveIgnoreTemp\") return total;\n    if ([\"temphp\", \"healing\"].includes(type) && countHealing === \"ignore\") return total;\n    if ([\"temphp\", \"healing\"].includes(type) && countHealing?.startsWith(\"negative\")) return total - (roll?.total ?? 0);\n    return total + (roll?.total ?? 0);\n  }, 0);\n}\n\n/* Looks like this is not needed\nconst updateSemaphore = new foundry.utils.Semaphore(1);\nasync function _updateActionS(document: foundry.abstract.Document.Any) {\n  await updateSemaphore.add(_updateActionS, document);\n}\nexport async function asyncGetCachedDocument(uuid: string | undefined | null): Promise<ChatMessage.Implementation | undefined> {\n  if (!uuid) return undefined;\n  if (DebounceInterval) return updateSemaphore.add(getCachedDocument, uuid);\n}\n*/\n\nexport function getThrottlingFunction(): (document: foundry.abstract.Document.Any, updates: ChatMessage.UpdateData) => Promise<void> {\n  return foundry.utils.throttle(_updateAction, debounceInterval) as (document: foundry.abstract.Document.Any, updates: ChatMessage.UpdateData) => Promise<void>;\n}\nexport const updatesCache = {};\nasync function _updateAction(document: foundry.abstract.Document.Any, updates: ChatMessage.UpdateData) {\n  if (!updates) {\n    if (debugEnabled > 0) warn(`_updateAction | No updates found for ${document.uuid}`);\n    return document;\n  }\n  const baseDocument = fromUuidSync(document.uuid) as ChatMessage.Implementation;\n  if (!baseDocument) {\n    console.warn(`midi-qol | _updateAction | baseDocument not found for ${document.uuid}`);\n    return document;\n  }\n  /* Simulate a slow machine\n     updates are passed to the update call - effectively copied at that point.\n     Then there are no changes to the chat card until the call returns.\n     This creates an opportunity for changes to cached updates which can then be lost if they are cleared\n     */\n  const updateDelay = 0;\n  if (debugEnabled) warn(\"_updateAction | Starting for\", Date.now(), updates)\n  delete updates._id\n  if (updateDelay) {\n    await busyWait(updateDelay); // let other stuff happen.\n  }\n  //console.warn(\"Doing chat update\", foundry.utils.duplicate(updates));\n  await baseDocument?.update(updates);\n  if (updateDelay) {\n    await busyWait(updateDelay); // let other stuff happen.\n  }\n  updatesCache[baseDocument.uuid] = foundry.utils.diffObject(updates, updatesCache[baseDocument.uuid] ?? {});\n  if (debugEnabled > 1 && updates.content && updatesCache[baseDocument.uuid]?.content)\n    warn(\"_updateAction | queued content differences \", diffStringsFull(updates.content, updatesCache[baseDocument.uuid].content, { ignoreWhitespace: true, ignoreNewlines: true }));\n  if (debugEnabled) warn(\"_updateAction | post update updatesCache\", Date.now(), updates);\n}\n\n// NOTE: Typed as a ChatMessage since that's all we use it for\nexport async function throttledUpdate(document: ChatMessage.Implementation, updates: ChatMessage.UpdateData, throttlingFunc: undefined | ((document: ChatMessage.Implementation, updates: ChatMessage.UpdateData) => Promise<void>) = undefined, immediate = false) {\n  if (!document) return; // ChatCard was removed already?;\n  updates = foundry.utils.expandObject(updates) as typeof updates;\n  updates = foundry.utils.mergeObject((updatesCache[document.uuid] ?? {}), updates, { inplace: false, overwrite: true })\n  updatesCache[document.uuid] = updates;\n  if (!debounceInterval || immediate || !throttlingFunc) {\n    if (debugEnabled > 0) warn(`throttledU[date] | immediate update for ${document.uuid}`, updates);\n    return await _updateAction(document, foundry.utils.duplicate(updates) as ChatMessage.UpdateData);\n  }\n  return await throttlingFunc(document, foundry.utils.duplicate(updates) as ChatMessage.UpdateData);\n}\nexport function getUpdatesCache(uuid: string | undefined | null) {\n  if (!uuid) return {};\n  return updatesCache[uuid] ?? {};\n}\n\nexport function addUpdatesCacheFlags(uuid: string | undefined | null, updates: any, prepend = MODULE_ID) {\n  if (!uuid) return;\n  if (prepend) updates = { [prepend]: updates };\n  updates = foundry.utils.expandObject({ flags: updates });\n  updatesCache[uuid] = foundry.utils.mergeObject(updatesCache[uuid] ?? {}, updates, { insertKeys: true, insertValue: true });\n}\n\nexport function addUpdatesCache(uuid: string | undefined | null, updates: any) {\n  if (!uuid) return;\n  updatesCache[uuid] = foundry.utils.mergeObject(updatesCache[uuid] ?? {}, updates, { insertKeys: true, insertValue: true });\n}\n\nexport function clearUpdatesCache(uuid: string | undefined | null) {\n  if (!uuid) return;\n  delete updatesCache[uuid];\n}\n\n\nexport function getCachedDocument(uuid: string | undefined | null) {\n  if (!uuid) return undefined;\n  let document = fromUuidSync(uuid) as ChatMessage.Implementation;\n  let updates = document?.uuid && updatesCache[document.uuid as string];\n  if (!foundry.utils.isEmpty(updates))\n    //@ts-expect-error no dnd5e-types - changes not in fvtt types\n    document = document.clone(updates, { changes: updates, keepId: true }) as ChatMessage.Implementation;\n  return document;\n}\n\nexport function isEffectExpired(effect: ActiveEffect.Implementation): boolean {\n  if (installedModules.get(\"times-up\") && globalThis.TimesUp.isEffectExpired) {\n    return globalThis.TimesUp.isEffectExpired(effect);\n  }\n  // TODO find out how to check some other module can delete expired effects\n  // return effect.updateDuration().remaining ?? false;\n  // @ts-expect-error types doesn't realize\n  return effect.duration.remaining <= 0;\n}\n\nexport async function expireEffects(actor: Actor.Implementation, effects: ActiveEffect.Implementation[], options: any): Promise<any> {\n  if (!effects) return {};\n  const actorEffectsToDelete: string[] = [];\n  const effectsToDelete: ActiveEffect[] = [];\n  const effectsToDisable: ActiveEffect[] = [];\n  for (let effect of effects) {\n    if (!effect.id) continue;\n    if (!fromUuidSync(effect.uuid)) continue;\n    if (effect.transfer)\n      effectsToDisable.push(effect);\n    else if (effect.parent instanceof Actor)\n      actorEffectsToDelete.push(effect.id);\n    else if (effect.parent instanceof Item) // this should be enchantments\n      effectsToDelete.push(effect);\n  }\n  if (actorEffectsToDelete.length > 0) {\n    await actor.deleteEmbeddedDocuments(\"ActiveEffect\", actorEffectsToDelete, options);\n  }\n  if (effectsToDisable.length > 0) {\n    for (let effect of effectsToDisable) {\n      await effect.update({ \"disabled\": true }, options)\n    }\n  }\n  if (effectsToDelete.length > 0) {\n    for (let effect of effectsToDelete)\n      await effect.delete(options);\n  }\n  return { deleted: actorEffectsToDelete, disabled: effectsToDisable, itemEffects: effectsToDelete };\n}\n\nexport async function processConcentrationRequestMessage(message: ChatMessage.Implementation, html: HTMLElement, data) {\n  if (configSettings.doConcentrationCheck !== \"chat\") return;\n  let elt = html.querySelectorAll<HTMLElement>(\"[data-action=concentration]\");\n  const hasRolled = foundry.utils.getProperty(message, `flags.${MODULE_ID}.concentrationRolled`);\n  if (hasRolled || !preferredActiveGM()?.isSelf) return;\n  if (elt.length === 1 && !hasRolled) {\n    let { action, dc: dcStr, type } = elt[0].dataset;\n    let token: Token.Implementation | undefined, actor: Actor.Implementation | undefined | null;\n    if (action === \"concentration\" && type === \"midi-concentration\") {\n      let dc = Number(dcStr);\n      let { actor: actorId, alias, scene, token: tokenId } = message.speaker;\n      if (scene && tokenId) token = game.scenes?.get(scene)?.tokens.get(tokenId) as Token.Implementation | undefined;\n      if (token) actor = token.actor;\n      if (!actor && actorId) actor = game.actors?.get(actorId);\n      if (actor) {\n        await message.setFlag(MODULE_ID, \"concentrationRolled\", true);\n        const user = playerForActor(actor);\n        if (user?.active) {\n          socketlibSocket.executeAsUser(\"rollConcentration\", user.id, { actorUuid: actor.uuid, target: dc, create: true, rollMode: \"gmroll\" });\n          // @ts-expect-error no dnd5e-types\n        } else actor.rollConcentration({ legacy: false, target: dc }, {}, { create: true, rollMode: \"gmroll\" });\n      }\n    }\n  }\n}\n\nexport function setRollOperatorEvaluated(roll: Roll) {\n  // @ts-expect-error protected\n  if (!roll._evaluated) return roll;\n  roll.terms.forEach(t => {\n    // @ts-expect-error protected\n    if (!t._evaluated) t.evaluate();\n  })\n}\nexport function doSyncRoll(roll: Roll, source: string | undefined) {\n\n  if (!roll.isDeterministic) {\n    error(`%c doSyncRoll | dice expressions not supported in v12 [${roll.formula}] and will be ignored ${source}`, \"color:red;\");\n    return new Roll(\"0\").evaluateSync();\n  } else\n    return roll.evaluateSync()\n}\n\n// TODO: See if there's a cleaner way of doing these\nexport function setRollMinDiceTerm(roll: Roll, minValue: number, count = 1) {\n  for (const [i, d] of roll.dice.entries()) {\n    if (i >= count) break;\n    d.results.forEach(r => {\n      if (r.result < minValue) r.result = Math.min(minValue, d.faces ?? 1);\n    });\n  };\n  //@ts-expect-error\n  roll._total = roll._evaluateTotal();\n  return roll;\n}\n\nexport function setRollMaxDiceTerm(roll: Roll, maxValue: number, count = 1) {\n  for (const [i, d] of roll.dice.entries()) {\n    if (i >= count) break;\n    d.results.forEach(r => {\n      if (r.result > maxValue) r.result = Math.max(1, maxValue);\n    });\n  };\n  //@ts-expect-error\n  roll._total = roll._evaluateTotal();\n  return roll;\n}\n\nexport async function addDependent(document: foundry.abstract.Document.Any, dependent: foundry.abstract.Document.Any) {\n  if (!document?.uuid) {\n    error(`midi-addDependent | document ${document?.name} does not have an uuid`);\n    return;\n  }\n  if (!dependent?.uuid) {\n    error(`midi-addDependent | dependent ${dependent?.name} does not have an uuid`);\n    return;\n  }\n\n  // Always use dnd5e's dependent system - dnd5e's DependentDocumentMixin handles tracking\n  // When the parent (Actor/Item/Effect/Template) is deleted, midi-qol's hooks handle cleanup\n  //@ts-expect-error\n  if (game.user?.isGM || dependent.isOwner) {\n    //@ts-expect-error\n    return dependent.setFlag(\"dnd5e\", \"dependentOn\", document.uuid);\n  } else {\n    return unTimedExecuteAsGM(\"addDependent\", { documentUuid: document.uuid, dependentUuid: dependent.uuid });\n  }\n}\n\nexport async function addConcentrationDependent(actorRef: TokenOrDocument | Actor.Implementation | string, dependent: foundry.abstract.Document.Any, item?: Item.Implementation) {\n  if (dependent instanceof Token) dependent = dependent.document;\n  if (!dependent.uuid) {\n    console.warn(`midi-qol | addConcentrationDependent | dependent ${dependent?.name} must have a uuid`);\n    return undefined;\n  }\n  const actor = getActor(actorRef);\n  if (!actor) {\n    console.warn(`midi-qol | addConcentrationDependent | actor not found for ${actorRef}`);\n    return undefined;\n  }\n\n  if (!item) {\n    log(\"addConcentrationDependent | item not supplied - using any concentration effect\");\n  }\n  const concentrationEffect = getConcentrationEffect(actor, item);\n  if (!concentrationEffect) {\n    console.warn(`midi-qol | addConcentrationDependent | dnd5e concentration effect not found for ${actor.name} ${item?.name ?? \"no item\"}`);\n    return undefined;\n  }\n  if (game.user?.isGM || actor.isOwner) {\n    //@ts-expect-error dnd5e.dependentOn\n    return dependent.setFlag(\"dnd5e\", \"dependentOn\", concentrationEffect.uuid)\n  } else\n    return unTimedExecuteAsGM(\"addDependent\", { documentUuid: concentrationEffect.uuid, dependentUuid: dependent.uuid });\n}\n\nexport function getAppliedEffects(actor: Actor.Implementation | null | undefined, { includeEnchantments }: { includeEnchantments: boolean }) {\n  if (!actor) return [];\n  let effects = actor.appliedEffects;\n  if (includeEnchantments) {\n    // @ts-expect-error no dnd5e-types\n    const enchantments = actor.items.contents.flatMap(i => i.effects.contents).filter(ae => ae.isAppliedEnchantment);\n    effects = effects.concat(enchantments);\n  }\n  return effects;\n}\n\nexport function getCEEffectByName(name: string) {\n  return ceInterface?.findEffect({ effectName: name });\n}\nexport async function CEAddEffectWith(options: { uuid: string, effectName?: string, effectId?: string, origin?: any, effectData?: any, overlay: boolean }) {\n  return ceInterface?.addEffect(options);\n}\n\nexport async function CERemoveEffect(options: { effectName: string, uuid: string, effectId?: string, origin?: string }) {\n  return ceInterface?.removeEffect(options);\n}\n\nexport async function CEToggleEffect(options: { effectName?: string, uuid: string, effectId?: string, origin?: string, overlay?: boolean }) {\n  const { effectName, uuid, effectId, origin, overlay } = options;\n  return ceInterface?.toggleEffect({ uuids: [uuid], effectName, effectId, origin, overlay });\n}\n\nexport function CEHasEffectApplied(options: { effectName: string, uuid: string, effectId?: string, origin?: string }): boolean {\n  return !!ceInterface?.hasEffectApplied(options);\n}\n\nexport function isConvenientEffect(effect: ActiveEffect.Implementation): boolean {\n  return !!(effect?.flags?.[\"dfreds-convenient-effects\"]?.isConvenient);\n}\n\nexport function getActivityDefaultDamageType(workflow: Workflow): string {\n  let defaultDamageType = workflow.activity.damage?.parts[0]?.types.first();\n  if (defaultDamageType) return defaultDamageType;\n  if (workflow.defaultDamageType) defaultDamageType = workflow.defaultDamageType;\n  if (!defaultDamageType) defaultDamageType = MidiQOL.MQdefaultDamageType;\n  return defaultDamageType;\n}\n\nexport function activityHasAreaTarget(activity?: Activity): boolean {\n  return (activity?.target?.template.type ?? \"\") in GameSystemConfig.areaTargetTypes\n}\n\nexport interface ConvertedDuration {\n  type: \"turns\" | \"seconds\" | \"none\";\n  seconds: number | undefined;\n  rounds: number | undefined;\n  turns: number | undefined;\n}\n\n/**\n * Converts activity/item duration to effect duration format.\n * Returns seconds for world time tracking, or rounds/turns for combat tracking.\n *\n * @param durationData - Duration with units and value\n * @param inCombat - Whether the actor is currently in combat\n * @param maxRoundsForTurns - Maximum rounds before switching to seconds (default 10)\n * @returns Converted duration with type, seconds, rounds, and turns\n */\nexport function convertDuration(\n  durationData: { units: string; value: number } | undefined,\n  inCombat: boolean,\n  maxRoundsForTurns: number = 10\n): ConvertedDuration {\n  const timesUpActive = installedModules.get(\"times-up\");\n  const useTurns = inCombat && timesUpActive;\n  const roundTime = CONFIG.time.roundTime ?? 6;\n\n  // No duration or invalid - return minimal duration\n  if (!durationData?.units) {\n    return useTurns\n      ? { type: \"turns\", seconds: 0, rounds: 0, turns: 1 }\n      : { type: \"seconds\", seconds: 1, rounds: 0, turns: 0 };\n  }\n\n  const { units, value } = durationData;\n\n  // Handle special/permanent duration types - no expiry\n  if ([\"spec\", \"perm\", \"disp\", \"dstr\"].includes(units)) {\n    return { type: \"none\", seconds: undefined, rounds: undefined, turns: undefined };\n  }\n\n  // Handle instantaneous - minimal duration\n  if (units === \"inst\") {\n    return useTurns\n      ? { type: \"turns\", seconds: 0, rounds: 0, turns: 1 }\n      : { type: \"seconds\", seconds: 1, rounds: 0, turns: 0 };\n  }\n\n  // Handle turn-based durations\n  if ([\"turn\", \"turns\"].includes(units)) {\n    return {\n      type: useTurns ? \"turns\" : \"seconds\",\n      seconds: roundTime,\n      rounds: 0,\n      turns: value\n    };\n  }\n\n  if ([\"round\", \"rounds\"].includes(units)) {\n    return {\n      type: useTurns ? \"turns\" : \"seconds\",\n      seconds: value * roundTime,\n      rounds: value,\n      turns: 0\n    };\n  }\n\n  // Convert time-based durations to seconds using the calendar\n  const calendar = game.time?.calendar;\n  const secondsPerMinute = calendar?.days?.secondsPerMinute ?? 60;\n  const minutesPerHour = calendar?.days?.minutesPerHour ?? 60;\n  const hoursPerDay = calendar?.days?.hoursPerDay ?? 24;\n  const daysPerWeek = calendar?.days?.values?.length ?? 7;\n\n  const secondsPerHour = secondsPerMinute * minutesPerHour;\n  const secondsPerDay = secondsPerHour * hoursPerDay;\n\n  let seconds: number;\n\n  switch (units) {\n    case \"second\":\n    case \"seconds\":\n      seconds = value;\n      break;\n    case \"minute\":\n    case \"minutes\":\n      seconds = value * secondsPerMinute;\n      break;\n    case \"hour\":\n    case \"hours\":\n      seconds = value * secondsPerHour;\n      break;\n    case \"day\":\n    case \"days\":\n      seconds = value * secondsPerDay;\n      break;\n    case \"week\":\n    case \"weeks\":\n      seconds = value * secondsPerDay * daysPerWeek;\n      break;\n    case \"month\":\n    case \"months\":\n      // Approximate - use 30 days per month\n      seconds = value * secondsPerDay * 30;\n      break;\n    case \"year\":\n    case \"years\":\n      // Approximate - use 365 days per year\n      seconds = value * secondsPerDay * 365;\n      break;\n    default:\n      warn(`midi-qol | convertDuration | Unknown duration unit: ${units}`);\n      return { type: \"none\", seconds: undefined, rounds: undefined, turns: undefined };\n  }\n\n  const rounds = Math.floor(seconds / roundTime);\n\n  // Use turns for short durations in combat, seconds for longer durations\n  if (useTurns && rounds <= maxRoundsForTurns) {\n    return { type: \"turns\", seconds, rounds, turns: 0 };\n  }\n\n  return { type: \"seconds\", seconds, rounds, turns: 0 };\n}\n\nexport function getSaveRollModeFor(abilityId: string) {\n  if (configSettings.rollChecksBlind.includes(\"all\") || configSettings.rollChecksBlind.includes(abilityId))\n    return \"blindroll\";\n  return configSettings.autoCheckSaves !== \"allShow\" ? \"gmroll\" : \"public\";\n}\n\nexport function getCheckRollModeFor(abilityId: string) {\n  if (configSettings.rollSavesBlind.includes(\"all\") || configSettings.rollSavesBlind.includes(abilityId))\n    return \"blindroll\";\n  return configSettings.autoCheckSaves !== \"allShow\" ? \"gmroll\" : \"public\";\n}\n\nexport function areMidiKeysPressed(event: AugmentedEvent | undefined, action: string) {\n  if (!event) return false;\n  const activeModifiers = {};\n  const KeyBoardManager = game.keyboard;\n  //@ts-expect-error\n  const MODIFIER_KEYS = KeyBoardManager.constructor.MODIFIER_KEYS;\n  //@ts-expect-error\n  const MODIFIER_CODES = KeyBoardManager.constructor.MODIFIER_CODES;\n  const ClientKeyBindings = game.keybindings;\n  const addModifiers = (key, pressed) => {\n    activeModifiers[key] = pressed;\n    MODIFIER_CODES[key].forEach(n => activeModifiers[n] = pressed);\n  };\n  addModifiers(MODIFIER_KEYS.CONTROL, event.ctrlKey || event.metaKey);\n  addModifiers(MODIFIER_KEYS.SHIFT, event.shiftKey);\n  addModifiers(MODIFIER_KEYS.ALT, event.altKey);\n  return ClientKeyBindings?.get(\"midi-qol\", action).some(b => {\n    if (KeyBoardManager?.downKeys.has(b.key) && b.modifiers.every(m => activeModifiers[m])) return true;\n    if (b.modifiers?.length) return false;\n    return activeModifiers[b.key];\n  });\n}\nexport function setRangedTargets(tokenToUse: Token.Implementation, targetDetails: Activity[\"target\"]) {\n  if (!canvas || !canvas.scene) return true;\n  if (!tokenToUse) {\n    ui.notifications?.warn(`${i18n(\"midi-qol.noSelection\")}`)\n    return true;\n  }\n  // We have placed an area effect template and we need to check if we over selected\n  let dispositions = targetDetails.affects.type === \"creature\" ? [-1, 0, 1] : targetDetails.affects.type === \"ally\" ? [tokenToUse.document.disposition] : [-tokenToUse.document.disposition];\n  // release current targets\n  game.user?.targets.forEach(t => {\n    t.setTarget(false, { releaseOthers: false });\n  });\n  game.user?.targets.clear();\n  // min dist is the number of grid squares away.\n  let minDist = targetDetails.template.size;\n  const targetIds: string[] = [];\n  const maxTargets = targetDetails.affects?.count;\n  // TODO (Michael): HERE! RIGHT HERE!\n  let ignoreToken = (targetDetails.affects.special ?? \"\").split(\";\").some(spec => [\"-self\"].includes(spec)) ? tokenToUse : null;\n  if ((targetDetails.affects.special ?? \"\").split(\";\").some(spec => \"self\" === spec)) {\n    foundry.utils.logCompatibilityWarning(\"midi-qol | target specials includes 'self'. Use '-self' to exclude the caster\",\n      { since: \"midi-qol 13.0.19\", until: \"13.1.0\" });\n  }\n  if (canvas.tokens?.placeables && canvas.grid) {\n    const canvasTokens = canvas.tokens?.placeables;\n    if (canvasTokens) for (let target of canvasTokens) {\n      const targetDocument: TokenDocument = target.document;\n\n      if (maxTargets !== \"\" && (targetIds.length ?? 0) >= Number(maxTargets)) break;\n      if (!isValidTarget(target)) continue;\n      const ray = new foundry.canvas.geometry.Ray(target.center, tokenToUse.center);\n      const wallsBlock = [\"wallsBlock\", \"wallsBlockIgnoreDefeated\", \"wallsBlockIgnoreIncapacitated\"].includes(configSettings.rangeTarget)\n      let inRange = target.actor && dispositions.includes(targetDocument.disposition);\n      if (target.actor && [\"wallsBlockIgnoreIncapacited\", \"alwaysIgnoreIncapacitated\"].includes(configSettings.rangeTarget))\n        inRange = inRange && !checkIncapacitated((target.actor as Actor), debugEnabled > 0, false);\n      if ([\"wallsBlockIgnoreDefeated\", \"alwaysIgnoreDefeated\"].includes(configSettings.rangeTarget))\n        inRange = inRange && !checkDefeated(target);\n      inRange = inRange && (configSettings.rangeTarget === \"none\" || !hasWallBlockingCondition(target))\n      if (inRange) {\n        // if ignoreToken set don't target it.\n        if (ignoreToken?.document.uuid === target.document.uuid) {\n          inRange = false;\n        }\n        const distance = getDistance(target, tokenToUse, { wallsBlock });\n        inRange = inRange && distance >= 0 && distance <= Number(minDist);\n      }\n      if (inRange) {\n        target.setTarget(true, { user: game.user, releaseOthers: false });\n        if (target.document.id) targetIds.push(target.document.id);\n      }\n    }\n\n    // if (!this.ignoreUserTargets) this.targets = new Set(game.user?.targets ?? []);\n    // this.saves = new Set();\n    // this.failedSaves = new Set(this.targets)\n    // this.hitTargets = new Set(this.targets);\n    // this.hitTargetsEC = new Set();\n    game.user?.broadcastActivity({ targets: targetIds });\n  }\n  return true;\n}\n\nfunction getCPREffect(id: string): ActiveEffect.Implementation | undefined {\n  if (!game.modules.get(\"chris-premades\")?.active || !game.settings.get(\"chris-premades\", \"effectInterface\")) return undefined;\n  let cprItem = game.items?.find(i => ((i.flags[\"chris-premades\"]))?.effectInterface);\n  return cprItem?.effects.get(id) as ActiveEffect;\n}\n\n// --- Target save/restore ---\n\nexport function updateUserTargets(targetIds: string[]) {\n  // @ts-expect-error not in v13 yet\n  canvas.tokens?.setTargets(targetIds);\n}\n\n/**\n * Module-level target save/restore for self-target workflows only.\n * - pushTargetSave(): captures targets when depth goes from 0→1\n * - popTargetSave(): restores targets when depth goes from 1→0\n * - clearTargetSave(): discards saved state (called when non-self-target\n *   workflow starts, or when user manually retargets)\n *\n * User-initiated retargeting is detected via libWrapper patches on\n * Token._onClickLeft, Token._onClickRight2, and TokenLayer.selectObjects\n * (registered in patching.ts). These set _userInitiatedTarget = true before\n * the wrapped call, and the targetToken hook checks this flag.\n */\nlet _savedTargetIds: string[] | null = null;\nlet _targetSaveDepth = 0;\n\n/** Set by libWrapper patches in patching.ts around user-initiated targeting actions. */\nexport let _userInitiatedTarget = false;\nexport function setUserInitiatedTarget(value: boolean) { _userInitiatedTarget = value; }\n\nexport function pushTargetSave() {\n  if (_targetSaveDepth === 0) {\n    _savedTargetIds = Array.from(game.user?.targets ?? []).map(t => t.id);\n  }\n  _targetSaveDepth++;\n\n}\n\nexport function popTargetSave() {\n  _targetSaveDepth--;\n  const willRestore = _targetSaveDepth <= 0 && _savedTargetIds !== null;\n\n  if (willRestore) {\n    updateUserTargets(_savedTargetIds!);\n    _savedTargetIds = null;\n    _targetSaveDepth = 0;\n  }\n}\n\nexport function clearTargetSave() {\n\n  _savedTargetIds = null;\n  _targetSaveDepth = 0;\n}\n\n/**\n * Called from the targetToken hook. If the user manually changed targets\n * (via click/right-click/box-select), discard any pending self-target save.\n */\nexport function onUserManualTarget(user: User) {\n  if (user === game.user && _userInitiatedTarget) {\n    clearTargetSave();\n  }\n}\n\nexport async function cleanCPRFlanked() {\n  const flankedId = getStaticID(\"flanked\");\n  let cprEffect = getCPREffect(flankedId);\n  if (!cprEffect) return;\n  let updateNeeded = false;\n  const changes = foundry.utils.deepClone(cprEffect.changes);\n  changes.forEach(c => {\n    if (c.key === \"flags.midi-qol.grants.attack.advantage.mwak\") {\n      c.key = \"flags.midi-qol.grants.advantage.attack.mwak\";\n      updateNeeded = true;\n    }\n    if (c.key === \"flags.midi-qol.grants.attack.advantage.msak\") {\n      c.key = \"flags.midi-qol.grants.advantage.attack.msak\";\n      updateNeeded = true;\n    }\n  });\n  if (updateNeeded) {\n    await cprEffect.update({ \"changes\": changes });\n    console.warn(\"midi-qol | cleanCPRFlanked | corrected flanked effect\", cprEffect);\n  }\n  cprEffect = getCPREffect(flankedId);\n}\nexport function getItemFromEffectOrigin(origin: string, alreadyVisited: string[] = []): Item.Implementation | undefined {\n  let originItem: Item.Implementation | undefined;\n  if (alreadyVisited.includes(origin)) return;\n  const originDoc = fromUuidSync(origin) as ActiveEffect.Implementation | Item.Implementation | Activity | undefined;\n  if (originDoc instanceof Item) return originDoc;\n  //@ts-expect-error no dnd5e types - Activity has .item getter\n  if (originDoc?.item instanceof Item) return originDoc.item;\n  if (originDoc?.parent instanceof Item) {\n    originItem = originDoc.parent;\n  } else if (typeof originDoc?.origin === \"string\") {\n    originItem = getItemFromEffectOrigin(originDoc.origin, [...alreadyVisited, origin]);\n    // recursive so @michael can feel fancy\n  }\n  // Fallback: if we couldn't resolve to an Item (e.g. grandchild embedded docs on synthetic actors),\n  // try stripping the ActiveEffect segment to resolve the parent Item directly\n  if (!originItem && (origin.includes(\".ActiveEffect.\") || origin.includes(\".Activity.\"))) {\n    const itemUuid = origin.replace(/\\.(?:ActiveEffect|Activity)\\.[^.]+$/, \"\");\n    let item = fromUuidSync(itemUuid);\n    // If the UUID contains .Actor. segment (synthetic token), try without it\n    if (!(item instanceof Item) && itemUuid.includes(\".Actor.\")) {\n      const withoutActor = itemUuid.replace(/\\.Actor\\.[^.]+/, \"\");\n      item = fromUuidSync(withoutActor);\n    }\n    if (item instanceof Item) originItem = item;\n  }\n  return originItem;\n}\n\nfunction getItemFromEffectOriginOLD(origin: string) {\n  let originItem: Item.Implementation | undefined;\n  const originEffect = fromUuidSync(origin) as ActiveEffect.Implementation | undefined;\n  if (originEffect?.origin) {\n    if (originEffect.parent instanceof Item) {\n      originItem = originEffect.parent;\n    } else originItem = fromUuidSync(originEffect?.origin) as Item.Implementation | undefined;\n  }\n  return originItem;\n}\n\nexport type OpType = \"equal\" | \"insert\" | \"delete\" | \"replace\";\n\nexport interface EqualOp { type: \"equal\"; text: string }\nexport interface InsertOp { type: \"insert\"; text: string }\nexport interface DeleteOp { type: \"delete\"; text: string }\nexport interface ReplaceOp { type: \"replace\"; text: string; from: string }\n\nexport type DiffOp = EqualOp | InsertOp | DeleteOp | ReplaceOp;\n\nexport interface DiffOptions {\n  ignoreWhitespace?: boolean; // Ignore spaces and tabs\n  ignoreNewlines?: boolean;    // Ignore \\n and \\r\n}\n\nconst toCodepoints = (s: string): string[] => Array.from(s);\n\n/**\n * Apply normalization rules based on options and return:\n * - normalized string array\n * - map from normalized index to original index\n */\nfunction normalizeWithMap(str: string, options?: DiffOptions): { norm: string[], map: number[] } {\n  const norm: string[] = [];\n  const map: number[] = [];\n  const chars = toCodepoints(str);\n\n  for (let i = 0; i < chars.length; i++) {\n    const ch = chars[i];\n    if (options?.ignoreWhitespace && /\\s/.test(ch) && ch !== \"\\n\" && ch !== \"\\r\") continue;\n    if (options?.ignoreNewlines && (ch === \"\\n\" || ch === \"\\r\")) continue;\n    norm.push(ch);\n    map.push(i);\n  }\n  return { norm, map };\n}\n\nexport function diffStringsFull(a: string, b: string, options?: DiffOptions): DiffOp[] {\n  if (a === b) return [{ type: \"equal\", text: a }];\n\n  // Normalize inputs according to options\n  const { norm: A, map: mapA } = normalizeWithMap(a, options);\n  const { norm: B, map: mapB } = normalizeWithMap(b, options);\n  const n = A.length;\n  const m = B.length;\n\n  if (n === 0) return [{ type: \"insert\", text: b }];\n  if (m === 0) return [{ type: \"delete\", text: a }];\n\n  const max = n + m;\n  const trace: Array<Map<number, number>> = [];\n  let V = new Map<number, number>();\n  V.set(1, 0);\n\n  for (let d = 0; d <= max; d++) {\n    const Vnext = new Map<number, number>();\n    for (let k = -d; k <= d; k += 2) {\n      let x: number;\n      if (k === -d || (k !== d && (V.get(k - 1) ?? -Infinity) < (V.get(k + 1) ?? -Infinity))) {\n        x = V.get(k + 1) ?? 0; // down\n      } else {\n        x = (V.get(k - 1) ?? 0) + 1; // right\n      }\n      let y = x - k;\n\n      while (x < n && y < m && A[x] === B[y]) { x++; y++; }\n\n      Vnext.set(k, x);\n\n      if (x >= n && y >= m) {\n        trace.push(Vnext);\n\n        const opsRev: DiffOp[] = [];\n        let kk = k, xx = x, yy = y;\n\n        for (let D = d; D > 0; D--) {\n          const Vprev = trace[D - 1];\n          let kPrev: number;\n          if (kk === -D || (kk !== D && (Vprev.get(kk - 1) ?? -Infinity) < (Vprev.get(kk + 1) ?? -Infinity))) {\n            kPrev = kk + 1; // down/insert\n          } else {\n            kPrev = kk - 1; // right/delete\n          }\n          const xPrev = Vprev.get(kPrev)!;\n          const yPrev = xPrev - kPrev;\n\n          // Snake through equals\n          while (xx > xPrev && yy > yPrev) {\n            xx--; yy--;\n            opsRev.push({ type: \"equal\", text: substringFromMap(a, mapA, xx, xx + 1) });\n          }\n\n          if (xPrev < xx) {\n            // delete\n            opsRev.push({ type: \"delete\", text: substringFromMap(a, mapA, xPrev, xPrev + 1) });\n          } else {\n            // insert\n            opsRev.push({ type: \"insert\", text: substringFromMap(b, mapB, yPrev, yPrev + 1) });\n          }\n\n          kk = kPrev;\n          xx = xPrev;\n          yy = yPrev;\n        }\n\n        // Leading equals\n        while (xx > 0 && yy > 0) {\n          xx--; yy--;\n          opsRev.push({ type: \"equal\", text: substringFromMap(a, mapA, xx, xx + 1) });\n        }\n\n        opsRev.reverse();\n        return coalesceOps(opsRev);\n      }\n    }\n    trace.push(Vnext);\n    V = Vnext;\n  }\n  return [{ type: \"replace\", text: b, from: a }];\n}\n\nfunction substringFromMap(original: string, map: number[], start: number, end: number): string {\n  const chars = toCodepoints(original);\n  return chars.slice(map[start], map[end - 1] + 1).join(\"\");\n}\n\nexport function coalesceOps(ops: DiffOp[]): DiffOp[] {\n  if (ops.length === 0) return ops;\n\n  const merged: DiffOp[] = [];\n  for (const op of ops) {\n    const last = merged[merged.length - 1];\n    if (last && last.type === op.type && op.type !== \"replace\") {\n      (last as any).text += (op as EqualOp | InsertOp | DeleteOp).text;\n    } else {\n      merged.push({ ...op });\n    }\n  }\n\n  const result: DiffOp[] = [];\n  for (let i = 0; i < merged.length; i++) {\n    const cur = merged[i];\n    const next = merged[i + 1];\n    if (cur && next && cur.type === \"delete\" && next.type === \"insert\") {\n      result.push({ type: \"replace\", from: cur.text, text: next.text });\n      i++;\n    } else {\n      result.push(cur);\n    }\n  }\n\n  const final: DiffOp[] = [];\n  for (const op of result) {\n    const last = final[final.length - 1];\n    if (last && last.type === \"equal\" && op.type === \"equal\") {\n      last.text += op.text;\n    } else {\n      final.push(op);\n    }\n  }\n  return final;\n}\n\n/* -------------------- Example --------------------\nconst a = \"The 🐱\\n sat on  the mat.\";\nconst b = \"The 🐶 sits   on a mat!\";\nconsole.log(diffStringsFull(a, b, { ignoreWhitespace: true, ignoreNewlines: true }));\n--------------------------------------------------- */\n\nexport function getTargetDescriptor(uuid: string, targetDescriptors: Array<DND5ETargetDescriptor> | undefined): DND5ETargetDescriptor | undefined {\n  if (!uuid || !targetDescriptors) return undefined;\n  return targetDescriptors?.find(td => td.uuid === uuid);\n}\n\nexport const throttledScrollBottom = foundry.utils.throttle(() => {\n  //@ts-expect-error fvtt-missing scrollBottom\n  ui.chat?.scrollBottom({ waitImages: true });\n}, 150);","import { checkRule, configSettings, safeGetGameSetting, isDnd5e53 } from \"./settings.js\";\nimport { i18n, log, warn, gameStats, getCanvas, error, debugEnabled, debug, GameSystemConfig, MODULE_ID, getHealingLabel } from \"../midi-qol.js\";\nimport { canSense, getToken, getTokenDocument, gmOverTimeEffect, fromActorUuid, promptReactions, hasUsedAction, hasUsedBonusAction, hasUsedReaction, removeActionUsed, removeBonusActionUsed, removeReactionUsed, ReactionItemReference, isEffectExpired, expireEffects, getAppliedEffects, CERemoveEffect, CEAddEffectWith, getActor, completeItemUse, completeActivityUse, localActivityOverTimeEffect, isValidTarget, hasUsedAnyReaction, getVitalityItem, getVitalityValue, MidiOptions } from \"./utils.js\";\nimport { ddbglPendingFired } from \"./chatMessageHandling.js\";\nimport { DamageDescriptionObject, Workflow, WorkflowOptions } from \"./Workflow.js\";\nimport { bonusCheck, checkWounded } from \"./patching.js\";\nimport { RollModifierTracker } from \"./lib/RollModifierTracker.js\";\nimport { queueUndoData, startUndoWorkflow, updateUndoChatCardUuids, _removeMostRecentWorkflow, _undoMostRecentWorkflow, undoTillWorkflow, _queueUndoDataDirect, updateUndoChatCardUuidsById } from \"./undo.js\";\nimport { TroubleShooter } from \"./apps/TroubleShooter.js\";\nimport { installedModules } from \"./setupModules.js\";\nimport { StatUpdateMessage } from \"./RollStats.js\";\nimport { DamageApplicationOptions, DamageDescription, DamageListEntry, MonksTokenBarRequest, MoveTokenOptions, RollDialogConfig, RollMessageConfig, RollProcessConfig, SaveDetails, TeleportTokenDestination } from \"../globals.js\";\n\nexport let socketlibSocket: any = undefined;\nlet traitList = { di: \"\", dr: \"\", dv: \"\", dm: \"\", da: \"\" };\n\nexport let setupSocket = () => {\n  socketlibSocket = globalThis.socketlib.registerModule(MODULE_ID);\n  socketlibSocket.register(\"_gmSetFlag\", _gmSetFlag);\n  socketlibSocket.register(\"_gmUnsetFlag\", _gmUnsetFlag);\n  socketlibSocket.register(\"addConvenientEffect\", addConvenientEffect);\n  socketlibSocket.register(\"addDependent\", _addDependent);\n  socketlibSocket.register(\"applyEffects\", _applyEffects);\n  socketlibSocket.register(\"bonusCheck\", _bonusCheck);\n  socketlibSocket.register(\"chooseReactions\", localDoReactions);\n  socketlibSocket.register(\"completeItemUse\", _completeItemUse);\n  socketlibSocket.register(\"completeItemUseV2\", _completeItemUse);\n  socketlibSocket.register(\"completeActivityUse\", _completeActivityUse);\n  socketlibSocket.register(\"confirmDamageRollComplete\", confirmDamageRollComplete);\n  socketlibSocket.register(\"confirmDamageRollCompleteHit\", confirmDamageRollCompleteHit);\n  socketlibSocket.register(\"confirmDamageRollCompleteMiss\", confirmDamageRollCompleteMiss);\n  socketlibSocket.register(\"cancelWorkflow\", cancelWorkflow);\n  socketlibSocket.register(\"createActor\", createActor);\n  socketlibSocket.register(\"createChatMessage\", _createChatMessage);\n  socketlibSocket.register(\"createEffects\", createEffects);\n  socketlibSocket.register(\"createReverseDamageCard\", createReverseDamageCard);\n  socketlibSocket.register(\"D20Roll\", _D20Roll);\n  socketlibSocket.register(\"ddbglPendingFired\", ddbglPendingFired);\n  socketlibSocket.register(\"deleteEffects\", deleteEffects);\n  socketlibSocket.register(\"deleteEffectsByUuid\", deleteEffectsByUuid);\n  socketlibSocket.register(\"deleteItemEffects\", deleteItemEffects);\n  socketlibSocket.register(\"deleteToken\", deleteToken);\n  socketlibSocket.register(\"toggleTokenHidden\", toggleTokenHidden);\n  socketlibSocket.register(\"gmOverTimeEffect\", _gmOverTimeEffect);\n  socketlibSocket.register(\"localActivityOverTimeEffect\", _localActivityOverTimeEffect);\n  socketlibSocket.register(\"monksTokenBarSaves\", monksTokenBarSaves);\n  socketlibSocket.register(\"flashTokenBarSaves\", flashTokenBarSaves);\n  socketlibSocket.register(\"moveToken\", _moveToken);\n  socketlibSocket.register(\"moveTokenAwayFromPoint\", _moveTokenAwayFromPoint);\n  socketlibSocket.register(\"teleportToken\", _teleportToken);\n  socketlibSocket.register(\"queueUndoData\", queueUndoData);\n  socketlibSocket.register(\"queueUndoDataDirect\", _queueUndoDataDirect);\n  socketlibSocket.register(\"removeEffect\", _removeEffect);\n  socketlibSocket.register(\"removeCEEffect\", _removeCEEffect);\n  socketlibSocket.register(\"removeEffects\", removeEffects);\n  socketlibSocket.register(\"removeEffectUuids\", removeEffectUuids);\n  socketlibSocket.register(\"removeMostRecentWorkflow\", _removeMostRecentWorkflow);\n  socketlibSocket.register(\"removeStatsForActorId\", removeActorStats);\n  socketlibSocket.register(\"removeWorkflow\", _removeWorkflow);\n  socketlibSocket.register(\"rollAbility\", rollAbility);\n  socketlibSocket.register(\"rollAbilityV2\", rollAbility);\n  socketlibSocket.register(\"rollConcentration\", rollConcentration);\n  socketlibSocket.register(\"startUndoWorkflow\", startUndoWorkflow);\n  socketlibSocket.register(\"undoMostRecentWorkflow\", _undoMostRecentWorkflow);\n  socketlibSocket.register(\"undoTillWorkflow\", undoTillWorkflow);\n  socketlibSocket.register(\"updateActor\", updateActor);\n  socketlibSocket.register(\"updateEffects\", updateEffects);\n  socketlibSocket.register(\"updateItems\", updateItems);\n  socketlibSocket.register(\"recordStats\", GMrecordStats)\n  socketlibSocket.register(\"saveAllStats\", GMsaveAllStats)\n  socketlibSocket.register(\"updateUndoChatCardUuids\", updateUndoChatCardUuids);\n  socketlibSocket.register(\"updateUndoChatCardUuidsById\", updateUndoChatCardUuidsById);\n  socketlibSocket.register(\"removeActionBonusReaction\", removeActionBonusReaction);\n  socketlibSocket.register(\"rollActionSave\", rollActionSave);\n  socketlibSocket.register(\"toggleStatusEffect\", _toggleStatusEffect);\n\n  // socketlibSocket.register(\"canSense\", _canSense);\n}\nasync function _removeWorkflow(workflowId: string) {\n  return Workflow.removeWorkflow(workflowId);\n}\n\nexport class SaferSocket {\n\n  #_socketlibSocket: any;\n  constructor(socketlibSocket) {\n    this.#_socketlibSocket = socketlibSocket;\n  }\n  canCall(handler) {\n    if (game.user?.isGM) return true;\n    switch (handler) {\n      case \"addDependent\":\n      case \"applyEffects\":\n      case \"bonusCheck\":\n      case \"chooseReactions\":\n      case \"completeItemUse\":\n      case \"completeActivityUse\":\n      case \"confirmDamageRollComplete\":\n      case \"confirmDamageRollCompleteHit\":\n      case \"confirmDamageRollCompleteMiss\":\n      case \"cancelWorkflow\":\n      case \"createChatMessage\":\n      case \"createEffects\":\n      case \"D20Roll\":\n      case \"log\":\n      case \"monksTokenBarSaves\":\n      case \"flashTokenBarSaves\":\n      case \"moveToken\":\n      case \"moveTokenAwayFromPoint\":\n      case \"teleportToken\":\n      case \"removeWorkflow\":\n      case \"rollAbility\":\n      case \"rollAbilityV2\":\n      case \"rollConcentration\":\n      case \"removeEffect\":\n      case \"removeActionBonusReaction\":\n      case \"recordStats\":\n      case \"toggleStatusEffect\":\n      case \"toggleTokenHidden\":\n        return true;\n\n      case \"addConvenientEffect\":\n      case \"createActor\":\n      case \"createReverseDamageCard\":\n      case \"deleteEffects\":\n      case \"deleteItemEffects\":\n      case \"deleteToken\":\n      case \"removeEffects\":\n      case \"removeEffectUuids\":\n      case \"updateActor\":\n      case \"updateEffects\":\n      case \"updateItems\":\n      case \"_gmSetFlag\":\n      case \"_gmUnsetFlag\":\n        if (game.user?.isTrusted) return true;\n        ui.notifications?.warn(`midi-qol | user ${game.user?.name} must be a trusted player to call ${handler} and will be disabled in the future`);\n        return true; // TODO change this to false in the future.\n\n\n      case \"ddbglPendingFired\":\n      case \"gmOverTimeEffect\":\n      case \"queueUndoData\":\n      case \"queueUndoDataDirect\":\n      case \"removeStatsForActorId\":\n      case \"removeMostRecentWorkflow\":\n      case \"startUndoWorkflow\":\n      case \"undoMostRecentWorkflow\":\n      case \"undoTillWorkflow\":\n      case \"saveAllStats\":\n      case \"updateUndoChatCardUuids\":\n      case \"updateUndoChatCardUuidsById\":\n      case \"deleteEffectsByUuid\":\n      default:\n        error(`Non-GMs are not allowed to call ${handler}`);\n        return false;\n    }\n  }\n\n  async executeAsGM(handler, ...args) {\n    if (!this.canCall(handler)) return false;\n    return await unTimedExecuteAsGM(handler, ...args);\n  }\n  async executeAsUser(handler, userId, ...args) {\n    if (!this.canCall(handler)) return false;\n    return await this.#_socketlibSocket.executeAsUser(handler, userId, ...args);\n  }\n\n  async executeForAllGMs(handler, ...args) {\n    if (!this.canCall(handler)) return false;\n    return await this.#_socketlibSocket.executeForAllGMs(handler, ...args);\n  }\n  async executeForOtherGMS(handler, ...args) {\n    if (!this.canCall(handler)) return false;\n    return await this.#_socketlibSocket.executeForOtherGMS(handler, ...args);\n  }\n  async executeForEveryone(handler, ...args) {\n    if (!this.canCall(handler)) return false;\n    return await this.#_socketlibSocket.executeForEveryone(handler, ...args);\n  }\n  async executeForOthers(handler, ...args) {\n    if (!this.canCall(handler)) return false;\n    return await this.#_socketlibSocket.executeForOthers(handler, ...args);\n  }\n  async executeForUsers(handler, recipients, ...args) {\n    if (!this.canCall(handler)) return false;\n    return await this.#_socketlibSocket.executeForUsers(handler, recipients, ...args);\n  }\n}\n\nasync function removeActionBonusReaction(data: { actorUuid: string }) {\n  const actor = fromActorUuid(data.actorUuid);\n  if (!actor) return;\n  if (hasUsedAnyReaction(actor)) await removeReactionUsed(actor);\n  if (hasUsedBonusAction(actor)) await removeBonusActionUsed(actor);\n  if (hasUsedAction(actor)) return await removeActionUsed(actor);\n  return;\n}\n\n// Remove a single effect. Allow anyone to call this.\nasync function _removeEffect(data: { effectUuid: string }) {\n  const effect = fromUuidSync(data.effectUuid) as ActiveEffect.Implementation | undefined;\n  if (!effect) return;\n  return effect.delete({});\n}\n\nasync function _removeCEEffect(data: { effectName: string, uuid: string }) {\n  return CERemoveEffect({ effectName: data.effectName, uuid: data.uuid });\n}\n\nexport async function cancelWorkflow(data: { workflowId: string, itemCardUuid: string }) {\n  const workflow = Workflow.getWorkflow(data.workflowId);\n  if (workflow?.itemCardUuid !== data.itemCardUuid) {\n    const itemCard = await fromUuid(data.itemCardUuid as `ChatMessage.${string}`);\n    if (itemCard) itemCard.delete();\n    return undefined;\n  }\n  if (workflow) return workflow.performState(workflow.WorkflowState_Cancel);\n  return undefined;\n}\n\nasync function confirmDamageRollComplete(data: { workflowId: string, activityUuid: string, itemCardUuid: string }) {\n  const workflow = Workflow.getWorkflow(data.workflowId);\n  const activity = workflow?.activity;\n  if (!workflow || workflow.itemCardUuid !== data.itemCardUuid) {\n    // Confirm this needs to be awaited\n    Workflow.removeItemCardButtons(data.itemCardUuid, { removeAttackButtons: true, removeDamageButtons: true, removeConfirmButtons: true });\n    return undefined;\n  }\n  const hasHits = workflow.hitTargets.size > 0 || workflow.hitTargetsEC.size > 0;\n  if ((workflow.currentAction === workflow.WorkflowState_AttackRollComplete) || (hasHits &&\n    activity?.hasDamage && (!workflow.damageRoll || workflow.currentAction !== workflow.WorkflowState_ConfirmRoll))) {\n    return \"midi-qol | You must roll damage before completing the roll - you can only confirm miss until then\";\n  }\n  if (workflow.hitTargets.size === 0 && workflow.hitTargetsEC.size === 0) {\n    // TODO make sure this needs to be awaited\n    return confirmDamageRollCompleteMiss(data);\n  }\n\n  // TODO NW if (workflow.suspended) workflow.unSuspend({rollConfirmed: true});\n  return workflow.performState(workflow.WorkflowState_RollConfirmed)\n}\n\nasync function confirmDamageRollCompleteHit(data: { workflowId: string, activityUuid: string, itemCardUuid: string }) {\n  const workflow = Workflow.getWorkflow(data.workflowId);\n  const activity = workflow?.activity;\n  if (!workflow || workflow.itemCardUuid !== data.itemCardUuid) {\n    Workflow.removeItemCardButtons(data.itemCardUuid, { removeAttackButtons: true, removeDamageButtons: true, removeConfirmButtons: true });\n    return undefined;\n  }\n  if ((activity?.hasDamage && !workflow.damageRoll) ||\n    workflow.currentAction !== workflow.WorkflowState_ConfirmRoll) {\n    return \"midi-qol | You must roll damage before completing the roll - you can only confirm miss until then\";\n  }\n  // TODO make sure this needs to be awaited\n  if (workflow.hitTargets.size === workflow.targets.size) {\n    return workflow.performState(workflow.WorkflowState_RollConfirmed)\n    // TODO confirm this needs to be awaited\n\n  }\n  workflow.hitTargets = new Set(workflow.targets);\n  workflow.hitTargetsEC = new Set();\n  const rollMode = safeGetGameSetting(\"core\", \"rollMode\");\n  workflow.isFumble = false;\n  for (let hitDataKey in workflow.hitDisplayData) {\n    workflow.hitDisplayData[hitDataKey].hitString = i18n(\"midi-qol.hits\");\n    workflow.hitDisplayData[hitDataKey].hitResultNumeric = \"--\";\n    if (configSettings.highlightSuccess) {\n      workflow.hitDisplayData[hitDataKey].hitStyle = \"color: green;\";\n    }\n  }\n  await workflow.displayHits(workflow.whisperAttackCard, true);\n  return await workflow.performState(workflow.WorkflowState_RollConfirmed);\n}\n\nasync function confirmDamageRollCompleteMiss(data: { workflowId: string, activityUuid: string, itemCardUuid: string }) {\n  const workflow = Workflow.getWorkflow(data.workflowId);\n  const activity = workflow?.activity;\n  if (!workflow || workflow.itemCardUuid !== data.itemCardUuid) {\n    /* Confirm this needs to be awaited\n    */\n    Workflow.removeItemCardButtons(data.itemCardUuid, { removeDamageButtons: true, removeAttackButtons: true, removeConfirmButtons: true });\n    return undefined;\n  }\n  if (workflow.hitTargets.size > 0 || workflow.hitTargetsEC.size > 0) {\n    workflow.hitTargets = new Set();\n    workflow.hitTargetsEC = new Set();\n    const rollMode = safeGetGameSetting(\"core\", \"rollMode\");\n    for (let hitDataKey in workflow.hitDisplayData) {\n      workflow.hitDisplayData[hitDataKey].hitString = i18n(\"midi-qol.misses\");\n      if (configSettings.highlightSuccess) {\n        workflow.hitDisplayData[hitDataKey].hitStyle = \"color: red;\";\n      }\n      workflow.hitDisplayData[hitDataKey].hitResultNumeric = \"--\";\n    }\n    await workflow.displayHits(workflow.whisperAttackCard, true);\n  }\n  // Make sure this needs to be awaited\n  return workflow.performState(workflow.WorkflowState_RollConfirmed).then(() => Workflow.removeWorkflow(workflow?.id));\n}\n\nfunction paranoidCheck(action: string, actor: any, data: any): boolean {\n  return true;\n}\n\nasync function removeEffects(data: { actorUuid: string; effects: string[]; options: {} }) {\n  debug(\"removeEffects started\");\n  let removeFunc = async () => {\n    try {\n      debug(\"removeFunc: remove effects started\")\n      const actor = fromActorUuid(data.actorUuid);\n      if (configSettings.paranoidGM && !paranoidCheck(\"removeEffects\", actor, data)) return \"gmBlocked\";\n      const effectsToDelete = actor!.appliedEffects.filter(ef => data.effects.includes(ef.id!));\n      return await expireEffects(actor!, effectsToDelete, data.options);\n    } catch (err) {\n      const message = `GMACTION: remove effects error for ${data?.actorUuid}`;\n      console.warn(message, err);\n      TroubleShooter.recordError(err, message);\n    } finally {\n      warn(\"removeFunc: remove effects completed\")\n    }\n  };\n  // Using the semaphore queue leads to quite a few potential cases of deadlock - disabling for now\n  // if (globalThis.DAE?.actionQueue) return globalThis.DAE.actionQueue.add(removeFunc)\n  // else return removeFunc();\n  return removeFunc();\n\n}\n\nasync function removeEffectUuids(data: { actorUuid: string; effects: string[]; options: {} }) {\n  debug(\"removeEffects started\");\n  let removeFunc = async () => {\n    try {\n      debug(\"removeFunc: remove effects started\")\n      const actor = fromActorUuid(data.actorUuid);\n      if (configSettings.paranoidGM && !paranoidCheck(\"removeEffects\", actor, data)) return \"gmBlocked\";\n      const effectsToDelete = getAppliedEffects(actor, { includeEnchantments: true }).filter(ef => data.effects.includes(ef.uuid));\n      return await expireEffects(actor!, effectsToDelete, data.options);\n    } catch (err) {\n      const message = `GMACTION: remove effects error for ${data?.actorUuid}`;\n      console.warn(message, err);\n      TroubleShooter.recordError(err, message);\n    } finally {\n      warn(\"removeFunc: remove effects completed\")\n    }\n  };\n  // Using the semaphore queue leads to quite a few potential cases of deadlock - disabling for now\n  // if (globalThis.DAE?.actionQueue) return globalThis.DAE.actionQueue.add(removeFunc)\n  // else return removeFunc();\n  return removeFunc();\n}\n\nasync function createEffects(data: { actorUuid: string, effects: ActiveEffect.CreateData[], options: any }) {\n  const actor = fromActorUuid(data.actorUuid);\n  for (let effect of data.effects) { // override default foundry behaviour of blank being transfer\n    if (effect.transfer === undefined) effect.transfer = false;\n  }\n  return await actor?.createEmbeddedDocuments(\"ActiveEffect\", data.effects, data.options);\n}\n\nasync function updateEffects(data: { actorUuid: string, updates: ActiveEffect.UpdateData[] }) {\n  // actorUuid can be an Actor, Token, or Item UUID — transfer effects live on Items\n  let parent: any = fromUuidSync(data.actorUuid);\n  if (parent instanceof TokenDocument) parent = parent.actor;\n  return parent?.updateEmbeddedDocuments(\"ActiveEffect\", data.updates);\n}\n\nasync function updateItems(data: { actorUuid: string, updates: Item.UpdateData[] }) {\n  const actor = fromActorUuid(data.actorUuid);\n  return actor?.updateEmbeddedDocuments(\"Item\", data.updates);\n}\n\nasync function _toggleStatusEffect(data: { actorUuid: string, statusId: string, options: Actor.ToggleStatusEffectOptions }) {\n  const actor = fromActorUuid(data.actorUuid);\n  return actor?.toggleStatusEffect(data.statusId, data.options);\n}\n\nfunction removeActorStats(data: { actorId: string }) {\n  return gameStats.GMremoveActorStats(data.actorId)\n}\n\nfunction GMrecordStats(data: StatUpdateMessage) {\n  return gameStats.GMrecordStats(data);\n}\n\nfunction GMsaveAllStats() {\n  return gameStats.GMsaveAllStats();\n}\n\nexport async function timedExecuteAsGM(toDo: string, data: any) {\n  if (false) return unTimedExecuteAsGM(toDo, data);\n  const start = Date.now();\n  data.playerId = game.user?.id;\n  const returnValue = await unTimedExecuteAsGM(toDo, data);\n  log(`executeAsGM: ${toDo} elapsed: ${Date.now() - start}ms`)\n  return returnValue;\n}\n\nexport function preferredActiveGM() {\n  let preferredGMId = configSettings.preferredGM ?? \"\";\n  if (preferredGMId !== \"\") {\n    const preferredGM = game.users?.get(preferredGMId);\n    if (preferredGM?.active) return preferredGM as User.Implementation;\n    log(`preferredGM ${preferredGMId} is not active`);\n  }\n  return game.users?.activeGM ?? null;\n}\n\nexport async function unTimedExecuteAsGM(toDo: string, ...args) {\n  if (!socketlibSocket) return undefined;\n  const myScene = game.user?.viewedScene;\n  const preferredGMId = configSettings.preferredGM ?? \"\";\n  let preferredGM = game.users?.get(preferredGMId);\n  if (!preferredGM?.active) {\n    if (preferredGMId !== \"\") log(`preferredGM ${preferredGMId} is not active`);\n    preferredGM = undefined;\n  }\n  let gmOnScene;\n  if (preferredGM?.viewedScene === myScene) gmOnScene = [preferredGM];\n  else if (game.user?.isGM && game.user?.viewedScene === myScene) gmOnScene = [game.user];\n  else gmOnScene = game.users?.filter(u => u.active && u.isGM && u.viewedScene === myScene);\n  if (gmOnScene && gmOnScene.length > 0) return socketlibSocket.executeAsUser(toDo, gmOnScene[0].id, ...args);\n  if (preferredGM) return socketlibSocket.executeAsUser(toDo, preferredGM.id, ...args);\n  return socketlibSocket.executeAsGM(toDo, ...args);\n}\n\nexport async function timedAwaitExecuteAsGM(toDo: string, data: any) {\n  if (false) return await unTimedExecuteAsGM(toDo, data);\n  const start = Date.now();\n  const returnValue = await unTimedExecuteAsGM(toDo, data);\n  log(`await executeAsGM: ${toDo} elapsed: ${Date.now() - start}ms`)\n  return returnValue;\n}\n\nasync function _gmUnsetFlag(data: { base: string, key: string, actorUuid: string }) {\n  let actor = fromUuidSync(data.actorUuid) as Actor.Implementation | Item.Implementation | null;\n  actor = actor instanceof Item ? actor.actor : actor;\n  if (!actor) return undefined;\n  // @ts-expect-error unspecified flags\n  return actor.unsetFlag(data.base, data.key)\n}\n\nasync function _gmSetFlag(data: { base: string, key: string, value: any, actorUuid: string }) {\n  let actor = fromUuidSync(data.actorUuid) as Actor.Implementation | Item.Implementation | null;\n  actor = actor instanceof Item ? actor.actor : actor;\n  if (!actor) return undefined;\n  // @ts-expect-error unspecified flags\n  return actor.setFlag(data.base, data.key, data.value)\n}\n\n// Seems to work doing it on the client instead.\nasync function _canSense(data: { tokenUuid: string, targetUuid: string }) {\n  const token = (fromUuidSync(data.tokenUuid) as TokenDocument)?.object;\n  const target = (fromUuidSync(data.targetUuid) as TokenDocument)?.object;\n  if (!target || !token) return true;\n  if (token.vision && (!token.vision.active || !token.vision.los)) {\n    token.vision.initialize({\n      x: token.center.x,\n      y: token.center.y,\n      radius: Math.clamp(token.sightRange, 0, canvas.dimensions?.maxR ?? 0),\n      externalRadius: Math.max(token.mesh?.width ?? 0, token.mesh?.height ?? 0) / 2,\n      angle: token.document.sight.angle,\n      contrast: token.document.sight.contrast,\n      saturation: token.document.sight.saturation,\n      brightness: token.document.sight.brightness,\n      attenuation: token.document.sight.attenuation,\n      rotation: token.document.rotation,\n      visionMode: token.document.sight.visionMode as foundry.canvas.perception.VisionMode.ConfiguredModes,\n      color: globalThis.Color.from(token.document.sight.color),\n      preview: !!token._original,\n      blinded: token.document.hasStatusEffect(CONFIG.specialStatusEffects.BLIND)\n    });\n  }\n  return canSense(token, target);\n}\n\nasync function _gmOverTimeEffect(data: { actorUuid: string, effectUuid: string, startTurn: boolean, options: any }) {\n  const actor = fromActorUuid(data.actorUuid);\n  const effect = fromUuidSync(data.effectUuid) as ActiveEffect.Implementation | undefined;\n  log(\"Called _gmOvertime\", actor?.name, effect?.name)\n  if (actor && effect) return gmOverTimeEffect(actor, effect, data.startTurn, data.options)\n}\n\nasync function _localActivityOverTimeEffect(data: { actorUuid: string, effectUuid: string, startTurn: boolean, options: any }) {\n  const actor = await fromUuid(data.actorUuid) as Actor.Implementation | undefined;\n  const effect = await fromUuid(data.effectUuid) as ActiveEffect.Implementation | undefined;\n  if (!actor || !effect) {\n    const message = `localActivityOverTimeEffect | actor or effect not found actor: ${data.actorUuid} effect: ${data.effectUuid}`;\n    error(message);\n    TroubleShooter.recordError(new Error(\"GMAction failed\"), message);\n    return undefined\n  };\n  log(\"Called _localActivityOverTimeEffect\", actor?.name, effect?.name)\n  return localActivityOverTimeEffect(actor, effect, data.startTurn, data.options)\n}\n\nasync function _bonusCheck(data: { actorUuid: string, result: string, rollType: string, selector: string }) {\n  const tokenOrActor = await fromUuid(data.actorUuid) as Actor.Implementation | TokenDocument.Implementation | undefined;\n  const actor = tokenOrActor instanceof Actor ? tokenOrActor : tokenOrActor?.actor;\n  const roll = Roll.fromJSON(data.result);\n  if (actor) return await bonusCheck(actor, roll as Roll, data.rollType, data.selector);\n  else return null;\n}\n\nasync function _applyEffects(data: { workflowId: string, targets: string[] }) {\n  let result;\n  try {\n    const workflow = Workflow.getWorkflow(data.workflowId);\n    if (!workflow) throw new Error(`_applyEffects | workflowId: ${data.workflowId} - workflow not found`);\n    workflow.forceApplyEffects = true;\n    const targets: Set<foundry.canvas.placeables.Token.Implementation> = new Set();\n    for (let targetUuid of data.targets) {\n      const maybeToken = (await fromUuid(targetUuid) as TokenDocument.Implementation)?.object\n      if (maybeToken) targets.add(maybeToken);\n    }\n\n    // TODO: Does this do anything, actually?\n    workflow.applicationTargets = targets;\n    if (workflow.applicationTargets.size > 0) result = await workflow.performState(workflow.WorkflowState_ApplyDynamicEffects);\n    return result;\n  } catch (err) {\n    const message = `_applyEffects | remote apply effects error`;\n    console.warn(message, err);\n    TroubleShooter.recordError(err, message);\n  }\n  return result;\n}\n\nasync function _completeActivityUse(data: {\n  activityUuid: string, actorUuid: string, usage: any, dialog: any, message: any, workflowData: boolean\n}) {\n  if (!game.user) return null;\n  let { activityUuid, actorUuid, usage, dialog, message } = data;\n  let actor: any = await fromUuid(actorUuid);\n  if (actor?.actor) actor = actor.actor;\n  if (!actor) return null;\n  if (usage.midiOptions?.targetsToUse) {\n    const targets = usage.midiOptions.targetsToUse.map(t => (fromUuidSync(t) as TokenDocument.Implementation)?.object).filter(t => isValidTarget(t)) as foundry.canvas.placeables.Token.Implementation[];\n    usage.midiOptions.targetsToUse = new Set(targets);\n  }\n  const workflow = await completeActivityUse(activityUuid, usage, dialog, message);\n  if (workflow && data.usage.midiOptions?.workflowData) return workflow.getSafeMacroData();\n  else return true;\n}\n\nasync function _completeItemUse(data: {\n  itemData: any, actorUuid: string, config: any, dialog: any, message: any, workflowData: boolean\n}) {\n  if (!game.user) return null;\n  let { itemData, actorUuid, config, dialog, message } = data;\n  let actor: any = await fromUuid(actorUuid);\n  if (actor?.actor) actor = actor.actor;\n  if (!actor) return null;\n  let ownedItem = new CONFIG.Item.documentClass(itemData, { parent: actor });\n  // prepare item data for socketed events\n  ownedItem.prepareData();\n  // @ts-expect-error no dnd5e-types\n  ownedItem.prepareFinalAttributes();\n  // @ts-expect-error no dnd5e-types\n  ownedItem.applyActiveEffects();\n  const workflow = await completeItemUse(ownedItem, config, dialog, message);\n  if (workflow && data.config?.midiOptions?.workflowData) return workflow.getMacroData();\n  else return true;\n}\n\nasync function updateActor(data: { actorUuid: string, updates?: Actor.UpdateData, actorData?: Actor.UpdateData }) {\n  let actor = fromUuidSync(data.actorUuid) as Actor.Implementation | null;\n  if (!actor) return;\n  if (data.actorData) {\n    console.warn(`midi-qol | updateActor actorData deprecated. Call await MidiQOL.socket().executeAsGM(\"updateActor\"({ updates }) instead`)\n    await actor.update(data.actorData);\n  }\n  if (data.updates) await actor.update(data.updates);\n}\n\nasync function createActor(data: { actorData: Actor.CreateData | Actor.CreateData[], context: Actor.Database.CreateOperation<false> }) {\n  let actorsData = data.actorData instanceof Array ? data.actorData : [data.actorData];\n  const actors = await CONFIG.Actor.documentClass.createDocuments(actorsData, data.context ?? {});\n  return actors?.length ? actors.map(a => a.id) : false;\n}\n\nasync function deleteToken(data: { tokenUuid: string }) {\n  const token = await fromUuid(data.tokenUuid) as TokenDocument.Implementation;\n  if (token) { // token will be a token document.\n    token.delete();\n  }\n}\n\nasync function toggleTokenHidden(data: { tokenUuid: string, force?: boolean }) {\n  const token = await fromUuid(data.tokenUuid) as TokenDocument.Implementation;\n  if (token) {\n    const hidden = data.force ?? !token.hidden;\n    await token.update({ hidden });\n  }\n}\n\nasync function deleteEffectsByUuid(data: { effectsToDelete: string[], options: any }) {\n  for (let effectUuid of data.effectsToDelete) {\n    const effect = fromUuidSync(effectUuid) as ActiveEffect.Implementation | undefined;\n    if (effect !== undefined && !isEffectExpired(effect)) {\n      if (effect.transfer)\n        await effect.update({ disabled: true });\n      else\n        await effect.delete();\n    }\n  }\n}\n\nasync function deleteEffects(data: { actorUuid: string, effectsToDelete: string[], options: any }) {\n  const actor = fromActorUuid(data.actorUuid);\n  if (!actor) return;\n  // Check that none of the effects were deleted while we were waiting to execute\n  let finalEffectsToDelete = actor.appliedEffects.filter(ef => data.effectsToDelete.includes(ef.id!) && !isEffectExpired(ef));\n  try {\n    if (debugEnabled > 0) warn(\"_deleteEffects started\", actor.name, data.effectsToDelete, finalEffectsToDelete, data.options)\n    const result = await expireEffects(actor, finalEffectsToDelete, data.options)\n    if (debugEnabled > 0) warn(\"_deleteEffects completed\", actor.name, data.effectsToDelete, finalEffectsToDelete, data.options)\n    return result;\n  } catch (err) {\n    const message = `deleteEffects | remote delete effects error`;\n    console.warn(message, err);\n    TroubleShooter.recordError(err, message);\n    return [];\n  }\n}\n\nasync function deleteItemEffects(data: { targets: { tokenUuid?: string; actorUuid?: string }[], origin: string, ignore: string[], ignoreTransfer: boolean, options: any }) {\n  debug(\"deleteItemEffects: started\", globalThis.DAE?.actionQueue)\n  let deleteFunc = async () => {\n    let effectsToDelete: ActiveEffect.Implementation[] | undefined;\n    try {\n      let { targets, origin, ignore, options } = data;\n      for (let idData of targets) {\n        let actor = idData.tokenUuid ? fromActorUuid(idData.tokenUuid) : idData.actorUuid ? fromActorUuid(idData.actorUuid) : undefined;\n        if (!actor) {\n          error(\"GMAction:deleteItemEffects | could not find actor for \", idData.tokenUuid);\n          continue;\n        }\n        let originEntity = await fromUuid(origin);\n        if (!originEntity) {\n          error(\"GMAction:deleteItemEffects | could not find origin for \", origin);\n          continue;\n        }\n        effectsToDelete = actor?.appliedEffects?.filter(ef => {\n          if (originEntity instanceof ActiveEffect) originEntity = originEntity.parent;\n          return ef.origin === originEntity?.uuid && !ignore.includes(ef.uuid) && (!data.ignoreTransfer || !ef.transfer)\n        });\n        if (installedModules.get(\"times-up\")) {\n          if (globalThis.TimesUp.isEffectExpired) {\n            effectsToDelete = effectsToDelete.filter(ef => !globalThis.TimesUp.isEffectExpired(ef), {});\n          }\n          else effectsToDelete = effectsToDelete.filter(ef => !(ef.updateDuration().remaining <= 0));\n        }\n        debug(\"deleteItemEffects: effectsToDelete \", actor.name, effectsToDelete, options)\n        if (effectsToDelete?.length > 0) {\n          try {\n            // for (let ef of effectsToDelete) ef.delete();\n            options = foundry.utils.mergeObject(options ?? {}, { parent: actor, concentrationDeleted: true });\n            if (debugEnabled > 0) warn(\"deleteItemEffects \", actor.name, effectsToDelete, options);\n            await expireEffects(actor, effectsToDelete, options);\n          } catch (err) {\n            const message = `delete item effects failed for ${actor?.name} ${actor?.uuid}`;\n            console.warn(message, err);\n            TroubleShooter.recordError(err, message);\n          };\n        }\n        if (debugEnabled > 0) warn(\"deleteItemEffects: completed\", actor.name)\n      }\n      if (globalThis.Sequencer) await globalThis.Sequencer.EffectManager.endEffects({ origin })\n    } catch (err) {\n      const message = `delete item effects failed for ${data?.origin} ${effectsToDelete}`;\n      console.warn(message, err);\n      TroubleShooter.recordError(err, message);\n    }\n  }\n  /*\n  if (globalThis.DAE?.actionQueue) return await globalThis.DAE.actionQueue.add(deleteFunc)\n  else return await deleteFunc();\n*/\n  return await deleteFunc();\n}\n\n\nasync function addConvenientEffect(options: { effectName: string, actorUuid: string, origin: string }) {\n  let { effectName, actorUuid, origin } = options;\n  const actor = getActor(actorUuid);\n  console.warn(\"midi-qol | Deprecated. Call await game.modules.get(\\\"dfreds-convenient-effects\\\")?.api?.addEffect({ effectName, uuid: actorUuid, origin }) instead\")\n  if (!actor) return;\n  return CEAddEffectWith({ effectName, uuid: actor.uuid, origin, overlay: false });\n}\n\nasync function _addDependent(data: { documentUuid: string, dependentUuid: string }) {\n  if (foundry.utils.isNewerVersion(game.system.version, \"5.1.99\")) {\n    const dependent = fromUuidSync(data.dependentUuid) as foundry.abstract.Document.Any | undefined;\n    if (!dependent) return;\n\n    // Always use dnd5e's dependent system - dnd5e's DependentDocumentMixin handles tracking\n    //@ts-expect-error dnd5e.dependentOn\n    return dependent.setFlag(\"dnd5e\", \"dependentOn\", data.documentUuid);\n  } else {\n    const document = fromUuidSync(data.documentUuid) as foundry.abstract.Document.Any | undefined;\n    //@ts-expect-error .addDependent\n    if (document?.addDependent) return document.addDependent(data.dependentUuid);\n  }\n}\n\nasync function localDoReactions(data: { tokenUuid: string; reactionActivityList: ReactionItemReference[], triggerTokenUuid: string, reactionFlavor: string; triggerType: string; options: any }) {\n  if (data.options.itemUuid) {\n    data.options.item = fromUuidSync(data.options.itemUuid);\n  }\n  if (data.options.activity && data.options.item) {\n    data.options.activity = data.options.item.system.activities.get(data.options.activity._id);\n  }\n  // reactionItemUuidList can't used since magic items don't have a uuid, so must always look them up locally.\n  const result = await promptReactions(data.tokenUuid, data.reactionActivityList, data.triggerTokenUuid, data.reactionFlavor, data.triggerType, data.options)\n  return result;\n}\n\nexport function initGMActionSetup() {\n  traitList.di = i18n(\"DND5E.DamImm\");\n  traitList.dr = i18n(\"DND5E.DamRes\");\n  traitList.dv = i18n(\"DND5E.DamVuln\");\n  traitList.da = \"da\";\n  traitList.dm = \"dm\";\n  traitList.di = \"di\";\n  traitList.dr = \"dr\";\n  traitList.dv = \"dv\";\n}\n\nasync function _createChatMessage(data: { chatData: ChatMessage.CreateData; }) {\n  return await ChatMessage.create(data.chatData);\n}\n\nasync function _D20Roll(params: { request: string, targetUuid: string, formula: string, bonus: number, coverBonus: number, flavor: string, midiType: string, rollMode: string, rollOptions: any, messageData: any }) {\n  const actor = fromActorUuid(params.targetUuid);\n  if (!actor || !params.rollOptions) {\n    error(`GMAction.D20Roll | no actor for ${params.targetUuid}`)\n    return {};\n  }\n\n  /*\n      criticalSuccess: criticalTarget,\n      criticalFailure: fumbleTarget,\n      advantageMode,\n      target: this.activeDefenceDC\n    */\n  return new Promise(async (resolve) => {\n    let timeoutId;\n    let result;\n    //@ts-expect-error D20Roll\n    const D20Roll = CONFIG.Dice.D20Roll;\n    if (configSettings.playerSaveTimeout > 0) timeoutId = setTimeout(async () => {\n      warn(`Roll request for {actor.name}timed out. Doing roll`);\n      params.rollOptions.fastForward = true; // assume player is asleep force roll without dialog\n      let result = await new D20Roll(params.formula, {}, params.rollOptions).roll();\n      foundry.utils.setProperty(result, \"flags.midi-qol.rollType\", params.midiType)\n      resolve(result ?? {});\n    }, configSettings.playerSaveTimeout * 1000);\n    const roll = new D20Roll();\n    const { parts, data } = D20Roll.constructParts({ \"mod\": params.bonus, \"cover\": params.coverBonus });\n    roll.data = data;\n    roll.parts = parts;\n    roll.options = { ...params.rollOptions };\n    const config = {\n      advantage: params.rollOptions?.advantageMode === D20Roll.ADV_MODE.ADVANTAGE,\n      disadvantage: params.rollOptions?.advantageMode === D20Roll.ADV_MODE.DISADVANTAGE,\n      rolls: [roll],\n      dialog: true,\n    };\n    const dialog = {\n      options: {\n        window: {\n          title: params.flavor,\n          subtitle: actor.name,\n        }\n      }\n    }\n    const message = {\n      create: true,\n      data: { flavor: params.flavor },\n      speaker: ChatMessage.getSpeaker({ actor }),\n      rollMode: params.rollMode,\n    }\n    const rolls = await D20Roll.build(config, dialog, message)\n    // ({ title: data.request, defaultRollMode: data.rollMode, defaultAction: data.options?.advantage });\n    // result = await roll.roll();\n    if (timeoutId) clearTimeout(timeoutId);\n    if (rolls) foundry.utils.setProperty(rolls[0], \"flags.midi-qol.rollType\", params.midiType)\n    resolve(rolls[0] ?? {})\n  });\n}\nasync function rollConcentration(data: { actorUuid: string, target: number, whisper: string[], create: boolean, rollMode: string }) {\n  const actor = fromUuidSync(data.actorUuid) as Actor.Implementation | null;\n  if (!actor) {\n    error(`GMAction.rollConcentration | no actor for ${data.actorUuid}`)\n    return {};\n  }\n  //@ts-expect-error no dnd5e types\n  return actor.rollConcentration({ target: data.target, legacy: false }, {}, { create: data.create, whisper: data.whisper, rollMode: data.rollMode });\n}\n\nasync function rollAbility(data: {\n  saveDetails: SaveDetails;\n  displayOptions?: {\n    fastForward?: boolean;\n    chatMessage?: boolean;\n    rollMode?: string;\n    showTargetDC?: boolean;\n  };\n  // Legacy fields from pre-13.0.44 callers\n  request?: string;\n  targetUuid?: string;\n  ability?: string;\n  skill?: string;\n  tool?: string;\n  options?: any;\n  advantage?: boolean;\n  disadvantage?: boolean;\n  isMagicSave?: boolean;\n  isConcentrationCheck?: boolean;\n  rollDC?: number;\n  saveItemUuid?: string;\n  workflowOptions?: object;\n  workflowId?: string;\n  rollMode?: string;\n}) {\n  // Backward compatibility: migrate pre-13.0.44 flat argument format to new structure\n  if (!data.saveDetails && data.targetUuid) {\n    foundry.utils.logCompatibilityWarning(\n      \"midi-qol | rollAbility called with legacy flat argument format. Use { saveDetails, displayOptions } instead.\",\n      { since: \"midi-qol 13.0.44\", until: \"midi-qol 13.1.0\" }\n    );\n    data.saveDetails = {\n      actorUuid: data.targetUuid,\n      rollType: data.request ?? \"save\",\n      rollAbilities: data.ability ? [data.ability] : [],\n      rollSkills: data.skill ? [data.skill] : [],\n      rollTools: data.tool ? [data.tool] : [],\n      advantage: data.advantage,\n      disadvantage: data.disadvantage,\n      isMagicSave: data.isMagicSave ?? false,\n      isConcentrationCheck: data.isConcentrationCheck,\n      isFriendly: false,\n      rollDC: data.rollDC ?? 0,\n      saveItemUuid: data.saveItemUuid ?? \"\",\n      workflowOptions: data.workflowOptions ?? {},\n      workflowId: data.workflowId ?? \"\",\n      itemCardUuid: \"\",\n      itemId: data.options?.itemId ?? \"\",\n      modifierTracker: undefined,\n    };\n    data.displayOptions = {\n      fastForward: data.options?.fastForward,\n      chatMessage: data.options?.chatMessage ?? data.options?.create,\n      rollMode: data.options?.rollMode ?? data.rollMode,\n    };\n  }\n  const sd = data.saveDetails;\n  const disp = data.displayOptions;\n\n  const rollAbilities = sd.rollAbilities ?? [];\n  const rollSkills = sd.rollSkills ?? [];\n  const rollTools = sd.rollTools ?? [];\n  const ability = rollAbilities[0];\n  const skill = rollSkills[0];\n  const tool = rollTools[0];\n  const advantage = sd.advantage;\n  const disadvantage = sd.disadvantage;\n  const isMagicSave = sd.isMagicSave;\n  const isConcentrationCheck = sd.isConcentrationCheck;\n  const rollDC = disp?.showTargetDC !== false ? sd.rollDC : undefined;\n  const saveItemUuid = sd.saveItemUuid;\n  const workflowOptions = sd.workflowOptions;\n  const workflowId = sd.workflowId;\n  const itemId = sd.itemId;\n  const itemCardUuid = sd.itemCardUuid;\n  const advantageByChoice = sd.advantageByChoice;\n\n  const fastForward = disp?.fastForward ?? false;\n  const chatMessage = disp?.chatMessage ?? true;\n  const rollMode = disp?.rollMode;\n\n  // Normalize request type\n  let normalizedRequest = sd.rollType;\n  if (normalizedRequest === \"abil\") normalizedRequest = \"check\";\n  if (normalizedRequest === \"test\") normalizedRequest = \"check\";\n\n  const actor = fromActorUuid(sd.actorUuid);\n  if (!actor) {\n    error(`GMAction.rollAbility | no actor for ${sd.actorUuid}`)\n    return {};\n  }\n\n  // Build midiOptions for patching.ts\n  // advantage/disadvantage seed computeAdvantageFlags via options.advantage so the\n  // midi-qol.preTargetSave hook's saveDetails.advantage actually applies. The flag is\n  // also kept on the top-level config below for the applyPreComputedAdvantage path.\n  const midiOptions: MidiOptions = {\n    workflowId,\n    rollAbilities,\n    rollSkills,\n    rollTools,\n    advantageByChoice,\n    recomputeAdvantage: true,\n    target: rollDC,\n    isMagicSave,\n    saveItemUuid,\n    isConcentrationCheck,\n    workflowOptions,\n    itemCardUuid,\n    advantage,\n    disadvantage,\n  };\n\n  let config: RollProcessConfig = {\n    midiOptions,\n    advantage,\n    disadvantage,\n    workflowOptions,\n  };\n\n  // Reconstruct tracker instances from advantageByChoice - class instances don't survive socketlib\n  // (tracker.toJSON() is called automatically during serialization, so tracker is a plain object after transmission)\n  if (advantageByChoice && typeof advantageByChoice === \"object\") {\n    for (const [key, value] of Object.entries(advantageByChoice)) {\n      if (value?.tracker && !(value.tracker instanceof RollModifierTracker)) {\n        const trackerData = value.tracker;\n        value.tracker = new RollModifierTracker();\n        (value.tracker as RollModifierTracker).restore(trackerData);\n      }\n    }\n  }\n\n  if (ability) config.ability = ability;\n  if (skill) config.skill = skill;\n  if (tool) config.tool = tool;\n  let dialog: RollDialogConfig = { configure: !fastForward };\n  let message: RollMessageConfig = { create: chatMessage, rollMode: rollMode as RollMessageConfig[\"rollMode\"] };\n  if (normalizedRequest === \"tool\") {\n    const toolsToTry = rollTools.length > 0 ? rollTools : (tool ? [tool] : []);\n    let toolItem: Item.Implementation | undefined;\n    let foundToolId: string | undefined;\n    // Try to find a tool item matching any of the requested tools\n    for (const toolId of toolsToTry) {\n      if (!toolId) continue;\n      toolItem = actor.items.get(itemId ?? \"\") as Item.Implementation | undefined;\n      // @ts-expect-error no dnd5e-types\n      if (!toolItem || toolItem.type !== \"tool\") toolItem = actor.items.find(i => i.type === \"tool\" && i.system.type.baseItem === toolId) as Item.Implementation | undefined;\n      if (toolItem) { foundToolId = toolId; break; }\n    }\n    if (!toolItem) { // no tool of any requested type - auto fail\n      //@ts-expect-error\n      return [await new CONFIG.Dice.D20Roll(\"-1\").roll()];\n    } else {\n      // @ts-expect-error no dnd5e-types\n      config.bonus = toolItem?.system.bonus ?? 0;\n      // @ts-expect-error no dnd5e-types\n      config.prof = toolItem?.system.prof;\n      config.item = toolItem;\n      if (foundToolId && foundToolId !== tool) config.tool = foundToolId;\n    }\n  }\n  if (rollMode) message.rollMode = rollMode as RollMessageConfig[\"rollMode\"];\n  return new Promise(async (resolve) => {\n    let timeoutId: NodeJS.Timeout | undefined;\n    let result: Roll[] | Roll | undefined;\n    if (configSettings.playerSaveTimeout > 0) timeoutId = setTimeout(async () => {\n      warn(`Roll request for ${actor.name} timed out. Doing roll`);\n      dialog.configure = false; // assume player is asleep force roll without dialog\n      // @ts-expect-error no dnd5e-types\n      if (normalizedRequest === \"save\") result = await actor.rollSavingThrow(config, dialog, message);\n      // @ts-expect-error no dnd5e-types\n      else if (normalizedRequest === \"check\") result = await actor.rollAbilityCheck(config, dialog, message);\n      // @ts-expect-error no dnd5e-types\n      else if (normalizedRequest === \"skill\") result = await actor.rollSkill(config, dialog, message);\n      // @ts-expect-error no dnd5e-types\n      else if (normalizedRequest === \"tool\") result = await actor.rollToolCheck(config, dialog, message);\n      // @ts-expect-error no dnd5e-types\n      else if (normalizedRequest === \"deathSave\") result = await actor.rollDeathSave(config, dialog, message);\n      resolve(result ?? {});\n    }, configSettings.playerSaveTimeout * 1000);\n    // @ts-expect-error no dnd5e-types\n    if (normalizedRequest === \"save\") result = await actor.rollSavingThrow(config, dialog, message);\n    // @ts-expect-error no dnd5e-types\n    else if (normalizedRequest === \"check\") result = await actor.rollAbilityCheck(config, dialog, message);\n    // @ts-expect-error no dnd5e-types\n    else if (normalizedRequest === \"skill\") result = await actor.rollSkill(config, dialog, message);\n    // @ts-expect-error no dnd5e-types\n    else if (normalizedRequest === \"tool\") result = await actor.rollToolCheck(config, dialog, message);\n    // @ts-expect-error no dnd5e-types\n    else if (normalizedRequest === \"deathSave\") result = await actor.rollDeathSave(config, dialog, message);\n    if (timeoutId) clearTimeout(timeoutId);\n    resolve(result ?? {})\n  });\n}\n\nfunction monksTokenBarSaves(data: {\n  tokenData: MonksTokenBarRequest[];\n  request: string;\n  silent: boolean;\n  showdc: boolean;\n  rollMode: string;\n  dc?: number;\n}) {\n  // MTB requestRoll options only reads: request, silent, rollmode, dc, showdc, callback\n  //@ts-expect-error MonksTokenBar\n  game.MonksTokenBar?.requestRoll(\n    data.tokenData,\n    {\n      request: data.request,\n      silent: data.silent,\n      showdc: data.showdc,\n      rollmode: data.rollMode,\n      dc: data.dc,\n    });\n}\n\nfunction flashTokenBarSaves(data: {\n  requestType: string;\n  rollKey: string;\n  actorIds: string[];\n  dc: number | undefined;\n  advantage: boolean | undefined;\n  disadvantage: boolean | undefined;\n  skipRollDialog: boolean;\n  sendAsRequest: boolean;\n  rollMode: string | undefined;\n  workflowId: string;\n}) {\n  if (debugEnabled > 0) debug(\"flashTokenBarSaves | Called with data:\", data);\n\n  //@ts-expect-error FlashAPI\n  if (typeof FlashAPI !== 'undefined') {\n    if (debugEnabled > 0) debug(\"flashTokenBarSaves | FlashAPI found, calling requestRoll\");\n    // FlashAPI.requestRoll reads: requestType, rollKey, actorIds, dc, advantage,\n    // disadvantage, rollMode, skipRollDialog, sendAsRequest, workflowId\n    //@ts-expect-error FlashAPI\n    FlashAPI.requestRoll({\n      requestType: data.requestType,\n      rollKey: data.rollKey,\n      actorIds: data.actorIds,\n      dc: data.dc,\n      advantage: data.advantage,\n      disadvantage: data.disadvantage,\n      skipRollDialog: data.skipRollDialog,\n      sendAsRequest: data.sendAsRequest,\n      rollMode: data.rollMode,\n      workflowId: data.workflowId\n    });\n  } else {\n    error(\"flashTokenBarSaves | FlashAPI not found! Is flash-rolls-5e module active?\");\n  }\n}\n\nasync function createReverseDamageCard(data: {\n  damageList: SerializedDamageListEntry[];\n  autoApplyDamage: string;\n  flagTags: any,\n  sender: string,\n  charName: string,\n  actorId: string,\n  actorUuid?: string,\n  forceApply: boolean,\n  updateOptions: any,\n}): Promise<string[]> {\n  let cardIds: string[] = [];\n  let startTime;\n  startTime = Date.now();\n  const newDamageList = recoverDamageListFromJSON(data.damageList);\n  let id = await createPlayerDamageCard({ ...data, damageList: newDamageList });\n  if (id) cardIds.push(id);\n  if (data.damageList.some(di => di.wasHit)) {\n    id = await createGMReverseDamageCard({ ...data, damageList: newDamageList }, true);\n    if (id) cardIds.push(id);\n  }\n  if (data.damageList.some(di => !di.wasHit) && [\"yesCardMisses\", \"noCardMisses\"].includes(data.autoApplyDamage)) {\n    id = await createGMReverseDamageCard({ ...data, damageList: newDamageList }, false);\n    if (id) cardIds.push(id);\n  }\n  console.log(\"createReverseDamageCard took \", Date.now() - startTime, \"ms\");\n  return cardIds;\n}\n\ninterface DamageListContextEntry {\n  isCharacter: boolean;\n  isNpc: boolean;\n  actorUuid: string;\n  targetUuid: string;\n  displayUuid: string;\n  tokenId?: string;\n  tokenImg: string;\n  hpDamage: number;\n  abshpDamage: number;\n  tempDamage: number;\n  totalDamage: number;\n  rawTotalDamage?: number;\n  halfDamage: number;\n  doubleDamage: number;\n  playerViewTotalDamage: number;\n  absDamage: number;\n  tokenName: string;\n  dmgSign: string;\n  damageItem: DamageListEntry;\n  oldVitality?: number;\n  newVitality?: number;\n  vitalityIncrease?: boolean;\n  tempHpIncrease?: boolean;\n  hpChanged?: boolean;\n  tempHpChanged?: boolean;\n  vitalityChanged?: boolean;\n  tempMaxChanged?: boolean;\n  noChange?: boolean;\n  buttonId: string;\n  iconPrefix: string;\n  tooltip?: string;\n  // Healing display properties\n  isHealing: boolean;\n  absRawTotalDamage: number;\n  absPlayerViewTotalDamage: number;\n  // Direct vitality damage/healing from damage detail (not overflow)\n  vitalityDamage?: number;\n  absVitalityDamage?: number;\n  vitalityDamageIsHealing?: boolean;\n}\n\n/** Helper to calculate damage amounts from a damage detail array */\nfunction calculateDamageAmounts(damageDetail: DamageDescription[]): { amount: number; temp: number; healing: number; vitality: number; tempMax: number } {\n  return damageDetail.reduce((acc, d) => {\n    if (d.type === \"temphp\") acc.temp += d.value;\n    else if (d.type === \"vitality\") acc.vitality += d.value; // Vitality damage (positive) or healing (negative)\n    else if (d.type === \"maximum\") acc.tempMax += d.value; // Max HP reduction (positive = reduce max)\n    else if (d.type === \"healing\" || d.active?.absorption || (d.active?.type as Record<string, boolean> | undefined)?.absorption) acc.healing += d.value;\n    else if (d.type !== \"midi-none\") acc.amount += d.value;\n    return acc;\n  }, { amount: 0, temp: 0, healing: 0, vitality: 0, tempMax: 0 });\n}\n\n/** Helper to update damage card display elements */\n/**\n * Update damage card display using stored original values.\n * @param html - The chat message HTML element\n * @param actorUuid - The actor's UUID\n * @param undoEntry - The stored damage data\n * @param showUndoMode - If true, show what undo would do (healing to restore); if false, show original damage\n */\nfunction updateDamageCardDisplay(\n  html: HTMLElement,\n  actorUuid: string,\n  undoEntry: DamageListEntry,\n  showUndoMode: boolean\n): void {\n  const displayUuid = actorUuid.replaceAll(\".\", \"\");\n  const { oldHP, newHP, oldTempHP, newTempHP, oldVitality, newVitality, oldTempMax, newTempMax } = undoEntry;\n\n  // In undo mode, we're showing what undo would do (restore to old state = healing)\n  // In apply mode, we're showing the original damage\n  const isHealing = showUndoMode;\n\n  // For undo mode, use CURRENT actor values as \"from\" (not stored newHP)\n  // This handles multiple damage applications with multipliers\n  let fromHP: number, toHP: number, fromTempHP: number, toTempHP: number;\n  let fromVitality: number | undefined, toVitality: number | undefined;\n  let fromTempMax: number | undefined, toTempMax: number | undefined;\n\n  if (showUndoMode) {\n    // Undo mode: restore from current state to original old values\n    const actor = fromActorUuid(actorUuid);\n    // @ts-expect-error no dnd5e types\n    fromHP = actor?.system.attributes.hp.value ?? newHP ?? 0;\n    // @ts-expect-error no dnd5e types\n    fromTempHP = actor?.system.attributes.hp.temp ?? newTempHP ?? 0;\n    toHP = oldHP ?? 0;\n    toTempHP = oldTempHP ?? 0;\n\n    // Get current tempmax from actor\n    if (oldTempMax !== undefined) {\n      // @ts-expect-error no dnd5e types\n      fromTempMax = actor?.system.attributes.hp.tempmax ?? newTempMax ?? 0;\n      toTempMax = oldTempMax;\n    }\n\n    // Get current vitality from actor\n    const vitalityItem = getVitalityItem(actor);\n    if (vitalityItem && oldVitality !== undefined) {\n      // @ts-expect-error uses exists on items with uses\n      const currentSpent = vitalityItem.system.uses?.spent ?? 0;\n      // @ts-expect-error uses exists on items with uses\n      const maxUses = vitalityItem.system.uses?.max ?? 0;\n      fromVitality = maxUses - currentSpent;\n      toVitality = oldVitality;\n    }\n  } else {\n    // Apply mode: apply damage from old values to new values\n    fromHP = oldHP ?? 0;\n    toHP = newHP ?? 0;\n    fromTempHP = oldTempHP ?? 0;\n    toTempHP = newTempHP ?? 0;\n    fromVitality = oldVitality;\n    toVitality = newVitality;\n    fromTempMax = oldTempMax;\n    toTempMax = newTempMax;\n  }\n\n  // Calculate the actual changes from stored values\n  const hpDelta = Math.abs((toHP ?? 0) - (fromHP ?? 0));\n  const tempHpDelta = Math.abs((toTempHP ?? 0) - (fromTempHP ?? 0));\n  const vitalityDelta = Math.abs((toVitality ?? 0) - (fromVitality ?? 0));\n  const tempMaxDelta = Math.abs((toTempMax ?? 0) - (fromTempMax ?? 0));\n\n  // Total damage = HP change + TempHP change\n  const totalDamage = hpDelta + tempHpDelta;\n\n  const hpChanged = hpDelta > 0;\n  const tempHpChanged = tempHpDelta > 0;\n  const vitalityChanged = vitalityDelta > 0;\n  const tempMaxChanged = tempMaxDelta > 0;\n  const noChange = !hpChanged && !tempHpChanged && !vitalityChanged && !tempMaxChanged;\n\n  const totalSpan = html.querySelector<HTMLSpanElement>(`#dmg-total-${displayUuid}`);\n  const tempSpan = html.querySelector<HTMLSpanElement>(`#dmg-temp-${displayUuid}`);\n  const hpSpan = html.querySelector<HTMLSpanElement>(`#dmg-hp-${displayUuid}`);\n  const noChangeSpan = html.querySelector<HTMLSpanElement>(`#dmg-nochange-${displayUuid}`);\n  const vitalitySpan = html.querySelector<HTMLSpanElement>(`#dmg-vitality-${displayUuid}`);\n  const directVitalitySpan = html.querySelector<HTMLSpanElement>(`#dmg-vit-direct-${displayUuid}`);\n  const tempMaxSpan = html.querySelector<HTMLSpanElement>(`#dmg-tempmax-${displayUuid}`);\n\n  // Update total damage display - sum of HP and TempHP changes\n  if (totalSpan) {\n    const hasDamage = totalDamage > 0;\n    totalSpan.classList.toggle(\"midi-qol-dmg-hidden\", !hasDamage && noChange);\n    totalSpan.classList.toggle(\"midi-qol-dmg-healing\", isHealing);\n    const signSpan = totalSpan.querySelector<HTMLSpanElement>(\".dmg-total-sign\");\n    if (signSpan) signSpan.textContent = isHealing ? \"+\" : \"-\";\n    const valueSpan = totalSpan.querySelector<HTMLSpanElement>(\".dmg-total-value\");\n    if (valueSpan) valueSpan.textContent = String(Math.trunc(totalDamage));\n  }\n\n  // Update direct vitality damage display - actual vitality change\n  if (directVitalitySpan) {\n    directVitalitySpan.classList.toggle(\"midi-qol-dmg-hidden\", !vitalityChanged);\n    directVitalitySpan.classList.toggle(\"midi-qol-dmg-healing\", isHealing);\n    const signSpan = directVitalitySpan.querySelector<HTMLSpanElement>(\".dmg-vit-sign\");\n    if (signSpan) signSpan.textContent = isHealing ? \"+\" : \"-\";\n    const valueSpan = directVitalitySpan.querySelector<HTMLSpanElement>(\".dmg-vit-value\");\n    if (valueSpan) valueSpan.textContent = String(Math.trunc(vitalityDelta));\n  }\n\n  // Update temp HP display\n  if (tempSpan) {\n    tempSpan.classList.toggle(\"midi-qol-dmg-hidden\", !tempHpChanged);\n    tempSpan.classList.toggle(\"midi-qol-dmg-healing\", (toTempHP ?? 0) > (fromTempHP ?? 0));\n    const tempOld = tempSpan.querySelector<HTMLSpanElement>(\".dmg-temp-old\");\n    const tempNew = tempSpan.querySelector<HTMLSpanElement>(\".dmg-temp-new\");\n    if (tempOld) tempOld.textContent = String(Math.trunc(fromTempHP ?? 0));\n    if (tempNew) tempNew.textContent = String(Math.trunc(toTempHP ?? 0));\n  }\n\n  // Update HP display\n  if (hpSpan) {\n    hpSpan.classList.toggle(\"midi-qol-dmg-hidden\", !hpChanged);\n    hpSpan.classList.toggle(\"midi-qol-dmg-healing\", isHealing);\n    const hpOld = hpSpan.querySelector<HTMLSpanElement>(\".dmg-hp-old\");\n    const hpNew = hpSpan.querySelector<HTMLSpanElement>(\".dmg-hp-new\");\n    if (hpOld) hpOld.textContent = String(Math.trunc(fromHP ?? 0));\n    if (hpNew) hpNew.textContent = String(Math.trunc(toHP ?? 0));\n  }\n\n  // Update vitality transition display\n  if (vitalitySpan) {\n    if (vitalityChanged && fromVitality !== undefined && toVitality !== undefined) {\n      vitalitySpan.classList.remove(\"midi-qol-dmg-hidden\");\n      vitalitySpan.classList.toggle(\"midi-qol-dmg-healing\", toVitality > fromVitality);\n      const vitOld = vitalitySpan.querySelector<HTMLSpanElement>(\".dmg-vit-old\");\n      const vitNew = vitalitySpan.querySelector<HTMLSpanElement>(\".dmg-vit-new\");\n      if (vitOld) vitOld.textContent = String(Math.trunc(fromVitality));\n      if (vitNew) vitNew.textContent = String(Math.trunc(toVitality));\n    } else {\n      vitalitySpan.classList.add(\"midi-qol-dmg-hidden\");\n    }\n  }\n\n  // Update tempMax (max HP reduction) display\n  if (tempMaxSpan) {\n    if (tempMaxChanged && fromTempMax !== undefined && toTempMax !== undefined) {\n      tempMaxSpan.classList.remove(\"midi-qol-dmg-hidden\");\n      const tmOld = tempMaxSpan.querySelector<HTMLSpanElement>(\".dmg-tempmax-old\");\n      const tmNew = tempMaxSpan.querySelector<HTMLSpanElement>(\".dmg-tempmax-new\");\n      if (tmOld) tmOld.textContent = String(Math.trunc(fromTempMax));\n      if (tmNew) tmNew.textContent = String(Math.trunc(toTempMax));\n    } else {\n      tempMaxSpan.classList.add(\"midi-qol-dmg-hidden\");\n    }\n  }\n\n  // Update no change display\n  if (noChangeSpan) {\n    noChangeSpan.classList.toggle(\"midi-qol-dmg-hidden\", !noChange);\n  }\n}\n\n/**\n * Helper to update the HP status header based on the state of all damage rows.\n * Shows \"HP Updated\", \"HP Not Updated\", or \"HP Partially Updated (X/Y)\" based on applied states.\n * Also updates the data-hp-applied attribute on individual rows.\n */\nfunction updateHPStatusHeader(html: HTMLElement, actorUuid?: string, applied?: boolean): void {\n  // If actorUuid is provided, update that specific row's data attribute\n  if (actorUuid) {\n    const displayUuid = actorUuid.replaceAll(\".\", \"\");\n    // Support both flexbox (.midi-qol-dmg-row) and classic (.midi-qol-dmg-row-classic) templates\n    const row = html.querySelector<HTMLElement>(`.midi-qol-dmg-row[data-actor-uuid=\"${displayUuid}\"], .midi-qol-dmg-row-classic[data-actor-uuid=\"${displayUuid}\"]`);\n    if (row) {\n      row.dataset.hpApplied = applied ? \"true\" : \"false\";\n    }\n  }\n\n  // Count how many rows have HP applied (support both flexbox and classic templates)\n  const allRows = html.querySelectorAll<HTMLElement>(\".midi-qol-dmg-row[data-actor-uuid], .midi-qol-dmg-row-classic[data-actor-uuid]\");\n  if (allRows.length === 0) return;\n\n  let appliedCount = 0;\n  let totalCount = 0;\n  allRows.forEach(row => {\n    if (row.dataset.actorUuid) {\n      totalCount++;\n      if (row.dataset.hpApplied === \"true\") appliedCount++;\n    }\n  });\n\n  // Update the header text (target the span to preserve the caret icon)\n  const headerText = html.querySelector<HTMLElement>(\"#midi-qol-dmg-header .midi-qol-dmg-header-text\");\n  if (headerText) {\n    if (appliedCount === 0) {\n      headerText.textContent = i18n(\"midi-qol.HPNotUpdated\");\n    } else if (appliedCount === totalCount) {\n      headerText.textContent = i18n(\"midi-qol.HPUpdated\");\n    } else {\n      // Partial update - show count\n      headerText.textContent = `${i18n(\"midi-qol.HPUpdated\")} (${appliedCount}/${totalCount})`;\n    }\n  }\n}\n\n/** Helper to generate tooltip HTML for a damage item */\nfunction generateDamageTooltip(damageItem: DamageListEntry, tokenName?: string): string {\n  const tooltipList = damageItem.damageDetail?.map(di => {\n    let allMods: string[];\n    if (isDnd5e53) {\n      // 5.3+: all boolean flags nested under all/type\n      allMods = [];\n      for (const cat of [\"modification\", \"resistance\", \"vulnerability\", \"immunity\",\n        \"absorption\", \"DR\", \"saved\", \"uncannyDodge\", \"spell\", \"magic\", \"nonmagic\"]) {\n        if (di.active?.all?.[cat] || di.active?.type?.[cat]) allMods.push(cat);\n      }\n      if (di.active?.threshold) allMods.push(\"threshold\");\n    } else {\n      // 5.2.x: all keys flat\n      allMods = Object.keys(di.active ?? {}).reduce((acc: string[], k) => {\n        if (k === \"semiSuperSaver\" || k === \"superSaver\" || k === \"inlined\") return acc;\n        if (di.active?.[k] && k !== \"multiplier\") acc.push(k);\n        return acc;\n      }, []);\n    }\n    if ((di.allActives?.length ?? 0) > 0) allMods = allMods.concat(di.allActives!);\n    let mods = (allMods.length > 0) ? `| ${allMods.join(\",\")}` : \"\";\n    const displayVal = di.displayValue ?? di.value;\n    return `${displayVal > 0 ? Math.floor(displayVal) : Math.ceil(displayVal)} ${{ ...GameSystemConfig.damageTypes, ...GameSystemConfig.healingTypes }[di.type === \"\" ? \"none\" : di.type]?.label ?? \"none\"} ${mods}`\n  }).map(s => s.replaceAll(\",,\", \",\").replaceAll(\",,\", \",\"));\n\n  const toolTipHeader: string[] = [];\n  if (damageItem.damageDetail) {\n    if (damageItem.newHP !== damageItem.oldHP) toolTipHeader.push(`HP: ${damageItem.oldHP} -> ${damageItem.newHP}`);\n    if ((damageItem.newTempHP ?? 0) !== (damageItem.oldTempHP ?? 0)) toolTipHeader.push(`TempHP: ${damageItem.oldTempHP} -> ${damageItem.newTempHP}`);\n    if ((damageItem.newVitality ?? 0) !== (damageItem.oldVitality ?? 0)) toolTipHeader.push(`Vitality: ${damageItem.oldVitality} -> ${damageItem.newVitality}`);\n    if ((damageItem.newTempMax ?? 0) !== (damageItem.oldTempMax ?? 0)) toolTipHeader.push(`Max HP: ${damageItem.oldTempMax} -> ${damageItem.newTempMax}`);\n    if (damageItem.superSaver) toolTipHeader.push(\"Super Saved\");\n    else if (damageItem.semiSuperSaver) toolTipHeader.push(\"Semi Super Saved\");\n    else if (damageItem.saved) toolTipHeader.push(\"Saved\");\n    if (damageItem.uncannyDodge) toolTipHeader.push(\"Uncanny Dodge\");\n    if (damageItem.details?.length > 0) toolTipHeader.push(...damageItem.details);\n  }\n  const parts: string[] = [];\n  if (tokenName) parts.push(`<b>${tokenName}</b>`);\n  parts.push(...(toolTipHeader ?? []), ...(tooltipList ?? []));\n  return parts.join(\"<br>\");\n}\n\nasync function prepareDamageListItems(\n  data: {\n    damageList: DamageListEntry[];\n    autoApplyDamage: string;\n    flagTags: any;\n    forceApply: boolean;\n    updateOptions: any;\n  },\n  templateData: {\n    damageApplied: string;\n    damageWasApplied?: boolean;\n    damageList: DamageListContextEntry[];\n    needsButtonAll: boolean;\n    showNPC?: boolean,\n    playerButtons?: boolean;\n  },\n  tokenDataList: DamageListEntry[],\n  createPromises: boolean = false,\n  showNPC: boolean = true,\n  doHits: boolean = true\n): Promise<void> {\n  const damageList = data.damageList;\n  let promises: Promise<any>[] = [];\n\n  for (let damageItem of damageList) {\n    let { targetUuid, actorId, actorUuid, oldHP, newHP, hpDamage, wasHit } = damageItem;\n    if (doHits && !wasHit) continue;\n    if (!doHits && wasHit) continue;\n    let tokenDocument = fromUuidSync(targetUuid) as TokenDocument.Implementation | null;\n    let actor = fromUuidSync(actorUuid) as Actor.Implementation | null;\n\n    if (!actor) {\n      if (debugEnabled > 0) warn(`GMAction: reverse damage card could not find actor to update HP targetUuid ${targetUuid} actorUuid ${actorUuid}`);\n      continue;\n    }\n    if (!showNPC && !actor.hasPlayerOwner) continue;\n\n    // let newTempHP = Math.max(0, oldTempHP - tempDamage);\n    // @ts-expect-error no dnd5e-types\n    if (actor.isOwner && (data.autoApplyDamage !== \"yesCardNPC\" || actor.type !== \"character\")) {\n      // @ts-expect-error no dnd5e-types\n      const hp = actor.system.attributes.hp;\n      let { amount, temp, healing, vitality: vitalityDamage, tempMax } = calculateDamageAmounts(damageItem.damageDetail);\n      amount = Math.max(0, amount);\n      tempMax = Math.trunc(tempMax);\n      const { amount: rawAmount, healing: rawHealing, vitality: rawVitality } = calculateDamageAmounts(damageItem.rawDamageDetail);\n      damageItem.totalDamage = damageItem.damageDetail.reduce((acc, d) => acc + (![\"temphp\", \"midi-none\", \"vitality\", \"maximum\"].includes(d.type) ? d.value : 0), 0);\n      amount = amount + healing;\n      amount = amount > 0 ? Math.floor(amount) : Math.ceil(amount);\n\n      let deltaTemp = amount > 0 ? Math.min(hp.temp, amount) : 0;\n      // Since tempDamage represents the final change in tempHP - we can use it for calcs and it is ignored.\n\n      // tempMax adjusts the clamp bounds: positive tempMax forces hp.value down if it would exceed new effective max\n      let deltaHP = Math.clamp(amount - deltaTemp, -hp.damage + tempMax, hp.value - tempMax);\n      if (hpDamage !== deltaHP && tempMax === 0) {\n        error(`damage detail amount ${amount} !== hpDamage ${hpDamage}`, configSettings.useDamageDetail ? \"ignoring hpDamage\" : \"using hpDamage\");\n        if (!configSettings.useDamageDetail) deltaHP = hpDamage;\n      }\n      const updates: Actor.UpdateData = {\n        // @ts-expect-error no dnd5e-types\n        \"system.attributes.hp.temp\": hp.temp - deltaTemp,\n        \"system.attributes.hp.value\": hp.value - deltaHP\n      };\n      // Apply tempmax reduction (positive tempMax = reduce max HP)\n      if (tempMax !== 0) {\n        updates[\"system.attributes.hp.tempmax\"] = (hp.tempmax ?? 0) - tempMax;\n      }\n\n      if (temp > updates[\"system.attributes.hp.temp\"]) updates[\"system.attributes.hp.temp\"] = temp;\n      damageItem.newTempHP = updates[\"system.attributes.hp.temp\"];\n      damageItem.newHP = updates[\"system.attributes.hp.value\"];\n      damageItem.oldTempMax = hp.tempmax ?? 0;\n      damageItem.newTempMax = updates[\"system.attributes.hp.tempmax\"] ?? damageItem.oldTempMax;\n      damageItem.hpDamage = deltaHP;\n      damageItem.tempDamage = deltaTemp;\n      // Include healing and vitality in rawTotalDamage so it displays correctly\n      damageItem.rawTotalDamage = rawAmount + rawHealing + rawVitality;\n\n      // Handle vitality system - always record current vitality state for undo support\n      const vitalityItem = getVitalityItem(actor);\n      let vitalityItemUpdatePromise: Promise<any> | undefined;\n\n      if (vitalityItem) {\n        // Always record current vitality state so undo can restore it\n        // @ts-expect-error uses exists on items with uses\n        const currentSpent = vitalityItem.system.uses?.spent ?? 0;\n        // @ts-expect-error uses exists on items with uses\n        const maxUses = vitalityItem.system.uses?.max ?? 0;\n\n        // Record old vitality state for undo support\n        damageItem.oldVitalitySpent = currentSpent;\n        damageItem.oldVitality = maxUses - currentSpent;\n        // Default new to unchanged - only updated if there's overflow or direct vitality damage\n        damageItem.newVitalitySpent = currentSpent;\n        damageItem.newVitality = maxUses - currentSpent;\n\n        let newSpent = currentSpent;\n\n        // Handle direct vitality damage type (positive = damage, negative = healing)\n        if (vitalityDamage !== 0) {\n          if (vitalityDamage > 0) {\n            // Vitality damage - increase spent (reduce vitality)\n            newSpent = Math.min(maxUses, currentSpent + Math.floor(vitalityDamage));\n          } else {\n            // Vitality healing - decrease spent (restore vitality)\n            newSpent = Math.max(0, currentSpent + Math.ceil(vitalityDamage));\n          }\n        }\n\n        // Check for overflow damage when HP reaches 0 (only if not already handling direct vitality damage)\n        if (updates[\"system.attributes.hp.value\"] <= 0 && amount > 0) {\n          const overflowDamage = amount - (hp.temp + hp.value);\n\n          if (overflowDamage > 0) {\n            // Add overflow damage to vitality spent\n            newSpent = Math.min(maxUses, newSpent + overflowDamage);\n          }\n        }\n\n        // Update if vitality changed\n        if (newSpent !== currentSpent) {\n          damageItem.newVitalitySpent = newSpent;\n          damageItem.newVitality = maxUses - newSpent;\n\n          // Queue vitality item update (will be executed after actor update)\n          if (createPromises && doHits && (data.autoApplyDamage.includes(\"yes\") || data.forceApply)) {\n            // @ts-expect-error item update for uses.spent\n            vitalityItemUpdatePromise = vitalityItem.update({ \"system.uses.spent\": newSpent });\n          }\n        }\n      }\n\n      if (createPromises && doHits && (data.autoApplyDamage.includes(\"yes\") || data.forceApply)) {\n        //recover the options used when calculating the damage\n        // If midi-qol handled vitality (overflow or direct damage), mark it so the hook doesn't double-handle\n        if (vitalityItemUpdatePromise) {\n          (damageItem.calcDamageOptions as any).midiVitalityHandled = true;\n        }\n        if (Hooks.call(\"dnd5e.preApplyDamage\", actor, amount, updates, damageItem.calcDamageOptions as DamageApplicationOptions) !== false) {\n          // The actor update - when no changes are made will update the passed options with a target\n          // If vitality update is pending, flag it so updateActor hook skips checkWounded (updateItem hook will handle it)\n          const mergedOptions = foundry.utils.mergeObject(damageItem.calcDamageOptions, data.updateOptions ?? {}, { inplace: false }) as any;\n          if (vitalityItemUpdatePromise) {\n            mergedOptions.midiVitalityUpdatePending = true;\n          }\n          const updatePromise = actor.update(updates, mergedOptions).then(async updatedActor => {\n            // Wait for vitality item update if needed\n            // Note: checkWounded is called by the updateItem hook when vitality changes,\n            // so we don't need to call it explicitly here\n            if (vitalityItemUpdatePromise) {\n              await vitalityItemUpdatePromise;\n            }\n            if (updatedActor) Hooks.call(\"dnd5e.applyDamage\", updatedActor, amount, damageItem.calcDamageOptions as DamageApplicationOptions);\n            return updatedActor;\n          });\n          promises.push(updatePromise);\n        }\n      }\n    }\n    tokenDataList.push({\n      ...damageItem,\n      targetUuid,\n      actorUuid,\n      actorId,\n      totalDamage: Math.abs(Math.trunc(damageItem.totalDamage)),\n      damageDetail: damageItem.rawDamageDetail,\n      updateOptions: data.updateOptions ?? {}\n    });\n\n    let img = tokenDocument?.texture.src || actor.img as string;\n    // @ts-expect-error no dnd5e-types\n    if (configSettings.usePlayerPortrait && actor.type === \"character\")\n      img = actor.img as string;\n    if (foundry.helpers.media.VideoHelper.hasVideoExtension(img)) {\n      img = await game.video!.createThumbnail(img, { width: 100, height: 100 });\n    }\n\n    const playerViewTotalDamage = damageItem.hpDamage + damageItem.tempDamage;\n    const isHealing = (damageItem.rawTotalDamage ?? 0) < 0 || playerViewTotalDamage < 0;\n    // Extract direct vitality damage/healing from damage detail (not overflow) - only if vitality system is enabled\n    const vitalityEnabled = !!checkRule(\"vitalityItem\");\n    const directVitalityDamage = vitalityEnabled ? calculateDamageAmounts(damageItem.rawDamageDetail ?? damageItem.damageDetail ?? []).vitality : 0;\n    let listItem: DamageListContextEntry = {\n      isCharacter: actor.hasPlayerOwner,\n      isNpc: !actor.hasPlayerOwner,\n      actorUuid,\n      targetUuid,\n      displayUuid: actorUuid.replaceAll(\".\", \"\"),\n      tokenId: tokenDocument?.id ?? undefined,\n      tokenImg: img,\n      hpDamage,\n      abshpDamage: Math.abs(damageItem.hpDamage),\n      tempDamage: (damageItem.newTempHP ?? 0) - (damageItem.oldTempHP ?? 0),\n      totalDamage: Math.abs(Math.trunc(damageItem.totalDamage)),\n      rawTotalDamage: damageItem.rawTotalDamage,\n      halfDamage: Math.abs(Math.floor(damageItem.totalDamage / 2)),\n      doubleDamage: Math.abs(damageItem.totalDamage * 2),\n      playerViewTotalDamage,\n      absDamage: Math.abs(damageItem.hpDamage),\n      tokenName: (tokenDocument?.name && configSettings.useTokenNames) ? tokenDocument.name ?? actor.name : actor.name,\n      dmgSign: damageItem.hpDamage < 0 ? \"+\" : \"-\",\n      damageItem,\n      oldVitality: damageItem.oldVitality,\n      newVitality: damageItem.newVitality,\n      vitalityIncrease: (damageItem.newVitality ?? 0) > (damageItem.oldVitality ?? 0),\n      tempHpIncrease: (damageItem.newTempHP ?? 0) > (damageItem.oldTempHP ?? 0),\n      hpChanged: newHP !== oldHP,\n      tempHpChanged: (damageItem.newTempHP ?? 0) !== (damageItem.oldTempHP ?? 0),\n      vitalityChanged: (damageItem.newVitality ?? 0) !== (damageItem.oldVitality ?? 0),\n      tempMaxChanged: (damageItem.newTempMax ?? 0) !== (damageItem.oldTempMax ?? 0),\n      noChange: newHP === oldHP && (damageItem.newTempHP ?? 0) === (damageItem.oldTempHP ?? 0) && (damageItem.newVitality ?? 0) === (damageItem.oldVitality ?? 0) && (damageItem.newTempMax ?? 0) === (damageItem.oldTempMax ?? 0),\n      buttonId: actorUuid,\n      // @ts-expect-error no dnd5e-types\n      iconPrefix: (data.autoApplyDamage === \"yesCardNPC\" && actor.type === \"character\") ? \"*\" : \"\",\n      // Healing display properties\n      isHealing,\n      absRawTotalDamage: Math.abs(damageItem.rawTotalDamage ?? 0),\n      absPlayerViewTotalDamage: Math.abs(playerViewTotalDamage),\n      // Direct vitality damage/healing (not overflow)\n      vitalityDamage: directVitalityDamage,\n      absVitalityDamage: Math.abs(directVitalityDamage),\n      vitalityDamageIsHealing: directVitalityDamage < 0,\n    };\n\n    listItem.tooltip = generateDamageTooltip(damageItem, listItem.tokenName);\n\n    templateData.damageList.push(listItem);\n  }\n  const allPromises = Promise.all(promises).then((allPromised) => {\n    if (debugEnabled > 0) warn(\"GMAction.prepareDamageListItems: all promises completed\", allPromised);\n  });\n  const promisesStart = Date.now();\n  if (data.updateOptions?.awaitDamageApplication !== false) {\n    await allPromises;\n    debug(\"GMAction.prepareDamageListItems: awaited all promises\", Date.now() - promisesStart);\n  }\n}\n\n// Fetch the token, then use the tokenData.actor.id\nasync function createPlayerDamageCard(data: {\n  damageList: DamageListEntry[];\n  autoApplyDamage: string;\n  flagTags: any;\n  sender: string;\n  charName: string;\n  actorId: string;\n  actorUuid?: string;\n  forceApply: boolean;\n  updateOptions: any;\n}): Promise<string | undefined> {\n  let shouldShow = true;\n  let chatCardUuid: string | undefined;\n  if (configSettings.playerDamageCard === \"none\") return;\n  if (configSettings.playerCardDamageDifferent) {\n    shouldShow = false;\n    for (let damageItem of data.damageList) {\n      const { amount: rawAmount, healing: rawHealing } = calculateDamageAmounts(damageItem.rawDamageDetail);\n      // rawDamageDetail contains original positive healing values, but hpDamage is negative for healing\n      // Subtract rawHealing so the comparison works correctly for both damage and healing\n      const rawTotal = rawAmount - rawHealing;\n      if (rawTotal !== damageItem.hpDamage) {\n        shouldShow = true;\n        break;\n      }\n    }\n  }\n  if (!shouldShow) return;\n  let showNPC = [\"npcplayerresults\", \"npcplayerbuttons\"].includes(configSettings.playerDamageCard);\n  let playerButtons = [\"playerbuttons\", \"npcplayerbuttons\"].includes(configSettings.playerDamageCard);\n  const damageList = data.damageList;\n  let tokenDataList: DamageListEntry[] = [];\n  let templateData = {\n    damageApplied: [\"yes\", \"yesCard\", \"yesCardMisses\"].includes(data.autoApplyDamage) ? i18n(\"midi-qol.HPUpdated\") : i18n(\"midi-qol.HPNotUpdated\"),\n    damageList: [] as DamageListContextEntry[],\n    needsButtonAll: false,\n    showNPC,\n    playerButtons,\n    healingLabel: getHealingLabel()\n  };\n\n  await prepareDamageListItems(data, templateData, tokenDataList, false, showNPC, true)\n  if (templateData.damageList.length === 0) {\n    log(\"No damage data to show to player\");\n    return;\n  }\n\n  templateData.needsButtonAll = damageList.length > 1;\n  templateData.playerButtons = templateData.playerButtons && templateData.damageList.some(listItem => listItem.isCharacter);\n  if ([\"yesCard\", \"noCard\", \"yesCardNPC\", \"yesCardMisses\", \"noCardMisses\"].includes(data.autoApplyDamage)) {\n    const playerTemplate = configSettings.damageCardStyle === \"classic\"\n      ? \"modules/midi-qol/templates/damage-results-player-classic.html\"\n      : \"modules/midi-qol/templates/damage-results-player.html\";\n    const content = await foundry.applications.handlebars.renderTemplate(playerTemplate, templateData);\n    const speaker: any = ChatMessage.getSpeaker();\n    speaker.alias = data.sender;\n    let chatData: any = {\n      user: game.user?.id,\n      speaker: { scene: getCanvas()?.scene?.id, alias: data.charName, user: game.user?.id, actor: data.actorId },\n      content: content,\n      // whisper: ChatMessage.getWhisperRecipients(\"players\").filter(u => u.active).map(u => u.id),\n      flags: { \"midi-qol\": { \"undoDamage\": prepareDamageListToJSON(tokenDataList), playerDamageCard: true, actorUuid: data.actorUuid } }\n    };\n\n    chatData.style = CONST.CHAT_MESSAGE_STYLES.OTHER;\n    if (data.flagTags) chatData.flags = foundry.utils.mergeObject(chatData.flags ?? \"\", data.flagTags);\n    chatCardUuid = (await ChatMessage.create(chatData))?.uuid;\n  }\n  return chatCardUuid;\n}\n\n// Fetch the token, then use the tokenData.actor.id\nasync function createGMReverseDamageCard(\n  data: {\n    damageList: DamageListEntry[];\n    autoApplyDamage: string;\n    flagTags: any,\n    forceApply: boolean,\n    updateOptions: any,\n    actorUuid?: string,\n  },\n  doHits: boolean = true\n): Promise<string | undefined> {\n  const damageList = data.damageList;\n  let tokenDataList: DamageListEntry[] = [];\n  let chatCardUuid: string | undefined;\n  const damageWasApplied = (doHits && ([\"yes\", \"yesCard\", \"yesCardMisses\"].includes(data.autoApplyDamage) || data.forceApply));\n  let templateData = {\n    damageWasApplied,\n    damageApplied: damageWasApplied ? i18n(\"midi-qol.HPUpdated\") : data.autoApplyDamage === \"yesCardNPC\" ? i18n(\"midi-qol.HPNPCUpdated\") : i18n(\"midi-qol.HPNotUpdated\"),\n    damageList: [] as DamageListContextEntry[],\n    needsButtonAll: false\n  };\n  await prepareDamageListItems(data, templateData, tokenDataList, true, true, doHits)\n  templateData.needsButtonAll = damageList.length > 1;\n  if ([\"yesCard\", \"noCard\", \"yesCardNPC\", \"yesCardMisses\", \"noCardMisses\"].includes(data.autoApplyDamage)) {\n    const gmTemplate = configSettings.damageCardStyle === \"classic\"\n      ? \"modules/midi-qol/templates/damage-results-classic.html\"\n      : \"modules/midi-qol/templates/damage-results.html\";\n    const content = await foundry.applications.handlebars.renderTemplate(gmTemplate, templateData);\n    const speaker = ChatMessage.getSpeaker();\n    speaker.alias = game.user?.name;\n    let chatData: ChatMessage.CreateData = {\n      speaker: { scene: getCanvas()?.scene?.id, alias: game.user?.name },\n      content: content,\n      whisper: ChatMessage.getWhisperRecipients(\"GM\").filter(u => (u as User).active).map(u => u.id),\n      flags: { [MODULE_ID]: { \"undoDamage\": prepareDamageListToJSON(tokenDataList), actorUuid: data.actorUuid } }\n    };\n    chatData.style = CONST.CHAT_MESSAGE_STYLES.OTHER;\n    if (data.flagTags) chatData.flags = foundry.utils.mergeObject(chatData.flags ?? {}, data.flagTags);\n    chatCardUuid = (await ChatMessage.create(chatData))?.uuid;\n  }\n  return chatCardUuid;\n}\n\nexport let processUndoDamageCard = (message: ChatMessage.Implementation, html: HTMLElement, _data: unknown) => {\n  if (!message.flags?.[MODULE_ID]?.undoDamage) return true;\n\n  let button = html.querySelector<HTMLButtonElement>(\"#all-reverse\");\n  button?.addEventListener(\"click\", (ev) => {\n    (async () => {\n      // TODO: Remove the latter after sufficient time has passed\n      const undoFlag = message.flags?.[MODULE_ID]?.undoDamage ?? foundry.utils.getProperty(message, \"flags.midi-qol.undoDamage\") as SerializedDamageListEntry[];\n      const undoDamageData = recoverDamageListFromJSON(undoFlag);\n      if (undoDamageData) for (let { actorUuid, oldTempHP, oldHP, oldTempMax, newHP, newTempMax, calcDamageOptions, updateOptions } of undoDamageData) {\n        if (!actorUuid) continue;\n        const applyButton = html.querySelector<HTMLButtonElement>(`#apply-${actorUuid.replaceAll(\".\", \"\")}`);\n        applyButton?.children[0].classList.add(\"midi-qol-enable-damage-button\");\n        applyButton?.children[0].classList.remove(\"midi-qol-disable-damage-button\");\n        const reverseButton = html.querySelector<HTMLButtonElement>(`#reverse-${actorUuid.replaceAll(\".\", \"\")}`);\n        reverseButton?.children[0].classList.remove(\"midi-qol-enable-damage-button\");\n        reverseButton?.children[0].classList.add(\"midi-qol-disable-damage-button\");\n        // Reset multiplier to \"=\"\n        const multiplierSelect = html.querySelector<HTMLSelectElement>(`#dmg-multiplier-${actorUuid.replaceAll(\".\", \"\")}`);\n        if (multiplierSelect) multiplierSelect.value = \"calc\";\n        let actor = fromActorUuid(actorUuid);\n        const updates: Actor.UpdateData = {\n          //@ts-expect-error no dnd5e-types\n          \"system.attributes.hp.temp\": oldTempHP ?? 0,\n          \"system.attributes.hp.value\": oldHP ?? 0\n        };\n        if (newTempMax! - oldTempMax!) updates[\"system.attributes.hp.tempmax\"] = oldTempMax;\n        // Handle vitality undo - only if actor still has a vitality item\n        const undoItem = undoDamageData.find(d => d.actorUuid === actorUuid);\n        const vitalityItem = getVitalityItem(actor);\n        let vitalityUpdated = false;\n        if (vitalityItem && undoItem?.oldVitalitySpent !== undefined) {\n          // @ts-expect-error item update for uses.spent\n          await vitalityItem.update({ \"system.uses.spent\": undoItem.oldVitalitySpent });\n          vitalityUpdated = true;\n        }\n        if (actor?.isOwner && Hooks.call(\"dnd5e.preApplyDamage\", actor, newHP - oldHP, updates, calcDamageOptions as DamageApplicationOptions) !== false) {\n          // The actor update - when no changes are made will update the passed options with a target\n          // Set midiVitalityUpdatePending if vitality was updated to prevent double checkWounded calls\n          const mergedOptions = foundry.utils.mergeObject(calcDamageOptions, updateOptions ?? {}, { inplace: false }) as any;\n          if (vitalityUpdated) mergedOptions.midiVitalityUpdatePending = true;\n          await actor.update(updates, mergedOptions)\n            .then(updatedActor => {\n              Hooks.call(\"dnd5e.applyDamage\", updatedActor ?? actor, newHP - oldHP, calcDamageOptions as DamageApplicationOptions);\n              // Update display to show what apply would do (original damage display)\n              if (undoItem) updateDamageCardDisplay(html, actorUuid, undoItem, false);\n              // Update HP status for this target (reversed = not applied)\n              updateHPStatusHeader(html, actorUuid, false);\n              return updatedActor;\n            })\n        }\n        ev.stopPropagation();\n      }\n    })();\n  });\n\n  button = html.querySelector<HTMLButtonElement>(\"#all-apply\");\n  button?.addEventListener(\"click\", (ev) => {\n    (async () => {\n      // TODO: Remove the latter after sufficient time has passed\n      const undoFlag = message.flags?.[MODULE_ID]?.undoDamage ?? foundry.utils.getProperty(message, \"flags.midi-qol.undoDamage\") as SerializedDamageListEntry[];\n      const undoDamageData = recoverDamageListFromJSON(undoFlag);\n      if (undoDamageData) for (let { actorUuid, newHP, newTempHP, newTempMax, oldHP, oldTempMax, calcDamageOptions, updateOptions } of undoDamageData) {\n        if (!actorUuid) continue;\n        let actor = fromActorUuid(actorUuid);\n        const applyButton = html.querySelector<HTMLButtonElement>(`#apply-${actorUuid.replaceAll(\".\", \"\")}`);\n        applyButton?.children[0].classList.add(\"midi-qol-disable-damage-button\");\n        applyButton?.children[0].classList.remove(\"midi-qol-enable-damage-button\");\n        const reverseButton = html.querySelector<HTMLButtonElement>(`#reverse-${actorUuid.replaceAll(\".\", \"\")}`);\n        reverseButton?.children[0].classList.remove(\"midi-qol-disable-damage-button\");\n        reverseButton?.children[0].classList.add(\"midi-qol-enable-damage-button\");\n        log(`Setting HP to ${newTempHP} and ${newHP} ${actor?.name} ${actorUuid}`);\n        const update = { \"system.attributes.hp.temp\": newTempHP ?? 0, \"system.attributes.hp.value\": newHP ?? 0 } as Actor.UpdateData;\n        if (newTempMax! - oldTempMax!) update[\"system.attributes.hp.tempmax\"] = newTempMax;\n        const amount = (newHP ?? 0) - (oldHP ?? 0);\n        // Handle vitality apply - only if actor still has a vitality item\n        const applyItem = undoDamageData.find(d => d.actorUuid === actorUuid);\n        const vitalityItem = getVitalityItem(actor);\n        let vitalityUpdated = false;\n        if (vitalityItem && applyItem?.newVitalitySpent !== undefined) {\n          // @ts-expect-error item update for uses.spent\n          await vitalityItem.update({ \"system.uses.spent\": applyItem.newVitalitySpent });\n          vitalityUpdated = true;\n        }\n        // Set midiVitalityUpdatePending if vitality was updated to prevent double checkWounded calls\n        const options = foundry.utils.mergeObject(calcDamageOptions ?? {}, updateOptions ?? {}, { inplace: false }) as any;\n        if (vitalityUpdated) options.midiVitalityUpdatePending = true;\n        if (actor?.isOwner && Hooks.call(\"dnd5e.preApplyDamage\", actor, amount, update, options as DamageApplicationOptions) !== false) {\n          await actor.update(update, options).then(updatedActor => {\n            Hooks.call(\"dnd5e.applyDamage\", actor, amount, options);\n            // Update display to show what undo would do (undo mode)\n            if (applyItem) updateDamageCardDisplay(html, actorUuid, applyItem, true);\n            // Update HP status for this target (applied = true)\n            updateHPStatusHeader(html, actorUuid, true);\n            return updatedActor;\n          });\n        }\n        ev.stopPropagation();\n      }\n    })();\n  })\n\n  // TODO: Remove the latter after sufficient time has passed\n  const undoFlag = message.flags?.[MODULE_ID]?.undoDamage ?? foundry.utils.getProperty(message, \"flags.midi-qol.undoDamage\") as SerializedDamageListEntry[];\n  const undoDamageData = recoverDamageListFromJSON(undoFlag);\n  undoDamageData?.forEach((undoEntry) => {\n    const { actorUuid, oldTempHP, oldHP, oldTempMax, newHP, newTempHP, newTempMax, damageDetail, calcDamageOptions, updateOptions, oldVitalitySpent, newVitalitySpent } = undoEntry;\n    if (!actorUuid) return;\n    let button = html.querySelector<HTMLButtonElement>(`#reverse-${actorUuid.replaceAll(\".\", \"\")}`);\n    button?.addEventListener(\"click\", (ev) => {\n      (ev.currentTarget as HTMLElement)?.children[0].classList.add(\"midi-qol-disable-damage-button\");\n      (ev.currentTarget as HTMLElement)?.children[0].classList.remove(\"midi-qol-enable-damage-button\");\n      const otherButton = html.querySelector<HTMLButtonElement>(`#apply-${actorUuid.replaceAll(\".\", \"\")}`);\n      otherButton?.children[0].classList.remove(\"midi-qol-disable-damage-button\");\n      otherButton?.children[0].classList.add(\"midi-qol-enable-damage-button\");\n      // Reset multiplier to \"=\"\n      const multiplierSelect = html.querySelector<HTMLSelectElement>(`#dmg-multiplier-${actorUuid.replaceAll(\".\", \"\")}`);\n      if (multiplierSelect) multiplierSelect.value = \"calc\";\n      (async () => {\n        let actor = fromActorUuid(actorUuid);\n        log(`Setting HP back to ${oldTempHP} and ${oldHP} ${actor?.name} ${actorUuid}`);\n        const amount = newHP - oldHP;\n        const updates: Actor.UpdateData =\n        {\n          //@ts-expect-error no dnd5e-types\n          \"system.attributes.hp.temp\": oldTempHP ?? 0,\n          \"system.attributes.hp.value\": oldHP ?? 0\n        };\n        if (newTempMax! - oldTempMax!) updates[\"system.attributes.hp.tempmax\"] = oldTempMax;\n        // Handle vitality undo - only if actor still has a vitality item\n        const vitalityItem = getVitalityItem(actor);\n        let vitalityUpdated = false;\n        if (vitalityItem && oldVitalitySpent !== undefined) {\n          // @ts-expect-error item update for uses.spent\n          await vitalityItem.update({ \"system.uses.spent\": oldVitalitySpent });\n          vitalityUpdated = true;\n        }\n        if (actor?.isOwner && Hooks.call(\"dnd5e.preApplyDamage\", actor, amount, updates, calcDamageOptions as DamageApplicationOptions) !== false) {\n          // The actor update - when no changes are made will update the passed options with a target\n          // Set midiVitalityUpdatePending if vitality was updated to prevent double checkWounded calls\n          const options = foundry.utils.mergeObject(calcDamageOptions ?? {}, updateOptions ?? {}, { inplace: false }) as any;\n          if (vitalityUpdated) options.midiVitalityUpdatePending = true;\n          await actor.update(updates, options).then(updatedActor => {\n            Hooks.call(\"dnd5e.applyDamage\", actor, amount, calcDamageOptions as DamageApplicationOptions);\n            // Update display to show what apply would do (original damage display)\n            updateDamageCardDisplay(html, actorUuid, undoEntry, false);\n            // Update HP status for this target (reversed = not applied)\n            updateHPStatusHeader(html, actorUuid, false);\n            return updatedActor;\n          })\n        }\n        ev.stopPropagation();\n      })();\n    });\n\n    // Default action of button is to do midi damage\n    button = html.querySelector<HTMLButtonElement>(`#apply-${actorUuid.replaceAll(\".\", \"\")}`);\n    button?.addEventListener(\"click\", (ev) => {\n      (ev.currentTarget as HTMLElement)?.children[0].classList.add(\"midi-qol-disable-damage-button\");\n      (ev.currentTarget as HTMLElement)?.children[0].classList.remove(\"midi-qol-enable-damage-button\");\n      const otherButton = html.querySelector<HTMLButtonElement>(`#reverse-${actorUuid.replaceAll(\".\", \"\")}`);\n      otherButton?.children[0].classList.remove(\"midi-qol-disable-damage-button\");\n      otherButton?.children[0].classList.add(\"midi-qol-enable-damage-button\");\n      const multiplierSelect = html.querySelector<HTMLSelectElement>(`#dmg-multiplier-${actorUuid.replaceAll(\".\", \"\")}`);\n      let multiplierString = multiplierSelect?.value;\n      const mults: Record<string, number> = { \"-1\": -1, \"x1\": 1, \"x0.25\": 0.25, \"x0.5\": 0.5, \"x2\": 2 };\n\n      (async () => {\n        let actor = fromActorUuid(actorUuid);\n        if (multiplierString === \"calc\") {\n          // For \"=\" case, directly apply the stored HP values (like reverse does with old values)\n          const amount = (newHP ?? 0) - (oldHP ?? 0);\n          const updates: Actor.UpdateData = {\n            //@ts-expect-error no dnd5e-types\n            \"system.attributes.hp.temp\": newTempHP ?? 0,\n            \"system.attributes.hp.value\": newHP ?? 0\n          };\n          if (newTempMax! - oldTempMax!) updates[\"system.attributes.hp.tempmax\"] = newTempMax;\n          // Handle vitalityItem apply - only if actor still has a vitality item\n          const vitalityItem = getVitalityItem(actor);\n          let vitalityUpdated = false;\n          if (vitalityItem && newVitalitySpent !== undefined) {\n            // @ts-expect-error item update for uses.spent\n            await vitalityItem.update({ \"system.uses.spent\": newVitalitySpent });\n            vitalityUpdated = true;\n          }\n          // Set midiVitalityUpdatePending if vitality was updated to prevent double checkWounded calls\n          const options = foundry.utils.mergeObject(calcDamageOptions ?? {}, updateOptions ?? {}, { inplace: false }) as any;\n          if (vitalityUpdated) options.midiVitalityUpdatePending = true;\n          if (actor?.isOwner && Hooks.call(\"dnd5e.preApplyDamage\", actor, amount, updates, calcDamageOptions as DamageApplicationOptions) !== false) {\n            await actor.update(updates, options).then(updatedActor => {\n              Hooks.call(\"dnd5e.applyDamage\", actor, amount, calcDamageOptions as DamageApplicationOptions);\n              // Update display to show what undo would do (undo mode)\n              updateDamageCardDisplay(html, actorUuid, undoEntry, true);\n              // Update HP status for this target (applied = true)\n              updateHPStatusHeader(html, actorUuid, true);\n              return updatedActor;\n            });\n          }\n        } else {\n          // For other multipliers, use applyDamage with the new multiplier\n          // Calculate what vitality will be after applying the multiplied damage\n          const applyOptions: DamageApplicationOptions = foundry.utils.mergeObject(updateOptions ?? {}, { multiplier: mults[multiplierString ?? \"x1\"] ?? 1 }, { inplace: false });\n\n          // Get current HP before applying\n          // @ts-expect-error no dnd5e types\n          const preApplyHP = actor?.system.attributes.hp.value ?? 0;\n          // @ts-expect-error no dnd5e types\n          const preApplyTempHP = actor?.system.attributes.hp.temp ?? 0;\n\n          // Separate vitality and maximum from HP damage\n          // Filter out vitality and maximum from damageDetail for HP application\n          const hpDamageDetail = damageDetail?.filter(d => d.type !== \"vitality\" && d.type !== \"maximum\") ?? [];\n\n          // Calculate the multiplied HP damage (excluding vitality)\n          // @ts-expect-error no dnd5e-types\n          const calculatedDamages: DamageDescription[] = foundry.utils.deepClone(actor?.calculateDamage(hpDamageDetail, applyOptions) ?? []);\n          let totalMultipliedHpDamage = 0;\n          for (const dmg of calculatedDamages) {\n            if (dmg.type !== \"temphp\" && ![\"midi-none\", \"none\", \"vitality\"].includes(dmg.type)) {\n              totalMultipliedHpDamage += dmg.value;\n            }\n          }\n          totalMultipliedHpDamage = Math.trunc(totalMultipliedHpDamage);\n\n          // Calculate multiplied direct vitality and maximum damage separately\n          const multiplier = mults[multiplierString ?? \"x1\"] ?? 1;\n          let multipliedVitalityDamage = 0;\n          let multipliedTempMaxDamage = 0;\n          for (const d of damageDetail ?? []) {\n            if (d.type === \"vitality\") {\n              multipliedVitalityDamage += d.value * multiplier;\n            } else if (d.type === \"maximum\") {\n              multipliedTempMaxDamage += d.value * multiplier;\n            }\n          }\n          multipliedVitalityDamage = Math.trunc(multipliedVitalityDamage);\n          multipliedTempMaxDamage = Math.trunc(multipliedTempMaxDamage);\n\n          // Calculate vitality changes\n          const vitalityItem = getVitalityItem(actor);\n          // @ts-expect-error uses exists on items with uses\n          const currentSpent = vitalityItem?.system.uses?.spent ?? 0;\n          // @ts-expect-error uses exists on items with uses\n          const maxUses = vitalityItem?.system.uses?.max ?? 0;\n          let newSpent = currentSpent;\n\n          if (vitalityItem) {\n            // First apply direct vitality damage (positive = damage, negative = healing)\n            if (multipliedVitalityDamage > 0) {\n              newSpent = Math.min(maxUses, currentSpent + multipliedVitalityDamage);\n            } else if (multipliedVitalityDamage < 0) {\n              newSpent = Math.max(0, currentSpent + multipliedVitalityDamage);\n            }\n\n            // Then calculate overflow from HP damage\n            if (totalMultipliedHpDamage > 0) {\n              const tempAbsorbed = Math.min(preApplyTempHP, totalMultipliedHpDamage);\n              const hpAbsorbed = Math.min(preApplyHP, totalMultipliedHpDamage - tempAbsorbed);\n              const overflowDamage = totalMultipliedHpDamage - tempAbsorbed - hpAbsorbed;\n              if (overflowDamage > 0) {\n                newSpent = Math.min(maxUses, newSpent + overflowDamage);\n              }\n            } else if (totalMultipliedHpDamage < 0) {\n              // Healing case - restore vitality first, then HP\n              const healingAmount = Math.abs(totalMultipliedHpDamage);\n              const vitalityMissing = newSpent; // newSpent is how much vitality is missing after direct vitality damage\n              const vitalityRestored = Math.min(vitalityMissing, healingAmount);\n\n              if (vitalityRestored > 0) {\n                newSpent = newSpent - vitalityRestored;\n\n                // Adjust the multiplier to reduce healing applied to HP\n                const remainingHealing = healingAmount - vitalityRestored;\n                if (remainingHealing > 0) {\n                  // Scale down the multiplier proportionally\n                  const scaleFactor = remainingHealing / healingAmount;\n                  applyOptions.multiplier = (applyOptions.multiplier ?? 1) * scaleFactor;\n                } else {\n                  // All healing went to vitality, no HP healing needed\n                  applyOptions.multiplier = 0;\n                }\n              }\n            }\n          }\n\n          // Apply HP damage (excluding vitality) with flag to prevent hook from also updating vitality\n          applyOptions.midiVitalityHandled = true;\n          // @ts-expect-error no dnd5e-types\n          await actor?.applyDamage(hpDamageDetail, applyOptions);\n\n          // Now update vitality if there was any change\n          if (vitalityItem && newSpent !== currentSpent) {\n            // @ts-expect-error item update for uses.spent\n            await vitalityItem.update({ \"system.uses.spent\": newSpent });\n          }\n\n          // Apply tempMax (max HP reduction) if there was any maximum damage\n          if (multipliedTempMaxDamage !== 0 && actor) {\n            // @ts-expect-error no dnd5e types\n            const currentTempMax = actor.system.attributes.hp.tempmax ?? 0;\n            // @ts-expect-error no dnd5e types for hp.tempmax\n            await actor.update({ \"system.attributes.hp.tempmax\": currentTempMax - multipliedTempMaxDamage });\n          }\n\n          // Update display to show what undo would do (undo mode)\n          updateDamageCardDisplay(html, actorUuid, undoEntry, true);\n          // Update HP status for this target (applied = true)\n          updateHPStatusHeader(html, actorUuid, true);\n        }\n      })();\n    });\n\n    // Add change listener to multiplier dropdown to preview damage\n    const displayUuidForSelect = actorUuid.replaceAll(\".\", \"\");\n    const multiplierSelect = html.querySelector<HTMLSelectElement>(`#dmg-multiplier-${displayUuidForSelect}`);\n    multiplierSelect?.addEventListener(\"change\", async (ev) => {\n      const actor = fromActorUuid(actorUuid);\n      if (!actor) return;\n\n      const multiplierString = (ev.target as HTMLSelectElement).value;\n      const mults: Record<string, number> = { \"-1\": -1, \"x1\": 1, \"x0.25\": 0.25, \"x0.5\": 0.5, \"x2\": 2 };\n      const displayUuid = actorUuid.replaceAll(\".\", \"\");\n\n      // Get current actor HP values\n      // @ts-expect-error no dnd5e types\n      const currentHP = actor.system.attributes.hp.value ?? 0;\n      // @ts-expect-error no dnd5e types\n      const currentTempHP = actor.system.attributes.hp.temp ?? 0;\n      // @ts-expect-error no dnd5e types\n      const maxHP = actor.system.attributes.hp.max ?? 0;\n\n      // Calculate damage with the selected multiplier\n      // \"calc\" uses the original options (with saves), others use clean options with just the multiplier\n      let options: DamageApplicationOptions;\n      if (multiplierString === \"calc\") {\n        // Use original calculated options (includes save information)\n        options = foundry.utils.deepClone(calcDamageOptions ?? {}) as DamageApplicationOptions;\n      } else {\n        // Use absolute multiplier without save information\n        options = { multiplier: mults[multiplierString ?? \"x1\"] ?? 1 } as DamageApplicationOptions;\n      }\n\n      // Use actor.calculateDamage to preview the result\n      // @ts-expect-error no dnd5e types\n      const calculatedDamages: DamageDescription[] = foundry.utils.deepClone(actor.calculateDamage(damageDetail, options));\n\n      // Sum up the damage values and truncate towards 0 (matching how damage is actually applied)\n      // Exclude vitality and maximum from HP total - they're shown separately\n      let totalDamage = 0;\n      let tempHpDamage = 0;\n      let multipliedVitalityDamage = 0;\n      let multipliedTempMaxDamage = 0;\n      for (const dmg of calculatedDamages) {\n        if (dmg.type === \"temphp\") {\n          tempHpDamage += dmg.value;\n        } else if (dmg.type === \"vitality\") {\n          multipliedVitalityDamage += dmg.value;\n        } else if (dmg.type === \"maximum\") {\n          multipliedTempMaxDamage += dmg.value;\n        } else if (![\"midi-none\", \"none\"].includes(dmg.type)) {\n          totalDamage += dmg.value;\n        }\n      }\n      // Truncate towards 0 to match actual damage application\n      totalDamage = Math.trunc(totalDamage);\n      tempHpDamage = Math.trunc(tempHpDamage);\n      multipliedVitalityDamage = Math.trunc(multipliedVitalityDamage);\n      multipliedTempMaxDamage = Math.trunc(multipliedTempMaxDamage);\n\n      // Calculate new HP/temp HP values\n      let newTempHP = currentTempHP;\n      let newHP = currentHP;\n      const isHealing = totalDamage < 0;\n\n      if (tempHpDamage > 0) {\n        // Gaining temp HP - take the higher value\n        newTempHP = Math.max(currentTempHP, tempHpDamage);\n      }\n\n      if (isHealing) {\n        // Healing - first restore vitality, then HP\n        // Note: totalDamage is negative for healing, so we use Math.abs\n        let healingRemaining = Math.abs(totalDamage);\n        // Vitality restoration is handled below in the vitality display section\n        newHP = Math.min(maxHP, currentHP + healingRemaining);\n      } else {\n        // Damage - first absorb with temp HP, then HP\n        let remainingDamage = totalDamage;\n        if (currentTempHP > 0 && remainingDamage > 0) {\n          const tempAbsorbed = Math.min(currentTempHP, remainingDamage);\n          newTempHP = currentTempHP - tempAbsorbed;\n          remainingDamage -= tempAbsorbed;\n        }\n        newHP = Math.max(0, currentHP - remainingDamage);\n      }\n\n      // Update display elements\n      const totalSpan = html.querySelector<HTMLSpanElement>(`#dmg-total-${displayUuid}`);\n      const tempSpan = html.querySelector<HTMLSpanElement>(`#dmg-temp-${displayUuid}`);\n      const hpSpan = html.querySelector<HTMLSpanElement>(`#dmg-hp-${displayUuid}`);\n      const noChangeSpan = html.querySelector<HTMLSpanElement>(`#dmg-nochange-${displayUuid}`);\n      const tempMaxSpan = html.querySelector<HTMLSpanElement>(`#dmg-tempmax-${displayUuid}`);\n\n      // Get current tempmax\n      // @ts-expect-error no dnd5e types\n      const currentTempMax = actor.system.attributes.hp.tempmax ?? 0;\n      const newTempMax = currentTempMax - multipliedTempMaxDamage;\n      const tempMaxChanged = multipliedTempMaxDamage !== 0;\n\n      // Get vitality info early to calculate max absorbable damage\n      const vitalityItem = getVitalityItem(actor);\n      let currentVitality = 0;\n      if (vitalityItem) {\n        // @ts-expect-error uses exists on items with uses\n        const currentSpent = vitalityItem.system.uses?.spent ?? 0;\n        // @ts-expect-error uses exists on items with uses\n        const maxUses = vitalityItem.system.uses?.max ?? 0;\n        currentVitality = maxUses - currentSpent;\n      }\n\n      // Cap damage display at max absorbable (HP + tempHP + vitality)\n      const maxAbsorbable = currentTempHP + currentHP + currentVitality;\n      const cappedDamage = isHealing ? Math.abs(totalDamage) : Math.min(Math.abs(totalDamage), maxAbsorbable);\n      const absTotalDamage = Math.trunc(cappedDamage);\n\n      const hpChanged = newHP !== currentHP;\n      const tempHpChanged = newTempHP !== currentTempHP;\n      // Always show total damage if there's damage to apply (even if HP is already at 0 and damage goes to vitality)\n      const hasDamageToApply = absTotalDamage > 0;\n      const noChange = !hpChanged && !tempHpChanged && !hasDamageToApply && !tempMaxChanged;\n\n      // Update total damage display - show if there's any damage to apply\n      if (totalSpan) {\n        totalSpan.classList.toggle(\"midi-qol-dmg-hidden\", !hasDamageToApply);\n        totalSpan.classList.toggle(\"midi-qol-dmg-healing\", isHealing);\n        totalSpan.textContent = `${isHealing ? \"+\" : \"-\"}${absTotalDamage}`;\n      }\n\n      // Update temp HP display\n      if (tempSpan) {\n        tempSpan.classList.toggle(\"midi-qol-dmg-hidden\", !tempHpChanged);\n        tempSpan.classList.toggle(\"midi-qol-dmg-healing\", newTempHP > currentTempHP);\n        const tempOld = tempSpan.querySelector<HTMLSpanElement>(\".dmg-temp-old\");\n        const tempNew = tempSpan.querySelector<HTMLSpanElement>(\".dmg-temp-new\");\n        if (tempOld) tempOld.textContent = String(Math.trunc(currentTempHP));\n        if (tempNew) tempNew.textContent = String(Math.trunc(newTempHP));\n      }\n\n      // Update HP display\n      if (hpSpan) {\n        hpSpan.classList.toggle(\"midi-qol-dmg-hidden\", !hpChanged);\n        hpSpan.classList.toggle(\"midi-qol-dmg-healing\", isHealing);\n        const hpOld = hpSpan.querySelector<HTMLSpanElement>(\".dmg-hp-old\");\n        const hpNew = hpSpan.querySelector<HTMLSpanElement>(\".dmg-hp-new\");\n        if (hpOld) hpOld.textContent = String(Math.trunc(currentHP));\n        if (hpNew) hpNew.textContent = String(Math.trunc(newHP));\n      }\n\n      // Update tempMax (max HP reduction) display\n      if (tempMaxSpan) {\n        tempMaxSpan.classList.toggle(\"midi-qol-dmg-hidden\", !tempMaxChanged);\n        const tmOld = tempMaxSpan.querySelector<HTMLSpanElement>(\".dmg-tempmax-old\");\n        const tmNew = tempMaxSpan.querySelector<HTMLSpanElement>(\".dmg-tempmax-new\");\n        if (tmOld) tmOld.textContent = String(Math.trunc(currentTempMax));\n        if (tmNew) tmNew.textContent = String(Math.trunc(newTempMax));\n      }\n\n      // Update no change display\n      if (noChangeSpan) {\n        noChangeSpan.classList.toggle(\"midi-qol-dmg-hidden\", !noChange);\n      }\n\n      // Update vitality display if actor has vitality\n      const vitalitySpan = html.querySelector<HTMLSpanElement>(`#dmg-vitality-${displayUuid}`);\n      const directVitalitySpan = html.querySelector<HTMLSpanElement>(`#dmg-vit-direct-${displayUuid}`);\n      // @ts-expect-error uses exists on items with uses\n      const maxVitality = vitalityItem?.system.uses?.max ?? 0;\n      if (vitalityItem) {\n        let newVitality = currentVitality;\n\n        // Apply direct vitality damage first (positive = damage, negative = healing)\n        if (multipliedVitalityDamage > 0) {\n          newVitality = Math.max(0, currentVitality - multipliedVitalityDamage);\n        } else if (multipliedVitalityDamage < 0) {\n          newVitality = Math.min(maxVitality, currentVitality - multipliedVitalityDamage);\n        }\n\n        if (isHealing) {\n          // Healing - first restore vitality, then HP\n          const healingAmount = Math.abs(totalDamage);\n          const vitalityMissing = maxVitality - newVitality;\n          const vitalityRestored = Math.min(vitalityMissing, healingAmount);\n          newVitality = newVitality + vitalityRestored;\n          // Recalculate newHP with remaining healing after vitality restoration\n          const remainingHealing = healingAmount - vitalityRestored;\n          newHP = Math.min(maxHP, currentHP + remainingHealing);\n        } else if (newHP <= 0 && totalDamage > 0) {\n          // Damage - calculate overflow to vitality (only if HP reaches 0)\n          const tempAbsorbed = Math.min(currentTempHP, totalDamage);\n          const hpAbsorbed = Math.min(currentHP, totalDamage - tempAbsorbed);\n          const overflowDamage = totalDamage - tempAbsorbed - hpAbsorbed;\n          if (overflowDamage > 0) {\n            newVitality = Math.max(0, newVitality - overflowDamage);\n          }\n        }\n\n        const vitalityChanged = newVitality !== currentVitality;\n        const vitalityIncrease = newVitality > currentVitality;\n\n        // Update direct vitality damage display (shows multiplied vitality damage)\n        if (directVitalitySpan) {\n          const hasDirectVitality = multipliedVitalityDamage !== 0;\n          const directVitalityIsHealing = multipliedVitalityDamage < 0;\n          directVitalitySpan.classList.toggle(\"midi-qol-dmg-hidden\", !hasDirectVitality);\n          directVitalitySpan.classList.toggle(\"midi-qol-dmg-healing\", directVitalityIsHealing);\n          const signSpan = directVitalitySpan.querySelector<HTMLSpanElement>(\".dmg-vit-sign\");\n          if (signSpan) signSpan.textContent = directVitalityIsHealing ? \"+\" : \"-\";\n          const valueSpan = directVitalitySpan.querySelector<HTMLSpanElement>(\".dmg-vit-value\");\n          if (valueSpan) valueSpan.textContent = String(Math.abs(multipliedVitalityDamage));\n        }\n\n        // Update vitality transition display (old → new)\n        if (vitalitySpan) {\n          vitalitySpan.classList.toggle(\"midi-qol-dmg-hidden\", !vitalityChanged);\n          vitalitySpan.classList.toggle(\"midi-qol-dmg-healing\", vitalityIncrease);\n\n          const vitOld = vitalitySpan.querySelector<HTMLSpanElement>(\".dmg-vit-old\");\n          const vitNew = vitalitySpan.querySelector<HTMLSpanElement>(\".dmg-vit-new\");\n          if (vitOld) vitOld.textContent = String(Math.trunc(currentVitality));\n          if (vitNew) vitNew.textContent = String(Math.trunc(newVitality));\n        }\n\n        // Update HP display with corrected value after vitality restoration\n        if (isHealing && hpSpan) {\n          const hpNew = hpSpan.querySelector<HTMLSpanElement>(\".dmg-hp-new\");\n          if (hpNew) hpNew.textContent = String(Math.trunc(newHP));\n          const hpChangedAfterVitality = newHP !== currentHP;\n          hpSpan.classList.toggle(\"midi-qol-dmg-hidden\", !hpChangedAfterVitality);\n        }\n      } else {\n        // No vitality item - hide the displays\n        if (vitalitySpan) vitalitySpan.classList.add(\"midi-qol-dmg-hidden\");\n        if (directVitalitySpan) directVitalitySpan.classList.add(\"midi-qol-dmg-hidden\");\n      }\n    });\n\n    // Add token image click to select token and right-click to open actor sheet\n    const allTokenImgs = html.querySelectorAll<HTMLImageElement>(`img.midi-qol-target-name`);\n    allTokenImgs.forEach((img) => {\n      // Get the parent container and check if it has our displayUuid elements\n      const parent = img.closest(\".midi-qol-tooltip\");\n      if (!parent) return;\n      const hasOurElements = parent.querySelector(`#dmg-total-${actorUuid.replaceAll(\".\", \"\")}`);\n      if (!hasOurElements) return;\n\n      // Single click to select token and pan to it\n      img.addEventListener(\"click\", (ev) => {\n        ev.preventDefault();\n        ev.stopImmediatePropagation();\n        const tokenId = img.id;\n        const token = canvas.tokens?.get(tokenId);\n        if (token) {\n          token.control({ releaseOthers: !ev.shiftKey });\n          // Pan to the token center\n          const center = token.center;\n          canvas.animatePan({ x: center.x, y: center.y });\n        }\n      }, { capture: true });\n\n      // Right-click to open actor sheet\n      img.addEventListener(\"contextmenu\", (ev) => {\n        ev.preventDefault();\n        ev.stopImmediatePropagation();\n        const actor = fromActorUuid(actorUuid);\n        if (actor) {\n          actor.sheet?.render(true);\n        }\n      }, { capture: true });\n    });\n  })\n\n  return true;\n}\n\nasync function _moveToken(data: { tokenUuid: string, newCenter: { x: number, y: number, elevation?: number }, options?: MoveTokenOptions }): Promise<any> {\n  const tokenDocument = fromUuidSync(data.tokenUuid) as TokenDocument.Implementation | undefined;\n  if (!tokenDocument || !canvas.grid || !tokenDocument.object) {\n    const message = `moveToken | token not found or canvas not ready: ${data.tokenUuid}`;\n    error(message);\n    TroubleShooter.recordError(new Error(\"moveToken failed\"), message);\n    return;\n  }\n  const targetToken = tokenDocument.object;\n  const { animate = true, teleport = false, ignoreWalls = false, ignoreTokens = false, autoRotate = true } = data.options ?? {};\n  const snappedCenter = canvas.grid.getSnappedPoint(data.newCenter, { mode: CONST.GRID_SNAPPING_MODES.CENTER });\n  const newPosition: Record<string, any> = { x: snappedCenter.x - targetToken.w / 2, y: snappedCenter.y - targetToken.h / 2 };\n  if (data.newCenter.elevation !== undefined) newPosition.elevation = data.newCenter.elevation;\n  // teleport uses \"displace\" action: instant, ignores walls/tokens\n  const action = teleport ? \"displace\" : CONFIG.Token.movement.defaultAction;\n  const waypoint = { ...newPosition, action, forced: true, snapped: true };\n  const moveOptions: Record<string, any> = { constrainOptions: { ignoreWalls: teleport || ignoreWalls, ignoreCost: true, ignoreTokens: teleport || ignoreTokens }, autoRotate };\n  // Use animate: false for instant moves — this skips Foundry's #onUpdateAnimation entirely,\n  // avoiding a Foundry core crash when the animation path is empty (e.g. movement fully blocked)\n  if (teleport || !animate) moveOptions.animate = false;\n  return tokenDocument.move(waypoint, moveOptions);\n}\n\n\nasync function _moveTokenAwayFromPoint(data: { targetUuid: string, point: { x: number, y: number }, distance: number, options?: MoveTokenOptions }): Promise<void> {\n  const targetToken = getToken(data.targetUuid);\n  const targetTokenDocument = getTokenDocument(targetToken);\n  if (!canvas || !canvas.dimensions || !canvas.grid || !targetToken || !data.point || !targetTokenDocument) {\n    const message = `moveTokenAwayFromPoint | token not found or canvas not ready: ${data.targetUuid}`;\n    error(message);\n    TroubleShooter.recordError(new Error(\"moveTokenAwayFromPoint failed\"), message);\n    return;\n  }\n  const ray = new foundry.canvas.geometry.Ray(data.point, targetToken.center);\n  const pixelDistance = data.distance / canvas.dimensions.distance * canvas.dimensions.size;\n  const newCenter = ray.project(1 + pixelDistance / ray.distance);\n  return void _moveToken({ tokenUuid: targetTokenDocument.uuid, newCenter, options: data.options });\n}\n\nasync function _teleportToken(data: { tokenUuid: string, destination: TeleportTokenDestination }): Promise<void> {\n  const originToken = fromUuidSync(data.tokenUuid) as TokenDocument.Implementation | undefined;\n  if (!originToken?.object || !canvas.grid) {\n    const message = `teleportToken | token not found or canvas not ready: ${data.tokenUuid}`;\n    error(message);\n    TroubleShooter.recordError(new Error(\"teleportToken failed\"), message);\n    return;\n  }\n  const dest = data.destination;\n  const originScene = originToken.parent;\n  if (!originScene) {\n    const message = `teleportToken | token has no parent scene: ${data.tokenUuid}`;\n    error(message);\n    TroubleShooter.recordError(new Error(\"teleportToken failed\"), message);\n    return;\n  }\n  const destScene = dest.sceneUuid ? fromUuidSync(dest.sceneUuid) as Scene.Implementation | undefined : originScene;\n  if (!destScene) {\n    const message = `teleportToken | destination scene not found: ${dest.sceneUuid}`;\n    error(message);\n    TroubleShooter.recordError(new Error(\"teleportToken failed\"), message);\n    return;\n  }\n  const sameScene = !dest.sceneUuid || destScene.id === originScene.id;\n  if (sameScene) {\n    // Same-scene teleport: delegate to _moveToken with teleport: true\n    await _moveToken({ tokenUuid: data.tokenUuid, newCenter: { x: dest.x, y: dest.y, elevation: dest.elevation }, options: { teleport: true } });\n    return;\n  }\n  // Cross-scene teleport following Foundry's TeleportTokenRegionBehaviorType._teleportToken pattern.\n  // Foundry's teleport API is region-based (requires a RegionDocument destination, not coordinates),\n  // so we reimplement the steps here. Review on Foundry version upgrades:\n  // see foundryv13/resources/app/client-esm/data/region-behaviors/teleport-token.mjs\n  const targetToken = originToken.object;\n  const snappedCenter = canvas.grid.getSnappedPoint({ x: dest.x, y: dest.y }, { mode: CONST.GRID_SNAPPING_MODES.CENTER });\n  const topLeft = { x: snappedCenter.x - targetToken.w / 2, y: snappedCenter.y - targetToken.h / 2 };\n  const tokenData = originToken.toObject();\n  delete (tokenData as any)._id;\n  tokenData.x = topLeft.x;\n  tokenData.y = topLeft.y;\n  if (dest.elevation !== undefined) tokenData.elevation = dest.elevation;\n  // Create token on destination scene\n  const newToken = await TokenDocument.implementation.create(tokenData, { parent: destScene, keepId: false });\n  if (!newToken) {\n    const message = `teleportToken | failed to create token on destination scene: ${destScene.uuid}`;\n    error(message);\n    TroubleShooter.recordError(new Error(\"teleportToken failed\"), message);\n    return;\n  }\n  // Migrate combatants\n  for (const combat of game.combats ?? []) {\n    const toUpdate: { _id: string, sceneId: string, tokenId: string }[] = [];\n    for (const combatant of combat.combatants) {\n      if (combatant.sceneId === originScene.id && combatant.tokenId === originToken.id) {\n        toUpdate.push({ _id: combatant.id!, sceneId: destScene.id!, tokenId: newToken.id! });\n      }\n    }\n    if (toUpdate.length) await combat.updateEmbeddedDocuments(\"Combatant\", toUpdate);\n  }\n  // Delete origin token\n  await originToken.delete();\n  // Pull the owning user to the destination scene\n  const ownerUser = game.users?.find(u => u.active && !u.isGM && u.character?.id === originToken.actorId);\n  if (ownerUser && ownerUser.viewedScene === originScene.id) {\n    (game.socket as any).emit(\"pullToScene\", destScene.id, ownerUser.id);\n  }\n}\n\nasync function rollActionSave(data: { actorUuid: string; effectName: string; saveDetails: SaveDetails; displayOptions: object }) {\n  const { DialogV2 } = foundry.applications.api;\n  const actor = fromActorUuid(data.actorUuid);\n  const confirmed = await DialogV2.confirm({\n    window: { title: `${actor?.name ?? \"\"}: ${data.effectName}` },\n    content: `<p>${actor?.name} &mdash; use your action to roll against ${data.effectName}?</p>`,\n    rejectClose: false,\n  });\n  if (!confirmed) return undefined;\n  return rollAbility({ saveDetails: data.saveDetails, displayOptions: data.displayOptions });\n}\n\nexport interface SerializedDamageListEntry extends Omit<DamageListEntry, \"calcDamageOptions\" | \"damageDetail\" | \"rawDamageDetail\" | \"damageDetails\"> {\n  damageDetail: DamageDescriptionObject[];\n  damageDetails: {\n    bonusDamage?: DamageDescriptionObject[];\n    combinedDamage: DamageDescriptionObject[];\n    defaultDamage?: DamageDescriptionObject[];\n    otherDamage?: DamageDescriptionObject[];\n    rawbonusDamage?: DamageDescriptionObject[];\n    rawcombinedDamage: DamageDescriptionObject[];\n    rawdefaultDamage?: DamageDescriptionObject[];\n    rawotherDamage?: DamageDescriptionObject[];\n  };\n  rawDamageDetail: DamageDescriptionObject[]\n  calcDamageOptions: Omit<DamageApplicationOptions, \"downgrade\" | \"ignore\"> & {\n    downgrade?: true | string[];\n    ignore?: true | {\n      immunity: true | string[];\n      resistance: true | string[];\n      vulnerability: true | string[];\n      modification: true | string[];\n      superSaver?: true | string[];\n      semiSuperSaver?: true | string[];\n      saved?: true | string[];\n      DR?: string[];\n    };\n  };\n}\nexport function prepareDamageListToJSON(damageList: DamageListEntry[]) {\n  const newDL = foundry.utils.deepClone(damageList).map(damageItem => {\n    const { downgrade, ignore } = damageItem.calcDamageOptions;\n    let newDowngrade: true | string[] | undefined;\n    if (downgrade instanceof Set) newDowngrade = Array.from(downgrade);\n    else if (downgrade) newDowngrade = downgrade;\n    let newIgnore: true | Record<string, true | string[]> | undefined;\n    if (ignore === true) newIgnore = ignore;\n    else if (ignore) {\n      newIgnore = {};\n      for (const [key, value] of Object.entries(ignore)) {\n        if (value instanceof Set) newIgnore[key] = Array.from(value);\n        else if (value) newIgnore[key] = value;\n      }\n    }\n    const newDamageDetail = prepareDamageDetailToJSON(damageItem.damageDetail);\n    const newRawDamageDetail = prepareDamageDetailToJSON(damageItem.rawDamageDetail);\n    const newDamageDetails = Object.fromEntries(Object.entries(damageItem.damageDetails).filter(i => i[0] !== \"calcDamageOptions\").map(([key, value]) => [key, prepareDamageDetailToJSON(value as DamageDescription[])]));\n    const serializedEntry: SerializedDamageListEntry = {\n      ...damageItem,\n      calcDamageOptions: {\n        ...damageItem.calcDamageOptions,\n        downgrade: newDowngrade,\n        ignore: newIgnore as SerializedDamageListEntry[\"calcDamageOptions\"][\"ignore\"]\n      },\n      damageDetail: newDamageDetail,\n      rawDamageDetail: newRawDamageDetail,\n      // Maybe some day I'll figure out the proper way to type this\n      damageDetails: newDamageDetails as unknown as SerializedDamageListEntry[\"damageDetails\"]\n    }\n    return serializedEntry;\n  });\n  return newDL;\n}\n\nfunction prepareDamageDetailToJSON(damageDetail?: DamageDescription[]): DamageDescriptionObject[] {\n  return (damageDetail ?? []).map(d => ({ ...d, properties: Array.from(d.properties ?? []) }));\n}\n\nfunction recoverDamageListFromJSON(damageList: SerializedDamageListEntry[]): DamageListEntry[] {\n  const newDL = foundry.utils.deepClone(damageList).map(damageItem => {\n    const { downgrade, ignore } = damageItem.calcDamageOptions;\n    let newDowngrade: true | Set<string> | undefined;\n    if (downgrade instanceof Array) newDowngrade = new Set(downgrade);\n    else if (downgrade) newDowngrade = downgrade;\n    let newIgnore: true | Record<string, true | Set<string>> | undefined;\n    if (ignore === true) newIgnore = ignore;\n    else if (ignore) {\n      newIgnore = {};\n      for (const [key, value] of Object.entries(ignore)) {\n        if (value instanceof Array) newIgnore[key] = new Set(value);\n        else if (value) newIgnore[key] = value;\n      }\n    }\n    const newDamageDetail = recoverDamageDetailFromJSON(damageItem.damageDetail);\n    const newRawDamageDetail = recoverDamageDetailFromJSON(damageItem.rawDamageDetail);\n    const newDamageDetails = Object.fromEntries(Object.entries(damageItem.damageDetails).map(([key, value]) => [key, recoverDamageDetailFromJSON(value)]));\n    const unSerializedEntry: DamageListEntry = {\n      ...damageItem,\n      calcDamageOptions: {\n        ...damageItem.calcDamageOptions,\n        downgrade: newDowngrade,\n        ignore: newIgnore as DamageListEntry[\"calcDamageOptions\"][\"ignore\"]\n      } as DamageListEntry[\"calcDamageOptions\"],\n      damageDetail: newDamageDetail,\n      rawDamageDetail: newRawDamageDetail,\n      damageDetails: newDamageDetails as unknown as DamageListEntry[\"damageDetails\"]\n    }\n    return unSerializedEntry;\n  });\n  return newDL;\n}\n\nfunction recoverDamageDetailFromJSON(damageDetail?: DamageDescriptionObject[]): DamageDescription[] {\n  return (damageDetail ?? []).map(d => ({ ...d, properties: new Set(d.properties) }));\n}\n","import { Activity } from \"../../globals.js\";\nimport { debugEnabled, GameSystemConfig, i18n, warn } from \"../../midi-qol.js\";\nimport { Workflow } from \"../Workflow.js\";\nimport { replaceDefaultActivities, configSettings } from \"../settings.js\";\nimport { getTokenDocument } from \"../utils.js\";\nimport { MidiActivityMixin, MidiActivityMixinSheet } from \"./MidiActivityMixin.js\";\n\nexport let MidiSummonActivity: ReturnType<typeof defineMidiSummonActivityClass>;\nexport let MidiSummonSheet: ReturnType<typeof defineMidiSummonSheetClass>;\n\nexport function setupSummonActivity() {\n  if (debugEnabled > 0) warn(\"MidiQOL | SummonActivity | setupSummonActivity | Called\");\n  //@ts-expect-error\n  MidiSummonSheet = defineMidiSummonSheetClass(game.system.applications.activity.SummonSheet);\n  MidiSummonActivity = defineMidiSummonActivityClass(GameSystemConfig.activityTypes.summon.documentClass as Activity);\n  if (replaceDefaultActivities) {\n    // GameSystemConfig.activityTypes[\"dnd5eSummon\"] = GameSystemConfig.activityTypes.summon;\n    GameSystemConfig.activityTypes.summon = { documentClass: MidiSummonActivity };\n  } else {\n    GameSystemConfig.activityTypes[\"midiSummon\"] = { documentClass: MidiSummonActivity };\n  }\n  //@ts-expect-error\n  Hooks.on(\"dnd5e.summonToken\", (activity, profile, tokenData, options) => {\n    if (!activity.friendlySummon) return;\n    const caster = getTokenDocument(activity.actor);\n    if (caster) tokenData.disposition = caster.disposition;\n  });\n}\nlet defineMidiSummonSheetClass = (baseClass: any) => {\n  return class MidiSummonSheet extends MidiActivityMixinSheet(baseClass) {\n  }\n}\n\nlet defineMidiSummonActivityClass = <T extends Activity>(ActivityClass: T) => {\n  return class MidiSummonActivity extends MidiActivityMixin(ActivityClass) {\n    static LOCALIZATION_PREFIXES = [\"midi-qol.SUMMON\", ...super.LOCALIZATION_PREFIXES];\n    static metadata =\n      foundry.utils.mergeObject(\n        super.metadata, {\n        title: configSettings.activityNamePrefix ? \"midi-qol.SUMMON.Title.one\" : ActivityClass.metadata.title,\n        dnd5eTitle: ActivityClass.metadata.title,\n        sheetClass: MidiSummonSheet,\n        usage: {\n          chatCard: \"modules/midi-qol/templates/activity-card.hbs\",\n          dialog: ActivityClass.metadata.usage.dialog,\n          actions: {\n            // placeSummons: MidiSummonActivity.#placeSummons \n            // not doing this as it would require a physical copy of the dnd5e #placeSummons code\n            // Downside is that the summons button on the activity card will not create a remove summoned creature effect since there is no workflow looked up\n\n          },\n        },\n      }, { inplace: false, insertKeys: true, insertValues: true });\n\n    static defineSchema() {\n      return {\n        ...super.defineSchema(),\n        friendlySummon: new foundry.data.fields.BooleanField({ initial: false, name: \"friendlySummon\", required: false })\n      }\n    }\n    get possibleOtherActivity() {\n      return false;\n    }\n    get isTriggerableActivity() {\n      return true;\n    }\n\n    async _triggerSubsequentActions(config, results) {\n    }\n\n    async getPlacement(token, profile, options) {\n      if (options?.placements?.length) {\n        // Apply creature size overrides (same as dnd5e base)\n        if (this.creatureSizes.size) {\n          const size = this.creatureSizes.has(options.creatureSize)\n            ? options.creatureSize : this.creatureSizes.first();\n          const config = CONFIG.DND5E.actorSizes[size];\n          if (config) token = token.clone({ width: config.token ?? 1, height: config.token ?? 1 });\n        }\n        return options.placements.map((p, i) => ({\n          prototypeToken: token,\n          x: p.x,\n          y: p.y,\n          elevation: p.elevation ?? this.getUsageToken()?.elevation ?? 0,\n          rotation: p.rotation ?? 0,\n          index: { total: i, unique: i }\n        }));\n      }\n      // Fall back to dnd5e interactive placement\n      return super.getPlacement(token, profile, options);\n    }\n  }\n}\n","import { Activity } from \"../../globals.js\";\nimport { debugEnabled, GameSystemConfig, i18nFormat, warn } from \"../../midi-qol.js\";\nimport { replaceDefaultActivities, configSettings } from \"../settings.js\";\nimport { getTokenDocument } from \"../utils.js\";\nimport { MidiActivityMixin, MidiActivityMixinSheet } from \"./MidiActivityMixin.js\";\nimport type { ActivityUseConfiguration } from \"../../globals.js\";\n\nexport let MidiTransformActivity: ReturnType<typeof defineMidiTransformActivityClass>;\nexport let MidiTransformSheet: ReturnType<typeof defineMidiTransformSheetClass>;\n\nexport function setupTransformActivity() {\n  if (debugEnabled > 0) warn(\"MidiQOL | TransformActivity | setupTransformActivity | Called\");\n  //@ts-expect-error\n  MidiTransformSheet = defineMidiTransformSheetClass(game.system.applications.activity.TransformSheet);\n  MidiTransformActivity = defineMidiTransformActivityClass(GameSystemConfig.activityTypes.transform.documentClass as Activity);\n  if (replaceDefaultActivities) {\n    // GameSystemConfig.activityTypes[\"dnd5eTransform\"] = GameSystemConfig.activityTypes.Transform;\n    GameSystemConfig.activityTypes.transform = { documentClass: MidiTransformActivity };\n  } else {\n    GameSystemConfig.activityTypes[\"midiTransform\"] = { documentClass: MidiTransformActivity };\n  }\n  //@ts-expect-error\n  Hooks.on(\"dnd5e.TransformToken\", (activity, profile, tokenData, options) => {\n    if (!activity.friendlyTransform) return;\n    const caster = getTokenDocument(activity.actor);\n    if (caster) tokenData.disposition = caster.disposition;\n  });\n}\nlet defineMidiTransformSheetClass = (baseClass: any) => {\n  return class MidiTransformSheet extends MidiActivityMixinSheet(baseClass) {\n  }\n}\n\nlet defineMidiTransformActivityClass = <T extends Activity>(ActivityClass: T) => {\n  return class MidiTransformActivity extends MidiActivityMixin(ActivityClass) {\n    static LOCALIZATION_PREFIXES = [\"midi-qol.TRANSFORM\", ...super.LOCALIZATION_PREFIXES];\n    static metadata =\n      foundry.utils.mergeObject(\n        super.metadata, {\n        title: configSettings.activityNamePrefix ? \"midi-qol.TRANSFORM.Title.one\" : ActivityClass.metadata.title,\n        dnd5eTitle: ActivityClass.metadata.title,\n        sheetClass: MidiTransformSheet,\n        usage: {\n          chatCard: \"modules/midi-qol/templates/activity-card.hbs\",\n          dialog: ActivityClass.metadata.usage.dialog\n        },\n      }, { inplace: false, insertKeys: true, insertValues: true });\n\n    async _finalizeUsage(config, results) {\n      // Nasty kludge since TransformActivity._finalizeUsage does not wait result.message.update\n      const profile = this.profiles.find(p => p._id === config.transform?.profile);\n      if (profile) {\n        const uuid = !this.transform.mode ? profile.uuid : await this.queryActor(profile);\n        if (uuid) {\n          if (results.message instanceof ChatMessage) await results.message.setFlag(\"dnd5e\", \"transform.uuid\", uuid);\n          else foundry.utils.setProperty(results.message, \"flags.dnd5e.transform.uuid\", uuid);\n        }\n      }\n      // since we are skipping the TransformActivity _finalizeUsage call, the grandparent _finalizeUsage needs to be called\n      const grandParent = Object.getPrototypeOf(ActivityClass);\n      await grandParent.prototype._finalizeUsage.call(this, config, results);\n      return this.transformActor(config, results.message);\n    }\n\n    static async #transformActor(event, target, message) {\n\n    }\n    async transformActor(config: ActivityUseConfiguration, message: ChatMessage) {\n      const targets = Array.from(config.midiOptions?.targetsToUse ?? config.workflow?.targets ?? game.user?.targets ?? new Set());\n      if (!targets.length) {\n        ui.notifications?.warn(\"DND5E.ActionWarningNoToken\", { localize: true });\n        return;\n      }\n\n      const profileId = message.getFlag(\"dnd5e\", \"transform.profile\");\n      const profile = this.profiles.find(p => p._id === profileId) || this.profiles[0];\n      const uuid = message.getFlag(\"dnd5e\", \"transform.uuid\") ?? await this.queryActor(profile);\n      const source = await fromUuid(uuid);\n      if (!source) {\n        ui.notifications?.warn(\"DND5E.TRANSFORM.Warning.SourceActor\", { localize: true });\n        return;\n      }\n\n      // transformedActorUuids stores ORIGINAL actor UUIDs (stable across re-transforms)\n      const transformedActorUuids: string[] = [];\n      // transformedActors tracks the polymorphed actors for concentration flag setting\n      const transformedActors: Actor.Implementation[] = [];\n      for (const token of targets) {\n        //@ts-expect-error\n        let actor: Actor.Implementation = token instanceof Actor ? token : token.actor;\n        //@ts-expect-error isPolymorphed - dnd5e property\n        if (actor.isPolymorphed) {\n          // Always revert to original form before applying a new transform — no nested transforms\n          //@ts-expect-error revertOriginalForm - dnd5e method\n          const reverted = await actor.revertOriginalForm({ renderSheet: false });\n          if (reverted instanceof TokenDocument && reverted.actor) {\n            actor = reverted.actor;\n          } else if (reverted instanceof Actor) {\n            actor = reverted;\n          } else {\n            ui.notifications?.warn(i18nFormat(\"midi-qol.TRANSFORM.AlreadyTransformed\", { name: actor.name }));\n            continue;\n          }\n        }\n        const originalActorUuid = actor.uuid;\n        //@ts-expect-error transformInto - dnd5e method\n        const transformedTokens: TokenDocument[] | TokenDocument | undefined = await actor.transformInto(source, this.settings);\n        if (transformedTokens) {\n          transformedActorUuids.push(originalActorUuid);\n          if (transformedTokens instanceof Array && transformedTokens[0]?.actor)\n            transformedActors.push(transformedTokens[0].actor);\n          else if (transformedTokens instanceof TokenDocument && transformedTokens.actor)\n            transformedActors.push(transformedTokens.actor);\n        }\n      }\n      if (config.workflow) {\n        config.workflow.transformedActorUuids = transformedActorUuids;\n        config.workflow.transformedActors = transformedActors;\n      }\n    }\n    static defineSchema() {\n      return {\n        ...super.defineSchema()\n      }\n    }\n    get possibleOtherActivity() {\n      return false;\n    }\n    get isTriggerableActivity() {\n      return true;\n    }\n\n    async _triggerSubsequentActions(config, results) {\n    }\n  }\n}\n","import { warn, debug, log, i18n, i18nFormat, busyWait, MESSAGE_TYPES, error, debugEnabled, MQItemMacroLabel, GameSystemConfig, MODULE_ID, MQActivityMacroLabel, gameStats, getHealingLabel } from \"../midi-qol.js\";\nimport { preferredActiveGM, prepareDamageListToJSON, socketlibSocket, timedAwaitExecuteAsGM, timedExecuteAsGM, unTimedExecuteAsGM } from \"./GMAction.js\";\nimport { installedModules } from \"./setupModules.js\";\nimport { configSettings, autoRemoveTargets, checkRule, checkMechanic, safeGetGameSetting, useWeakReferences, saveToChatCard, onUseMacroOptions, shouldDisplaySaveDC, isDnd5e53 } from \"./settings.js\";\nimport {\n  createDamageDetail,\n  processDamageRoll,\n  untargetDeadTokens,\n  checkIncapacitated,\n  getAutoRollDamage,\n  isAutoFastForward,\n  getAutoRollAttack,\n  getRemoveDamageButtons,\n  getRemoveAttackButtons,\n  getTokenPlayerName,\n  checkNearby,\n  hasCondition,\n  expireMyEffects,\n  validTargetTokens,\n  getOrCreateTokenForActorAsSet,\n  doReactions,\n  playerFor,\n  requestPCActiveDefence,\n  evalActivationCondition,\n  asyncHooksCallAll,\n  asyncHooksCall,\n  midiRenderRoll,\n  markFlanking,\n  computeFlankingStatus,\n  computeFlankedStatus,\n  canSense,\n  tokenForActor,\n  getOrCreateTokenForActor,\n  createConditionData,\n  evalCondition,\n  removeHidden,\n  hasDAE,\n  computeCoverBonus,\n  computeTargetAC,\n  TOTAL_COVER,\n  THREE_QUARTERS_COVER,\n  HALF_COVER,\n  hasCoverTotal,\n  isInCombat,\n  displayDSNForRoll,\n  setActionUsed,\n  removeInvisible,\n  getTokenDocument,\n  getToken,\n  activityHasAutoPlaceTemplate,\n  addRollTo,\n  sumRolls,\n  midiRenderAttackRoll,\n  midiRenderDamageRoll,\n  midiRenderBonusDamageRoll,\n  midiRenderOtherDamageRoll,\n  midiRenderFormulaRoll,\n  throttledUpdate,\n  getCachedDocument,\n  clearUpdatesCache,\n  getDamageType,\n  getTokenName,\n  setRollOperatorEvaluated,\n  evalAllConditionsAsync,\n  getAppliedEffects,\n  canSee,\n  CEAddEffectWith,\n  getCEEffectByName,\n  CEHasEffectApplied,\n  CERemoveEffect,\n  CEToggleEffect,\n  getActivityDefaultDamageType,\n  activityHasAreaTarget,\n  getSaveMultiplierForActivity,\n  checkActivityRange,\n  getDistance,\n  getActivityAutoTargetAction,\n  activityHasEmanationNoTemplate,\n  completeActivityUse,\n  getActor,\n  getConcentrationEffect,\n  convertDuration,\n  getRemoveAllButtons,\n  requestPCSave,\n  pcSaveOptions,\n  addUpdatesCache,\n  addUpdatesCacheFlags,\n  MidiOptions,\n  getOptionalCountRemainingShortFlag,\n  bonusDialog,\n  getTargetDescriptor,\n  getThrottlingFunction,\n  addAttribution,\n  renderAttributionTooltip,\n  getAdvantageModeTitle,\n  resolveItemMacro,\n  resolveActivityMacro,\n  resolveDAEItemData,\n  midiFlag,\n  getAoETargetType,\n  updateUserTargets,\n  popTargetSave,\n  clearTargetSave,\n  getToolLabel,\n  getConsumptionData,\n} from \"./utils.js\"\nimport { OnUseMacros } from \"./apps/Item.js\";\nimport { bonusCheck, collectBonusFlags, defaultRollOptions, computeAbilityAdvantage, buildPreComputedAdvantageMap } from \"./patching.js\";\nimport { PreComputedAdvantage } from \"./apps/MidiRollChoiceDialog.js\";\nimport { saveTargetsUndoData, saveUndoData } from \"./undo.js\";\nimport { TroubleShooter } from \"./apps/TroubleShooter.js\";\nimport { MidiSummonActivity } from \"./activities/SummonActivity.js\";\nimport { activityHasScaledTargetCount, computeTargetsFromTemplates, postTemplateConfirmTargets } from \"./activities/activityHelpers.js\";\nimport { Activity, ActivitySave, ActivityCheck, ActivityUseConfiguration, DamageDescription, DamageListEntry, TokenOrDocument, DND5ETargetDescriptor, CombinedTargetDescriptor, ActivityEffectData, QueueSaveRollOptions, SaveDetails, ProcessTargetSaveContext, ModuleIntegrationFlags, ModuleIntegrationRequests, MonksTokenBarRequest, FlashRollsRequest, EpicRollsRequest, RollProcessConfig, RollDialogConfig } from \"../globals.js\";\nimport { AnyMutableObject, AnyObject, EmptyObject, InexactPartial } from \"fvtt-types/utils\";\nimport Token = foundry.canvas.placeables.Token;\nimport { MidiTransformActivity } from \"./activities/TransformActivity.js\";\nimport { MidiAttackActivity, computeAttackAdvantage } from \"./activities/AttackActivity.js\";\nimport { RollModifierTracker, AdvantageAttributionType, CriticalModifierFlags, computeCriticalModifiers, computeTargetCriticalModifiers, getFlagDisplayName } from \"./lib/RollModifierTracker.js\";\n\n/**\n * Result of resolving a macro specification in callMacro.\n * Either macro (for world/compendium macros) or macroData (for item/function macros) will be set.\n */\ninterface ResolvedMacro {\n  macro?: Macro.Implementation;\n  macroData?: Macro.CreateData;\n  item?: Item.Implementation | Item.InitializedData;\n  macroActivity?: Activity;\n  sourceItemUuid?: string;\n}\n\n/**\n * Context for macro resolution, parsed from the macro name and options.\n */\ninterface CallMacroContext {\n  name: string;\n  uuid?: string;\n  macroItem?: Item.Implementation | Item.InitializedData;\n  macroActivity?: Activity;\n  actorToUse: Actor.Implementation;\n}\n\nexport const shiftOnlyEvent = { shiftKey: true, altKey: false, ctrlKey: false, metaKey: false, type: \"\" };\n\n/** Sentinel value for attackTotal before any attack roll has been made. */\nexport const minAttackTotal = -100;\nexport function noKeySet(event: AugmentedEvent) { return !(event?.shiftKey || event?.ctrlKey || event?.altKey || event?.metaKey) }\n\n/**\n * Attribution type for advantage/disadvantage/critical/fumble sources.\n */\nexport type AttributionType = 'ADV' | 'DIS' | 'NOADV' | 'NODIS' | 'CRIT' | 'NOCRIT' | 'FUMBLE' | 'NOFUMBLE';\n\n/**\n * Attribution map: type -> source -> displayName\n * O(1) lookup and natural deduplication via object keys.\n * Stored in ChatMessage flags for persistence.\n */\nexport type AttributionMap = Partial<Record<AttributionType, Record<string, string>>>;\n\n/**\n * Structured attribution entry for display purposes.\n * Converted from AttributionMap for iteration/rendering.\n */\nexport interface AttributionEntry {\n  /** The type of attribution (ADV, DIS, CRIT, etc.) */\n  type: AttributionType;\n  /** Source identifier (e.g., \"invisible\", \"flanking\", \"magicResistance\") */\n  source: string;\n  /** Human-readable display name for tooltips */\n  displayName: string;\n}\n\n/**\n * Chat card flag keys for fields that are persisted directly via\n * addUpdatesCacheFlags in their own setters (not through persistFields).\n */\nexport enum WorkflowDataFlags {\n  ammunitionOnUseMacros = \"ammunitionOnUseMacros\",\n  bonusDamageTotal = \"bonusDamageTotal\",\n  currentAction = \"currentAction\",\n  damageList = \"damageList\",\n  inCombat = \"inCombat\",\n  onUseMacros = \"OnUseMacros\",\n  otherDamageTotal = \"otherDamageTotal\",\n  /** Structured save attribution - keyed by target UUID */\n  saveAttribution = \"saveAttribution\",\n  saveDisplayData = \"saveDisplayData\",\n  targetDescriptors = \"flags.dnd5e.targets\",\n  otherActivityConsumed = \"use.consumed\",\n  otherActivityScaling = \"use.otherScaling\",\n}\n\nexport interface DamageDescriptionObject extends Omit<DamageDescription, 'properties'> {\n  properties: string[];\n};\nfunction damageDetailToObject(damageDetail?: DamageDescription[]): DamageDescriptionObject[] {\n  return (damageDetail ?? []).map(d => ({\n    ...d,\n    properties: Array.from(d.properties ?? [])\n  }));\n}\nfunction damageDetailsFromObject(damageDetail?: DamageDescriptionObject[]): DamageDescription[] {\n  return (damageDetail ?? []).map(d => ({\n    ...d,\n    properties: new Set(d.properties ?? [])\n  }));\n}\n\ntype DamageBonusMacroSingleResult = {\n  damageRoll?: string;\n  flavor?: string;\n  damageType?: string;\n};\ntype DamageBonusMacroResult = DamageBonusMacroSingleResult[] | DamageBonusMacroSingleResult;\n\nexport type WorkflowState = undefined | ((context: WorkflowContext) => Promise<WorkflowState>);\n\n/**\n * Write-through cache in front of the workflow's chat-card flags.\n * Getters fall back to the persisted flag value (then the default) until the\n * field is first written; writing undefined clears the cache so the getter\n * falls back to the persisted value again (matches the old #field semantics).\n */\nclass PersistedFieldStore {\n  #cache = new Map<string, unknown>();\n  #getFlags: () => Record<string, any> | undefined;\n  #persist: (updates: Record<string, unknown>) => void;\n  #forcePersist: (updates: Record<string, unknown>) => void;\n\n  constructor(getFlags: () => Record<string, any> | undefined, persist: (updates: Record<string, unknown>) => void, forcePersist: (updates: Record<string, unknown>) => void) {\n    this.#getFlags = getFlags;\n    this.#persist = persist;\n    this.#forcePersist = forcePersist;\n  }\n\n  scalar<T>(key: string, dflt: T, legacyKey?: string): T {\n    if (this.#cache.has(key)) return this.#cache.get(key) as T;\n    const flags = this.#getFlags();\n    return (flags?.[key] ?? (legacyKey ? flags?.[legacyKey] : undefined) ?? dflt) as T;\n  }\n\n  setScalar<T>(key: string, value: T): void {\n    if (value === undefined) this.#cache.delete(key);\n    else this.#cache.set(key, value);\n    this.#persist({ [key]: value });\n  }\n\n  // Token sets persist as uuid arrays (or {uuid, name} pairs for \"targets\") and\n  // restore to Sets of canvas placeables. An empty restore returns an uncached\n  // fresh Set so a later flag write is still picked up.\n  tokenSet(key: string, namePairs = false): Set<Token.Implementation> {\n    if (this.#cache.has(key)) return this.#cache.get(key) as Set<Token.Implementation>;\n    const data = this.#getFlags()?.[key];\n    if (data?.length) {\n      const tokens: Set<Token.Implementation> = new Set(data\n        .map((entry: any) => (fromUuidSync(namePairs ? entry.uuid : entry) as TokenDocument.Implementation | undefined)?.object)\n        .filter((t: Token.Implementation | undefined): t is Token.Implementation => !!t));\n      this.#cache.set(key, tokens);\n      return tokens;\n    }\n    return new Set();\n  }\n\n  setTokenSet(key: string, tokens: Set<TokenOrDocument> | undefined, namePairs = false): void {\n    if (tokens === undefined) this.#cache.delete(key);\n    else this.#cache.set(key, new Set(Array.from(tokens).map(t => t instanceof TokenDocument ? t.object : t).filter(t => !!t)));\n    const targetDocuments = Array.from(tokens ?? []).map(t => getTokenDocument(t)).filter((t): t is TokenDocument.Implementation => !!t);\n    this.#persist({ [key]: targetDocuments.map(t => namePairs ? { uuid: t.uuid, name: t.name } : t.uuid) });\n  }\n\n  // Rolls persist as toJSON() data and must be rehydrated with Roll.fromData\n  // (which redirects to the persisted subclass via data.class). Falls back to\n  // the raw data if the class is no longer registered.\n  #rollFromData(data: any): Roll {\n    if (data instanceof Roll) return data;\n    try {\n      return Roll.fromData(data) as Roll;\n    } catch (err) {\n      TroubleShooter.recordError(err, `PersistedFieldStore | could not rehydrate roll ${data?.class}`);\n      return data;\n    }\n  }\n\n  roll(key: string): Roll | undefined {\n    if (this.#cache.has(key)) return this.#cache.get(key) as Roll;\n    const data = this.#getFlags()?.[key];\n    if (data) {\n      const roll = this.#rollFromData(data);\n      this.#cache.set(key, roll);\n      return roll;\n    }\n    return undefined;\n  }\n\n  setRoll(key: string, roll: Roll | undefined): void {\n    if (roll === undefined) this.#cache.delete(key);\n    else this.#cache.set(key, roll);\n    this.#forcePersist({ [key]: roll?.toJSON() ?? null });\n  }\n\n  rolls(key: string): Roll[] | undefined {\n    if (this.#cache.has(key)) return this.#cache.get(key) as Roll[];\n    const data = this.#getFlags()?.[key];\n    if (data?.length) {\n      const rolls = data.map((r: any) => this.#rollFromData(r));\n      this.#cache.set(key, rolls);\n      return rolls;\n    }\n    return undefined;\n  }\n\n  setRolls(key: string, rolls: Roll[] | undefined): void {\n    if (rolls === undefined) this.#cache.delete(key);\n    else this.#cache.set(key, rolls);\n    this.#forcePersist({ [key]: rolls?.map(r => r.toJSON()) ?? [] });\n  }\n\n  damageDetail(key: string): DamageDescription[] {\n    if (this.#cache.has(key)) return this.#cache.get(key) as DamageDescription[];\n    const data = this.#getFlags()?.[key];\n    if (data?.length) {\n      const detail = damageDetailsFromObject(data as unknown as DamageDescriptionObject[]);\n      this.#cache.set(key, detail);\n      return detail;\n    }\n    return [];\n  }\n\n  setDamageDetail(key: string, detail: DamageDescription[]): void {\n    if (detail === undefined) this.#cache.delete(key);\n    else this.#cache.set(key, detail);\n    this.#persist({ [key]: damageDetailToObject(detail) });\n  }\n}\n\nexport class Workflow {\n  public static WorkflowDataFlags = WorkflowDataFlags;\n\n  static get forceCreate(): boolean { return true };\n\n  static #workflows: Map<string, WeakRef<Workflow> | Workflow> = new Map();\n  static get workflows() {\n    return Workflow.#workflows\n  }\n  static set workflows(workflows: Map<string, WeakRef<Workflow> | Workflow>) {\n    Workflow.#workflows = workflows;\n  }\n\n  static clearWorkflows() {\n    Workflow.workflows = new Map();\n  }\n  static addWorkflow(workflow: Workflow) {\n    if (Workflow.workflows.has(workflow.id)) console.warn(\"midi-qol | addWorkflow | Workflow already exists\", workflow.id);\n    if (Workflow.workflows.has(workflow.id)) Workflow.removeWorkflow(workflow.id);\n    if (useWeakReferences) Workflow.workflows.set(workflow.id, new WeakRef(workflow));\n    else Workflow.workflows.set(workflow.id, workflow);\n  }\n  static getWorkflow(id?: string): Workflow | undefined {\n    if (debugEnabled > 0) warn(\"Get workflow \", id, Workflow.workflows, Workflow.workflows.get(id ?? \"\"))\n    if (debugEnabled > 1) debug(\"Get workflow \", id, Workflow.workflows, Workflow.workflows.get(id ?? \"\"))\n    if (!id) return;\n    let workflow = Workflow.workflows.get(id);\n    if (workflow instanceof WeakRef) {\n      if (!workflow?.deref()) {\n        console.warn(\"Weak Reference to workflow is not dereferenced\", id);\n        const _workflow = Workflow.fromChatCardUuid(id);\n        if (_workflow) {\n          workflow = new WeakRef(_workflow);\n          Workflow.workflows.set(id, workflow);\n        }\n        return _workflow;\n      }\n      return workflow.deref();\n    } else if (workflow) return workflow;\n    const chatCard = fromUuidSync(id);\n    if (chatCard instanceof ChatMessage && saveToChatCard) {\n      workflow = Workflow.fromChatCardUuid(id);\n      if (workflow) Workflow.workflows.set(id, workflow);\n      return workflow;\n    }\n    // TODO see if the ChatMessage exists and reconstruct the workflow from that.\n    // try fetching via ActivityUuid\n    return this.getWorkflowByActivityUuid(id);\n  }\n\n  static getWorkflowByActivityUuid(activityUuid?: string): Workflow | undefined {\n    if (!activityUuid) return;\n    // Direct map lookup — the workflow is keyed by activity.uuid until the chat card is\n    // created, at which point the activity.uuid entry is deleted and replaced by the\n    // chatMessage.uuid entry. A direct get() avoids finding stale re-keyed workflows.\n    // Use workflows.get() directly (not getWorkflow()) to avoid infinite recursion,\n    // since getWorkflow() falls back to getWorkflowByActivityUuid().\n    const entry = Workflow.workflows.get(activityUuid);\n    let returnValue: Workflow | undefined;\n    if (entry instanceof WeakRef) {\n      returnValue = entry.deref();\n    } else {\n      returnValue = entry;\n    }\n    if (debugEnabled > 0) warn(`Fetching workflow by activity uuid ${activityUuid} workflowId: ${returnValue?.id}`);\n    return returnValue;\n  }\n  static deleteWorkflow(id: string) {\n    Workflow.workflows.delete(id);\n  }\n\n  static fromChatCardUuid(chatCardUuid: string): Workflow | undefined {\n    return new Workflow(null, null, null, null, { chatCardUuid });\n  }\n\n  async performThrottledUpdate(chatCard: ChatMessage.Implementation, updates: ChatMessage.UpdateData, immediate = false) {\n    return await throttledUpdate(chatCard, updates, this.throttleChatMessageUpdates, immediate);\n  }\n\n  itemCardUuid: string | undefined;\n\n  /**\n   * Direct access to chat card's midi-qol flags (no intermediate store).\n   * Returns undefined when there is no chat card.\n   */\n  private get midiFlags(): Record<string, any> | undefined {\n    return this.chatCard?.flags?.[MODULE_ID];\n  }\n\n  /**\n   * Persist field updates to the chat card flag cache.\n   */\n  private persistFields(updates: Record<string, unknown>): void {\n    if (this.itemCardUuid && saveToChatCard) {\n      addUpdatesCacheFlags(this.id, updates, \"midi-qol\");\n    }\n  }\n\n  /**\n   * Persist roll data to the chat card flags unconditionally (regardless of saveToChatCard).\n   * ChatMessageMidi.prepareDerivedData() deserializes these flags into Roll instances.\n   */\n  private forcePersistFields(updates: Record<string, unknown>): void {\n    if (this.itemCardUuid) {\n      addUpdatesCacheFlags(this.id, updates, \"midi-qol\");\n    }\n  }\n\n  #persisted = new PersistedFieldStore(() => this.midiFlags, updates => this.persistFields(updates), updates => this.forcePersistFields(updates));\n\n  get useActiveDefence() { return false; }\n  get actor(): Actor.Implementation {\n    return this.activity?.actor!;\n  }\n\n  get abort() { return this.#persisted.scalar(\"abort\", false, \"aborted\"); }\n  set abort(abort: boolean | undefined) { this.#persisted.setScalar(\"abort\", !!abort); }\n\n  get itemUseComplete() { return this.#persisted.scalar(\"itemUseComplete\", false); }\n  set itemUseComplete(itemUseComplete: boolean | undefined) { this.#persisted.setScalar(\"itemUseComplete\", !!itemUseComplete); }\n\n  #token: Token.Implementation | undefined;\n  get token(): Token.Implementation | undefined {\n    if (this.#token) return this.#token;\n    const uuid = this.midiFlags?.attackingTokenUuid;\n    if (uuid) {\n      this.#token = getToken(uuid);\n    }\n    return this.#token;\n  }\n  set token(token: Token.Implementation | undefined) {\n    this.#token = token;\n    this.persistFields({ attackingTokenUuid: token?.document?.uuid ?? \"\" });\n  }\n\n  get workflowOptions(): WorkflowOptions {\n    return this.#persisted.scalar<WorkflowOptions>(\"workflowOptions\", {});\n  }\n  set workflowOptions(workflowOptions: WorkflowOptions) {\n    this.#persisted.setScalar(\"workflowOptions\", workflowOptions);\n  }\n\n  get needItemCard(): boolean { return !!this.itemCardUuid };\n\n  #activity: Activity | undefined;\n  get activity(): Activity {\n    if (this.#activity) return this.#activity;\n\n    // Use dnd5e's chat card methods — handles both regular and synthetic items\n    if (this.chatCard) {\n      // @ts-expect-error no dnd5e-types\n      this.#activity = this.chatCard.getAssociatedActivity() as Activity;\n      // Apply scaling (stored on message, not on item) — same as dnd5e's _fetchActivity()\n      if (this.#activity) {\n        const scaling = this.chatCard.getFlag(\"dnd5e\", \"scaling\");\n        if (scaling) {\n          const item = this.#activity.item.clone({ flags: { dnd5e: { scaling } } }, { keepId: true });\n          // @ts-expect-error no dnd5e-types\n          this.#activity = item.system.activities.get(this.#activity.id);\n        }\n      }\n    }\n\n    // Fallback: UUID from store (for workflows without a chat card)\n    if (!this.#activity) {\n      const activityUuid = this.midiFlags?.activityUuid;\n      if (activityUuid) {\n        this.#activity = fromUuidSync(activityUuid) as Activity;\n      }\n    }\n\n    if (!this.#activity) {\n      const message = `midi-qol | get activity() | Could not find activity for workflow ${this.id}`;\n      TroubleShooter.recordError(new Error(message));\n      error(message);\n    }\n    return this.#activity!;\n  }\n  set activity(activity: Activity) {\n    this.#activity = activity;\n    this.persistFields({ activityUuid: activity?.uuid ?? \"\" });\n  }\n\n  #item: Item.Implementation | undefined;\n  get item(): Item.Implementation {\n    if (this.#item) return this.#item;\n    if (this.itemCardUuid && saveToChatCard) {\n      const itemUuid = this.chatCard?.getFlag(\"dnd5e\", \"item\")?.uuid;\n      this.#item = fromUuidSync(itemUuid) as Item.Implementation;\n      if (!this.#item) {\n        // foundry.utils.getProperty(this.chatCard, \"flags.\" + chatCardFlags.item)?.itemData - can use this get the item back?\n        const message = `get item() | Could not find item for workflow ${this.id} with itemUuid ${itemUuid}`;\n        TroubleShooter.recordError(new Error(message));\n        error(message);\n      }\n    }\n    return this.#item!;\n  }\n  set item(item: Item.Implementation) {\n    this.#item = item;\n    if (this.itemCardUuid && saveToChatCard) {\n      addUpdatesCacheFlags(this.id, { [\"dnd5e.item.uuid\"]: item?.uuid });\n    }\n  }\n\n  // This value is not stored in flags\n  #speaker: ChatMessage.SpeakerData | undefined = undefined;\n  get speaker(): ChatMessage.SpeakerData {\n    if (this.#speaker) return this.#speaker;\n    if (this.itemCardUuid && saveToChatCard) {\n      this.#speaker = this.chatCard.speaker;\n    }\n    return this.#speaker!;\n  }\n  set speaker(speaker: ChatMessage.SpeakerData) {\n    // TODO do an equals check on the stored and passed speaker\n    this.#speaker = speaker;\n    if (this.itemCardUuid && saveToChatCard) {\n      addUpdatesCache(this.id, { speaker });\n    }\n  }\n\n  get attackingToken() {\n    return this.token\n  }\n  get tokenUuid() {\n    return this.token?.document.uuid;\n  }\n\n  get targets(): Set<Token.Implementation> { return this.#persisted.tokenSet(\"targets\", true); }\n  set targets(targets: Set<TokenOrDocument>) { this.#persisted.setTokenSet(\"targets\", targets ?? new Set(), true); }\n\n  get targetsCanSee(): Set<Token.Implementation> { return this.#persisted.tokenSet(\"targetsCanSeeUuids\"); }\n  set targetsCanSee(targetsCanSee: Set<TokenOrDocument> | undefined) { this.#persisted.setTokenSet(\"targetsCanSeeUuids\", targetsCanSee); }\n  get targetsCanSense(): Set<Token.Implementation> { return this.#persisted.tokenSet(\"targetsCanSenseUuids\"); }\n  set targetsCanSense(targetsCanSense: Set<TokenOrDocument> | undefined) { this.#persisted.setTokenSet(\"targetsCanSenseUuids\", targetsCanSense); }\n\n  get tokenCanSee(): Set<Token.Implementation> { return this.#persisted.tokenSet(\"tokenCanSeeUuids\"); }\n  set tokenCanSee(tokenCanSee: Set<TokenOrDocument> | undefined) { this.#persisted.setTokenSet(\"tokenCanSeeUuids\", tokenCanSee); }\n\n  get tokenCanSense(): Set<Token.Implementation> { return this.#persisted.tokenSet(\"tokenCanSenseUuids\"); }\n  set tokenCanSense(tokenCanSense: Set<TokenOrDocument> | undefined) { this.#persisted.setTokenSet(\"tokenCanSenseUuids\", tokenCanSense); }\n\n  templateUuids: string[] = [];\n  expectedTemplateCount: number = 0;\n  placedTemplateCount: number = 0;\n\n  // Backward compat: templateUuid returns the first template UUID\n  get templateUuid(): string {\n    if (this.templateUuids.length > 0) return this.templateUuids[0];\n    return this.midiFlags?.templateUuid ?? \"\";\n  }\n  set templateUuid(templateUuid: string) {\n    // Backward compat: push to array if not already present\n    if (templateUuid && !this.templateUuids.includes(templateUuid)) {\n      this.templateUuids.push(templateUuid);\n    }\n    this.persistFields({ templateUuid, templateUuids: this.templateUuids });\n  }\n\n  get template(): MeasuredTemplateDocument.Implementation | undefined {\n    return this.templateUuid ? fromUuidSync(this.templateUuid) as MeasuredTemplateDocument.Implementation : undefined;\n  }\n  set template(template: MeasuredTemplateDocument.Implementation | undefined) {\n    if (template?.uuid) this.templateUuid = template.uuid;\n  }\n\n  get templateId() {\n    if (!this.templateUuid || typeof this.templateUuid !== \"string\") return;\n    return this.templateUuid.split(\".\").at(-1);\n  }\n\n  get inCombat() {\n    return this.actor.inCombat\n  }\n  isTurn: boolean | undefined; // Is it the item wielder's turn.\n  get AoO() { return this.#persisted.scalar(\"AoO\", false); }\n  set AoO(AoO: boolean) { this.#persisted.setScalar(\"AoO\", AoO); }\n\n  #damageList: DamageListEntry[] | undefined;\n  get damageList() {\n    if (this.#damageList) return this.#damageList;\n    // See below\n    // if (this.itemCardUuid && SaveToChatCard) {\n    //   this.#damageList = this.chatCard?.getFlag(MODULE_ID, WorkflowDataFlags.damageList);\n    // }\n    return this.#damageList ?? [];\n  }\n  set damageList(damageList: DamageListEntry[]) {\n    this.#damageList = damageList;\n    // This is just too big to store in the chat message - see if there can be a cut down version stored\n    // if (this.itemCardUuid && SaveToChatCard) {\n    //   addUpdatesCacheFlags(this.id, { [chatCardFlags.damageList]: damageList }, \"midi-qol\");\n    // }\n  }\n\n  saveDisplayFlavor: string | undefined;\n\n  #id: string = \"\";\n  get id() { return this.#id }\n  set id(id: string) { this.#id = id }\n\n  get uuid() {\n    if (debugEnabled > 0) warn(`workflow.uuid is deprecated. Use workflow.id to reference the workflow and workflow.itemUuid to reference the item instead.\n      Returning ${this.activity.uuid} workflowId: ${this.id}`);\n    return this.activity.uuid;\n  }\n\n  get suspended() { return this.#persisted.scalar(\"suspended\", false); }\n  set suspended(suspended: boolean) { this.#persisted.setScalar(\"suspended\", suspended); }\n\n  #currentAction: WorkflowState;\n  get currentAction() {\n    if (this.#currentAction) return this.#currentAction;\n    if (this.itemCardUuid && saveToChatCard) {\n\n      const [className, currentActionName] = this.chatCard?.getFlag(MODULE_ID, WorkflowDataFlags.currentAction) ?? [\"none\", \"none\"];\n      if (className !== \"none\") {\n        const actionClass = WorkflowRegistry[className];\n        if (actionClass && (actionClass === Workflow || actionClass.prototype instanceof Workflow)) {\n          const action = actionClass?.prototype[currentActionName];\n          if (action) {\n            this.#currentAction = action;\n          } else {\n            error(`get currentAction() | Could not find action ${currentActionName} in class ${className}`);\n          }\n        } else error(`get currentAction() | Class ${className} is not a subclass of Workflow`);\n      }\n    }\n    return this.#currentAction;\n  }\n  set currentAction(currentAction: WorkflowState) {\n    this.#currentAction = currentAction;\n    if (this.itemCardUuid && saveToChatCard) {\n      addUpdatesCacheFlags(this.id, { [WorkflowDataFlags.currentAction]: [this.constructor.name, currentAction?.name] }, \"midi-qol\");\n    }\n  }\n\n  #isCriticalRestored: boolean = false;\n  /**\n   * Get computed critical state from the tracker.\n   * On first access, restores from store (loaded from chat card flags) if available.\n   */\n  get isCritical(): boolean {\n    // Restore from store on first access\n    if (!this.#isCriticalRestored && this.itemCardUuid && saveToChatCard) {\n      if (this.midiFlags?.isCritical) {\n        this.attackRollModifierTracker.critical.setOverride(true, \"restored\", \"Restored from chat card\");\n      }\n      this.#isCriticalRestored = true;\n    }\n    return this.attackRollModifierTracker.isCritical;\n  }\n  /**\n   * Set critical state via override. Used for persistence and external assignment.\n   * Prefer using tracker methods directly for attribution.\n   */\n  set isCritical(isCritical: boolean) {\n    this.attackRollModifierTracker.critical.setOverride(isCritical, \"direct\", \"Direct assignment\");\n    this.#isCriticalRestored = true;\n    this.persistFields({ isCritical });\n  }\n\n  #isFumbleRestored: boolean = false;\n  /**\n   * Get computed fumble state from the tracker.\n   * On first access, restores from store (loaded from chat card flags) if available.\n   */\n  get isFumble(): boolean {\n    // Restore from store on first access\n    if (!this.#isFumbleRestored && this.itemCardUuid && saveToChatCard) {\n      if (this.midiFlags?.isFumble) {\n        this.attackRollModifierTracker.fumble.setOverride(true, \"restored\", \"Restored from chat card\");\n      }\n      this.#isFumbleRestored = true;\n    }\n    return this.attackRollModifierTracker.isFumble;\n  }\n  /**\n   * Set fumble state via override. Used for persistence and external assignment.\n   * Prefer using tracker methods directly for attribution.\n   */\n  set isFumble(isFumble: boolean) {\n    this.attackRollModifierTracker.fumble.setOverride(isFumble, \"direct\", \"Direct assignment\");\n    this.#isFumbleRestored = true;\n    this.persistFields({ isFumble });\n  }\n\n  /**\n   * @deprecated Use workflow.attackRollModifierTracker.critical.isForced instead\n   */\n  get critFlagSet(): boolean {\n    foundry.utils.logCompatibilityWarning(\n      \"midi-qol | workflow.critFlagSet is deprecated. Use workflow.attackRollModifierTracker.critical.isForced instead.\",\n      { since: \"13.0.40\", until: \"14\", once: true }\n    );\n    return this.attackRollModifierTracker.critical.isForced;\n  }\n\n  /**\n   * @deprecated Use workflow.attackRollModifierTracker.critical.isSuppressed instead\n   */\n  get noCritFlagSet(): boolean {\n    foundry.utils.logCompatibilityWarning(\n      \"midi-qol | workflow.noCritFlagSet is deprecated. Use workflow.attackRollModifierTracker.critical.isSuppressed instead.\",\n      { since: \"13.0.40\", until: \"14\", once: true }\n    );\n    return this.attackRollModifierTracker.critical.isSuppressed;\n  }\n\n  get d20AttackRoll() { return this.#persisted.scalar(\"d20AttackRoll\", -1); }\n  set d20AttackRoll(d20AttackRoll: number) { this.#persisted.setScalar(\"d20AttackRoll\", d20AttackRoll); }\n\n  get hitTargets(): Set<Token.Implementation> { return this.#persisted.tokenSet(\"hitTargetUuids\"); }\n  set hitTargets(hitTargets: Set<TokenOrDocument> | undefined) { this.#persisted.setTokenSet(\"hitTargetUuids\", hitTargets); }\n\n  get hitTargetsEC(): Set<Token.Implementation> { return this.#persisted.tokenSet(\"hitECTargetUuids\"); }\n  set hitTargetsEC(hitTargetsEC: Set<TokenOrDocument> | undefined) { this.#persisted.setTokenSet(\"hitECTargetUuids\", hitTargetsEC); }\n\n  #otherDamageMatches: Set<Token.Implementation> | undefined;\n  get otherDamageMatches(): Set<Token.Implementation> | undefined {\n    if (this.#otherDamageMatches !== undefined) return this.#otherDamageMatches;\n    const uuids = this.midiFlags?.otherDamageMatchUuids;\n    if (uuids) {\n      this.#otherDamageMatches = new Set(\n        uuids.map((uuid: string) => (fromUuidSync(uuid) as TokenDocument | undefined)?.object).filter((t: Token.Implementation | undefined): t is Token.Implementation => !!t)\n      );\n      return this.#otherDamageMatches;\n    }\n    return undefined;\n  }\n  set otherDamageMatches(matches: Set<Token.Implementation> | undefined) {\n    this.#otherDamageMatches = matches;\n    const uuids = matches ? Array.from(matches).map(t => getTokenDocument(t)?.uuid).filter((u): u is string => !!u) : [];\n    this.persistFields({ otherDamageMatchUuids: uuids });\n  }\n\n  get attackRoll(): Roll | undefined { return this.#persisted.roll(\"attackRoll\"); }\n  set attackRoll(attackRoll: Roll | undefined) {\n    if (attackRoll) attackRoll.data = {};\n    this.#persisted.setRoll(\"attackRoll\", attackRoll);\n  }\n\n  get diceRoll() { return this.#persisted.scalar(\"diceRoll\", 0); }\n  set diceRoll(diceRoll: number) { this.#persisted.setScalar(\"diceRoll\", diceRoll); }\n\n  get attackTotal() { return this.#persisted.scalar(\"attackTotal\", 0); }\n  set attackTotal(attackTotal: number) { this.#persisted.setScalar(\"attackTotal\", attackTotal); }\n\n  attackRollHTML: HTMLElement | string | undefined;\n\n  get attackRollCount() { return this.#persisted.scalar(\"attackRollCount\", 0); }\n  set attackRollCount(attackRollCount: number) { this.#persisted.setScalar(\"attackRollCount\", attackRollCount); }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Attack Advantage Mode - tracks advantage/disadvantage with counts and suppression\n  // ─────────────────────────────────────────────────────────────────\n\n  #attackRollModifierTracker: RollModifierTracker = new RollModifierTracker();\n  #attackRollModifierTrackerRestored = false;\n\n  /**\n   * Get the RollModifierTracker instance for attack rolls.\n   * Use this for granular control over advantage/disadvantage tracking.\n   * On first access, restores from chat card flags if available.\n   */\n  get attackRollModifierTracker(): RollModifierTracker {\n    if (!this.#attackRollModifierTrackerRestored && this.itemCardUuid && saveToChatCard) {\n      const data = this.midiFlags?.attackRollModifierTrackerData;\n      if (data) {\n        this.#attackRollModifierTracker.restore(data);\n        // Full tracker restore supersedes the boolean-only isCritical/isFumble restore\n        this.#isCriticalRestored = true;\n        this.#isFumbleRestored = true;\n      }\n      this.#attackRollModifierTrackerRestored = true;\n    }\n    return this.#attackRollModifierTracker;\n  }\n\n  /** Alias for attackRollModifierTracker */\n  get tracker(): RollModifierTracker {\n    return this.attackRollModifierTracker;\n  }\n\n  /**\n   * Persist the attack roll modifier tracker state to chat card flags.\n   * Called after processAttackRoll and checkHits when the tracker state is finalized.\n   */\n  private persistAttackTracker(): void {\n    this.persistFields({ attackRollModifierTrackerData: this.#attackRollModifierTracker.toJSON() });\n  }\n\n  /**\n   * Backward compatibility getter for advantage.\n   * Returns true if there's effective advantage, false if suppressed, undefined if no sources.\n   */\n  get advantage(): boolean | undefined {\n    return this.#attackRollModifierTracker.hasAdvantage;\n  }\n\n  /**\n   * Backward compatibility setter for advantage.\n   * - `true`: adds one source of advantage\n   * - `false`: clears all advantage sources (preserves suppression)\n   * - `undefined`: resets the entire advantage mode state\n   */\n  set advantage(value: boolean | undefined) {\n    if (value === true) {\n      this.#attackRollModifierTracker.advantage.add();\n    } else if (value === undefined) {\n      this.#attackRollModifierTracker.reset();\n    } else if (value === false) {\n      this.#attackRollModifierTracker.advantage.clear();\n    }\n  }\n\n  /**\n   * Backward compatibility getter for disadvantage.\n   * Returns true if there's effective disadvantage, false if suppressed, undefined if no sources.\n   */\n  get disadvantage(): boolean | undefined {\n    return this.#attackRollModifierTracker.hasDisadvantage;\n  }\n\n  /**\n   * Backward compatibility setter for disadvantage.\n   * - `true`: adds one source of disadvantage\n   * - `false`: clears all disadvantage sources (preserves suppression)\n   * - `undefined`: resets the entire advantage mode state\n   */\n  set disadvantage(value: boolean | undefined) {\n    if (value === true) {\n      this.#attackRollModifierTracker.disadvantage.add();\n    } else if (value === undefined) {\n      this.#attackRollModifierTracker.reset();\n    } else if (value === false) {\n      this.#attackRollModifierTracker.disadvantage.clear();\n    }\n  }\n\n  /**\n   * Backward compatibility getter for noAdvantage.\n   * Returns true if advantage is suppressed.\n   */\n  get noAdvantage(): boolean {\n    return this.#attackRollModifierTracker.advantage.isSuppressed;\n  }\n\n  /**\n   * Backward compatibility setter for noAdvantage.\n   * - `true`: suppresses all advantage sources\n   * - `false`/`undefined`: does nothing (suppression cannot be undone without reset)\n   */\n  set noAdvantage(value: boolean | undefined) {\n    if (value === true) {\n      this.#attackRollModifierTracker.advantage.suppress();\n    }\n  }\n\n  /**\n   * Backward compatibility getter for noDisadvantage.\n   * Returns true if disadvantage is suppressed.\n   */\n  get noDisadvantage(): boolean {\n    return this.#attackRollModifierTracker.disadvantage.isSuppressed;\n  }\n\n  /**\n   * Backward compatibility setter for noDisadvantage.\n   * - `true`: suppresses all disadvantage sources\n   * - `false`/`undefined`: does nothing (suppression cannot be undone without reset)\n   */\n  set noDisadvantage(value: boolean | undefined) {\n    if (value === true) {\n      this.#attackRollModifierTracker.disadvantage.suppress();\n    }\n  }\n\n  get dnd5eFlags(): any | undefined {\n    return foundry.utils.getProperty(this.chatCard, \"flags.dnd5e\") as AnyObject | undefined;\n  }\n  set dnd5eFlags(dnd5eFlags: any | undefined) {\n    if (this.chatCard)\n      addUpdatesCache(this.id, { \"flags.dnd5e\": dnd5eFlags });\n  }\n\n  get targetDescriptors(): Array<DND5ETargetDescriptor> | undefined {\n    return foundry.utils.getProperty(this.chatCard, WorkflowDataFlags.targetDescriptors) as Array<DND5ETargetDescriptor>;\n  }\n  set targetDescriptors(targetDescriptors: Array<DND5ETargetDescriptor>) {\n    if (this.chatCard)\n      addUpdatesCache(this.id, { [WorkflowDataFlags.targetDescriptors]: targetDescriptors });\n  }\n  noAutoAttack: boolean | undefined; // override attack roll for standard care\n\n  hitDisplayData: Record<string, {\n    ac?: number;\n    acClass: string;\n    acDisplay?: string;\n    acTooltip?: string;\n    actorUuid?: string;\n    attackBonus?: number;\n    attackTotal?: number;\n    attackType?: string;\n    baseAc?: number;\n    acIcons?: Array<{ img?: string; icon?: string; tooltip?: string; cssClass: string; useDnd5eIcon?: boolean }>;\n    gmName: string;\n    hitClass: string;\n    hitResultNumeric?: string;\n    hitString?: string;\n    hitStyle?: string;\n    hitSymbol?: string;\n    img: string;\n    isHit: boolean;\n    targetClass: string;\n    playerName: string;\n    showAC: boolean;\n    target: Token.Implementation;\n    uuid: string;\n  }> | undefined;\n\n  saveDisplayData: {\n    gmName: string;\n    playerName: string;\n    img: string;\n    targetClass: string;\n    target: Token.Implementation;\n    saveSymbol: string;\n    saveTotalClass: string;\n    saveToolTipClass?: string;\n    rollTotal: string;\n    rollDetail: string;\n    rollHTML: string;\n    id: string;\n    adv?: boolean;\n    modifierTracker?: RollModifierTracker;  // Full RollModifierTracker for attribution tracking\n    attributionTooltip?: string;  // HTML-escaped attribution tooltip for data-tooltip-html attribute\n    hasAttribution?: boolean;  // Whether there is attribution data to display an info icon\n    coverLabel?: string;  // SVG path for cover indicator icon\n    saveTooltip?: string;  // Tooltip showing save roll breakdown vs DC\n    saveClass: string;\n  }[] | undefined;\n\n  get utilityRoll() {\n    if (!this.utilityRolls || this.utilityRolls.length === 0) return undefined;\n    let finalRoll = this.utilityRolls.slice(1).reduce((rolls, roll) => addRollTo(rolls, roll), this.utilityRolls[0]);\n    return finalRoll;\n  }\n  set utilityRoll(roll: Roll | undefined) {\n    if (roll) this.setUtilityRoll(roll);\n  }\n\n  get damageRoll(): Roll | undefined {\n    if (!this.damageRolls || this.damageRolls.length === 0) return undefined;\n    let finalRoll = this.damageRolls.slice(1).reduce((rolls, roll) => addRollTo(rolls, roll), this.damageRolls[0]);\n    return finalRoll;\n  }\n  set damageRoll(roll: Roll | undefined) {\n    if (roll) this.setDamageRoll(roll);\n  }\n  set bonusDamageRoll(roll: Roll | undefined) {\n    if (roll) this.setBonusDamageRoll(roll);\n  }\n  get bonusDamageRoll(): Roll | undefined {\n    if (!this.bonusDamageRolls || this.bonusDamageRolls.length === 0) return undefined;\n    let finalRoll = this.bonusDamageRolls.slice(1).reduce((rolls, roll) => addRollTo(rolls, roll), this.bonusDamageRolls[0]);\n    return finalRoll;\n  }\n  get otherDamageRoll(): Roll | undefined {\n    if (!this.otherDamageRolls || this.otherDamageRolls.length === 0) return undefined;\n    let finalRoll = this.otherDamageRolls.slice(1).reduce((rolls, roll) => addRollTo(rolls, roll), this.otherDamageRolls[0]);\n    return finalRoll;\n  }\n  set otherDamageRoll(roll: Roll | undefined) {\n    if (roll) this.setOtherDamageRoll(roll);\n  }\n  get otherActivity() {\n    return this.activity.otherActivity;\n  }\n\n  /**\n   * Check if an activity has a valid save configuration (save with abilities, or check with ability/associated)\n   */\n  protected hasValidSaveOrCheck(activity: Activity | null | undefined): boolean {\n    if (!activity) return false;\n    if (activity.save) {\n      // Save must have at least one ability configured\n      const abilities = activity.save.ability;\n      if (abilities instanceof Set) return abilities.size > 0;\n      return !!abilities;\n    }\n    if (activity.check) {\n      // Check is valid with ability, associated skills/tools, or as a plain d20 roll\n      return true;\n    }\n    return false;\n  }\n\n  get activityHasSave() {\n    return this.hasValidSaveOrCheck(this.saveActivity);\n  }\n  get saveActivity() {\n    if (this.hasValidSaveOrCheck(this.activity)) return this.activity;\n    if (this.hasValidSaveOrCheck(this.otherActivity)) return this.otherActivity;\n    return undefined;\n  }\n  get saveActivityDetails(): ActivitySave | ActivityCheck | undefined {\n    return this.saveActivity?.save || this.saveActivity?.check;\n  }\n\n  get saveItem() {\n    if (this.activity.save || this.activity.check) return this.item;\n    return this.saveActivity?.item ?? this.activity.item;\n  }\n\n  #rolls: Roll[] | undefined;\n  get rolls(): Roll[] {\n    if (this.#rolls) return this.#rolls;\n    if (this.itemCardUuid && saveToChatCard) {\n      this.#rolls = this.chatCard.rolls as Roll[];\n    }\n    return this.#rolls ?? [];\n  }\n\n  get damageRolls(): Roll[] { return this.#persisted.rolls(\"damageRolls\") ?? []; }\n  set damageRolls(damageRolls: Roll[]) { this.#persisted.setRolls(\"damageRolls\", damageRolls); }\n\n  get bonusDamageRolls(): Roll[] | undefined { return this.#persisted.rolls(\"bonusDamageRolls\"); }\n  set bonusDamageRolls(bonusDamageRolls: Roll[] | undefined) { this.#persisted.setRolls(\"bonusDamageRolls\", bonusDamageRolls); }\n\n  get otherDamageRolls(): Roll[] | undefined { return this.#persisted.rolls(\"otherDamageRolls\"); }\n  set otherDamageRolls(otherDamageRolls: Roll[] | undefined) { this.#persisted.setRolls(\"otherDamageRolls\", otherDamageRolls); }\n\n  get utilityRolls(): Roll[] | undefined { return this.#persisted.rolls(\"utilityRolls\") ?? []; }\n  set utilityRolls(utilityRolls: Roll[] | undefined) {\n    utilityRolls?.forEach(d => d.data = {});\n    this.#persisted.setRolls(\"utilityRolls\", utilityRolls);\n  }\n\n  get damageTotal() { return this.#persisted.scalar(\"damageTotal\", 0); }\n  set damageTotal(damageTotal: number) { this.#persisted.setScalar(\"damageTotal\", damageTotal); }\n\n  get rawDamageDetail(): DamageDescription[] { return this.#persisted.damageDetail(\"rawDamageDetail\"); }\n  set rawDamageDetail(rawDamageDetail: DamageDescription[]) { this.#persisted.setDamageDetail(\"rawDamageDetail\", rawDamageDetail); }\n\n  get rawOtherDamageDetail(): DamageDescription[] { return this.#persisted.damageDetail(\"rawOtherDamageDetail\"); }\n  set rawOtherDamageDetail(rawOtherDamageDetail: DamageDescription[]) { this.#persisted.setDamageDetail(\"rawOtherDamageDetail\", rawOtherDamageDetail); }\n\n  get rawBonusDamageDetail(): DamageDescription[] { return this.#persisted.damageDetail(\"rawBonusDamageDetail\"); }\n  set rawBonusDamageDetail(rawBonusDamageDetail: DamageDescription[]) { this.#persisted.setDamageDetail(\"rawBonusDamageDetail\", rawBonusDamageDetail); }\n\n  get damageDetail(): DamageDescription[] { return this.#persisted.damageDetail(\"damageDetail\"); }\n  set damageDetail(damageDetail: DamageDescription[]) { this.#persisted.setDamageDetail(\"damageDetail\", damageDetail); }\n  get otherDamageDetail(): DamageDescription[] { return this.#persisted.damageDetail(\"otherDamageDetail\"); }\n  set otherDamageDetail(otherDamageDetail: DamageDescription[]) { this.#persisted.setDamageDetail(\"otherDamageDetail\", otherDamageDetail); }\n\n  get bonusDamageDetail(): DamageDescription[] { return this.#persisted.damageDetail(\"bonusDamageDetail\"); }\n  set bonusDamageDetail(bonusDamageDetail: DamageDescription[]) { this.#persisted.setDamageDetail(\"bonusDamageDetail\", bonusDamageDetail); }\n\n  damageRollHTML: HTMLElement | string | undefined;\n\n  get damageRollCount(): number { return this.#persisted.scalar(\"damageRollCount\", 0); }\n  set damageRollCount(damageRollCount: number) { this.#persisted.setScalar(\"damageRollCount\", damageRollCount); }\n\n  get defaultDamageType(): string { return this.#persisted.scalar(\"defaultDamageType\", \"\"); }\n  set defaultDamageType(defaultDamageType: string) { this.#persisted.setScalar(\"defaultDamageType\", defaultDamageType); }\n\n  get effectsAlreadyExpired(): string[] { return this.#persisted.scalar<string[]>(\"effectsAlreadyExpired\", []); }\n  set effectsAlreadyExpired(effectsAlreadyExpired: string[]) { this.#persisted.setScalar(\"effectsAlreadyExpired\", effectsAlreadyExpired); }\n\n  noAutoDamage: boolean | undefined; // override damage roll for damage rolls\n\n  get saves(): Set<Token.Implementation> { return this.#persisted.tokenSet(\"saveUuids\"); }\n  set saves(saves: Set<TokenOrDocument> | undefined) { this.#persisted.setTokenSet(\"saveUuids\", saves); }\n\n  get superSavers(): Set<Token.Implementation> { return this.#persisted.tokenSet(\"superSaverUuids\"); }\n  set superSavers(superSavers: Set<TokenOrDocument> | undefined) { this.#persisted.setTokenSet(\"superSaverUuids\", superSavers); }\n  get semiSuperSavers(): Set<Token.Implementation> { return this.#persisted.tokenSet(\"semiSuperSaverUuids\"); }\n  set semiSuperSavers(semiSuperSavers: Set<TokenOrDocument> | undefined) { this.#persisted.setTokenSet(\"semiSuperSaverUuids\", semiSuperSavers); }\n\n  get failedSaves(): Set<Token.Implementation> { return this.#persisted.tokenSet(\"failedSaveUuids\"); }\n  set failedSaves(failedSaves: Set<TokenOrDocument> | undefined) { this.#persisted.setTokenSet(\"failedSaveUuids\", failedSaves); }\n\n  get fumbleSaves(): Set<Token.Implementation> { return this.#persisted.tokenSet(\"fumbleSaveUuids\"); }\n  set fumbleSaves(fumbleSaves: Set<TokenOrDocument> | undefined) { this.#persisted.setTokenSet(\"fumbleSaveUuids\", fumbleSaves); }\n  get criticalSaves(): Set<Token.Implementation> { return this.#persisted.tokenSet(\"criticalSaveUuids\"); }\n  set criticalSaves(criticalSaves: Set<TokenOrDocument> | undefined) { this.#persisted.setTokenSet(\"criticalSaveUuids\", criticalSaves); }\n  get advantageSaves(): Set<Token.Implementation> { return this.#persisted.tokenSet(\"advantageSaveUuids\"); }\n  set advantageSaves(advantageSaves: Set<TokenOrDocument> | undefined) { this.#persisted.setTokenSet(\"advantageSaveUuids\", advantageSaves); }\n  saveRequests: Record<string, (value: any) => void>;\n  saveTimeouts: Record<string, NodeJS.Timeout>;\n  defenceRequests: Record<string, (value: any) => void>;\n  defenceTimeouts: Record<string, NodeJS.Timeout>;\n\n  flagTags: AnyMutableObject | undefined;\n\n  #onUseMacros: OnUseMacros | undefined;\n  get onUseMacros() {\n    if (this.#onUseMacros) return this.#onUseMacros;\n    if (configSettings.allowUseMacro) {\n      this.#onUseMacros = new OnUseMacros();\n      const itemOnUseMacros = this.item.getFlag(MODULE_ID, \"onUseMacroParts\") ?? new OnUseMacros();\n      const actorOnUseMacros = this.actor.getFlag(MODULE_ID, \"onUseMacroParts\") ?? new OnUseMacros();\n      if (this.workflowOptions?.onlyOnUseItemMacros) {\n        this.#onUseMacros.items = [...itemOnUseMacros.items];\n        this.onUseMacros = this.onUseMacros\n      } else {\n        this.#onUseMacros.items = [...itemOnUseMacros.items, ...actorOnUseMacros.items];\n        this.onUseMacros = this.onUseMacros\n      }\n    }\n    return this.#onUseMacros;\n  }\n  set onUseMacros(onUseMacros: OnUseMacros | undefined) {\n    this.#onUseMacros = onUseMacros;\n  }\n\n  #ammunitionOnUseMacros: OnUseMacros | undefined;\n  get ammunitionOnUseMacros() {\n    if (this.#ammunitionOnUseMacros) return this.#ammunitionOnUseMacros;\n    this.#ammunitionOnUseMacros = new OnUseMacros();\n    const ammunitionOnUseMacros = this.ammunition?.getFlag(MODULE_ID, \"onUseMacroParts\") ?? new OnUseMacros();\n    this.#ammunitionOnUseMacros.items = ammunitionOnUseMacros.items;\n    return this.#ammunitionOnUseMacros;\n  }\n  set ammunitionOnUseMacros(ammunitionOnUseMacros: OnUseMacros | undefined) {\n    this.#ammunitionOnUseMacros = ammunitionOnUseMacros;\n    if (this.itemCardUuid && saveToChatCard) {\n      addUpdatesCacheFlags(this.id, { [WorkflowDataFlags.ammunitionOnUseMacros]: ammunitionOnUseMacros }, \"midi-qol\");\n    }\n  }\n\n  // Legacy Set - delegates to RollModifierTracker\n  get attackAdvAttribution(): Set<string> {\n    return this.#attackRollModifierTracker.legacyAttribution;\n  }\n  set attackAdvAttribution(_value: Set<string>) {\n    this.#attackRollModifierTracker.reset();\n  }\n\n  // Structured attack attribution - delegates to attackRollModifierTracker\n  // Uses AttributionMap: type -> source -> displayName for O(1) lookups\n  get attackAttribution(): AttributionMap {\n    return this.#attackRollModifierTracker.attribution as AttributionMap;\n  }\n\n  // Structured save attribution - keyed by target UUID\n  // Uses AttributionMap per target for O(1) lookups\n  #saveAttribution: Record<string, AttributionMap> | undefined;\n  get saveAttribution(): Record<string, AttributionMap> {\n    if (this.#saveAttribution) return this.#saveAttribution;\n    if (this.itemCardUuid && saveToChatCard) {\n      this.#saveAttribution = this.chatCard?.getFlag(MODULE_ID, WorkflowDataFlags.saveAttribution) as Record<string, AttributionMap> | undefined;\n    }\n    return this.#saveAttribution ?? {};\n  }\n  set saveAttribution(saveAttribution: Record<string, AttributionMap>) {\n    this.#saveAttribution = saveAttribution;\n    if (this.itemCardUuid && saveToChatCard) {\n      addUpdatesCacheFlags(this.id, { [WorkflowDataFlags.saveAttribution]: saveAttribution }, \"midi-qol\");\n    }\n  }\n\n  /**\n   * Add a structured attribution for a target's saving throw.\n   * O(1) operation - uses object property assignment for deduplication.\n   * @param targetUuid - The UUID of the target\n   * @param type - Attribution type (ADV, DIS, etc.)\n   * @param source - Source identifier\n   * @param displayName - Human-readable display name\n   */\n  addSaveAttribution(targetUuid: string, type: AttributionType, source: string, displayName: string): void {\n    const current = this.#saveAttribution ?? {};\n    current[targetUuid] ??= {};\n    current[targetUuid][type] ??= {};\n    current[targetUuid][type]![source] = displayName;\n    this.saveAttribution = current;\n  }\n\n  // Legacy Set for adv-reminder module - delegates to RollModifierTracker\n  get advReminderAttackAdvAttribution(): Set<string> {\n    return this.#attackRollModifierTracker.advReminderAttribution;\n  }\n  set advReminderAttackAdvAttribution(_value: Set<string>) {\n    this.#attackRollModifierTracker.reset();\n  }\n\n  get noOptionalRules() { return this.#persisted.scalar(\"noOptionalRules\", false); }\n  set noOptionalRules(noOptionalRules: boolean) { this.#persisted.setScalar(\"noOptionalRules\", noOptionalRules); }\n  undoData: UndoData | undefined; // Way too big to store. Undos are blanked on reload\n\n  get bonusDamageFlavor() {\n    // @ts-expect-error options.type is specific to 5e `DamageRoll`s\n    return `(${this.bonusDamageRolls?.map(r => r.options.flavor ?? r.options.type)})`;\n  }\n\n  public get chatCard() {\n    return getCachedDocument(this.itemCardUuid) as ChatMessage.Implementation;\n  }\n\n  get itemCardId() {\n    return this.chatCard?.id;\n  }\n\n  get damageFlavor() {\n    if (this.activity.type === \"heal\") return i18n(\"midi-qol.BaseHealingFlavor\");\n    return i18n(\"midi-qol.BaseDamageFlavor\");\n    // See what the reception to a simple header is\n    // if (this.rawDamageDetail?.filter(d => d.damage !== 0).length === 0) return `(${allDamageTypes[this.defaultDamageType ?? \"none\"].label})`\n    // return `(${this.rawDamageDetail?.filter(d => d.damage !== 0).map(d => allDamageTypes[d.type].label || d.type)})`;\n  }\n\n  #randomItemId: string | undefined;\n  get itemId() {\n    if (this.item) return this.item.id!;\n    if (!this.#randomItemId) this.#randomItemId = foundry.utils.randomID();\n    return this.#randomItemId;\n  }\n\n  get needTemplate(): boolean {\n    return this.expectedTemplateCount > 0 && this.templateUuids.length < this.expectedTemplateCount;\n  }\n\n  get itemUuid(): string | undefined {\n    return this.item.uuid;\n  }\n\n  get otherDamageFlavor() {\n    if (this.otherActivity?.type === \"heal\") return i18n(\"midi-qol.OtherHealIngFlavor\");\n    if (this.otherActivity?.midiProperties?.displayActivityName) {\n      return i18n(this.otherActivity.name);\n    }\n    return i18n(\"midi-qol.OtherDamageFlavor\");\n  }\n\n  get useCondition() {\n    return this.activity.useCondition;\n  }\n\n  get effectActivationCondition() {\n    return this.activity.effectCondition;\n  }\n\n  get hasSave(): boolean {\n    return Boolean(this.activity.save || this.activity.check || this.otherActivity?.save || this.otherActivity?.check);\n  }\n\n  get otherDamageFormula() {\n    error(\"workflow.otherDamageFormula is deprecated without replacement.\");\n    return \"\";\n  }\n\n  get otherUseCondition() {\n    return this.otherActivity?.useCondition;\n  }\n\n  get otherEffectActivationCondition() {\n    return this.otherActivity?.effectCondition;\n  }\n\n  get shouldRollDamage(): boolean {\n    if (this.systemCard) return false;\n    if (this.actor.type === configSettings.averageDamage || configSettings.averageDamage === \"all\") return true;\n    const normalRoll = getAutoRollDamage(this) === \"always\"\n      || !!(getAutoRollDamage(this) === \"saveOnly\" && this.activity.save && !this.activity.attack)\n      || !!(getAutoRollDamage(this) !== \"none\" && (!this.activity.attack || configSettings.autoCheckHit === \"none\"))\n      || !!(getAutoRollDamage(this) === \"onHit\" && (this.hitTargets.size > 0 || this.hitTargetsEC?.size > 0 || this.targets.size === 0))\n      || !!(getAutoRollDamage(this) === \"onHit\" && (this.hitTargetsEC?.size > 0));\n    return this.rollOptions?.rollToggle ? !normalRoll : normalRoll;\n  }\n\n  get spellLevel(): number {\n    let spellLevel;\n    if (this.chatCard) {\n      spellLevel = isDnd5e53\n        ? foundry.utils.getProperty(this.chatCard, \"system.spellLevel\")\n        : foundry.utils.getProperty(this.chatCard, \"flags.dnd5e.use.spellLevel\");\n    }\n    return spellLevel ?? this.castData?.castLevel ?? 0;\n  }\n\n  get workflowType() { return \"BaseWorkflow\" };\n\n  setTargets(targets: Set<TokenOrDocument>) {\n    this.targets = new Set(targets);\n    this.saves = new Set();\n    this.failedSaves = new Set(this.targets)\n    this.hitTargets = new Set();\n    this.superSavers = new Set();\n    this.semiSuperSavers = new Set();\n    this.advantageSaves = new Set();\n    this.criticalSaves = new Set();\n    this.fumbleSaves = new Set();\n    this.hitTargetsEC = new Set();\n  }\n\n  get saveRolls() {\n    foundry.utils.logCompatibilityWarning(\"Workflow.saveRolls is deprecated without replacement. Use workflow.tokenSaves instead\", {since: \"midi-qol 13.0.42\", until: \"mid-qol 13.1.0\"});\n    if (this.tokenSaves)\n      return Object.values(this.tokenSaves);\n    return [];\n  }\n\n  ammunition: Item.Implementation | undefined;\n  systemCard: boolean | undefined;\n  aborted: boolean = false;\n  workflowName: string | undefined;\n  forceApplyEffects: boolean;\n  onUseCalled: boolean;\n  attackRolled: boolean;\n  longRangeAttack: boolean | undefined;\n  preSelectedTargets: Set<Token.Implementation>;\n  postSummonHookId: number | undefined;\n  summonedCreatures: TokenDocument.Implementation[] | undefined;\n  transformedActorUuids: string[] | undefined;\n  transformedActors: Actor.Implementation[] | undefined;\n  kickStart: boolean | undefined;\n  disadvantageSaves: Set<Token.Implementation> | undefined;\n  saveResults: Roll[] | undefined; /* D20Roll */\n  stateTransitionCount: number | undefined;\n  maxTransitionCount: number = 250;\n  selfTargeted: boolean | undefined;\n  workflowStartTime: number | undefined;\n  rangeTargeting: boolean | undefined;\n  tempTargetConfirmation: boolean | undefined;\n  whisperAttackCard: boolean | undefined;\n  effectTargets: Set<Token.Implementation> | undefined;\n  // Deferred other activity damage rolling - stored when consumption needs to be checked first\n  otherDamageConfig: RollProcessConfig | undefined;\n  otherDamageDialog: RollDialogConfig | undefined;\n  activationMatches: Set<Token.Implementation> | undefined;\n  activationFails: Set<Token.Implementation> | undefined;\n  otherActivationMatches: Set<Token.Implementation> | undefined;\n  otherActivationFails: Set<Token.Implementation> | undefined;\n  otherEffectTargets: Set<Token.Implementation> | undefined;\n  allOtherEffectTargets: Set<Token.Implementation> | undefined;\n  effectTargetsOnSave: Set<Token.Implementation> | undefined;\n  otherEffectTargetsOnSave: Set<Token.Implementation> | undefined;\n  otherDamageTotal: number | undefined;\n  bonusDamageTotal: number | undefined;\n  keepActivityCard: boolean | undefined;\n  needsHitTargetsDisplayed: boolean = true;\n  // TODO: Type this\n  conditionData: any | undefined;\n  flankingAdvantage: boolean | undefined;\n  bonusDamageHTML: string | undefined;\n  otherDamageList: DamageListEntry[] | undefined;\n  macroPass: string | undefined;\n  tag: string | undefined;\n  activeDefenceDC: number | undefined;\n  utilityRollHTML: string | undefined;\n  useOther: boolean | undefined;\n  otherDamageRollHTML: string | undefined;\n  saveTargetsDisplayed: boolean | undefined;\n  targetSaveDetails: Record<string, SaveDetails> | undefined;  // Per-target SaveDetails for attribution tracking\n\n  /** Get save rolls keyed by target UUID - derived from targetSaveDetails */\n  get tokenSaves(): Record<string, Roll> | undefined {\n    if (!this.targetSaveDetails) return undefined;\n    const result: Record<string, Roll> = {};\n    for (const [uuid, details] of Object.entries(this.targetSaveDetails)) {\n      if (details.saveRoll) result[uuid] = details.saveRoll;\n    }\n    return Object.keys(result).length > 0 ? result : undefined;\n  }\n  saveDC: number | undefined;\n  saveDetails: SaveDetails | undefined;\n  damageItem: DamageListEntry | undefined;\n  challengeModeScale: Record<string, number> | undefined;\n  activeDefenceRolls: Record<string, Roll> | undefined;\n  rollResults: Roll[] | undefined;\n  healingAdjustedDamageTotal: number | undefined;\n  flavor: string | undefined;\n  healingAdjustedBonusDamageTotal: number | undefined;\n  bonusDamageRollHTML: string | undefined;\n  healingAdjustedOtherDamageTotal: number | undefined;\n  attackMode: string | undefined;\n  itemUsesReaction: boolean | undefined;\n  itemUsesBonusAction: boolean | undefined;\n  rangeDetails: {\n    result: string;\n    attackingToken?: Token.Implementation;\n    range?: number;\n    longRange?: number\n  } | undefined;\n\n  sequenceId?: string;\n  targetACModifiers: Map<string, number> = new Map(); // Map of actor uuid to AC modifier, used for active defences\n\n  // Does this do anything?\n  applicationTargets: Set<Token.Implementation> | undefined;\n\n  // TODO: these\n  rollOptions: WorkflowRollOptions;\n  castData: {\n    castLevel?: number;\n  } | undefined;\n\n  throttleChatMessageUpdates: undefined | ((document: foundry.abstract.Document.Any, updates: ChatMessage.UpdateData) => Promise<void>);\n  // TODO: type options\n  constructor(\n    actor: Actor.Implementation | null /* Actor5e*/,\n    activity: Activity | null,\n    speaker: ChatMessage.SpeakerData | null,\n    targets: Set<TokenOrDocument> | TokenOrDocument[] | null,\n    options: WorkflowConstructorOptions = { chatCardUuid: undefined, storeWorkflow: true, item: undefined }\n  ) {\n    this.workflowStartTime = Date.now();\n    if (options.chatCardUuid && saveToChatCard) {\n      this.itemCardUuid = options.chatCardUuid;\n      this.id = options.chatCardUuid;\n    } else {\n      // In this case, `actor`, `activity`, and `speaker` are mandatory\n      if (!actor || !activity || !speaker) {\n        error(`Workflow was not provided with valid arguments: ${actor}, ${activity}, ${speaker}, ${targets}, ${options}`);\n        throw new Error(\"Workflow could not be created\");\n      }\n      this.activity = activity;\n      this.item = activity.item ?? options.item;\n      if (speaker.token) this.token = canvas.tokens?.get(speaker.token);\n      if (options.token) this.token = options.token;\n      if (!this.token) {\n        this.token = getOrCreateTokenForActor(this.actor);\n      }\n      if (targets && (targets instanceof Set ? targets.size : targets.length) !== 0) this.targets = new Set(targets ? targets : []);\n      if (speaker) this.speaker = speaker;\n      this.hitTargets = new Set();\n      this.hitTargetsEC = new Set();\n      this.initSaveResults();\n      this.attackTotal = minAttackTotal;\n      // isCritical/isFumble default to false via tracker — no explicit reset needed\n      this.currentAction = this.WorkflowState_NoAction;\n      this.suspended = true;\n      this.aborted = false;\n      if (!this.activity || this instanceof DummyWorkflow) {\n        this.id = foundry.utils.randomID();\n        this.workflowName = `workflow ${this.id}`;\n      } else {\n        this.id = this.activity.uuid; // Temporary until the item card is created.\n        const workflowName = options.workflowOptions?.workflowName ?? this.item.name ?? \"no item\";\n        this.workflowName = `${this.constructor.name} ${workflowName} ${foundry.utils.randomID()}`;\n        if (options.storeWorkflow) Workflow.addWorkflow(this);\n      }\n      this.noOptionalRules = options?.noOptionalRules ?? !configSettings.optionalRulesEnabled;\n      this.attackRollCount = 0;\n      this.damageRollCount = 0;\n      this.advantage = undefined;\n      this.disadvantage = undefined;\n      this.targetsCanSense = new Set();\n      this.targetsCanSee = new Set();\n      this.tokenCanSense = new Set();\n      this.tokenCanSee = new Set();\n      this.rawDamageDetail = [];\n      this.rawOtherDamageDetail = [];\n      this.effectsAlreadyExpired = [];\n      this.workflowOptions = options?.workflowOptions ?? {};\n      if (this.speaker.scene) this.speaker.scene = canvas.scene?.id ?? \"\";\n    }\n\n    // this.spellLevel = item?.level || 0;\n\n    this.saveRequests = {};\n    this.defenceRequests = {};\n    this.saveTimeouts = {};\n    this.defenceTimeouts = {}\n    this.forceApplyEffects = false;\n    this.onUseCalled = false;\n    this.attackRolled = false;\n    this.flagTags = undefined;\n    if (options.rollOptions) this.rollOptions = options.rollOptions;\n    else this.rollOptions = {};\n    if (options.event) this.rollOptions.event = options.event;\n    else if (options.workflowOptions?.event) this.rollOptions.event = options.workflowOptions.event;\n    this.workflowOptions = foundry.utils.mergeObject(defaultRollOptions, {\n      autoRollAttack: getAutoRollAttack(this),\n      autoRollDamage: getAutoRollDamage(this),\n      fastForwardAttack: isAutoFastForward(\"attack\", { workflow: this }),\n      fastForwardDamage: isAutoFastForward(\"damage\", { workflow: this })\n    }, { inplace: false });\n    if (options.workflowOptions)\n      foundry.utils.mergeObject(this.workflowOptions, options.workflowOptions, { overwrite: true });\n    if (this.activity.midiProperties?.noConcentrationCheck) this.workflowOptions.noConcentrationCheck = true;\n    if (this.workflowOptions.templateUuid) this.templateUuid = this.workflowOptions.templateUuid;\n\n    this.defaultDamageType = getActivityDefaultDamageType(this) ?? MidiQOL.MQdefaultDamageType;\n    MidiQOL.MQdefaultDamageType = this.defaultDamageType; // Set the default damage type for the module.\n    if (this.activity.actionType === \"heal\" && !Object.keys(GameSystemConfig.healingTypes).includes(this.defaultDamageType ?? \"\")) this.defaultDamageType = \"healing\";\n\n    // Record targets selected before cast — prefer UUIDs captured early in use() before template targeting\n    // preSelectedTargets is used by sculpt spells logic\n    if (this.workflowOptions?.preSelectedTargetUuids?.length) {\n      this.preSelectedTargets = new Set(\n        this.workflowOptions.preSelectedTargetUuids\n          .map(uuid => (fromUuidSync(uuid) as TokenDocument | null)?.object)\n          .filter((t): t is Token.Implementation => !!t)\n      );\n    } else {\n      this.preSelectedTargets = canvas?.scene ? new Set(game.user?.targets ?? []) : new Set();\n    }\n    if (activityHasAreaTarget(this.activity) && !activityHasAutoPlaceTemplate(this.activity)) {\n      this.expectedTemplateCount = Number(this.activity?.target?.template?.count) || 1;\n    } else {\n      this.expectedTemplateCount = 0;\n    }\n    this.templateUuids = [];\n    if (this.activity instanceof MidiSummonActivity && configSettings.autoRemoveSummonedCreature) {\n      // Hooks.on + uuid filter rather than Hooks.once: concurrent summon workflows must not consume each other's hook\n      this.postSummonHookId = Hooks.on(\"dnd5e.postSummon\", (activity, profile, createdTokens, options) => {\n        if (activity?.uuid !== this.activity?.uuid) return;\n        this.summonedCreatures = createdTokens;\n      })\n    }\n    this.itemUseComplete = false;\n    this.kickStart = false;\n    this.throttleChatMessageUpdates = getThrottlingFunction();\n  }\n\n  public someEventKeySet() {\n    const event = this.rollOptions.event as AugmentedEvent | undefined;\n    return event?.shiftKey || event?.altKey || event?.ctrlKey || event?.metaKey;\n  }\n\n  public someAutoRollEventKeySet() {\n    const event = this.rollOptions.event as AugmentedEvent | undefined;\n    return event?.altKey || event?.ctrlKey || event?.metaKey;\n  }\n\n  static async removeItemCardConfirmRollButton(itemCardUuid: string) {\n    const chatMessage = getCachedDocument(itemCardUuid) as ChatMessage.Implementation;\n    const workflow = Workflow.getWorkflow(itemCardUuid);\n    if (!chatMessage?.content) return;\n    let content = chatMessage.content;\n    const confirmMissRe = /<button class=\"midi-qol-confirm-damage-roll-complete-miss\" data-action=\"confirmDamageRollCompleteMiss\">[^<]*?<\\/button>/;\n    content = content?.replace(confirmMissRe, \"\");\n    const confirmRe = /<button class=\"midi-qol-confirm-damage-roll-complete\" data-action=\"confirmDamageRollComplete\">[^<]*?<\\/button>/;\n    content = content?.replace(confirmRe, \"\");\n    const confirmHitRe = /<button class=\"midi-qol-confirm-damage-roll-complete-hit\" data-action=\"confirmDamageRollCompleteHit\">[^<]*?<\\/button>/;\n    content = content?.replace(confirmHitRe, \"\");\n    const cancelRe = /<button class=\"midi-qol-confirm-damage-roll-cancel\" data-action=\"confirmDamageRollCancel\">[^<]*?<\\/button>/;\n    content = content?.replace(cancelRe, \"\");\n    // TODO come back and make this cached.\n    return await throttledUpdate(chatMessage, { content }, workflow?.throttleChatMessageUpdates, false);\n  }\n\n  static async removeItemCardButtons(itemCardUuid: string | undefined, { removeAllButtons = false, removeAttackButtons = true, removeDamageButtons = false, removeDnD5eButtons = false, removeConfirmButtons = false, removeAllDnd5eButtons = false, removeDnd5eSaveButtons = false, removeDnd5eTemplateButtons = false } = {}) {\n    try {\n      const workflow = Workflow.getWorkflow(itemCardUuid);\n      const chatMessage = workflow?.chatCard;\n      if (!chatMessage?.content) return;\n      let content = chatMessage?.content;\n      let allowRemoveAll = !(workflow && workflow.activity?.target.affects.type === \"\" && workflow.targets.size === 0)\n      if (removeAllButtons && allowRemoveAll) {\n        const buttonRe = /<button[\\s\\S]*?<\\/button>/gi;\n        content = content.replace(buttonRe, \"\");\n        return await throttledUpdate(chatMessage, { content }, workflow?.throttleChatMessageUpdates, false);\n      } else {\n        if (removeAttackButtons) {\n          const attackRe = /<div class=\"midi-qol-attack-buttons[^\"]*\">[\\s\\S]*?<\\/div>/;\n          content = content?.replace(attackRe, \"\")\n        }\n        if (removeDamageButtons) {\n          const damageRe = /<div class=\"midi-qol-damage-buttons[^\"]*\">[\\s\\S]*?<\\/div>/\n          const otherDamageRe = /<button class=\"midi-qol-otherDamage-button\" data-action=\"rollDamage\">[^<]*<\\/button>/\n          const formulaRe = /<button data-action=\"rollFormula\">[^<]*<\\/button>/\n          content = content?.replace(damageRe, \"\")\n          content = content?.replace(otherDamageRe, \"\")\n          content = content?.replace(formulaRe, \"\")\n        }\n        if (removeAllDnd5eButtons) { // This is not correct\n          const dnd5eRe = /<div class=\"midi-dnd5e-buttons\">[\\s\\S]*?<div class=\"end-midi-dnd5e-buttons\">/\n          content = content?.replace(dnd5eRe, \"<div class='midi-dnd5e-buttons'><\\/div><div class='end-midi-dnd5e-buttons'>\")\n        } else {\n          if (removeDnd5eSaveButtons) {\n            const saveRe = /<button[\\s\\S].*?data-action=\"rollSave\"[\\s\\S]*?<\\/button>/\n            for (let count = 0; count < 100; count++) {\n              if (!content.match(saveRe)) break;\n              content = content?.replace(saveRe, \"\")\n            }\n          }\n          if (removeDnd5eTemplateButtons) {\n            const templateRe = /<button[\\s\\S].*?data-action=\"placeTemplate\"[\\s\\S]*?<\\/button>/\n            content = content?.replace(templateRe, \"\")\n          }\n        }\n        if (removeConfirmButtons) {\n          const confirmMissRe = /<button class=\"midi-qol-confirm-damage-roll-complete-miss\" data-action=\"confirmDamageRollCompleteMiss\">[^<]*?<\\/button>/;\n          content = content?.replace(confirmMissRe, \"\");\n          const confirmRe = /<button class=\"midi-qol-confirm-damage-roll-complete\" data-action=\"confirmDamageRollComplete\">[^<]*?<\\/button>/;\n          content = content?.replace(confirmRe, \"\");\n          const confirmHitRe = /<button class=\"midi-qol-confirm-damage-roll-complete-hit\" data-action=\"confirmDamageRollCompleteHit\">[^<]*?<\\/button>/;\n          content = content?.replace(confirmHitRe, \"\");\n          const cancelRe = /<button class=\"midi-qol-confirm-damage-roll-cancel\" data-action=\"confirmDamageRollCancel\">[^<]*?<\\/button>/;\n          content = content?.replace(cancelRe, \"\");\n        }\n        return await throttledUpdate(chatMessage, { content }, workflow?.throttleChatMessageUpdates);\n      }\n    } catch (err) {\n      const message = `removeItemCardButtons`;\n      TroubleShooter.recordError(err, message);\n      throw err;\n    }\n  }\n\n  static async removeWorkflow(id: string | undefined) {\n    if (!id) {\n      warn(\"removeWorkflow | No id\");\n      return;\n    }\n    const workflow = Workflow.getWorkflow(id);\n    if (!workflow) {\n      if (debugEnabled > 0) warn(\"removeWorkflow | No such workflow \", id);\n      return;\n    }\n    if (workflow.postSummonHookId) Hooks.off(\"dnd5e.postSummon\", workflow.postSummonHookId);\n    if (debugEnabled > 0) warn(`removeWorkflow deleting ${id}`, Workflow.workflows.get(id));\n    Workflow.workflows.delete(id);\n    // Remove buttons\n    if (workflow.itemCardUuid) {\n      if (workflow.currentAction === workflow.WorkflowState_ConfirmRoll) {\n        const itemCard = workflow.chatCard;\n        if (itemCard) await itemCard.delete();\n        clearUpdatesCache(workflow.itemCardUuid);\n      } else {\n        await Workflow.removeItemCardButtons(workflow.itemCardUuid, { removeAllButtons: true });\n        setTimeout(() => {\n          const chatMessageElt = document?.querySelector(`[data-message-id=\"${workflow.itemCardId ?? \"XXX\"}\"]`);\n          if (chatMessageElt) chatMessageElt.querySelectorAll(\".collapsible\").forEach(ce => { if (!ce.classList.contains(\"collapsed\")) ce.classList.add(\"collapsed\") });\n        }, 1)\n      }\n    }\n  }\n\n  public static get stateTable(): Record<string, WorkflowState> {\n    const table = {};\n    Reflect.ownKeys(this.prototype).filter(k => k.toString().startsWith(\"WorkflowState_\")).forEach(k => table[k.toString()] = this.prototype[k.toString()]);\n    return table;\n  }\n\n  public static get stateHooks(): Record<string, string> {\n    const hooks = {};\n    for (let state of Object.values(this.stateTable)) {\n      const name = this.nameForState(state);\n      hooks[`pre${name}`] = `before ${name} (S*)`;\n      hooks[`post${name}`] = `after ${name} (S*)`;\n    }\n    return hooks;\n  }\n  public static get allHooks(): Record<string, string> {\n    const allHooks = foundry.utils.mergeObject(onUseMacroOptions, this.stateHooks, { inplace: false });\n    return allHooks;\n  }\n\n  public static get allMacroPasses(): Record<string, string> {\n    return this.allHooks;\n  }\n\n  async callHooksForAction(prePost: (\"pre\" | \"post\"), action: WorkflowState): Promise<boolean | undefined> {\n    if (!action) {\n      console.warn(\"midi-qol | callPreHooksForAction | No action\");\n      return true;\n    }\n    if (debugEnabled > 1) log(`callHooksForAction | ${prePost} ${this.nameForState(action)}`)\n    return this.callCancellableHooks(`midi-qol.${prePost}${this.nameForState(action)}`);\n  }\n  async callOnUseMacrosForAction(prePost: (\"pre\" | \"post\"), action: WorkflowState): Promise<(DamageBonusMacroResult | any)[]> {\n    if (!configSettings.allowUseMacro || this.workflowOptions.noOnUseMacro === true) {\n      warn(`Calling ${prePost}${this.nameForState(action)} disabled due to macro call settings`);\n      return [];\n    }\n    if (!action) {\n      console.warn(\"midi-qol | callOnUseMacrosForAction | No action\");\n      return [];\n    }\n    if (debugEnabled > 1) log(`callOnUseMacrosForAction | ${prePost} ${this.nameForState(action)}`)\n    const macroPass = `${prePost}${this.nameForState(action)}`;\n\n    if (this.ammunition) await this.callMacros(this.item, this.ammunitionOnUseMacros?.getMacros(macroPass), \"OnUse\", macroPass);\n    if (debugEnabled > 1) log(`callOnUseMacrosForAction | ${this.onUseMacros?.getMacros(macroPass)}`)\n    return this.callMacros(this.item, this.onUseMacros?.getMacros(macroPass), \"OnUse\", macroPass);\n\n  };\n\n  public static nameForState(state: WorkflowState): string {\n    if (state === undefined) return \"undefined\";\n    return state.name.replace(/^WorkflowState_/, \"\") ?? state.name;\n  }\n\n  public nameForState(state: WorkflowState): string {\n    return Workflow.nameForState(state);\n  }\n\n  /**\n   *\n   * @param context context to be passed to the state call. Typically the data that caused the an unsuspend to fire, but can be others\n   * Trigger execution of the current state with the context that triggered the unsuspend. e.g. attackRoll or damageRoll\n   */\n  public async unSuspend(context: WorkflowContext = {}) {\n    if (context.itemCardUuid) {\n      this.itemCardUuid = context.itemCardUuid;\n\n    }\n    if (context.itemUseComplete) this.itemUseComplete = true;\n\n    // Currently this just brings the workflow to life.\n    // next version it will record the contexts in the workflow and bring the workflow to life.\n    if (this.suspended) {\n      this.suspended = false;\n      // Need to record each of the possible things\n      // attackRoll\n      // damageRoll\n      this.performState(this.currentAction, context);\n    }\n  }\n\n  /**\n   * Process templates that have been placed, integrating them with the workflow.\n   * Validates template count, deletes incomplete placements, sets up template tracking,\n   * cleanup, targeting, and advances the workflow if suspended.\n   * @param templates - Array of placed template documents\n   * @param activity - The activity that placed the templates (used to determine expected count)\n   * @returns true if all expected templates were placed and processed, false if incomplete\n   */\n  async processPlacedTemplates(templates: MeasuredTemplateDocument[], activity?: Activity): Promise<boolean> {\n    if (!templates || templates.length === 0) return false;\n\n    // Validate template count\n    const expectedCount = Number(activity?.target?.template?.count) || 1;\n    if (templates.length < expectedCount) {\n      // Incomplete placement: delete any templates placed so far\n      for (const tDoc of templates) {\n        try { await tDoc.delete(); } catch (e) { /* template may already be gone */ }\n      }\n      return false;\n    }\n\n    // Set midi-qol flags on each template and register cleanup\n    for (const tDoc of templates) {\n      this.templateUuid = tDoc.uuid;  // setter pushes to array + persists\n      await this.setupTemplateCleanup(tDoc);\n    }\n    this.placedTemplateCount = templates.length;\n\n    // Compute targets from ALL templates at once\n    this.selectAllTemplateTargets(activity);\n\n    // Advance the workflow if it was waiting for templates\n    if (this.suspended && this.currentAction === this.WorkflowState_AwaitTemplate) {\n      this.unSuspend();\n    }\n    return true;\n  }\n\n  /**\n   * Compute targets from all placed templates and update targeting state.\n   * Called once after ALL templates are placed, rather than per-template.\n   */\n  selectAllTemplateTargets(activity?: Activity): void {\n    if (!activity) activity = this.activity;\n    const selfToken = getToken(activity?.actor);\n    const ignoreSelf = (activity?.target?.affects.special ?? \"\").split(\";\").some(spec => [\"-self\"].includes(spec));\n    const AoETargetType = activity ? getAoETargetType(activity) : \"any\";\n    const targeting = getActivityAutoTargetAction(activity);\n    if (targeting === \"none\") return;\n\n    let allTargetTokens = computeTargetsFromTemplates(this.templateUuids, selfToken, ignoreSelf, AoETargetType, targeting);\n\n    // Apply target count limit if configured\n    if (activity?.target?.affects.count) {\n      const maxTargets = Number(activity.target.affects.count) || 0;\n      if (maxTargets > 0 && allTargetTokens.length > maxTargets) {\n        allTargetTokens = allTargetTokens.slice(0, maxTargets);\n      }\n    }\n\n    // Set all targets at once\n    const allIds = allTargetTokens.map(t => t.id).filter(Boolean) as string[];\n    updateUserTargets(allIds);\n    this.setTargets(new Set(game.user?.targets ?? []));\n  }\n\n  /**\n   * Sets up the deletion mechanism for a template as early as possible.\n   * For concentration activities, adds template as dependent of concentration effect.\n   * For non-concentration activities with duration, creates a template deletion effect.\n   *\n   * @param templateDocument The template document to set up cleanup for\n   * @returns true if a cleanup mechanism was set up, false otherwise\n   */\n  async setupTemplateCleanup(templateDocument: MeasuredTemplateDocument): Promise<boolean> {\n    // Skip if no template\n    if (!templateDocument) return false;\n\n    // Skip if template will be auto-removed for instantaneous spells\n    if (configSettings.autoRemoveInstantaneousTemplate &&\n      this.activity?.duration?.units === \"inst\") {\n      return false;\n    }\n\n    // Check for concentration effect first\n    const concentrationEffect = getConcentrationEffect(this.actor, this.item);\n    if (concentrationEffect) {\n      await templateDocument.setFlag(\"dnd5e\", \"dependentOn\", concentrationEffect.uuid);\n      return true;\n    }\n\n    // Non-concentration: create template deletion effect if conditions are met\n    // Requires DAE and autoRemoveTemplate setting\n    if (!installedModules.get(\"dae\") || !configSettings.autoRemoveTemplate) {\n      return false;\n    }\n\n    // Check if effect already exists (e.g., from a previous cast)\n    const templateString = \" \" + i18n(\"midi-qol.MeasuredTemplate\");\n    const existingEffect = this.actor?.effects.find(\n      ef => ef.name === (this.item.name + templateString)\n    );\n\n    if (existingEffect) {\n      await templateDocument.setFlag(\"dnd5e\", \"dependentOn\", existingEffect.uuid);\n      return true;\n    }\n\n    // Create new template deletion effect\n    const activityDuration = this.activity.duration;\n    if (!activityDuration?.units) return false;\n\n    const selfTarget = this.token;\n    const inCombat = (game.combat as Combat)?.turns.some(\n      combatant => combatant.tokenId === selfTarget?.id\n    );\n\n    const converted = convertDuration(activityDuration, inCombat);\n\n    // Don't create effect for permanent/special durations\n    if (converted.type === \"none\") {\n      return false;\n    }\n\n    const effectData: ActiveEffect.CreateData = {\n      origin: this.item.uuid,\n      disabled: false,\n      img: this.item.img,\n      name: this.item.name + templateString,\n      duration: {},\n      flags: {\n        dae: { stackable: \"noneName\" }\n      },\n    };\n\n    // Set duration based on converted duration\n    if (converted.type === \"seconds\") {\n      effectData.duration = { startTime: game.time?.worldTime };\n      if (converted.seconds !== undefined) {\n        effectData.duration.seconds = converted.seconds;\n      }\n    } else if (converted.type === \"turns\") {\n      effectData.duration = {\n        startRound: game.combat?.round,\n        startTurn: game.combat?.turn,\n      };\n      if (converted.rounds !== undefined) {\n        effectData.duration.rounds = converted.rounds;\n      }\n      if (converted.turns !== undefined) {\n        effectData.duration.turns = converted.turns;\n      }\n    }\n\n    const effects = await this.actor.createEmbeddedDocuments(\"ActiveEffect\", [effectData]);\n    if (effects.length > 0) {\n      await templateDocument.setFlag(\"dnd5e\", \"dependentOn\", effects[0].uuid);\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Render the attribution tooltip HTML for display.\n   * Converts the attackAttribution map to an array and renders the attribution-tooltip template.\n   * @returns The rendered HTML string\n   */\n  async renderAttributionTooltip(): Promise<string> {\n    // @ts-expect-error CONFIG.Dice.D20Roll not typed\n    const ADV_MODE: { DISADVANTAGE: number, NORMAL: number, ADVANTAGE: number } = CONFIG.Dice.D20Roll.ADV_MODE;\n    const mode = this.attackRoll?.options?.advantageMode ?? this.attackRollModifierTracker.advantageMode ?? ADV_MODE.NORMAL;\n    const title = getAdvantageModeTitle(mode);\n    return renderAttributionTooltip(this.attackAttribution ?? {}, title);\n  }\n\n  /**\n   *\n   * @param newState the state to execute\n   * @param context context to be passed to the state call. Typically the data that caused the an unsuspend to fire, but can be others\n   * Continues to execute states until suspended, aborted or the state transition count is exceeded.\n   */\n\n  public async performState(newState: WorkflowState, context: WorkflowContext = {}) {\n    if (this.stateTransitionCount === undefined) this.stateTransitionCount = 0;\n    let isAborting = this.aborted;\n\n    try {\n      while (this.stateTransitionCount < (this.maxTransitionCount)) {\n        const currentName = this.nameForState(this.currentAction);\n        this.suspended = false;\n        this.stateTransitionCount += 1;\n        isAborting ||= this.aborted || (newState === this.WorkflowState_Abort);\n        if (newState === undefined) {\n          const message = `${this.workflowName} Perform state called with undefined action - previous state was ${this.nameForState(this.currentAction)}`\n          error(message);\n          TroubleShooter.recordError(new Error(message), message);\n          this.suspended = true;\n          break;\n        }\n        const name = this.nameForState(newState);\n        // TODO: Is this necessary?\n        await busyWait(1);\n        if (this.currentAction !== newState) {\n          if (!isAborting || this.currentAction === this.WorkflowState_Completed) {\n            await this.callOnUseMacrosForAction(\"post\", this.currentAction);\n            if (await this.callHooksForAction(\"post\", this.currentAction) === false && !isAborting) {\n              console.warn(`${this.workflowName}${this.id} ${currentName} -> ${name} aborted by post ${this.nameForState(this.currentAction)} Hook`)\n              newState = this.aborted ? this.WorkflowState_Abort : this.WorkflowState_RollFinished;\n            }\n            if (debugEnabled > 0) warn(`${this.workflowName} ${this.id} finished ${currentName}`);\n            if (debugEnabled > 0) warn(`${this.workflowName} ${this.id} transition ${this.nameForState(this.currentAction)} -> ${name}`);\n\n            if (!isAborting && this.aborted) {\n              console.warn(`${this.workflowName} ${this.id} ${currentName} -> ${name} aborted by pre ${this.nameForState(this.currentAction)} macro pass`)\n              newState = this.WorkflowState_Abort;\n              continue;\n            }\n          }\n          await this.callOnUseMacrosForAction(\"pre\", newState);\n          if (await this.callHooksForAction(\"pre\", newState) === false && !isAborting) {\n            console.warn(`${this.workflowName} ${this.id} ${currentName} -> ${name} aborted by pre ${this.nameForState(newState)} Hook`)\n            newState = this.aborted ? this.WorkflowState_Abort : this.WorkflowState_RollFinished;\n            continue;\n          }\n          if (this.aborted && !isAborting) {\n            console.warn(`${this.workflowName} ${currentName} ${this.id} -> ${name} aborted by pre ${this.nameForState(newState)} macro pass`)\n            newState = this.WorkflowState_Abort;\n            continue;\n          }\n          this.currentAction = newState;\n        }\n        let nextState = await this.currentAction.bind(this)(context);\n\n        if (nextState === this.WorkflowState_Suspend) {\n          this.suspended = true;\n          this.performThrottledUpdate(this.chatCard, {}, false);\n          // this.currentAction = this.WorkflowState_Suspend;\n          if (debugEnabled > 0) warn(`${this.workflowName} ${this.nameForState(this.currentAction)} -> suspended Workflow ${this.id}`);\n          // await this.performDebouncedUpdate(this.chatCard, { [\"flags.midi-qol.\" + WorkflowDataFlags.suspended]: true });\n          break;\n        }\n        newState = nextState;\n        context = {};\n      }\n\n      if (this.stateTransitionCount >= this.maxTransitionCount) {\n        const message = `performState | ${this.workflowName} Workflow ${this.id} exceeded ${this.maxTransitionCount} iterations`;\n        error(message);\n        TroubleShooter.recordError(new Error(message), message);\n      }\n    } catch (err) {\n      const message = `performState | ${this.workflowName} Workflow ${this.id}`;\n      error(message, err);\n      TroubleShooter.recordError(err, message);\n    }\n  }\n\n  async WorkflowState_Suspend(context: WorkflowContext = {}): Promise<WorkflowState> {\n    const message = `${this.workflowName} Workflow ${this.id} suspend should never be called`;\n    error(message);\n    TroubleShooter.recordError(new Error(message), message);\n    return undefined;\n  }\n\n  async WorkflowState_NoAction(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (debugEnabled > 0) warn(\"WorkflowState_NoAction\", context);\n    if (context.itemUseComplete) return this.WorkflowState_Start;\n    return this.WorkflowState_Suspend;\n  }\n\n  async WorkflowState_Start(context: WorkflowContext = {}): Promise<WorkflowState> {\n    // Self-target push/clear is handled in MidiActivityMixin.use() before setupTargets()\n    if (!this.selfTargeted) {\n      clearTargetSave();\n    }\n    this.rangeTargeting = activityHasEmanationNoTemplate(this.activity);\n    if (this.rangeTargeting) {\n      // Targets have already been set in activity.use\n      return this.WorkflowState_AoETargetConfirmation;\n    }\n\n    this.tempTargetConfirmation = getActivityAutoTargetAction(this.activity) !== \"none\" && activityHasAreaTarget(this.activity);\n    if (debugEnabled > 1) debug(\"WORKFLOW NONE\", getActivityAutoTargetAction(this.activity), activityHasAreaTarget(this.activity));\n    if (this.tempTargetConfirmation) {\n      return this.WorkflowState_AwaitTemplate;\n    }\n\n    return this.WorkflowState_AoETargetConfirmation;\n  }\n  async WorkflowState_AwaitItemCard(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (this.needItemCard || !this.itemUseComplete) {\n      if (debugEnabled > 0) warn(\"WorkflowState_AwaitItemCard suspending because needItemCard/itemUseComplete\", this.needItemCard, this.itemUseComplete);\n      return this.WorkflowState_Suspend;\n    }\n    if (this.needTemplate) {\n      if (debugEnabled > 0) warn(\"WorkflowState_AwaitItemCard  needTemplate -> await template\");\n      return this.WorkflowState_AwaitTemplate;\n    }\n    if (debugEnabled > 0) warn(\"WorkflowState_AwaitItemCard  -> TemplatePlaced\");\n    return this.WorkflowState_TemplatePlaced;\n  }\n  async WorkflowState_AwaitTemplate(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (debugEnabled > 0) warn(\"WorkflowState_AwaitTemplate started\");\n    if (this.templateUuids.length >= this.expectedTemplateCount) {\n      if (debugEnabled > 0) warn(\"WorkflowState_AwaitTemplate context - template placed\", \"needTemplate\", this.needTemplate, \"needItemCard\", this.needItemCard, \"itemUseComplete\", this.itemUseComplete);\n      return this.WorkflowState_TemplatePlaced;\n    }\n    if (context.itemUseComplete || !this.needTemplate) {\n      if (debugEnabled > 0) warn(\"WorkflowState_AwaitTemplate context itemUseComplete\", \"needTemplate\", this.needTemplate, \"needItemCard\", this.needItemCard, \"itemUseComplete\", this.itemUseComplete);\n      return this.WorkflowState_AoETargetConfirmation;\n    }\n    if (debugEnabled > 0) warn(\"WorkflowState_AwaitTemplate suspending\", \"needTemplate\", this.needTemplate, \"needItemCard\", this.needItemCard, \"itemUseComplete\", this.itemUseComplete);\n    return this.WorkflowState_Suspend;\n  }\n  async WorkflowState_TemplatePlaced(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (configSettings.allowUseMacro && this.workflowOptions.noOnUseMacro !== true) {\n      await this.callMacros(this.item, this.onUseMacros?.getMacros(\"templatePlaced\"), \"OnUse\", \"templatePlaced\");\n      if (this.ammunition) await this.callMacros(this.ammunition, this.ammunitionOnUseMacros?.getMacros(\"templatePlaced\"), \"OnUse\", \"templatePlaced\");\n    }\n\n    // Some modules stop being able to get the item card id.\n    if (!this.itemCardUuid) return this.WorkflowState_AoETargetConfirmation;\n\n    const chatMessage = this.chatCard;\n    if (!chatMessage?.content) return this.WorkflowState_AoETargetConfirmation;\n    // remove the place template button from the chat card only if all templates have been placed\n    this.targets = validTargetTokens(this.targets);\n    this.hitTargets = new Set()\n    this.hitTargetsEC = new Set();\n    let content = chatMessage.content;\n    if (this.placedTemplateCount >= (Number(this.activity?.target?.template?.count) || 1)) {\n      const buttonRe = /<button.*?data-action=\"placeTemplate\"[^>]*?>[\\s\\S]*?<\\/button>/\n      content = chatMessage.content?.replace(buttonRe, \"\");\n    }\n    await this.performThrottledUpdate(chatMessage, { content, flags: { \"midi-qol\": { type: MESSAGE_TYPES.ITEM } }, style: CONST.CHAT_MESSAGE_STYLES.OTHER });\n    return this.WorkflowState_AoETargetConfirmation;\n  }\n  async WorkflowState_AoETargetConfirmation(context: WorkflowContext = {}): Promise<WorkflowState> {\n    // postTemplateConfirmTargets uses requiresTargetConfirmation to decide whether to show\n    // the confirmation dialog — covers AoE templates, scaled counts, activity/global settings,\n    // and workflowOptions.targetConfirmation overrides.\n    if (!await postTemplateConfirmTargets(this.activity, { workflowOptions: this.workflowOptions }, this)) {\n      return this.WorkflowState_Abort;\n    }\n    // Enforce target count after confirmation — for scaled activities this is the first check,\n    // since postChatCardChecks defers count enforcement when the target count depends on scaling.\n    const hasScaledTargetCount = activityHasScaledTargetCount(this.activity);\n    if (hasScaledTargetCount) {\n      const allowedTargets = Number(this.activity.target?.affects?.count);\n      if (allowedTargets && this.targets.size > allowedTargets) {\n        ui.notifications?.warn(i18nFormat(\"midi-qol.wrongNumberTargets\", { allowedTargets }));\n        return this.WorkflowState_Abort;\n      }\n    }\n    return this.WorkflowState_ValidateRoll;\n  }\n  async WorkflowState_ValidateRoll(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (configSettings.allowUseMacro && this.workflowOptions.noTargetOnUseMacro !== true) {\n      await this.triggerTargetMacros([\"isTargeted\"]);\n      if (this.aborted) return this.WorkflowState_Abort;\n    }\n\n    // do pre roll checks\n    if (checkMechanic(\"checkRange\") !== \"none\" && (!this.AoO && [\"rwak\", \"rsak\"].includes(this.activity.actionType ?? \"\")) && this.tokenUuid) {\n      const { result, attackingToken, range, longRange } = checkActivityRange(this.activity, getToken(this.token) ?? \"invalid\", this.targets);\n      switch (result) {\n        case \"fail\": return this.WorkflowState_RollFinished;\n        case \"dis\": this.longRangeAttack = true;\n      }\n      if (attackingToken && this.token !== attackingToken) {\n        // changed the attacking token so update the canSee data\n        this.token = attackingToken;\n        await this.activity.setupCanSeeSense({ workflow: this });\n      }\n    }\n    if (!this.workflowOptions.allowIncapacitated && checkMechanic(\"incapacitated\") !== \"nothing\" && checkIncapacitated(this.actor, debugEnabled > 0, true)) {\n      if (checkMechanic(\"incapacitated\") === \"enforce\") return this.WorkflowState_RollFinished;\n    }\n    return this.WorkflowState_PreambleComplete;\n  }\n  async WorkflowState_PreambleComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (configSettings.undoWorkflow) await saveTargetsUndoData(this);\n    this.effectsAlreadyExpired = [];\n\n    if (await this.callCancellableHooks(\"midi-qol.targetingComplete\") === false) {\n      ui.notifications?.warn(`midi-qol | Targeting complete hook cancelled roll`);\n      return this.WorkflowState_Abort;\n    }\n    if ((!getAutoRollAttack(this) && this.activity.attack) || this.activity instanceof MidiTransformActivity) {\n      // Not auto rolling so display targets\n      const rollMode = safeGetGameSetting(\"core\", \"rollMode\");\n      this.whisperAttackCard = configSettings.autoCheckHit === \"whisper\" || rollMode === CONST.DICE_ROLL_MODES.BLIND || rollMode === CONST.DICE_ROLL_MODES.PRIVATE;\n      if (this.activity.target?.affects?.type !== \"self\") {\n        await this.displayHitTargets(this.whisperAttackCard);\n      }\n    }\n    return this.WorkflowState_WaitForAttackRoll;\n  }\n  get postAttackRollState(): WorkflowState {\n    return this.WorkflowState_WaitForDamageRoll\n  }\n\n  async WorkflowState_WaitForAttackRoll(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (context.attackRoll) {\n      if (this.abort) return this.WorkflowState_Abort;\n      return this.WorkflowState_AttackRollComplete;\n    }\n    if (!this.activity.attack) {\n      this.hitTargets = new Set(this.targets);\n      this.hitTargetsEC = new Set();\n      if (this.hasSave) {\n        this.needsHitTargetsDisplayed = false;\n      } else if (this.targets.size > 0 && this.activity.target?.affects?.type !== \"self\") {\n        await this.displayHitTargets(false);\n      }\n      if (this.activity.roll?.formula) return this.WorkflowState_WaitForUtilityRoll;\n      return this.postAttackRollState;\n    }\n\n    const isFastRoll = this.rollOptions.fastForwardAttack ?? this.workflowOptions.fastForwardAttack ?? isAutoFastForward(\"attack\", { workflow: this });\n    this.rollOptions.fastForwardAttack ||= isFastRoll;\n    const autoRollAttack = getAutoRollAttack(this);\n    if (!autoRollAttack) {\n      // Not auto rolling attack so setup the buttons to display advantage/disadvantage\n      const chatMessage = this.chatCard;\n      let content = chatMessage?.content;\n      if (content && !isFastRoll) {\n        // provide a hint as to the type of roll expected.\n        // Match the rollAttack button with span inside: <button ... data-action=\"rollAttack\"><span>Attack</span></button>\n        const searchRe = /(<button[^>]*data-action=\"rollAttack\"[^>]*>)<span>[^<]*<\\/span>(<\\/button>)/;\n\n        const hasAdvantage = this.advantage && !this.disadvantage;\n        const hasDisadvantage = this.disadvantage && !this.advantage;\n        let attackString = hasAdvantage ? i18n(\"DND5E.Advantage\") : hasDisadvantage ? i18n(\"DND5E.Disadvantage\") : i18n(\"DND5E.Attack\")\n        // `isFastRoll` is guaranteed falsy at this point\n        // if (isFastRoll && configSettings.showFastForward) attackString += ` ${i18n(\"midi-qol.fastForward\")}`;\n\n        // Preserve the button tag, just replace the span content\n        let replaceString = `$1<span>${attackString}</span>$2`;\n        content = content.replace(searchRe, replaceString);\n        await this.performThrottledUpdate(chatMessage, { content });\n      } else if (!chatMessage) {\n        const message = `WaitForAttackRoll | no chat message`;\n        error(message);\n        TroubleShooter.recordError(new Error(message), message);\n      }\n    }\n\n    if (this.activity.roll?.formula) return this.WorkflowState_WaitForUtilityRoll;\n    if (autoRollAttack) {\n      this.rollOptions.fastForwardAttack ||= isFastRoll;\n      this.activity.rollAttack!({ event: this.rollOptions.event, workflow: this, midiOptions: { ...this.rollOptions, workflowOptions: this.workflowOptions } }, {}, {});\n    }\n    return this.WorkflowState_Suspend;\n  }\n\n  async WorkflowState_AttackRollComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (configSettings.allowUseMacro && this.workflowOptions.noTargetOnUseMacro !== true) await this.triggerTargetMacros([\"isAttacked\"]);\n    await this.processAttackRoll();\n    // REFACTOR look at splitting this into a couple of states\n    await this.callMidiHooks(\"midi-qol.preCheckHits\");\n    if (this.aborted) return this.WorkflowState_Abort;\n\n    if (configSettings.allowUseMacro && this.workflowOptions.noOnUseMacro !== true) {\n      await this.callMacros(this.item, this.onUseMacros?.getMacros(\"preCheckHits\"), \"OnUse\", \"preCheckHits\");\n      if (this.ammunition) await this.callMacros(this.ammunition, this.ammunitionOnUseMacros?.getMacros(\"preCheckHits\"), \"OnUse\", \"preCheckHits\");\n    }\n\n    await this.processAttackRoll();\n    this.recordAttackStats();\n\n    if (configSettings.autoCheckHit !== \"none\") {\n      await this.displayAttackRoll({ GMOnlyAttackRoll: true });\n      this.recordTargetACModifiers();\n      await this.recordFlankingBonuses();\n      await this.checkHits();\n      await this.displayAttackRoll();\n      const rollMode = safeGetGameSetting(\"core\", \"rollMode\");\n      this.whisperAttackCard = configSettings.autoCheckHit === \"whisper\" || rollMode === CONST.DICE_ROLL_MODES.BLIND || rollMode === CONST.DICE_ROLL_MODES.PRIVATE;\n      await this.callMidiHooks(\"midi-qol.hitsChecked\");\n      if (this.aborted) return this.WorkflowState_Abort;\n      await this.displayHits(this.whisperAttackCard);\n    } else {\n      await this.displayAttackRoll();\n    }\n    if (checkRule(\"removeHiddenInvis\")) await removeHidden.bind(this)();\n    if (checkRule(\"removeHiddenInvis\")) await removeInvisible.bind(this)();\n    await this.expireTargetEffects([\"isAttacked\"]);\n\n    await this.callMidiHooks(\"midi-qol.AttackRollComplete\");\n    if (this.aborted) return this.WorkflowState_Abort;\n\n    if (configSettings.allowUseMacro && this.workflowOptions.noOnUseMacro !== true) {\n      await this.callMacros(this.item, this.onUseMacros?.getMacros(\"postAttackRoll\"), \"OnUse\", \"postAttackRoll\");\n      if (this.ammunition) await this.callMacros(this.ammunition, this.ammunitionOnUseMacros?.getMacros(\"postAttackRoll\"), \"OnUse\", \"postAttackRoll\");\n      if (this.aborted) return this.WorkflowState_Abort;\n    }\n\n    if (configSettings.autoCheckHit === \"none\") {\n      this.hitTargets = new Set();\n      this.hitTargetsEC = new Set();\n      if (this.targets.size > 0 && this.activity.target?.affects?.type !== \"self\") {\n        await this.displayHitTargets(false);\n      }\n      return this.postAttackRollState;\n    }\n    if (getAutoRollDamage(this) === \"always\") return this.postAttackRollState;\n    const noHits = this.hitTargets.size === 0 && this.hitTargetsEC.size === 0;\n    const allMissed = noHits && this.targets.size !== 0;\n    if (allMissed) {\n      if (configSettings.confirmAttackDamage !== \"none\" && !this.workflowOptions.forceCompletion)\n        return this.WorkflowState_ConfirmRoll;\n      if (this.workflowOptions.forceCompletion || configSettings.autoCompleteWorkflow) {\n        expireMyEffects.bind(this)([\"1Attack\", \"1Action\", \"1Spell\"])\n        return this.WorkflowState_RollFinished;\n      }\n      // if (configSettings.autoRollDamage !== \"always\") return this.WorkflowState_RollFinished;\n      // else return this.WorkflowState_WaitForDamageRoll;\n    }\n    return this.postAttackRollState;\n  }\n\n  _formatAttackTargets() {\n    const targets = new Map<string, { name: string; img?: string | null; uuid: string; ac: number | string }>();\n    for (const token of this.targets) {\n      const { name } = token;\n      const { img, system, uuid } = token.actor ?? {};\n      // @ts-expect-error no dnd5e-types\n      const ac: number | string = system?.attributes?.ac?.value ?? \"\";\n      if (uuid && Number.isNumeric(ac)) targets.set(uuid, { name, img, uuid, ac: ac });\n    }\n    return Array.from(targets.values());\n  }\n\n  async WorkflowState_WaitForDamageRoll(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (context.damageRoll || context.otherDamageRoll) {\n      // record the data - currently done in item handling\n      return this.WorkflowState_ConfirmRoll;\n    }\n    // Activity itself had no damage and other activity produced no rolls\n    // (e.g. utility activity whose other activity's useCondition filtered out all targets)\n    if (context.noDamage) return this.WorkflowState_WaitForSaves;\n    const hasDamageRoll = this.activity.hasDamage || this.otherActivity?.hasDamage || this.activity.hasHealing || this.otherActivity?.hasHealing;\n    if (!hasDamageRoll) return this.WorkflowState_WaitForSaves;\n    if (context.attackRoll) return this.WorkflowState_AttackRollComplete;\n    if (debugEnabled > 1) debug(`wait for damage roll has damage roll ${hasDamageRoll} isFumble ${this.isFumble} no auto damage ${this.noAutoDamage}`);\n\n    if (checkMechanic(\"actionSpecialDurationImmediate\"))\n      expireMyEffects.bind(this)([\"1Attack\", \"1Action\", \"1Spell\"]);\n    if (checkMechanic(\"actionSpecialDurationImmediate\") && this.hitTargets.size)\n      expireMyEffects.bind(this)([\"1Hit\"]);\n    if (checkMechanic(\"actionSpecialDurationImmediate\")) {\n      expireMyEffects.bind(this)([\"1Critical\", \"1Fumble\"])\n    }\n\n    if (configSettings.allowUseMacro && this.workflowOptions.noOnUseMacro !== true) {\n      await this.callMacros(this.item, this.onUseMacros?.getMacros(\"preDamageRoll\"), \"OnUse\", \"preDamageRoll\");\n      if (this.ammunition) await this.callMacros(this.ammunition, this.ammunitionOnUseMacros?.getMacros(\"preDamageRoll\"), \"OnUse\", \"preDamageRoll\");\n    }\n\n    // if (this.noAutoDamage) return; // we are emulating the standard card specially.\n\n    if (this.shouldRollDamage) {\n      if (debugEnabled > 0) warn(\"waitForDamageRoll | rolling damage \", this.rollOptions.event, configSettings.autoRollAttack, configSettings.autoFastForward)\n      const storedData = this.chatCard?.getFlag(\"dnd5e\", \"item\")?.data;\n      if (storedData) { // If magic items is being used it fiddles the roll to include the item data\n        this.item = new CONFIG.Item.documentClass(storedData, { parent: this.actor })\n      }\n\n      this.rollOptions.isCritical = this.isCritical;\n      this.rollOptions.fastForwardDamage = isAutoFastForward(\"damage\", { workflow: this });\n      this.activity.rollDamage({ workflow: this, midiOptions: { ...this.rollOptions, workflowOptions: this.workflowOptions } }, {}, { create: false });\n      return this.WorkflowState_Suspend;\n    } else {\n      const chatMessage = this.chatCard;\n      if (chatMessage?.content) {\n        // provide a hint as to the type of roll expected.\n        // Match rollDamage button with optional span: <button data-action=\"rollDamage\">text</button> or <button data-action=\"rollDamage\"><span>text</span></button>\n        const searchRe = /(<button[^>]*data-action=\"rollDamage\"[^>]*>)(?:<span>)?[^<]*(?:<\\/span>)?(<\\/button>)/;\n        const damageTypeString = (this.activity.actionType === \"heal\") ? getHealingLabel() : i18n(\"DND5E.Damage\");\n        let damageString = (this.rollOptions.isCritical || this.isCritical) ? i18n(\"DND5E.Critical\") : damageTypeString;\n        if (this.rollOptions.fastForwardDamage && configSettings.showFastForward) damageString += ` ${i18n(\"midi-qol.fastForward\")}`;\n        // Preserve button tag, replace content with span for consistency\n        let replaceString = `$1<span>${damageString}</span>$2`;\n        let content = chatMessage.content.replace(searchRe, replaceString);\n        await this.performThrottledUpdate(chatMessage, { content });\n      }\n    }\n    return this.WorkflowState_Suspend; // wait for a damage roll to advance the state.\n  }\n  async WorkflowState_ConfirmRoll(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (context.attackRoll) return this.WorkflowState_AttackRollComplete;\n    if (configSettings.confirmAttackDamage !== \"none\" && (this.activity.attack || this.activity.damage)) {\n      await this.displayDamageRolls();\n      return this.WorkflowState_Suspend; // wait for the confirm button\n    }\n    return this.WorkflowState_DamageRollStarted;\n  }\n  async WorkflowState_RollConfirmed(context: WorkflowContext = {}): Promise<WorkflowState> {\n    expireMyEffects.bind(this)([\"1Attack\", \"1Action\", \"1Spell\"])\n    return this.WorkflowState_DamageRollStarted;\n  }\n  async WorkflowState_DamageRollStarted(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (this.itemCardUuid) {\n      await Workflow.removeItemCardButtons(this.itemCardUuid, { removeAllButtons: false, removeAttackButtons: getRemoveAttackButtons(this.activity), removeDamageButtons: getRemoveDamageButtons(this.activity), removeConfirmButtons: true });\n    }\n    if (getActivityAutoTargetAction(this.activity) === \"none\" && activityHasAreaTarget(this.activity) && !this.activity.attack) {\n      // we are not auto targeting so for area effect attacks, without hits (e.g. fireball)\n      this.targets = validTargetTokens(new Set(game.user?.targets));\n      this.hitTargets = validTargetTokens(new Set(game.user?.targets));\n      this.hitTargetsEC = new Set();\n      if (debugEnabled > 0) warn(\"damageRollStarted | for non auto target area effects spells\", this)\n    }\n    const damageBonusMacros = this.getDamageBonusMacros();\n    if (damageBonusMacros) { //  && this.workflowType === \"Workflow\") { // TODO check this\n      await this.rollBonusDamage(damageBonusMacros);\n    }\n    return this.WorkflowState_DamageRollComplete;\n  }\n  async WorkflowState_DamageRollComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (configSettings.allowUseMacro && this.workflowOptions.noOnUseMacro !== true) { //\n      await this.callMacros(this.item, this.onUseMacros?.getMacros(\"postDamageRoll\"), \"OnUse\", \"postDamageRoll\");\n      if (this.ammunition) await this.callMacros(this.ammunition, this.ammunitionOnUseMacros?.getMacros(\"postDamageRoll\"), \"OnUse\", \"postDamageRoll\");\n    }\n    await this.callMidiHooks(\"midi-qol.DamageRollComplete\");\n    if (this.aborted) return this.WorkflowState_Abort;\n    if (this.hitTargets?.size || this.hitTargetsEC?.size) expireMyEffects.bind(this)([\"1Hit\"]);\n    expireMyEffects.bind(this)([\"1Action\", \"1Attack\", \"1Spell\", \"1Critical\", \"1Fumble\"]);\n    await this.displayDamageRolls();\n\n    if (this.isFumble) {\n      this.failedSaves = new Set();\n      this.hitTargets = new Set();\n      this.hitTargetsEC = new Set();\n      return this.WorkflowState_ApplyDynamicEffects;\n    }\n    await Workflow.removeItemCardButtons(this.itemCardUuid, { removeAllButtons: false, removeAttackButtons: getRemoveAttackButtons(this.activity), removeDamageButtons: getRemoveDamageButtons(this.activity), removeDnD5eButtons: false, removeDnd5eSaveButtons: false });\n    return this.WorkflowState_WaitForSaves;\n  }\n\n  async WorkflowState_WaitForUtilityRoll(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (!this.activity.roll?.formula || context.utilityRolls) return this.WorkflowState_UtilityRollComplete;\n    if (getAutoRollDamage(this) !== \"none\") {\n      const rolls = await this.activity.rollFormula!({ event: this.rollOptions.event, workflow: this, midiOptions: { ...this.rollOptions, workflowOptions: this.workflowOptions } }, {}, { create: false });\n      if (!rolls || this.abort) {\n        return this.WorkflowState_Abort;\n      }\n      return this.WorkflowState_UtilityRollComplete;\n    }\n    return this.WorkflowState_Suspend;\n  }\n\n  async WorkflowState_UtilityRollComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (this.itemCardUuid && this.utilityRolls) {\n      this.displayUtilityRolls();\n    }\n    return this.WorkflowState_WaitForDamageRoll;\n  }\n  async WorkflowState_DamageRollCompleteCancelled(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (configSettings.undoWorkflow) {\n\n    }\n    return this.WorkflowState_Suspend;\n  }\n  async WorkflowState_WaitForSaves(context: WorkflowContext = {}): Promise<WorkflowState> {\n    // If the save is from the other activity, check consumption first\n    // If consumption fails or is cancelled, skip the save entirely\n    if (this.saveActivity === this.otherActivity && this.otherActivity) {\n      // For attacks, skip other activity if nothing was hit (don't consume resources for a miss)\n      if (this.activity.attack && this.hitTargets.size === 0 && this.hitTargetsEC.size === 0) {\n        addUpdatesCacheFlags(this.id, { [WorkflowDataFlags.otherActivityConsumed]: false }, \"midi-qol\"); // Mark as skipped\n        this.rawOtherDamageDetail = [];\n        this.initSaveResults();\n        return this.WorkflowState_SavesComplete;\n      }\n      const consumptionSuccess = await this.checkOtherActivityConsumption();\n      if (!consumptionSuccess) {\n        // Consumption failed or cancelled - skip the other activity save\n        this.initSaveResults();\n        return this.WorkflowState_SavesComplete;\n      }\n    }\n\n    if (configSettings.allowUseMacro) {\n      if (this.workflowOptions.noOnUseMacro !== true) await this.callMacros(this.item, this.onUseMacros?.getMacros(\"preSave\"), \"OnUse\", \"preSave\");\n      if (this.workflowOptions.noTargetOnUseMacro !== true) await this.triggerTargetMacros([\"isAboutToSave\"]); // ??\n      if (this.ammunition && this.workflowOptions.noOnUseMacro !== true) await this.callMacros(this.ammunition, this.ammunitionOnUseMacros?.getMacros(\"preSave\"), \"OnUse\", \"preSave\");\n    }\n    if (this.workflowType === \"BaseWorkflow\" && !this.workflowOptions.ignoreUserTargets && !this.activity.attack && this.activity.target?.affects.type !== \"self\") { // Allow editing of targets if there is no attack that has already been processed.\n      this.targets = new Set(game.user?.targets);\n      this.hitTargets = new Set(this.targets);\n    }\n    this.failedSaves = new Set(this.hitTargets);\n    if (!this.hasSave) {\n      this.initSaveResults();  // Ensure saveResults is initialized even without a save\n      return this.WorkflowState_SavesComplete;\n    }\n    await this.displaySaveTargets();\n    this.initSaveResults();\n    if (configSettings.autoCheckSaves !== \"none\") {\n      await this.callMidiHooks(\"midi-qol.preCheckSaves\");\n      if (this.aborted) return this.WorkflowState_Abort;\n      if (debugEnabled > 1) debug(\"Check Saves: renderChat message hooks length \", Hooks.events[\"renderChatMessageHTML\"]?.length)\n      // setup to process saving throws as generated\n      let hookId = Hooks.on(\"renderChatMessageHTML\", this.processSaveRoll.bind(this));\n      let monksId = Hooks.on(\"updateChatMessage\", this.monksSavingCheck.bind(this));\n      //@ts-expect-error flash-rolls-5e custom hook\n      let flashId = Hooks.on(\"flash-rolls-5e.rollComplete\", this.flashSavingCheck.bind(this));\n      try {\n        const saveDisplay = (this.activity.saveDisplay ?? \"default\") === \"default\" ? configSettings.autoCheckSaves : this.activity.saveDisplay;\n        await this.checkSaves(saveDisplay !== \"allShow\");\n      } catch (err) {\n        const message = (\"midi-qol | checkSaves error\")\n        TroubleShooter.recordError(err, message);\n        error(message, err)\n      } finally {\n        Hooks.off(\"renderChatMessageHTML\", hookId);\n        Hooks.off(\"updateChatMessage\", monksId);\n        //@ts-expect-error flash-rolls-5e custom hook\n        Hooks.off(\"flash-rolls-5e.rollComplete\", flashId);\n      }\n      if (debugEnabled > 1) debug(\"Check Saves: \", this.saveRequests, this.saveTimeouts, this.saves);\n      if (debugEnabled > 1) debug(\"Check Saves: renderChat message hooks length \", Hooks.events[\"renderChatMessageHTML\"]?.length)\n      await this.callMidiHooks(\"midi-qol.postCheckSaves\");\n      if (this.aborted) return this.WorkflowState_Abort;\n      const saveDisplay = (this.activity.saveDisplay ?? \"default\") === \"default\" ? configSettings.autoCheckSaves : this.activity.saveDisplay;\n      await Workflow.removeItemCardButtons(this.itemCardUuid as string, { removeDnd5eSaveButtons: configSettings.autoCheckSaves !== \"none\", removeDnd5eTemplateButtons: this.placedTemplateCount >= (Number(this.activity?.target?.template?.count) || 1) });\n      await this.displaySaves(saveDisplay === \"whisper\");\n    } else {// has saves but we are not checking so do nothing with the damage\n      this.effectTargets = this.failedSaves;\n      return this.WorkflowState_RollFinished;\n    }\n    return this.WorkflowState_SavesComplete;\n  }\n  async WorkflowState_SavesComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    expireMyEffects.bind(this)([\"1Action\", \"1Spell\"]);\n    if (configSettings.allowUseMacro && this.workflowOptions.noOnUseMacro !== true) {\n      await this.callMacros(this.item, this.onUseMacros?.getMacros(\"postSave\"), \"OnUse\", \"postSave\");\n      if (this.ammunition) await this.callMacros(this.ammunition, this.ammunitionOnUseMacros?.getMacros(\"postSave\"), \"OnUse\", \"postSave\");\n    }\n    if (configSettings.keepRollStats && this.item && this.hasSave) {\n      gameStats.addSaveResult(\n        this.saves.size + this.failedSaves.size,\n        this.saves.size,\n        this.failedSaves.size,\n        this.item\n      );\n    }\n    return this.WorkflowState_AllRollsComplete;\n  }\n  async WorkflowState_AllRollsComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    let items: any[] = [];\n\n    // Skip other damage processing entirely if consumption was already declined\n    const consumedFlag = this.chatCard?.getFlag(MODULE_ID, \"use.consumed\");\n    if (consumedFlag === false) {\n      // Consumption was declined - ensure other damage is cleared\n      this.otherDamageMatches = new Set();\n      this.rawOtherDamageDetail = [];\n    } else {\n      // Build otherDamageMatches (no-op if rollOtherDamage already built it)\n      await this.buildOtherDamageMatches();\n\n      // Process consumption for other activity if it will be applied\n      if (this.otherDamageMatches!.size > 0) {\n        await this.checkOtherActivityConsumption();\n      }\n    }\n\n    if (this.rawDamageDetail && (this.rawDamageDetail?.length || this.rawOtherDamageDetail?.length)) await processDamageRoll(this, this.rawDamageDetail[0]?.type ?? this.defaultDamageType)\n    this.recordDamageStats();\n    // If a damage card is going to be created don't call the isDamaged macro - wait for the damage card calculations to do a better job\n    if (configSettings.allowUseMacro && this.workflowOptions.noTargetOnUseMacro !== true && !configSettings.autoApplyDamage.includes(\"Card\"))\n      await this.triggerTargetMacros([\"isDamaged\"], this.hitTargets);\n    if (debugEnabled > 1) debug(\"all rolls complete \", foundry.utils.duplicate(this.rawDamageDetail));\n    return this.WorkflowState_ApplyDynamicEffects;\n  }\n\n  /**\n   * Check and process consumption for the other activity.\n   * This should be called either before the other activity save is rolled,\n   * or before applying other activity damage - but only once.\n   * @returns true if consumption succeeded or was not needed, false if it failed or was cancelled\n   */\n  async checkOtherActivityConsumption(): Promise<boolean> {\n    // No other activity or no consumption configured - nothing to check\n    if (!this.otherActivity || !this.otherActivity.hasConsumption()) {\n      return true;\n    }\n\n    // Only check consumption once, if it has already been check there is no need to continue\n    const existingFlag = this.chatCard?.getFlag(MODULE_ID, \"use.consumed\");\n    if (existingFlag !== undefined) {\n      return existingFlag !== false;\n    }\n\n    // Determine if we should auto-consume or show a dialog\n    const shouldShowDialog = !this.otherActivity.shouldAutoConsume(this);\n\n    // Prepare the usage config\n    let otherUsageConfig: ActivityUseConfiguration = this.otherActivity._prepareUsageConfig({\n      consume: { resources: true, spellSlot: false, action: false }\n    }) as ActivityUseConfiguration;\n\n    if (shouldShowDialog) {\n      // Show the consumption dialog\n      try {\n        // @ts-expect-error no dnd5e-types\n        const DialogClass = this.otherActivity.metadata?.usage?.dialog ?? game.dnd5e.applications.activity.ActivityUsageDialog;\n        // Only show scaling if the other activity supports it\n        const canScale = this.otherActivity.canScale ?? this.otherActivity.consumption?.scaling?.allowed ?? false;\n        otherUsageConfig = await DialogClass.create(this.otherActivity, otherUsageConfig, {\n          display: { consumption: true, scaling: canScale, concentration: false, creation: false }\n        });\n        // Dialog confirmed - proceed with consumption\n        const messageConfig: any = { data: {} };\n        const consumeResult = await this.otherActivity.consume(otherUsageConfig, messageConfig);\n        if (consumeResult === false) {\n          // Consumption was cancelled by a hook\n          this.otherDamageMatches = new Set();\n          this.rawOtherDamageDetail = [];\n          addUpdatesCacheFlags(this.id, { [WorkflowDataFlags.otherActivityConsumed]: false }, \"midi-qol\");\n          return false;\n        }\n        // Store consumed delta data on chat card for refund capability\n        // Use empty object if user chose not to consume - this still marks consumption as \"checked\"\n        const consumed = getConsumptionData(messageConfig) ?? {};\n        // Get scaling from the dialog's return value (otherUsageConfig), not messageConfig\n        // consume() handles resources but doesn't set up scaling flags\n        const scaling = otherUsageConfig.scaling;\n        if (this.itemCardUuid) {\n          addUpdatesCacheFlags(this.id, {\n            [WorkflowDataFlags.otherActivityConsumed]: consumed,\n            [WorkflowDataFlags.otherActivityScaling]: scaling\n          }, \"midi-qol\");\n        }\n      } catch (e) {\n        // Dialog was cancelled - skip other activity\n        this.otherDamageMatches = new Set();\n        this.rawOtherDamageDetail = [];\n        addUpdatesCacheFlags(this.id, { [WorkflowDataFlags.otherActivityConsumed]: false }, \"midi-qol\");\n        return false;\n      }\n    } else {\n      // Auto-consume - first check if consumption would succeed\n      const consumptionCheck = await this.otherActivity._prepareUsageUpdates(otherUsageConfig, { returnErrors: true });\n      if (Array.isArray(consumptionCheck) && consumptionCheck.length > 0) {\n        // Consumption would fail - warn user and skip other activity\n        ui.notifications?.warn(i18nFormat(\"midi-qol.otherActivityConsumptionFailed\", {\n          actorName: this.actor?.name ?? \"Unknown\",\n          itemName: this.item?.name ?? \"Unknown\",\n          activityName: this.activity?.name ?? \"Unknown\"\n        }));\n        this.otherDamageMatches = new Set();\n        this.rawOtherDamageDetail = [];\n        addUpdatesCacheFlags(this.id, { [WorkflowDataFlags.otherActivityConsumed]: false }, \"midi-qol\");\n        return false;\n      }\n\n      const messageConfig: any = { data: {} };\n      const consumeResult = await this.otherActivity.consume(otherUsageConfig, messageConfig);\n      if (consumeResult === false) {\n        // Consumption was cancelled by a hook\n        this.otherDamageMatches = new Set();\n        this.rawOtherDamageDetail = [];\n        addUpdatesCacheFlags(this.id, { [WorkflowDataFlags.otherActivityConsumed]: false }, \"midi-qol\");\n        return false;\n      }\n      // Store consumed delta data on chat card for refund capability\n      // Use empty object if nothing was consumed - this still marks consumption as \"checked\"\n      const consumed = getConsumptionData(messageConfig) ?? {};\n      // For auto-consume, scaling is from otherUsageConfig (default is 0/undefined)\n      const scaling = otherUsageConfig.scaling;\n      if (this.itemCardUuid) {\n        addUpdatesCacheFlags(this.id, {\n          [WorkflowDataFlags.otherActivityConsumed]: consumed,\n          [WorkflowDataFlags.otherActivityScaling]: scaling\n        }, \"midi-qol\");\n      }\n    }\n\n    // Consumption succeeded - roll the deferred other activity damage if needed\n      await this.rollDeferredOtherDamage();\n\n    // Note: consumed data was already stored above via addUpdatesCacheFlags\n    return true;\n  }\n\n  /**\n   * Build otherDamageMatches if not already populated.\n   * Evaluates the otherActivity useCondition per-target exactly once.\n   */\n  async buildOtherDamageMatches(): Promise<void> {\n    if (this.otherDamageMatches !== undefined) return; // already built (may be empty if condition matched no targets)\n    this.otherDamageMatches = new Set();\n    const otherCondition = this.otherUseCondition;\n    const targetsForOtherDamage = this.activity.attack\n      ? new Set([...this.hitTargets, ...this.hitTargetsEC])\n      : this.targets;\n    for (const token of targetsForOtherDamage) {\n      if (otherCondition) {\n        if (await evalActivationCondition(this, otherCondition, token, { async: true, errorReturn: false }))\n          this.otherDamageMatches.add(token);\n      } else {\n        this.otherDamageMatches.add(token);\n      }\n    }\n  }\n\n  /**\n   * Roll the other activity damage that was deferred until after consumption was confirmed.\n   */\n  async rollDeferredOtherDamage(): Promise<void> {\n    const config = this.otherDamageConfig;\n    if (!config || !this.otherActivity) return;\n\n    const dialog = this.otherDamageDialog ?? {};\n\n    try {\n      const otherResult = await this.activity.rollOtherDamage(config, dialog);\n\n      if (otherResult) {\n        // Update the chat card to show the deferred other damage\n        await this.displayDamageRolls();\n      }\n    } catch (err) {\n      TroubleShooter.recordError(err, \"midi-qol | rollDeferredOtherDamage error\");\n      error(\"rollDeferredOtherDamage error\", err);\n    }\n\n    // Clear stored config\n    this.otherDamageConfig = undefined;\n    this.otherDamageDialog = undefined;\n  }\n\n  async WorkflowState_ApplyDynamicEffects(context: WorkflowContext = {}): Promise<WorkflowState> {\n    this.activationMatches = new Set();\n    this.otherActivationMatches = new Set();\n    this.activationFails = new Set();\n    this.otherActivationFails = new Set();\n    let targetsToUse = this.targets;\n    // Special case for target affects not specified an no targets selected when rolled - assume user has selected new targets so use those\n    if (this.activity.target?.affects?.type === \"\" && this.targets.size == 0)\n      targetsToUse = new Set(game.user?.targets);\n    for (let token of targetsToUse) {\n      const effectCondition = this.effectActivationCondition;\n      const otherEffectCondition = this.otherEffectActivationCondition\n      if (effectCondition) {\n        if (await evalActivationCondition(this, effectCondition, token, { async: true, errorReturn: true })) {\n          this.activationMatches.add(token);\n        } else\n          this.activationFails.add(token);\n      } else this.activationMatches.add(token)\n\n      if (otherEffectCondition) {\n        if (await evalActivationCondition(this, otherEffectCondition, token, { async: true, errorReturn: true })) {\n          this.otherActivationMatches.add(token);\n        } else\n          this.otherActivationFails.add(token);\n      } else this.otherActivationMatches.add(token)\n    }\n    expireMyEffects.bind(this)([\"1Action\", \"1Spell\"]);\n\n    this.effectTargets = new Set();\n    this.otherEffectTargets = new Set();\n    this.allOtherEffectTargets = new Set(this.targets);\n    this.effectTargetsOnSave = this.activationMatches;\n    this.otherEffectTargetsOnSave = this.otherActivationMatches;\n    if (this.forceApplyEffects) {\n      this.effectTargets = new Set();\n    } else if ((this.saveActivity?.save || this.saveActivity?.check) && this.activity.attack) {\n      this.effectTargets = new Set([...this.hitTargets, ...this.hitTargetsEC]);\n      this.effectTargets = new Set([...this.effectTargets].filter(t => this.failedSaves.has(t)));\n    } else if (this.activity.save || this.activity.check) this.effectTargets = this.failedSaves;\n    else if (this.activity.attack) {\n      this.effectTargets = new Set([...this.hitTargets, ...this.hitTargetsEC]);\n    } else\n      this.effectTargets = this.targets;\n    this.effectTargets = this.effectTargets.filter(t => this.activationMatches!.has(t));\n\n    if (this.forceApplyEffects) {\n      this.otherEffectTargets = this.targets;\n    } else if ((this.otherActivity?.save || this.otherActivity?.check) && this.activity.attack) {\n      this.otherEffectTargets = new Set([...this.hitTargets, ...this.hitTargetsEC]);\n      // check saves when selecting the effects to apply - deal with always apply effects\n      if (!this.otherEffectActivationCondition)\n        this.otherEffectTargets = new Set([...this.otherEffectTargets].filter(t => this.failedSaves.has(t)));\n    } else if (this.otherActivity?.save || this.otherActivity?.check) this.otherEffectTargets = this.failedSaves;\n    else if (this.activity.attack) {\n      this.otherEffectTargets = new Set([...this.hitTargets, ...this.hitTargetsEC]);\n    } else\n      this.otherEffectTargets = this.targets;\n    this.otherEffectTargets = this.otherEffectTargets.filter(t => this.otherActivationMatches!.has(t));\n\n    // Check consumption for other activity effects if not already checked\n    // This handles the case where other activity has effects but no save and no damage\n    if (this.otherActivity && this.otherEffectTargets.size > 0) {\n      const otherConsumedFlag = this.chatCard?.getFlag(MODULE_ID, \"use.consumed\");\n      if (otherConsumedFlag === false) {\n        // Consumption was already declined - skip other effects\n        this.otherEffectTargets = new Set();\n      } else if (otherConsumedFlag === undefined && this.otherActivity.hasConsumption()) {\n        // Consumption not yet checked and other activity has consumption - check now\n        const consumptionSuccess = await this.checkOtherActivityConsumption();\n        if (!consumptionSuccess) {\n          this.otherEffectTargets = new Set();\n        }\n      }\n    }\n\n    // Do special expiries\n    const specialExpiries = [\n      \"isDamaged\",\n      \"isHealed\",\n      \"isSaveSuccess\",\n      \"isSaveFailure\",\n      \"isSave\",\n      \"isHit\"\n    ];\n    await this.expireTargetEffects(specialExpiries);\n\n    if (configSettings.autoItemEffects === \"off\" && !this.forceApplyEffects) return this.WorkflowState_RollFinished; // TODO see if there is a better way to do this.\n\n    // TODO look at macros being per activity rather than per item\n    if (this.activity.item) {\n      if (configSettings.allowUseMacro && this.workflowOptions.noOnUseMacro !== true) {\n        let results: any[] = await this.callMacros(this.activity.item, this.onUseMacros?.getMacros(\"preActiveEffects\"), \"OnUse\", \"preActiveEffects\");\n        // Special check for return of {haltEffectsApplication: true} from item macro\n        if (results.some(r => r?.haltEffectsApplication))\n          return this.WorkflowState_RollFinished;\n        results = await this.callMacros(this.ammunition, this.ammunitionOnUseMacros?.getMacros(\"preActiveEffects\"), \"OnUse\", \"preActiveEffects\");\n        if (results.some(r => r?.haltEffectsApplication))\n          return this.WorkflowState_RollFinished;\n      }\n    }\n\n    // no item, not auto effects or not module skip\n    let useCE: string = configSettings.autoCEEffects;\n    if (!this.activity.item) return this.WorkflowState_RollFinished;\n    if (this.activity.midiProperties?.autoCEEffects && this.activity.midiProperties.autoCEEffects !== \"default\") {\n      useCE = this.activity.midiProperties.autoCEEffects;\n    }\n    let ceEffect = getCEEffectByName(this.activity.name);\n    if (!ceEffect) ceEffect = getCEEffectByName(this.activity.item.name);\n    const isApplicableEffect = (activity: Activity | undefined | null, efData: ActivityEffectData | undefined | null): boolean => {\n      if (!efData || !activity) return false;\n      const level = activity.relevantLevel;\n      //@ts-expect-error no dnd5e-types\n      if (((efData.level?.min ?? -Infinity) > level) || (level > (efData.level?.max ?? Infinity)))\n        return false;\n      // @ts-expect-error no dnd5e-types\n      return !!efData.effect && efData.effect?.transfer !== true && efData.effect?.type !== \"enchantment\";\n    }\n    // can't use this.activity.applicableEffects since we need to know about onSave or not\n    let activityEffects = (this.activity.effects ?? []).filter(efData => isApplicableEffect(this.activity, efData) && efData.onSave !== true).map(efData => efData.effect!);\n    let onSaveActivityEffects = (this.activity.effects ?? []).filter(efData => isApplicableEffect(this.activity, efData) && efData.onSave === true).map(efData => efData.effect!);\n    let otherActivityEffects = (this.otherActivity?.effects ?? []).filter(efData => isApplicableEffect(this.otherActivity, efData) && efData.onSave !== true).map(efData => efData.effect!);\n    let onSaveOtherActivityEffects = (this.otherActivity?.effects ?? []).filter(efData => isApplicableEffect(this.otherActivity, efData) && efData.onSave === true).map(efData => efData.effect!);\n    if (activityEffects.length > 0 && this.effectTargets.size > 0 && this.activity.midiProperties?.chooseEffects) { // WIP\n      activityEffects = await this.chooseEffects(activityEffects, { activity: this.activity, activityUuid: this.activity.uuid, isOtherActivity: false });\n    }\n    if (otherActivityEffects.length > 0 && this.otherEffectTargets.size > 0 && this.otherActivity?.midiProperties?.chooseEffects) { // WIP\n      otherActivityEffects = await this.chooseEffects(otherActivityEffects, { activity: this.otherActivity, activityUuid: this.otherActivity.uuid, isOtherActivity: true });\n    }\n    const ceTargetEffect = ceEffect && !(ceEffect?.flags?.dae?.selfTarget || ceEffect?.flags?.dae?.selfTargetAlways);\n    const ceSelfEffect = ceEffect && (ceEffect?.flags?.dae?.selfTarget || ceEffect?.flags?.dae?.selfTargetAlways);\n    const hasActivityEffects = hasDAE(this) && activityEffects.length > 0;\n    const hasOtherActivityEffects = hasDAE(this) && otherActivityEffects.length > 0;\n\n    const activitySelfEffects = [...activityEffects, ...onSaveActivityEffects].filter(ef => ef.flags?.dae?.selfTarget || ef.flags?.dae?.selfTargetAlways) ?? [];\n    const activitySelfAllEffect = [...activityEffects, ...onSaveActivityEffects].filter(ef => ef.flags?.dae?.selfTargetAlways) ?? [];\n    const otherActivitySelfEffects = [...otherActivityEffects, ...onSaveOtherActivityEffects].filter(ef => ef.flags?.dae?.selfTarget || ef.flags?.dae?.selfTargetAlways) ?? [];\n    const otherActivitySelfAllEffects = [...otherActivityEffects, ...onSaveOtherActivityEffects].filter(ef => ef.flags?.dae?.selfTargetAlways) ?? [];\n\n    activityEffects = activityEffects.filter(ef => !ef.flags?.dae?.selfTarget && !ef.flags?.dae?.selfTargetAlways);\n    otherActivityEffects = otherActivityEffects.filter(ef => !ef.flags?.dae?.selfTarget && !ef.flags?.dae?.selfTargetAlways);\n    onSaveActivityEffects = onSaveActivityEffects.filter(ef => !ef.flags?.dae?.selfTarget && !ef.flags?.dae?.selfTargetAlways);\n    onSaveOtherActivityEffects = onSaveOtherActivityEffects.filter(ef => !ef.flags?.dae?.selfTarget && !ef.flags?.dae?.selfTargetAlways);\n    // let anyApplication = this.effectTargets.size > 0 || this.otherEffectTargets.size > 0;\n\n    let selfEffectsToApply = \"none\";\n    const metaData = {\n      \"flags\": {\n        \"dae\": { transfer: false },\n        \"midi-qol\": {\n          castData: this.castData\n        }\n      }\n    };\n    let origin = this.actor.effects.get(this.chatCard?.getFlag(\"dnd5e\", \"use.concentrationId\") ?? \"\")?.uuid\n      ?? getConcentrationEffect(this.actor, this.item)?.uuid;\n    let damageComponents = {};\n    let damageListItem;\n    let hpDamage;\n    let totalDamage: number | undefined;\n    const doEffectsData = {\n      damageTotal: 0,\n      damage: 0,\n      critical: this.isCritical,\n      fumble: this.isFumble,\n      itemCardUuid: this.itemCardUuid,\n      metaData,\n      selfEffects: \"none\",\n      spellLevel: this.spellLevel,\n      origin: \"\",\n      toggleEffect: this.activity.midiProperties?.toggleEffect,\n      // Is this used?\n      tokenUuid: this.tokenUuid,\n      // Is this used?\n      actorUuid: this.actor.uuid,\n      whisper: false,\n      // Is this used?\n      workflowOptions: this.workflowOptions,\n      context: {\n        damageComponents: {},\n        damageTotal: 0,\n        damageApplied: 0,\n        otherDamage: this.otherDamageTotal ?? 0,\n        bonusDamage: this.bonusDamageTotal ?? 0,\n        itemData: this.item?.getRollData?.()?.item,\n        activity: this.activity?.getRollData?.()?.activity,\n        flags: {\n          dnd5e: {\n            scaling: this.chatCard?.getFlag(\"dnd5e\", \"scaling\"),\n            spellLevel: this.chatCard?.getFlag(\"dnd5e\", \"use.spellLevel\")\n          }\n        },\n        utilityRollTotal: this.utilityRoll?.total,\n      }\n    }\n    for (let token of this.targets) {\n      const tokenDamages = this.damageList?.find(di => di.targetUuid === getTokenDocument(token)?.uuid);\n      if (tokenDamages) {\n        doEffectsData.damageTotal = tokenDamages.totalDamage;\n        doEffectsData.context.damageTotal = tokenDamages.totalDamage;\n        doEffectsData.damage = tokenDamages.hpDamage;\n        doEffectsData.context.damageApplied = tokenDamages.hpDamage;\n        doEffectsData.context.damageComponents = [tokenDamages.damageDetails[\"combinedDamage\"], configSettings.singleConcentrationRoll ? [] : (tokenDamages.damageDetails[\"otherDamage\"] ?? [])]\n          .reduce((summary, damages) => {\n            let damagesSummary = damages.reduce((damageComponents, damageEntry) => {\n              damageComponents[damageEntry.type] = damageEntry.value + (damageComponents[damageEntry.type] ?? 0);\n              return damageComponents;\n            }, {});\n            Object.keys(damagesSummary).forEach(key => {\n              summary[key] = damagesSummary[key] + (summary[key] ?? 0);\n            });\n            return summary;\n          }, {});\n      }\n\n      // Check for activity effects or ce effects\n      if (this.forceApplyEffects || this.effectTargets.has(token)) {\n        if (hasActivityEffects && (!ceTargetEffect || [\"none\", \"both\", \"itempri\"].includes(useCE))) {\n          let selectedEffects = activityEffects;\n          if (!this.forceApplyEffects) {\n            selectedEffects = activityEffects.filter(ef =>\n              this.effectTargets?.has(token) && (\n                !(this.activity.save || this.activity.check)\n                || this.failedSaves.has(token)\n                || this.activity.effects.some(effectDetail => effectDetail.onSave == true && effectDetail._id === ef.id)\n              )\n            );\n          }\n          const effectsToApplyUuids = selectedEffects.map(ef => ef.uuid);\n          if (effectsToApplyUuids?.length > 0) {\n            doEffectsData.origin = origin ?? effectsToApplyUuids[0];\n            await globalThis.DAE.doActivityEffects(this.activity, true, [token], effectsToApplyUuids, doEffectsData);\n          }\n        }\n        if (ceTargetEffect && this.activity.item && token.actor) {\n          if (ceEffect && ([\"both\", \"cepri\", \"ceOnly\"].includes(useCE) || (useCE === \"itempri\" && !hasActivityEffects))) {\n            const targetHasEffect = token.actor.effects.find(ef => ef.name === ceEffect.name);\n            if (this.activity.midiProperties?.toggleEffect && targetHasEffect) {\n              await CEToggleEffect({ effectName: ceEffect.name, uuid: token.actor.uuid, origin });\n            } else {\n              // Check stacking status\n              let removeExisting = ([\"none\", \"noneName\"].includes(ceEffect.flags?.dae?.stackable ?? \"none\"));\n              const hasExisting = await CEHasEffectApplied({ effectName: ceEffect.name, uuid: token.actor.uuid })\n              if (removeExisting && hasExisting) {\n                await CERemoveEffect({ effectName: ceEffect.name, uuid: token.actor.uuid, origin });\n              }\n              const effectData = foundry.utils.mergeObject(ceEffect.toObject(), metaData);\n              if (isInCombat(token.actor) && (effectData.duration?.seconds ?? 0) <= 60) {\n                effectData.duration.rounds = effectData.duration.rounds ?? Math.ceil((effectData.duration?.seconds ?? 0) / CONFIG.time.roundTime);\n                delete effectData.duration.seconds;\n              }\n              effectData.origin = origin ?? this.activity.uuid ?? this.activity.item.uuid;\n              const concentrationUuid = this.actor.effects.get(this.chatCard?.getFlag(\"dnd5e\", \"use.concentrationId\")??\"\")?.uuid;\n              if (concentrationUuid) {\n                foundry.utils.setProperty(effectData, \"flags.dnd5e.dependentOn\", concentrationUuid);\n              }\n              const effects = await CEAddEffectWith({ effectData, effectName: ceEffect.name, uuid: token.actor.uuid, origin, overlay: false });\n            }\n          }\n        }\n      }\n\n      if (this.effectTargetsOnSave.size > 0 && onSaveActivityEffects.length > 0) {\n        let selectedEffects = onSaveActivityEffects;\n        const effectsToApplyUuids = onSaveActivityEffects.map(ef => ef.uuid);\n        if (effectsToApplyUuids?.length > 0) {\n          // TODO: Is this right?\n          doEffectsData.origin = effectsToApplyUuids[0];\n          await globalThis.DAE.doActivityEffects(this.activity, true, [token], effectsToApplyUuids, doEffectsData)\n        }\n      }\n      if (this.forceApplyEffects || this.otherEffectTargets.has(token)) {\n        if (hasOtherActivityEffects) {\n          let selectedEffects = otherActivityEffects;\n          if (!this.forceApplyEffects) {\n            selectedEffects = otherActivityEffects.filter(ef =>\n              this.otherActivationMatches?.has(token) && this.otherEffectTargets?.has(token) && (\n                !(this.otherActivity?.save || this.otherActivity?.check)\n                || this.failedSaves.has(token)\n                || this.otherActivity?.effects.some(effectDetail => effectDetail.onSave == true && effectDetail._id === ef.id)\n              )\n            );\n          }\n          const effectsToApplyUuids = selectedEffects.map(ef => ef.uuid);\n          if (effectsToApplyUuids?.length > 0) {\n            doEffectsData.origin = effectsToApplyUuids[0];\n            await globalThis.DAE.doActivityEffects(this.otherActivity, true, [token], effectsToApplyUuids, doEffectsData)\n          }\n        }\n      }\n      if (this.otherEffectTargetsOnSave.size > 0 && onSaveOtherActivityEffects.length > 0) {\n        let selectedEffects = onSaveOtherActivityEffects;\n        const effectsToApplyUuids = onSaveOtherActivityEffects.map(ef => ef.uuid);\n        if (effectsToApplyUuids?.length > 0) {\n          doEffectsData.origin = effectsToApplyUuids[0];\n          await globalThis.DAE.doActivityEffects(this.otherActivity, true, [token], effectsToApplyUuids, doEffectsData)\n        }\n      }\n    }\n    // Perhaps this should use this.effectTargets\n    if (configSettings.allowUseMacro && this.workflowOptions.noTargetOnUseMacro !== true) await this.triggerTargetMacros([\"postTargetEffectApplication\"], this.targets);\n\n    //Now do self effects\n    let selfEffects: ActiveEffect.Implementation[] = [];\n    if (this.effectTargets?.size > 0) selfEffects = activitySelfEffects;\n    else selfEffects = activitySelfAllEffect;\n    const selfToken = getOrCreateTokenForActor(this.actor);\n    if (selfEffects.length > 0 && selfToken) {\n      doEffectsData.origin = origin ?? this.activity.uuid ?? this.item.uuid;\n      await globalThis.DAE.doActivityEffects(this.activity, true, [selfToken], selfEffects.map(ef => ef.uuid), doEffectsData)\n    }\n\n    let otherSelfEffects: ActiveEffect.Implementation[] = [];\n    if (this.otherEffectTargets.size > 0) otherSelfEffects = otherActivitySelfAllEffects;\n    else otherSelfEffects = otherActivitySelfEffects;\n    if (otherSelfEffects.length > 0 && selfToken) {\n      doEffectsData.origin = this.otherActivity!.item.uuid;\n      await globalThis.DAE.doActivityEffects(this.otherActivity, true, [selfToken], otherSelfEffects.map(ef => ef.uuid), doEffectsData)\n    }\n\n    if (this.actor && ceSelfEffect && (this.effectTargets?.size > 0 || ceEffect!.flags?.dae?.selfTargetAlways)) {\n      if ([\"both\", \"cepri\"].includes(useCE) || (useCE === \"itempri\" && !selfEffects.length)) {\n        const actorHasEffect = this.actor.effects.find(ef => ef.name === this.activity.name);\n        if (this.activity.midiProperties?.toggleEffect && actorHasEffect) {\n          CEToggleEffect({ effectName: this.activity.name, uuid: this.actor.uuid, origin });\n        } else {\n          // Check stacking status\n          if ((ceEffect!.flags?.dae?.stackable ?? \"none\") === \"none\" && await CEHasEffectApplied({ effectName: this.activity.name, uuid: this.actor.uuid })) {\n            await CERemoveEffect({ effectName: this.activity.name, uuid: this.actor.uuid, origin });\n          }\n          const effectData: ActiveEffect.CreateData = foundry.utils.mergeObject(ceEffect!.toObject(), metaData);\n          effectData.origin = origin;\n          const concentrationUuid = this.actor.effects.get(this.chatCard?.getFlag(\"dnd5e\", \"use.concentrationId\")??\"\")?.uuid;\n          if (concentrationUuid) {\n            foundry.utils.setProperty(effectData, \"flags.dnd5e.dependentOn\", concentrationUuid);\n          }\n          const effects = await CEAddEffectWith({ effectData, effectName: this.activity.name, uuid: this.actor.uuid, origin, overlay: false });\n        }\n      }\n    }\n    return this.WorkflowState_RollFinished;\n  }\n  async WorkflowState_Cleanup(context: WorkflowContext = {}): Promise<WorkflowState> {\n    const blfxActive = game.modules.get(\"boss-loot-assets-premium\")?.active ||\n      game.modules.get(\"boss-loot-assets-free\")?.active;\n    const AAActive = game.modules.get(\"autoanimations\")?.active;\n    const elapsedTimeRequired = 5000;\n    if (configSettings.autoRemoveInstantaneousTemplate && this.templateUuids.length > 0 && this.activity.duration?.units === \"inst\") {\n      for (const tUuid of this.templateUuids) {\n        if (!blfxActive) {\n          const elapsed = Date.now() - (this.workflowStartTime ?? 0);\n          // if auto animations is active we need to allow enough time for it to have grabbed the template data before deleting it.\n          let timeout = AAActive ? Math.max(elapsedTimeRequired - elapsed, 1) : 1;\n          timeout = Math.max(elapsedTimeRequired, timeout);\n          setTimeout(() => {\n            const templateToDelete = fromUuidSync(tUuid) as MeasuredTemplateDocument || null;\n            templateToDelete?.delete()\n          }, timeout);\n        } else {\n          setTimeout(() => {\n            const templateToDelete = fromUuidSync(tUuid) as MeasuredTemplateDocument || null;\n            templateToDelete?.delete()\n          }, elapsedTimeRequired);\n          log(\"Not auto removing instantaneous template because boss loot assets active\")\n        }\n      }\n    }\n    if (this.postSummonHookId) Hooks.off(\"dnd5e.postSummon\", this.postSummonHookId);\n    if (this.activity.target?.affects.type !== \"\" || this.targets.size !== 0) {\n      // moved inside RollFinished if (configSettings.autoItemEffects === \"applyRemove\") await this.removeEffectsButton();\n    }\n\n    // Restore user targets if this was a self-target workflow\n    if (this.selfTargeted) popTargetSave();\n\n    return this.WorkflowState_Completed;\n  }\n\n  async WorkflowState_Completed(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (this.itemCardUuid && this.chatCard) {\n      if (this.damageList && saveToChatCard && this.itemCardUuid) {\n        const damageListData = prepareDamageListToJSON(this.damageList);\n        // @ts-expect-error deleting something that is \"required\" in other contexts\n        damageListData.forEach((di => delete di.damageDetails))\n        addUpdatesCacheFlags(this.id, { [WorkflowDataFlags.damageList]: damageListData }, \"midi-qol\");\n      }\n      await Workflow.removeItemCardButtons(this.itemCardUuid, { removeAllButtons: getRemoveAllButtons(this.activity), removeAttackButtons: getRemoveAttackButtons(this.activity), removeDamageButtons: getRemoveDamageButtons(this.activity), removeDnD5eButtons: getRemoveAllButtons(this.activity) && configSettings.autoCheckSaves !== \"none\", removeDnd5eSaveButtons: configSettings.autoCheckSaves !== \"none\" });\n    }\n    if (context.attackRoll) return this.WorkflowState_AttackRollComplete;\n    if (context.damageRoll) return this.WorkflowState_ConfirmRoll;\n    if (debugEnabled > 0) warn(\"Workflow complete \", this.id, \"elapsed time\", Date.now() - (this.workflowStartTime ?? 0));\n    warn(\"Workflow complete \", this.id, \"elapsed time\", Date.now() - (this.workflowStartTime ?? 0));\n\n    let shouldTrigger = false;\n    if (this.activity.midiProperties?.triggeredActivityId && !this.aborted) {\n      let activity = this.activity\n      shouldTrigger = true;\n      let possibleTriggerActivity = await this.activity.getTriggeredActivity();\n      const visitedActivities = new Set([activity.uuid]);\n      while (possibleTriggerActivity) {\n        if (visitedActivities.has(possibleTriggerActivity.uuid)) {\n          ui.notifications?.error((`midi-qol | loop detected in triggered activities for ${this.actor.name} ${this.item.name} ${this.activity.name} - execution aborted`))\n          shouldTrigger = false;\n          break;\n        }\n        visitedActivities.add(possibleTriggerActivity.uuid);\n        possibleTriggerActivity = await possibleTriggerActivity.getTriggeredActivity();\n      }\n\n      let triggeredActivity = await this.activity.getTriggeredActivity();\n      if (shouldTrigger && triggeredActivity) {\n        if (shouldTrigger) {\n          let usage: { midiOptions: MidiOptions } = { midiOptions: {} };\n          usage.midiOptions.event = this.rollOptions.event;\n          usage.midiOptions.workflowOptions = this.workflowOptions;\n          usage.midiOptions.rollOptions = this.rollOptions;\n          usage.midiOptions.isTriggered = true;\n          let targetUuids: string[] = [];\n          const toUuids = (targets: Set<TokenOrDocument>): string[] => {\n            return Array.from(targets ?? new Set()).map(t => (t instanceof TokenDocument ? t : t.document).uuid)\n          }\n\n          if (this.activity.midiProperties?.triggeredActivityRollAs) {\n            switch (this.activity.midiProperties.triggeredActivityRollAs) {\n              case \"firstTarget\": usage.midiOptions.rollAs = getActor(this.targets.first()); break;\n              case \"firstHitTarget\": usage.midiOptions.rollAs = getActor(this.hitTargets.first()); break;\n              case \"firstMissedTarget\": usage.midiOptions.rollAs = getActor(this.targets.difference(this.hitTargets).first()); break;\n              case \"firstSaveTarget\": usage.midiOptions.rollAs = getActor(this.saves.first()); break;\n              case \"firstFailedSaveTarget\": usage.midiOptions.rollAs = getActor(this.failedSaves.first()); break;\n              case \"self\":\n              default:\n                usage.midiOptions.rollAs = this.actor;\n                break;\n            }\n          }\n          if (!usage.midiOptions.rollAs?.isOwner) usage.midiOptions.checkGMstatus = true;\n          if (this.activity.midiProperties?.triggeredActivityTargets)\n            switch (this.activity.midiProperties.triggeredActivityTargets) {\n              case \"self\": targetUuids = [this.tokenUuid ?? \"\"]; break;\n              case \"hitTargets\": targetUuids = toUuids(this.hitTargets); break;\n              case \"missedTargets\": targetUuids = toUuids(this.targets.difference(this.hitTargets)); break;\n              case \"failedSaves\": targetUuids = toUuids(this.failedSaves); break;\n              case \"saveTargets\": targetUuids = toUuids(this.saves); break;\n              case \"targets\": targetUuids = toUuids(this.targets); break;\n              case \"retarget\":\n              default:\n                // targetUuids = [];\n                break;\n            }\n          usage.midiOptions.targetUuids = targetUuids;\n          usage.midiOptions.triggeredActivity = true;\n          if (this.activity.midiProperties.triggeredActivityTargets !== \"retarget\" && targetUuids?.length === 0)\n            shouldTrigger = false;\n          if (this.activity.midiProperties?.triggeredActivityConditionText && shouldTrigger) {\n            const target = await fromUuid(targetUuids[0]) as TokenDocument.Implementation | undefined;;\n            const condition = this.activity.midiProperties?.triggeredActivityConditionText;\n            const conditionData = createConditionData({ workflow: this, activity: this.activity, item: this.item, target });\n            shouldTrigger = await evalCondition(condition, conditionData, { async: true, errorReturn: false });\n          }\n          if (shouldTrigger) {\n            foundry.utils.setProperty(usage, \"midiOptions.isCritical\", this.isCritical);\n            foundry.utils.setProperty(usage, \"midiOptions.workflowOptions.triggeringWorkflowId\", this.id);\n            foundry.utils.setProperty(usage, \"midiOptions.workflowOptions.triggeringActivityUuid\", this.activity.uuid);\n            const triggerConsume = this.activity.midiProperties?.triggeredActivityConsume ?? true;\n            const triggerConfigure = this.activity.midiProperties?.triggeredActivityConfigure ?? true;\n            if (!triggerConsume) foundry.utils.setProperty(usage, \"consume\", { resources: false, spellSlot: false, action: false });\n            await completeActivityUse(triggeredActivity, usage, { configure: triggerConfigure }, {});\n          }\n        }\n      }\n    }\n    return this.WorkflowState_Suspend;\n\n  }\n\n  async WorkflowState_Abort(context: WorkflowContext = {}): Promise<WorkflowState> {\n    this.aborted = true;\n    if (this.postSummonHookId) Hooks.off(\"dnd5e.postSummon\", this.postSummonHookId);\n    if (!this.keepActivityCard && this.itemCardUuid && fromUuidSync(this.itemCardUuid)) {\n      await this.chatCard.delete();\n      clearUpdatesCache(this.itemCardUuid);\n    }\n\n    for (const tUuid of this.templateUuids) {\n      const templateToDelete = await fromUuid(tUuid) as MeasuredTemplateDocument | undefined;\n      if (templateToDelete) await templateToDelete.delete();\n    }\n    return this.WorkflowState_Cleanup;\n  }\n\n  async WorkflowState_Cancel(context: WorkflowContext = {}): Promise<WorkflowState> {\n    // cancel will undo the workflow if it exists\n    if (configSettings.undoWorkflow) await unTimedExecuteAsGM(\"undoTillWorkflow\", this.uuid, true, true);\n    return this.WorkflowState_Abort\n  }\n\n  async WorkflowState_RollFinished(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (this.aborted) {\n      const message = `${this.workflowName} Workflow ${this.id} RollFinished called when aborted`;\n      error(message);\n      TroubleShooter.recordError(new Error(message), message);\n    }\n    const specialExpiries = [\n      \"isDamaged\",\n      \"isHealed\",\n      \"1Reaction\",\n    ];\n    await this.expireTargetEffects(specialExpiries)\n    let chatMessage = this.chatCard;\n    let selfTarget = this.token ?? getOrCreateTokenForActor(this.actor);\n    if (this.needsHitTargetsDisplayed && this.targets?.size > 0 && chatMessage && (this.activity.effects?.length || this.otherActivity?.effects?.length)) {\n      this.hitDisplayData = {};\n      // Always show all targets in the display, not just effectTargets (failed saves)\n      const theTargets = this.targets;\n      for (let targetToken of theTargets) {\n        if (!targetToken.actor) continue;\n        const targetTokenUuid = targetToken.actor?.uuid;\n        if (!targetTokenUuid) continue;\n        let img: string | null | undefined = targetToken.document?.texture.src ?? targetToken.actor.img;\n        // @ts-expect-error no dnd5e-types\n        if (configSettings.usePlayerPortrait && targetToken.actor.type === \"character\") {\n          img = targetToken.actor.img ?? targetToken.document?.texture.src;\n        }\n        if (foundry.helpers.media.VideoHelper.hasVideoExtension(img ?? \"\")) {\n          img = await game.video?.createThumbnail(img ?? \"\", { width: 100, height: 100 });\n        }\n        this.hitDisplayData[targetTokenUuid] = {\n          targetClass: targetToken.actor.hasPlayerOwner ? \"midi-qol-player-target\" : \"midi-qol-nonplayer-target\",\n          target: targetToken,\n          hitClass: \"success\",\n          acClass: \"\",\n          img: img ?? \"\",\n          gmName: getTokenName(targetToken),\n          playerName: getTokenPlayerName(targetToken) ?? \"\",\n          uuid: targetToken.document.uuid,\n          showAC: false,\n          isHit: true\n        };\n      }\n      await this.displayHits(chatMessage.whisper.length > 0, true);\n      chatMessage = this.chatCard\n    }\n    let content = chatMessage?.content;\n    let contentChanged = false;\n    // TODO move this to call the omnibus remove buttons function\n    if (content && getRemoveAttackButtons(this.activity) && chatMessage && configSettings.confirmAttackDamage === \"none\") {\n      // Match rollAttack button from activity-card.hbs\n      let searchRe = /<button[^>]*?data-action=\"rollAttack\"[\\s\\S]*?<\\/button>/;\n      content = content.replace(searchRe, \"\");\n      contentChanged = true;\n    }\n    // Once the roll is finished and all templates placed, remove the template button\n    if (content) {\n      let isEmanationTargeting = activityHasAutoPlaceTemplate(this.activity) || activityHasEmanationNoTemplate(this.activity);\n      let isAoETargeting = !isEmanationTargeting && activityHasAreaTarget(this.activity);\n      if (isAoETargeting && !isEmanationTargeting && this.placedTemplateCount >= (Number(this.activity?.target?.template?.count) || 1)) {\n        const searchRe = /<button[^>]*?data-action=\"placeTemplate\"[\\s\\S]*?<\\/button>/;\n        content = content.replace(searchRe, \"\");\n        contentChanged = true;\n      }\n    }\n    if (this.activity.target?.affects.type !== \"\" || this.targets.size !== 0) {\n      if (configSettings.autoItemEffects === \"applyRemove\" && content) {\n        const buttonRe = /<button[^>]*?data-action=\"midiApplyEffects\"[\\s\\S]*?<\\/button>/;\n        content = content?.replace(buttonRe, \"\");\n        contentChanged = true;\n      }\n    }\n    if (contentChanged) {\n      const update: ChatMessage.UpdateData = {\n        \"content\": content,\n        flags: { \"midi-qol\": { type: MESSAGE_TYPES.ITEM } },\n      };\n      await this.performThrottledUpdate(chatMessage, update);\n    }\n    // Template cleanup is now handled by setupTemplateCleanup in unSuspend\n\n    if (configSettings.autoRemoveSummonedCreature && this.summonedCreatures && this.summonedCreatures.length > 0) {\n      let origin = getConcentrationEffect(this.actor, this.item);\n      if (origin) {\n        for (let sc of this.summonedCreatures) {\n          //@ts-expect-error\n          sc.setFlag(\"dnd5e\", \"dependentOn\", origin.uuid);\n        }\n      } else {\n        // need to create an effect to remove the summoned creatures\n        const activityDuration = this.activity.duration;\n        let effectData: ActiveEffect.CreateData;\n        const summonString = i18n(\"DND5E.ActionSumm\") + \": \";\n        let effect = this.item.actor?.effects.find(ef => ef.name === (summonString + this.item.name));\n        if (effect) { // effect already applied\n          for (let sc of this.summonedCreatures) {\n            //@ts-expect-error\n            sc.setFlag(\"dnd5e\", \"dependentOn\", effect.uuid);\n          }\n        } else { // add an effect which will cause the summoned creature to be deleted\n          effectData = {\n            origin: this.item.uuid, //flag the effect as associated to the spell being cast\n            disabled: false,\n            img: this.item.img,\n            name: summonString + this.item.name,\n            duration: {},\n            flags: {\n              dae: {\n                stackable: \"noneName\"\n              },\n            },\n          }\n          const inCombat = !!(game.combat?.turns.some(combatant => combatant.token?.id === selfTarget?.id));\n          const converted = convertDuration(activityDuration, inCombat);\n          if (converted.type === \"none\") {\n            // Permanent/special duration - no expiry\n            effectData.duration = {\n              startRound: game.combat?.round,\n              startTurn: game.combat?.turn,\n              startTime: game.time?.worldTime\n            }\n          } else if (converted.type === \"seconds\") {\n            effectData.duration = { seconds: Math.max(converted.seconds ?? 1, 1), startTime: game.time?.worldTime }\n          } else if (converted.type === \"turns\") {\n            effectData.duration = {\n              rounds: converted.rounds,\n              turns: (converted.rounds ?? 0) > 0 ? converted.turns : Math.max(converted.turns ?? 1, 1),\n              startRound: game.combat?.round,\n              startTurn: game.combat?.turn,\n            }\n          }\n          const effects = await this.actor.createEmbeddedDocuments(\"ActiveEffect\", [effectData]);\n          if (effects.length > 0) {\n            for (let sc of this.summonedCreatures) {\n              //@ts-expect-error\n              sc.setFlag(\"dnd5e\", \"dependentOn\", effects[0].uuid);\n            }\n          }\n        }\n      }\n    }\n\n    if (configSettings.autoUndoTransformations && this.transformedActorUuids && this.transformedActorUuids.length > 0) {\n      let origin = getConcentrationEffect(this.actor, this.item);\n      if (origin) {\n        await origin.setFlag(\"midi-qol\", \"transformedActorUuids\", this.transformedActorUuids);\n        // Also set the flag on the polymorphed actors' concentration effects,\n        // since the player controls the polymorphed form and concentration breaks there\n        if (this.transformedActors) {\n          for (const polyActor of this.transformedActors) {\n            const polyConcentration = getConcentrationEffect(polyActor, this.item);\n            if (polyConcentration) {\n              await polyConcentration.setFlag(\"midi-qol\", \"transformedActorUuids\", this.transformedActorUuids);\n            }\n          }\n        }\n      } else {\n        // need to create an effect to remove the summoned creatures\n        const activityDuration = this.activity.duration;\n        let effectData: ActiveEffect.CreateData;\n        const transformString = i18n(\"DND5E.TRANSFORM.Action.Transform\") + \": \";\n        let effect = this.item.actor?.effects.find(ef => ef.name === (transformString + this.item.name));\n        if (effect) {\n          const transformedUuids = effect.getFlag(\"midi-qol\", \"transformedActorUuids\") ?? [];\n          await effect.setFlag(\"midi-qol\", \"transformedActorUuids\", [...transformedUuids, ...this.transformedActorUuids]);\n        } else { // add an effect which will cause the summoned creature to be deleted\n          effectData = {\n            origin: this.item.uuid, //flag the effect as associated to the spell being cast\n            disabled: false,\n            img: this.item.img,\n            name: transformString + this.item.name,\n            duration: {},\n            flags: {\n              dae: {\n                stackable: \"noneName\"\n              },\n              \"midi-qol\": { transformedActorUuids: this.transformedActorUuids }\n            },\n          }\n          const inCombat = !!(game.combat?.turns.some(combatant => combatant.token?.id === selfTarget?.id));\n          if (activityDuration?.units === \"inst\") {\n            // This seems wrong, however lots of dnd5e summons activities have a duration of inst - e.g. find familiar\n            effectData.duration = {\n              startRound: game.combat?.round,\n              startTurn: game.combat?.turn,\n              startTime: game.time?.worldTime\n            }\n            //@ts-expect-error CONFIG.DND5E\n          } else if (CONFIG.DND5E.permanentTimePeriods[activityDuration.units]) {\n            effectData.duration = {\n              startRound: game.combat?.round,\n              startTurn: game.combat?.turn,\n              startTime: game.time?.worldTime\n            }\n          } else {\n            const convertedDuration = convertDuration(activityDuration, inCombat);\n            if (convertedDuration.type === \"seconds\") {\n              effectData.duration = { seconds: Math.max(convertedDuration.seconds ?? 1, 1), startTime: game.time?.worldTime }\n            } else if (convertedDuration.type === \"turns\") {\n              effectData.duration = {\n                rounds: convertedDuration.rounds,\n                turns: (convertedDuration.rounds ?? 0) > 0 ? convertedDuration.turns : Math.max(convertedDuration.turns ?? 1, 1),\n                startRound: game.combat?.round,\n                startTurn: game.combat?.turn,\n              }\n            }\n          }\n          await this.actor.createEmbeddedDocuments(\"ActiveEffect\", [effectData]);\n        }\n      }\n    }\n\n    await this.callMidiHooks(\"midi-qol.postActiveEffects\");\n    // Call onUseMacro if not already called\n    if (configSettings.allowUseMacro && this.workflowOptions.noOnUseMacro !== true) {\n      await this.callMacros(this.item, this.onUseMacros?.getMacros(\"postActiveEffects\"), \"OnUse\", \"postActiveEffects\");\n      if (this.ammunition) await this.callMacros(this.ammunition, this.ammunitionOnUseMacros?.getMacros(\"postActiveEffects\"), \"OnUse\", \"postActiveEffects\");\n    }\n    if (this.aborted) return this.WorkflowState_Abort;  // TODO This is wrong\n\n    await this.callMidiHooks(\"midi-qol.RollComplete\");\n    if (this.aborted) return this.WorkflowState_Abort;  // TODO This is wrong\n    if (autoRemoveTargets !== \"none\") setTimeout(untargetDeadTokens, 500); // delay to let the updates finish\n    const inCombat = this.actor && isInCombat(this.actor);\n    let activeCombatants = game.combats?.combats.map(combat => combat.combatant?.token?.id)\n    const isTurn = activeCombatants?.includes(this.token?.id);\n    if (inCombat && isTurn && this.activity.activation?.type === \"action\" && !this.AoO) {\n      await setActionUsed(this.actor);\n    }\n    return this.WorkflowState_Cleanup;\n  }\n  async WorkflowState_Default(context: WorkflowContext = {}): Promise<WorkflowState> { return this.WorkflowState_Suspend };\n\n  initSaveResults() {\n    this.saves = new Set();\n    this.criticalSaves = new Set();\n    this.fumbleSaves = new Set();\n    this.failedSaves = this.activity.hasAttack ? new Set(this.hitTargets) : new Set(this.targets);\n    this.advantageSaves = new Set();\n    this.disadvantageSaves = new Set();\n    this.saveDisplayData = [];\n    this.saveResults = [];\n  };\n\n  public async checkAttackAdvantage() {\n    // Reset tracker so it can be safely re-called (e.g. after preAttackRoll hooks modify flags)\n    this.attackRollModifierTracker.reset();\n\n    // Add workflowOptions and rollOptions attribution first (before flag-based checks)\n    if (this.workflowOptions?.advantage) {\n      this.attackRollModifierTracker.advantage.add(\"workflowOptions\", i18n(\"midi-qol.WorkflowOptions\"));\n    }\n    if (this.workflowOptions?.disadvantage) {\n      this.attackRollModifierTracker.disadvantage.add(\"workflowOptions\", i18n(\"midi-qol.WorkflowOptions\"));\n    }\n    // Long range disadvantage (set in WorkflowState_ValidateRoll)\n    if (this.longRangeAttack) {\n      this.attackRollModifierTracker.disadvantage.add('range', 'Long Range');\n    }\n\n    await this.checkFlankingAdvantage();\n    if (this.flankingAdvantage) this.attackRollModifierTracker.advantage.add('flanking', i18n(\"midi-qol.Flanking\"));\n\n    // This should never happen\n    if (!this.actor) return;\n\n    const actType = this.activity.actionType || \"none\";\n    const firstTarget = this.targets.first();\n\n    // Determine ability for weapon attacks (mwak/rwak use str/dex)\n    let attackAbility: string | undefined;\n    if ([\"mwak\", \"rwak\"].includes(actType)) {\n      // @ts-expect-error no dnd5e-types\n      attackAbility = this.item?.abilityMod ?? \"\";\n      // @ts-expect-error no dnd5e-types\n      if (!attackAbility) attackAbility = this.activity.item?.system.properties?.has(\"fin\") ? \"dex\" : \"str\";\n    }\n\n    // Use computeAttackAdvantage for flag-based checks (actor flags + target grants)\n    await computeAttackAdvantage(\n      this.actor,\n      actType,\n      { workflow: this, item: this.item },\n      attackAbility,\n      this.attackRollModifierTracker\n    );\n\n    let conditionData;\n    // TODO Hidden should check the target to see if they notice them?\n    if (checkRule(\"invisAdvantage\") && checkRule(\"invisAdvantage\") !== \"none\" && firstTarget) {\n      // if we are using a proxy token to attack use that for hidden invisible\n      const invisibleToken = this.token ? hasCondition(this.token.actor as Actor, \"invisible\") : false;\n      const invisibleTarget = hasCondition(firstTarget.actor as Actor, \"invisible\");\n\n      // RAW 2014: Invisible condition explicitly grants adv/disadv; canSense used for non-invisible \"unseen\" cases\n      // RAW 2024: Only \"can you see the creature?\" matters (blindsight/truesight = can see; tremorsense = cannot see)\n      const isRAW2014 = checkRule(\"invisAdvantage\") === \"RAW2014\";\n      const tokenCanPerceive = isRAW2014 ? this.tokenCanSense?.has(firstTarget) : this.tokenCanSee?.has(firstTarget);\n      const targetCanPerceive = isRAW2014\n        ? (this.token && this.targetsCanSense?.has(this.token))\n        : (this.token && this.targetsCanSee?.has(this.token));\n\n      const invisAdvantage = isRAW2014 ? invisibleToken || !targetCanPerceive : !targetCanPerceive;\n      if (invisAdvantage) {\n        if (!targetCanPerceive) {\n          this.attackRollModifierTracker.advantage.add('Attacker not detected', 'Attacker not detected');\n          foundry.utils.setProperty(this.actor, \"flags.midi.evaluated.advantage.attack.invisible\", { value: true, effects: [\"Attacker not detected\"] });\n        }\n\n        if (invisibleToken && isRAW2014) {\n          this.attackRollModifierTracker.advantage.add('Attacker invisible', 'Attacker invisible');\n          foundry.utils.setProperty(this.actor, \"flags.midi.evaluated.advantage.attack.invisible\", { value: true, effects: [\"Invisible Attacker\"] });\n        }\n      }\n\n      const invisDisadvantage = isRAW2014 ? invisibleTarget || !tokenCanPerceive : !tokenCanPerceive;\n      if (invisDisadvantage) {\n        // Attacker can't see target so disadvantage\n        log(`Disadvantage given to ${this.actor.name} due to invisible target`, invisibleTarget, tokenCanPerceive);\n        if (invisibleTarget && isRAW2014) {\n          this.attackRollModifierTracker.disadvantage.add('invisible foe', 'Invisible foe');\n          foundry.utils.setProperty(this.actor, \"flags.midi.evaluated.disadvantage.attack.invisible\", { value: true, effects: [\"Invisible Defender\"] });\n        }\n        if (!tokenCanPerceive) {\n          this.attackRollModifierTracker.disadvantage.add('Defender not detected', 'Defender not detected');\n          foundry.utils.setProperty(this.actor, \"flags.midi.evaluated.disadvantage.attack.invisible\", { value: true, effects: [\"Defender not detected\"] });\n        }\n      }\n    }\n\n    // Check hidden\n    if (checkRule(\"hiddenAdvantage\") && checkRule(\"hiddenAdvantage\") !== \"none\" && firstTarget) {\n      if (checkRule(\"hiddenAdvantage\") === \"perceptive\" && installedModules.get(\"perceptive\")) {\n        //@ts-expect-error .api\n        const perceptiveApi = game.modules.get(\"perceptive\")?.api;\n        const tokenSpotted = await perceptiveApi?.isSpottedby(this.token, firstTarget, { LOS: false, Range: true, Effects: true, Hidden: false, canbeSpotted: true }) ?? true;\n        const targetSpotted = await perceptiveApi?.isSpottedby(firstTarget, this.token, { LOS: false, Range: true, Effects: true, Hidden: false, canbeSpotted: true }) ?? true;\n        if (!tokenSpotted) {\n          this.attackRollModifierTracker.advantage.add('Attacker hidden', 'Attacker hidden');\n          foundry.utils.setProperty(this.actor, \"flags.midi.evaluated.advantage.attack.hidden\", { value: true, effects: [\"Hidden Attacker\"] });\n        }\n        if (!targetSpotted) {\n          this.attackRollModifierTracker.disadvantage.add('Hidden foe', 'Hidden foe');\n          foundry.utils.setProperty(this.actor, \"flags.midi.evaluated.disadvantage.attack.hidden\", { value: true, effects: [\"Hidden Defender\"] });\n        }\n      }\n\n      if (checkRule(\"hiddenAdvantage\") === \"effect\") {\n        const hiddenToken = this.token ? hasCondition(this.token.actor as Actor, \"hidden\") : false;\n        const hiddenTarget = hasCondition(firstTarget.actor as Actor, \"hidden\");\n        if (hiddenToken) {\n          this.attackRollModifierTracker.advantage.add('Attacker hidden', 'Attacker hidden');\n          foundry.utils.setProperty(this.actor, \"flags.midi.evaluated.advantage.attack.hidden\", { value: true, effects: [\"Hidden Attacker\"] });\n        }\n        if (hiddenTarget) {\n          this.attackRollModifierTracker.disadvantage.add('Target hidden', 'Target hidden');\n          foundry.utils.setProperty(this.actor, \"flags.midi.evaluated.disadvantage.attack.hidden\", { value: true, effects: [\"Hidden Defender\"] });\n        }\n      }\n    }\n\n    // Nearby foe gives disadvantage on ranged attacks\n    if (checkRule(\"nearbyFoe\")) {\n      conditionData ??= createConditionData({ workflow: this, target: firstTarget, actor: this.actor });\n      const ignoreNearbyFoes = await evalAllConditionsAsync(this.actor, midiFlag(`ignoreNearbyFoes`), conditionData);\n      // @ts-expect-error no dnd5e-types\n      if (!ignoreNearbyFoes && ([\"rwak\", \"rsak\"].includes(actType) || (this.item.system.properties?.has(\"thr\") && actType == \"mwak\"))) {\n        let nearbyFoe: boolean = false;\n        if (this.token) {\n          if (actType !== \"mwak\") { // one of rwak/rsak\n            nearbyFoe = checkNearby(-1, getToken(this.token), configSettings.optionalRules.nearbyFoe, { includeIncapacitated: false, canSee: true });\n            // @ts-expect-error no dnd5e-types\n          } else if (this.item.system.properties?.has(\"thr\")) {\n            // @ts-expect-error no dnd5e-types\n            const meleeRange = this.item.system.range.reach ?? 5;\n            if (getDistance(this.token, firstTarget, { wallsBlock: false }) <= meleeRange) nearbyFoe = false;\n            else nearbyFoe = checkNearby(-1, getToken(this.token), configSettings.optionalRules.nearbyFoe, { includeIncapacitated: false, canSee: true });\n          }\n          if (nearbyFoe) {\n            if (debugEnabled > 0) warn(`checkAttackAdvantage | Ranged attack by ${this.actor.name} at disadvantage due to nearby foe`);\n            this.attackRollModifierTracker.disadvantage.add('nearbyFoe', 'Nearby foe');\n            foundry.utils.setProperty(this.actor, \"flags.midi.evaluated.disadvantage.attack.nearbyFoe\", { value: true, effects: [\"Nearby Foe\"] });\n          }\n        }\n      }\n    }\n\n    // @ts-expect-error no dnd5e-types\n    if (this.item.system.properties?.has(\"hvy\")) {\n      const failDisadvantageHeavy = this.actor.flags?.[MODULE_ID]?.fail?.disadvantage?.heavy;\n      if (failDisadvantageHeavy) conditionData ??= createConditionData({ workflow: this, target: firstTarget, actor: this.actor });\n      if (!failDisadvantageHeavy || !await evalAllConditionsAsync(this.actor, midiFlag(`fail.disadvantage.heavy`), conditionData)) {\n        if (safeGetGameSetting(\"dnd5e\", \"rulesVersion\") === \"modern\") {\n          // @ts-expect-error no dnd5e-types\n          if ((this.activity.actionType === \"mwak\" && this.actor.system.abilities?.str.value < 13) ||\n            // @ts-expect-error no dnd5e-types\n            (this.activity.actionType === \"rwak\" && this.actor.system.abilities?.dex.value < 13)) {\n            this.attackRollModifierTracker.disadvantage.add('heavy weapon', 'Heavy weapon');\n          }\n        } else if (safeGetGameSetting(\"dnd5e\", \"rulesVersion\") === \"legacy\") {\n          // @ts-expect-error no dnd5e-types\n          if ([\"tiny\", \"sm\"].includes(this.actor.system.traits?.size)) {\n            this.attackRollModifierTracker.disadvantage.add('small', 'Small creature');\n          }\n        }\n      }\n    }\n    // Frightened condition (2024 rules): disadvantage on attacks against the source of fear\n    if (firstTarget && safeGetGameSetting(\"dnd5e\", \"rulesVersion\") === \"modern\" && hasCondition(this.actor, \"frightened\")) {\n      for (const ef of this.actor.allApplicableEffects()) {\n        if (ef.disabled || !ef.statuses.has(\"frightened\")) continue;\n        const origin = ef.origin ? fromUuidSync(ef.origin) : undefined;\n        let sourceActor: Actor | undefined;\n        if (origin instanceof Actor) {\n          sourceActor = origin;\n        } else if (origin) {\n          let doc: any = origin;\n          while (doc && !(doc instanceof Actor)) doc = doc.parent;\n          if (doc instanceof Actor) sourceActor = doc;\n        }\n        if (sourceActor && firstTarget.actor?.uuid === sourceActor.uuid) {\n          this.attackRollModifierTracker.disadvantage.add('frightened', 'Frightened');\n          break;\n        }\n      }\n    }\n\n    await this.checkTargetAdvantage();\n  }\n\n  async processCriticalFlags() {\n    if (!this.actor) return; // in case a damage only workflow caused this.\n    /*\n    * Target grants flags for critical:\n    * flags.midi-qol.grants.critical.all\n    * flags.midi-qol.grants.critical.mwak/rwak/msak/rsak/other\n    * flags.midi-qol.grants.critical.range\n    * flags.midi-qol.grants.noCritical.all\n    * flags.midi-qol.grants.noCritical.mwak/rwak/msak/rsak/other\n    */\n    const attackType = this.activity?.actionType;\n    const trackerHadCritical = this.attackRollModifierTracker.critical.isForced;\n    const trackerHadNoCritical = this.attackRollModifierTracker.critical.isSuppressed;\n\n    // Check target grants.critical and grants.noCritical\n    // For multiple targets: crit if ANY target grants crit, no crit if ALL targets grant noCrit\n    if (this.hitTargets.size >= 1) {\n      // grants.critical - check if ANY target has this flag\n      for (const target of this.hitTargets) {\n        if (!target?.actor) continue;\n        const targetName = target?.name ?? target?.actor?.name ?? \"\";\n        const grants = target?.actor?.flags[MODULE_ID]?.grants?.critical ?? {};\n        const fails = target?.actor?.flags[MODULE_ID]?.fail?.critical ?? {};\n\n        // Special case: grants.critical.range\n        if (Number.isNumeric(grants.range) && getDistance(target, this.token, { wallsBlock: false }) <= Number(grants.range)) {\n          this.attackRollModifierTracker.critical.force('grants.critical.range', `${getFlagDisplayName('grants.critical.range')} (${targetName})`);\n        }\n\n        if (grants || fails) {\n          const conditionData = createConditionData({ workflow: this, target, actor: this.actor });\n\n          // Check grants.critical.all and grants.critical.{attackType}\n          if (await evalAllConditionsAsync(target.actor, midiFlag(`grants.critical.all`), conditionData)) {\n            this.attackRollModifierTracker.critical.force('grants.critical.all', `${getFlagDisplayName('grants.critical.all')} (${targetName})`);\n          }\n          if (attackType && await evalAllConditionsAsync(target.actor, midiFlag(`grants.critical.${attackType}`), conditionData)) {\n            this.attackRollModifierTracker.critical.force(`grants.critical.${attackType}`, `${getFlagDisplayName(`grants.critical.${attackType}`)} (${targetName})`);\n          }\n\n          // Deprecated fail.critical flags\n          if (await evalAllConditionsAsync(target.actor, midiFlag(`fail.critical.all`), conditionData)\n            || (attackType && await evalAllConditionsAsync(target.actor, midiFlag(`fail.critical.${attackType}`), conditionData))) {\n            console.warn(`midi-qol | processCriticalFlags | ${target.actor.name} flags.${MODULE_ID}.fail.critical is deprecated use flags.${MODULE_ID}.grants.noCritical.all/.attackType instead`);\n            this.attackRollModifierTracker.critical.suppress('fail.critical', `${getFlagDisplayName('fail.critical')} (${targetName})`);\n          }\n        }\n        if (this.attackRollModifierTracker.critical.isForced) break; // Found a target that grants crit, no need to check more\n      }\n\n      // grants.noCritical - check if ALL targets have this flag\n      let allTargetsGrantNoCrit = true;\n      const noCritTargets: string[] = [];\n      let noCritFlag = \"grants.noCritical.all\";\n      for (const target of this.hitTargets) {\n        if (!target?.actor) {\n          allTargetsGrantNoCrit = false;\n          break;\n        }\n        const targetName = target?.name ?? target?.actor?.name ?? \"\";\n        const conditionData = createConditionData({ workflow: this, target, actor: this.actor });\n        const hasNoCritAll = await evalAllConditionsAsync(target.actor, midiFlag(`grants.noCritical.all`), conditionData);\n        const hasNoCritType = attackType && await evalAllConditionsAsync(target.actor, midiFlag(`grants.noCritical.${attackType}`), conditionData);\n        if (!hasNoCritAll && !hasNoCritType) {\n          allTargetsGrantNoCrit = false;\n          break;\n        }\n        if (hasNoCritType) noCritFlag = `grants.noCritical.${attackType}`;\n        noCritTargets.push(targetName);\n      }\n      if (allTargetsGrantNoCrit && this.hitTargets.size > 0) {\n        this.attackRollModifierTracker.critical.suppress(noCritFlag, `${getFlagDisplayName(noCritFlag)} (${noCritTargets.join(\", \")})`);\n      }\n    }\n\n    // Tracker computes isCritical from all sources (grants.critical added above)\n    // Persist to chat card if state changed\n    this.persistFields({ isCritical: this.isCritical });\n\n    // Update roll with attribution and regenerate HTML if crit/noCrit flags changed\n    const criticalChanged = this.attackRollModifierTracker.critical.isForced !== trackerHadCritical;\n    const noCriticalChanged = this.attackRollModifierTracker.critical.isSuppressed !== trackerHadNoCritical;\n    if (this.attackRoll && (criticalChanged || noCriticalChanged)) {\n      addAttribution(this.attackRoll, this.attackAttribution);\n      this.attackRollHTML = await midiRenderAttackRoll(this.attackRoll);\n    }\n  }\n\n  async checkFlankingAdvantage(): Promise<boolean> {\n    if (!canvas) {\n      console.warn(\"midi-qol | checkFlankingAdvantage | abandoned - no canvas defined\")\n      return false;\n    }\n    this.flankingAdvantage = false;\n    if (this.item && !([\"mwak\", \"msak\"].includes(this.activity.actionType ?? \"\"))) return false;\n\n    const token = (fromUuidSync(this.tokenUuid) as TokenDocument)?.object;\n    const target = this.targets.first();\n    const flankingMode = checkRule(\"checkFlanking\") as string;\n    const isFlankedMode = [\"ceflanked\", \"ceflankedNoconga\", \"midiFlanked\", \"midiFlankedNoConga\"].includes(flankingMode);\n    const flankingBonusSetting = configSettings.optionalRules.flankingBonus ?? \"advantage\";\n\n    // Flanked modes: markFlanking applies the flanked status to the target.\n    if (isFlankedMode) {\n      if (flankingBonusSetting === \"advantage\") {\n        // Advantage mode: flanked status grants advantage via getFlankedStatusChanges\n        await markFlanking(token, target);\n      }\n      // Numeric mode: flanked status is visual-only; bonus computed in recordFlankingBonuses\n      return false;\n    }\n\n    // Flanking modes (advonly, ceonly, midiFlanking) from here.\n    if (flankingBonusSetting === \"advantage\") {\n      // markFlanking checks first target and applies attacker status for ceonly/midiFlanking\n      const needsFlanking = await markFlanking(token, target);\n      if (needsFlanking && this.actor) {\n        foundry.utils.setProperty(this.actor, \"flags.midi.evaluated.advantage.attack.flanking\", { value: true, effects: [\"Flanking\"] });\n      }\n      if (flankingMode === \"advonly\") {\n        this.flankingAdvantage = needsFlanking;\n      }\n      return needsFlanking;\n    }\n\n    // Numeric bonus: nothing to do here — per-target flanking bonus\n    // is computed and recorded on target descriptors in recordFlankingBonuses(),\n    // which runs after target descriptors are captured (in WorkflowState_AttackRollComplete).\n    return false;\n  }\n\n  async recordFlankingBonuses(): Promise<void> {\n    // Flanking only applies to melee attacks\n    if (!([\"mwak\", \"msak\"].includes(this.activity?.actionType ?? \"\"))) return;\n    const flankingBonusSetting = configSettings.optionalRules.flankingBonus ?? \"advantage\";\n    if (flankingBonusSetting === \"advantage\") return;\n    const bonusValue = Number(flankingBonusSetting) || 0;\n    if (!bonusValue) return;\n    const flankingMode = checkRule(\"checkFlanking\") as string;\n    const isFlankingMode = [\"advonly\", \"ceonly\", \"midiFlanking\"].includes(flankingMode);\n    const isFlankedMode = [\"ceflanked\", \"ceflankedNoconga\", \"midiFlanked\", \"midiFlankedNoConga\"].includes(flankingMode);\n    if (!isFlankingMode && !isFlankedMode) return;\n    if (isFlankingMode && !this.token) return;\n\n    const allDescriptors = this.targetDescriptors;\n    if (!allDescriptors) return;\n    let modified = false;\n    for (const t of this.targets) {\n      const hasBonus = isFlankingMode\n        ? await computeFlankingStatus(this.token!, t)\n        : await computeFlankedStatus(t);\n      if (hasBonus) {\n        const targetDescriptor = getTargetDescriptor(t.actor?.uuid ?? \"\", allDescriptors) as CombinedTargetDescriptor | undefined;\n        if (targetDescriptor) {\n          targetDescriptor.flankingBonus = bonusValue;\n          modified = true;\n        }\n      }\n    }\n    if (modified) {\n      this.targetDescriptors = allDescriptors; // trigger setter to persist\n    }\n  }\n\n  async checkTargetAdvantage() {\n    // Note: Target grants flags and actor noAdvantage/noDisadvantage flags\n    // are now handled by computeAttackAdvantage in checkAttackAdvantage()\n    // This method only handles special rules that require game logic\n\n    if (!this.item) return;\n    if (!this.targets?.size) return;\n    const actionType = this.activity.actionType ?? \"\";\n    const firstTargetDocument = getTokenDocument(this.targets.first());\n    const firstTarget = getToken(firstTargetDocument);\n    if (!firstTargetDocument || !firstTarget) return;\n\n    // Check nearby ally disadvantage for ranged attacks\n    if ((checkRule(\"nearbyAllyRanged\") as number) > 0 && [\"rwak\", \"rsak\"].includes(actionType)) {\n      if ((firstTargetDocument.width ?? 1) * (firstTargetDocument.height ?? 1) < Number(checkRule(\"nearbyAllyRanged\"))) {\n        const nearbyAlly = checkNearby(-1, firstTarget, (canvas.dimensions?.distance ?? 5)); // targets near a friend that is not too big\n        // TODO include thrown weapons in check\n        if (nearbyAlly) {\n          if (debugEnabled > 0) warn(\"checkTargetAdvantage | ranged attack with disadvantage because target is near a friend\");\n          this.attackRollModifierTracker.disadvantage.add('nearbyAlly', 'Nearby Ally');\n          foundry.utils.setProperty(this.actor, \"flags.midi.evaluated.disadvantage.attack.nearbyAlly\", { value: true, effects: [\"Nearby Ally\"] });\n        }\n      }\n    }\n  }\n\n  async triggerTargetMacros(triggerList: string[], targets: Set<Token.Implementation> = this.targets, options: { saved?: boolean } = {}) {\n    let results: Record<string, unknown[]> = {};\n    for (let target of targets) {\n      results[target.document.uuid] = [];\n      let result = results[target.document.uuid];\n      const actorOnUseMacros = target.actor?.flags?.[MODULE_ID]?.onUseMacroParts ?? new OnUseMacros();\n      const wasAttacked = !!this.activity.attack;\n      const wasHit = (this.activity ? wasAttacked : true) && (this.hitTargets?.has(target) || this.hitTargetsEC?.has(target));\n      const wasMissed = (this.activity ? wasAttacked : true) && !this.hitTargets?.has(target) && !this.hitTargetsEC?.has(target);\n      const wasDamaged = this.damageList\n        && (this.hitTargets.has(target) || this.hitTargetsEC.has(target))\n        && (this.damageList.some(dl => dl.targetUuid === target.document.uuid && (dl.hpDamage > 0 || dl.tempDamage > 0)));\n\n      if (this.targets.has(target) && triggerList.includes(\"isTargeted\")) {\n        if (triggerList.includes(\"isTargeted\")) {\n          result.push(...await this.callMacros(this.item,\n            actorOnUseMacros?.getMacros(\"isTargeted\"),\n            \"TargetOnUse\",\n            \"isTargeted\",\n            { actor: target.actor, token: target })\n          );\n        }\n      }\n      if (wasAttacked && triggerList.includes(\"isPreAttacked\")) {\n        result.push(...await this.callMacros(this.item,\n          actorOnUseMacros?.getMacros(\"isPreAttacked\"),\n          \"TargetOnUse\",\n          \"isPreAttacked\",\n          { actor: target.actor, token: target })\n        );\n      }\n\n      if (wasAttacked && triggerList.includes(\"isAttacked\")) {\n        result.push(...await this.callMacros(this.item,\n          actorOnUseMacros?.getMacros(\"isAttacked\"),\n          \"TargetOnUse\",\n          \"isAttacked\",\n          { actor: target.actor, token: target })\n        );\n      }\n      if (triggerList.includes(\"postTargetEffectApplication\")) {\n        result.push(...await this.callMacros(this.item,\n          actorOnUseMacros?.getMacros(\"postTargetEffectApplication\"),\n          \"TargetOnUse\",\n          \"postTargetEffectApplication\",\n          { actor: target.actor, token: target })\n        );\n      }\n      // 13.0.39 isDamaged Hook is always called inside processDamageRoll, so don't do it here\n      // If auto applying damage can do a better test when damage application has been calculdated\n      // if (wasDamaged && triggerList.includes(\"isDamaged\") && !configSettings.autoApplyDamage.toLocaleLowerCase().includes(\"yes\")) {\n      //  result.push(...await this.callMacros(this.item,\n      //    actorOnUseMacros?.getMacros(\"isDamaged\"),\n      //    \"TargetOnUse\",\n      //    \"isDamaged\",\n      //    { actor: target.actor, token: target })\n      //  );\n      // }\n      if (wasHit && triggerList.includes(\"isHit\")) {\n        result.push(...await this.callMacros(this.item,\n          actorOnUseMacros?.getMacros(\"isHit\"),\n          \"TargetOnUse\",\n          \"isHit\",\n          { actor: target.actor, token: target })\n        );\n      }\n      if (wasMissed && triggerList.includes(\"isMissed\")) {\n        result.push(...await this.callMacros(this.item,\n          actorOnUseMacros?.getMacros(\"isMissed\"),\n          \"TargetOnUse\",\n          \"isMissed\",\n          { actor: target.actor, token: target })\n        );\n      }\n      if (triggerList.includes(\"preTargetDamageApplication\")) {\n        result.push(...await this.callMacros(this.item,\n          actorOnUseMacros?.getMacros(\"preTargetDamageApplication\"),\n          \"TargetOnUse\",\n          \"preTargetDamageApplication\",\n          { actor: target.actor, token: target })\n        );\n      }\n\n      if (this.activityHasSave && triggerList.includes(\"preTargetSave\")) {\n        result.push(...await this.callMacros(this.item,\n          actorOnUseMacros?.getMacros(\"preTargetSave\"),\n          \"TargetOnUse\",\n          \"preTargetSave\",\n          { actor: target.actor, token: target })\n        );\n      }\n\n      if (this.activityHasSave && triggerList.includes(\"isAboutToSave\")) {\n        result.push(...await this.callMacros(this.item,\n          actorOnUseMacros?.getMacros(\"isAboutToSave\"),\n          \"TargetOnUse\",\n          \"isAboutToSave\",\n          { actor: target.actor, token: target })\n        );\n      }\n\n      if (target.actor?.uuid !== this.actor.uuid && triggerList.includes(\"1Reaction\")) {\n      }\n      if (this.activityHasSave && triggerList.includes(\"isSaveSuccess\") && (this.saves.has(target) || options.saved === true)) {\n        result.push(...await this.callMacros(this.item,\n          actorOnUseMacros?.getMacros(\"isSaveSuccess\"),\n          \"TargetOnUse\",\n          \"isSaveSuccess\",\n          { actor: target.actor, token: target })\n        );\n      }\n      if (this.activityHasSave && triggerList.includes(\"isSaveFailure\") && (!this.saves.has(target) || options.saved === false)) {\n        result.push(...await this.callMacros(this.item,\n          actorOnUseMacros?.getMacros(\"isSaveFailure\"),\n          \"TargetOnUse\",\n          \"isSaveFailure\",\n          { actor: target.actor, token: target })\n        );\n      }\n      if (this.activityHasSave && triggerList.includes(\"isSave\")) {\n        result.push(...await this.callMacros(this.item,\n          actorOnUseMacros?.getMacros(\"isSave\"),\n          \"TargetOnUse\",\n          \"isSave\",\n          { actor: target.actor, token: target })\n        );\n      }\n    }\n    return results;\n  }\n\n  async callMidiHooks(...hookNames: string[]): Promise<void> {\n    for (const hookName of hookNames) {\n      await asyncHooksCallAll(hookName, this);\n      if (this.item) await asyncHooksCallAll(`${hookName}.${this.item.uuid}`, this);\n      if (this.activity) await asyncHooksCallAll(`${hookName}.${this.activity.uuid}`, this);\n    }\n  }\n\n  async callCancellableHooks(hookName: string): Promise<boolean> {\n    if (await asyncHooksCall(hookName, this) === false) return false;\n    if (this.item && await asyncHooksCall(`${hookName}.${this.item.uuid}`, this) === false) return false;\n    if (this.activity && await asyncHooksCall(`${hookName}.${this.activity.uuid}`, this) === false) return false;\n    if (await asyncHooksCall(`${hookName}.${this.id}`, this) === false) return false;\n    const premadesHook = hookName.replace(\"midi-qol.\", \"midi-qol.premades.\");\n    if (await asyncHooksCall(premadesHook, this) === false) return false;\n    if (this.item && await asyncHooksCall(`${premadesHook}.${this.item.uuid}`, this) === false) return false;\n    if (this.activity && await asyncHooksCall(`${premadesHook}.${this.activity.uuid}`, this) === false) return false;\n    if (await asyncHooksCall(`${premadesHook}.${this.id}`, this) === false) return false;\n    return true;\n  }\n\n  async expireTargetEffects(expireList: string[]) {\n    if (debugEnabled > 0) warn(`expireTargetEffects | ${expireList}`)\n    for (let target of this.targets) {\n      const expiryReason: string[] = [];\n      const appliedEffects = getAppliedEffects(target.actor, { includeEnchantments: true });\n      if (!appliedEffects) continue; // nothing to expire\n      const expiredEffects: (string | null)[] = appliedEffects.filter(ef => {\n        let wasExpired = false;\n        const specialDuration = ef.flags?.dae?.specialDuration;\n        if (!specialDuration) return false;\n        const wasAttacked = this.activity.attack;\n        //TODO this test will fail for damage only workflows - need to check the damage rolled instead\n        const wasHit = (this.item ? wasAttacked : true) && (this.hitTargets?.has(target) || this.hitTargetsEC?.has(target));\n        const wasDamaged = this.damageList\n          // consider removing this - by having it here hand editing hp wont expire effects\n          // but any damage application by an item will get picked up in applyTokenDamageMany\n          // so this is only relevant if you are not auto applying damage\n          && (this.hitTargets.has(target) || this.hitTargetsEC.has(target))\n          && (this.damageList.find(dl => dl.targetUuid === target.document.uuid && dl.hpDamage > 0));\n        const wasHealed = this.damageList && (this.damageList.find(dl => dl.targetUuid === target.document.uuid && dl.hpDamage < 0))\n        //TODO this is going to grab all the special damage types as well which is no good.\n        if (wasAttacked && expireList.includes(\"isAttacked\") && specialDuration.includes(\"isAttacked\")) {\n          wasExpired = true;\n          expiryReason.push(\"isAttacked\")\n        }\n        if (wasHit && this.isCritical && expireList.includes(\"isAttacked\") && specialDuration.includes(\"isHitCritical\")) {\n          wasExpired = true;\n          expiryReason.push(\"isHitCritical\")\n        }\n        // If auto applying damage can do a better test when damage application has been calculdated\n        if (wasDamaged && expireList.includes(\"isDamaged\") && !configSettings.autoApplyDamage.toLocaleLowerCase().includes(\"yes\")\n          && specialDuration.includes(\"isDamaged\")) {\n          wasExpired = true;\n          expiryReason.push(\"isDamaged\");\n        }\n        // If auto applying damage can do a better test when damage application has been calculdated\n        if (wasHealed && expireList.includes(\"isHealed\") && !configSettings.autoApplyDamage.toLocaleLowerCase().includes(\"yes\")\n          && specialDuration.includes(\"isHealed\")) {\n          wasExpired = true;\n          expiryReason.push(\"isHealed\");\n        }\n        if (wasHit && expireList.includes(\"isHit\") && specialDuration.includes(\"isHit\")) {\n          wasExpired = true;\n          expiryReason.push(\"isHit\");\n\n        }\n        if ((target.actor?.uuid !== this.actor.uuid && expireList.includes(\"1Reaction\") && specialDuration.includes(\"1Reaction\"))) {\n          wasExpired = true;\n          expiryReason.push(\"1Reaction\");\n        }\n        if (this.rawDamageDetail) for (let dt of this.rawDamageDetail) {\n          if (expireList.includes(`isDamaged`) && (wasDamaged || dt.type === \"healing\") && specialDuration.includes(`isDamaged.${dt.type}`)) {\n            wasExpired = true;\n            expiryReason.push(`isDamaged.${dt.type}`);\n            break;\n          }\n        }\n        if (!this.activity) return wasExpired;\n        if ((this.activity.save || this.activity.check) && expireList.includes(\"isSaveSuccess\") && specialDuration.includes(`isSaveSuccess`) && this.saves.has(target)) {\n          wasExpired = true;\n          expiryReason.push(`isSaveSuccess`);\n        }\n        if ((this.activity.save || this.activity.check) && expireList.includes(\"isSaveFailure\") && specialDuration.includes(`isSaveFailure`) && !this.saves.has(target)) {\n          wasExpired = true;\n          expiryReason.push(`isSaveFailure`);\n        }\n        if ((this.activity.save || this.activity.check) && expireList.includes(\"isSave\") && specialDuration.includes(`isSave`)) {\n          wasExpired = true;\n          expiryReason.push(`isSave`);\n        }\n        const abl = this.activity.save?.ability ?? this.activity.check?.ability;\n        if ((this.activity.save || this.activity.check) && expireList.includes(`isSaveSuccess`) && specialDuration.includes(`isSaveSuccess.${abl}`) && this.saves.has(target)) {\n          wasExpired = true;\n          expiryReason.push(`isSaveSuccess.${abl}`);\n        };\n        if ((this.activity.save || this.activity.check) && expireList.includes(`isSaveFailure`) && specialDuration.includes(`isSaveFailure.${abl}`) && !this.saves.has(target)) {\n          wasExpired = true;\n          expiryReason.push(`isSaveFailure.${abl}`);\n        };\n        if ((this.activity.save || this.activity.check) && expireList.includes(`isSave`) && specialDuration.includes(`isSave.${abl}`)) {\n          wasExpired = true;\n          expiryReason.push(`isSave.${abl}`);\n        };\n        return wasExpired;\n      }).map(ef => ef.uuid);\n      if (expiredEffects.length > 0) {\n        await timedAwaitExecuteAsGM(\"removeEffectUuids\", {\n          actorUuid: target.actor?.uuid,\n          effects: expiredEffects,\n          options: { \"expiry-reason\": `midi-qol:${expiryReason}` }\n        });\n      }\n    }\n  }\n\n  getDamageBonusMacros(): string | undefined {\n    const actorMacros = this.actor.getFlag(\"dnd5e\", \"DamageBonusMacro\");\n    const itemMacros = this.onUseMacros?.getMacros(\"damageBonus\")\n    if (!itemMacros?.length) return actorMacros;\n    if (!actorMacros?.length) return itemMacros;\n    return `${actorMacros},${itemMacros}`;\n  }\n\n  async rollBonusDamage(damageBonusMacro: string) {\n    const extraDamages = (await this.callMacros(this.item, damageBonusMacro, \"DamageBonus\", \"DamageBonus\"))?.deepFlatten();\n    if (!extraDamages) return;\n    let rolls: Roll[] = [];\n    try {\n      for (let damageEntry of extraDamages) {\n        if (!damageEntry || typeof damageEntry !== \"object\") continue;\n        if (damageEntry instanceof Roll) {\n          rolls.push(damageEntry);\n        } else {\n          let { damageRoll, damageType, flavor } = damageEntry as DamageBonusMacroSingleResult;\n          if (!damageRoll) continue;\n          damageType = getDamageType(damageType);\n          if (!damageType && flavor && getDamageType(flavor)) damageType = getDamageType(flavor);\n          // @ts-expect-error no dnd5e-types\n          if (!damageType && this.damageRolls) damageType = this.damageRolls[0].options?.type;\n          if (!damageType) damageType = MidiQOL.MQdefaultDamageType;\n          const rollOptions = {\n            type: damageType,\n            flavor: flavor ?? damageType\n          }\n          // @ts-expect-error no dnd5e-types\n          rolls.push(await new CONFIG.Dice.DamageRoll(damageRoll, this.item.getRollData() ?? this.actor.getRollData(), rollOptions).evaluate());\n        }\n      }\n      await this.setBonusDamageRolls(rolls);\n    } catch (err) {\n      const message = `midi-qol | rollBonusDamage | error in evaluating${extraDamages} in bonus damage`\n      TroubleShooter.recordError(err, message);\n      console.warn(message, err);\n      this.bonusDamageRolls = undefined;\n      this.rawBonusDamageDetail = [];\n    }\n    if (this.bonusDamageRolls && this.workflowOptions?.damageRollDSN !== false) {\n      await displayDSNForRoll(this.bonusDamageRolls, \"damageRoll\");\n    }\n    return;\n  }\n\n  // TODO: Kill?\n  // macroDataToObject(macroData: any): any {\n  //   const data = macroData\n  //   for (let documentsName of [\"targets\", \"failedSaves\", \"criticalSaves\", \"fumbleSaves\", \"saves\", \"superSavers\", \"semiSuperSavers\"]) {\n  //     delete data[documentsName];\n  //   }\n  //   data.actorUuid = data.actor?.uuid;\n  //   delete data.actor;\n  //   data.itemUuid = data.item?.uuid;\n  //   delete data.item;\n  //   delete data.workflow;\n  //   return data;\n  // }\n\n  getSafeMacroData(item?: Item.Implementation, options: any = {}): MidiMacroData {\n    const niceData = this.getMacroData(item, options);\n    let naughtyFields = [\"actor\", \"workflow\", \"targets\", \"failedSaves\", \"criticalSaves\", \"fumbleSaves\", \"hitTargets\", \"hitTargetsEC\", \"saves\", \"superSavers\", \"semiSuperSavers\"];\n    for (let field of naughtyFields) delete niceData[field];\n    return niceData;\n  }\n\n  getMacroData(item?: Item, options: any = {}): MidiMacroData {\n    if (!item) item = this.item;\n    let targets: TokenDocument[] = [];\n    let targetUuids: string[] = []\n    let failedSaves: TokenDocument[] = [];\n    let criticalSaves: TokenDocument[] = [];\n    let criticalSaveUuids: string[] = [];\n    let fumbleSaves: TokenDocument[] = [];\n    let fumbleSaveUuids: string[] = [];\n    let failedSaveUuids: string[] = [];\n    let hitTargets: TokenDocument[] = [];\n    let hitTargetsEC: TokenDocument[] = [];\n    let hitTargetUuidsEC: string[] = [];\n    let hitTargetUuids: string[] = [];\n    let saves: TokenDocument[] = [];\n    let saveUuids: string[] = [];\n    let superSavers: TokenDocument[] = [];\n    let superSaverUuids: string[] = [];\n    let semiSuperSavers: TokenDocument[] = [];\n    let semiSuperSaverUuids: string[] = [];\n    for (let target of this.targets) {\n      targets.push(target.document);\n      targetUuids.push(target.document.uuid);\n    }\n    for (let save of this.saves) {\n      saves.push(save.document);\n      saveUuids.push(save.document.uuid);\n    }\n    for (let hit of this.hitTargets) {\n      hitTargets.push(hit.document);\n      hitTargetUuids.push(hit.document.uuid);\n    }\n    for (let hit of this.hitTargetsEC) {\n      hitTargetsEC.push(hit.document);\n      hitTargetUuidsEC.push(hit.document.uuid);\n    }\n\n    for (let failed of this.failedSaves) {\n      failedSaves.push(failed.document);\n      failedSaveUuids.push(failed.document.uuid);\n    }\n    for (let critical of this.criticalSaves) {\n      criticalSaves.push(critical.document);\n      criticalSaveUuids.push(critical.document.uuid);\n    }\n    for (let fumble of this.fumbleSaves) {\n      fumbleSaves.push(fumble.document);\n      fumbleSaveUuids.push(fumble.document.uuid);\n    }\n    for (let save of this.superSavers) {\n      superSavers.push(save.document);\n      superSaverUuids.push(save.document.uuid);\n    };\n    for (let save of this.semiSuperSavers) {\n      semiSuperSavers.push(save.document);\n      semiSuperSaverUuids.push(save.document.uuid);\n    };\n    const itemData = (item?.toObject(false) ?? {}) as Item.Source & { uuid?: string };\n    itemData.uuid = item?.uuid; // provide the uuid so the actual item can be recovered\n    //@ts-expect-error no dnd5e-types\n    Object.defineProperty(itemData, \"actionType\", { get() { return item?.actionType } });\n    return {\n      actor: this.actor,\n      actorData: this.actor.toObject(false),\n      actorUuid: this.actor.uuid,\n      advantage: this.advantage,\n      attackD20: this.diceRoll,\n      attackRoll: this.attackRoll,\n      attackTotal: this.attackTotal,\n      bonusDamageDetail: this.rawBonusDamageDetail,\n      bonusDamageHTML: this.bonusDamageHTML,\n      bonusDamageRolls: this.bonusDamageRolls,\n      bonusDamageRoll: this.bonusDamageRoll,\n      bonusDamageTotal: this.bonusDamageTotal,\n      criticalSaves,\n      criticalSaveUuids,\n      damageDetail: this.rawDamageDetail,\n      damageList: this.damageList,\n      damageRoll: this.damageRoll,\n      damageRolls: this.damageRolls,\n      damageTotal: this.damageTotal,\n      diceRoll: this.diceRoll,\n      disadvantage: this.disadvantage,\n      event: this.rollOptions.event,\n      failedSaves,\n      failedSaveUuids,\n      fumbleSaves,\n      fumbleSaveUuids,\n      hitTargets,\n      hitTargetsEC,\n      hitTargetUuids,\n      hitTargetUuidsEC,\n      id: this.id,\n      isCritical: this.rollOptions.isCritical || this.isCritical || this.workflowOptions.isCritical,\n      isFumble: this.isFumble,\n      item: itemData,\n      itemCardUuid: this.itemCardUuid,\n      itemData,\n      itemUuid: item?.uuid,\n      otherDamageDetail: this.rawOtherDamageDetail,\n      otherDamageList: this.otherDamageList,\n      otherDamageTotal: this.otherDamageTotal,\n      rollData: (item ?? this.actor)?.getRollData() ?? {},\n      rollOptions: this.rollOptions,\n      saves,\n      saveUuids,\n      semiSuperSavers,\n      semiSuperSaverUuids,\n      castLevel: this.spellLevel,\n      spellLevel: this.spellLevel,\n      superSavers,\n      superSaverUuids,\n      targets,\n      targetUuids,\n      templateId: this.templateId, // deprecated\n      templateUuid: this.templateUuid, // first template UUID (backward compat)\n      templateUuids: this.templateUuids, // all template UUIDs\n      tokenUuid: this.tokenUuid,\n      utilityRoll: this.utilityRoll,\n      utilityRolls: this.utilityRolls,\n      uuid: this.itemUuid, // deprecated\n      workflowOptions: this.workflowOptions,\n      castData: this.castData,\n      workflow: this,\n      workflowId: this.id\n    }\n  }\n\n  async callMacros(\n    item: Item.Implementation | undefined,\n    macros: string | undefined,\n    tag: string,\n    macroPass: string,\n    options: AnyObject = {}\n  ): Promise<any[]> {\n    if (!macros || macros?.length === 0) return [];\n    const macroNames = macros.split(\",\").map(s => s.trim());\n    let values: Promise<DamageBonusMacroResult | any>[] = [];\n    const macroData = this.getMacroData(item ?? this.item);\n    macroData.workflow = this;\n    macroData.options = options;\n    macroData.tag = tag;\n    macroData.macroPass = macroPass;\n    this.macroPass = macroPass;\n    this.tag = tag;\n    if (debugEnabled > 1) {\n      log(\"callMacros | calling\", macros, \"for\", macroPass, \"with\", macroData);\n    }\n    for (let macro of macroNames) {\n      if (macroNames.length > 0 && debugEnabled > 0) {\n        warn(`callMacro | \"${macro}\" called for ${macroPass} ${item?.name} ${item?.uuid}`);\n      }\n      values.push(this.callMacro(item, macro, macroData, options).catch((err) => {\n        const message = `midi-qol | called macro error in ${item?.name} ${item?.uuid} macro ${macro}`;\n        console.warn(message, err);\n        TroubleShooter.recordError(err, message);\n        return;\n      }));\n      if (this.activity.otherActivity) {\n        values.push(this.callMacro(item, macro, macroData, foundry.utils.mergeObject(options, { otherActivityOnly: true }, { inplace: false })).catch((err) => {\n          const message = `midi-qol | called macro error in ${item?.name} ${item?.uuid} macro ${macro}`;\n          console.warn(message, err);\n          TroubleShooter.recordError(err, message);\n          return;\n        }));\n\n      }\n    }\n    let results: Array<DamageBonusMacroResult | any> = await Promise.allSettled(values);\n    if (debugEnabled === 1 && results.length) warn(\"callMacros | macro data \", macroData);\n    results = results.map(p => p.value);\n    return results;\n  }\n\n\n  /**\n   * Parse the macro name and resolve context from UUID if provided.\n   */\n  private async parseCallMacroContext(\n    macroName: string,\n    item: Item.Implementation | undefined,\n    options: AnyObject\n  ): Promise<CallMacroContext | undefined> {\n    const [name, uuid] = macroName?.trim().split(\"|\") ?? [];\n    if (!name) return undefined;\n\n    let macroItem: Item.Implementation | Item.InitializedData | undefined = item;\n    let macroActivity: Activity | undefined = this.activity;\n    const actorToUse = (options.actor as Actor.Implementation | undefined) ?? this.actor;\n\n    // Resolve entity from UUID if provided\n    if (uuid?.length > 0) {\n      const macroEntity = await fromUuid(uuid) as any;\n      if (macroEntity) {\n        if (macroEntity instanceof ActiveEffect) {\n          if (macroEntity.parent instanceof Item) macroItem = macroEntity.parent;\n        } else if (macroEntity instanceof Item) {\n          macroItem = macroEntity;\n        } else if (macroEntity.item) { // Activity\n          macroActivity = macroEntity;\n          macroItem = macroEntity.item;\n        }\n      }\n    }\n\n    // Handle otherActivityOnly option\n    if (options.otherActivityOnly) {\n      if (!this.activity.otherActivity) return undefined;\n      if (name !== \"ActivityMacro\" && !name.startsWith(\"ActivityMacro-\")) return undefined;\n      macroActivity = this.activity.otherActivity;\n      macroItem = this.item;\n    }\n\n    return { name, uuid, macroItem, macroActivity, actorToUse };\n  }\n\n  /**\n   * Resolve a function.* macro specification.\n   */\n  private resolveFunctionMacro(name: string, context: CallMacroContext): ResolvedMacro {\n    const func = name.replace(\"function.\", \"\").trim();\nreturn {\n      item: context.macroItem,\n      macroActivity: context.macroActivity,\n      macroData: {\n        name: \"function call\",\n        type: \"script\",\n        command: `return await ${func}({ speaker, actor, token, character, item, rolledItem, macroItem, args, scope, workflow })`\n      }\n    };\n  }\n\n  /**\n   * Resolve an ItemMacro specification, with DAE itemData fallback.\n   */\n  private async resolveItemMacroCall(name: string, context: CallMacroContext): Promise<ResolvedMacro | undefined> {\n    const { uuid, macroItem, actorToUse } = context;\n\n    // Try standard resolution first\n    const resolved = await resolveItemMacro(name, { actor: actorToUse, originItem: macroItem as Item.Implementation });\n    if (resolved) {\n      return {\n        item: resolved.item,\n        macroActivity: context.macroActivity,\n        macroData: resolved.macroData,\n        sourceItemUuid: resolved.item?.uuid\n      };\n    }\n\n    // DAE itemData fallback - look for item data stored in effect flags\n    if (actorToUse instanceof Actor && uuid) {\n      const itemData = resolveDAEItemData(actorToUse, uuid);\n      if (itemData) {\n        return {\n          item: itemData,\n          macroActivity: context.macroActivity,\n          macroData: itemData?.flags?.dae?.macro ?? itemData?.flags?.itemacro?.macro,\n          // @ts-expect-error uuid may not be on data\n          sourceItemUuid: itemData?.uuid\n        };\n      }\n    }\n\n    console.warn(\"midi-qol | callMacro | No item for\", name);\n    return undefined;\n  }\n\n  /**\n   * Resolve an ActivityMacro specification.\n   */\n  private async resolveActivityMacroCall(name: string, context: CallMacroContext): Promise<ResolvedMacro | undefined> {\n    const { macroItem, macroActivity } = context;\n\n    // Workflow-specific guard: ActivityMacro-id must match current activity\n    if (name.startsWith(\"ActivityMacro-\")) {\n      const activityId = name.split(\"-\").slice(1).join(\"-\");\n      if (!macroActivity || activityId !== macroActivity?.id) return undefined;\n    }\n\n    const resolved = await resolveActivityMacro(name, {\n      originItem: macroItem as Item.Implementation,\n      originActivity: macroActivity\n    });\n\n    if (resolved) {\n      return {\n        item: resolved.item,\n        macroActivity: resolved.activity,\n        macro: resolved.macro,\n        sourceItemUuid: resolved.item?.uuid\n      };\n    }\n    return undefined;\n  }\n\n  /**\n   * Resolve a world or compendium macro.\n   */\n  private async resolveWorldMacro(name: string, context: CallMacroContext): Promise<ResolvedMacro | undefined> {\n    const macroName = name.startsWith(\"Macro.\") ? name.slice(6) : name;\n    let macro = game.macros?.getName(macroName);\n\n    if (!macro) {\n      const doc = await fromUuid(macroName);\n      if (doc instanceof Item) {\n        return {\n          item: doc,\n          macroActivity: context.macroActivity,\n          macroData: doc.flags?.dae?.macro ?? doc.flags?.itemacro?.macro,\n          sourceItemUuid: doc.uuid\n        };\n      } else if (doc instanceof Macro) {\n        macro = doc as unknown as typeof macro;\n      }\n    }\n\n    if (macro?.type === \"chat\") {\n      macro.execute();\n      return undefined; // Chat macros handle themselves\n    }\n\n    return macro ? { item: context.macroItem, macroActivity: context.macroActivity, macro } : undefined;\n  }\n\n  /**\n   * Create a Macro instance from macro data and execute it with the given scope.\n   * @param resolved - The resolved macro specification\n   * @param workflowContext - Workflow context data passed to macro as args[0] and midiData\n   * @param options - Call options\n   * @param rolledItem - The item that was rolled to trigger this macro\n   */\n  private executeMacroWithScope(\n    resolved: ResolvedMacro,\n    workflowContext: MidiMacroData,\n    options: AnyObject,\n    rolledItem: Item.Implementation | undefined\n  ): Promise<any> | void | undefined {\n    const macro = this.createMacroFromResolved(resolved);\n    if (!macro?.command) return undefined;\n\n    const actorToUse = (options.actor as Actor.Implementation | undefined) ?? this.actor;\n    const scope: Macro.UnknownScope = {\n      workflow: this,\n      rolledActivity: this.activity,\n      macroActivity: resolved.macroActivity,\n      item: rolledItem,\n      rolledItem: rolledItem,\n      macroItem: resolved.item ?? rolledItem,\n      args: [workflowContext],\n      options: options,\n      actor: actorToUse,\n      token: tokenForActor(actorToUse),\n      midiData: workflowContext\n    };\n\n    return macro.execute(scope);\n  }\n\n  /**\n   * Create a Macro document from resolved macro data.\n   */\n  private createMacroFromResolved(resolved: ResolvedMacro): Macro.Implementation | undefined {\n    if (resolved.macro) return resolved.macro;\n\n    const macroData = resolved.macroData;\n    if (!macroData?.command) {\n      if (debugEnabled > 0) warn(`callMacro | could not find item macro command`);\n      return undefined;\n    }\n\n    const data = foundry.utils.mergeObject(\n      { name: \"midi generated macro\", type: \"script\", command: \"\" },\n      macroData\n    );\n    data.ownership = { default: CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER };\n    data.author = game.user?.id;\n    return new CONFIG.Macro.documentClass(data);\n  }\n\n  /**\n   * Call a macro by name, resolving the macro type and executing it.\n   */\n  async callMacro(\n    item: Item.Implementation | undefined,\n    macroName: string,\n    macroData: MidiMacroData,\n    options: AnyObject\n  ): Promise<any> {\n    try {\n      // Phase 1: Parse and resolve context\n      const context = await this.parseCallMacroContext(macroName, item, options);\n      if (!context) return undefined;\n\n      const { name, actorToUse } = context;\n      let resolved: ResolvedMacro | undefined;\n\n      // Phase 2: Resolve macro based on type\n      if (name.startsWith(\"function.\")) {\n        resolved = this.resolveFunctionMacro(name, context);\n      } else if (name.startsWith(MQItemMacroLabel) || name.startsWith(\"ItemMacro\")) {\n        resolved = await this.resolveItemMacroCall(name, context);\n      } else if (name.startsWith(MQActivityMacroLabel) || name.startsWith(\"ActivityMacro\")) {\n        resolved = await this.resolveActivityMacroCall(name, context);\n      } else {\n        // World/compendium macro - show error if not found\n        resolved = await this.resolveWorldMacro(name, context);\n        if (!resolved) {\n          const message = `Could not find macro ${name}`;\n          TroubleShooter.recordError(new Error(message), message);\n          ui.notifications?.error(`midi-qol | ${message}`);\n          return undefined;\n        }\n      }\n\n      // ItemMacro/ActivityMacro may return undefined for expected reasons\n      // (e.g., ActivityMacro-id not matching current activity)\n      if (!resolved) return undefined;\n\n      // Update macroData with source info\n      if (resolved.sourceItemUuid) {\n        macroData.sourceItemUuid = resolved.sourceItemUuid;\n      }\n      macroData.speaker = this.speaker;\n      macroData.actor = actorToUse;\n\n      // Phase 3: Execute\n      return this.executeMacroWithScope(resolved, macroData, options, item);\n    } catch (err) {\n      TroubleShooter.recordError(err, \"callMacro: Error evaluating macro\");\n      ui.notifications?.error(`There was an error running your macro. See the console(F12) for details`);\n      error(\"Error evaluating macro \", err);\n      return {};\n    }\n  }\n\n  async removeEffectsButton() {\n    if (!this.itemCardUuid) return;\n    const chatMessage = this.chatCard;\n    if (chatMessage?.content) {\n      const buttonRe = /<button[^>]*?data-action=\"midiApplyEffects\"[\\s\\S]*?<\\/button>/;\n      let content = chatMessage.content.replace(buttonRe, \"\");\n      await this.performThrottledUpdate(chatMessage, { content });\n    }\n  }\n  async displayUtilityRolls() {\n    const chatMessage = this.chatCard;\n    let newFlags = {};\n    let content;\n    if (chatMessage?.content) { // display the attack roll\n      const utilityRoll = this.utilityRoll; // will concat as needed\n      //let searchRe = /<div class=\"midi-qol-attack-roll\">.*?<\\/div>/;\n      let searchRe = /<div[^>]*?class=\"midi-qol-utility-roll[^\"]*\"[\\s\\S]*?<div class=\"end-midi-qol-utility-roll\">/\n      // Display roll name if available, otherwise default to utility activity type title\n      const rollString = this.activity?.roll?.name || i18n(\"DND5E.UTILITY.Title\");\n      let replaceString = `<div class=\"midi-qol-utility-roll\"><div class=\"midi-roll-label\">${rollString}</div>${this.utilityRollHTML}<div class=\"end-midi-qol-utility-roll\">`\n      content = chatMessage.content.replace(searchRe, replaceString);\n      if (debugEnabled > 0) warn(\"displayUtilityRoll |\", this.utilityRoll)\n      newFlags = {\n        \"midi-qol\":\n        {\n          type: MESSAGE_TYPES.OTHER,\n          // roll: utilityRoll?.roll,\n        }\n      }\n    }\n    // for active defence, this.attackRoll is undefined, thus create the array like this to prevent errors further on\n    const rolls = [...(this.attackRoll ? [this.attackRoll] : []),\n    ...(this.utilityRoll ? [this.utilityRoll] : [])];\n    await this.performThrottledUpdate(chatMessage, { content, flags: newFlags, rolls });\n  }\n\n  async displayAttackRoll(displayOptions: { GMOnlyAttackRoll?: boolean } = {}) {\n    // @ts-expect-error CONFIG.Dice.D20Roll not typed\n    const ADV_MODE: { DISADVANTAGE: number, NORMAL: number, ADVANTAGE: number } = CONFIG.Dice.D20Roll.ADV_MODE;\n    const chatMessage = this.chatCard;\n    let newFlags = {};\n    let content;\n    if (chatMessage?.content) { // display the attack roll\n      content = chatMessage.content;\n      let searchRe = /<div[^>]*?class=\"midi-qol-attack-roll[^\"]*\"[\\s\\S]*?<div class=\"end-midi-qol-attack-roll\">/\n      // Determine attack label based on attackRollModifierTracker.advantageMode\n      let attackString: string;\n      const mode = this.attackRoll?.options?.advantageMode ?? this.attackRollModifierTracker.advantageMode ?? ADV_MODE.NORMAL;\n      if (mode === ADV_MODE.ADVANTAGE) {\n        attackString = i18n(\"DND5E.Advantage\");\n      } else if (mode === ADV_MODE.DISADVANTAGE) {\n        attackString = i18n(\"DND5E.Disadvantage\");\n      } else {\n        attackString = i18n(\"DND5E.Attack\");\n      }\n      if (configSettings.addFakeDice) // addFakeDice => roll 2d20 always - don't show advantage/disadvantage or players will know the 2nd d20 is fake\n        attackString = i18n(\"DND5E.Attack\");\n\n      // Add attribution info icon if there's any attribution data\n      let attributionIcon = \"\";\n      if (Object.keys(this.attackAttribution).length > 0) {\n        const tooltipContent = await this.renderAttributionTooltip();\n        if (tooltipContent) {\n          attributionIcon = ` <span class=\"midi-attribution-info\" data-tooltip-html=\"${foundry.utils.escapeHTML(tooltipContent)}\" data-tooltip-direction=\"DOWN\"><i class=\"fas fa-info-circle\"></i></span>`;\n        }\n      }\n\n      let replaceString = `<div class=\"midi-qol-attack-roll midi-qol-section-filled\"><div class=\"midi-roll-label\">${attackString}${attributionIcon}</div>${this.attackRollHTML}<div class=\"end-midi-qol-attack-roll\">`\n\n      content = content.replace(searchRe, replaceString);\n      if (this.attackRollCount > 1) {\n        // Match rollAttack button - handles both multi mode (no span) and single mode (with span)\n        // Also handles optional style attribute with flexible spacing\n        const attackButtonRe = /(<button[^>]*data-action=\"rollAttack\"[^>]*>)(?:<span>)?(\\[\\d*\\] )*([^<]+)(?:<\\/span>)?(<\\/button>)/;\n        content = content.replace(attackButtonRe, `$1<span>[${this.attackRollCount}] $3</span>$4`);\n        const confirmButtonRe = /<button class=\"midi-qol-confirm-damage-roll-complete\" data-action=\"confirm-damage-roll-complete\">(\\[[\\d ]*\\])*([^<]+)<\\/button>/;\n        content = content.replace(confirmButtonRe, `<button class=\"midi-qol-confirm-damage-roll-complete\" data-action=\"confirm-damage-roll-complete\">[${this.attackRollCount} ${this.damageRollCount + 1}] $2</button>`);\n      }\n\n      if (this.attackRoll?.dice.length) {\n        const d: any = this.attackRoll.dice[0]; // should be a dice term but DiceTerm.options not defined\n        const isD20 = (d.faces === 20);\n        if (isD20) {\n          this.d20AttackRoll = d.total;\n        }\n      }\n      if (debugEnabled > 0) warn(\"displayAttackRoll |\", this.attackRoll)\n      newFlags = {\n        \"midi-qol\": {\n          GMOnlyAttackRoll: displayOptions.GMOnlyAttackRoll ?? false,\n          //@ts-expect-error no dnd5e types\n          isHit: configSettings.autoCheckHit === \"none\" ? (this.attackRoll?.isSuccess ?? false) : this.hitTargets.size > 0,\n          isHitEC: this.hitTargetsEC.size > 0,\n          // roll: this.attackRoll,\n          type: MESSAGE_TYPES.ATTACK,\n          d20AttackRoll: this.d20AttackRoll,\n          hitTargetUuids: Array.from(this.hitTargets).map(t => t.document.uuid),\n          hitECTargetUuids: Array.from(this.hitTargetsEC).map(t => t.document.uuid),\n          isCritical: this.isCritical,\n          isFumble: this.isFumble,\n          targets: Array.from(this.targets).map(t => ({ uuid: t.document.uuid, name: t.document.name })),\n        },\n\n      }\n    }\n    // for active defence, this.attackRoll is undefined, thus create the array like this to prevent errors further on\n    const rolls = [...(this.attackRoll ? [this.attackRoll] : [])];\n    await this.performThrottledUpdate(chatMessage, { content, flags: newFlags, rolls });\n  }\n\n  async displayDamageRolls() {\n    const chatMessage = this.chatCard;\n    if (!chatMessage?.content) {\n      const message = `midi-qol | displayDamageRolls | no chat message to display damage rolls`;\n      console.warn(message);\n      TroubleShooter.recordError(new Error(message), message);\n      return;\n    }\n    let content = chatMessage.content;\n    if ((getRemoveDamageButtons(this.activity) && configSettings.confirmAttackDamage === \"none\") || this.workflowType === \"TrapWorkflow\") {\n      // Match rollDamage button from activity-card.hbs\n      const damageRe = /<button[^>]*?data-action=\"rollDamage\"[\\s\\S]*?<\\/button>/\n      const formulaRe = /<button[^>]*?data-action=\"rollFormula\"[\\s\\S]*?<\\/button>/\n      content = content?.replace(damageRe, \"<div></div>\")\n      content = content?.replace(formulaRe, \"\")\n    }\n    let newFlags = {};\n    if (chatMessage) {\n      if (this.damageRollHTML) {\n        if (!this.useOther) {\n          const searchRe = /<div[^>]*?class=\"midi-qol-damage-roll[^\"]*\"[\\s\\S]*?<div class=\"end-midi-qol-damage-roll\">/;\n          const replaceString = `<div class=\"midi-qol-damage-roll midi-qol-section-filled\"><div class=\"midi-roll-label\">${this.damageFlavor}</div>${this.damageRollHTML || \"\"}<div class=\"end-midi-qol-damage-roll\">`\n          content = content.replace(searchRe, replaceString);\n        } else {\n          const otherSearchRe = /<div[^>]*?class=\"midi-qol-other-damage-roll[^\"]*\"[\\s\\S]*?<div class=\"end-midi-qol-other-damage-roll\">/;\n          const otherReplaceString = `<div class=\"midi-qol-other-damage-roll midi-qol-section-filled\"><div class=\"midi-roll-label\">${this.damageFlavor}</div>${this.damageRollHTML || \"\"}<div class=\"end-midi-qol-other-damage-roll\">`\n          content = content.replace(otherSearchRe, otherReplaceString);\n        }\n        if (this.otherDamageRollHTML) {\n          const otherSearchRe = /<div[^>]*?class=\"midi-qol-other-damage-roll[^\"]*\"[\\s\\S]*?<div class=\"end-midi-qol-other-damage-roll\">/;\n          const otherReplaceString = `<div class=\"midi-qol-other-damage-roll midi-qol-section-filled\"><div class=\"midi-roll-label\">${this.otherDamageFlavor}${this.otherDamageRollHTML || \"\"}</div><div class=\"end-midi-qol-other-damage-roll\">`\n          content = content.replace(otherSearchRe, otherReplaceString);\n        }\n        if (this.bonusDamageRolls) {\n          const bonusSearchRe = /<div[^>]*?class=\"midi-qol-bonus-damage-roll[^\"]*\"[\\s\\S]*?<div class=\"end-midi-qol-bonus-damage-roll\">/;\n          const bonusReplaceString = `<div class=\"midi-qol-bonus-damage-roll midi-qol-section-filled\"><div class=\"midi-roll-label\">${this.bonusDamageFlavor}${this.bonusDamageHTML || \"\"}</div><div class=\"end-midi-qol-bonus-damage-roll\">`\n          content = content.replace(bonusSearchRe, bonusReplaceString);\n        }\n      } else {\n        if (this.otherDamageRollHTML) {\n          const otherSearchRe = /<div[^>]*?class=\"midi-qol-damage-roll[^\"]*\"[\\s\\S]*?<div class=\"end-midi-qol-damage-roll\">/;\n          const otherReplaceString = `<div class=\"midi-qol-damage-roll midi-qol-section-filled\"><div class=\"midi-roll-label\">${this.otherDamageFlavor}</div>${this.otherDamageRollHTML || \"\"}<div class=\"end-midi-qol-damage-roll\">`\n          content = content.replace(otherSearchRe, otherReplaceString);\n        }\n        if (this.bonusDamageRolls) {\n          const bonusSearchRe = /<div[^>]*?class=\"midi-qol-bonus-damage-roll[^\"]*\"[\\s\\S]*?<div class=\"end-midi-qol-bonus-damage-roll\">/;\n          const bonusReplaceString = `<div class=\"midi-qol-bonus-damage-roll midi-qol-section-filled\"><div class=\"midi-roll-label\">${this.bonusDamageFlavor}</div>${this.bonusDamageHTML || \"\"}<div class=\"end-midi-qol-bonus-damage-roll\">`\n          content = content.replace(bonusSearchRe, bonusReplaceString);\n        }\n      }\n\n      const midiAttackTargets = Array.from(this.targets).map(token => {\n        const t = getTokenDocument(token);\n        return {\n          name: t?.name,\n          img: t?.actor?.img,\n          uuid: t?.actor?.uuid,\n          //@ts-expect-error no dnd5e-types\n          ac: t?.actor?.system?.attributes.ac.value,\n        }\n      });\n      newFlags = foundry.utils.mergeObject(newFlags, {\n        \"midi-qol\": {\n          type: MESSAGE_TYPES.DAMAGE,\n          damageDetail: this.useOther ? undefined : damageDetailToObject(this.rawDamageDetail),\n          otherDamageDetail: this.useOther ? damageDetailToObject(this.rawDamageDetail) : damageDetailToObject(this.rawOtherDamageDetail),\n          bonusDamageDetail: damageDetailToObject(this.rawBonusDamageDetail),\n          sourceActorUuid: this.actor.uuid,\n          damageTotal: this.useOther ? undefined : this.damageTotal,\n          [WorkflowDataFlags.otherDamageTotal]: this.useOther ? this.damageTotal : this.otherDamageTotal,\n          [WorkflowDataFlags.bonusDamageTotal]: this.bonusDamageTotal,\n        }\n      }, { overwrite: true, inplace: false });\n    }\n\n    if (this.damageRollCount > 1) {\n      // Match rollDamage button - handles both multi mode (no span) and single mode (with span)\n      const damageButtonRe = /(<button[^>]*data-action=\"rollDamage\"[^>]*>)(?:<span>)?(\\[\\d*\\] )*([^<]+)(?:<\\/span>)?(<\\/button>)/;\n      content = content.replace(damageButtonRe, `$1<span>[${this.damageRollCount}] $3</span>$4`);\n      const confirmButtonRe = /<button class=\"midi-qol-confirm-damage-roll-complete\" data-action=\"confirm-damage-roll-complete\">(\\[[\\d ]*\\])*([^<]+)<\\/button>/;\n      content = content.replace(confirmButtonRe, `<button class=\"midi-qol-confirm-damage-roll-complete\" data-action=\"confirm-damage-roll-complete\">[${this.attackRollCount} ${Math.max(this.damageRollCount, 1)}] $2</button>`);\n    } else {\n      // Match rollDamage button - handles both multi mode (no span) and single mode (with span)\n      const damageButtonRe = /(<button[^>]*data-action=\"rollDamage\"[^>]*>)(?:<span>)?(\\[\\d*\\] )*([^<]+)(?:<\\/span>)?(<\\/button>)/;\n      content = content.replace(damageButtonRe, `$1<span>$3</span>$4`);\n    }\n    return await this.performThrottledUpdate(chatMessage, { \"content\": content, flags: newFlags, rolls: this.chatRolls }, false);\n  }\n\n  async displayHitTargets(whisper = false) {\n    this.hitDisplayData = {};\n    this.needsHitTargetsDisplayed = false;\n    // @ts-expect-error no dnd5e-types\n    if (this.item.type === \"feat\" && [\"ench\", \"class\", undefined].includes(this.activity.actionType)) return;\n    for (let target of this.targets) {\n      if (!target) continue;\n      let img = target.document?.texture.src ?? target.actor?.img ?? \"\";\n      // @ts-expect-error no dnd5e-types\n      if (configSettings.usePlayerPortrait && target.actor?.type === \"character\") {\n        img = target.actor.img ?? target.document?.texture.src ?? \"\";\n      }\n      if (foundry.helpers.media.VideoHelper.hasVideoExtension(img ?? \"\")) {\n        img = (await game.video?.createThumbnail(img ?? \"\", { width: 100, height: 100 })) ?? \"\";\n      }\n      const tokenUuid = target.document.uuid;\n      // @ts-expect-error no dnd5e-types\n      const baseAc = target.actor?.system?.attributes?.ac?.value ?? 10;\n      this.hitDisplayData[tokenUuid] = {\n        targetClass: (target.actor as Actor)?.hasPlayerOwner ? \"midi-qol-player-target\" : \"midi-qol-npc-target\",\n        target: target,\n        hitClass: \"\",\n        acClass: (target.actor as Actor)?.hasPlayerOwner ? \"\" : \"midi-qol-npc-ac\",\n        img,\n        gmName: getTokenName(target),\n        playerName: getTokenPlayerName(target) ?? \"\",\n        uuid: tokenUuid,\n        showAC: !!this.activity.attack,\n        acDisplay: `${baseAc}`,\n        acIcons: [],\n        isHit: this.hitTargets.has(target)\n      };\n    }\n    await this.displayHits(whisper, false);\n  }\n\n  async displayHits(whisper = false, showHits = true) {\n    this.needsHitTargetsDisplayed = false;\n    // if ([\"\", undefined].includes(this.activity.target?.affects?.type)) return; This does not work for lots of srd items\n    const templateData = {\n      attackType: this.item.name ?? \"\",\n      attackTotal: this.attackTotal,\n      oneCard: true,\n      collapsibleTargets: configSettings.collapsibleTargets,\n      showHits,\n      hits: this.hitDisplayData,\n      isGM: game.user?.isGM,\n    };\n    if (debugEnabled > 0) warn(\"displayHits |\", templateData, whisper);\n    const hitContent = await foundry.applications.handlebars.renderTemplate(\"modules/midi-qol/templates/hits.html\", templateData) || \"No Targets\";\n    const chatMessage = this.chatCard;\n\n    if (chatMessage?.content) {\n      let searchString = /<div[^>]*?class=\"midi-qol-hits-display[^\"]*\"[\\s\\S]*?<div class=\"end-midi-qol-hits-display\">/;\n      let replaceString = `<div class=\"midi-qol-hits-display midi-qol-section-filled\">${hitContent}<div class=\"end-midi-qol-hits-display\">`\n      let content = chatMessage.content.replace(searchString, replaceString);\n\n      const update = {\n        content,\n        flags: { \"midi-qol\": { type: MESSAGE_TYPES.HITS } },\n        // TODO: May not be required\n        style: CONST.CHAT_MESSAGE_STYLES.OTHER\n      }\n      await this.performThrottledUpdate(chatMessage, update);\n    }\n  }\n\n  computeSaveFlavors(): { fullDamageText: string, halfDamageText: string, noDamageText: string } {\n    let fullDamage: string[] = [];\n    let noDamage: string[] = [];\n    let halfDamage: string[] = [];\n    let fullDamageText = \"\";\n    let noDamageText = \"\";\n    let halfDamageText = \"\";\n    //this.needsHitTargetsDisplayed = false;\n    if (this.activity && (this.activity.save || this.activity.check) && (this.activity.damage?.parts.length ?? 0) > 0) {\n      switch (getSaveMultiplierForActivity(this.activity)) {\n        case 0:\n          noDamage.push(`${this.damageFlavor} &#48;`)\n          break;\n        case 1:\n          fullDamage.push(`${this.damageFlavor} &#49;`)\n          break;\n        default:\n          halfDamage.push(`${this.damageFlavor} &frac12;`);\n      }\n    }\n    if ((this.otherActivity?.save || this.otherActivity?.check) && (this.otherActivity?.damage?.parts.length ?? 0) > 0) {\n      switch (getSaveMultiplierForActivity(this.otherActivity)) {\n        case 0:\n          noDamage.push(`${this.otherDamageFlavor} &#48;`)\n          break;\n        case 1:\n          fullDamage.push(`${this.otherDamageFlavor} &#49;`)\n          break;\n        default:\n          halfDamage.push(`${this.otherDamageFlavor} &frac12;`);\n      }\n    }\n    if (fullDamage.length > 0) fullDamageText = fullDamage.join(\", \");\n    if (noDamage.length > 0) noDamageText = noDamage.join(\", \");\n    if (halfDamage.length > 0) halfDamageText = halfDamage.join(\", \");\n    return { fullDamageText, halfDamageText, noDamageText };\n  }\n  //TODO refactor this with displaysaves\n  async displaySaveTargets(_whisper = false) {\n    this.saveTargetsDisplayed = true;\n    this.saveDisplayData = [];\n    let rollType: string = \"\";\n    let rollAbilities: string[] = [];\n    let rollSkills: string[] = [];\n    let rollTools: string[] = [];\n    let rollDC = this.saveActivity?.save?.dc.value ?? this.saveActivity?.check?.dc.value;\n\n    if (this.saveActivity?.save) {\n      rollType = \"save\";\n      if (this.saveActivity.save.ability instanceof Set) {\n        rollAbilities = Array.from(this.saveActivity.save.ability);\n      } else {\n        const ability = this.saveActivity.save.ability;\n        if (ability) rollAbilities = [ability];\n      }\n    } else if (this.saveActivity?.check) {\n      let skillOrTool = this.saveActivity.check.associated.first();\n      // @ts-expect-error no dnd5e-types\n      if (!skillOrTool && this.item.type === \"tool\") {\n        // @ts-expect-error no dnd5e-types\n        skillOrTool = this.item.system.type!.baseItem;\n      }\n      if (!skillOrTool) {\n        rollType = \"check\";\n        const ability = this.saveActivity.check.ability;\n        if (ability) rollAbilities = [ability];\n      } else if (GameSystemConfig.skills[skillOrTool]) {\n        rollType = \"skill\";\n        rollSkills = [skillOrTool];\n      } else {\n        rollType = \"tool\";\n        rollTools = [skillOrTool];\n      }\n    }\n    for (let target of this.targets) {\n      const targetDocument = target.document;\n      let img = targetDocument.texture.src ?? target.actor?.img ?? \"\";\n      // @ts-expect-error no dnd5e-types\n      if (configSettings.usePlayerPortrait && (target.actor as Actor).type === \"character\") {\n        img = target.actor?.img ?? targetDocument.texture.src ?? \"\";\n      }\n\n      if (foundry.helpers.media.VideoHelper.hasVideoExtension(img)) {\n        img = await game.video?.createThumbnail(img, { width: 100, height: 100 }) ?? \"\";\n      }\n\n      let isPlayerOwned = !!target.actor?.hasPlayerOwner;\n      this.saveDisplayData.push({\n        gmName: getTokenName(target),\n        playerName: getTokenPlayerName(target) ?? \"\",\n        img,\n        targetClass: isPlayerOwned ? \"midi-qol-player-target\" : \"midi-qol-npc-target\",\n        target,\n        saveSymbol: \"\",\n        saveTotalClass: \"\",\n        rollTotal: \"\",\n        rollDetail: \"\",\n        rollHTML: \"\",\n        id: target.id,\n        adv: undefined,\n        saveClass: \"\"\n      });\n    }\n    let { fullDamageText, halfDamageText, noDamageText } = this.computeSaveFlavors();\n    let templateData = {\n      fullDamageText,\n      halfDamageText,\n      noDamageText,\n      hasDamageText: !!(fullDamageText || halfDamageText || noDamageText),\n      saveDisplayFlavor: await this.computeSaveDisplayFlavor(rollDC, rollType, { rollAbilities, rollSkills, rollTools }),\n      saves: this.saveDisplayData,\n      // TODO force roll damage\n    }\n    const chatMessage = this.chatCard;\n\n    const saveContent = await foundry.applications.handlebars.renderTemplate(\"modules/midi-qol/templates/saves.html\", templateData);\n    let searchRe = /<div[^>]*?class=\"midi-qol-saves-display\">[\\s\\S]*?<div class=\"end-midi-qol-saves-display\">/;\n    let replaceString = `<div class=\"midi-qol-saves-display\"><div data-item-id=\"${this.item.id}\">${saveContent}</div><div class=\"end-midi-qol-saves-display\">`\n    let content = chatMessage.content.replace(searchRe, replaceString);\n    await this.performThrottledUpdate(chatMessage, { content, flags: { \"midi-qol\": { type: MESSAGE_TYPES.SAVES } } });\n  }\n  async displaySaves(_whisper: boolean = false) {\n    let { fullDamageText, halfDamageText, noDamageText } = this.computeSaveFlavors();\n    let templateData = {\n      fullDamageText,\n      halfDamageText,\n      noDamageText,\n      hasDamageText: !!(fullDamageText || halfDamageText || noDamageText),\n      saveDisplayFlavor: this.saveDisplayFlavor,\n      saves: this.saveDisplayData,\n      // TODO force roll damage\n    }\n    let chatMessage = this.chatCard; // XXX await asyncGetCachedDocument(this.itemCardUuid);\n    if (chatMessage?.content) {\n      templateData.saveDisplayFlavor = this.saveDisplayFlavor;\n      const saveContent = await foundry.applications.handlebars.renderTemplate(\"modules/midi-qol/templates/saves.html\", templateData);\n      let searchRe: RegExp;\n      let replaceString: string;\n      let midiTargets = Array.from(this.targets.map(t => t.document));\n      let midiTargetDescriptors: CombinedTargetDescriptor[] | undefined;\n\n      if (midiTargets.length) {\n        const saves = this.saves?.map(t => t.document.uuid);\n        const semiSuperSavers = this.semiSuperSavers?.map(t => t.document.uuid);\n        const superSavers = this.superSavers?.map(t => t.document.uuid);\n        const targetDescriptors = this.targetDescriptors;\n        midiTargetDescriptors = midiTargets.map(t => {\n          let uncannyDodge = !!(t.actor?.flags?.[MODULE_ID]?.[\"uncanny-dodge\"] && this.activity.attack);\n          let saveMults = {\n            otherDamage: this.otherActivity ? getSaveMultiplierForActivity(this.otherActivity) : 1,\n            defaultDamage: getSaveMultiplierForActivity(this.activity),\n            bonusDamage: getSaveMultiplierForActivity(this.activity)\n          };\n\n          const targetDescriptor = getTargetDescriptor(t.actor?.uuid ?? \"\", targetDescriptors) ?? {}\n          return foundry.utils.mergeObject({\n            name: t.name,\n            img: t.actor?.img as string,\n            uuid: t.actor?.uuid ?? \"\",\n            //@ts-expect-error no dnd5e-types\n            ac: hasCoverTotal(t.actor) ? null : t?.actor?.system.attributes.ac.value as number,\n            saved: saves?.has(t.uuid),\n            semiSuperSaver: semiSuperSavers?.has(t.uuid),\n            superSaver: superSavers?.has(t.uuid),\n            saveMults,\n            itemType: this.item.type,\n            uncannyDodge,\n          }, targetDescriptor);\n        })\n      }\n      if (this.workflowType !== \"DamageOnlyWorkflow\") {\n        searchRe = /<div[^>]*?class=\"midi-qol-saves-display\">[\\s\\S]*?<div class=\"end-midi-qol-saves-display\">/;\n        replaceString = `<div class=\"midi-qol-saves-display\"><div data-item-id=\"${this.item.id}\">${saveContent}</div><div class=\"end-midi-qol-saves-display\">`\n        let content = chatMessage.content.replace(searchRe, replaceString);\n        const update = {\n          content,\n          /* rolls: this.chatRolls */\n          flags: {\n            \"midi-qol\": {\n              type: MESSAGE_TYPES.SAVES,\n              saveUuids: Array.from(this.saves).map(t => t.document.uuid),\n              failedSaveUuids: Array.from(this.failedSaves).map(t => t.document.uuid),\n              superSaverUuids: Array.from(this.superSavers).map(t => t.document.uuid),\n              semiSuperSaverUuids: Array.from(this.semiSuperSavers).map(t => t.document.uuid),\n              criticalSaveUuids: Array.from(this.criticalSaves).map(t => t.document.uuid),\n              fumbleSaveUuids: Array.from(this.fumbleSaves).map(t => t.document.uuid),\n              advantageSaveUuids: Array.from(this.advantageSaves).map(t => t.document.uuid),\n              sourceActorUuid: this.actor.uuid,\n            },\n            dnd5e: { targets: midiTargetDescriptors }\n          },\n          style: CONST.CHAT_MESSAGE_STYLES.OTHER\n        };\n        await this.performThrottledUpdate(chatMessage, update);\n      }\n    }\n  }\n\n  get chatRolls(): Roll[] {\n    let messageRolls: Roll[] = [];\n    if (this.attackRoll) messageRolls.push(this.attackRoll);\n    if (this.utilityRoll) messageRolls.push(this.utilityRoll);\n    if (this.damageRolls) messageRolls.push(...this.damageRolls);\n    if (this.bonusDamageRolls) messageRolls.push(...this.bonusDamageRolls);\n    if (this.otherDamageRolls) messageRolls.push(...this.otherDamageRolls);\n    return messageRolls;\n  }\n\n  /**\n   * Gets an auto-roll for a friendly target if applicable\n   * @param saveDetails The save details object with isFriendly flag\n   * @returns A promise that resolves to a roll if the target should auto-pass/fail, null otherwise\n   */\n  protected getFriendlyTargetRoll(\n    saveDetails: { isFriendly: boolean }\n  ): Promise<Roll> | null {\n    //@ts-expect-error\n    const BasicRoll = CONFIG.Dice.BasicRoll as typeof Roll;\n\n    if (!saveDetails.isFriendly) return null;\n\n    // Check for auto-fail on friendly targets\n    // @ts-expect-error no dnd5e-types\n    const descriptionIncludesAutoFail = this.item.system.description?.value?.toLowerCase().includes(i18n(\"midi-qol.autoFailFriendly\")?.toLowerCase());\n    if (descriptionIncludesAutoFail || this.activity.friendlySave === \"friendlyFail\") {\n      return new BasicRoll(\"-1\").evaluate();\n    }\n\n    // Check for auto-success on friendly targets\n    if (this.activity.friendlySave === \"friendlySuccess\") {\n      return new BasicRoll(\"99\").evaluate();\n    }\n\n    return null;\n  }\n\n  /**\n   * Gets the portrait image for a target token\n   * Handles player portrait preference and video thumbnail generation\n   * @param target The target token\n   * @returns Promise resolving to the image URL string\n   */\n  protected async getTargetPortraitImage(target: Token): Promise<string> {\n    const targetDocument = target.document;\n    let img = targetDocument.texture.src ?? target.actor?.img ?? \"\";\n\n    // @ts-expect-error no dnd5e-types\n    if (configSettings.usePlayerPortrait && target.actor?.type === \"character\") {\n      img = target.actor.img ?? targetDocument.texture.src ?? \"\";\n    }\n\n    if (foundry.helpers.media.VideoHelper.hasVideoExtension(img)) {\n      img = await game.video?.createThumbnail(img, { width: 100, height: 100 }) ?? \"\";\n    }\n\n    return img;\n  }\n\n  /**\n   * Checks if target should auto-succeed due to Sculpt Spells or Careful Spells features\n   * Sculpt Spells: Evocation wizard feature - pre-selected targets auto-succeed on saves\n   * Careful Spells: Sorcerer metamagic - pre-selected targets auto-succeed on saves\n   * @param target The target token to check\n   * @returns true if target should auto-succeed, false otherwise\n   */\n  protected checkSculptOrCarefulSpells(target: Token): boolean {\n    // Sculpt Spells: Evocation spells auto-succeed for pre-selected targets (adds to superSavers)\n    // @ts-expect-error no dnd5e-types - accessing .school property\n    const isEvocationSpell = this.activity.item?.system.school === \"evo\";\n    if (this.actor.flags?.[MODULE_ID]?.sculptSpells &&\n        (this.rangeTargeting || this.tempTargetConfirmation) &&\n        isEvocationSpell &&\n        this.preSelectedTargets.has(target)) {\n      this.superSavers = this.superSavers.add(target);\n      return true;\n    }\n\n    // Careful Spells: Pre-selected targets auto-succeed\n    if (this.actor.flags?.[MODULE_ID]?.carefulSpells &&\n        (this.rangeTargeting || this.tempTargetConfirmation) &&\n        this.preSelectedTargets.has(target)) {\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Applies concentration save bonus if applicable\n   * Only applies when item has isConcentrationCheck flag and target has concentrationSaveBonus\n   * @param target The target token\n   * @param saveRoll The original save roll\n   * @param resultDC The save DC\n   * @param isCritical Whether the roll was a critical\n   * @param isFumble Whether the roll was a fumble\n   * @returns Updated roll info or null if no bonus applies\n   */\n  protected async applyConcentrationSaveBonus(\n    target: Token,\n    saveRoll: Roll,\n    resultDC: number,\n    isCritical: boolean,\n    isFumble: boolean\n  ): Promise<{ saveRoll: Roll, saveRollTotal: number, saved: boolean } | null> {\n    if (!this.item.flags?.[MODULE_ID]?.isConcentrationCheck) return null;\n\n    const checkBonus = target.actor?.flags?.[MODULE_ID]?.concentrationSaveBonus;\n    if (!checkBonus) return null;\n\n    //@ts-expect-error\n    const D20Roll = CONFIG.Dice.D20Roll as typeof Roll;\n    const rollBonus = await new D20Roll(`${checkBonus}`, target.actor?.getRollData()).evaluate();\n    const newSaveRoll = addRollTo(saveRoll, rollBonus);\n    const newSaveRollTotal = newSaveRoll.total!;\n\n    let saved = newSaveRollTotal >= resultDC;\n    if (checkRule(\"criticalSaves\")) {\n      saved = (isCritical || newSaveRollTotal >= resultDC) && !isFumble;\n    }\n\n    return { saveRoll: newSaveRoll, saveRollTotal: newSaveRollTotal, saved };\n  }\n\n  /**\n   * Builds and stores save display entry for a target\n   * Handles advantage/disadvantage display, cover bonus, and roll rendering\n   * @param target The target token\n   * @param saveRoll The save roll result\n   * @param saved Whether the target saved\n   * @param rollDC The save DC (or undefined if no DC)\n   * @param coverSaveBonus Computed cover bonus (for label when no cover status); total cover displays as ∞\n   */\n  protected async buildSaveDisplayEntry(\n    target: Token,\n    saveRoll: Roll,\n    saved: boolean,\n    rollDC: number | undefined,\n    coverSaveBonus: number = 0,\n  ): Promise<void> {\n    const saveRollTotal = coverSaveBonus >= TOTAL_COVER ? Infinity : (saveRoll.total ?? 0);\n    let adv = \"\";\n    if (configSettings.displaySaveAdvantage) {\n      adv = this.advantageSaves.has(target) ? `(${i18n(\"DND5E.Advantage\")})` : \"\";\n      if (this.disadvantageSaves?.has(target)) adv = `(${i18n(\"DND5E.Disadvantage\")})`;\n    }\n\n    const img = await this.getTargetPortraitImage(target);\n    const isPlayerOwned = target.actor?.hasPlayerOwner ?? false;\n\n    let rollHTML = await midiRenderRoll(saveRoll);\n    //@ts-expect-error midiChosenId is a custom roll option\n    const midiChosenId: string | undefined = saveRoll.options?.midiChosenId;\n    if (midiChosenId) {\n      let choiceTitle = \"\";\n      if (GameSystemConfig.abilities[midiChosenId]) {\n        const abilityLabel = GameSystemConfig.abilities[midiChosenId].label ?? \"\";\n        choiceTitle = i18nFormat(\"DND5E.SavePromptTitle\", { ability: abilityLabel });\n      } else if (GameSystemConfig.skills[midiChosenId]) {\n        const skillLabel = GameSystemConfig.skills[midiChosenId].label ?? \"\";\n        choiceTitle = i18nFormat(\"DND5E.SkillPromptTitle\", { skill: skillLabel, ability: \"\" });\n      } else {\n        const toolLabel = getToolLabel(midiChosenId);\n        if (toolLabel && toolLabel !== midiChosenId) choiceTitle = i18nFormat(\"DND5E.ToolPromptTitle\", { tool: toolLabel });\n      }\n      if (choiceTitle) rollHTML = `<div style=\"font-weight:bold; text-align:center;\">${choiceTitle}</div>${rollHTML}`;\n    }\n    const targetDocUuid = getTokenDocument(target)?.uuid ?? \"none\";\n\n    // Retrieve the per-target saveDetails for attribution tracking\n    const saveDetails = this.targetSaveDetails?.[targetDocUuid];\n\n    // Store the save roll in targetSaveDetails (tokenSaves getter reads from here)\n    if (saveDetails) saveDetails.saveRoll = saveRoll;\n\n    // Use the tracker for the actually-chosen ability/skill/tool when multiple choices were available\n    // Reconstruct tracker if needed (tracker may be a plain object after socketlib transfer)\n    let chosenTracker: RollModifierTracker | undefined;\n    if (midiChosenId && saveDetails?.advantageByChoice) {\n      const chosenData = saveDetails.advantageByChoice[midiChosenId];\n      if (chosenData?.tracker) {\n        if (chosenData.tracker instanceof RollModifierTracker) {\n          chosenTracker = chosenData.tracker;\n        } else {\n          // Reconstruct from plain object and cache for future access\n          chosenTracker = new RollModifierTracker();\n          chosenTracker.restore(chosenData.tracker);\n          chosenData.tracker = chosenTracker;\n        }\n      }\n    }\n    const advMode = chosenTracker ?? saveDetails?.modifierTracker;\n    // @ts-expect-error CONFIG.Dice.D20Roll not typed\n    const ADV_MODE: { DISADVANTAGE: number, NORMAL: number, ADVANTAGE: number } = CONFIG.Dice.D20Roll.ADV_MODE;\n    const mode = saveRoll?.options?.advantageMode ?? advMode?.advantageMode ?? ADV_MODE.NORMAL;\n    const title = getAdvantageModeTitle(mode);\n    const attributionTooltip = await renderAttributionTooltip(advMode?.attribution ?? {}, title);\n\n    // Determine cover label from effective cover (status + module delta)\n    // coverSaveBonus is the delta above status; add status back for display purposes\n    //@ts-expect-error no dnd5e-types\n    const statusSaveCover: number = target.actor?.system?.attributes?.ac?.cover ?? 0;\n    const totalSaveCover = statusSaveCover + coverSaveBonus;\n    let coverLabel: string | undefined;\n    if (totalSaveCover >= TOTAL_COVER) coverLabel = \"systems/dnd5e/icons/svg/statuses/cover-total.svg\";\n    else if (totalSaveCover >= THREE_QUARTERS_COVER) coverLabel = \"systems/dnd5e/icons/svg/statuses/cover-three-quarters.svg\";\n    else if (totalSaveCover >= HALF_COVER) coverLabel = \"systems/dnd5e/icons/svg/statuses/cover-half.svg\";\n\n    // Build save tooltip showing breakdown: \"15 = 1d20(12) + 3 vs DC 14\"\n    let saveTooltip: string | undefined;\n    if (rollDC !== undefined) {\n      if (!isFinite(saveRollTotal)) {\n        saveTooltip = `∞ vs DC ${rollDC}`;\n      } else {\n        const resultString = saveRoll.result;\n        if (resultString && resultString !== String(saveRollTotal)) {\n          saveTooltip = `${saveRollTotal} = ${resultString} vs DC ${rollDC}`;\n        } else {\n          saveTooltip = `${saveRollTotal} vs DC ${rollDC}`;\n        }\n      }\n    }\n\n    this.saveDisplayData?.push({\n      gmName: getTokenName(target),\n      playerName: getTokenPlayerName(target) ?? \"\",\n      img,\n      targetClass: isPlayerOwned ? \"midi-qol-player-target\" : \"midi-qol-npc-target\",\n      target,\n      saveSymbol: (rollDC === null) ? \"\" : (\n        ((target.actor as Actor).hasPlayerOwner ? \"\" : \"midi-qol-npc-save-symbol\")\n        + \" midi-qol-save-symbol \"\n        + (saved ? \"fa-check\" : \"fa-xmark\")),\n      saveTotalClass: target.actor?.hasPlayerOwner ? \"\" : \"midi-qol-npc-save-total\",\n      saveToolTipClass: target.actor?.hasPlayerOwner ? \"\" : \"midi-qol-npc-save-tooltip\",\n      rollTotal: isFinite(saveRollTotal) ? String(saveRollTotal) : \"∞\",\n      rollDetail: \"\",\n      rollHTML,\n      id: target.id,\n      modifierTracker: saveDetails?.modifierTracker,  // Store per-target modifierTracker for attribution\n      attributionTooltip: foundry.utils.escapeHTML(attributionTooltip),  // Escaped for data-tooltip-html, always shown\n      hasAttribution: Object.keys(advMode?.attribution ?? {}).length > 0,\n      coverLabel,\n      saveTooltip,\n      saveClass: (rollDC === null) ? \"\" : (saved ? \"success\" : \"failure\"),\n    });\n  }\n\n  /**\n   * Determines roll settings for a target's save roll\n   * @param target The target token\n   * @param flagRollType The roll type for module settings (save/check/skill/tool)\n   * @param simulate Whether this is a simulation (disables prompts and modules)\n   * @returns Object with player, roll settings, and module flags\n   */\n  protected determineTargetRollSettings(\n    target: Token,\n    flagRollType: string | undefined,\n    simulate: boolean\n  ): {\n    player: User | undefined;\n    promptPlayer: boolean;\n    showRollDialog: boolean;\n    GMprompt: string | boolean | undefined;\n    gmMonksTB: boolean | undefined;\n    gmFlashTB: boolean | undefined;\n    gmRER: boolean | undefined;\n    playerChat: boolean;\n  } {\n    let player = playerFor(target);\n    if (!player || !player.active) player = preferredActiveGM();\n\n    let promptPlayer = !player?.isGM && !([\"none\", \"noneDialogPublic\", \"noneDialogPrivate\", \"noneDialogSelf\", \"noneDialogBlind\"].includes(configSettings.playerRollSaves));\n    let showRollDialog = !player?.isGM && [\"noneDialogPublic\", \"noneDialogPrivate\", \"noneDialogSelf\", \"noneDialogBlind\"].includes(configSettings.playerRollSaves);\n    if (simulate) promptPlayer = false;\n\n    let GMprompt: string | boolean | undefined;\n    let gmMonksTB: boolean | undefined;\n    let gmFlashTB: boolean | undefined;\n    let gmRER: boolean | undefined;\n    const playerChat = !player?.isGM && [\"chat\"].includes(configSettings.playerRollSaves);\n\n    if (player?.isGM) {\n      const targetDocument = getTokenDocument(target);\n      const monksTBSetting = targetDocument?.isLinked ? configSettings.rollNPCLinkedSaves === \"mtb\" : configSettings.rollNPCSaves === \"mtb\";\n      const flashTBSetting = targetDocument?.isLinked ? configSettings.rollNPCLinkedSaves === \"ftb\" : configSettings.rollNPCSaves === \"ftb\";\n      const epicRollsSetting = targetDocument?.isLinked ? configSettings.rollNPCLinkedSaves === \"rer\" : configSettings.rollNPCSaves === \"rer\";\n      gmMonksTB = flagRollType !== \"tool\" && installedModules.get(\"monks-tokenbar\") && monksTBSetting;\n      gmFlashTB = installedModules.get(\"flash-rolls-5e\") && flashTBSetting;\n      gmRER = installedModules.get(\"epic-rolls-5e\") && epicRollsSetting;\n      GMprompt = targetDocument?.isLinked ? configSettings.rollNPCLinkedSaves : configSettings.rollNPCSaves;\n\n      promptPlayer = ![\"auto\", \"autoDialog\"].includes(GMprompt as string);\n      showRollDialog = GMprompt === \"autoDialog\";\n\n      if (simulate) {\n        gmMonksTB = false;\n        gmFlashTB = false;\n        GMprompt = false;\n        gmRER = false;\n        promptPlayer = false;\n        showRollDialog = false;\n      }\n    }\n\n    return { player: player ?? undefined, promptPlayer, showRollDialog, GMprompt, gmMonksTB, gmFlashTB, gmRER, playerChat };\n  }\n\n  /**\n   * Calculates the cover save bonus for a DEX save target.\n   * dnd5e already bakes the status cover bonus into the DEX save via prepareAbilities(),\n   * so this returns only the delta above status cover from module-computed cover.\n   * @param target The target token\n   * @param template The measured template (for area effects)\n   * @param rollAbility The ability being used for the save\n   * @returns The extra cover bonus to add to the save (above what dnd5e already includes)\n   */\n  protected async calculateCoverSaveBonus(\n    target: Token,\n    template: foundry.canvas.placeables.MeasuredTemplate.Implementation | undefined | null,\n    rollAbility: string | undefined | null\n  ): Promise<number> {\n    if (!this.item || !this.activityHasSave || rollAbility !== \"dex\") {\n      return 0;\n    }\n\n    const targetDocument = target.document;\n    const targetActor = target.actor;\n    //@ts-expect-error no dnd5e-types\n    let statusCoverBonus: number = targetActor?.system?.attributes?.ac?.cover ?? 0;\n    if (hasCoverTotal(targetActor)) statusCoverBonus = TOTAL_COVER;\n\n    // Get the raw module-computed cover bonus\n    let moduleCoverBonus = 0;\n\n    // Determine the cover origin point: explicit coverOrigin > template center > caster token\n    let position: { x: number, y: number } | undefined;\n    let originElevation: number = this.token?.document?.elevation ?? 0;\n\n    if (this.workflowOptions.coverOrigin) {\n      position = { x: this.workflowOptions.coverOrigin.x, y: this.workflowOptions.coverOrigin.y };\n      originElevation = this.workflowOptions.coverOrigin.elevation ?? originElevation;\n    } else if (template) {\n      position = foundry.utils.duplicate(template.center);\n      const dimensions = canvas.dimensions;\n      if (template.document.t === \"rect\") {\n        position.x += (template.document.width ?? 1) / (dimensions?.distance ?? 5) / 2 * (dimensions?.size ?? 100);\n        position.y += (template.document.width ?? 1) / (dimensions?.distance ?? 5) / 2 * (dimensions?.size ?? 100);\n      }\n      originElevation = template.document.elevation;\n    }\n\n    if (position) {\n      // Cover calculation from a point (coverOrigin, template center, etc.)\n      if (configSettings.optionalRules.coverCalculation === \"levelsautocover\"\n        && installedModules.get(\"levelsautocover\")) {\n        moduleCoverBonus = computeCoverBonus({\n          center: position,\n          x: position.x,\n          y: position.y,\n          id: this.token?.id,\n          elevation: originElevation,\n          getCenterPoint() { return { x: position.x, y: position.y }; },\n          document: {\n            x: position.x,\n            y: position.y,\n            elevation: originElevation,\n            disposition: targetDocument?.disposition,\n            object: { id: this.token?.id },\n          }\n        } as unknown as Token, target, this.activity);\n      } else if (configSettings.optionalRules.coverCalculation === \"simbuls-cover-calculator\"\n        && installedModules.get(\"simbuls-cover-calculator\")) {\n        const coverData = await globalThis.CoverCalculator.checkCoverViaCoordinates(\n          position.x, position.y, false, 'AoE', false, target);\n        if (coverData?.data.results.cover === 3) moduleCoverBonus = TOTAL_COVER;\n        else moduleCoverBonus = -coverData.data.results.value;\n      } else if (configSettings.optionalRules.coverCalculation === \"tokencover\" && installedModules.get(\"tokencover\")) {\n        if (this.token) moduleCoverBonus = computeCoverBonus(foundry.utils.deepClone(this.token, { center: position } as any), target, this.activity);\n      } else if (configSettings.optionalRules.coverCalculation === \"simplecover5e\"\n        && installedModules.get(\"simplecover5e\")) {\n        const syntheticAttacker = {\n          center: position,\n          scene: canvas.scene,\n          id: this.token?.id,\n          x: position.x,\n          y: position.y,\n          elevation: originElevation,\n          getCenterPoint() { return { x: position.x, y: position.y }; },\n          document: {\n            x: position.x,\n            y: position.y,\n            elevation: originElevation,\n            disposition: targetDocument?.disposition,\n            getCenterPoint() { return { x: position.x, y: position.y }; },\n          }\n        };\n        moduleCoverBonus = computeCoverBonus(syntheticAttacker as unknown as Token, target, this.activity);\n      }\n    } else if (this.token) {\n      // Direct targeting (no template) — cover from caster position\n      moduleCoverBonus = computeCoverBonus(this.token, target, this.activity);\n    }\n    const effectiveCoverBonus = Math.max(moduleCoverBonus, statusCoverBonus);\n\n    // Spell Sniper ignores 1/2 3/4 cover for ranged spell attacks\n    if (this.activity.actionType === \"rsak\" && this.actor.flags?.dnd5e?.spellSniper && effectiveCoverBonus !== TOTAL_COVER) {\n      // If actor has status cover, dnd5e already added it — we need to negate it\n      return -statusCoverBonus;\n    }\n    if (effectiveCoverBonus === TOTAL_COVER) {\n      if (this.activity.midiProperties?.ignoreFullCover) {\n        // Downgrade total cover to three-quarters\n        return Math.max(THREE_QUARTERS_COVER - statusCoverBonus, 0);\n      }\n      return TOTAL_COVER;\n    }\n    // dnd5e already includes status cover in the DEX save bonus.\n    // Return only the delta: how much module cover exceeds status cover.\n    return Math.max(moduleCoverBonus - statusCoverBonus, 0);\n  }\n\n  /**\n   * Determines if a save roll is a critical success (natural 20) or fumble (natural 1)\n   * @param saveRoll The save roll to check\n   * @param fallbackTotal Fallback total if dice results can't be read\n   * @returns Object with isCritical and isFumble booleans\n   */\n  protected determineCriticalOrFumble(saveRoll: Roll | undefined, fallbackTotal: number): { isCritical: boolean; isFumble: boolean } {\n    if (!saveRoll?.terms) {\n      return { isCritical: false, isFumble: false };\n    }\n    const dterm = saveRoll.terms[0] as foundry.dice.terms.DiceTerm;\n    const diceRoll = dterm?.results?.find(result => result.active)?.result ?? fallbackTotal;\n    //@ts-expect-error no dnd5e-types\n    const isFumble = diceRoll <= (dterm.options?.fumble ?? 1);\n    //@ts-expect-error no dnd5e-types\n    const isCritical = diceRoll >= (dterm.options?.critical ?? 20);\n    return { isCritical, isFumble };\n  }\n\n  /**\n   * Updates the advantageSaves and disadvantageSaves sets based on the roll result\n   * @param target The target token\n   * @param result The roll result array\n   */\n  protected updateAdvantageTrackingFromRoll(target: Token, result: Roll[]): void {\n    const advantageMode = result[0]?.options?.advantageMode;\n    if (advantageMode !== undefined) {\n      // Standard dnd5e roll with advantageMode\n      if (advantageMode === 1) this.advantageSaves.add(target);\n      else this.advantageSaves.delete(target);\n      if (advantageMode === -1) this.disadvantageSaves?.add(target);\n      else this.disadvantageSaves?.delete(target);\n    } else {\n      // Fallback for custom rolls (e.g., Better Rolls) that set terms[0].options\n      // @ts-expect-error no dnd5e-types\n      if (result[0]?.terms?.[0]?.options?.advantage) this.advantageSaves.add(target);\n      else this.advantageSaves.delete(target);\n      // @ts-expect-error no dnd5e-types\n      if (result[0]?.terms?.[0]?.options?.disadvantage) this.disadvantageSaves?.add(target);\n      else this.disadvantageSaves?.delete(target);\n    }\n    // If both advantage and disadvantage, they cancel out\n    if (this.advantageSaves.has(target) && this.disadvantageSaves?.has(target)) {\n      this.advantageSaves.delete(target);\n      this.disadvantageSaves.delete(target);\n    }\n    // Trigger setter to persist advantageSaves after in-place mutations\n    this.advantageSaves = this.advantageSaves;\n  }\n\n  /**\n   * Determines the roll type, action, and related properties based on the save activity\n   * @returns Object containing rollAction, rollType, rollAbilities, rollSkills, rollTools, and flagRollType\n   */\n  protected determineRollTypeAndAction(): {\n    rollAction: ((config?: AnyObject, dialog?: AnyObject, message?: AnyObject) => Promise<Roll[] | null>) | undefined;\n    rollType: string | undefined;\n    rollAbilities: string[];\n    rollSkills: string[];\n    rollTools: string[];\n    flagRollType: string | undefined;\n  } {\n    let rollAction: ((config?: AnyObject, dialog?: AnyObject, message?: AnyObject) => Promise<Roll[] | null>) | undefined;\n    let rollType: string | undefined;\n    let rollAbilities: string[] = [];\n    let rollSkills: string[] = [];\n    let rollTools: string[] = [];\n    let flagRollType: string | undefined;\n\n    if (this.saveActivity?.save) {\n      rollType = \"save\";\n      flagRollType = \"save\";\n      if (this.saveActivity.save.ability instanceof Set) {\n        rollAbilities = Array.from(this.saveActivity.save.ability);\n      }\n      else {\n        const ability = this.saveActivity.save.ability;\n        if (ability) rollAbilities = [ability];\n      }\n      // @ts-expect-error no dnd5e-types\n      rollAction = CONFIG.Actor.documentClass.prototype.rollSavingThrow;\n    } else if (this.saveActivity?.check) {\n      const associatedArray = Array.from(this.saveActivity.check.associated);\n      // @ts-expect-error no dnd5e-types\n      if (associatedArray.length === 0 && this.item.type === \"tool\") {\n        // @ts-expect-error no dnd5e-types\n        const baseItem = this.item.system.type.baseItem;\n        if (baseItem) associatedArray.push(baseItem);\n      }\n      if (associatedArray.length === 0) {\n        rollType = \"check\";\n        const ability = this.saveActivity.check.ability;\n        if (ability) rollAbilities = [ability];\n        // @ts-expect-error no dnd5e-types\n        rollAction = CONFIG.Actor.documentClass.prototype.rollAbilityCheck;\n        flagRollType = \"check\";\n      } else {\n        // Classify entries as skills or tools\n        const skills = associatedArray.filter(id => !!GameSystemConfig.skills[id]);\n\n        if (skills.length > 0 && skills.length === associatedArray.length) {\n          // All entries are skills\n          rollType = \"skill\";\n          rollSkills = skills;\n          const ability = this.saveActivity?.getAbility?.(skills[0]);\n          if (ability) rollAbilities = [ability];\n          flagRollType = \"skill\";\n          // @ts-expect-error no dnd5e-types\n          rollAction = CONFIG.Actor.documentClass.prototype.rollSkill;\n        } else if (skills.length === 0) {\n          // All entries are tools\n          // @ts-expect-error no dnd5e-types\n          rollAction = CONFIG.Actor.documentClass.prototype.rollToolCheck;\n          rollType = \"tool\";\n          rollTools = associatedArray;\n          const ability = this.saveActivity?.getAbility?.(associatedArray[0]);\n          if (ability) rollAbilities = [ability];\n          flagRollType = \"tool\";\n        } else {\n          // Mixed skills/tools — take first entry\n          const first = associatedArray[0];\n          if (GameSystemConfig.skills[first]) {\n            rollType = \"skill\";\n            rollSkills = [first];\n            const ability = this.saveActivity?.getAbility?.(first);\n            if (ability) rollAbilities = [ability];\n            flagRollType = \"skill\";\n            // @ts-expect-error no dnd5e-types\n            rollAction = CONFIG.Actor.documentClass.prototype.rollSkill;\n          } else {\n            // @ts-expect-error no dnd5e-types\n            rollAction = CONFIG.Actor.documentClass.prototype.rollToolCheck;\n            rollType = \"tool\";\n            rollTools = [first];\n            const ability = this.saveActivity?.getAbility?.(first);\n            if (ability) rollAbilities = [ability];\n            flagRollType = \"tool\";\n          }\n        }\n      }\n    }\n\n    return { rollAction, rollType, rollAbilities, rollSkills, rollTools, flagRollType };\n  }\n\n  /**\n   * Build a Monks Token Bar save request for a target\n   */\n  buildMonksTokenBarRequest(target: Token, saveDetails: AnyMutableObject): MonksTokenBarRequest {\n    // Monks TokenBar's getTokenEntries reads: token, advantage, disadvantage, request, fastForward.\n    // dc/showdc are read from the top-level options (2nd arg to requestRoll), not per-token.\n    // We don't pass fastForward — let Monks use its own bypass-roll-dialog setting instead.\n    return {\n      token: target.id ?? \"\",\n      advantage: saveDetails.advantage as boolean | undefined,\n      disadvantage: saveDetails.disadvantage as boolean | undefined,\n    };\n  }\n\n  /**\n   * Build a Flash Rolls 5e save request for a target\n   */\n  buildFlashRollsRequest(target: Token, saveDetails: AnyMutableObject): FlashRollsRequest {\n    // dispatchFlashRollsSaves aggregates these into a single FlashAPI.requestRoll call,\n    // reading only: token, advantage, disadvantage from per-target entries.\n    return {\n      token: target.id ?? \"\",\n      advantage: saveDetails.advantage as boolean | undefined,\n      disadvantage: saveDetails.disadvantage as boolean | undefined,\n    };\n  }\n\n  /**\n   * Build an Epic Rolls 5e save request for a target\n   */\n  buildEpicRollsRequest(target: Token, saveDetails: AnyMutableObject): EpicRollsRequest {\n    return {\n      actorUuid: (target.actor as Actor).uuid,\n      advantage: saveDetails.advantage as boolean | undefined,\n      disadvantage: saveDetails.disadvantage as boolean | undefined,\n    };\n  }\n\n  /**\n   * Dispatch save requests to Monks Token Bar\n   */\n  dispatchMonksTokenBarSaves(\n    monkRequestsPlayer: MonksTokenBarRequest[],\n    monkRequestsGM: MonksTokenBarRequest[],\n    rollType: string,\n    rollAbilities: string[],\n    rollSkills: string[],\n    rollDC: number | undefined,\n    whisper: boolean,\n  ): void {\n    const monkRequests = monkRequestsPlayer.concat(monkRequestsGM);\n    if (monkRequests.length === 0) return;\n\n    // MTB request string format: \"save:dex\", \"ability:str\", \"skill:prc\"\n    let request: string | undefined;\n    if (rollType === \"save\") {\n      request = `save:${rollAbilities[0]}`;\n    } else if (rollType === \"check\") {\n      request = rollAbilities[0] ? `ability:${rollAbilities[0]}` : `dice:1d20`;\n    } else if (rollType === \"skill\") {\n      request = `skill:${rollSkills[0]}`;\n    }\n\n    const showdc = shouldDisplaySaveDC(this.actor);\n\n    // MTB requestRoll options only reads: request, silent, rollmode, dc, showdc, callback\n    const buildRequestData = (tokenData: MonksTokenBarRequest[], rollMode: string): AnyMutableObject => {\n      const requestData: AnyMutableObject = {\n        tokenData,\n        request,\n        silent: true,\n        showdc,\n        rollMode,\n      };\n      if (showdc && \"whisper\" !== configSettings.autoCheckSaves) {\n        requestData.dc = rollDC;\n      }\n      return requestData;\n    };\n\n    if (!whisper) {\n      const rollMode = ((this.activity.midiProperties?.rollMode ?? \"default\") !== \"default\")\n        ? this.activity.midiProperties!.rollMode\n        : CONST.DICE_ROLL_MODES.PUBLIC;\n      timedExecuteAsGM(\"monksTokenBarSaves\", buildRequestData(monkRequests, rollMode));\n    } else {\n      // Whisper mode - send GM and player requests separately with different roll modes\n      const playerRollMode = ((this.activity.midiProperties?.rollMode ?? \"default\") !== \"default\")\n        ? this.activity.midiProperties!.rollMode\n        : \"roll\";\n      if (monkRequestsPlayer.length > 0) {\n        timedExecuteAsGM(\"monksTokenBarSaves\", buildRequestData(monkRequestsPlayer, playerRollMode));\n      }\n      if (monkRequestsGM.length > 0) {\n        timedExecuteAsGM(\"monksTokenBarSaves\", buildRequestData(monkRequestsGM, CONST.DICE_ROLL_MODES.PRIVATE));\n      }\n    }\n  }\n\n  /**\n   * Dispatch save requests to Flash Rolls 5e\n   */\n  dispatchFlashRollsSaves(\n    flashRequestsPlayer: FlashRollsRequest[],\n    flashRequestsGM: FlashRollsRequest[],\n    rollType: string,\n    rollAbilities: string[],\n    rollSkills: string[],\n    rollTools: string[],\n    rollDC: number | undefined\n  ): void {\n    const flashRequests = flashRequestsPlayer.concat(flashRequestsGM);\n    if (flashRequests.length === 0) return;\n\n    // Determine Flash Token Bar requestType\n    let flashRequestType: string;\n    if (rollType === \"save\") {\n      flashRequestType = \"savingthrow\";\n    } else if (rollType === \"check\") {\n      flashRequestType = \"ability\";\n    } else if (rollType === \"skill\") {\n      flashRequestType = \"skill\";\n    } else if (rollType === \"tool\") {\n      flashRequestType = \"tool\";\n    } else {\n      flashRequestType = \"savingthrow\"; // default\n    }\n\n    const flashRollKey = rollAbilities?.[0] ?? rollSkills?.[0] ?? rollTools?.[0];\n    if (!flashRollKey) {\n      flashRequestType = \"custom\";\n    }\n    const flashRequest = {\n      requestType: flashRequestType,\n      rollKey: flashRollKey ?? \"1d20\",\n      actorIds: flashRequests.map(request => request.token),\n      dc: rollDC,\n      advantage: flashRequests.some(r => r.advantage) || undefined,\n      disadvantage: flashRequests.some(r => r.disadvantage) || undefined,\n      skipRollDialog: true,\n      sendAsRequest: true,\n      rollMode: ((this.activity.midiProperties?.rollMode ?? \"default\") !== \"default\")\n        ? this.activity.midiProperties!.rollMode\n        : \"roll\",\n      workflowId: this.id,\n    };\n\n    timedExecuteAsGM(\"flashTokenBarSaves\", flashRequest);\n  }\n\n  /**\n   * Dispatch save requests to Epic Rolls 5e\n   */\n  dispatchEpicRollsSaves(\n    rerRequestsPlayer: EpicRollsRequest[],\n    rerRequestsGM: EpicRollsRequest[],\n    rollType: string,\n    rollDC: number | undefined\n  ): void {\n    //@ts-expect-error\n    const BasicRoll = CONFIG.Dice.BasicRoll as typeof Roll;\n    const rerRequests = rerRequestsPlayer.concat(rerRequestsGM);\n    if (rerRequests.length === 0) return;\n\n    const rerType = rollType;\n    const abilityOrAssociated = this.saveActivity?.save?.ability.first() ?? this.saveActivity?.check?.associated.first();\n    const type = abilityOrAssociated ? `${rerType}.${abilityOrAssociated}` : \"custom\";\n    const rerRequest = {\n      actors: rerRequests.map(request => request.actorUuid),\n      contestants: [],\n      type,\n      options: {\n        DC: rollDC,\n        showDC: shouldDisplaySaveDC(this.actor),\n        blindRoll: configSettings.autoCheckSaves === \"whisper\",\n        showRollResults: false,\n        hideNames: true,\n        noMessage: true,\n        ...(abilityOrAssociated ? {} : { formula: \"1d20\" }),\n        rollSettings: rerRequests.map(request => ({\n          advantage: request.advantage,\n          disadvantage: request.disadvantage,\n          uuid: request.actorUuid\n        })),\n      }\n    };\n\n    //@ts-expect-error\n    ui.EpicRolls5e.requestRoll(rerRequest).then((rerResult: {\n      cancelled: boolean;\n      results: {\n        actor: Actor.Implementation;\n        roll: unknown;\n      }[];\n    }) => {\n      if (rerResult.cancelled) {\n        let roll = new BasicRoll(\"-1\");\n        roll = roll.evaluateSync({ strict: false });\n        for (let uuid of rerRequest.actors) {\n          const fn = this.saveRequests[uuid];\n          delete this.saveRequests[uuid];\n          fn(roll);\n        }\n      } else {\n        for (let rerRoll of rerResult.results) {\n          const actorUuid = rerRoll.actor.uuid;\n          const fn = this.saveRequests[actorUuid];\n          delete this.saveRequests[actorUuid];\n          const roll = Roll.fromJSON(JSON.stringify(rerRoll.roll));\n          fn(roll);\n        }\n      }\n    });\n  }\n\n  /**\n   * Create a player chat save request with timeout handling\n   */\n  createPlayerChatSaveRequest(\n    target: Token,\n    player: User,\n    saveDetails: AnyMutableObject,\n    rollType: string,\n    rollAbilities: string[],\n    rollSkills: string[],\n    rollTools: string[],\n    rollDC: number | undefined,\n    showRoll: boolean,\n    GMprompt: string,\n    isMagicSave: boolean,\n    rollAction: Function\n  ): { promise: Promise<Roll[] | Roll | null>, requestCard: Promise<ChatMessage | undefined> | undefined } {\n    const rollAbility = rollAbilities[0];\n    const rollSkill = rollSkills[0];\n    const rollTool = rollTools[0];\n    //@ts-expect-error\n    const BasicRoll = CONFIG.Dice.BasicRoll as typeof Roll;\n\n    const requestId = target?.id ?? foundry.utils.randomID();\n    const saveDisplay = (this.activity.saveDisplay ?? \"default\") === \"default\" ? configSettings.autoCheckSaves : this.activity.saveDisplay;\n\n    const promise = new Promise<Roll[] | Roll | null>((resolve) => {\n      this.saveRequests[requestId] = resolve;\n\n      // Set a timeout for taking over the roll\n      if (configSettings.playerSaveTimeout > 0) {\n        this.saveTimeouts[requestId] = setTimeout(async () => {\n          if (this.saveRequests[requestId]) {\n            delete this.saveRequests[requestId];\n            delete this.saveTimeouts[requestId];\n            let result: Roll[] | null;\n\n            // Only pass target DC if player should see success/failure (based on autoCheckSaves and visibility)\n            const showTargetDC = configSettings.autoCheckSaves !== \"whisper\" && shouldDisplaySaveDC(this.actor);\n            if (!game.user?.isGM && saveDisplay === \"allShow\") {\n              // Non-GM users don't have permission to create chat cards impersonating the GM\n              const rollMode = ((this.activity.midiProperties?.rollMode ?? \"default\") !== \"default\")\n                ? this.activity.midiProperties?.rollMode\n                : CONST.DICE_ROLL_MODES.PUBLIC;\n              result = await timedAwaitExecuteAsGM(\"rollAbility\", {\n                saveDetails,\n                displayOptions: {\n                  fastForward: true,\n                  chatMessage: showRoll,\n                  rollMode,\n                  showTargetDC\n                }\n              });\n            } else {\n              let config: AnyMutableObject = {\n                target: showTargetDC ? rollDC : undefined,\n                ability: rollAbility,\n                skill: rollSkill,\n                midiOptions: {\n                  workflowId: this.id,\n                  itemCardUuid: this.itemCardUuid,\n                  advantage: saveDetails.advantage,\n                  disadvantage: saveDetails.disadvantage,\n                  mapKeys: false,\n                  // Timeout: auto-resolve with best choice, patching.ts handles multi-choice auto-selection\n                  fastForward: true,\n                  recomputeAdvantage: true, // compute advantage/disadvantage from flags in roll function\n                  saveItemUuid: this.saveItem?.uuid,\n                  isConcentrationCheck: saveDetails.isConcentrationCheck,\n                  workflowOptions: saveDetails.workflowOptions,\n                  rollAbilities,\n                  rollSkills,\n                  rollTools,\n                  advantageByChoice: saveDetails.advantageByChoice\n                }\n              };\n              let dialog: AnyObject = { ability: rollAbility, skill: rollSkill, tool: rollTool };\n              let message: AnyObject = { create: showRoll };\n              if (rollType === \"tool\") {\n                let tool = target.actor?.items.get(this.saveActivity?.item.id ?? \"\");\n                //@ts-expect-error no dnd5e types\n                if (!tool) tool = target.actor?.items.find(i => i.type === \"tool\" && i.system.type.baseItem === rollTool);\n                if (!tool) {\n                  // No tool of the requested type - auto fail\n                  resolve([await new BasicRoll(\"-1\").evaluate()]);\n                  return;\n                } else {\n                  //@ts-expect-error no dnd5e-types\n                  config.bonus = tool.system.bonus;\n                  //@ts-expect-error no dnd5e-types\n                  config.prof = tool.system.prof;\n                  config.item = tool;\n                }\n              }\n              result = await rollAction.bind(target.actor)(config, dialog, message);\n              resolve(result);\n            }\n          }\n        }, (configSettings.playerSaveTimeout || 1) * 1000);\n      }\n    });\n\n    const requestCard = requestPCSave(\n      rollAbility ?? \"\",\n      rollType,\n      player.id!,\n      target.actor,\n      {\n        flavor: this.item.name ?? \"\",\n        requestId,\n        GMprompt,\n        isMagicSave: !!isMagicSave,\n        rollAbilities,\n        rollSkills,\n        rollTools,\n        saveDetails: saveDetails as pcSaveOptions[\"saveDetails\"]\n      }\n    );\n\n    return { promise, requestCard };\n  }\n\n  /**\n   * Create a standard socketlib save roll\n   */\n  createStandardSaveRoll(\n    target: Token,\n    saveDetails: SaveDetails,\n    whisper: boolean,\n    showRoll: boolean,\n    showRollDialog: boolean,\n    simulate: boolean\n  ): Promise<Roll[] | Roll | null> {\n    const { rollType, rollAbilities = [] } = saveDetails;\n    // Validate abilities for save/check types\n    if (rollType === \"save\" && rollAbilities.length === 0) {\n      console.warn(`midi-qol | createStandardSaveRoll called with rollType=save but no abilities`);\n      return Promise.resolve(null);\n    }\n    // Find a player owner for the roll if possible\n    let owner = playerFor(target);\n    if (!owner?.isGM && owner?.active) showRoll = true; // Always show player save rolls\n    if (!owner?.active) owner = preferredActiveGM();\n    // Fall back to rolling as the current user\n    if (!owner) owner = game.user;\n\n    let rollMode = ((this.activity.midiProperties?.rollMode ?? \"default\") !== \"default\")\n      ? this.activity.midiProperties!.rollMode\n      : whisper ? CONST.DICE_ROLL_MODES.PRIVATE : CONST.DICE_ROLL_MODES.PUBLIC;\n\n    if (!owner?.isGM) {\n      if ((this.activity.midiProperties?.rollMode ?? \"default\") === \"default\") {\n        if ([\"noneDialogPublic\", \"nonePublic\"].includes(configSettings.playerRollSaves)) {\n          rollMode = CONST.DICE_ROLL_MODES.PUBLIC;\n        } else if ([\"noneDialogPrivate\", \"none\"].includes(configSettings.playerRollSaves)) {\n          rollMode = CONST.DICE_ROLL_MODES.PRIVATE;\n        } else if (configSettings.playerRollSaves === \"noneDialogSelf\") {\n          rollMode = CONST.DICE_ROLL_MODES.SELF;\n        } else if (configSettings.playerRollSaves === \"noneDialogBlind\") {\n          rollMode = CONST.DICE_ROLL_MODES.BLIND;\n        }\n      }\n    }\n\n    // Only pass target DC if player should see success/failure (based on autoCheckSaves and visibility)\n    // GM always sees DC, non-GM only when visibility allows and not whisper mode\n    const showTargetDC = owner?.isGM || (configSettings.autoCheckSaves !== \"whisper\" && shouldDisplaySaveDC(this.actor));\n    return socketlibSocket.executeAsUser(\"rollAbility\", owner?.id, {\n      saveDetails,\n      displayOptions: {\n        fastForward: simulate || !showRollDialog,\n        chatMessage: showRoll,\n        rollMode,\n        showTargetDC\n      }\n    });\n  }\n\n  /**\n   * Queue a target's save roll to the appropriate handler based on settings\n   * Returns the promise and optionally adds to module-specific request arrays\n   */\n  queueTargetSaveRoll(options: QueueSaveRollOptions): { promise: Promise<Roll[] | Roll | null> | null, requestCard: Promise<ChatMessage | undefined> | undefined } {\n    const { target, saveDetails, rollInfo, isMagicSave, displayOptions, playerInfo, moduleFlags, moduleRequests } = options;\n    const { type: rollType, abilities: rollAbilities, skills: rollSkills, tools: rollTools, action: rollAction } = rollInfo;\n    const { whisper, showRoll, showRollDialog, simulate } = displayOptions;\n    const { player, GMprompt, playerChat } = playerInfo;\n    const { playerMonksTB, playerFlashTB, playerEpicRolls, gmMonksTB, gmFlashTB, gmRER } = moduleFlags;\n    // Check for friendly roll first\n    const friendlyRoll = this.getFriendlyTargetRoll(saveDetails as { isFriendly: boolean });\n    if (friendlyRoll) {\n      return { promise: friendlyRoll, requestCard: undefined };\n    }\n\n    // Monks Token Bar\n    if ((!player?.isGM && playerMonksTB) || (player?.isGM && gmMonksTB)) {\n      const promise = new Promise<Roll[] | Roll | null>((resolve) => {\n        let requestId = target.id ?? foundry.utils.randomID();\n        this.saveRequests[requestId] = resolve;\n      });\n\n      const requests = player?.isGM ? moduleRequests.monks.gm : moduleRequests.monks.player;\n      requests.push(this.buildMonksTokenBarRequest(target, saveDetails));\n      return { promise, requestCard: undefined };\n    }\n\n    // Flash Rolls 5e\n    if ((!player?.isGM && playerFlashTB) || (player?.isGM && gmFlashTB)) {\n      const promise = new Promise<Roll[] | Roll | null>((resolve) => {\n        let requestId = target.actor?.uuid ?? foundry.utils.randomID();\n        this.saveRequests[requestId] = resolve;\n      });\n\n      const requests = player?.isGM ? moduleRequests.flash.gm : moduleRequests.flash.player;\n      requests.push(this.buildFlashRollsRequest(target, saveDetails));\n      return { promise, requestCard: undefined };\n    }\n\n    // Epic Rolls 5e\n    if ((!player?.isGM && playerEpicRolls) || (player?.isGM && gmRER)) {\n      const promise = new Promise<Roll[] | Roll | null>((resolve) => {\n        let requestId = target.actor?.uuid ?? foundry.utils.randomID();\n        this.saveRequests[requestId] = resolve;\n      });\n\n      const requests = player?.isGM ? moduleRequests.epic.gm : moduleRequests.epic.player;\n      requests.push(this.buildEpicRollsRequest(target, saveDetails));\n      return { promise, requestCard: undefined };\n    }\n\n    // Player Chat save request\n    if ((player?.active && playerChat) || (player?.isGM && GMprompt === \"none\")) {\n      if (debugEnabled > 0) {\n        warn(`checkSaves | Player ${player?.name} controls actor ${(target.actor as Actor).name} - requesting ${rollAbilities[0]} ${rollType}`);\n      }\n      const result = this.createPlayerChatSaveRequest(\n        target, player!, saveDetails, rollType, rollAbilities, rollSkills, rollTools, saveDetails.rollDC as number | undefined,\n        showRoll, GMprompt, isMagicSave, rollAction\n      );\n      return { promise: result.promise, requestCard: result.requestCard };\n    }\n\n    // Standard socketlib roll\n    const promise = this.createStandardSaveRoll(\n      target, saveDetails, whisper, showRoll, showRollDialog, simulate\n    );\n    return { promise, requestCard: undefined };\n  }\n\n  /**\n   * Process a single target's save result - determine if saved, apply bonuses, update tracking sets\n   */\n  async processTargetSaveResult(\n    target: Token,\n    result: Roll[],\n    context: ProcessTargetSaveContext\n  ): Promise<void> {\n    const { rollDC, rollAbility, rollType, template, D20Roll } = context;\n\n    let saveRollTotal = result.reduce((acc, r) => acc + r.total!, 0);\n    let saveRolls = result;\n    this.updateAdvantageTrackingFromRoll(target, result);\n    let { isFumble, isCritical } = this.determineCriticalOrFumble(saveRolls[0], saveRollTotal);\n    const coverSaveBonus = await this.calculateCoverSaveBonus(target, template, rollAbility);\n    if (coverSaveBonus > 0 && coverSaveBonus < TOTAL_COVER && saveRolls[0]) {\n      // Inject cover bonus into the roll so it's visible in the roll tooltip\n      const OperatorTerm = foundry.dice.terms.OperatorTerm;\n      const NumericTerm = foundry.dice.terms.NumericTerm;\n      saveRolls[0].terms.push(\n        new OperatorTerm({ operator: \"+\" }),\n        new NumericTerm({ number: coverSaveBonus, options: { flavor: i18n(\"DND5E.Cover\") } })\n      );\n      saveRolls[0].resetFormula();\n      //@ts-expect-error _total is protected\n      saveRolls[0]._total += coverSaveBonus;\n      saveRollTotal += coverSaveBonus;\n    }\n\n    // Adjust the save dc if something changed it during the roll\n    let resultDC = rollDC ?? 0;\n    // @ts-expect-error no dnd5e-types\n    if (Number.isNumeric(result[0]?.options.target)) resultDC = result[0]!.options.target;\n    let saved = saveRollTotal >= resultDC;\n\n    if (checkRule(\"criticalSaves\")) {\n      saved = (isCritical || saveRollTotal >= resultDC) && !isFumble;\n    }\n    if (this.checkSculptOrCarefulSpells(target)) {\n      saved = true;\n    }\n    if (coverSaveBonus >= TOTAL_COVER) {\n      saved = true;\n    }\n\n    this.updateSaveFailSets(target, saved);\n\n    if (!this.item.flags?.[MODULE_ID]?.noProvokeReaction && !this.workflowOptions.noProvokeReaction) {\n      if (saved)\n        await doReactions(target, this.tokenUuid, this.attackRoll, \"reactionsavesuccess\", { workflow: this, activity: this.activity, item: this.item })\n      else\n        await doReactions(target, this.tokenUuid, this.attackRoll, \"reactionsavefail\", { workflow: this, activity: this.activity, item: this.item })\n    }\n    if (isCritical) this.criticalSaves = this.criticalSaves.add(target);\n\n    // Trigger target macros that might modify the roll\n    if (configSettings.allowUseMacro && this.workflowOptions.noTargetOnUseMacro !== true) {\n      const rollResults = await this.triggerTargetMacros([\"isSave\", \"isSaveSuccess\", \"isSaveFailure\"], new Set([target]), { saved }) as Record<string, Roll[]>;\n      const newRolls = rollResults[target.document.uuid];\n      if (newRolls?.[0] instanceof Roll) {\n        saveRolls = newRolls;\n        saveRollTotal = newRolls.reduce((acc, r) => acc + (r?.total ?? 0), 0);\n        saved = saveRollTotal >= resultDC;\n        ({ isFumble, isCritical } = this.determineCriticalOrFumble(saveRolls[0], saveRollTotal));\n      }\n    }\n\n    // Apply fail bonuses if the save failed\n    // @ts-expect-error no dnd5e-types\n    if (!(result[0] instanceof D20Roll)) result[0] = D20Roll.fromRoll(result[0]);\n    // @ts-expect-error no dnd5e-types\n    if (!saved && !Number.isNumeric(result[0].options.target)) {\n      const failBonusResult = await this.applyFailedSaveBonuses(target, result, saveRolls, rollType ?? \"\", rollAbility ?? \"\");\n      if (failBonusResult) {\n        saveRolls = failBonusResult.saveRolls;\n        saveRollTotal = failBonusResult.saveRollTotal;\n        saved = saveRollTotal >= resultDC;\n        ({ isFumble, isCritical } = this.determineCriticalOrFumble(saveRolls[0], saveRollTotal));\n      }\n    }\n\n    if (isFumble) this.fumbleSaves = this.fumbleSaves.add(target);\n    if (isCritical) this.criticalSaves = this.criticalSaves.add(target);\n    // Use only the actually-chosen ability (from midiChosenId or rollAbility), not all abilities from the activity\n    const saveAbilities = rollAbility ? new Set([rollAbility]) : this.saveActivity?.save?.ability;\n    if (await this.checkSuperSaver(target, saveAbilities))\n      this.superSavers = this.superSavers.add(target);\n    if (await this.checkSemiSuperSaver(target, saveAbilities))\n      this.semiSuperSavers = this.semiSuperSavers.add(target);\n\n    // Apply concentration save bonus if applicable\n    const concentrationResult = await this.applyConcentrationSaveBonus(target, saveRolls[0], resultDC, isCritical, isFumble);\n    if (concentrationResult) {\n      saveRolls[0] = concentrationResult.saveRoll;\n      saveRollTotal = concentrationResult.saveRollTotal;\n      saved = concentrationResult.saved;\n    }\n\n    this.updateSaveFailSets(target, saved);\n\n    if (game.user?.isGM) log(`Ability save/check: ${target.name} rolled ${saveRollTotal} vs ${rollAbility} DC ${rollDC}`);\n    await this.buildSaveDisplayEntry(target, saveRolls[0], saved, rollDC, coverSaveBonus);\n  }\n\n  /**\n   * Update the saves and failedSaves sets based on whether the target saved\n   */\n  updateSaveFailSets(target: Token, saved: boolean): void {\n    if (saved) {\n      this.saves = this.saves.add(target);\n      this.failedSaves.delete(target);\n      this.failedSaves = this.failedSaves;\n    } else {\n      this.saves.delete(target);\n      this.saves = this.saves;\n      this.failedSaves = this.failedSaves.add(target);\n    }\n  }\n\n  /**\n   * Apply fail bonuses (flags.midi-qol.save.fail) if the save failed\n   */\n  async applyFailedSaveBonuses(\n    target: Token,\n    result: Roll[],\n    saveRolls: Roll[],\n    rollType: string,\n    rollAbility: string\n  ): Promise<{ saveRolls: Roll[], saveRollTotal: number } | null> {\n    const failFlagsLength = collectBonusFlags(target.actor!, rollType, \"fail.all\").length;\n    const failAbilityFlagsLength = collectBonusFlags(target.actor!, rollType, `fail.${rollAbility}`).length;\n\n    if (!failFlagsLength && !failAbilityFlagsLength) return null;\n\n    // If the roll fails and there is a flags.midi-qol.save.fail then apply the bonus\n    let owner = playerFor(target);\n    if (!owner?.active) owner = game.users?.find((u: User) => u.isGM && u.active);\n    if (!owner) return null;\n\n    let newRoll: Roll;\n    if (owner?.isGM && game.user?.isGM) {\n      newRoll = await bonusCheck(target.actor!, result[0], rollType, failAbilityFlagsLength ? `fail.${rollAbility}` : \"fail.all\");\n    } else {\n      newRoll = await socketlibSocket.executeAsUser(\"bonusCheck\", owner?.id, {\n        actorUuid: (target.actor as Actor).uuid,\n        result: JSON.stringify(result[0].toJSON()),\n        rollType,\n        selector: failFlagsLength ? \"fail.all\" : `fail.${rollAbility}`\n      });\n    }\n\n    const updatedSaveRolls = [...saveRolls];\n    updatedSaveRolls[0] = Roll.fromJSON(JSON.stringify(newRoll)) as Roll<EmptyObject>;\n    const saveRollTotal = updatedSaveRolls.reduce((acc, r) => acc + r.total!, 0);\n\n    return { saveRolls: updatedSaveRolls, saveRollTotal };\n  }\n\n  /**\n   * Compute module integration settings for save rolls (Monks TB, Flash Rolls, Epic Rolls)\n   */\n  computeModuleIntegrationSettings(simulate: boolean, flagRollType: string): {\n    flags: ModuleIntegrationFlags;\n    requests: ModuleIntegrationRequests;\n  } {\n    const playerMonksTB = !simulate && flagRollType !== \"tool\" && !!installedModules.get(\"monks-tokenbar\") && configSettings.playerRollSaves === \"mtb\";\n    const playerFlashTB = !simulate && !!installedModules.get(\"flash-rolls-5e\") && configSettings.playerRollSaves === \"ftb\";\n    const playerEpicRolls = !simulate && !!installedModules.get(\"epic-rolls-5e\") && configSettings.playerRollSaves === \"rer\";\n\n    return {\n      flags: {\n        playerMonksTB,\n        playerFlashTB,\n        playerEpicRolls,\n        gmMonksTB: false,  // Set per-target in determineTargetRollSettings\n        gmFlashTB: false,\n        gmRER: false\n      },\n      requests: {\n        monks: { player: [], gm: [] },\n        flash: { player: [], gm: [] },\n        epic: { player: [], gm: [] }\n      }\n    };\n  }\n\n  /**\n   * Build SaveDetails for a target, including magic resistance/vulnerability and advantage checks.\n   * When multiple choices are available (abilities, skills, or tools), pre-computes advantage\n   * for each option and stores results in saveDetails.advantageByChoice.\n   * A roll is always ONE type, so a single map suffices.\n   */\n  async buildSaveDetailsForTarget(\n    target: Token,\n    context: {\n      rollDC: number | undefined;\n      rollType: string | undefined;\n      rollAbilities: string[];\n      rollSkills: string[];\n      rollTools: string[];\n      flagRollType: string;\n      isMagicSave: boolean;\n      actorDisposition: number;\n    }\n  ): Promise<SaveDetails> {\n    const { rollDC, rollType, isMagicSave, actorDisposition, rollAbilities, rollSkills, rollTools } = context;\n    const targetDocument = target.document;\n\n    const saveDetails: SaveDetails = {\n      actorUuid: target.actor?.uuid ?? \"\",\n      advantage: undefined,\n      disadvantage: undefined,\n      modifierTracker: undefined,\n      isMagicSave: !!isMagicSave,\n      isFriendly: targetDocument?.disposition === actorDisposition,\n      isConcentrationCheck: undefined,\n      rollDC: rollDC ?? 0,\n      saveItemUuid: this.saveItem?.uuid ?? \"\",\n      workflowId: this.id,\n      itemCardUuid: this.itemCardUuid ?? \"\",\n      workflowOptions: this.workflowOptions,\n      rollType: rollType ?? \"save\",\n      rollAbilities,\n      rollSkills,\n      rollTools,\n      itemId: this.saveActivity?.item.id ?? \"\",\n    };\n\n    // Check ability advantage/disadvantage from settings, source grants flags, and magic resistance/vulnerability\n    // Use the shared helper to compute full trackers (advantage + roll modifiers) for all abilities\n    const abilityId = this.saveActivity!.save?.ability?.first() ?? this.saveActivity!.check?.ability ?? \"\";\n    const preComputedMap = await buildPreComputedAdvantageMap(\n      target.actor!,\n      rollType ?? \"\",\n      rollAbilities,\n      { workflow: this, isMagicSave: !!isMagicSave }\n    );\n\n    // Get the default ability's tracker for saveDetails\n    const defaultAbilityData = preComputedMap[abilityId];\n    // tracker is always a RollModifierTracker instance here (before socketlib serialization)\n    saveDetails.modifierTracker = defaultAbilityData?.tracker instanceof RollModifierTracker ? defaultAbilityData.tracker : undefined;\n    saveDetails.advantage = defaultAbilityData?.hasAdvantage;\n    saveDetails.disadvantage = defaultAbilityData?.hasDisadvantage;\n    saveDetails.isConcentrationCheck = this.item.flags?.[MODULE_ID]?.isConcentrationCheck;\n\n    // Pre-compute advantage for all choices when multiple are available.\n    // A roll is always ONE type (save, skill check, or tool check), so we use a single object.\n    // tracker.toJSON() is called automatically during socketlib transmission; GMAction reconstructs.\n    const multipleChoices = rollAbilities.length > 1 || rollSkills.length > 1 || rollTools.length > 1;\n    if (multipleChoices) {\n      // Determine which type has multiple choices and build the object\n      let choiceMap: Record<string, PreComputedAdvantage>;\n      if (rollAbilities.length > 1) {\n        // Already computed above for abilities\n        choiceMap = preComputedMap;\n      } else if (rollSkills.length > 1) {\n        choiceMap = await buildPreComputedAdvantageMap(\n          target.actor!,\n          \"skill\",\n          rollSkills,\n          { workflow: this, isMagicSave: false }\n        );\n      } else {\n        choiceMap = await buildPreComputedAdvantageMap(\n          target.actor!,\n          \"tool\",\n          rollTools,\n          { workflow: this, isMagicSave: false }\n        );\n      }\n\n      // Copy the choice map data to saveDetails (tracker is always an instance here, before socketlib)\n      saveDetails.advantageByChoice = choiceMap;\n    }\n\n    // Check for friendly target auto-fail/success from activity settings\n    if (saveDetails.isFriendly && saveDetails.modifierTracker) {\n      // @ts-expect-error no dnd5e-types\n      const descriptionIncludesAutoFail = this.item.system.description?.value?.toLowerCase().includes(i18n(\"midi-qol.autoFailFriendly\")?.toLowerCase());\n      if (descriptionIncludesAutoFail || this.activity.friendlySave === \"friendlyFail\") {\n        saveDetails.modifierTracker.addAttribution('FAIL', \"friendlyFail\", i18n(\"midi-qol.FriendlyAutoFail\"));\n      } else if (this.activity.friendlySave === \"friendlySuccess\") {\n        saveDetails.modifierTracker.addAttribution('SUCCESS', \"friendlySuccess\", i18n(\"midi-qol.FriendlyAutoSuccess\"));\n      }\n    }\n\n    // Update advantage/disadvantage tracking sets\n    if (saveDetails.advantage && !saveDetails.disadvantage) this.advantageSaves = this.advantageSaves.add(target);\n    else if (saveDetails.disadvantage && !saveDetails.advantage) this.disadvantageSaves?.add(target);\n\n    return saveDetails;\n  }\n\n  /**\n   * Normalize roll results to ensure they are all Roll[] arrays\n   */\n  normalizeRollResults(results: (Roll | Roll[] | null)[], D20Roll: typeof Roll): Roll[][] {\n    const normalized: Roll[][] = [];\n    for (let i = 0; i < results.length; i++) {\n      const currResult = results[i];\n      if (currResult instanceof Roll) {\n        normalized[i] = [currResult];\n      } else if (currResult instanceof Array) {\n        normalized[i] = currResult.map(r => {\n          if (!(r instanceof Roll)) {\n            return D20Roll.fromJSON(JSON.stringify(r)) as Roll<EmptyObject>;\n          }\n          return r;\n        });\n      } else {\n        normalized[i] = [];\n      }\n    }\n    return normalized;\n  }\n\n  /**\n   * update this.saves to be a Set of successful saves from the set of tokens this.hitTargets and failed saves to be the complement\n   */\n\n  async checkSaves(whisper = false, simulate = false) {\n    this.initSaveResults();\n    this.targetSaveDetails = {};\n    if (debugEnabled > 1) debug(`checkSaves: whisper ${whisper}  hit targets ${this.hitTargets}`)\n    if (this.hitTargets.size <= 0 && this.hitTargetsEC.size <= 0) {\n      this.saveDisplayFlavor = `<span>${i18n(\"midi-qol.noSaveTargets\")}</span>`\n      return;\n    }\n\n    if (!this.saveActivity) return;\n    const allHitTargets = new Set([...this.hitTargets, ...this.hitTargetsEC]);\n    if (allHitTargets.size === 0) return;\n    let rollDC = this.saveActivity?.save?.dc.value ?? this.saveActivity?.check?.dc.value;\n    //@ts-expect-error\n    const D20Roll = CONFIG.Dice.D20Roll as typeof Roll;\n\n    this.saveDC = rollDC;\n    const requestCards: Array<Promise<ChatMessage | undefined> | undefined> = [];\n    let promises: Promise<Roll[] | Roll | null>[] = [];\n    const { rollAction, rollType, rollAbilities, rollSkills, rollTools, flagRollType } = this.determineRollTypeAndAction();\n    if (!rollAction) return; // No save or check configured on activity\n\n    // Validate that abilities are set for save types (checks can be plain d20 with no ability)\n    if (rollType === \"save\" && rollAbilities.length === 0) {\n      console.warn(`midi-qol | ${this.item.name} ${this.saveActivity?.name} has a save activity but no ability configured`);\n      return;\n    }\n\n    const { flags: moduleFlags, requests: moduleRequests } = this.computeModuleIntegrationSettings(simulate, flagRollType ?? \"\");\n    const { playerMonksTB, playerFlashTB, playerEpicRolls } = moduleFlags;\n    const saveDisplay = (this.activity.saveDisplay ?? \"default\") === \"default\" ? configSettings.autoCheckSaves : this.activity.saveDisplay;\n    // @ts-expect-error no dnd5e-types\n    const isMagicSave = this.item.type === \"spell\" || this.activity.midiProperties?.magicEffect;\n\n    try {\n      let actorDisposition: number;\n      if (this.token && this.token.document?.disposition !== undefined) actorDisposition = this.token.document.disposition;\n      else { // no token to use so make a guess\n        // @ts-expect-error no dnd5e-types\n        actorDisposition = this.actor.type === \"npc\" ? -1 : 1;\n      }\n\n      for (let target of allHitTargets) {\n        if (!target || !target?.actor) continue;\n        let showRoll = saveDisplay === \"allShow\";\n        if (simulate) showRoll = false;\n        if (!this.item.flags?.[MODULE_ID]?.noProvokeReaction && !this.workflowOptions.noProvokeReaction) {\n          await doReactions(target, this.tokenUuid, this.attackRoll ?? new Roll(\"\"), \"reactionsave\", { workflow: this, activity: this.activity, item: this.item })\n        }\n\n        // Build save details for this target\n        const saveDetails = await this.buildSaveDetailsForTarget(target, {\n          rollDC,\n          rollType,\n          rollAbilities,\n          rollSkills,\n          rollTools,\n          flagRollType: flagRollType ?? \"\",\n          isMagicSave: !!isMagicSave,\n          actorDisposition\n        });\n\n        // Determine roll settings for this target\n        const { player, showRollDialog, GMprompt, gmMonksTB, gmFlashTB, gmRER, playerChat } =\n          this.determineTargetRollSettings(target, flagRollType, simulate);\n\n        this.saveDetails = saveDetails;\n        // Store per-target saveDetails for later retrieval during result processing\n        const targetDocUuid = getTokenDocument(target)?.uuid;\n        if (targetDocUuid && this.targetSaveDetails) this.targetSaveDetails[targetDocUuid] = saveDetails;\n        // Call preTargetSave hook - allows external modules to modify saveDetails/tracker before the roll\n        await asyncHooksCallAll(\"midi-qol.preTargetSave\", target, this, saveDetails);\n        if (configSettings.allowUseMacro && this.workflowOptions.noTargetOnUseMacro !== true) await this.triggerTargetMacros([\"preTargetSave\"], new Set([target]));\n\n        // Queue the save roll using the appropriate handler\n        const { promise, requestCard } = this.queueTargetSaveRoll({\n          target,\n          saveDetails,\n          rollInfo: {\n            type: rollType ?? \"save\",\n            abilities: rollAbilities,\n            skills: rollSkills,\n            tools: rollTools,\n            action: rollAction\n          },\n          isMagicSave: !!isMagicSave,\n          displayOptions: {\n            whisper,\n            showRoll,\n            showRollDialog,\n            simulate\n          },\n          playerInfo: {\n            player,\n            GMprompt: typeof GMprompt === \"string\" ? GMprompt : \"none\",\n            playerChat\n          },\n          moduleFlags: {\n            playerMonksTB,\n            playerFlashTB,\n            playerEpicRolls,\n            gmMonksTB: gmMonksTB ?? false,\n            gmFlashTB: gmFlashTB ?? false,\n            gmRER: gmRER ?? false\n          },\n          moduleRequests\n        });\n\n        if (promise) promises.push(promise);\n        if (requestCard) requestCards.push(requestCard);\n      }\n    } catch (err) {\n      TroubleShooter.recordError(err);\n      console.warn(err)\n    }\n\n    // Dispatch batched requests to external modules\n    this.dispatchMonksTokenBarSaves(\n      moduleRequests.monks.player, moduleRequests.monks.gm,\n      rollType ?? \"save\", rollAbilities, rollSkills, rollDC,\n      whisper,\n    );\n    this.dispatchFlashRollsSaves(\n      moduleRequests.flash.player, moduleRequests.flash.gm,\n      rollType ?? \"save\", rollAbilities, rollSkills, rollTools, rollDC\n    );\n    this.dispatchEpicRollsSaves(\n      moduleRequests.epic.player, moduleRequests.epic.gm,\n      rollType ?? \"save\", rollDC\n    );\n\n    if (debugEnabled > 1) debug(\"check saves: requests are \", this.saveRequests)\n    const rawResults = await Promise.all(promises);\n    (await Promise.all(requestCards)).forEach(chatMessage => chatMessage?.delete());\n    const epicRequests = moduleRequests.epic.player.concat(moduleRequests.epic.gm);\n    if (epicRequests?.length > 0) await busyWait(10);\n    // Keep saveDetails for the last target (used for attribution tracking)\n    const results = this.normalizeRollResults(rawResults, D20Roll);\n    this.saveResults = results.filter(r => !!r).flat();\n\n    // Get template for area target saves (also when templateUuid is set explicitly via midiOptions)\n    let template: foundry.canvas.placeables.MeasuredTemplate.Implementation | undefined | null;\n    if (this.templateUuid) {\n      const templateDocument = await fromUuid(this.templateUuid) as MeasuredTemplateDocument | null;\n      template = templateDocument?.object;\n    }\n\n    // Process each target's save result\n    const processContext = { rollDC, rollAbility: rollAbilities[0], rollType, template, D20Roll };\n    let i = 0;\n    for (let target of allHitTargets) {\n      if (!target.actor) continue; // these were skipped when doing the rolls so they can be skipped now\n\n      // Ensure we have a valid result array\n      if (!results[i]?.[0] || results[i]?.[0]?.total === undefined) {\n        const message = `Token ${target.name} could not roll save/check assuming 1`;\n        error(message, target);\n        TroubleShooter.recordError(new Error(message), message);\n        results[i] = [await new D20Roll(\"1\").evaluate()];\n      }\n\n      const tmpResult = results[i];\n      const result = tmpResult instanceof Array\n        ? tmpResult\n        : tmpResult\n          ? [tmpResult]\n          : [new D20Roll(\"1\").evaluateSync()];\n\n      // Update rollAbility to the actually-chosen ability from the roll's midiChosenId\n      //@ts-expect-error midiChosenId is a custom roll option\n      const midiChosenId: string | undefined = result[0]?.options?.midiChosenId;\n      if (midiChosenId) processContext.rollAbility = midiChosenId;\n\n      await this.processTargetSaveResult(target, result, processContext);\n      i++;\n    }\n\n    this.saveDisplayFlavor = await this.computeSaveDisplayFlavor(rollDC, rollType ?? \"\", { rollAbilities: rollAbilities ?? [], rollSkills: rollSkills ?? [], rollTools: rollTools ?? [] });\n  }\n\n\n  async computeSaveDisplayFlavor(rollDC: number | undefined, rollType: string, options: { rollAbilities: string[], rollSkills: string[], rollTools: string[] }): Promise<string> {\n    let { rollAbilities, rollSkills, rollTools } = options;\n    const allHitTargets = new Set([...this.hitTargets, ...this.hitTargetsEC]);\n    let DCString = i18n(\"DND5E.AbbreviationDC\") ?? \"DC\";\n    if (DCString === \"DND5E.AbbreviationDC\") DCString = \"DC\";\n    DCString = `${DCString} ${rollDC}`;\n    if ((rollDC ?? -1) === -1) DCString = \"\";\n    const dcLabel = `<label class=\"midi-qol-saveDC\">${DCString}</label>`;\n\n    if (rollType === \"save\") {\n      const throwLabel = i18n(allHitTargets.size > 1 ? \"midi-qol.saving-throws\" : \"midi-qol.saving-throw\");\n      const lines = rollAbilities.map(ability =>\n        `${dcLabel} ${GameSystemConfig.abilities[ability]?.label ?? ability} ${throwLabel}`\n      );\n      return lines.join(\"<br>\");\n    } else if (rollType === \"check\") {\n      if (rollAbilities.length === 0) {\n        return `${dcLabel} ${i18n(\"midi-qol.plain-d20-roll\")}:`;\n      }\n      const checkLabel = i18n(allHitTargets.size > 1 ? \"midi-qol.ability-checks\" : \"midi-qol.ability-check\");\n      const lines = rollAbilities.map(ability =>\n        `${dcLabel} ${GameSystemConfig.abilities[ability]?.label ?? ability} ${checkLabel}:`\n      );\n      return lines.join(\"<br>\");\n    } else if (rollType === \"skill\") {\n      const lines = rollSkills.map(skill =>\n        `${dcLabel} ${GameSystemConfig.skills[skill]?.label ?? skill}`\n      );\n      return lines.join(\"<br>\");\n    } else if (rollType === \"tool\") {\n      const lines: string[] = [];\n      for (const tool of rollTools) {\n        //@ts-expect-error no dnd5e-types\n        const toolLabel = await game.system?.documents.Trait.keyLabel(`tool:${tool}`);\n        lines.push(`${dcLabel} ${toolLabel}`);\n      }\n      return lines.join(\"<br>\");\n    }\n    return \"\";\n  }\n\n  monksSavingCheck(message: ChatMessage.Implementation, update: ChatMessage.UpdateData, _options: ChatMessage.Database.UpdateOptions, _userId: string) {\n    if (!update.flags || !update.flags[\"monks-tokenbar\"]) return true;\n    const mflags = message.flags[\"monks-tokenbar\"];\n    for (let key of Object.keys(mflags)) {\n      if (!key.startsWith(\"token\")) continue;\n      if (!mflags[key].roll) continue;\n      const requestId = key.replace(\"token\", \"\");\n      if (!mflags[key].reveal) continue; // Must be showing the roll\n      if (this.saveRequests[requestId]) {\n        let roll: Roll.Any;\n        try {\n          roll = Roll.fromJSON(JSON.stringify(mflags[key].roll));\n        } catch (err) {\n          roll = foundry.utils.deepClone(mflags[key].roll);\n        }\n\n        const func = this.saveRequests[requestId];\n        delete this.saveRequests[requestId];\n        func(roll)\n      }\n    }\n    return true;\n  }\n\n  flashSavingCheck(data: { actorUuid: string; roll: Roll.Any; total: number }) {\n    if (debugEnabled > 0) debug(`flashSavingCheck | Received roll for ${data.actorUuid}`, data);\n    if (debugEnabled > 0) debug(`flashSavingCheck | Available saveRequests keys:`, Object.keys(this.saveRequests));\n\n    const requestId = data.actorUuid;\n    if (!this.saveRequests[requestId]) {\n      if (debugEnabled > 0) debug(`flashSavingCheck | No pending request for ${requestId}`);\n      return;\n    }\n\n    const func = this.saveRequests[requestId];\n    delete this.saveRequests[requestId];\n    if (debugEnabled > 0) debug(`flashSavingCheck | Resolving save for ${requestId} with roll total ${data.total}`);\n    func(data.roll);\n  }\n\n  async displayChatCardWithoutDamageDetail() {\n    let chatMessage = getCachedDocument(this.itemCardUuid) as ChatMessage.Implementation | undefined;\n    let data: ChatMessage.CreateData | undefined;\n    if (chatMessage?.content) {\n      let content = chatMessage.content;\n      data = chatMessage!.toObject();\n      content = data.content || \"\";\n      let searchRe = /<div[^>]*?class=\"midi-qol-damage-roll[^\"]*\"[\\s\\S]*?<div class=\"end-midi-qol-damage-roll\">/;\n      let replaceString = `<div class=\"midi-qol-damage-roll\"><div class=\"end-midi-qol-damage-roll\">`\n      content = content.replace(searchRe, replaceString);\n      searchRe = /<div[^>]*?class=\"midi-qol-other-roll\"[\\s\\S]*?<div class=\"end-midi-qol-other-roll\">/;\n      replaceString = `<div class=\"midi-qol-other-roll\"><div class=\"end-midi-qol-other-roll\">`\n      content = content.replace(searchRe, replaceString);\n      searchRe = /<div[^>]*?class=\"midi-qol-bonus-roll\">[\\s\\S]*?<div class=\"end-midi-qol-bonus-roll\">/;\n      replaceString = `<div class=\"midi-qol-bonus-roll\"><div class=\"end-midi-qol-bonus-roll\">`\n      content = content.replace(searchRe, replaceString);\n    }\n    if (installedModules.get(\"ready-set-roll-5e\")) return;\n    if (data && this.currentAction === this.WorkflowState_Completed) {\n      if (this.itemCardUuid) {\n        await Workflow.removeItemCardButtons(this.itemCardUuid, { removeAllButtons: true });\n      }\n      delete data._id;\n      const itemCard = await CONFIG.ChatMessage.documentClass.create(data);\n      this.itemCardUuid = itemCard?.uuid;\n    }\n  }\n\n  async callDamageHooksAndMacros(damages: DamageListEntry, token: Token.Implementation) {\n    this.damageItem = damages;\n    if (configSettings.allowUseMacro && !this.workflowOptions?.noTargetOnUseMacro && this.item.flags) {\n      await this.triggerTargetMacros([\"preTargetDamageApplication\"], new Set([token]));\n    }\n    await asyncHooksCallAll(`midi-qol.preTargetDamageApplication`, token, { item: this.item, workflow: this, damageItem: damages, ditem: damages });\n\n    if ((damages.hpDamage !== 0 || damages.tempDamage > 0) && (this.hitTargets.has(token) || this.hitTargetsEC.has(token) || this.otherActivity?.save || this.otherActivity?.check)) {\n      let healedDamaged = damages.hpDamage < 0 ? \"isHealed\" : \"isDamaged\";\n      await asyncHooksCallAll(`midi-qol.${healedDamaged}`, token, { item: this.item, workflow: this, damageItem: damages, ditem: damages });\n      const actorOnUseMacros = foundry.utils.getProperty(token.actor ?? {}, midiFlag(`onUseMacroParts`)) as OnUseMacros ?? new OnUseMacros();\n      // It seems applyTokenDamageMany without a this gets through to here - so a silly guard in place TODO come back and fix this properly\n      if (this.callMacros) await this.callMacros(this.item,\n        actorOnUseMacros?.getMacros(healedDamaged),\n        \"TargetOnUse\",\n        healedDamaged,\n        { actor: token.actor, token: token });\n      healedDamaged = damages.hpDamage < 0 ? \"isHealed\" : \"isDamaged\";  //recalculate what the total damage and trigger the correct special duration expiration.\n      const expiredEffects = getAppliedEffects(token?.actor, { includeEnchantments: true }).filter(ef => {\n        const specialDuration = ef.flags?.dae?.specialDuration;\n        if (!specialDuration) return false;\n        return specialDuration.includes(healedDamaged);\n      }).map(ef => ef.uuid)\n      if ((expiredEffects?.length ?? 0) > 0) {\n        await timedAwaitExecuteAsGM(\"removeEffectUuids\", {\n          actorUuid: token.actor?.uuid,\n          effects: expiredEffects,\n          options: { \"expiry-reason\": `midi-qol:${healedDamaged}` }\n        });\n      }\n    }\n    // Call the preDamageApplication hook which can change the damage\n    if (configSettings.allowUseMacro && this.item.flags) {\n      await this.callMacros(this.item, this.onUseMacros?.getMacros(\"preDamageApplication\"), \"OnUse\", \"preDamageApplication\");\n      if (this.ammunition) await this.callMacros(this.ammunition, this.ammunitionOnUseMacros?.getMacros(\"preDamageApplication\"), \"OnUse\", \"preDamageApplication\", damages);\n    }\n    Object.assign(damages, this.damageItem);\n\n  }\n\n  processDefenceRoll(message: ChatMessage.Implementation, _html: HTMLElement, _data: ChatMessage.MessageData) {\n    if (!this.defenceRequests) return true;\n    const requestId = message?.speakerActor?.uuid;\n    if (debugEnabled > 0) warn(\"processDefenceRoll |\", requestId, this.saveRequests)\n\n    if (!requestId) return true;\n    if (!this.defenceRequests[requestId]) return true;\n\n    clearTimeout(this.defenceTimeouts[requestId]);\n    const handler = this.defenceRequests[requestId];\n    if (!handler) // the roll must have timed out so ignore this result\n      return true;\n    delete this.defenceRequests[requestId];\n    delete this.defenceTimeouts[requestId];\n    handler(message.rolls[0])\n    return true;\n  }\n\n  processSaveRoll(message: ChatMessage.Implementation, _html: HTMLElement | ChatMessage.Database.CreateOptions, _dataOrUserId: ChatMessage.MessageData | string) {\n    if (!this.saveRequests) return {};\n    const ddbglFlags = message.flags && message.flags[\"ddb-game-log\"];\n    const isDDBGL = ddbglFlags?.cls === \"save\" && !ddbglFlags?.pending;\n    const isRoll = message.flags?.dnd5e?.messageType === \"roll\";\n    let requestId = message?.speaker?.token;\n    if (!requestId && isDDBGL) requestId = message?.speaker?.actor;\n    if (debugEnabled > 0) warn(\"processSaveRoll |\", requestId, this.saveRequests)\n    if (!requestId) return true;\n\n    // TODO check the roll against the sort of roll we are waiting for.\n    if (!this.saveRequests[requestId] || !isRoll) return true;\n\n    if (this.saveRequests[requestId]) {\n      clearTimeout(this.saveTimeouts[requestId]);\n      const handler = this.saveRequests[requestId]\n      delete this.saveRequests[requestId];\n      delete this.saveTimeouts[requestId];\n      if (configSettings.undoWorkflow) {\n        if (this.undoData) this.undoData.chatCardUuids.push(message.uuid);\n        unTimedExecuteAsGM(\"updateUndoChatCardUuids\", this.undoData);\n      }\n      handler(message.rolls[0])\n    }\n    const saveDisplay = (this.activity.saveDisplay ?? \"default\") === \"default\" ? configSettings.autoCheckSaves : (this.activity.saveDisplay as string)\n    if (game.user?.id !== message.author?.id && ![\"allShow\"].includes(saveDisplay)) {\n      setTimeout(() => ui.chat?.element.querySelector(`[data-message-id=\"${message.id}\"]`)?.remove(), 100);\n    }\n    return true;\n  }\n\n  async checkSuperSaver(token: Token.Implementation, abilities: Set<string> | undefined): Promise<boolean> {\n    if (!abilities) return false;\n    for (let ability of abilities.values()) {\n      const flags = token.actor?.flags?.[MODULE_ID]?.superSaver;\n      if (!flags) return false;\n      if (flags.all) {\n        const flagVal = await evalActivationCondition(this, flags.all, token, { errorReturn: false });\n        if (flagVal) return true;\n      }\n      if (flags[ability]) {\n        const flagVal = await evalActivationCondition(this, flags[ability], token, { errorReturn: false });\n        if (flagVal) return true;\n      }\n      // @ts-expect-error no dnd5e-types\n      if (this.actor.flags?.[MODULE_ID]?.sculptSpells && this.item.school === \"evo\" && this.preSelectedTargets.has(token)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  async checkSemiSuperSaver(token: Token.Implementation, abilities: Set<string> | undefined): Promise<boolean> {\n    if (!abilities) return false;\n    for (let ability of abilities.values()) {\n      const flags = token.actor?.flags?.[MODULE_ID]?.semiSuperSaver;\n      if (!flags) return false;\n      if (flags.all) {\n        const flagVal = await evalActivationCondition(this, flags.all, token, { errorReturn: false });\n        if (flagVal) return true;\n      }\n      if (flags[ability]) {\n        const flagVal = await evalActivationCondition(this, flags[ability], token, { errorReturn: false });\n        if (flagVal) return true;\n      }\n    }\n    return false;\n  }\n\n  // TODO: Kill?\n  // processCustomRoll(customRoll: any) {\n  //   const formula = \"1d20\";\n  //   const isSave = customRoll.fields.find(e => e[0] === \"check\");\n  //   if (!isSave) return true;\n  //   const rollEntry = customRoll.entries?.find((e) => e.type === \"multiroll\");\n  //   let total = rollEntry?.entries?.find((e) => !e.ignored)?.total ?? -1;\n  //   let advantage = rollEntry ? rollEntry.rollState === \"highest\" : undefined;\n  //   let disadvantage = rollEntry ? rollEntry.rollState === \"lowest\" : undefined;\n  //   return ({ total, formula, terms: [{ options: { advantage, disadvantage } }] });\n  // }\n\n  async processAttackRoll() {\n    if (!this.attackRoll) return;\n    const terms = this.attackRoll.terms;\n\n    if (terms[0] instanceof foundry.dice.terms.NumericTerm) {\n      this.diceRoll = Number(terms[0].total);\n    } else {\n      const dterm = terms[0] as foundry.dice.terms.DiceTerm;\n      const activeResult = dterm.results?.find(d => d.active);\n      this.diceRoll = activeResult ? Number(activeResult.result) : Number(terms[0].total);\n    }\n\n    // For natural critical/fumble detection, use the actual die face when auto-success/fail\n    // is active (min99/max1 from success.attack/fail.attack flags), since those just force\n    // hit/miss without implying a natural crit/fumble. Regular min/max modifiers (e.g. min20\n    // from min.attack.all) should use terms[0].total which includes the modifier adjustment.\n    let critFumbleDiceRoll = this.diceRoll;\n    if (this.attackRollModifierTracker.modifiers.willSucceed || this.attackRollModifierTracker.modifiers.willFail) {\n      if (!(terms[0] instanceof foundry.dice.terms.NumericTerm)) {\n        const dterm = terms[0] as foundry.dice.terms.DiceTerm;\n        const activeResult = dterm.results?.find(d => d.active);\n        if (activeResult) critFumbleDiceRoll = Number(activeResult.result);\n      }\n    }\n\n    // @ts-expect-error no dnd5e-types\n    let criticalThreshold = this.attackRoll.options.criticalSuccess ?? 20;\n    if (this.targets.size > 0) {\n      const midiFlags = this.targets.first()?.actor?.flags[MODULE_ID];\n      let targetCrit = criticalThreshold;\n      if (midiFlags?.grants?.criticalThreshold) {\n        const conditionData = createConditionData({ workflow: this, target: this.targets.first(), actor: this.actor });\n        targetCrit = await evalCondition(midiFlags.grants.criticalThreshold, conditionData, { errorReturn: criticalThreshold, async: true });\n      }\n      if (isNaN(targetCrit) || !Number.isNumeric(targetCrit)) targetCrit = criticalThreshold;\n      criticalThreshold = Math.min(criticalThreshold, targetCrit);\n    }\n\n    // Determine natural critical/fumble from thresholds\n    const naturalCritical = critFumbleDiceRoll >= criticalThreshold;\n    if (naturalCritical) {\n      this.attackRollModifierTracker.critical.setNatural('naturalCrit', `${i18n(\"DND5E.Roll\")} >= ${criticalThreshold}`);\n    }\n\n    const midiFumble: number = (this.activity?.fumbleThreshold as number) ?? 1;\n    //@ts-expect-error no dnd5e-types\n    const attackRollFumbleTarget = this.attackRoll.options.criticalFailure;\n    const fumbleTarget =\n      attackRollFumbleTarget === 0 || midiFumble === 0 && attackRollFumbleTarget === 1\n        ? 0\n        : Math.max(attackRollFumbleTarget, midiFumble);\n\n    const naturalFumble = critFumbleDiceRoll <= fumbleTarget;\n    if (naturalFumble) {\n      this.attackRollModifierTracker.fumble.setNatural('naturalFumble', `${i18n(\"DND5E.Roll\")} <= ${fumbleTarget}`);\n    }\n\n    // Evaluate actor critical/fumble flags using tracker\n    const actionType = this.activity?.actionType;\n    const actorCriticalFlags: CriticalModifierFlags = {\n      criticalFlags: actionType ? [\"critical.all\", `critical.${actionType}`] : [\"critical.all\"],\n      noCriticalFlags: actionType ? [\"noCritical.all\", `noCritical.${actionType}`] : [\"noCritical.all\"],\n      fumbleFlags: actionType ? [\"fumble.all\", `fumble.${actionType}`] : [\"fumble.all\"],\n      noFumbleFlags: actionType ? [\"noFumble.all\", `noFumble.${actionType}`] : [\"noFumble.all\"]\n    };\n    await computeCriticalModifiers(this.actor!, actorCriticalFlags, this.attackRollModifierTracker, { workflow: this, actionType });\n\n    // Evaluate target grants.fumble and grants.noFumble flags\n    // Note: grants.critical/noCritical are checked in processCriticalFlags on hitTargets\n    // because you only get crit bonus from targets you actually hit\n    if (this.targets.size >= 1) {\n      const targetGrantsFumbleFlags: CriticalModifierFlags = {\n        criticalFlags: [],\n        noCriticalFlags: [],\n        fumbleFlags: actionType ? [\"grants.fumble.all\", `grants.fumble.${actionType}`] : [\"grants.fumble.all\"],\n        noFumbleFlags: []\n      };\n\n      // grants.fumble - check if ANY target has this flag\n      for (const target of this.targets) {\n        if (target?.actor) {\n          const targetName = target?.name ?? target?.actor?.name ?? \"\";\n          await computeTargetCriticalModifiers(target.actor, targetName, targetGrantsFumbleFlags, this.attackRollModifierTracker, { workflow: this, grantsActor: this.actor });\n          if (this.attackRollModifierTracker.fumble.isForced) break;\n        }\n      }\n\n      // grants.noFumble - check if ALL targets have this flag\n      // Only check if we have a fumble (natural or forced)\n      if (naturalFumble || this.attackRollModifierTracker.fumble.isForced) {\n        let allTargetsGrantNoFumble = true;\n        const noFumbleTargets: string[] = [];\n        let noFumbleFlag = \"grants.noFumble.all\";\n        for (const target of this.targets) {\n          if (!target?.actor) {\n            allTargetsGrantNoFumble = false;\n            break;\n          }\n          const targetName = target?.name ?? target?.actor?.name ?? \"\";\n          const conditionData = createConditionData({ workflow: this, target, actor: this.actor });\n          const hasNoFumbleAll = await evalAllConditionsAsync(target.actor, midiFlag(`grants.noFumble.all`), conditionData);\n          const hasNoFumbleType = actionType && await evalAllConditionsAsync(target.actor, midiFlag(`grants.noFumble.${actionType}`), conditionData);\n          if (!hasNoFumbleAll && !hasNoFumbleType) {\n            allTargetsGrantNoFumble = false;\n            break;\n          }\n          if (hasNoFumbleType) noFumbleFlag = `grants.noFumble.${actionType}`;\n          noFumbleTargets.push(targetName);\n        }\n        if (allTargetsGrantNoFumble && this.targets.size > 0) {\n          this.attackRollModifierTracker.fumble.suppress(noFumbleFlag, `${getFlagDisplayName(noFumbleFlag)} (${noFumbleTargets.join(\", \")})`);\n        }\n      }\n    }\n\n    // Tracker now computes final isCritical/isFumble from:\n    // override > noCritical/noFumble > forceCritical/forceFumble > naturalCritical/naturalFumble\n    // Access tracker state via this.isCritical / this.isFumble getters\n\n    // Persist to chat card (triggers via setter which uses override, but we want to persist computed state)\n    this.persistFields({ isCritical: this.isCritical, isFumble: this.isFumble });\n    this.persistAttackTracker();\n\n    this.attackTotal = this.attackRoll.total ?? 0;\n    if (debugEnabled > 1) debug(\"processAttackRoll: \", this.diceRoll, this.attackTotal, this.isCritical, this.isFumble);\n\n    // Update roll with attribution and regenerate HTML if crit/fumble occurred\n    if (this.isCritical || this.isFumble) {\n      addAttribution(this.attackRoll, this.attackAttribution);\n      this.attackRollHTML = await midiRenderAttackRoll(this.attackRoll);\n    }\n  }\n\n  protected recordAttackStats() {\n    if (!configSettings.keepRollStats || !this.item || !this.attackRoll) return;\n    // @ts-expect-error CONFIG.Dice.D20Roll.ADV_MODE not typed\n    const ADV_MODE = CONFIG.Dice.D20Roll.ADV_MODE;\n    gameStats.addAttackRoll({\n      rawRoll: this.diceRoll,\n      fumble: this.isFumble,\n      critical: this.isCritical,\n      total: this.attackTotal,\n      advantageMode: this.attackRoll.options?.advantageMode ?? ADV_MODE.NORMAL\n    }, this.item);\n  }\n\n  protected recordDamageStats() {\n    if (!configSettings.keepRollStats || !this.item || !this.damageList?.length) return;\n    // Only count actual damage (positive hpDamage), not healing\n    const totalHpDamage = this.damageList.reduce((sum, dl) => sum + Math.max(0, dl.hpDamage ?? 0), 0);\n    // Sum raw damage from non-healing types only\n    let totalDamage = 0;\n    for (const dl of this.damageList) {\n      if (dl.rawDamageDetail) {\n        for (const dd of dl.rawDamageDetail) {\n          if (dd.value > 0 && dd.type && !GameSystemConfig.healingTypes[dd.type]) {\n            totalDamage += dd.value;\n          }\n        }\n      }\n    }\n\n    let maxDamage = 0;\n    let healingDone = 0;\n    let kills = 0;\n    for (const dl of this.damageList) {\n      const hp = dl.hpDamage ?? 0;\n      if (hp > 0) maxDamage = Math.max(maxDamage, hp);\n      if (hp < 0) healingDone += Math.abs(hp);\n      if ((dl.oldHP ?? 0) > 0 && (dl.newHP ?? 0) <= 0) kills += 1;\n\n      // Record damage taken or healing received on the target actor\n      if (hp !== 0 && dl.actorId) {\n        const damageByType: Record<string, number> = {};\n        if (hp > 0 && dl.damageDetail) {\n          for (const dd of dl.damageDetail) {\n            if (dd.value > 0 && dd.type) {\n              damageByType[dd.type] = (damageByType[dd.type] ?? 0) + dd.value;\n            }\n          }\n        }\n        gameStats.addDamageTaken(dl.actorId, hp, damageByType);\n      }\n    }\n\n    gameStats.addDamage(totalHpDamage, totalDamage, this.item, maxDamage, healingDone, kills, this.isCritical);\n\n    // Aggregate damage dealt by type across all targets (attacker-side stats), excluding healing types\n    const dealtByType: Record<string, number> = {};\n    const appliedByType: Record<string, number> = {};\n    for (const dl of this.damageList) {\n      if (dl.rawDamageDetail) {\n        for (const dd of dl.rawDamageDetail) {\n          if (dd.value > 0 && dd.type && !GameSystemConfig.healingTypes[dd.type]) {\n            dealtByType[dd.type] = (dealtByType[dd.type] ?? 0) + dd.value;\n          }\n        }\n      }\n      if (dl.damageDetail) {\n        for (const dd of dl.damageDetail) {\n          if (dd.value > 0 && dd.type && !GameSystemConfig.healingTypes[dd.type]) {\n            appliedByType[dd.type] = (appliedByType[dd.type] ?? 0) + dd.value;\n          }\n        }\n      }\n    }\n    if (Object.keys(dealtByType).length > 0 || Object.keys(appliedByType).length > 0) {\n      gameStats.addDamageDealtByType(this.item, dealtByType, appliedByType);\n    }\n  }\n\n  // Builds a [optionalKeys, flagOwners] tuple for the rolling actor + item enchantments.\n  // flagOwners maps full flag paths (e.g. \"flags.midi-qol.optional.dragonSlayer\") to the item\n  // when an enchantment on the rolling item is the source of that key. Actor keys take precedence.\n  private collectOptionalFlagSources(): { keys: string[], owners: Record<string, any> } {\n    const actorOptional = this.actor.flags?.[MODULE_ID]?.optional ?? {};\n    const itemOptional = (this.item?.flags?.[MODULE_ID]?.optional ?? {}) as Record<string, any>;\n    const keys: string[] = Object.keys(actorOptional);\n    const owners: Record<string, any> = {};\n    for (const key of Object.keys(itemOptional)) {\n      if (!(key in actorOptional)) {\n        keys.push(key);\n        owners[`flags.${MODULE_ID}.optional.${key}`] = this.item;\n      }\n    }\n    return { keys, owners };\n  }\n\n  async processAttackRollBonusFlags() {\n    let attackBonus = \"attack.all\";\n    if (this.activity && this.activity.hasAttack) attackBonus = `attack.${this.activity.actionType}`;\n    const { keys: allOptionalKeys, owners: flagOwners } = this.collectOptionalFlagSources();\n    const ownerOfShort = (flag: string): any => flagOwners[`flags.${MODULE_ID}.optional.${flag}`] ?? this.actor;\n    // If the attack roll is a fumble only select flags that allow the roll to be rerolled.\n    let bonusFlags = allOptionalKeys\n      .filter(flag => {\n        const owner = ownerOfShort(flag);\n        const hasAttackFlag = foundry.utils.getProperty(owner ?? {}, midiFlag(`optional.${flag}.attack.all`)) as string ||\n          foundry.utils.getProperty(owner ?? {}, midiFlag(`optional.${flag}.${attackBonus}`)) as string;\n        if (hasAttackFlag === undefined) return false;\n        if (this.isFumble && !hasAttackFlag?.includes(\"roll\")) return false;\n        const flagData = foundry.utils.getProperty(owner ?? {}, midiFlag(`optional.${flag}`)) as any;\n        if (!flagData?.count) return true;\n        return getOptionalCountRemainingShortFlag(this.actor, flag, owner) > 0;\n      })\n      .map(flag => midiFlag(`optional.${flag}`));\n\n    if (bonusFlags.length > 0) {\n      const displayBonusRolls: boolean | undefined = bonusFlags.reduce((acc: boolean | undefined, flag) => (acc || (foundry.utils.getProperty(flagOwners[flag] ?? this.actor ?? {}, `${flag}.displayBonusRolls`) as boolean)), undefined)\n        ?? checkMechanic(\"displayBonusRolls\") as boolean;\n      const newRoll = await bonusDialog.bind(this)(bonusFlags, attackBonus, displayBonusRolls, `${this.actor.name} - ${i18n(\"DND5E.Attack\")} ${i18n(\"DND5E.Roll\")}`, this.attackRoll!, \"attackRoll\", { flagOwners })\n      if (newRoll) this.setAttackRoll(newRoll);\n    }\n    if (this.targets.size === 1) {\n      const target = this.targets.first()!;\n      // Use the AC captured at roll time (matches what checkHits will compare against\n      // via computeTargetAC). Falls back to live ac.value when no descriptor exists.\n      const descriptor = getTargetDescriptor(target.actor?.uuid ?? \"\", this.targetDescriptors);\n      // @ts-expect-error no dnd5e-types\n      const targetAC = descriptor?.ac ?? target.actor?.system.attributes.ac.value;\n      await this.processAttackRoll();\n      const isMiss = this.isFumble || (this.attackRoll!.total ?? 0) < targetAC;\n      if (isMiss) {\n        attackBonus = \"attack.fail.all\"\n        if (this.activity && this.activity.hasAttack) attackBonus = `attack.fail.${this.activity.actionType}`;\n        let bonusFlags = allOptionalKeys\n          .filter(flag => {\n            const owner = ownerOfShort(flag);\n            const hasAttackFlag = foundry.utils.getProperty(owner ?? {}, midiFlag(`optional.${flag}.attack.fail.all`)) as string\n              || foundry.utils.getProperty(owner ?? {}, midiFlag(`optional.${flag}.${attackBonus}`)) as string;\n            if (hasAttackFlag === undefined) return false;\n            if (this.isFumble && !hasAttackFlag?.includes(\"roll\")) return false;\n            const flagData = foundry.utils.getProperty(owner ?? {}, midiFlag(`optional.${flag}`)) as any;\n            if (!flagData?.count) return true;\n            return getOptionalCountRemainingShortFlag(this.actor, flag, owner) > 0;\n          })\n          .map(flag => midiFlag(`optional.${flag}`));\n        if (bonusFlags.length > 0) {\n          const displayBonusRolls: boolean | undefined = bonusFlags.reduce((acc: boolean | undefined, flag: string) => (acc || (foundry.utils.getProperty(flagOwners[flag] ?? this.actor ?? {}, `${flag}.displayBonusRolls`) as boolean)), undefined)\n            ?? checkMechanic(\"displayBonusRolls\") as boolean;\n          const newRoll = await bonusDialog.bind(this)(bonusFlags, attackBonus, displayBonusRolls, `${this.actor.name} - ${i18n(\"DND5E.Attack\")} ${i18n(\"DND5E.Roll\")}`, this.attackRoll, \"attackRoll\", { flagOwners });\n          if (newRoll) this.setAttackRoll(newRoll);\n        }\n      }\n    }\n    return this.attackRoll!;\n  }\n\n  async processDamageRollBonusFlags(damageRolls: Roll[]): Promise<Roll[]> {\n    let damageBonus = \"damage.all\";\n    const rollMode = safeGetGameSetting(\"core\", \"rollMode\");\n    const hideDSN = game.user?.isGM && [CONST.DICE_ROLL_MODES.SELF, CONST.DICE_ROLL_MODES.BLIND, CONST.DICE_ROLL_MODES.PRIVATE].includes(rollMode);\n    if (this.activity) damageBonus = `damage.${this.activity.actionType}`;\n    const { keys: allOptionalKeys, owners: flagOwners } = this.collectOptionalFlagSources();\n    const ownerOfShort = (flag: string): any => flagOwners[`flags.${MODULE_ID}.optional.${flag}`] ?? this.actor;\n    const bonusFlags = allOptionalKeys\n      .filter(flag => {\n        const owner = ownerOfShort(flag);\n        const hasDamageFlag = foundry.utils.getProperty(owner ?? {}, midiFlag(`optional.${flag}.damage.all`)) !== undefined ||\n          foundry.utils.getProperty(owner ?? {}, midiFlag(`optional.${flag}.${damageBonus}`)) !== undefined;\n        if (!hasDamageFlag) return false;\n        return getOptionalCountRemainingShortFlag(this.actor, flag, owner) > 0;\n      })\n      .map(flag => midiFlag(`optional.${flag}`));\n    if (bonusFlags.length > 0) {\n      // this.damageRollHTML = await midiRenderDamageRoll(this.damageRoll);\n      // this.damamgeRollHTML = $(this.damageRolHTML).find(\".dice-roll\").remove();\n      // TODO dnd3 work out what this means for multiple rolls\n      const displayBonusRolls: boolean | undefined = bonusFlags.reduce((acc: boolean | undefined, flag: string) => (acc || (foundry.utils.getProperty(flagOwners[flag] ?? this.actor ?? {}, `${flag}.displayBonusRolls`) as boolean)), undefined)\n        ?? checkMechanic(\"displayBonusRolls\") as boolean;\n      let newRoll = await bonusDialog.bind(this)(bonusFlags, damageBonus, displayBonusRolls === true, `${this.actor.name} - ${i18n(\"DND5E.Damage\")} ${i18n(\"DND5E.Roll\")}`, damageRolls[0], \"damageRoll\", { hideDSN, damageRolls, flagOwners })\n      if (newRoll) damageRolls[0] = newRoll;\n    }\n    return damageRolls;\n  }\n\n  recordTargetACModifiers() {\n    this.targetACModifiers = new Map() as Map<string, number>;\n    const allTargetDescriptors = this.targetDescriptors;\n    for (let targetToken of this.targets) {\n      let targetActor = targetToken.actor;\n      if (!targetActor) continue; // tokens without actors are an abomination and we refuse to deal with them.\n      const targetDescriptor = getTargetDescriptor(targetActor.uuid, allTargetDescriptors);\n      // null AC means coverTotal — no modifier to compute; cover is handled via status in checkHits\n      if (targetDescriptor?.ac != null) {\n        //@ts-expect-error no dnd5e-types\n        this.targetACModifiers.set(targetActor.uuid, targetDescriptor.ac - targetActor.system.attributes.ac.value);\n      }\n    }\n  }\n\n  async checkHits(options: { workflowOptions?: WorkflowOptions, noOnuseMacro?: boolean, noTargetOnUseMacro?: boolean } = {}) {\n    let isHit = true;\n    let isHitEC = false;\n\n    // check for a hit/critical/fumble\n    if (this.activity.target?.affects?.type === \"self\") {\n      this.targets = await getOrCreateTokenForActorAsSet(this.actor);\n      this.hitTargets = new Set(this.targets)\n    } else this.hitTargets = new Set();\n\n    this.hitDisplayData = {};\n    const challengeModeArmorSet = !([undefined, false, \"none\"].includes((checkRule(\"challengeModeArmor\") as string | boolean | undefined)));\n    for (let targetToken of this.targets) {\n      let targetName = configSettings.useTokenNames && targetToken.name ? targetToken.name : targetToken.actor?.name;\n      let targetActor = targetToken.actor;\n      if (!targetActor) continue; // tokens without actors are an abomination and we refuse to deal with them.\n      let targetACMod = this.targetACModifiers.get(targetActor.uuid) ?? 0;\n      let attackBonus = 0;\n\n      // Vehicle AC override\n      let vehicleACOverride: number | undefined;\n      const wjVehicle = installedModules.get(\"wjmais\") ? foundry.utils.getProperty(targetActor, \"flags.wjmais.crew.min\") != null : false;\n      // @ts-expect-error no dnd5e-types\n      if (targetActor.type === \"vehicle\" && !wjVehicle) {\n        const inMotion = targetActor.flags?.[MODULE_ID]?.inMotion;\n        // @ts-expect-error no dnd5e-types\n        if (inMotion) vehicleACOverride = Number.parseInt(targetActor.system.attributes.ac.flat ?? 10);\n        // @ts-expect-error no dnd5e-types\n        else vehicleACOverride = Number.parseInt(targetActor.system.attributes.ac.motionless);\n        if (isNaN(vehicleACOverride!)) {\n          console.warn(\"Error when getting vehicle armor class make sure motionless is set\");\n          vehicleACOverride = 10;\n        }\n      }\n\n      let hitResultNumeric: string | undefined;\n\n      // @ts-expect-error no dnd5e-types\n      let targetEC = (targetActor.system.attributes.ac.EC ?? 0) + targetACMod;\n      // @ts-expect-error no dnd5e-types\n      let targetAR = (targetActor.system.attributes.ac.AR ?? 0) + targetACMod;\n\n      isHit = false;\n      isHitEC = false;\n      let attackTotal = this.attackTotal;\n\n      // Evaluate ignoreCover flags\n      const noCoverFlag = this.actor.flags?.[MODULE_ID]?.ignoreCover;\n      let ignoreCover = false;\n      if (noCoverFlag) {\n        const conditionData = createConditionData({ workflow: this, target: targetToken, actor: this.actor });\n        ignoreCover ||= await evalAllConditionsAsync(this.actor, midiFlag(`ignoreCover`), conditionData);\n      }\n      if (this.activity.actionType === \"rsak\" && this.actor.flags?.dnd5e?.spellSniper) {\n        const conditionData = createConditionData({ workflow: this, target: targetToken, actor: this.actor });\n        ignoreCover ||= await evalAllConditionsAsync(this.actor, `flags.dnd5e.spellSniper`, conditionData);\n      }\n      const sharpShooterFlag = this.actor.flags?.[MODULE_ID]?.sharpShooter || this.actor.flags?.dnd5e?.sharpShooter;\n      if (this.activity.actionType === \"rwak\" && sharpShooterFlag) {\n        const conditionData = createConditionData({ workflow: this, target: targetToken, actor: this.actor });\n        ignoreCover ||= await evalAllConditionsAsync(this.actor, midiFlag(`sharpShooter`), conditionData);\n        ignoreCover ||= await evalAllConditionsAsync(this.actor, `flags.dnd5e.sharpShooter`, conditionData);\n      }\n\n      // Flanking bonus (fixed-value mode): reduce effective AC for this target\n      // flankingBonus is recorded per-target in recordFlankingBonuses() before checkHits()\n      let flankingACMod = 0;\n      const flankingBonusSetting = configSettings.optionalRules.flankingBonus ?? \"advantage\";\n      if (flankingBonusSetting !== \"advantage\") {\n        const allDescriptors = this.targetDescriptors;\n        const targetFlankDescriptor = getTargetDescriptor(targetActor.uuid, allDescriptors) as CombinedTargetDescriptor | undefined;\n        flankingACMod = targetFlankDescriptor?.flankingBonus ?? 0;\n      }\n\n      // Compute effective AC: reconciles status cover with module cover (status as minimum),\n      // applies attack-specific reductions (ignoreFullCover, sharpShooter, spellSniper, ignoreCover),\n      // and incorporates flanking and targetACMod.\n      let acResult = this.token\n        ? computeTargetAC(this.token, targetToken, this.activity, { ignoreCover, flankingMod: flankingACMod, targetACMod })\n        : undefined;\n\n      let targetAC = vehicleACOverride ?? acResult?.effectiveAC\n        //@ts-expect-error no dnd5e-types\n        ?? (Number.parseInt(targetActor.system.attributes.ac.value ?? 10) + targetACMod);\n      let bonusAC = acResult?.effectiveCoverBonus ?? 0;\n\n      const midiFlagsAttackBonus = targetActor.flags?.[MODULE_ID]?.grants?.attack?.bonus;\n      let reactionACDelta = 0;\n      let reactionItemName: string | undefined;\n      if (!this.isFumble) {\n        if (midiFlagsAttackBonus) {\n          if (midiFlagsAttackBonus?.all) {\n            const bonusValue = midiFlagsAttackBonus.all;\n            attackBonus = Number.isNumeric(bonusValue) ? Number(bonusValue)\n              : (await (new Roll(`${bonusValue}`, targetActor.getRollData())).evaluate()).total ?? 0;\n            foundry.utils.setProperty(this.actor, \"flags.midi.evaluated.grants.attack.bonus.all\", { value: attackBonus, effects: [`${targetActor.name}`] });\n          }\n          if (midiFlagsAttackBonus[this.activity.actionType]) {\n            const bonusValue = midiFlagsAttackBonus[this.activity.actionType];\n            attackBonus = Number.isNumeric(bonusValue) ? Number(bonusValue)\n              : (await (new Roll(`${bonusValue}`, targetActor.getRollData())).evaluate()).total ?? 0;\n            foundry.utils.setProperty(this.actor, `flags.midi.evaluated.grants.attack.bonus.${this.activity.actionType}`, { value: attackBonus, effects: [`${targetActor.name}`] });\n          }\n        }\n        if (challengeModeArmorSet) isHit = attackTotal > targetAC || this.isCritical;\n        else {\n          if (this.attackRoll && !this.item.flags?.[MODULE_ID]?.noProvokeReaction && !this.workflowOptions.noProvokeReaction) {\n            const workflowOptions = foundry.utils.mergeObject(this.workflowOptions, { sourceActorUuid: this.actor.uuid, sourceItemUuid: this.item.uuid }, { inplace: false, overwrite: true });\n            const result = await doReactions(targetToken, this.tokenUuid, this.attackRoll, \"reactionattacked\", { activity: this.activity, item: this.item, workflow: this, workflowOptions });\n            if (result?.ac && isFinite(targetAC)) { // result.ac is a newAC total from optional bonus dialog; don't override total cover (Infinity)\n              //@ts-expect-error no dnd5e-types\n              const preReactionRawAC: number = targetToken.actor?.system.attributes.ac?.value ?? 10;\n              reactionACDelta = result.ac - preReactionRawAC;\n              reactionItemName = result.name;\n              targetAC = result.ac + (acResult?.appliedCoverDelta ?? 0) + targetACMod - flankingACMod;\n            } else if (result?.uuid && isFinite(targetAC)) {\n              // Spell reaction (e.g. Shield) was used but didn't return ac directly.\n              // The actor's AC has been updated by the reaction workflow — recompute effective AC.\n              const postReactionACResult = this.token\n                ? computeTargetAC(this.token, targetToken, this.activity, { ignoreCover, flankingMod: flankingACMod, targetACMod })\n                : undefined;\n              if (postReactionACResult && postReactionACResult.effectiveAC !== targetAC) {\n                // Show the reaction's contribution separately: restore pre-reaction baseAC and track the delta\n                const preReactionBaseAC = acResult?.baseAC ?? postReactionACResult.baseAC;\n                reactionACDelta = postReactionACResult.baseAC - preReactionBaseAC;\n                postReactionACResult.baseAC = preReactionBaseAC;\n                acResult = postReactionACResult;\n                targetAC = acResult.effectiveAC;\n                bonusAC = acResult.effectiveCoverBonus;\n                reactionItemName = result.itemName ?? result.name;\n              }\n            }\n          }\n          isHit = (attackTotal + attackBonus) >= targetAC || this.isCritical;\n        }\n        if (!isFinite(targetAC)) isHit = false; // total cover (coverTotal status or TOTAL_COVER from computeCoverBonus)\n\n        if (targetEC) isHitEC = challengeModeArmorSet && attackTotal <= targetAC && attackTotal >= targetEC && isFinite(targetAC);\n        // check to see if the roll hit the target\n        if ((isHit || isHitEC) && this.activity.attack && this.attackRoll && targetToken !== null && !foundry.utils.getProperty(this, `item.flags.${MODULE_ID}.noProvokeReaction`) && !this.workflowOptions.noProvokeReaction) {\n          const workflowOptions = foundry.utils.mergeObject(this.workflowOptions, { sourceActorUuid: this.actor.uuid, sourceItemUuid: this.item.uuid }, { inplace: false, overwrite: true });\n          // reaction is the same as reactionhit to accomodate the existing reaction workflow\n          let result;\n          if (!this.item.flags?.[MODULE_ID]?.noProvokeReaction && !this.workflowOptions.noProvokeReaction) {\n            result = await doReactions(targetToken, this.tokenUuid, this.attackRoll, \"reaction\", { activity: this.activity, item: this.item, workflow: this, workflowOptions });\n          }\n          if (!Workflow.getWorkflow(this.id)) // workflow has been removed - bail out\n            return;\n          // targetAC already has cover, flanking, and targetACMod from computeTargetAC (via acResult.effectiveAC)\n          // Only update if the hit reaction returned a new AC total\n          if (result?.ac) {\n            //@ts-expect-error no dnd5e-types\n            const preReactionRawAC: number = targetToken.actor?.system.attributes.ac?.value ?? 10;\n            reactionACDelta = result.ac - preReactionRawAC;\n            reactionItemName = result.name;\n            targetAC = result.ac + (acResult?.appliedCoverDelta ?? 0) - flankingACMod;\n          } else if (result?.uuid) {\n            // Spell reaction was used but didn't return ac directly — recompute effective AC.\n            const postReactionACResult = this.token\n              ? computeTargetAC(this.token, targetToken, this.activity, { ignoreCover, flankingMod: flankingACMod, targetACMod })\n              : undefined;\n            if (postReactionACResult && postReactionACResult.effectiveAC !== targetAC) {\n              const preReactionBaseAC = acResult?.baseAC ?? postReactionACResult.baseAC;\n              reactionACDelta = postReactionACResult.baseAC - preReactionBaseAC;\n              postReactionACResult.baseAC = preReactionBaseAC;\n              acResult = postReactionACResult;\n              targetAC = acResult.effectiveAC;\n              bonusAC = acResult.effectiveCoverBonus;\n              reactionItemName = result.itemName ?? result.name;\n            }\n          }\n          if (targetEC) targetEC = targetAC - targetAR + targetACMod; // targetEC is always the same as targetAC - targetAR + descriptorMod\n          isHit = (attackTotal + attackBonus >= targetAC || this.isCritical) && result?.name !== \"missed\";\n          if (challengeModeArmorSet) isHit = this.attackTotal >= targetAC || this.isCritical;\n          if (targetEC) isHitEC = challengeModeArmorSet && this.attackTotal <= targetAC && this.attackTotal >= targetEC && isFinite(targetAC);\n        } else if ((!isHit && !isHitEC) && this.activity.attack && this.attackRoll && targetToken !== null && !foundry.utils.getProperty(this, `item.flags.${MODULE_ID}.noProvokeReaction`)) {\n          const workflowOptions = foundry.utils.mergeObject(this.workflowOptions, { sourceActorUuid: this.actor.uuid, sourceItemUuid: this.item.uuid }, { inplace: false, overwrite: true });\n          if (!this.item.flags?.[MODULE_ID]?.noProvokeReaction && !this.workflowOptions.noProvokeReaction) {\n            await doReactions(targetToken, this.tokenUuid, this.attackRoll, \"reactionmissed\", { activity: this.activity, item: this.item, workflow: this, workflowOptions });\n          }\n          // TODO what else to do once rolled\n        }\n        const optionalCrits = checkRule(\"optionalCritRule\") as number;\n        if (this.targets.size === 1 && configSettings.optionalRulesEnabled && optionalCrits > -1) {\n          if (checkRule(\"criticalNat20\") && this.isCritical) {\n            // criticalNat20 rule: natural 20 always crits, so don't change\n          } else {\n            // Optional crit rule: only crit if attack exceeds AC by optionalCrits\n            const optionalCrit = attackTotal >= targetAC + optionalCrits;\n            this.attackRollModifierTracker.critical.setOverride(optionalCrit, \"optionalCritRule\", i18n(\"midi-qol.OptionalCritRule\"));\n          }\n        }\n        hitResultNumeric = this.isCritical ? \"++\" : !isFinite(targetAC) ? `${attackTotal}/∞` : `${attackTotal}/${Math.abs(attackTotal - targetAC)}`;\n      }\n\n      const midiFlagsActorFail = this.actor.flags?.[MODULE_ID]?.fail;\n      if (midiFlagsActorFail) {\n        const conditionData = createConditionData({ workflow: this, target: targetToken, actor: this.actor });\n        let failFlag: string | undefined;\n        if (await evalAllConditionsAsync(this.actor, midiFlag(`fail.attack.${this.activity.actionType}`), conditionData))\n          failFlag = `fail.attack.${this.activity.actionType}`;\n        else if (await evalAllConditionsAsync(this.actor, midiFlag(`fail.attack.all`), conditionData))\n          failFlag = \"fail.attack.all\";\n        else if (await evalAllConditionsAsync(this.actor, midiFlag(`fail.all`), conditionData))\n          failFlag = \"fail.all\";\n        if (failFlag) {\n          isHit = false;\n          isHitEC = false;\n          this.attackRollModifierTracker.critical.setOverride(false, failFlag, getFlagDisplayName(failFlag));\n        }\n      }\n      const midiFlagsActorSuccess = this.actor.flags?.[MODULE_ID]?.success;\n      if (midiFlagsActorSuccess) {\n        const conditionData = createConditionData({ workflow: this, target: targetToken, actor: this.actor });\n        let successFlag: string | undefined;\n        if (await evalAllConditionsAsync(this.actor, midiFlag(`success.attack.${this.activity.actionType}`), conditionData))\n          successFlag = `success.attack.${this.activity.actionType}`;\n        else if (await evalAllConditionsAsync(this.actor, midiFlag(`success.attack.all`), conditionData))\n          successFlag = \"success.attack.all\";\n        else if (await evalAllConditionsAsync(this.actor, midiFlag(`success.all`), conditionData))\n          successFlag = \"success.all\";\n        if (successFlag) {\n          isHit = true;\n          isHitEC = false;\n          this.attackRollModifierTracker.fumble.setOverride(false, successFlag, getFlagDisplayName(successFlag));\n        }\n      }\n\n      const midiFlagsGrantsAttackSuccess = targetActor.flags?.[MODULE_ID]?.grants?.attack?.success;\n      const midiFlagsGrantsAttackFail = targetActor.flags?.[MODULE_ID]?.grants?.attack?.fail;\n      let conditionData;\n      if (midiFlagsGrantsAttackSuccess || midiFlagsGrantsAttackFail) {\n        conditionData = createConditionData({ workflow: this, target: targetToken, actor: this.actor });\n\n        let grantsSuccessFlag: string | undefined;\n        if (await evalAllConditionsAsync(targetActor, midiFlag(`grants.attack.success.${this.activity.actionType}`), conditionData))\n          grantsSuccessFlag = `grants.attack.success.${this.activity.actionType}`;\n        else if (await evalAllConditionsAsync(targetActor, midiFlag(`grants.attack.success.all`), conditionData))\n          grantsSuccessFlag = \"grants.attack.success.all\";\n        if (grantsSuccessFlag) {\n          isHit = true;\n          isHitEC = false;\n          this.attackRollModifierTracker.fumble.setOverride(false, grantsSuccessFlag, getFlagDisplayName(grantsSuccessFlag));\n        }\n        let grantsFailFlag: string | undefined;\n        if (await evalAllConditionsAsync(targetActor, midiFlag(`grants.attack.fail.${this.activity.actionType}`), conditionData))\n          grantsFailFlag = `grants.attack.fail.${this.activity.actionType}`;\n        else if (await evalAllConditionsAsync(targetActor, midiFlag(`grants.attack.fail.all`), conditionData))\n          grantsFailFlag = \"grants.attack.fail.all\";\n        if (grantsFailFlag) {\n          isHit = false;\n          isHitEC = false;\n          this.attackRollModifierTracker.critical.setOverride(false, grantsFailFlag, getFlagDisplayName(grantsFailFlag));\n        }\n      }\n\n      let hitScale = 1;\n      // @ts-expect-error no dnd5e-types\n      if ([\"scale\", \"scaleNoAR\"].includes(checkRule(\"challengeModeArmor\")) && !this.isCritical) hitScale = Math.floor((this.attackTotal - targetEC + 1) / ((targetActor?.system.attributes.ac.AR ?? 0) + 1) * 10) / 10;\n      if (!this.challengeModeScale) this.challengeModeScale = {};\n      this.challengeModeScale[targetToken.actor?.uuid ?? \"dummy\"] = hitScale;\n      if (this.isCritical && isFinite(targetAC)) isHit = true;\n      if (isHit || (this.isCritical && isFinite(targetAC))) this.hitTargets = this.hitTargets.add(targetToken);\n      if (isHitEC) this.hitTargetsEC = this.hitTargetsEC.add(targetToken);\n      if (isHit || isHitEC) await this.processCriticalFlags();\n      // acBonus flag is no longer set by computeCoverBonus — nothing to clear.\n\n      if (game.user?.isGM) log(`${this.speaker?.alias} Rolled a ${this.attackTotal + attackBonus} to hit ${targetName} 's AC of ${targetAC} ${isHit ? \"hitting\" : \"missing\"}`);\n      // Log the hit on the target\n      let attackType = \"\"; //item?.name ? i18n(item.name) : \"Attack\";\n\n      let hitSymbol = \"fa-blank\"\n      // if ([\"scale\", \"scaleNoAR\"].includes(checkRule(\"challengeModeArmor\")) && !this.isCritical) hitScale = Math.floor(this.challengeModeScale[targetActor.uuid]);\n      let isHitResult = \"miss\";\n      if (game.user?.isGM && [\"hitMiss\", \"hidden\"].includes(configSettings.gmAttackDisplay ?? \"full\") && (this.isCritical || isHit || isHitEC)) {\n        isHitResult = \"hit\";\n        hitSymbol = \"fa-tick\";\n      } else if (this.isCritical) {\n        isHitResult = \"critical\";\n        hitSymbol = \"fa-check-double\"\n      } else if (game.user?.isGM && this.isFumble && [\"hitMiss\", \"hidden\"].includes(configSettings.gmAttackDisplay ?? \"full\")) {\n        isHitResult = \"miss\";\n        hitSymbol = \"fa-xmark\";\n      } else if (this.isFumble) {\n        isHitResult = \"fumble\";\n        hitSymbol = \"fa-xmark\";\n      } else if (isHit) {\n        isHitResult = \"hit\";\n        hitSymbol = \"fa-check\";\n      } else if (isHitEC && [\"scale\", \"scaleNoAR\"].includes(checkRule(\"challengeModeArmor\") as string)) {\n        isHitResult = \"hitEC\";\n        hitSymbol = \"fa-check\";\n      } else if (isHitEC) {\n        isHitResult = \"hitEC\";\n        hitSymbol = \"fa-check\";\n      } else {\n        isHitResult = \"miss\";\n        hitSymbol = \"fa-xmark\";\n      }\n      let hitStyle = \"\";\n\n      let img = targetToken.document.texture.src || targetToken.actor?.img || \"\";\n      // @ts-expect-error no dnd5e-types\n      if (configSettings.usePlayerPortrait && targetToken.actor?.type === \"character\") {\n        img = targetToken.actor?.img || targetToken.document.texture.src || \"\";\n      }\n      if (foundry.helpers.media.VideoHelper.hasVideoExtension(img ?? \"\")) {\n        img = await game.video?.createThumbnail(img ?? \"\", { width: 100, height: 100 }) ?? \"\";\n      }\n\n      if (this.isFumble) hitResultNumeric = \"--\";\n      const targetUuid = targetToken.document.uuid;\n\n      const effectiveAC = targetAC - attackBonus;\n      const acDisplay = !isFinite(targetAC) ? \"∞\" : `${effectiveAC}`;\n\n      // Build array of AC modifier icons and AC tooltip — icon order matches tooltip order\n      const acIcons: Array<{ img?: string; icon?: string; tooltip?: string; cssClass: string; useDnd5eIcon?: boolean }> = [];\n      let acTooltipParts = `${acResult?.baseAC ?? effectiveAC}`;\n      if (targetACMod) acTooltipParts += ` ${targetACMod > 0 ? \"+\" : \"\"}${targetACMod}`;\n\n      const displayCover = acResult?.effectiveCoverBonus ?? 0;\n      if (!acResult?.coverIgnored && displayCover >= TOTAL_COVER) {\n        acIcons.push({ img: \"systems/dnd5e/icons/svg/statuses/cover-total.svg\", tooltip: `+${displayCover}: ${i18n(\"EFFECT.DND5E.StatusTotalCover\")}`, cssClass: \"midi-qol-ac-icon\", useDnd5eIcon: true });\n      } else if (!acResult?.coverIgnored && displayCover >= THREE_QUARTERS_COVER) {\n        acIcons.push({ img: \"systems/dnd5e/icons/svg/statuses/cover-three-quarters.svg\", tooltip: `+${displayCover}: ${i18n(\"EFFECT.DND5E.StatusThreeQuartersCover\")}`, cssClass: \"midi-qol-ac-icon\", useDnd5eIcon: true });\n      } else if (!acResult?.coverIgnored && displayCover >= HALF_COVER) {\n        acIcons.push({ img: \"systems/dnd5e/icons/svg/statuses/cover-half.svg\", tooltip: `+${displayCover}: ${i18n(\"EFFECT.DND5E.StatusHalfCover\")}`, cssClass: \"midi-qol-ac-icon\", useDnd5eIcon: true });\n      }\n      if (!acResult?.coverIgnored && acResult && acResult.effectiveCoverBonus > 0)\n        acTooltipParts += ` +${acResult.effectiveCoverBonus}`;\n\n      if (acResult?.coverIgnored) {\n        if (this.activity?.actionType === \"rwak\") {\n          acIcons.push({ img: \"icons/skills/targeting/target-strike-gray.webp\", tooltip: i18n(\"midi-qol.SharpShooter\"), cssClass: \"midi-qol-ac-icon-img\" });\n        } else if (this.activity?.actionType === \"rsak\") {\n          acIcons.push({ img: \"icons/skills/targeting/crosshair-triple-strike-orange.webp\", tooltip: i18n(\"midi-qol.SpellSniper\"), cssClass: \"midi-qol-ac-icon-img\" });\n        }\n      }\n\n      const isMeleeAction = [\"mwak\", \"msak\"].includes(this.activity?.actionType ?? \"\");\n      if (flankingACMod > 0 && isMeleeAction) {\n        const flankingMode = checkRule(\"checkFlanking\") as string;\n        const isFlankedMode = [\"ceflanked\", \"ceflankedNoconga\", \"midiFlanked\", \"midiFlankedNoConga\"].includes(flankingMode);\n        acIcons.push({\n          img: isFlankedMode ? \"modules/midi-qol/icons/encirclement.svg\" : \"icons/svg/sword.svg\",\n          tooltip: `-${flankingACMod}: ${isFlankedMode ? i18n(\"midi-qol.Flanked\") : i18n(\"midi-qol.Flanking\")}`,\n          cssClass: \"midi-qol-ac-icon-img\"\n        });\n        acTooltipParts += ` -${flankingACMod}`;\n      }\n\n      if (reactionACDelta) {\n        acIcons.push({ img: \"modules/midi-qol/icons/reaction.svg\", tooltip: `${reactionACDelta > 0 ? \"+\" : \"\"}${reactionACDelta}: ${i18n(\"DND5E.Reaction\")}: ${reactionItemName}`, cssClass: \"midi-qol-ac-icon\", useDnd5eIcon: true });\n        acTooltipParts += ` ${reactionACDelta > 0 ? \"+\" : \"\"}${reactionACDelta}`;\n      }\n\n      if (attackBonus) {\n        const grantsFlagKey = `flags.${MODULE_ID}.grants.attack.bonus`;\n        const grantsEffectNames = targetActor.allApplicableEffects()\n          .filter(e => !e.disabled && e.changes?.some(c => c.key.startsWith(grantsFlagKey)))\n          .map(e => e.name)\n          .toArray();\n        if (grantsEffectNames.length) {\n          const acDelta = -attackBonus;\n          acIcons.push({ icon: \"fas fa-bolt\", tooltip: `${acDelta > 0 ? \"+\" : \"\"}${acDelta}: ${grantsEffectNames.join(\", \")}`, cssClass: \"midi-qol-ac-icon-fa\" });\n        }\n        acTooltipParts += ` ${-attackBonus > 0 ? \"+\" : \"\"}${-attackBonus}`;\n      }\n\n      let acTooltip: string | undefined;\n      if (isFinite(targetAC) && acTooltipParts !== `${effectiveAC}`) {\n        acTooltip = `${effectiveAC} = ${acTooltipParts}`;\n      }\n\n      this.hitDisplayData[targetUuid] = {\n        targetClass: !!targetToken.actor?.hasPlayerOwner ? \"midi-qol-player-target\" : \"midi-qol-npc-target\",\n        target: targetToken,\n        actorUuid: targetToken.actor?.uuid,\n        uuid: targetUuid,\n        hitStyle,\n        attackBonus,\n        ac: effectiveAC,\n        acDisplay,\n        acTooltip,\n        //@ts-expect-error no dnd5e-types\n        baseAc: targetToken.actor?.system.attributes.ac?.value ?? 10,\n        hitClass: [\"hit\", \"critical\", \"isHitEC\"].includes(isHitResult) ? \"success\" : \"failure\",\n        acClass: (targetToken.actor as Actor).hasPlayerOwner ? \"\" : \"midi-qol-npc-ac\",\n        acIcons,\n        hitSymbol,\n        attackType,\n        showAC: true,\n        img,\n        gmName: getTokenName(targetToken),\n        playerName: getTokenPlayerName(targetToken.document) ?? \"\",\n        hitResultNumeric,\n        attackTotal,\n        isHit: [\"hit\", \"critical\", \"isHitEC\"].includes(isHitResult)\n      };\n    }\n    if (configSettings.allowUseMacro && !options.noTargetOnUseMacro) await this.triggerTargetMacros([\"isHit\"], new Set([...this.hitTargets, ...this.hitTargetsEC]));\n    if (configSettings.allowUseMacro && !options.noTargetOnUseMacro) await this.triggerTargetMacros([\"isMissed\"], this.targets.difference(this.hitTargets).difference(this.hitTargetsEC));\n    this.hitTargets = this.hitTargets; // force update\n    this.hitTargetsEC = this.hitTargetsEC; // force update\n    this.persistAttackTracker();\n  }\n\n  async setAttackRoll(roll: Roll) {\n    this.attackRoll = roll;\n    foundry.utils.setProperty(roll, \"options.midi-qol.rollType\", \"attack\");\n    this.attackTotal = roll.total ?? 0;\n    // foundry.utils.setProperty(roll, \"options.flavor\", `${this.otherDamageItem.name} - ${i18nSystem(\"Bonus\")}`);\n    this.attackRollHTML = await midiRenderAttackRoll(roll);\n  }\n\n  async setUtilityRolls(rolls: Array<Roll> | Roll | undefined | null) {\n    if (!rolls) {\n      this.utilityRolls = undefined;\n      return;\n    };\n    if (rolls instanceof Roll) rolls = [rolls];\n    this.utilityRolls = rolls;\n    this.utilityRollHTML = \"\";\n    for (let roll of this.utilityRolls) {\n      foundry.utils.setProperty(roll, `options.${MODULE_ID}.rollType`, \"utility\");\n      this.utilityRollHTML += await midiRenderFormulaRoll(roll);\n    }\n  }\n\n  setUtilityRoll(roll: Roll) {\n    return this.setUtilityRolls([roll]);\n  }\n\n  convertRollToDamageRoll(roll: Roll.Any) {\n    //@ts-expect-error\n    const DamageRoll = CONFIG.Dice.DamageRoll;\n    if (!(roll instanceof DamageRoll)) { // we got passed a normal roll which really should be a damage roll\n      let damageType: string | undefined = MidiQOL.MQdefaultDamageType;\n      if (roll.terms[0].options.flavor && getDamageType(roll.terms[0].options.flavor)) {\n        damageType = getDamageType(roll.terms[0].options.flavor);\n      } else if (this.activity.hasDamage) damageType = this.activity.damage!.parts[0]?.types.first();\n      else if (this.activity.hasHealing) damageType = this.activity.healing!.types.first() ?? \"healing\";\n      const message = `convertRollToDamageRoll: roll is not a damage roll, setting type to ${damageType}`;\n      TroubleShooter.recordError(new Error(message));\n      // DamageRoll has no static fromRoll (only D20Roll does) - mirror it, then stamp the damage type\n      const damageRoll = new DamageRoll(roll.formula, roll.data, roll.options);\n      Object.assign(damageRoll, roll);\n      damageRoll.options.type = damageType;\n      error(\"convertRollToDamageRoll: roll is not a damage roll\", damageRoll);\n      return damageRoll;\n    }\n    return roll;\n  }\n\n  async setDamageRoll(roll: Roll) {\n    this.setDamageRolls([this.convertRollToDamageRoll(roll)]);\n  }\n\n  async addDamageRolls(rolls: Array<Roll> | Roll | undefined | null) {\n    if (!rolls) return;\n    if (rolls instanceof Roll) rolls = [rolls];\n    if (!this.damageRolls) this.damageRolls = [];\n    this.damageRolls = this.damageRolls.concat(rolls.map(roll => this.convertRollToDamageRoll(roll)));\n    this.damageTotal = sumRolls(this.damageRolls, \"positive\")\n    this.healingAdjustedDamageTotal = sumRolls(this.damageRolls, \"negativeIgnoreTemp\")\n    this.damageRollHTML = \"\";\n    for (let roll of this.damageRolls) {\n      foundry.utils.setProperty(roll, `options.${MODULE_ID}.rollType`, \"defaultDamage\");\n      foundry.utils.setProperty(roll, \"options.flavor\", \"\");\n      this.damageRollHTML += await midiRenderDamageRoll(roll);\n    }\n    this.rawDamageDetail = createDamageDetail({ roll: this.damageRolls, activity: this.activity, defaultType: this.defaultDamageType });\n    this.damageDetail = foundry.utils.deepClone(this.rawDamageDetail);\n    return;\n  }\n\n  async setDamageRolls(rolls: Array<Roll> | Roll | undefined | null) {\n    if (!rolls) {\n      this.damageRolls = [];\n      return;\n    };\n\n    if (rolls instanceof Roll) rolls = [rolls];\n    // @ts-expect-error no dnd5e-types\n    const baseRollProperties = rolls[0]?.options?.properties ?? [];\n    rolls.forEach(roll => {\n      setRollOperatorEvaluated(roll);\n    });\n\n    for (let i = 0; i < rolls.length; i++) {\n      rolls[i] = await rolls[i]; // only here in case someone passes an unawaited roll\n      //@ts-expect-error protected\n      if (!rolls[i]._evaluated) rolls[i] = await rolls[i].evaluate();\n    }\n    for (let i = 1; i < rolls.length; i++) {\n      // @ts-expect-error no dnd5e-types\n      foundry.utils.setProperty(rolls[i], \"options.properties\", (rolls[i].options?.properties ?? []).concat(baseRollProperties));\n    }\n    this.damageRolls = rolls;\n    this.damageTotal = sumRolls(this.damageRolls, \"positive\")\n    this.healingAdjustedDamageTotal = sumRolls(this.damageRolls, \"negativeIgnoreTemp\")\n    this.damageRollHTML = \"\";\n    for (let roll of this.damageRolls) {\n      foundry.utils.setProperty(roll, `options.${MODULE_ID}.rollType`, \"defaultDamage\");\n      foundry.utils.setProperty(roll, \"options.flavor\", \"\");\n\n      this.damageRollHTML += await midiRenderDamageRoll(roll);\n    }\n    this.flavor = i18n(\"DND5E.Damage\");\n    this.rawDamageDetail = createDamageDetail({ roll: this.damageRolls, activity: this.activity, defaultType: this.defaultDamageType });\n    this.damageDetail = foundry.utils.deepClone(this.rawDamageDetail);\n    return;\n  }\n\n  async setBonusDamageRolls(rolls: Array<Roll> | Roll | undefined | null) {\n    if (!rolls) {\n      this.bonusDamageRolls = undefined;\n      this.rawBonusDamageDetail = [];\n      return;\n    };\n    if (rolls instanceof Roll) rolls = [rolls];\n    rolls.forEach(roll => {\n      setRollOperatorEvaluated(roll);\n    });\n\n    for (let i = 0; i < rolls.length; i++) {\n      rolls[i] = await rolls[i]; // only here in case someone passes an unawaited roll\n      //@ts-expect-error protected\n      if (!rolls[i]._evaluated) rolls[i] = await rolls[i].evaluate();\n    }\n    this.bonusDamageRolls = rolls;\n    this.bonusDamageTotal = sumRolls(this.bonusDamageRolls, \"positive\");\n    this.healingAdjustedBonusDamageTotal = sumRolls(this.bonusDamageRolls, \"negativeIgnoreTemp\");\n    this.bonusDamageRollHTML = \"\";\n    for (let roll of this.bonusDamageRolls) {\n      foundry.utils.setProperty(roll, `options.${MODULE_ID}.rollType`, \"bonusDamage\");\n      this.bonusDamageRollHTML += await midiRenderBonusDamageRoll(roll);\n    }\n    this.rawBonusDamageDetail = createDamageDetail({ roll: this.bonusDamageRolls, activity: this.activity, defaultType: this.defaultDamageType });\n    this.bonusDamageDetail = foundry.utils.deepClone(this.rawBonusDamageDetail);\n    return;\n  }\n\n  async setBonusDamageRoll(roll: Roll) {\n    this.setBonusDamageRolls([this.convertRollToDamageRoll(roll)]);\n  }\n\n  async setOtherDamageRolls(rolls: Array<Roll> | Roll | undefined | null) {\n    if (!rolls) {\n      this.otherDamageRolls = undefined;\n      this.rawOtherDamageDetail = [];\n      return;\n    };\n    if (rolls instanceof Roll) rolls = [rolls];\n    rolls.forEach(roll => {\n      setRollOperatorEvaluated(roll);\n    });\n\n    for (let i = 0; i < rolls.length; i++) {\n      rolls[i] = await rolls[i]; // only here in case someone passes an unawaited roll\n      //@ts-expect-error protected\n      if (!rolls[i]._evaluated) rolls[i] = await rolls[i].evaluate();\n    }\n    this.otherDamageRolls = rolls;\n    this.otherDamageTotal = sumRolls(this.otherDamageRolls, \"positive\");\n    this.healingAdjustedOtherDamageTotal = sumRolls(this.otherDamageRolls, \"negativeIgnoreTemp\");\n    this.otherDamageRollHTML = \"\";\n    for (let roll of this.otherDamageRolls) {\n      foundry.utils.setProperty(roll, `options.${MODULE_ID}.rollType`, \"otherDamage\");\n      this.otherDamageRollHTML += await midiRenderOtherDamageRoll(roll);\n    }\n    this.rawOtherDamageDetail = createDamageDetail({ roll: this.otherDamageRolls, activity: this.activity, defaultType: this.defaultDamageType });\n    this.otherDamageDetail = foundry.utils.deepClone(this.rawOtherDamageDetail);\n    return;\n  }\n\n  async setOtherDamageRoll(roll: Roll) {\n    this.setOtherDamageRolls([this.convertRollToDamageRoll(roll)]);\n  }\n\n  async chooseEffects(effects: ActiveEffect.Implementation[], options) {\n    if (effects.length === 0) {\n      if (debugEnabled > 0)\n        warn(`chooseEffect | no effects found for ${this.item.name}`);\n      return [];\n    }\n    const { DialogV2 } = foundry.applications.api;\n    const buttons = effects.map(effect => ({\n      action: effect.uuid,\n      label: effect.name,\n      callback: () => effect,\n    }));\n    const chosen: ActiveEffect.Implementation | null = await DialogV2.wait({\n      window: { title: `${i18n('CONTROLS.CommonSelect')} ${i18n('DOCUMENT.ActiveEffect')}` },\n      classes: [\"midi-qol-choose-effect\"],\n      position: { width: 220 },\n      buttons,\n      render: (_event, dialog) => {\n        dialog.element.querySelectorAll<HTMLButtonElement>(\".form-footer button\").forEach((btn) => {\n          const eff = fromUuidSync(btn.dataset.action ?? \"\") as ActiveEffect.Implementation;\n          if (!eff) return;\n          const img = document.createElement('img');\n          img.src = eff.img as string ?? \"\";\n          const span = btn.querySelector(\"span\");\n          if (span) span.dataset.tooltip = eff.name;\n          btn.prepend(img);\n        });\n      },\n    });\n    if (!chosen) return [];\n    return [chosen];\n  }\n}\nexport class SavesFirstWorkflow extends Workflow {\n  get postAttackRollState(): WorkflowState {\n    return this.WorkflowState_WaitForSaves;\n  }\n\n  async WorkflowState_WaitForSaves(context: WorkflowContext = {}): Promise<WorkflowState> {\n    await super.WorkflowState_WaitForSaves(context);\n    return this.WorkflowState_SavesComplete;\n  }\n\n  async WorkflowState_SavesComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    expireMyEffects.bind(this)([\"1Action\", \"1Spell\"]);\n    if (configSettings.allowUseMacro && this.workflowOptions.noOnUseMacro !== true) {\n      await this.callMacros(this.item, this.onUseMacros?.getMacros(\"postSave\"), \"OnUse\", \"postSave\");\n      if (this.ammunition) await this.callMacros(this.ammunition, this.ammunitionOnUseMacros?.getMacros(\"postSave\"), \"OnUse\", \"postSave\");\n    }\n    const hasDamageRoll = this.activity.hasDamage || this.otherActivity?.hasDamage || this.activity.hasHealing || this.otherActivity?.hasHealing;\n    if (!hasDamageRoll) return this.WorkflowState_AllRollsComplete;\n    if (getAutoRollDamage(this) === \"always\") return this.WorkflowState_WaitForDamageRoll;\n    const noHits = this.hitTargets.size === 0 && this.hitTargetsEC.size === 0;\n    const allMissed = noHits && this.targets.size !== 0;\n    if (allMissed) {\n      if (configSettings.confirmAttackDamage !== \"none\" && !this.workflowOptions.forceCompletion)\n        return this.WorkflowState_ConfirmRoll;\n      if (this.workflowOptions.forceCompletion || configSettings.autoCompleteWorkflow) {\n        expireMyEffects.bind(this)([\"1Attack\", \"1Action\", \"1Spell\"])\n        return this.WorkflowState_RollFinished;\n      }\n    }\n    return this.WorkflowState_WaitForDamageRoll;\n  }\n\n  async WorkflowState_WaitForDamageRoll(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (context.damageRoll || context.otherDamageRoll) {\n      // record the data - currently done in item handling\n      return this.WorkflowState_ConfirmRoll;\n    }\n    const hasDamageRoll = this.activity.hasDamage || this.otherActivity?.hasDamage || this.activity.hasHealing || this.otherActivity?.hasHealing;\n    if (!hasDamageRoll) return this.WorkflowState_AllRollsComplete;\n    return super.WorkflowState_WaitForDamageRoll(context);\n  }\n\n  async WorkflowState_DamageRollComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    await super.WorkflowState_DamageRollComplete(context);\n    return this.WorkflowState_AllRollsComplete;\n  }\n}\n\nexport class ActiveDefenceWorkflow extends Workflow {\n  async WorkflowState_WaitForAttackRoll(context?: WorkflowContext): Promise<WorkflowState> {\n    this.workflowOptions.attackRollDSN = false;\n    return super.WorkflowState_WaitForAttackRoll(context);\n  }\n  async processAttackRoll() {\n    return super.processAttackRoll();\n  }\n\n  async WorkflowState_AttackRollComplete(context?: WorkflowContext): Promise<WorkflowState> {\n    const attackBonus = (this.attackRoll?.total ?? 0) - (this.attackRoll?.dice[0]?.total ?? 0); // TODO see if there is a better way to work out roll plusses\n    this.activeDefenceDC = configSettings.optionalRules.activeDefenceModifier + attackBonus;\n    return super.WorkflowState_AttackRollComplete(context);\n  }\n\n  async checkHits() {\n    if (!this.attackRoll || !this.item) return;\n    if (!this.attackRoll?.total) {\n      this.abort = true;\n      return this.performState(this.WorkflowState_Abort);\n    }\n\n    this.displayHitTargets(false);\n    // Roll is d20 + AC - 10\n    let hookId = Hooks.on(\"renderChatMessageHTML\", this.processDefenceRoll.bind(this));\n    try {\n      this.hitTargets = new Set();\n      this.hitTargetsEC = new Set();\n      this.defenceRequests = {};\n      this.defenceTimeouts = {};\n      this.activeDefenceRolls = {};\n      this.isCritical = false;\n      this.isFumble = false;\n      // Get the attack bonus for the attack\n\n      await this.displayAttackRoll();\n      await this.checkActiveAttacks(false, this.attackRoll);\n      this.hitTargets = this.hitTargets; // force update\n      const isHitEC = false;\n      for (let targetToken of this.targets) {\n        let targetAC: number | undefined;\n        let adRoll: Roll | undefined;\n        const targetTokenDocument = getTokenDocument(targetToken);\n        if (!targetTokenDocument) continue;\n        if (this.activeDefenceRolls[targetTokenDocument.uuid ?? \"\"]) {\n          adRoll = this.activeDefenceRolls[targetTokenDocument.uuid] ?? {};\n\n          let attackType = \"\"; //item?.name ? i18n(item.name) : \"Attack\";\n          const isHit = this.hitTargets.has(targetToken);\n          let hitSymbol = \"fa-blank\"\n          // if ([\"scale\", \"scaleNoAR\"].includes(checkRule(\"challengeModeArmor\")) && !this.isCritical) hitScale = Math.floor(this.challengeModeScale[targetActor.uuid]);\n          let isHitResult = \"miss\";\n          // Inverse hit/miss icons from normal attacks so the result looks the same as with saving throws\n          if (game.user?.isGM && [\"hitMiss\", \"hidden\"].includes(configSettings.gmAttackDisplay ?? \"full\") && (this.isCritical || isHit || isHitEC)) {\n            // Failed defence roll\n            isHitResult = \"miss\";\n            hitSymbol = \"fa-xmark\";\n          } else if (this.isCritical) {\n            // Fumbled defence roll\n            isHitResult = \"fumble\";\n            hitSymbol = \"fa-xmarks-lines\";\n          } else if (game.user?.isGM && this.isFumble && [\"hitMiss\", \"hidden\"].includes(configSettings.gmAttackDisplay ?? \"full\")) {\n            // Successful defence roll\n            isHitResult = \"hit\";\n            hitSymbol = \"fa-check\";\n          } else if (this.isFumble) {\n            // Nat 20 defence roll\n            isHitResult = \"critical\";\n            hitSymbol = \"fa-check-double\";\n          } else if (isHit) {\n            // Failed defence roll\n            isHitResult = \"miss\";\n            hitSymbol = \"fa-xmark\";\n          } else if (isHitEC && [\"scale\", \"scaleNoAR\"].includes(checkRule(\"challengeModeArmor\") as string)) {\n            // Failed defence roll\n            isHitResult = \"miss\";\n            hitSymbol = \"fa-xmark\";\n          } else if (isHitEC) {\n            // Failed defence roll\n            isHitResult = \"miss\";\n            hitSymbol = \"fa-xmark\";\n          } else {\n            // Successful defence roll\n            isHitResult = \"hit\";\n            hitSymbol = \"fa-check\";\n          }\n          let hitStyle = \"\";\n\n          let img = targetTokenDocument.texture.src || targetTokenDocument.actor?.img;\n          // @ts-expect-error no dnd5e-types\n          if (configSettings.usePlayerPortrait && targetTokenDocument.actor?.type === \"character\") {\n            img = targetTokenDocument.actor?.img || targetTokenDocument.texture.src;\n          }\n          if (foundry.helpers.media.VideoHelper.hasVideoExtension(img ?? \"\")) {\n            img = await game.video?.createThumbnail(img ?? \"\", { width: 100, height: 100 }) ?? \"\";\n          }\n          // Why?\n          let acBonusString: string | undefined;\n          const acDisplay = `${adRoll.total}${acBonusString ?? \"\"}`;\n          const bonusAC = 0;\n          let attackBonus = (this.activeDefenceDC ?? 0) - configSettings.optionalRules.activeDefenceModifier;\n          // Compute cover bonus and apply\n          const targetUuid = targetTokenDocument.uuid;\n          this.hitDisplayData ??= {};\n          this.hitDisplayData[targetUuid] = {\n            targetClass: !!targetTokenDocument.actor?.hasPlayerOwner ? \"midi-qol-player-target\" : \"midi-qol-npc-target\",\n            target: targetToken,\n            actorUuid: targetTokenDocument.actor?.uuid,\n            uuid: targetUuid,\n            hitStyle,\n            attackBonus,\n            ac: (targetAC ?? 0) - attackBonus,\n            acDisplay,\n            baseAc: (targetAC ?? 0) - bonusAC,\n            hitClass: [\"hit\", \"critical\", \"isHitEC\"].includes(isHitResult) ? \"success\" : \"failure\",\n            acClass: targetTokenDocument.actor?.hasPlayerOwner ? \"\" : \"midi-qol-npc-ac\",\n            hitSymbol,\n            attackType,\n            showAC: true,\n            img: img as string ?? \"\",\n            isHit,\n            gmName: getTokenName(targetTokenDocument),\n            playerName: getTokenPlayerName(targetTokenDocument) ?? \"\",\n            hitResultNumeric: String(adRoll.total),\n            attackTotal: adRoll.total\n          };\n        }\n      }\n    } catch (err) {\n      TroubleShooter.recordError(err, \"activeDefence\");\n    } finally {\n      Hooks.off(\"renderChatMessageHTML\", hookId);\n    }\n  }\n\n  //@ts-expect-error no dnd5e types\n  async checkActiveAttacks(whisper = false, roll: CONFIG.Dice.D20Roll, _coverBonus = 0) {\n    //@ts-expect-error\n    const BasicRoll = CONFIG.Dice.BasicRoll;\n    if (debugEnabled > 1) debug(`active defence : whisper ${whisper}  hit targets ${this.targets}`)\n    if (this.targets.size <= 0) {\n      return;\n    }\n    //@ts-expect-error no dnd5e types\n    const D20Roll = CONFIG.Dice.D20Roll;\n\n    const criticalTarget = 20 - (roll.options.criticalFailure ?? 1) + 1;\n    const fumbleTarget = 20 - (roll.options.criticalSuccess ?? 20) + 1;\n    let advantageMode = roll?.options?.advantageMode ?? D20Roll.NORMAL;\n    let promises: Promise<any>[] = [];\n    for (let target of this.targets) {\n      if (!target.actor) continue;  // no actor means multi levels or bugged actor - but we won't roll a save\n      const targetActor = target.actor;\n      const targetActorSystem = target.actor.system;\n      const midiFlagsAttackBonus = targetActor.flags?.[MODULE_ID]?.grants?.attack?.bonus;\n\n      // TODO: Add in AC Bonus for cover\n      // @ts-expect-error no dnd5e-types\n      const actorAC = targetActorSystem.attributes.ac.value + (this.targetACModifiers.get(target.actor.uuid) ?? 0);\n      let dcMod = actorAC - (22 - configSettings.optionalRules.activeDefenceModifier);\n      let modString = `+ ${dcMod}`;\n      if (dcMod < 0) modString = `- ${Math.abs(dcMod)}`;\n      let attackBonus = 0;\n      if (midiFlagsAttackBonus) {\n        if (midiFlagsAttackBonus?.all) {\n          const attackBonusRoll = await (new Roll(midiFlagsAttackBonus.all, targetActor.getRollData()))?.evaluate();\n          attackBonus -= attackBonusRoll?.total ?? 0;\n          foundry.utils.setProperty(this.actor, \"flags.midi.evaluated.grants.attack.bonus.all\", { value: attackBonus, effects: [`${targetActor.name}`] });\n        }\n        if (midiFlagsAttackBonus[this.activity.actionType]) {\n          const attackBonusRoll = await (new Roll(midiFlagsAttackBonus[this.activity.actionType], targetActor.getRollData())).evaluate();\n          attackBonus -= attackBonusRoll?.total ?? 0;\n          foundry.utils.setProperty(this.actor, `flags.midi.evaluated.grants.attack.bonus.${this.activity.actionType}`, { value: attackBonus, effects: [`${targetActor.name}`] });\n        }\n      }\n      if (attackBonus < 0)\n        modString = `${modString} - ${Math.abs(attackBonus)}`;\n      else if (attackBonus > 0)\n        modString = `${modString} + ${attackBonus}`;\n      dcMod += attackBonus;\n      let coverBonus = 0;\n      const noCoverFlag = this.actor.flags?.[MODULE_ID]?.ignoreCover;\n      let ignoreCover = false;\n      if (noCoverFlag) {\n        const conditionData = createConditionData({ workflow: this, target, actor: this.actor });\n        ignoreCover ||= await evalAllConditionsAsync(this.actor, midiFlag(`ignoreCover`), conditionData);\n      }\n      if (this.activity?.actionType === \"rsak\" && this.actor.flags?.dnd5e?.spellSniper) {\n        const conditionData = createConditionData({ workflow: this, target, actor: this.actor });\n        ignoreCover ||= await evalAllConditionsAsync(this.actor, `flags.dnd5e.spellSniper`, conditionData);\n      }\n      const sharpShooterFlag = this.actor.flags?.[MODULE_ID]?.sharpShooter || this.actor.flags?.dnd5e?.sharpShooter;\n      if (this.activity?.actionType === \"rwak\" && sharpShooterFlag) {\n        const conditionData = createConditionData({ workflow: this, target, actor: this.actor });\n        ignoreCover ||= await evalAllConditionsAsync(this.actor, midiFlag(`sharpShooter`), conditionData);\n        ignoreCover ||= await evalAllConditionsAsync(this.actor, `flags.dnd5e.sharpShooter`, conditionData);\n      }\n      if (this.token) {\n        const moduleCover = computeCoverBonus(this.token, target, this.activity);\n        //@ts-expect-error no dnd5e-types\n        const statusCover: number = target.actor?.system?.attributes?.ac?.cover ?? 0;\n        // Status cover is already in the target's AC; only add the delta\n        coverBonus = Math.max(moduleCover - statusCover, 0);\n      }\n      if (ignoreCover && coverBonus < TOTAL_COVER) coverBonus = 0;\n      if (coverBonus) modString += ` + ${coverBonus}`;\n      let formula = `1d20${modString}`;\n\n      if (advantageMode === D20Roll.ADV_MODE.ADVANTAGE) {\n        advantageMode = D20Roll.ADV_MODE.DISADVANTAGE\n      } else if (advantageMode === D20Roll.ADV_MODE.DISADVANTAGE) {\n        advantageMode = D20Roll.ADV_MODE.ADVANTAGE;\n      }\n      const options = {\n        criticalSuccess: criticalTarget,\n        criticalFailure: fumbleTarget,\n        advantageMode,\n        target: this.activeDefenceDC\n      };\n      /*\n                  if (this.attackRoll && !this.item.flags?.[MODULE_ID]?.noProvokeReaction && !this.workflowOptions.noProvokeReaction) {\n                    const workflowOptions = foundry.utils.mergeObject(this.workflowOptions, { sourceActorUuid: this.actor.uuid, sourceItemUuid: this.item.uuid }, { inplace: false, overwrite: true });\n                    const result = await doReactions(targetToken, this.tokenUuid, this.attackRoll, \"reactionattacked\", { activity: this.activity, item: this.item, workflow: this, workflowOptions });\n                    // TODO what else to do once rolled\n                    // @ts-expect-error no dnd5e-types\n                    targetAC = Number.parseInt(targetActor.system.attributes.ac.value ?? 10) + bonusAC + descriptorMod;\n                  }\n                  isHit = (attackTotal + attackBonus) >= targetAC || this.isCritical;\n      */\n\n      let player = playerFor(target);\n      // if (!player || !player.active) player = ChatMessage.getWhisperRecipients(\"GM\").find(u => u.active);\n      if (debugEnabled > 0) warn(`checkSaves | Player ${player?.name} controls actor ${target.actor.name} - requesting DC ${this.activeDefenceDC} save`);\n      if (player && player.active && !player.isGM && target.actor) {\n        promises.push(new Promise((resolve) => {\n          const requestId = target.actor?.uuid ?? foundry.utils.randomID();\n          this.defenceRequests[requestId] = resolve;\n          if (player) requestPCActiveDefence(player, target.actor!, this.item.name, requestId, { formula, rollOptions: options, bonus: dcMod, coverBonus, workflow: this })\n          // set a timeout for taking over the roll\n          if (configSettings.playerSaveTimeout > 0) {\n            this.defenceTimeouts[requestId] = setTimeout(async () => {\n              if (this.defenceRequests[requestId]) {\n                delete this.defenceRequests[requestId];\n                delete this.defenceTimeouts[requestId];\n                const result = await (new D20Roll(formula, {}, options)).evaluate();\n                result.toMessage({ flavor: `${this.item.name} ${i18n(\"midi-qol.ActiveDefenceString\")}` });\n                resolve(result);\n              }\n            }, configSettings.playerSaveTimeout * 1000);\n          }\n        }));\n      } else {  // must be a GM so can do the roll direct\n        promises.push(\n          new Promise(async (resolve) => {\n            const result = await (new D20Roll(formula, {}, options)).evaluate();\n            result.toMessage({ flavor: `${this.item.name} ${i18n(\"midi-qol.ActiveDefenceString\")} ${options.criticalSuccess}/${options.criticalFailure}` }, { rollMode: configSettings.optionalRules.activeDefenceShow });\n            // displayDSNForRoll(result, \"attackRoll\")\n            resolve(result);\n          })\n        );\n      }\n    }\n    if (debugEnabled > 1) debug(\"check saves: requests are \", this.saveRequests)\n    var results = await Promise.all(promises);\n\n    this.rollResults = results;\n    let i = 0;\n    for (let target of this.targets) {\n      if (!target.actor) continue; // these were skipped when doing the rolls so they can be skipped now\n      if (!results[i]) {\n        const message = `Token ${target?.name} ${getTokenDocument(target)?.uuid}, \"could not roll active defence assuming 1`;\n        error(message, target);\n        TroubleShooter.recordError(new Error(message), message);\n        results[i] = await new BasicRoll(\"1\").evaluate();\n      }\n      const result = results[i];\n      let rollTotal = results[i]?.total || 0;\n      this.isFumble = result.dice[0].total >= criticalTarget; // save fumbled so critical hit\n      this.isCritical = result.dice[0].total <= fumbleTarget; // save critical so fumbled attack\n      this.activeDefenceRolls ??= {};\n      // do Reactions for active defence\n      let isHit = this.isCritical || rollTotal < (this.activeDefenceDC ?? 0);\n      // check to see if the roll hit the target\n      if (isHit && this.activity.attack && this.attackRoll && target !== null && !foundry.utils.getProperty(this, `item.flags.${MODULE_ID}.noProvokeReaction`) && !this.workflowOptions.noProvokeReaction) {\n        const workflowOptions = foundry.utils.mergeObject(this.workflowOptions, { sourceActorUuid: this.actor.uuid, sourceItemUuid: this.item.uuid }, { inplace: false, overwrite: true });\n        // reaction is the same as reactionhit to accomodate the existing reaction workflow\n        let reaction: {\n          name?: string;\n          uuid?: string;\n          ac?: number;\n        };\n        if (!this.item.flags?.[MODULE_ID]?.noProvokeReaction && !this.workflowOptions.noProvokeReaction) {\n          //@ts-expect-error no dnd5e-types\n          const savedAC = target.actor.system.attributes.ac.value;\n          reaction = await doReactions(target, this.tokenUuid, this.attackRoll, \"reaction\", { activity: this.activity, item: this.item, workflow: this, workflowOptions });\n          //@ts-expect-error no dnd5e-types\n          const acChange = target.actor.system.attributes.ac.value - savedAC;\n          rollTotal += (reaction.ac ?? 0) + acChange; // deal with bonus ac if any.\n          results[i] = await new BasicRoll(`${rollTotal}`, {}, { type: \"activeDefence\" }).evaluate();\n\n          // if (coverBonus === TOTAL_COVER) isHit = false; // bonusAC will only be TOTAL_COVER if cover bonus checking is enabled.\n        }\n      } else if (!isHit && this.activity.attack && this.attackRoll && target !== null && !foundry.utils.getProperty(this, `item.flags.${MODULE_ID}.noProvokeReaction`)) {\n        const workflowOptions = foundry.utils.mergeObject(this.workflowOptions, { sourceActorUuid: this.actor.uuid, sourceItemUuid: this.item.uuid }, { inplace: false, overwrite: true });\n        if (!this.item.flags?.[MODULE_ID]?.noProvokeReaction && !this.workflowOptions.noProvokeReaction) {\n          //@ts-expect-error no dnd5e-types\n          const savedAC = target.actor.system.attributes.ac.value;\n          let reaction: {\n            name?: string;\n            uuid?: string;\n            ac?: number;\n          } = await doReactions(target, this.tokenUuid, this.attackRoll, \"reactionmissed\", { activity: this.activity, item: this.item, workflow: this, workflowOptions });\n          //@ts-expect-error no dnd5e-types\n          const acChange = target.actor.system.attributes.ac.value - savedAC;\n          rollTotal += (reaction.ac ?? 0) + acChange; // deal with bonus ac if any.\n          results[i] = await new BasicRoll(`${rollTotal}`, {}, { type: \"activeDefence\" }).evaluate();\n        }\n      }\n      isHit = this.isCritical || rollTotal < (this.activeDefenceDC ?? 0);\n      this.activeDefenceRolls[getTokenDocument(target)?.uuid ?? \"\"] = results[i];\n      if (isHit)\n        this.hitTargets = this.hitTargets.add(target);\n      else {\n        this.hitTargets.delete(target);\n        this.hitTargets = this.hitTargets;\n      }\n      if (game.user?.isGM) log(`Active defence: ${target.name} rolled ${rollTotal} vs attack DC ${this.activeDefenceDC}`, results[i]);\n      i++;\n    }\n  }\n\n  async displayAttackRoll() {\n    const chatMessage = this.chatCard;\n    let newFlags = {};\n    const searchRe = /<div[^>]*?class=\"midi-qol-attack-roll[^\"]*\"[\\s\\S]*?<div class=\"end-midi-qol-attack-roll\">/;\n    let DCString = \"DC\";\n    DCString = i18n(\"DND5E.AbbreviationDC\") ?? \"DC\";\n    const attackString = `<label class=\"midi-qol-active-defence-dc\">${DCString} ${this.activeDefenceDC}</label> ${i18n(\"midi-qol.ActiveDefenceString\")}`;\n    const replaceString = `<div class=\"midi-qol-attack-roll midi-qol-section-filled\"><div class=\"midi-roll-label\">${attackString}</div><div class=\"end-midi-qol-attack-roll\">`;\n    let content = chatMessage?.content.replace(searchRe, replaceString) ?? \"\";\n    newFlags = {\n      \"midi-qol\":\n      {\n        isHit: this.hitTargets.size > 0,\n        isHitEC: this.hitTargetsEC.size > 0,\n        isCritical: this.isCritical,\n        isFumble: this.isFumble,\n        targets: Array.from(this.targets).map(t => ({ uuid: getTokenDocument(t)?.uuid, name: getTokenDocument(t)?.name })),\n        hitTargetUuids: Array.from(this.hitTargets).map(t => getTokenDocument(t)?.uuid),\n        hitECTargetUuids: Array.from(this.hitTargetsEC).map(t => getTokenDocument(t)?.uuid),\n      }\n    };\n    const rolls = [...(this.attackRoll ? [this.attackRoll] : [])];\n    await this.performThrottledUpdate(chatMessage, { content, flags: newFlags, rolls });\n  }\n}\nexport class UserWorkflow extends Workflow {\n  static get forceCreate() { return true; }\n}\n\nexport class DamageOnlyWorkflow extends Workflow {\n  itemCard: ChatMessage.Implementation | undefined;\n  constructor(\n    actor: Actor.Implementation | null,\n    token: Token.Implementation,\n    damageTotal: number,\n    damageType: string,\n    targets: Token.Implementation[],\n    roll: Roll,\n    options: {\n      flavor: string,\n      itemCardId: string,\n      itemCardUuid: string,\n      damageList: DamageListEntry[],\n      useOther: boolean,\n      itemData: Item.Source,\n      isCritical: boolean,\n      item?: Item,\n      storeWorkflow?: boolean\n    }) {\n    if (options.storeWorkflow === undefined) options.storeWorkflow = true;\n    if (!actor) actor = token.actor ?? targets[0]?.actor;\n    const theTargets = Array.from(targets).map(t => getToken(t)).filter(t => !!t);\n    let damageRoll = roll;\n    if (!damageRoll) {\n      // @ts-expect-error no dnd5e-types\n      damageRoll = new CONFIG.Dice.DamageRoll(`${damageTotal}`, {}, { type: damageType }).evaluateSync();\n    }\n    let theItem: Item.Implementation | null = null;\n    const extraItemData = {\n      name: options.flavor ?? \"Damage Only Workflow\",\n      type: \"feat\", _id: foundry.utils.randomID(),\n      system: {\n        activities: {\n          dnd5eactivity000: {\n            type: \"damage\",\n            _id: foundry.utils.randomID(),\n            damage: {\n              // @ts-expect-error no dnd5e-types\n              parts: [{ custom: { enabled: true, formula: damageRoll.formula }, types: [damageRoll.options.type] }],\n            },\n            range: {\n              override: true,\n              units: \"\"\n            },\n            midiProperties: {\n              ignoreTraits: [],\n              triggeredActivityId: \"none\",\n              triggeredActivityConditionText: \"\",\n              triggeredActivityTargets: \"targets\",\n              triggeredActivityRollAs: \"self\",\n              forceConfigDialog: \"default\",\n              forceRollDialog: \"default\",\n              forceDamageDialog: \"default\",\n              confirmTargets: \"default\",\n              autoTargetType: \"any\",\n              autoTargetAction: \"default\",\n              automationOnly: false,\n              otherActivityCompatible: true,\n              identifier: \"\"\n            },\n            target: {\n              affects: {\n                type: \"creature\",\n                special: \"\"\n              }\n            }\n          }\n        },\n      }\n    }\n    // Create a synthetic item with a single damage activity - activity is needed for displaying the activity card if required\n    if (options.item || options.itemData) { // use any item data passed in\n      let itemData: any = options.item ? options.item.toObject() : options.itemData;\n      if (itemData.system?.activities) delete itemData.system.activities;\n      itemData = foundry.utils.mergeObject(itemData, extraItemData, { inplace: false });\n      foundry.utils.setProperty(itemData, midiFlag(`syntheticItem`), true);\n      foundry.utils.setProperty(itemData, \"_id\", itemData._id ?? foundry.utils.randomID());\n      theItem = new CONFIG.Item.documentClass(itemData, { parent: actor });\n    } else {\n      foundry.utils.setProperty(extraItemData, midiFlag(`syntheticItem`), true);\n      //@ts-expect-error no dnd5e types\n      theItem = new CONFIG.Item.documentClass(extraItemData, { parent: actor });\n    }\n    if (!theItem) throw new Error(\"DamageOnlyWorkflow | could not create synthetic item\"); // cannot return before super()\n\n    // theItem.setFlag = async (scope: string, key: string, value: any) => { return theItem };\n    theItem.prepareData();\n    // @ts-expect-error no dnd5e-types\n    theItem.prepareFinalAttributes();\n    // @ts-expect-error no dnd5e-types\n    super(actor, theItem.system.activities.contents[0], ChatMessage.getSpeaker({ token, actor }), new Set(theTargets), { event: shiftOnlyEvent as KeyboardEvent, workflowOptions: { noOnUseMacro: true } });\n    // Do the supplied damageRoll\n    this.flavor = options.flavor;\n    this.defaultDamageType = GameSystemConfig.damageTypes[damageType]?.label ?? damageType;\n    // Since this could to be the same item don't roll the on use macro, since this could loop forever\n    if (this.item) foundry.utils.setProperty(this.item, midiFlag(`onUseMacroName`), null);\n    this.stateTransitionCount = 0;\n    if (options.itemCardId)\n      foundry.utils.logCompatibilityWarning(\n        \"midi-qol | DamageOnlyWorkflow: itemCardId is deprecated, use itemCardUuid instead\",\n        { since: \"midi-qol 12.4.32\", until: \"midi-qol 12.5.0\" }\n      );\n\n    if (options.itemCardUuid) this.itemCardUuid = options.itemCardUuid;\n    else {\n      const message = game.messages?.get(options.itemCardId);\n      if (message) this.itemCardUuid = message?.uuid;\n    }\n    this.setDamageRolls([damageRoll]).then(() => {\n      this.damageTotal = damageTotal;\n      this.isCritical = options.isCritical ?? false;\n      this.kickStart = false;\n      this.suspended = false;\n      this.performState(this.WorkflowState_Start);\n    })\n    return this;\n  }\n  static get forceCreate() { return false; }\n  async WorkflowState_Start(context: WorkflowContext = {}): Promise<WorkflowState> {\n    this.effectsAlreadyExpired = [];\n\n    if (this.itemCardUuid === \"new\" || !fromUuidSync(this.itemCardUuid)) {\n      const message = {}\n      const messageConfig = foundry.utils.mergeObject({\n        create: true,\n        data: {\n          flags: {\n            dnd5e: {\n              ...(this.activity.messageFlags as AnyObject),\n              messageType: \"usage\",\n              use: {\n                // @ts-expect-error TODO: is this right?\n                effects: this.applicableEffects?.map(e => e.id)\n              }\n            }\n          },\n          rolls: this.damageRolls,\n        },\n        hasConsumption: false\n      }, message);\n      // @ts-expect-error no dnd5e-types\n      this.itemCard = await this.activity._createUsageMessage(messageConfig);\n      this.itemCardUuid = this.itemCard?.uuid;\n    }\n    const whisperCard = configSettings.autoCheckHit === \"whisper\" || safeGetGameSetting(\"core\", \"rollMode\") === CONST.DICE_ROLL_MODES.BLIND;\n    if (this.actor) { // Hacky process bonus flags\n      // TODO come back and fix this for dnd3\n      const newRolls = await this.processDamageRollBonusFlags(this.damageRolls);\n      await this.setDamageRolls(newRolls);\n    }\n\n    if (this.itemCardUuid) {\n      this.isFumble = false;\n      this.attackTotal = 9999;\n      this.recordTargetACModifiers();\n      await this.checkHits(this.workflowOptions);\n      this.hitTargets = new Set(this.targets);\n      await this.displayHits(whisperCard, false);\n      await this.displayDamageRolls();\n    } else {\n      await this.damageRoll?.toMessage({ flavor: this.flavor });\n    }\n    this.hitTargets = new Set(this.targets);\n    this.hitTargetsEC = new Set();\n    this.effectTargets = new Set(this.targets);\n    // TODO change this to the new apply token damage call - sigh\n    //this.damageList = await applyTokenDamage(this.rawDamageDetail, this.damageTotal, this.targets, this.item, new Set(), { existingDamage: this.damageList, superSavers: new Set(), semiSuperSavers: new Set(), workflow: this, updateContext: undefined, forceApply: false })\n    const result = await this.WorkflowState_AllRollsComplete()\n    return result;\n  }\n}\n\nexport class TrapWorkflow extends Workflow {\n  templateLocation: { x: number, y: number, direction?: number, removeDelay?: number } | undefined;\n  saveTargets: any;\n  onUseMacroCalled: boolean | undefined;\n  targetsPassedToConstructor: boolean;\n  static get forceCreate() { return false; }\n  constructor(\n    actor: Actor,\n    activity: Activity,\n    targets: Array<Token> | undefined,\n    templateLocation: { x: number, y: number, direction?: number, removeDelay?: number } | undefined = undefined,\n    _trapSound: { playlist: string, sound: string } | undefined = undefined,\n    event: any = {},\n    _storeWorkflow: boolean = false) {\n    super(actor, activity, ChatMessage.getSpeaker({ actor }), new Set(targets ?? []), { event, storeWorkflow: false });\n    this.targetsPassedToConstructor = targets !== undefined;\n    // Sync game.user.targets from targets passed to constructor (for non-AoE activities)\n    if (this.targetsPassedToConstructor && targets && targets.length > 0) {\n      game.user?.targets.forEach(t => t.setTarget(false, { releaseOthers: false }));\n      game.user?.targets.clear();\n      for (const t of targets) {\n        t.setTarget(true, { releaseOthers: false });\n        game.user?.targets.add(t);\n      }\n    }\n    if (templateLocation) this.templateLocation = templateLocation;\n    // Use fastForwardAttack/fastForwardDamage instead of shiftOnlyEvent to skip dialogs\n    // Clear any event passed to constructor - it lacks target property that dnd5e's buildPost expects\n    this.rollOptions.event = undefined;\n    this.rollOptions.fastForwardAttack = true;\n    this.rollOptions.fastForwardDamage = true;\n    this.kickStart = false;\n    this.suspended = false;\n    // @ts-expect-error no dnd5e-types\n    this.activity.use({ configure: false, workflow: this, midiOptions: { workflowOptions: this.workflowOptions } }, {}, {})\n    // this.performState(this.WorkflowState_Start);\n    return this;\n  }\n\n  get workflowType() { return \"TrapWorkflow\" }\n\n  async WorkflowState_Start(context: WorkflowContext = {}): Promise<WorkflowState> {\n    this.saveTargets = validTargetTokens(new Set(game.user?.targets));\n    this.effectsAlreadyExpired = [];\n    this.onUseMacroCalled = false;\n    if (debugEnabled > 1) debug(\" Trapworkflow | WorkflowState_Start \", this.item, getActivityAutoTargetAction(this.activity), activityHasAreaTarget(this.activity), this.targets);\n    // don't support the placement of a template\n    return this.WorkflowState_AwaitTemplate\n  }\n  async WorkflowState_AwaitTemplate(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (activityHasEmanationNoTemplate(this.activity)) {\n      // Targets have already been set in activity.use\n      return this.WorkflowState_TemplatePlaced;\n    }\n    if (!activityHasAreaTarget(this.activity) || !this.templateLocation) {\n      return this.WorkflowState_TemplatePlaced;\n    }\n    //@ts-expect-error no dnd5e-types\n    const TemplateClass = game.system.canvas.AbilityTemplate;\n    const abilityTemplates = TemplateClass.fromActivity(this.activity);\n    const templateData: any = abilityTemplates[0].document.toObject(false);\n    // template.draw();\n    // get the x and y position from the trapped token\n    templateData.x = this.templateLocation?.x || 0;\n    templateData.y = this.templateLocation?.y || 0;\n    templateData.direction = this.templateLocation?.direction || 0;\n\n    // Create the template\n    let templates = await (canvas.scene as unknown as Scene)?.createEmbeddedDocuments(\"MeasuredTemplate\", [templateData]);\n    if (templates) {\n      for (const tDoc of templates) {\n        if (!tDoc?.uuid) continue;\n        this.templateUuid = tDoc.uuid;\n        await this.setupTemplateCleanup(tDoc as MeasuredTemplateDocument);\n      }\n      this.placedTemplateCount = templates.length;\n      this.selectAllTemplateTargets();\n      if (this.templateLocation?.removeDelay) {\n        let ids: string[] = templates.map(td => td._id as string)\n        //TODO test this again\n        setTimeout(() => canvas.scene?.deleteEmbeddedDocuments(\"MeasuredTemplate\", ids), this.templateLocation.removeDelay * 1000);\n      }\n    }\n    return this.WorkflowState_TemplatePlaced\n  }\n  async WorkflowState_TemplatePlaced(context: WorkflowContext = {}): Promise<WorkflowState> {\n    return this.WorkflowState_ValidateRoll;\n  }\n  async WorkflowState_ValidateRoll(context: WorkflowContext = {}): Promise<WorkflowState> {\n    // do pre roll checks\n    return this.WorkflowState_WaitForAttackRoll\n  }\n  async WorkflowState_WaitForAttackRoll(context: WorkflowContext = {}): Promise<WorkflowState> {\n    // Check if we're being unsuspended after attack roll completed\n    if (context.attackRoll) return this.WorkflowState_AttackRollComplete;\n\n    if (!this.activity.attack && !this.activity.hasAttack) {\n      // No attack on activity, all targets are hit\n      this.hitTargets = new Set(this.targets);\n      this.hitTargetsEC = new Set();\n      return this.WorkflowState_WaitForSaves;\n    }\n    warn(\"TrapWorkflow | WaitForAttackRoll rolling attack for\", this.activity.name, \"hasAttack:\", this.activity.hasAttack, \"attack:\", this.activity.attack);\n    // TrapWorkflow has no event - dialog skipping is controlled via rollOptions.fastForwardAttack\n    this.activity.rollAttack?.({ workflow: this, midiOptions: { workflowOptions: this.workflowOptions } }, {}, {});\n    return this.WorkflowState_Suspend;\n  }\n  async WorkflowState_AttackRollComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    await this.processAttackRoll();\n    this.recordAttackStats();\n    await this.displayAttackRoll();\n    this.recordTargetACModifiers();\n    await this.checkHits(this.workflowOptions);\n    const whisperCard = configSettings.autoCheckHit === \"whisper\" || safeGetGameSetting(\"core\", \"rollMode\") === CONST.DICE_ROLL_MODES.BLIND;\n    await this.displayHits(whisperCard);\n    return this.WorkflowState_WaitForSaves;\n  }\n  setDescriptorACModifiers() {\n    throw new Error(\"Method not implemented.\");\n  }\n  async WorkflowState_WaitForSaves(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (!this.activityHasSave) {\n      this.saves = new Set(); // no saving throw, so no-one saves\n      const allHitTargets = new Set([...this.hitTargets, ...this.hitTargetsEC]);\n      this.failedSaves = new Set(allHitTargets);\n      return this.WorkflowState_WaitForDamageRoll;\n    }\n    let hookId = Hooks.on(\"createChatMessage\", this.processSaveRoll.bind(this));\n    let monksId = Hooks.on(\"updateChatMessage\", this.monksSavingCheck.bind(this));\n    //@ts-expect-error flash-rolls-5e custom hook\n    let flashId = Hooks.on(\"flash-rolls-5e.rollComplete\", this.flashSavingCheck.bind(this));\n    try {\n      const saveDisplay = (this.activity.saveDisplay ?? \"default\") === \"default\" ? configSettings.autoCheckSaves : this.activity.saveDisplay;\n      await this.checkSaves(saveDisplay !== \"allShow\");\n    } catch (err) {\n      TroubleShooter.recordError(err, \"checkSaves\");\n    } finally {\n      Hooks.off(\"createChatMessage\", hookId);\n      Hooks.off(\"updateChatMessage\", monksId);\n      //@ts-expect-error flash-rolls-5e custom hook\n      Hooks.off(\"flash-rolls-5e.rollComplete\", flashId);\n    }\n    if (debugEnabled > 1) debug(\"Check Saves: renderChat message hooks length \", Hooks.events[\"renderChatMessageHTML\"]?.length);\n    const saveDisplay = (this.activity.saveDisplay ?? \"default\") === \"default\" ? configSettings.autoCheckSaves : this.activity.saveDisplay;\n    await this.displaySaves(saveDisplay === \"whisper\");\n    return this.WorkflowState_SavesComplete;\n  }\n  async WorkflowState_SavesComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    return this.WorkflowState_WaitForDamageRoll\n  }\n\n  async WorkflowState_WaitForDamageRoll(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (context.damageRoll) return this.WorkflowState_DamageRollComplete;\n    if (!this.activity.hasDamage && !this.activity.hasHealing) return this.WorkflowState_AllRollsComplete;\n\n    if (this.isFumble) {\n      // fumble means no trap damage/effects\n      return this.WorkflowState_RollFinished;\n    }\n    if (debugEnabled > 1) debug(\"TrapWorkflow: Rolling damage \", this.rollOptions.event, this.spellLevel, this.workflowOptions.versatile, this.targets, this.hitTargets);\n    this.rollOptions.fastForward = true;\n    this.activity.rollDamage({ workflow: this, midiOptions: { ...this.rollOptions, workflowOptions: this.workflowOptions } }, {}, {});\n    return this.WorkflowState_Suspend; // wait for a damage roll to advance the state.\n  }\n  async WorkflowState_DamageRollComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    // If the item does damage, use the same damage type as the item\n    /*\n    let defaultDamageType = getActivityDefaultDamageType(this) ?? this.defaultDamageType\n    this.rawDamageDetail = createDamageDetail({ roll: this.damageRolls, activity: this.activity, defaultType: defaultDamageType });\n    if (this.bonusDamageRolls)\n      this.rawBonusDamageDetail = createDamageDetail({ roll: this.bonusDamageRolls, activity: this.activity, defaultType: defaultDamageType });\n    else\n      this.rawBonusDamageDetail = [];\n    if (this.otherDamageRolls)\n      this.rawOtherDamageDetail = createDamageDetail({ roll: this.otherDamageRolls, activity: this.activity, defaultType: defaultDamageType });\n    else\n      this.rawOtherDamageDetail = [];\n    */\n    // apply damage to targets plus saves plus immunities\n    await this.displayDamageRolls();\n    if (this.isFumble) {\n      return this.WorkflowState_ApplyDynamicEffects\n    }\n    return this.WorkflowState_AllRollsComplete;\n  }\n  async WorkflowState_AllRollsComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (debugEnabled > 1) debug(\"all rolls complete \", foundry.utils.duplicate(this.rawDamageDetail))\n    if (this.rawDamageDetail?.length) await processDamageRoll(this, this.rawDamageDetail[0].type)\n    this.recordDamageStats();\n    return this.WorkflowState_ApplyDynamicEffects;\n  }\n  async WorkflowState_RollFinished(context: WorkflowContext = {}): Promise<WorkflowState> {\n    // area effect trap, put back the targets the way they were\n    if (this.saveTargets && activityHasAreaTarget(this.activity)) {\n      game.user?.targets.forEach(t => {\n        t.setTarget(false, { releaseOthers: false });\n      });\n      game.user?.targets.clear();\n      this.saveTargets.forEach(t => {\n        t.setTarget(true, { releaseOthers: false })\n        game.user?.targets.add(t)\n      })\n    }\n    return super.WorkflowState_RollFinished\n  }\n}\n\nexport class DDBGameLogWorkflow extends Workflow {\n  DDBGameLogHookId: number | undefined;\n  needsDamage: boolean;\n  needsOtherDamage: boolean | undefined;\n  static get forceCreate() { return false }\n  static get(id: string): DDBGameLogWorkflow | undefined {\n    return Workflow.getWorkflow(id) as DDBGameLogWorkflow | undefined;\n  }\n\n  constructor(actor: Actor.Implementation, activity: Activity, speaker: ChatMessage.SpeakerData, targets: Token.Implementation[], options: any) {\n    super(actor, activity, speaker, targets, options);\n    this.expectedTemplateCount = activityHasAreaTarget(this.activity) ? 1 : 0;\n    this.templateUuids = [];\n    // this.needItemCard = false; TODO see where this is used\n    this.needsDamage = !!this.activity.hasDamage;\n    this.attackRolled = !activity.hasAttack;\n    // @ts-expect-error TODO: this\n    if (configSettings.undoWorkflow) this.undoData = { actorUuid: actor?.uuid, itemUuid: this.item.uuid, targets: Array.from(targets).map(t => t.id), options: options };\n    this.kickStart = true;\n    this.flagTags = { \"ddb-game-log\": { \"midi-generated\": true } };\n    if (configSettings.undoWorkflow) saveUndoData(this);\n  }\n\n  async complete() {\n    if (this.chatCard) {\n      await this.chatCard.update({\n        flags: { \"midi-qol\": { type: MESSAGE_TYPES.HITS } },\n      });\n    }\n  }\n  async WorkflowState_PreambleComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    return super.WorkflowState_PreambleComplete(context);\n  }\n\n  async WorkflowState_WaitForAttackRoll(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (context.attackRoll) return this.WorkflowState_AttackRollComplete;\n    if (!this.activity.attack) {\n      return this.WorkflowState_AttackRollComplete;\n    }\n    if (!this.attackRolled) return this.WorkflowState_Suspend;\n    return this.WorkflowState_AttackRollComplete;\n  }\n  async WorkflowState_AttackRollComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    this.effectsAlreadyExpired = [];\n    if (checkRule(\"removeHiddenInvis\")) await removeHidden.bind(this)();\n    await this.callMidiHooks(\"midi-qol.preCheckHits\");\n\n    if (debugEnabled > 1) debug(this.attackRollHTML)\n    if (configSettings.autoCheckHit !== \"none\" && this.activity.attack) {\n      this.recordTargetACModifiers(); // Not sure this is relevant\n      await this.checkHits(this.workflowOptions);\n      await this.displayHits(configSettings.autoCheckHit === \"whisper\");\n    }\n    await this.callMidiHooks(\"midi-qol.AttackRollComplete\");\n    if (this.aborted) return this.WorkflowState_Abort;\n    return this.WorkflowState_WaitForDamageRoll;\n  }\n\n  async WorkflowState_AwaitTemplate(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (!activityHasAreaTarget(this.activity)) return super.WorkflowState_AwaitTemplate;\n    let system: any = game.system;\n    // Create the template\n    const template = system.canvas.AbilityTemplate.Activity(this.activity);\n    if (template) template.drawPreview();\n    return super.WorkflowState_AwaitTemplate;\n  }\n  async WorkflowState_WaitForDamageRoll(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (this.needsDamage && this.activity.hasDamage) return this.WorkflowState_Suspend;\n    if (this.needsOtherDamage) return this.WorkflowState_Suspend;\n    if (context.attackRoll) return this.WorkflowState_AttackRollComplete;\n    const allHitTargets = new Set([...this.hitTargets, ...this.hitTargetsEC]);\n    this.failedSaves = new Set(allHitTargets);\n    if (!this.activity.hasDamage && !this.activity.hasHealing) return this.WorkflowState_WaitForSaves;\n    return this.WorkflowState_DamageRollComplete;\n  }\n  async WorkflowState_DamageRollComplete(context: WorkflowContext = {}): Promise<WorkflowState> {\n    this.defaultDamageType = getActivityDefaultDamageType(this) ?? this.defaultDamageType ?? MidiQOL.MQdefaultDamageType;\n    if (this.activity.actionType === \"heal\" && !Object.keys(GameSystemConfig.healingTypes).includes(this.defaultDamageType ?? \"\")) this.defaultDamageType = \"healing\";\n\n    this.rawDamageDetail = createDamageDetail({ roll: this.damageRolls, activity: this.activity, defaultType: this.defaultDamageType });\n\n    const damageBonusMacros = this.getDamageBonusMacros();\n    if (damageBonusMacros) {\n      await this.rollBonusDamage(damageBonusMacros);\n    }\n    this.rawOtherDamageDetail = [];\n    if (this.bonusDamageRolls) {\n      const messageData = {\n        flavor: this.bonusDamageFlavor,\n        speaker: this.speaker\n      }\n      // foundry.utils.setProperty(messageData, `flags.${game.system?.id}.roll.type`, \"midi\");\n      this.bonusDamageRoll?.toMessage(messageData); // see if this can deal with an array of rolls\n    }\n    expireMyEffects.bind(this)([\"1Attack\", \"1Action\", \"1Spell\"]);\n\n    if (getActivityAutoTargetAction(this.activity) === \"none\" && activityHasAreaTarget(this.activity) && !this.activity.attack) {\n      // we are not auto targeting so for area effect attacks, without hits (e.g. fireball)\n      this.targets = validTargetTokens(new Set(game.user?.targets));\n      this.hitTargets = validTargetTokens(new Set(game.user?.targets));\n      this.hitTargetsEC = new Set();\n    }\n    // apply damage to targets plus saves plus immunities\n    if (this.isFumble) { //TODO: Is this right?\n      return this.WorkflowState_RollFinished;\n    }\n    if (this.activity.save) return this.WorkflowState_WaitForSaves\n    return this.WorkflowState_AllRollsComplete;\n  }\n\n  async WorkflowState_RollFinished(context: WorkflowContext = {}): Promise<WorkflowState> {\n    if (this.postSummonHookId) Hooks.off(\"dnd5e.postSummon\", this.postSummonHookId);\n    await super.WorkflowState_RollFinished();\n    return this.WorkflowState_Suspend;\n  }\n}\n\nexport class DummyWorkflow extends Workflow {\n  static get forceCreate() { return false }\n  expectedAttackRoll: number | undefined;\n  _dummyActor: Actor.Implementation | undefined;\n  //@ts-expect-error dnd5e v10\n  constructor(actor: globalThis.dnd5e.documents.Actor5e, activity: any, speaker, targets, options: any) {\n    options.noTemplateHook = true;\n    super(actor, activity, speaker, targets, options);\n    this._dummyActor = actor;\n    this.advantage = options?.advantage;\n    this.disadvantage = options?.disadvantage\n    this.rollOptions.fastForward = options?.fastForward;\n  }\n\n  override get actor(): Actor.Implementation {\n    return this._dummyActor ?? super.actor;\n  }\n\n  async performState(newState: WorkflowState) {\n    return super.performState(this.WorkflowState_Suspend);\n  }\n  async simulateSave(targets: Token.Implementation[]) {\n    this.targets = new Set(targets);\n    this.hitTargets = new Set(targets)\n    this.initSaveResults();\n    await this.checkSaves(true, true);\n    for (let result of this.saveResults!) {\n      // @ts-expect-error what is happening\n      result.saveAdvantage = result.options.advantageMode === 1;\n      // @ts-expect-error what is happening\n      result.saveDisadvantage = result.options.advantageMode === -1;\n      //@ts-expect-error\n      const D20Roll = CONFIG.Dice.D20Roll;\n      // @ts-expect-error what is happening\n      result.saveRoll = await new D20Roll(result.formula).evaluate();\n      // @ts-expect-error what is happening\n      const maxroll = (await result.saveRoll?.reroll({ maximize: true }))?.total;\n      // @ts-expect-error what is happening\n      const minroll = (await result.saveRoll?.reroll({ minimize: true }))?.total;\n      // @ts-expect-error what is happening\n      result.expectedSaveRoll = ((maxroll || 0) + (minroll || 0)) / 2;\n      // @ts-expect-error what is happening\n      if (result.saveAdvantage) result.expectedSaveRoll += 3.325;\n      // @ts-expect-error what is happening\n      if (result.saveDisadvantage) result.expectedSaveRoll -= 3.325;\n    }\n    return this;\n  }\n  async simulateAttack(target: Token.Implementation) {\n    this.targets = new Set([target]);\n    await this.checkAttackAdvantage(); // resets tracker internally\n    // Block updates to quantity\n    //@ts-expect-error\n    const hookId = Hooks.on(\"dnd5e.rollAttack\", (item, roll, ammoUpdate) => {\n      if (item === this.item && ammoUpdate?.length) ammoUpdate.length = 0\n    });\n    try {\n      [this.attackRoll] = await this.activity.rollAttack?.({ midiOptions: { fastForward: true, chatMessage: false, isDummy: true, workflowOptions: this.workflowOptions } }, {}, {}) as Roll[];\n    } catch (err) {\n      TroubleShooter.recordError(err, \"simulate attack\");\n    } finally {\n      Hooks.off(\"dnd5e.rollAttack\", hookId)\n    }\n    const maxroll = (await this.attackRoll?.reroll({ maximize: true }))?.total;\n    const minroll = (await this.attackRoll?.reroll({ minimize: true }))?.total;\n    this.expectedAttackRoll = ((maxroll || 0) + (minroll || 0)) / 2;\n    if (this.advantage) this.expectedAttackRoll += 3.325;\n    if (this.disadvantage) this.expectedAttackRoll -= 3.325;\n    return this;\n  }\n}\n\n// Registry of workflow classes for dynamic lookup (avoids eval)\n// Using a looser type since subclasses have different constructor signatures\nexport const WorkflowRegistry: Record<string, new (...args: any[]) => Workflow> = {\n  Workflow,\n  SavesFirstWorkflow,\n  ActiveDefenceWorkflow,\n  UserWorkflow,\n  DamageOnlyWorkflow,\n  TrapWorkflow,\n  DDBGameLogWorkflow,\n  DummyWorkflow,\n};\n\n// `options` arg for Workflow\ntype WorkflowConstructorOptions = InexactPartial<{\n  chatCardUuid: string;\n  event: MouseEvent | KeyboardEvent;\n  item: Item.Implementation;\n  noOptionalRules: boolean;\n  noTemplateHook: boolean;\n  rollOptions: WorkflowRollOptions\n  storeWorkflow: boolean;\n  token: Token.Implementation;\n  workflowOptions: WorkflowOptions\n}>;\n\ntype TrapWorkflowConstructorOptions = WorkflowConstructorOptions & {\n  templateLocation: { x: number, y: number, direction?: number, removeDelay?: number };\n  trapSound: { playlist: string, sound: string };\n}\n\n// `workflowOptions`\nexport type WorkflowOptions = InexactPartial<{\n  advantage: boolean;\n  allowIncapacitated: boolean;\n  attackPerTarget: boolean;\n  attackRollDSN: boolean;\n  autoConsumeResource: string;\n  autoFastAttack: boolean;\n  autoRollAttack: boolean;\n  autoRollDamage: string;\n  chatMessage: boolean;\n  damageRollDSN: boolean;\n  disadvantage: boolean;\n  event: AugmentedEvent;\n  fastForward: boolean;\n  fastForwardAbility: boolean;\n  fastForwardAttack: boolean;\n  fastForwardDamage: boolean;\n  fastForwardSet: boolean;\n  forceCompletion: boolean;\n  forceTemplateTargeting: boolean;\n  formulaDSN: boolean;\n  ignoreUserTargets: boolean;\n  isCritical: boolean;\n  isMagicSave: boolean;\n  isReaction: boolean;\n  item: Item.Implementation;\n  noConcentrationCheck: boolean;\n  noOnUseMacro: boolean;\n  noProvokeReaction: boolean;\n  noTargetOnUseMacro: boolean;\n  noUseWarning: boolean;\n  notBonusAction: boolean;\n  notReaction: boolean;\n  onlyOnUseItemMacros: boolean;\n  other: boolean;\n  parts: string[];\n  rollToggle: boolean;\n  rollType: string;\n  saveItem: Item.Implementation;\n  saveItemUuid: string;\n  simulate: boolean;\n  target: number;\n  targetConfirmation: string;\n  updateWorkflow: boolean;\n  versatile: boolean;\n  workflowName: string;\n  castUsesReaction: boolean;\n  castUsesBonusAction: boolean;\n  coverOrigin: { x: number, y: number, elevation?: number };\n  templateUuid: string;\n  preSelectedTargetUuids: string[];\n}>\n\n// Workflow's `rollOptions`\nexport type WorkflowRollOptions = InexactPartial<{\n  event: AugmentedEvent;\n  fastForward: boolean;\n  fastForwardAttack: boolean;\n  fastForwardDamage: boolean;\n  isCritical: boolean;\n  rollToggle: boolean;\n}>;\n\nexport type UndoData = {\n  id: string;\n  userId?: string;\n  itemName?: string;\n  itemUuid?: string;\n  userName?: string;\n  tokendocUuid?: string;\n  actorUuid: string;\n  actorName?: string;\n  chatCardUuids: string[];\n  isReaction: boolean;\n  templateUuids: string[];\n  sequencerUuid?: string;\n  serverTime?: number;\n  itemCardUuid?: string;\n  actorEntry?: {\n    actorUuid: string;\n    tokenUuid?: string;\n    actorData?: Actor.Source;\n    tokenData?: TokenDocument.Source;\n  };\n  allTargets?: Collection<{\n    tokenUuid: string;\n    actorUuid: string;\n    actorData?: Actor.Source;\n    tokenData?: TokenDocument.Source;\n  }>;\n  targets?: {\n    tokenUuid: string;\n    actorUuid: string;\n  }[]\n}\n\n// `context` passed to some functions\ntype WorkflowContext = InexactPartial<{\n  attackRoll: Roll;\n  damageRoll: Roll;\n  itemCardUuid: string;\n  itemUseComplete: boolean;\n  noDamage: boolean;\n  otherDamageRoll: Roll;\n  utilityRolls: Roll[];\n}>;\n\ntype MidiMacroData = {\n  actor?: Actor.Implementation;\n  actorData?: Actor.Source;\n  actorUuid?: string;\n  advantage?: boolean;\n  attackD20: number;\n  attackRoll?: Roll;\n  attackTotal: number;\n  bonusDamageDetail?: DamageDescription[];\n  bonusDamageHTML?: string;\n  bonusDamageRoll?: Roll;\n  bonusDamageRolls?: Roll[];\n  bonusDamageTotal?: number;\n  castData: unknown;\n  castLevel: number;\n  criticalSaves: TokenDocument.Implementation[];\n  criticalSaveUuids: string[];\n  damageDetail?: DamageDescription[];\n  damageList: DamageListEntry[];\n  damageRoll?: Roll;\n  damageRolls: Roll[];\n  damageTotal: number;\n  diceRoll: number;\n  disadvantage?: boolean;\n  event?: AugmentedEvent;\n  failedSaves: TokenDocument.Implementation[];\n  failedSaveUuids: string[];\n  fumbleSaves: TokenDocument.Implementation[];\n  fumbleSaveUuids: string[];\n  hitTargets: TokenDocument.Implementation[];\n  hitTargetsEC: TokenDocument.Implementation[];\n  hitTargetUuids: string[];\n  hitTargetUuidsEC: string[];\n  id: string;\n  isCritical?: boolean;\n  isFumble: boolean;\n  item: Item.Source & { uuid?: string };\n  itemCardUuid?: string;\n  itemData: Item.Source & { uuid?: string };\n  itemUuid?: string;\n  macroPass?: string;\n  options?: AnyObject;\n  otherDamageDetail?: DamageDescription[];\n  otherDamageList?: DamageListEntry[];\n  otherDamageTotal?: number;\n  roll?: Roll;\n  rollData: AnyObject;\n  rollOptions: WorkflowRollOptions;\n  saves: TokenDocument.Implementation[];\n  saveUuids: string[];\n  semiSuperSavers: TokenDocument.Implementation[];\n  semiSuperSaverUuids: string[];\n  sourceItemUuid?: string;\n  speaker?: ChatMessage.SpeakerData;\n  spellLevel: number;\n  superSavers: TokenDocument.Implementation[];\n  superSaverUuids: string[];\n  tag?: string;\n  targets: TokenDocument.Implementation[];\n  targetUuids: string[];\n  templateId?: string;\n  templateUuid?: string;\n  templateUuids?: string[];\n  tokenUuid?: string;\n  utilityRoll?: Roll;\n  utilityRolls?: Roll[];\n  uuid?: string;\n  workflow: Workflow;\n  workflowId: string;\n  workflowOptions: WorkflowOptions;\n}\n\nexport interface AugmentedEvent extends Event {\n  shiftKey: boolean;\n  altKey: boolean;\n  ctrlKey: boolean;\n  metaKey: boolean;\n  type: string;\n}\n","import { debug, setDebugLevel, i18n, debugEnabled, error, gameStats, updateFlankingStatusEffects } from \"../midi-qol.js\";\nimport { ConfigPanel } from \"./apps/ConfigPanel.js\"\nimport { DependentsExplorer } from \"./apps/DependentsExplorer.js\";\nimport { ModuleReviewDialog } from \"./apps/ModuleReviewDialog.js\";\nimport { RollStatsDisplay } from \"./apps/RollStatsDisplay.js\";\nimport { SoundConfigPanel } from \"./apps/SoundConfigPanel.js\";\nimport { TroubleShooter } from \"./apps/TroubleShooter.js\";\nimport { TargetConfirmationConfig } from \"./apps/TargetConfirmationConfig.js\";\nimport { Workflow } from \"./Workflow.js\";\nimport type { SelectOptions } from \"../globals.js\";\n\n// Dummy FormApplication that launches the setup wizard via hook (can't be eliminated - fires a hook, not an app)\nclass LaunchWizardSubmenu extends FormApplication {\n  constructor(object = {}, options = {}) {\n    super(object, options);\n  }\n  static get defaultOptions() {\n    return foundry.utils.mergeObject(super.defaultOptions, {\n      id: \"midi-qol-launch-wizard\",\n      classes: [\"midi-qol\"],\n      title: \"Launch Setup Wizard\",\n      width: 0,\n      height: 0\n    });\n  }\n  async _render(force?: boolean, options?: any) {\n    // Don't render anything - just trigger the wizard and close\n    Hooks.call(\"midi-qol-setup-wizard.launch\");\n    this.close();\n  }\n  getData() { return {}; }\n  protected _updateObject(event: Event, formData?: object): Promise<unknown> { return Promise.resolve(); }\n}\n\n// Dummy FormApplication that shows reset confirmation dialog\nclass ResetSettingsSubmenu extends FormApplication {\n  constructor(object = {}, options = {}) {\n    super(object, options);\n  }\n  static get defaultOptions() {\n    return foundry.utils.mergeObject(super.defaultOptions, {\n      id: \"midi-qol-reset-settings\",\n      classes: [\"midi-qol\"],\n      title: \"Reset Settings\",\n      width: 0,\n      height: 0\n    });\n  }\n  async _render(force?: boolean, options?: any) {\n    // Don't render anything - show confirmation dialog and close\n    const confirmed = await foundry.applications.api.DialogV2.confirm({\n      window: { title: i18n(\"midi-qol.ResetDefaults.Title\") },\n      content: `<p>${i18n(\"midi-qol.ResetDefaults.Content\")}</p>`,\n      yes: { label: i18n(\"midi-qol.ResetDefaults.Confirm\") },\n      no: { label: i18n(\"Cancel\") }\n    });\n    if (confirmed) {\n      await resetConfigSettingsToDefaults();\n    }\n    this.close();\n  }\n  getData() { return {}; }\n  protected _updateObject(event: Event, formData?: object): Promise<unknown> { return Promise.resolve(); }\n}\n\nlet fastForwardMigrationDone = false;\n/** @deprecated Removed in favor of granular configSettings.autoFastForward[] and configSettings.gmAutoFastForward[] arrays */\nexport let autoRemoveTargets: string;\nexport let coloredBorders: string;\nexport let criticalDamage: string;\nexport let criticalDamageGM: string;\nexport let debounceInterval: number;\nexport let dragDropTargeting: boolean;\nexport let enableWorkflow: boolean;\nexport let forceHideRoll: boolean;\nexport let itemRollButtons: boolean;\nexport let midiSoundSettings: any = {};\nexport let midiSoundSettingsBackup: any = undefined;\nexport let nsaFlag: boolean;\nexport let playerControlsInvisibleTokens: boolean = false;\nexport let pruneChatLog: boolean = true;\nexport let replaceDefaultActivities: boolean = true;\nexport let isDnd5e53: boolean = false;\nexport function setDnd5e53(value: boolean) { isDnd5e53 = value; }\nexport let saveRequests = {};\nexport let saveTimeouts = {};\nexport let saveToChatCard: boolean = false;\nexport let targetConfirmation: typeof defaultTargetConfirmationSettings;\nexport let useWeakReferences: boolean = false;\n\n/**\n * Syncs the chatlog-prune module's \"enabled\" setting with midi-qol's pruneChatLog setting.\n * Only runs if chatlog-prune module is active.\n */\nexport function syncChatlogPruneSetting(enabled: boolean): void {\n  const chatlogPruneModule = game.modules.get(\"chatlog-prune\");\n  if (!chatlogPruneModule?.active) return;\n\n  try {\n    // @ts-expect-error chatlog-prune is an external module\n    const currentSetting = game.settings.get(\"chatlog-prune\", \"enabled\");\n    if (currentSetting !== enabled) {\n      // @ts-expect-error chatlog-prune is an external module\n      game.settings.set(\"chatlog-prune\", \"enabled\", enabled);\n    }\n  } catch (err) {\n    console.warn(\"midi-qol | Failed to sync chatlog-prune enabled setting:\", err);\n  }\n}\n\nexport const defaultTargetConfirmationSettings = {\n  enabled: false,\n  always: false,\n  noneTargeted: false,\n  hasAttack: false,\n  hasCreatureTarget: false,\n  targetSelf: false,\n  hasAoE: false,\n  hasRangedAoE: false,\n  longRange: false,\n  inCover: false,\n  allies: false,\n  mixedDisposition: false,\n  gridPosition: { x: 0, y: 0 }\n};\n\nconst defaultKeyMapping = {\n  \"DND5E.Advantage\": \"altKey\",\n  \"DND5E.Disadvantage\": \"ctrlKey\",\n  \"DND5E.Critical\": \"altKey\",\n  \"DND5E.Versatile\": \"shiftKey\"\n};\n\nclass ConfigSettings {\n  // fullAuto: boolean = false;\n  addChatDamageButtons: string = \"none\";\n  addDead: string = \"none\";\n  addFakeDice: boolean = false;\n  addWounded: number = 0;\n  addWoundedStyle: string = \"none\";\n  activityNamePrefix: boolean = true;\n  conditionEditorEnabled: boolean = true;\n  activationAutomation: string = \"chat\";\n  midiWoundedCondition: string = \"none\";\n  midiDeadCondition: string = \"none\";\n  midiUnconsciousCondition: string = \"none\";\n  allowUseMacro: boolean = true;\n  allowActorUseMacro: boolean = true;\n  attackPerTarget: boolean = false;\n  autoApplyDamage: string = \"none\";\n  damageCardStyle: string = \"flexbox\";\n  playerDamageCard: string = \"none\";\n  playerCardDamageDifferent: boolean = false;\n  hidePlayerDamageCard: boolean = true;\n  autoCEEffects: string = \"none\";\n  autoCheckHit: string = \"none\";\n  autoCheckSaves: string = \"none\";\n  autoFastForward: string[] = [];\n  autoItemEffects: string = \"off\";\n  autoRemoveSummonedCreature: boolean = false;\n  autoUndoTransformations: boolean = false;\n  autoRemoveTemplate: boolean = true;\n  autoRemoveInstantaneousTemplate: boolean = false;\n  constrainTemplatePlacement: boolean = false;\n  templateSnapping: string = \"full\";\n  autoRollAttack: boolean = false;\n  autoRollDamage: string = \"none\";\n  autoCompleteWorkflow = true;\n  saveDROrder = \"DRSaveDr\";\n  autoTarget: string = \"none\";\n  averageDamage: string = \"none\";\n  checkSaveText: boolean = false;\n  checkTwoHanded: boolean = false;\n  chooseAmmunition: boolean = true;\n  collapsibleTargets: boolean = false;\n  coloredBorders: string = \"none\";\n  concentrationAutomation: boolean = false;\n  confirmAmmunition: boolean = false;\n  gmConfirmAmmunition: boolean = false;\n  consumeResource: string = \"none\";\n  convenientEffectsReaction: string = \"Reaction\";\n  criticalDamage: string = \"default\";\n  criticalDamageGM: string = \"none\";\n  criticalSound: string = \"\";\n  customSoundsPlaylist: string = \"none\";\n  damageImmunities: string = \"none\";\n  damageImmunityMultiplier: number = 0.0;\n  damageResistanceMultiplier: number = 0.5;\n  damageVulnerabilityMultiplier: number = 2;\n  defaultSaveMultiplier: number = 0.5;\n  diceSound: string = \"\";\n  displaySaveAdvantage: boolean = true;\n  doConcentrationCheck: string = \"chat\";\n  griddedGridless: boolean = false;\n  gridlessFudge: number | undefined = 0;\n  doReactions: string = \"all\";\n  enableDDBGL: boolean = false;\n  enforceReactions = \"none\";\n  enforceBonusActions = \"none\";\n  enforceSingleWeaponTarget: boolean = false;\n  fixStickyKeys: boolean = true;\n  fumbleSound: string = \"\";\n  ghostRolls: boolean = false;\n  gmAttackDisplay: string = \"full\";\n  gmDamageDisplay: string = \"full\";\n  gmAttackDsn: string = \"show\";\n  gmDamageDsn: string = \"show\";\n  gmAttackDamageCards: boolean = false;\n  gmAutoAttack: boolean = false;\n  gmAutoDamage: string = \"none\";\n  gmAutoFastForward: string[] = [];\n  gmConsumeResource: string = \"none\";\n  gmDoReactions: string = \"all\";\n  gmHide3dDice: boolean = false;\n  gmRemoveButtons: string = \"all\";\n  preferredGM: string = \"\";\n  hideRollDetails: string = \"none\";\n  ignoreSpellReactionRestriction: boolean = false;\n  itemTypeList: string[] | undefined = undefined;\n  itemUseSound: string = \"\";\n  keepRollStats: boolean = false;\n  keyMapping = defaultKeyMapping;\n  mergeCardCondensed: boolean = false;\n  addSheetButtons: boolean = true;\n  mergeCardMulti: boolean = false;\n  mergeCardMultiDamage: boolean = false;\n  displayProperties: boolean = true;\n  midiPropertiesTabRole: number = CONST.USER_ROLES.PLAYER;\n  confirmAttackDamage: string = \"none\";\n  highlightSuccess: boolean = true;\n  highLightCriticalAttackOnly: boolean = false;\n  markPlayerDefeated: boolean = false;\n  markNonPlayerDefeated: boolean = false;\n  optionalRulesEnabled: boolean = false;\n  paranoidGM: boolean = false;\n  playerRollSaves: string = \"none\";\n  playerSaveTimeout: number = 0;\n  playerStatsOnly: boolean = false;\n  potionUseSound: string = \"\";\n  quickSettings: boolean = true;\n  rangeTarget: string = \"none\";\n  useTemplateRangedTargeting: boolean = false;\n  reactionTimeout: number = 10;\n  recordAOO = \"none\";\n  removeButtons: string = \"all\";\n  removeConcentration: boolean = true;\n  removeConcentrationEffects: string = \"effects\";\n  playerRequireAmmunition: boolean = false;\n  gmRequireAmmunition: boolean = false;\n  requireMagical: string = \"off\";\n  requiresTargets: string = \"none\";\n  rollNPCLinkedSaves: string = \"auto\";\n  rollNPCSaves: string = \"auto\";\n  rollChecksBlind: string[] = [];\n  rollSavesBlind: string[] = [];\n  rollSkillsBlind: string[] = [];\n  savesBeforeDamage: boolean = false;\n  saveStatsEvery: number = 20;\n  showDSN: boolean = true;\n  showFastForward: boolean = false;\n  showItemDetails: string = \"all\";\n  showReactionAttackRoll: string = \"all\";\n  showReactionChatMessage: boolean = false;\n  singleConcentrationRoll: boolean = true;\n  skillAbilityCheckAdvantage: boolean = true;\n  spellHitSound: string = \"\";\n  spellUseSound: string = \"\";\n  spellUseSoundRanged: string = \"\";\n  tempHPDamageConcentrationCheck: boolean = false;\n  concentrationIncapacitatedConditionCheck: boolean = false;\n  toggleOptionalRules: boolean = false;\n  useCustomSounds: boolean = true;\n  usePlayerPortrait: boolean = false;\n  useTokenNames: boolean = false;\n  undoChatColor: string = \"Delete\";\n  undoWorkflow: boolean = false;\n  useDamageDetail: boolean = true;\n  waitForDamageApplication: boolean = true;\n  weaponHitSound: string = \"\";\n  weaponUseSound: string = \"\";\n  weaponUseSoundRanged: string = \"\";\n  rollAlternate: string = \"off\";\n  optionalRules = {\n    actionSpecialDurationImmediate: false,\n    activeDefence: false,\n    activeDefenceModifier: 12,\n    activeDefenceShow: \"selfroll\",\n    ActiveDefenceDC: true,\n    autoRerollInitiative: false,\n    challengeModeArmor: \"none\",\n    checkFlanking: \"off\",\n    flankingBonus: \"advantage\" as string,\n    flankingRequiresVisibility: false,\n    showFlankingHighlight: false,\n    checkRange: \"longFail\",\n    coverCalculation: \"none\",\n    criticalNat20: false,\n    criticalSaves: false,\n    displayBonusRolls: true,\n    distanceIncludesHeight: false,\n    distanceMeasurement: \"center\", // \"center\" = grid square centers, \"perimeter\" = token perimeters\n    DRAllPerDamageDetail: true,\n    hiddenAdvantage: \"none\",\n    incapacitated: \"nothing\",\n    invisAdvantage: \"RAW2024\",\n    invisVision: false,\n    maxDRValue: false,\n    nearbyAllyRanged: 0,\n    nearbyFoe: 5,\n    optionalCritRule: -1,\n    removeHiddenInvis: true,\n    vitalityItem: \"\", // Item name for vitality pool feature\n    vitalityDeadCondition: \"dead\", // Condition to apply when vitality reaches 0\n    vitalityDeathRequires: \"vitalityOnly\", // \"vitalityOnly\" = dead when vitality=0, \"vitalityAndHP\" = dead when vitality=0 AND HP=0\n    wallsBlockRange: \"center\",\n  };\n}\n\nexport let configSettings = new ConfigSettings();\n\nexport function checkMechanic(mechanic: keyof (typeof configSettings.optionalRules)) {\n  if (configSettings.toggleOptionalRules) return false;\n  return configSettings.optionalRules[mechanic];\n}\n\nexport function checkRule(rule: keyof (typeof configSettings.optionalRules)) {\n  let rulesEnabled = configSettings.optionalRulesEnabled;\n  if (game.user?.isGM)\n    rulesEnabled = rulesEnabled ? !configSettings.toggleOptionalRules : configSettings.toggleOptionalRules;\n  return rulesEnabled && configSettings.optionalRules[rule];\n}\n\n/**\n * Reset all midi-qol settings to their default values.\n * This resets ConfigSettings, all game.settings (except tracking/stats settings),\n * and ensures EnableWorkflow is set to true.\n * @returns Promise that resolves when settings have been saved\n */\nexport async function resetConfigSettingsToDefaults(): Promise<void> {\n  // Reset ConfigSettings to defaults\n  const defaultSettings = new ConfigSettings();\n  await game.settings.set(\"midi-qol\", \"ConfigSettings\", defaultSettings);\n  configSettings = defaultSettings;\n\n  // Reset world-scoped game.settings to defaults\n  // Note: EnableWorkflow is explicitly set to true as requested\n  await game.settings.set(\"midi-qol\", \"EnableWorkflow\", true);\n  // PreferredGM is intentionally not reset - user preference\n  await game.settings.set(\"midi-qol\", \"ReplaceDefaultActivities\", true);\n  await game.settings.set(\"midi-qol\", \"showGM\", false);\n  await game.settings.set(\"midi-qol\", \"ForceHideRoll\", true);\n  await game.settings.set(\"midi-qol\", \"DragDropTarget\", false);\n  // RollStats is intentionally not reset - statistics data\n  // CriticalDamage/CriticalDamageGM/ColoredBorders are now in configSettings (reset above via defaultSettings)\n  await game.settings.set(\"midi-qol\", \"AutoRemoveTargets\", \"dead\");\n  await game.settings.set(\"midi-qol\", \"TargetConfirmation\", defaultTargetConfirmationSettings);\n  await game.settings.set(\"midi-qol\", \"playerControlsInvisibleTokens\", false);\n  await game.settings.set(\"midi-qol\", \"pruneChatLog\", true);\n  await game.settings.set(\"midi-qol\", \"DebounceInterval\", 0);\n  await game.settings.set(\"midi-qol\", \"Debug\", \"None\");\n  await game.settings.set(\"midi-qol\", \"SaveToChatCard\", false);\n  await game.settings.set(\"midi-qol\", \"UseWeakReferences\", false);\n  await game.settings.set(\"midi-qol\", \"splashWarnings\", true);\n  // notificationVersion, last-run-version, instanceId are intentionally not reset - tracking data\n  // MidiSoundSettings is intentionally not reset - separate configuration\n\n  Hooks.callAll(\"midi-qol.ConfigSettingsChanged\");\n  ui.notifications?.info(\"midi-qol | Settings reset to defaults\");\n}\n\nexport const checkedModuleList = [\n  \"about-time\",\n  \"ActiveAuras\",\n  \"auraeffects\",\n  \"autoanimations\",\n  \"anonymous\",\n  \"babonus\",\n  \"chris-premades\",\n  \"condition-lab-triggler\",\n  \"dae\",\n  \"ddb-importer\",\n  \"ddb-game-log\",\n  \"dice-so-nice\",\n  \"effectmacro\",\n  \"gambits-premades\",\n  \"itemacro\",\n  /levels/,\n  \"lib-wrapper\",\n  \"midi-item-showcase-community\",\n  \"multilevel-tokens\",\n  \"ready-set-roll-5e\",\n  \"sequencer\",\n  \"simbuls-cover-calculator\",\n  \"socketlib\",\n  \"times-up\",\n  \"tokenmagic\",\n  \"vision-5e\",\n  \"walledtemplates\",\n  \"warpgate\",\n  \"wjmaia\",\n]\n\nexport const CheckedAuthorsList = [\n  \"hell\",\n  \"dfreds\",\n  \"theripper93\",\n  \"ironmonk\"\n]\n\nexport function collectSettingData() {\n  // Create a copy of configSettings without deprecated properties\n  const cleanConfigSettings = { ...configSettings };\n  // Remove deprecated properties that have been migrated\n  //@ts-expect-error deprecated property\n  delete cleanConfigSettings.displaySaveDC;\n\n  let data = {\n    configSettings: cleanConfigSettings,\n    midiSoundSettings,\n    itemRollButtons,\n    autoRemoveTargets,\n    coloredBorders,\n    criticalDamage,\n    criticalDamageGM,\n    debounceInterval,\n    dragDropTargeting,\n    enableWorkflow,\n    forceHideRoll,\n    nsaFlag,\n    saveToChatCard,\n    playerControlsInvisibleTokens,\n    pruneChatLog,\n    replaceDefaultActivities,\n    targetConfirmation,\n    useWeakReferences,\n    flags: {}\n  };\n  data.flags[\"exportSource\"] = {\n    system: game.system?.id,\n    coreVersion: game.version ?? game.version,\n    systemVersion: game.system.version,\n    midiVersion: game.modules.get(\"midi-qol\")?.version,\n  };\n  return data;\n}\nexport function collectModuleData(): Record<string, any> {\n  const modules: Record<string, any> = {};\n  for (const moduleData of game.modules ?? []) {\n    const mod: any = moduleData;\n    if (!mod.active && !checkedModuleList.includes(mod.id)) continue;\n    let idToUse = mod.id;\n    let titleToUse = mod.title;\n    if (idToUse.match(/plutonium/i) || titleToUse.match(/plutonium/i)) {\n      idToUse = idToUse.replace(/plutonium/i, \"xxxxxxxxx\");\n      titleToUse = titleToUse.replace(/plutonium/i, \"xxxxxxxxx\");\n    }\n    modules[idToUse] = {\n      title: titleToUse,\n      active: mod.active,\n      installed: true,\n      version: mod.version,\n      compatibility: mod.compatibility?.verified\n    };\n  }\n  return modules;\n}\n\nexport function exportSettingsToJSON() {\n  const data = collectSettingData();\n  (data as any).modules = collectModuleData();\n  const filename = `fvtt-midi-qol-settings.json`;\n  foundry.utils.saveDataToFile(JSON.stringify(data, null, 2), \"text/json\", filename);\n}\n\nfunction removeOldValues(theObject: any) {\n  if (theObject == null || typeof theObject !== \"object\") return theObject;\n  Object.keys(theObject).forEach(key => {\n    if (theObject[key]?.newValue !== undefined) {\n      theObject[key] = theObject[key].newValue;\n    }\n  });\n  return theObject;\n}\n\n/**\n/**\n * Migrate hideRollDetails + ghostRolls + gmHide3dDice → granular GM display settings.\n * Modifies the configSettings object in place. Only runs if gmAttackDisplay is undefined.\n */\nfunction migrateGmRollHiding(cs: any) {\n  if (cs.gmAttackDisplay !== undefined) return;\n  const old = cs.hideRollDetails ?? \"none\";\n  const ghost = cs.ghostRolls ?? false;\n  const migrationMap: Record<string, { attack: string; damage: string; attackDsn: string; damageDsn: string }> = {\n    \"none\":             { attack: \"full\",       damage: \"full\",      attackDsn: \"show\", damageDsn: \"show\" },\n    \"detailsDSN\":       { attack: \"hideFormula\", damage: \"full\",     attackDsn: \"show\", damageDsn: \"show\" },\n    \"details\":          { attack: \"hideFormula\", damage: \"full\",     attackDsn: \"none\", damageDsn: \"none\" },\n    \"d20Only\":          { attack: \"d20Only\",    damage: \"totalOnly\", attackDsn: \"show\", damageDsn: \"none\" },\n    \"d20DamageDSN\":     { attack: \"d20Only\",    damage: \"totalOnly\", attackDsn: \"show\", damageDsn: \"show\" },\n    \"hitDamage\":        { attack: \"hitMiss\",    damage: \"totalOnly\", attackDsn: \"none\", damageDsn: \"none\" },\n    \"hitCriticalDamage\": { attack: \"hitMissCrit\", damage: \"totalOnly\", attackDsn: \"none\", damageDsn: \"none\" },\n    \"attackTotalOnly\":  { attack: \"attackTotal\", damage: \"totalOnly\", attackDsn: \"none\", damageDsn: \"none\" },\n    \"d20AttackOnly\":    { attack: \"d20Only\",    damage: \"hidden\",    attackDsn: \"show\", damageDsn: \"none\" },\n    \"all\":              { attack: \"hidden\",     damage: \"hidden\",    attackDsn: \"none\", damageDsn: \"none\" },\n  };\n  const mapped = migrationMap[old] ?? migrationMap[\"none\"];\n  cs.gmAttackDisplay = mapped.attack;\n  cs.gmDamageDisplay = mapped.damage;\n  cs.gmAttackDsn = ghost ? \"ghost\" : mapped.attackDsn;\n  cs.gmDamageDsn = ghost ? \"ghost\" : mapped.damageDsn;\n  delete cs.hideRollDetails;\n  delete cs.ghostRolls;\n  delete cs.gmHide3dDice;\n}\n\n/**\n * Migrates the deprecated displaySaveDC setting to dnd5e challengeVisibility.\n * Modifies the configSettings object in place, removing the deprecated field.\n * @param configSettingsToMigrate - The configSettings object to migrate (will be modified)\n * @param source - The source of the migration: \"startup\" for world load, \"import\" for settings import\n */\nasync function migrateDisplaySaveDC(configSettingsToMigrate: any, source: \"startup\" | \"import\" = \"startup\") {\n  const oldMidiDisplaySaveDC = configSettingsToMigrate.displaySaveDC;\n  const currentDnd5eVisibility = safeGetGameSetting(\"dnd5e\", \"challengeVisibility\") as string;\n\n  // Determine most restrictive: if midi was false (hide DC) OR dnd5e is \"none\", result is \"none\"\n  let newVisibility = currentDnd5eVisibility;\n  if (oldMidiDisplaySaveDC === false || currentDnd5eVisibility === \"none\") {\n    newVisibility = \"none\";\n  }\n\n  // Check if we need to change the dnd5e setting\n  const needsChange = newVisibility !== currentDnd5eVisibility;\n\n  // Apply the change if needed\n  if (needsChange) {\n    await game.settings.set(\"dnd5e\", \"challengeVisibility\", newVisibility);\n  }\n\n  // Remove the deprecated field\n  delete configSettingsToMigrate.displaySaveDC;\n\n  // Show migration chat message if GM\n  if (game.user === game.users?.activeGM) {\n    const sourceText = source === \"import\"\n      ? \"The imported settings contained\"\n      : \"Your midi-qol settings contained\";\n\n    let messageContent = `<h3>Midi-QOL Settings Migration</h3>`;\n    messageContent += `<p>${sourceText} the deprecated <strong>Display Saving Throw DC</strong> setting. It has been migrated to use the dnd5e <strong>Challenge Visibility</strong> setting.</p>`;\n    messageContent += `<ul>`;\n    messageContent += `<li>Old displaySaveDC: <strong>${oldMidiDisplaySaveDC ? \"Show DC\" : \"Hide DC\"}</strong></li>`;\n    messageContent += `<li>Previous dnd5e challengeVisibility: <strong>${currentDnd5eVisibility}</strong></li>`;\n    if (needsChange) {\n      messageContent += `<li>Updated dnd5e challengeVisibility to: <strong>${newVisibility}</strong> (most restrictive)</li>`;\n    } else {\n      messageContent += `<li>dnd5e challengeVisibility unchanged: <strong>${newVisibility}</strong></li>`;\n    }\n    messageContent += `</ul>`;\n    messageContent += `<p><em>You can control this setting from the dnd5e settings or from the midi-qol config panel under Workflow → Saves.</em></p>`;\n\n    ChatMessage.create({\n      content: messageContent,\n      whisper: ChatMessage.getWhisperRecipients(\"GM\"),\n      speaker: { alias: \"Midi-QOL\" }\n    });\n  }\n}\n\nexport async function importSettingsFromJSON(json) {\n  let requiresReload = false;\n  if (typeof json === \"string\")\n    json = JSON.parse(json);\n\n  // Extract modules data before unwrapping TroubleShooter format\n  let savedModules = json.modules;  // Regular export or TroubleShooter top-level\n  if (json.midiSettings) {\n    // TroubleShooter format — prefer top-level modules (has settings/incompatible augmentation)\n    // but fall back to midiSettings.modules for newer regular exports\n    savedModules = savedModules ?? json.midiSettings.modules;\n    json = json.midiSettings;  // existing unwrap\n  }\n  // Also check unwrapped json.modules for regular settings exports\n  savedModules = savedModules ?? json.modules;\n\n  // Handle migration of deprecated displaySaveDC field\n  const importedConfigSettings = removeOldValues(json.configSettings);\n  if (importedConfigSettings.displaySaveDC !== undefined) {\n    await migrateDisplaySaveDC(importedConfigSettings, \"import\");\n  }\n  // Migrate old hideRollDetails → granular GM display settings on import\n  migrateGmRollHiding(importedConfigSettings);\n\n  await game.settings.set(\"midi-qol\", \"ConfigSettings\", importedConfigSettings);\n  await game.settings.set(\"midi-qol\", \"MidiSoundSettings\", removeOldValues(json.midiSoundSettings) ?? {});\n  await game.settings.set(\"midi-qol\", \"TargetConfirmation\", removeOldValues(json.targetConfirmation));\n\n  // await game.settings.set(\"midi-qol\", \"AddChatDamageButtons\", removeOldValues(json.addChatDamageButtons));\n  // await game.settings.set(\"midi-qol\", \"ItemRollButtons\", removeOldValues(json.itemRollButtons));\n  // Migrate imported old fast-forward settings into new array format\n  if (json.autoFastForwardAbilityRolls) {\n    const cs = importedConfigSettings;\n    if (!Array.isArray(cs.autoFastForward)) cs.autoFastForward = [];\n    if (!Array.isArray(cs.gmAutoFastForward)) cs.gmAutoFastForward = [];\n    for (const rollType of [\"check\", \"save\", \"skill\", \"tool\"]) {\n      if (!cs.autoFastForward.includes(rollType)) cs.autoFastForward.push(rollType);\n      if (!cs.gmAutoFastForward.includes(rollType)) cs.gmAutoFastForward.push(rollType);\n    }\n    await game.settings.set(\"midi-qol\", \"ConfigSettings\", cs);\n  }\n  await game.settings.set(\"midi-qol\", \"AutoRemoveTargets\", removeOldValues(json.autoRemoveTargets));\n  // Migrate old top-level coloredBorders into configSettings for backward-compatible imports\n  if (json.coloredBorders !== undefined && !importedConfigSettings.coloredBorders) {\n    let cb = removeOldValues(json.coloredBorders);\n    if (cb === \"None\") cb = \"none\"; // Normalize old default\n    importedConfigSettings.coloredBorders = cb;\n    await game.settings.set(\"midi-qol\", \"ConfigSettings\", importedConfigSettings);\n  }\n  // Migrate old top-level criticalDamage/criticalDamageGM into configSettings for backward-compatible imports\n  if (json.criticalDamage !== undefined && !importedConfigSettings.criticalDamage) {\n    importedConfigSettings.criticalDamage = removeOldValues(json.criticalDamage);\n    if (importedConfigSettings.criticalDamage === \"none\") importedConfigSettings.criticalDamage = \"default\";\n  }\n  if (json.criticalDamageGM !== undefined && !importedConfigSettings.criticalDamageGM) {\n    importedConfigSettings.criticalDamageGM = removeOldValues(json.criticalDamageGM);\n    if (importedConfigSettings.criticalDamageGM === \"none\") importedConfigSettings.criticalDamageGM = importedConfigSettings.criticalDamage ?? \"default\";\n  }\n  if (json.criticalDamage !== undefined || json.criticalDamageGM !== undefined) {\n    await game.settings.set(\"midi-qol\", \"ConfigSettings\", importedConfigSettings);\n  }\n  await game.settings.set(\"midi-qol\", \"DebounceInterval\", removeOldValues(json.debounceInterval));\n  await game.settings.set(\"midi-qol\", \"DragDropTarget\", removeOldValues(json.dragDropTargeting));\n  await game.settings.set(\"midi-qol\", \"EnableWorkflow\", removeOldValues(json.enableWorkflow));\n  if (json.forceHideRoll !== undefined) {\n    if (game.settings.get(\"midi-qol\", \"ForceHideRoll\") !== json.forceHideRoll) requiresReload = true;\n    await game.settings.set(\"midi-qol\", \"ForceHideRoll\", removeOldValues(json.forceHideRoll));\n  }\n  if (json.replaceDefaultActivities !== undefined) {\n    if (game.settings.get(\"midi-qol\", \"ReplaceDefaultActivities\") !== json.replaceDefaultActivities) requiresReload = true;\n    await game.settings.set(\"midi-qol\", \"ReplaceDefaultActivities\", removeOldValues(json.replaceDefaultActivities));\n  }\n  await game.settings.set(\"midi-qol\", \"SaveToChatCard\", removeOldValues(json.saveToChatCard));\n  await game.settings.set(\"midi-qol\", \"showGM\", removeOldValues(json.nsaFlag));\n  await game.settings.set(\"midi-qol\", \"UseWeakReferences\", removeOldValues(json.useWeakReferences));\n  if (json.playerControlsInvisibleTokens !== undefined) {\n    if (game.settings.get(\"midi-qol\", \"playerControlsInvisibleTokens\") !== json.playerControlsInvisibleTokens) requiresReload = true;\n    await game.settings.set(\"midi-qol\", \"playerControlsInvisibleTokens\", json.playerControlsInvisibleTokens);\n  }\n  if (json.pruneChatLog !== undefined) {\n    if (game.settings.get(\"midi-qol\", \"pruneChatLog\") !== json.pruneChatLog) requiresReload = true;\n    await game.settings.set(\"midi-qol\", \"pruneChatLog\", json.pruneChatLog);\n  }\n\n  const settingsAppId = game.settings.sheet?.id;\n  if (settingsAppId) foundry.applications.instances.get(settingsAppId)?.render(true);\n  const exportSource = json.flags?.exportSource;\n  ui.notifications?.notify(`Importing settings from foundry version ${exportSource?.coreVersion} dnd ${exportSource?.systemVersion} midi ${exportSource?.midiVersion}`);\n\n  // Show module review dialog if saved modules include modules not active or with lower installed versions\n  if (savedModules && Object.keys(savedModules).length > 0) {\n    const activeModules = Object.fromEntries(\n      Object.entries(savedModules).filter(([_, mod]: [string, any]) => mod.active)\n    );\n    const hasMismatch = Object.entries(activeModules).some(([id, mod]: [string, any]) => {\n      const current = game.modules.get(id);\n      if (!current?.active) return true;\n      // Check if installed version is lower than saved version\n      if (current.version && mod.version && foundry.utils.isNewerVersion(mod.version, current.version)) return true;\n      return false;\n    });\n    if (hasMismatch) {\n      new ModuleReviewDialog(activeModules).render(true);\n    }\n  }\n\n  if (requiresReload) {\n  //@ts-expect-error\n    foundry.applications.settings.SettingsConfig.reloadConfirm({ world: true });\n  }\n}\nexport let fetchSoundSettings = () => {\n  midiSoundSettings = game.settings.get(\"midi-qol\", \"MidiSoundSettings\") ?? {};\n  if (midiSoundSettings.version === undefined) {\n    midiSoundSettingsBackup = foundry.utils.duplicate(midiSoundSettings);\n    midiSoundSettings = { \"any\": midiSoundSettings };\n    midiSoundSettings.version = \"0.9.48\";\n  }\n}\n\nexport let fetchParams = () => {\n  if (debugEnabled > 1) debug(\"Fetch Params Loading\");\n  const blfxActive = game.modules.get(\"boss-loot-assets-premium\")?.active || game.modules.get(\"boss-loot-assets-free\")?.active;\n\n  configSettings = game.settings.get(\"midi-qol\", \"ConfigSettings\");\n  if (configSettings.saveDROrder === undefined) configSettings.saveDROrder = \"DRSaveDr\";\n  if (![\"DRSaveDr\", \"SaveDRDr\", \"SaveDrDR\"].includes(configSettings.saveDROrder)) {\n    ui.notifications?.warn(\"invalidSaveDROrder reset to 'dm.midi/dnd5e.dm -> Saves/(dr/dv/di) - dnd5e RAW'\");\n    configSettings.saveDROrder = \"DRSaveDr\";\n  }\n  if (!configSettings.fumbleSound) configSettings.fumbleSound = CONFIG.sounds[\"dice\"];\n  if (!configSettings.criticalSound) configSettings.criticalSound = CONFIG.sounds[\"dice\"];\n  if (!configSettings.diceSound) configSettings.diceSound = CONFIG.sounds[\"dice\"];\n  if (!configSettings.doReactions) configSettings.doReactions = \"none\";\n  if (!configSettings.gmDoReactions) configSettings.gmDoReactions = \"none\";\n  if (configSettings.reactionTimeout === undefined) configSettings.reactionTimeout = 0;\n  if (configSettings.convenientEffectsReaction === undefined) configSettings.convenientEffectsReaction = \"Reaction\"; //TODO come back when it is configurable in midi and set it to \"\"\n  if (typeof configSettings.rangeTarget !== \"string\") configSettings.rangeTarget = \"none\";\n  if (configSettings.showReactionAttackRoll === undefined) configSettings.showReactionAttackRoll = \"all\";\n  //@ts-expect-error type mismatch - this is for legacy true setting\n  if (configSettings.rollChecksBlind === true) configSettings.rollChecksBlind = [\"all\"];\n  if (!configSettings.rollChecksBlind) configSettings.rollChecksBlind = [];\n  configSettings.rollChecksBlind = configSettings.rollChecksBlind.filter((item) => item !== \"none\");\n  //@ts-expect-error type mismatch - this is for legacy true setting\n  if (configSettings.rollSavesBlind === true) configSettings.rollSavesBlind = [\"all\"];\n  if (!configSettings.rollSavesBlind) configSettings.rollSavesBlind = [];\n  configSettings.rollSavesBlind = configSettings.rollSavesBlind.filter((item) => item !== \"none\");\n  //@ts-expect-error type mismatch - this is for legacy true setting\n  if (configSettings.rollSkillsBlind === true) configSettings.rollSkillsBlind = [\"all\"];\n  if (!configSettings.rollSkillsBlind) configSettings.rollSkillsBlind = [];\n  configSettings.rollSkillsBlind = configSettings.rollSkillsBlind.filter((item) => item !== \"none\");\n  migrateGmRollHiding(configSettings);\n  if (configSettings.addFakeDice === undefined) configSettings.addFakeDice = false;\n  if (typeof configSettings.gmConsumeResource !== \"string\") configSettings.gmConsumeResource = \"none\";\n  if (typeof configSettings.consumeResource !== \"string\") configSettings.consumeResource = \"none\";\n  if (!configSettings.enableDDBGL) configSettings.enableDDBGL = false;\n  if (!configSettings.showReactionChatMessage) configSettings.showReactionChatMessage = false;\n  if (configSettings.fixStickyKeys === undefined) configSettings.fixStickyKeys = true;\n  //@ts-expect-error legacy boolean value\n  if (configSettings.autoCEEffects === true) configSettings.autoCEEffects = \"both\";\n  if (!configSettings.autoCEEffects) configSettings.autoCEEffects = \"none\";\n  configSettings.toggleOptionalRules = false;\n  if (configSettings.displaySaveAdvantage === undefined) configSettings.displaySaveAdvantage = true;\n  if (!configSettings.recordAOO) configSettings.recordAOO = \"none\";\n  if (!configSettings.enforceReactions) configSettings.enforceReactions = \"none\";\n  if (!configSettings.enforceBonusActions) configSettings.enforceBonusActions = \"none\";\n  //@ts-expect-error legacy boolean value\n  if (configSettings.autoItemEffects === false) configSettings.autoItemEffects = \"off\";\n  if (configSettings.playerDamageCard === undefined) configSettings.playerDamageCard = \"none\";\n  if (configSettings.playerCardDamageDifferent === undefined) configSettings.playerCardDamageDifferent = true;\n  if (configSettings.rollAlternate === undefined) configSettings.rollAlternate = \"off\";\n  //@ts-expect-error legacy boolean value\n  if (configSettings.rollAlternate === false) configSettings.rollAlternate = \"off\";\n  //@ts-expect-error legacy boolean value\n  if (configSettings.rollAlternate === true) configSettings.rollAlternate = \"formula\";\n  if (configSettings.allowActorUseMacro === undefined) configSettings.allowActorUseMacro = configSettings.allowUseMacro;\n  if (configSettings.skillAbilityCheckAdvantage === undefined) configSettings.skillAbilityCheckAdvantage = true;\n  if (!configSettings.keyMapping\n    || !configSettings.keyMapping[\"DND5E.Advantage\"]\n    || !configSettings.keyMapping[\"DND5E.Disadvantage\"]\n    || !configSettings.keyMapping[\"DND5E.Critical\"]) {\n    configSettings.keyMapping = defaultKeyMapping;\n  }\n\n  // MidiSounds.setupBasicSounds();\n  // migrateExistingSounds();\n\n  if (configSettings.addWounded === undefined) configSettings.addWounded = 0;\n  if (configSettings.addWounded > 0 && configSettings.addWoundedStyle === undefined)\n    configSettings.addWoundedStyle = \"normal\";\n  if (!configSettings.addDead) configSettings.addDead = \"none\";\n  if (typeof configSettings.addDead === \"boolean\" && configSettings.addDead) configSettings.addDead = \"overlay\"\n  if (configSettings.paranoidGM === undefined) configSettings.paranoidGM = false;\n  if (typeof configSettings.requiresTargets !== \"string\") configSettings.requiresTargets = \"none\";\n  if (configSettings.tempHPDamageConcentrationCheck === undefined) configSettings.tempHPDamageConcentrationCheck = false;\n  if (configSettings.showDSN === undefined) configSettings.showDSN = true;\n  if (configSettings.showFastForward === undefined) configSettings.showFastForward = true;\n  if (configSettings.highlightSuccess === undefined) configSettings.highlightSuccess = true;\n  if (configSettings.highLightCriticalAttackOnly === undefined) configSettings.highLightCriticalAttackOnly = false;\n  configSettings.optionalRules = foundry.utils.mergeObject({ // eventually split this into mechanics and rules\n    actionSpecialDurationImmediate: false,\n    activeDefence: false,\n    activeDefenceModifier: 12, // default value for active defence modifier\n    activeDefenceShow: \"selfroll\",\n    ActiveDefenceDC: true,\n    challengeModeArmor: \"none\",\n    challengeModeArmorScale: false,\n    checkFlanking: \"off\",\n    flankingBonus: \"advantage\",\n    flankingRequiresVisibility: false,\n    checkRange: \"longfail\",\n    coverCalculation: \"none\",\n    displayBonusRolls: true,\n    criticalNat20: false,\n    criticalSaves: false,\n    distanceIncludesHeight: false,\n    distanceMeasurement: \"center\",\n    incapacitated: \"nothing\",\n    invisAdvantage: \"RAW2024\",\n    hiddenAdvantage: \"none\",\n    maxDRValue: false,\n    DRAllPerDamageDetail: true,\n    nearbyAllyRanged: 0,\n    nearbyFoe: 5,\n    optionalCritRule: -1,\n    removeHiddenInvis: true,\n    wallsBlockRange: \"center\",\n    mergeCardMulti: false,\n    mergeCardMultiDamage: false,\n    displayProperties: true,\n  }, configSettings.optionalRules ?? {}, { overwrite: true, insertKeys: true, insertValues: true });\n  if (!configSettings.optionalRules.incapacitated) configSettings.optionalRules.incapacitated = \"nothing\";\n  if (!configSettings.optionalRules.wallsBlockRange) configSettings.optionalRules.wallsBlockRange = \"center\";\n  //@ts-expect-error legacy boolean value\n  if (configSettings.optionalRules.checkFlanking === true) configSettings.optionalRules.checkFlanking = \"ceadv\";\n  if (!configSettings.optionalRules.coverCalculation) configSettings.optionalRules.coverCalculation = \"none\";\n  if (configSettings.optionalRules.displayBonusRolls === undefined) configSettings.optionalRules.displayBonusRolls = true;\n  if (!configSettings.optionalRules.vitalityDeadCondition) configSettings.optionalRules.vitalityDeadCondition = \"dead\";\n  if (!configSettings.optionalRules.vitalityDeathRequires) configSettings.optionalRules.vitalityDeathRequires = \"vitalityOnly\";\n\n  //@ts-expect-error legacy boolean value\n  if (configSettings.optionalRules.checkFlanking === false) configSettings.optionalRules.checkFlanking = \"off\";\n  //@ts-expect-error legacy boolean value\n  if (configSettings.optionalRules.checkRange === true) configSettings.optionalRules.checkRange = \"longfail\";\n  if (!configSettings.optionalRules.checkRange) configSettings.optionalRules.checkRange = \"none\";\n  if (!configSettings.optionalRules.invisAdvantage) configSettings.optionalRules.invisAdvantage = \"none\";\n  //@ts-expect-error legacy boolean value\n  if (configSettings.optionalRules.invisAdvantage === true) configSettings.optionalRules.invisAdvantage = \"RAW2014\";\n  // Migrate old \"RAW\" to \"RAW2014\"\n  if (configSettings.optionalRules.invisAdvantage === \"RAW\") configSettings.optionalRules.invisAdvantage = \"RAW2014\";\n  if (!configSettings.optionalRules.hiddenAdvantage) configSettings.optionalRules.hiddenAdvantage = \"none\";\n  //@ts-expect-error legacy nonexistent value\n  if (configSettings.optionalRules.activeDefenceShowGM === true) {\n    // old setting replaced with new\n    configSettings.optionalRules.activeDefenceShow = \"gmroll\";\n    //@ts-expect-error legacy nonexistent value\n    delete configSettings.optionalRules.activeDefenceShowGM;\n  }\n  if (typeof configSettings.confirmAttackDamage !== \"string\") configSettings.confirmAttackDamage = \"none\";\n  if (typeof configSettings.requireMagical !== \"string\" && configSettings.requireMagical !== true) configSettings.requireMagical = \"off\";\n  if (typeof configSettings.requireMagical !== \"string\" && configSettings.requireMagical === true) configSettings.requireMagical = \"nonspell\";\n\n  if (typeof configSettings.optionalRules.nearbyFoe !== \"number\") {\n    if (configSettings.optionalRulesEnabled)\n      configSettings.optionalRules.nearbyFoe = 5;\n    else\n      configSettings.optionalRules.nearbyFoe = 0;\n  }\n  const itemList = Object.keys(CONFIG.Item.typeLabels);\n  if (!configSettings.itemTypeList && itemList.length > 0) {\n    configSettings.itemTypeList = itemList;\n    configSettings.itemTypeList.filter((type) => ![\"base\", \"backpack\"].includes(type));\n  }\n  if (configSettings.itemTypeList === undefined) configSettings.itemTypeList = Object.keys(CONFIG.Item.typeLabels);\n  if (configSettings.defaultSaveMultiplier === undefined) configSettings.defaultSaveMultiplier = 0.5;\n  if (configSettings.ignoreSpellReactionRestriction === undefined) configSettings.ignoreSpellReactionRestriction = false;\n  if (configSettings.damageImmunityMultiplier === undefined) configSettings.damageImmunityMultiplier = 0.0;\n  if (configSettings.damageResistanceMultiplier === undefined) configSettings.damageResistanceMultiplier = 0.5;\n  if (configSettings.damageVulnerabilityMultiplier === undefined) configSettings.damageVulnerabilityMultiplier = 2;\n  if (configSettings.hidePlayerDamageCard === undefined) configSettings.hidePlayerDamageCard = true;\n  if (configSettings.attackPerTarget === undefined) configSettings.attackPerTarget = false;\n  if (configSettings.autoRemoveTemplate === undefined) configSettings.autoRemoveTemplate = true;\n  if (configSettings.autoRemoveInstantaneousTemplate === undefined) configSettings.autoRemoveInstantaneousTemplate = false;\n  if (configSettings.removeConcentrationEffects === undefined) configSettings.removeConcentrationEffects = \"effects\";\n  if (configSettings.doConcentrationCheck === undefined) configSettings.doConcentrationCheck = configSettings.removeConcentration ? \"chat\" : \"none\";\n  if (configSettings.undoWorkflow === undefined) configSettings.undoWorkflow = false;\n  if (configSettings.undoChatColor === undefined) configSettings.undoChatColor = \"Delete\";\n  if (configSettings.enforceSingleWeaponTarget == undefined) configSettings.enforceSingleWeaponTarget = false;\n  if (configSettings.confirmAmmunition === undefined) configSettings.confirmAmmunition = false;\n  if (configSettings.gmConfirmAmmunition === undefined) configSettings.gmConfirmAmmunition = false;\n  if (configSettings.playerRollSaves === \"noneDialog\") configSettings.playerRollSaves = \"noneDialogPrivate\";\n  configSettings.hidePlayerDamageCard = true;\n  configSettings.quickSettings = true;\n  //@ts-expect-error have removed the definition\n  if (configSettings.averageNPCDamage !== undefined) {\n    //@ts-expect-error delete the obsolete setting;\n    delete configSettings.averageNPCDamage;\n  }\n  if (configSettings.averageDamage === undefined) configSettings.averageDamage = \"none\";\n  enableWorkflow = game.settings.get(\"midi-qol\", \"EnableWorkflow\");\n  //@ts-expect-error legacy boolean value\n  if (configSettings.optionalRules.challengeModeArmor === true) { // old settings\n    //@ts-expect-error legacy value\n    if (configSettings.optionalRules.challengeModeArmorScale)\n      configSettings.optionalRules.challengeModeArmor = \"scale\";\n    else\n      configSettings.optionalRules.challengeModeArmor = \"challenge\";\n  //@ts-expect-error legacy boolean value\n  } else if ([false, undefined].includes(configSettings.optionalRules.challengeModeArmor)) {\n    configSettings.optionalRules.challengeModeArmor = \"none\"\n  }\n\n  if (configSettings.midiWoundedCondition === undefined) {\n    configSettings.midiWoundedCondition = \"none\";\n    configSettings.addWoundedStyle = \"none\";\n  }\n  if (configSettings.midiDeadCondition === undefined) configSettings.midiDeadCondition = \"none\";\n  if (configSettings.midiUnconsciousCondition === undefined) configSettings.midiUnconsciousCondition = \"none\";\n  // Fix for typo in en.json\n  // should those be deleted entirely?\n  if (configSettings.autoTarget === \"wallsBlockIgnoreIncapcitated\") configSettings.autoTarget = \"wallsBlockIgnoreIncapacitated\";\n  if (configSettings.autoTarget === \"wallsBlockIgnoreIncapacitated\") configSettings.autoTarget = \"wallsBlockIgnoreIncapacitated\";\n  if (configSettings.autoTarget === \"alwaysIgnoreIncapcitated\") configSettings.autoTarget = \"alwaysIgnoreIncapacitated\";\n  configSettings.useDamageDetail = true;\n  if (configSettings.collapsibleTargets === undefined) configSettings.collapsibleTargets = true;\n  if (configSettings.displayProperties === undefined) configSettings.displayProperties = true;\n  criticalDamage = configSettings.criticalDamage ?? \"default\";\n  criticalDamageGM = configSettings.criticalDamageGM ?? criticalDamage;\n  nsaFlag = game.settings.get(\"midi-qol\", \"showGM\");\n  coloredBorders = configSettings.coloredBorders ?? \"none\";\n  itemRollButtons = false; // game.settings.get(\"midi-qol\", \"ItemRollButtons\");\n  if (configSettings.addChatDamageButtons === undefined) configSettings.addChatDamageButtons = \"none\";\n\n  // Migrate old fast-forward settings to new granular arrays\n  if (!fastForwardMigrationDone) {\n    let needsFastForwardMigration = false;\n    const oldFastForwardPlayer = typeof configSettings.autoFastForward === \"string\" ? configSettings.autoFastForward : undefined;\n    //@ts-expect-error checking for old boolean format\n    const oldGmFfAttack: boolean | undefined = typeof configSettings.gmAutoFastForwardAttack === \"boolean\" ? configSettings.gmAutoFastForwardAttack : undefined;\n    //@ts-expect-error checking for old boolean format\n    const oldGmFfDamage: boolean | undefined = typeof configSettings.gmAutoFastForwardDamage === \"boolean\" ? configSettings.gmAutoFastForwardDamage : undefined;\n    let oldAbilityRolls: boolean | undefined;\n\n    if (typeof configSettings.autoFastForward === \"string\") {\n      const oldValue = configSettings.autoFastForward as unknown as string;\n      const newValue: string[] = [];\n      if (oldValue === \"attack\" || oldValue === \"all\") newValue.push(\"attack\");\n      if (oldValue === \"damage\" || oldValue === \"all\") newValue.push(\"damage\");\n      configSettings.autoFastForward = newValue;\n      needsFastForwardMigration = true;\n    }\n    if (oldGmFfAttack !== undefined || oldGmFfDamage !== undefined) {\n      const newGmValue: string[] = [];\n      if (oldGmFfAttack) newGmValue.push(\"attack\");\n      if (oldGmFfDamage) newGmValue.push(\"damage\");\n      configSettings.gmAutoFastForward = newGmValue;\n      //@ts-expect-error cleanup old properties\n      delete configSettings.gmAutoFastForwardAttack;\n      //@ts-expect-error cleanup old properties\n      delete configSettings.gmAutoFastForwardDamage;\n      needsFastForwardMigration = true;\n    }\n    // Migrate standalone AutoFastForwardAbilityRolls setting into the arrays\n    try {\n      oldAbilityRolls = game.settings.get(\"midi-qol\", \"AutoFastForwardAbilityRolls\") as boolean;\n      if (oldAbilityRolls) {\n        for (const rollType of [\"check\", \"save\", \"skill\", \"tool\"]) {\n          if (!configSettings.autoFastForward.includes(rollType)) configSettings.autoFastForward.push(rollType);\n          if (!configSettings.gmAutoFastForward.includes(rollType)) configSettings.gmAutoFastForward.push(rollType);\n        }\n        needsFastForwardMigration = true;\n      }\n    } catch (e) {\n      // Setting may not be registered yet or already removed - that's fine\n    }\n    if (needsFastForwardMigration) {\n      console.warn(\"midi-qol | Migrated fast-forward settings to granular arrays:\",\n        `\\n  Player autoFastForward: \"${oldFastForwardPlayer ?? \"(already migrated)\"}\" → [${configSettings.autoFastForward.join(\", \")}]`,\n        `\\n  GM gmAutoFastForwardAttack: ${oldGmFfAttack ?? \"(already migrated)\"}, gmAutoFastForwardDamage: ${oldGmFfDamage ?? \"(already migrated)\"} → gmAutoFastForward: [${configSettings.gmAutoFastForward.join(\", \")}]`,\n        `\\n  AutoFastForwardAbilityRolls: ${oldAbilityRolls ?? false}`\n      );\n      // Defer settings writes until game is ready (fetchParams may be called from init/setup hooks)\n      const persistMigration = () => {\n        game.settings.set(\"midi-qol\", \"ConfigSettings\", configSettings);\n        if (oldAbilityRolls) game.settings.set(\"midi-qol\", \"AutoFastForwardAbilityRolls\", false);\n      };\n      if (game.ready) persistMigration();\n      else Hooks.once(\"ready\", persistMigration);\n    }\n    fastForwardMigrationDone = true;\n  }\n  if (!Array.isArray(configSettings.autoFastForward)) configSettings.autoFastForward = [];\n  if (!Array.isArray(configSettings.gmAutoFastForward)) configSettings.gmAutoFastForward = [];\n\n  // Migrate standalone PreferredGM setting into configSettings\n  if (configSettings.preferredGM === undefined) {\n    try {\n      const oldPreferredGM = game.settings.get(\"midi-qol\", \"PreferredGM\") as string;\n      if (oldPreferredGM && oldPreferredGM !== \"\") {\n        configSettings.preferredGM = oldPreferredGM;\n        console.warn(`midi-qol | Migrated PreferredGM setting \"${oldPreferredGM}\" into configSettings`);\n        game.settings.set(\"midi-qol\", \"ConfigSettings\", configSettings);\n      } else {\n        configSettings.preferredGM = \"\";\n      }\n    } catch (e) {\n      configSettings.preferredGM = \"\";\n    }\n  }\n\n  // Migrate standalone CriticalDamage/CriticalDamageGM settings into configSettings\n  if (configSettings.criticalDamage === undefined) {\n    try {\n      const oldCriticalDamage = game.settings.get(\"midi-qol\", \"CriticalDamage\") as string;\n      configSettings.criticalDamage = (!oldCriticalDamage || oldCriticalDamage === \"none\") ? \"default\" : oldCriticalDamage;\n      const oldCriticalDamageGM = game.settings.get(\"midi-qol\", \"CriticalDamageGM\") as string;\n      configSettings.criticalDamageGM = (!oldCriticalDamageGM || oldCriticalDamageGM === \"none\") ? configSettings.criticalDamage : oldCriticalDamageGM;\n      console.warn(`midi-qol | Migrated CriticalDamage settings into configSettings (player: \"${configSettings.criticalDamage}\", GM: \"${configSettings.criticalDamageGM}\")`);\n      game.settings.set(\"midi-qol\", \"ConfigSettings\", configSettings);\n    } catch (e) {\n      configSettings.criticalDamage = \"default\";\n      configSettings.criticalDamageGM = \"default\";\n    }\n  }\n\n  // Migrate standalone ColoredBorders setting into configSettings\n  if (configSettings.coloredBorders === undefined) {\n    try {\n      const oldColoredBorders = game.settings.get(\"midi-qol\", \"ColoredBorders\") as string;\n      // Normalize \"None\" (old default) to \"none\" (matches options keys)\n      configSettings.coloredBorders = (!oldColoredBorders || oldColoredBorders === \"None\") ? \"none\" : oldColoredBorders;\n      console.warn(`midi-qol | Migrated ColoredBorders setting \"${oldColoredBorders}\" into configSettings as \"${configSettings.coloredBorders}\"`);\n      game.settings.set(\"midi-qol\", \"ConfigSettings\", configSettings);\n    } catch (e) {\n      configSettings.coloredBorders = \"none\";\n    }\n  }\n\n  autoRemoveTargets = game.settings.get(\"midi-qol\", \"AutoRemoveTargets\");\n  if (autoRemoveTargets === \"allGM\") {\n    autoRemoveTargets = game.user?.isGM ? \"all\" : \"dead\";\n  }\n  let debugText: string = game.settings.get(\"midi-qol\", \"Debug\");\n  forceHideRoll = game.settings.get(\"midi-qol\", \"ForceHideRoll\");\n  dragDropTargeting = game.settings.get(\"midi-qol\", \"DragDropTarget\");\n  debounceInterval = game.settings.get(\"midi-qol\", \"DebounceInterval\");\n  replaceDefaultActivities = game.settings.get(\"midi-qol\", \"ReplaceDefaultActivities\");\n  const oldWeakReferences = useWeakReferences;\n  useWeakReferences = game.settings.get(\"midi-qol\", \"UseWeakReferences\") ?? false;\n  if (useWeakReferences !== oldWeakReferences) Workflow.clearWorkflows();\n  saveToChatCard = game.settings.get(\"midi-qol\", \"SaveToChatCard\");\n  pruneChatLog = game.settings.get(\"midi-qol\", \"pruneChatLog\");\n  targetConfirmation = game.settings.get(\"midi-qol\", \"TargetConfirmation\");\n  if (configSettings.griddedGridless === undefined) configSettings.griddedGridless = false;\n  if (configSettings.gridlessFudge === undefined) configSettings.gridlessFudge = 0;\n  if (configSettings.concentrationIncapacitatedConditionCheck === undefined) configSettings.concentrationIncapacitatedConditionCheck = false;\n  if (configSettings.activationAutomation === undefined) configSettings.activationAutomation = \"chat\";\n  if (configSettings.activityNamePrefix === undefined) configSettings.activityNamePrefix = true;\n  if (blfxActive && configSettings.activityNamePrefix) {\n    TroubleShooter.recordError({}, \"Boss Loot FX is active - disabling activity name prefix\");\n    console.warn(\"midiqol | Boss Loot FX is active - disabling activity name prefix\");\n    configSettings.activityNamePrefix = false;\n  }\n  if (targetConfirmation === undefined || typeof targetConfirmation === \"string\" || targetConfirmation instanceof String) targetConfirmation = {\n    enabled: false,\n    always: false,\n    noneTargeted: false,\n    hasAttack: false,\n    hasCreatureTarget: false,\n    targetSelf: false,\n    hasAoE: false,\n    hasRangedAoE: false,\n    longRange: false,\n    inCover: false,\n    allies: false,\n    mixedDisposition: false,\n    gridPosition: { x: 0, y: 0 }\n  };\n\n  setDebugLevel(debugText);\n\n  if (configSettings.concentrationAutomation && game.user === game.users?.activeGM) {\n    Hooks.once(\"ready\", () => {\n      if (configSettings.concentrationAutomation) {\n        ui.notifications?.warn(`Midi concentration automation is deprecated in favour of ${game.system?.title} concentration checking - settings updated to use ${game.system?.id} concentration`, { permanent: true })\n      };\n      configSettings.concentrationAutomation = false;\n      game.settings.set(\"dnd5e\", \"disableConcentration\", false);\n      game.settings.set(\"midi-qol\", \"ConfigSettings\", configSettings)\n    });\n  }\n\n  // Migration: displaySaveDC -> dnd5e challengeVisibility\n  //@ts-expect-error legacy property that's been removed from ConfigSettings\n  if (configSettings.displaySaveDC !== undefined && game.user === game.users?.activeGM) {\n    Hooks.once(\"ready\", async () => {\n      await migrateDisplaySaveDC(configSettings, \"startup\");\n      await game.settings.set(\"midi-qol\", \"ConfigSettings\", configSettings);\n    });\n  }\n\n  updateFlankingStatusEffects();\n  Hooks.callAll(\"midi-qol.ConfigSettingsChanged\");\n}\n\nexport function readySettingsSetup() {\n  // Deprecated: PreferredGM has moved to configSettings.preferredGM (shown on GM tab)\n  // Kept registered for migration from old setting value\n  game.settings.register(\"midi-qol\", \"PreferredGM\", {\n    name: \"midi-qol.PreferredGM.Name\",\n    hint: \"midi-qol.PreferredGM.Hint\",\n    scope: \"world\",\n    default: \"\",\n    config: false,\n    type: String,\n  });\n}\n\nfunction keysToOptionsObj(prefix: string, keys: string[]): Record<string, string> {\n  return Object.fromEntries(keys.map(key => [key, `midi-qol.${prefix}.${key}`]));\n}\n\nfunction keysToExtendedOptionsObj(prefix: string, keys: string[]): SelectOptions {\n  return Object.fromEntries(keys.map(key => [key, {\n    label: `midi-qol.${prefix}.${key}`,\n    hint: `midi-qol.${prefix}.expandedHints.${key}`\n  }]));\n}\n\nexport const criticalDamageChoices = keysToOptionsObj(\"CriticalDamageChoices\", [\n  \"default\",\n  \"maxDamage\",\n  \"maxCrit\",\n  \"maxCritRoll\",\n  \"maxAll\",\n  \"doubleDice\",\n  \"explode\",\n  \"maxDamageExplode\",\n  \"explodeCharacter\",\n  \"explodeNPC\",\n  \"baseDamage\",\n  \"maxBaseRollCrit\",\n  \"bestOfTwo\"\n]);\n\nexport const addChatDamageButtonsOptions = keysToExtendedOptionsObj(\"AddChatDamageButtonsOptions\", [\n  \"none\",\n  \"gm\",\n  \"pc\",\n  \"both\"\n]);\n\nexport const coloredBordersOptions = keysToOptionsObj(\"ColoredBordersOptions\", [\n  \"none\",\n  \"borders\",\n  \"borderNamesText\",\n  \"borderNamesBackground\"\n]);\n\nexport const autoRemoveTargetsOptions = keysToOptionsObj(\"AutoRemoveTargetsOptions\", [\n  \"none\",\n  \"dead\",\n  \"allGM\",\n  \"all\"\n]);\n\nexport const debugOptions = keysToOptionsObj(\"DebugOptions\", [\n  \"none\",\n  \"warn\",\n  \"debug\",\n  \"all\"\n]);\n\nexport const autoRollDamageOptions = keysToExtendedOptionsObj(\"autoRollDamageOptions\", [\n  \"none\",\n  \"always\",\n  \"saveOnly\",\n  \"onHit\"\n]);\n\nexport const autoCheckHitOptions = keysToExtendedOptionsObj(\"autoCheckHitOptions\", [\n  \"none\",\n  \"all\",\n  \"whisper\",\n  \"gmOnly\"\n]);\n\n\nexport const clickOptions = keysToExtendedOptionsObj(\"clickOptions\", [\n  \"off\",\n  \"attack\",\n  \"damage\",\n  \"all\"\n]);\n\nexport const autoTargetOptions = keysToExtendedOptionsObj(\"autoTargetOptions\", [\n  \"none\",\n  \"always\",\n  \"alwaysIgnoreIncapacitated\",\n  \"alwaysIgnoreDefeated\",\n  \"wallsBlock\",\n  \"wallsBlockIgnoreIncapacitated\",\n  \"wallsBlockIgnoreDefeated\",\n  \"walledtemplates\"\n]);\n\n\nexport const autoCheckSavesOptions = keysToExtendedOptionsObj(\"autoCheckSavesOptions\", [\n  \"none\",\n  \"allNoRoll\",\n  \"all\",\n  \"allShow\",\n  \"whisper\",\n  \"gmOnly\",\n]);\n\n\nexport const rangeTargetOptions = keysToExtendedOptionsObj(\"rangeTargetOptions\", [\n  \"none\",\n  \"always\",\n  \"alwaysIgnoreIncapacitated\",\n  \"alwaysIgnoreDefeated\",\n  \"wallsBlock\",\n  \"wallsBlockIgnoreIncapacitated\",\n  \"wallsBlockIgnoreDefeated\"\n]);\n\n\nexport const autoApplyDamageOptions = keysToExtendedOptionsObj(\"autoApplyDamageOptions\", [\n  \"none\",\n  \"noCard\",\n  \"noCardMisses\",\n  \"yes\",\n  \"yesCard\",\n  \"yesCardMisses\",\n  \"yesCardNPC\"\n]);\n\n\nexport const damageCardStyleOptions = keysToExtendedOptionsObj(\"damageCardStyleOptions\", [\n  \"flexbox\",\n  \"classic\"\n]);\n\nexport const playerDamageCardOptions = keysToExtendedOptionsObj(\"playerDamageCardOptions\", [\n  \"none\",\n  \"playerresults\",\n  \"playerbuttons\",\n  \"npcplayerresults\",\n  \"npcplayerbuttons\"\n]);\n\nexport const removeButtonsOptions = keysToOptionsObj(\"removeButtonsOptions\", [\n  \"off\",\n  \"attack\",\n  \"damage\",\n  \"all\",\n  \"everything\"\n]);\n\nexport const damageImmunitiesOptions = keysToExtendedOptionsObj(\"damageImmunitiesOptions\", [\n  \"none\",\n  \"immunityDefault\",\n  \"immunityPhysical\"\n]);\n\nexport const showItemDetailsOptions = keysToExtendedOptionsObj(\"showItemDetailsOptions\", [\n  \"none\",\n  \"cardOnly\",\n  \"pc\",\n  \"all\"\n]);\n\nexport const rollNPCSavesOptions = keysToExtendedOptionsObj(\"rollNPCSavesOptions\", [\n  \"none\",\n  \"auto\",\n  \"autoDialog\",\n  \"mtb\",\n  \"ftb\",\n  \"rer\"\n]);\n\nexport const playerRollSavesOptions = keysToExtendedOptionsObj(\"playerRollSavesOptions\", [\n  \"none\",\n  \"nonePublic\",\n  \"noneDialogPublic\",\n  \"noneDialogPrivate\",\n  \"noneDialogSelf\",\n  \"noneDialogBlind\",\n  \"chat\",\n  \"mtb\",\n  \"ftb\",\n  \"rer\"\n]);\n\nexport const playerRollSavesOptionsReduced = keysToExtendedOptionsObj(\"playerRollSavesOptionsReduced\", [\n  \"none\",\n  \"chat\"\n]);\n\nexport const hideRollDetailsOptions = keysToExtendedOptionsObj(\"hideRollDetailsOptions\", [\n  \"none\",\n  \"detailsDSN\",\n  \"details\",\n  \"d20Only\",\n  \"d20DamageDSN\",\n  \"hitDamage\",\n  \"hitCriticalDamage\",\n  \"attackTotalOnly\",\n  \"d20AttackOnly\",\n  \"all\"\n]);\n\nexport const gmAttackDisplayOptions = keysToExtendedOptionsObj(\"gmAttackDisplayOptions\", [\n  \"full\",\n  \"hideFormula\",\n  \"d20Only\",\n  \"attackTotal\",\n  \"hitMiss\",\n  \"hitMissCrit\",\n  \"hidden\"\n]);\n\nexport const gmDamageDisplayOptions = keysToExtendedOptionsObj(\"gmDamageDisplayOptions\", [\n  \"full\",\n  \"totalOnly\",\n  \"hidden\"\n]);\n\nexport const gmDsnDisplayOptions = keysToExtendedOptionsObj(\"gmDsnDisplayOptions\", [\n  \"show\",\n  \"ghost\",\n  \"none\"\n]);\n\nexport const rollOtherDamageOptions = keysToExtendedOptionsObj(\"RollOtherDamageOptions\", [\n  \"none\",\n  \"always\",\n  \"condition\",\n  \"ifSave\"\n]);\n\nexport const showReactionAttackRollOptions = keysToExtendedOptionsObj(\"ShowReactionAttackRollOptions\", [\n  \"none\",\n  \"d20\",\n  \"all\",\n  \"allCrit\"\n]);\n\nexport const onUseMacroOptions = keysToExtendedOptionsObj(\"onUseMacroOptions\", [\n  \"preTargeting\",\n  \"preItemRoll\",\n  \"templatePlaced\",\n  \"preAttackRoll\",\n  \"preAttackRollConfig\",\n  \"preCheckHits\",\n  \"postAttackRoll\",\n  \"preDamageRoll\",\n  \"postDamageRoll\",\n  \"damageBonus\",\n  \"preSave\",\n  \"postSave\",\n  \"preDamageRollConfig\",\n  \"preDamageApplication\",\n  \"preActiveEffects\",\n  \"postActiveEffects\",\n  \"isTargeted\",\n  \"isPreAttacked\",\n  \"isAttacked\",\n  \"isHit\",\n  \"preTargetSave\",\n  \"isSave\",\n  \"isSaveSuccess\",\n  \"isSaveFailure\",\n  \"preTargetDamageApplication\",\n  \"postTargetEffectApplication\",\n  \"isDamaged\",\n  \"all\"\n]);\n\nexport const confirmTargetOptions = keysToOptionsObj(\"ConfirmTargetOptions\", [\n  \"default\",\n  \"always\",\n  \"never\"\n]);\n\nexport const triggeredActivityTargetOptions = keysToOptionsObj(\"TriggeredActivityTargetOptions\", [\n  \"self\",\n  \"targets\",\n  \"hitTargets\",\n  \"missedTargets\",\n  \"failedSaves\",\n  \"saveTargets\",\n  \"retarget\"\n]);\n\nexport const triggeredActivityRollAsOptions = keysToOptionsObj(\"TriggeredActivityRollAsOptions\", [\n  \"self\",\n  \"firstTarget\",\n  \"firstHitTarget\",\n  \"firstMissedTarget\",\n  \"firstSaveTarget\",\n  \"firstFailedSaveTarget\"\n]);\n\n// Base ignore traits options (apply to all damage types)\nexport const ignoreTraitsOptionsBase = {\n  idi: {\n    label: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.idi.label\",\n    hint: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.idi.hint\"\n  },\n  idr: {\n    label: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.idr.label\",\n    hint: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.idr.hint\"\n  },\n  idv: {\n    label: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.idv.label\",\n    hint: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.idv.hint\"\n  },\n  ida: {\n    label: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.ida.label\",\n    hint: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.ida.hint\"\n  },\n  idm: {\n    label: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.idm.label\",\n    hint: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.idm.hint\"\n  }\n};\n\n// For backwards compatibility\nexport const ignoreTraitsOptions = ignoreTraitsOptionsBase;\n\n// Category labels for damage-type specific options\nexport const ignoreTraitsCategoryLabels = {\n  idi: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.idi.short\",\n  idr: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.idr.short\",\n  idv: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.idv.short\",\n  ida: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.ida.short\",\n  idm: \"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.idm.short\"\n};\n\n/**\n * Get ignore traits options including damage-type specific options.\n * Returns options in format: { value, label, group? }\n * Values are either \"idi\" (all) or \"idi.fire\" (specific damage type)\n */\nexport function getIgnoreTraitsOptions(): { value: string, label: string, group?: string }[] {\n  const options: { value: string, label: string, group?: string }[] = [];\n  const damageTypes = CONFIG.DND5E?.damageTypes ?? {};\n\n  // Add base \"all\" options first\n  for (const [key, entry] of Object.entries(ignoreTraitsOptionsBase)) {\n    options.push({\n      value: key,\n      label: i18n(entry.label),\n      group: i18n(\"midi-qol.SHARED.FIELDS.midiProperties.ignoreTraits.allTypes\")\n    });\n  }\n\n  // Add damage-type specific options for each category\n  for (const [category, categoryEntry] of Object.entries(ignoreTraitsOptionsBase)) {\n    const categoryLabel = i18n(ignoreTraitsCategoryLabels[category] ?? categoryEntry.label);\n    for (const [dt, dtConfig] of Object.entries(damageTypes)) {\n      const dtLabel = (dtConfig as any).label ?? dt;\n      options.push({\n        value: `${category}.${dt}`,\n        label: `${categoryLabel}: ${dtLabel}`,\n        group: categoryLabel\n      });\n    }\n  }\n\n  return options;\n}\n\nexport const aoeTargetTypeOptions = keysToOptionsObj(\"AoETargetTypeOptions\", [\n  \"any\",\n  \"ally\",\n  \"notAlly\",\n  \"enemy\",\n  \"notEnemy\",\n  \"neutral\",\n  \"notNeutral\",\n  \"hostile\",\n  \"notHostile\",\n  \"Friendly\", //grr\n  \"notFriendly\"\n]);\n\nexport const autoCEEffectsOptions = keysToExtendedOptionsObj(\"AutoCEEffectsOptions\", [\n  \"none\",\n  \"itempri\",\n  \"cepri\",\n  \"both\"\n]);\n\n\nexport const wallsBlockRangeOptionsNew = keysToExtendedOptionsObj(\"WallsBlockRangeOptionsNew\", [\n  \"none\",\n  \"center\",\n  \"centerLevels\",\n  \"levelsautocover\",\n  \"simbuls-cover-calculator\",\n  \"tokencover\",\n  \"simplecover5e\"\n]);\n\nexport const coverCalculationOptions = keysToExtendedOptionsObj(\"CoverCalculationOptions\", [\n  \"none\",\n  \"simbuls-cover-calculator\",\n  \"simplecover5e\",\n  \"levelsautocover\",\n  \"tokencover\"\n]);\n\n\nexport const hiddenAdvantageOptions = keysToExtendedOptionsObj(\"HiddenAdvantageOptions\", [\n  \"none\",\n  \"effect\",\n  \"perceptive\"\n]);\n\nexport const addDeadOptions = keysToExtendedOptionsObj(\"AddDeadOptions\", [\n  \"none\",\n  \"overlay\",\n  \"normal\"\n]);\n\nexport const requiresTargetsOptions = keysToExtendedOptionsObj(\"requiresTargetsOptions\", [\n  \"none\",\n  \"combat\",\n  \"tokens\",\n  \"always\"\n]);\n\nexport const doReactionsOptions = keysToExtendedOptionsObj(\"DoReactionsOptions\", [\n  \"all\",\n  \"allMI\",\n  \"none\"\n]);\n\nexport const gmDoReactionsOptions = keysToExtendedOptionsObj(\"GMDoReactionsOptions\", [\n  \"all\",\n  \"allMI\",\n  \"none\"\n]);\n\nexport const recordAOOOptions = keysToExtendedOptionsObj(\"RecordAOOOptions\", [\n  \"none\",\n  \"character\",\n  \"all\"\n]);\n\nexport const EnforceReactionsOptions = keysToExtendedOptionsObj(\"EnforceReactionsOptions\", [\n  \"none\",\n  \"displayOnly\",\n  \"character\",\n  \"all\"\n]);\n\nexport const autoEffectsOptions = keysToExtendedOptionsObj(\"AutoEffectsOptions\", [\n  \"off\",\n  \"applyNoButton\",\n  \"applyRemove\",\n  \"applyLeave\"\n]);\n\n\nexport const requireMagicalOptions = keysToExtendedOptionsObj(\"RequireMagicalOptions\", [\n  \"off\",\n  \"nonspell\",\n  \"allitems\"\n]);\n\nexport const checkFlankingOptions = keysToExtendedOptionsObj(\"CheckFlankingOptions\", [\n  \"off\",\n  \"advonly\",\n  \"ceonly\",\n  \"midiFlanking\",\n  \"ceflanked\",\n  \"midiFlanked\",\n  \"ceflankedNoconga\",\n  \"midiFlankedNoConga\"\n]);\n\nexport const flankingBonusOptions = {\n  \"advantage\": \"midi-qol.FlankingBonusOptions.advantage\",\n  \"1\": \"midi-qol.FlankingBonusOptions.1\",\n  \"2\": \"midi-qol.FlankingBonusOptions.2\",\n  \"3\": \"midi-qol.FlankingBonusOptions.3\",\n  \"4\": \"midi-qol.FlankingBonusOptions.4\",\n  \"5\": \"midi-qol.FlankingBonusOptions.5\",\n};\n\nexport const rollAlternateOptions = keysToExtendedOptionsObj(\"RollAlternateOptions\", [\n  \"off\",\n  \"formula\",\n  \"adv\",\n  \"formulaadv\"\n]);\n\nexport const consumeResourceOptions = keysToExtendedOptionsObj(\"ConsumeResourceOptions\", [\n  \"none\",\n  \"spell\",\n  \"item\",\n  \"both\"\n]);\n\nexport const averageDamageOptions = keysToExtendedOptionsObj(\"AverageDamageOptions\", [\n  \"none\",\n  \"npc\",\n  \"character\",\n  \"all\"\n]);\n\nexport const removeConcentrationEffectsOptions = keysToExtendedOptionsObj(\"RemoveConcentrationEffectsOptions\", [\n  \"none\",\n  \"effects\",\n  \"effectsTemplates\"\n]);\n\nexport const incapacitatedOptions = keysToExtendedOptionsObj(\"IncapacitatedOptions\", [\n  \"nothing\",\n  \"enforce\",\n  \"warn\"\n]);\n\nexport const checkRangeOptions = keysToExtendedOptionsObj(\"CheckRangeOptions\", [\n  \"none\",\n  \"longfail\",\n  \"longdisadv\"\n]);\n\nexport const distanceMeasurementOptions = keysToExtendedOptionsObj(\"DistanceMeasurementOptions\", [\n  \"default\",\n  \"center\",\n  \"perimeter\"\n]);\n\nexport const invisAdvantageOptions = keysToExtendedOptionsObj(\"InvisAdvantageOptions\", [\n  \"none\",\n  \"RAW2014\",\n  \"RAW2024\",\n  \"vision\"\n]);\n\nexport const confirmAttackDamageOptions = keysToExtendedOptionsObj(\"ConfirmAttackDamageOptions\", [\n  \"none\",\n  \"gmOnly\",\n  \"GMPlayer\"\n]);\n\nexport const challengeModeArmorOptions = keysToExtendedOptionsObj(\"ChallengeModeArmorOptions\", [\n  \"none\",\n  \"challenge\",\n  \"scale\",\n  \"scaleNoAR\"\n]);\n\nexport const saveDROrderOptions = keysToExtendedOptionsObj(\"SaveDROrderOptions\", [\n  \"DRSaveDr\",\n  \"SaveDRDr\",\n  \"SaveDrDR\"\n]);\n\nexport const doConcentrationCheckOptions = keysToExtendedOptionsObj(\"DoConcentrationCheckOptions\", [\n  \"none\",\n  \"chatOnly\",\n  \"chat\",\n  \"item\"\n]);\n\nexport const activationAutomationOptions = keysToOptionsObj(\"ActivationAutomationOptions\", [\n  \"none\",\n  \"chat\",\n  \"auto\"\n]);\n\nexport const rollConfigOptions = keysToOptionsObj(\"ConfigDialogOptions\", [\n  \"default\",\n  \"always\",\n  \"never\"\n]);\nexport const damageConfigOptions = keysToOptionsObj(\"ConfigDialogOptions\", [\n  \"default\",\n  \"always\",\n  \"never\"\n]);\nexport const consumeConfigOptions = keysToOptionsObj(\"ConfigDialogOptions\", [\n  \"default\",\n  \"always\",\n  \"never\"\n]);\n\nexport const registerSettings = function () {\n\n  // ========================================\n  // Hidden settings (config: false) - registered first\n  // ========================================\n\n  game.settings.register(\"midi-qol\", \"ConfigSettings\", {\n    scope: \"world\",\n    // @ts-expect-error Object type is valid for Foundry settings\n    type: Object,\n    default: configSettings,\n    onChange: fetchParams,\n    config: false\n  });\n\n  game.settings.register(\"midi-qol\", \"MidiSoundSettings\", {\n    scope: \"world\",\n    type: Object,\n    default: midiSoundSettings,\n    onChange: fetchSoundSettings,\n    config: false\n  });\n\n  game.settings.register(\"midi-qol\", \"MidiSoundSettings-backup\", {\n    scope: \"world\",\n    type: Object,\n    default: {},\n    config: false\n  });\n\n  game.settings.register(\"midi-qol\", \"RollStats\", {\n    scope: \"world\",\n    default: {},\n    type: Object,\n    config: false,\n    onChange: () => {\n      // Only non-GM clients should reload stats from the database.\n      // The GM's in-memory currentStats is the authoritative copy;\n      // reloading here would overwrite unsaved increments (race condition).\n      if (!game.user?.isGM) {\n        gameStats.fetchStats();\n      }\n      Hooks.callAll(\"midi-qol.StatsUpdated\");\n    }\n  });\n\n  game.settings.register(\"midi-qol\", \"TargetConfirmation\", {\n    scope: \"client\",\n    type: Object,\n    default: defaultTargetConfirmationSettings,\n    config: false,\n    onChange: fetchParams\n  });\n\n  game.settings.register(\"midi-qol\", \"notificationVersion\", {\n    scope: \"world\",\n    default: \"0.0.0\",\n    type: String,\n    config: false\n  });\n\n  game.settings.register(\"midi-qol\", \"splashWarnings\", {\n    scope: \"world\",\n    type: Boolean,\n    config: false,\n    default: true\n  });\n\n  game.settings.register(\"midi-qol\", \"last-run-version\", {\n    type: String,\n    config: false,\n    default: \"0.0.0\",\n    requiresReload: true\n  });\n\n  game.settings.register(\"midi-qol\", \"instanceId\", {\n    type: String,\n    config: false,\n    default: \"\",\n    requiresReload: true\n  });\n\n  // ========================================\n  // Visible settings (config: true)\n  // ========================================\n\n  game.settings.register(\"midi-qol\", \"EnableWorkflow\", {\n    name: i18n(\"midi-qol.EnableWorkflow.Name\"),\n    hint: i18n(\"midi-qol.EnableWorkflow.Hint\"),\n    scope: \"client\",\n    default: true,\n    config: true,\n    type: Boolean,\n    onChange: fetchParams\n  });\n\n  // Deprecated: PreferredGM has moved to configSettings.preferredGM (shown on GM tab)\n  game.settings.register(\"midi-qol\", \"PreferredGM\", {\n    name: i18n(\"midi-qol.PreferredGM.Name\"),\n    hint: i18n(\"midi-qol.PreferredGM.Hint\"),\n    scope: \"world\",\n    default: \"\",\n    config: false,\n    type: String\n  });\n\n  game.settings.register(\"midi-qol\", \"ReplaceDefaultActivities\", {\n    name: i18n(\"midi-qol.ReplaceDefaultActivities.Name\"),\n    hint: i18n(\"midi-qol.ReplaceDefaultActivities.Hint\"),\n    scope: \"world\",\n    default: true,\n    config: true,\n    type: Boolean,\n    requiresReload: true\n  });\n\n  // Deprecated: kept for one version cycle to allow migration of old value into configSettings arrays\n  game.settings.register(\"midi-qol\", \"AutoFastForwardAbilityRolls\", {\n    name: i18n(\"midi-qol.AutoFastForwardAbilityRolls.Name\"),\n    hint: i18n(\"midi-qol.AutoFastForwardAbilityRolls.Hint\"),\n    scope: \"world\",\n    default: false,\n    type: Boolean,\n    config: false,\n  });\n\n  game.settings.register(\"midi-qol\", \"showGM\", {\n    name: i18n(\"midi-qol.showGM.Name\"),\n    hint: i18n(\"midi-qol.showGM.Hint\"),\n    scope: \"world\",\n    default: false,\n    type: Boolean,\n    config: true,\n    onChange: fetchParams\n  });\n  \n  game.settings.register(\"midi-qol\", \"ForceHideRoll\", {\n    name: i18n(\"midi-qol.ForceHideRoll.Name\"),\n    hint: i18n(\"midi-qol.ForceHideRoll.Hint\"),\n    scope: \"client\",\n    default: true,\n    type: Boolean,\n    config: true,\n    onChange: fetchParams,\n    requiresReload: true\n  });\n\n  game.settings.register(\"midi-qol\", \"DragDropTarget\", {\n    name: i18n(\"midi-qol.DragDropTarget.Name\"),\n    hint: i18n(\"midi-qol.DragDropTarget.Hint\"),\n    scope: \"world\",\n    default: false,\n    type: Boolean,\n    onChange: fetchParams,\n    config: true\n  });\n\n  // Deprecated: CriticalDamage/CriticalDamageGM have moved to configSettings (shown on Workflow > Damage tab)\n  // Kept registered for migration from old setting values\n  game.settings.register(\"midi-qol\", \"CriticalDamageGM\", {\n    name: \"midi-qol.CriticalDamageGM.Name\",\n    scope: \"world\",\n    default: \"none\",\n    type: String,\n    config: false,\n    choices: criticalDamageChoices,\n    onChange: fetchParams\n  });\n  game.settings.register(\"midi-qol\", \"CriticalDamage\", {\n    name: \"midi-qol.CriticalDamage.Name\",\n    scope: \"world\",\n    default: \"default\",\n    type: String,\n    config: false,\n    choices: criticalDamageChoices,\n    onChange: fetchParams\n  });\n\n  // Deprecated: ColoredBorders has moved to configSettings.coloredBorders (shown on Misc tab)\n  // Kept registered for migration from old setting value\n  game.settings.register(\"midi-qol\", \"ColoredBorders\",\n    {\n      name: \"midi-qol.ColoredBorders.Name\",\n      hint: \"midi-qol.ColoredBorders.Hint\",\n      scope: \"world\",\n      default: \"None\",\n      type: String,\n      config: false,\n      choices: coloredBordersOptions,\n      onChange: fetchParams\n    });\n\n  game.settings.register(\"midi-qol\", \"AutoRemoveTargets\", {\n    name: \"midi-qol.AutoRemoveTargets.Name\",\n    hint: \"midi-qol.AutoRemoveTargets.Hint\",\n    scope: \"client\",\n    default: \"dead\",\n    type: String,\n    config: true,\n    choices: autoRemoveTargetsOptions,\n    onChange: fetchParams\n  });\n  game.settings.registerMenu(\"midi-qol\", \"midi-qol\", {\n    name: i18n(\"midi-qol.config\"),\n    label: \"midi-qol.WorkflowSettings\",\n    hint: i18n(\"midi-qol.Hint\"),\n    icon: \"fas fa-dice-d20\",\n    type: ConfigPanel as any,\n    restricted: true\n  });\n\n  game.settings.registerMenu(\"midi-qol\", \"resetSettings\", {\n    name: i18n(\"midi-qol.ResetDefaults.Name\"),\n    label: \"midi-qol.ResetDefaults.Button\",\n    hint: i18n(\"midi-qol.ResetDefaults.Hint\"),\n    icon: \"fas fa-triangle-exclamation\",\n    type: ResetSettingsSubmenu,\n    restricted: true\n  });\n\n  // Register wizard launcher if the wizard module is installed and active\n  if (game.modules.get(\"midi-qol-setup-wizard\")?.active) {\n    game.settings.registerMenu(\"midi-qol\", \"launchSetupWizard\", {\n      name: i18n(\"midi-qol.LaunchSetupWizard.Name\"),\n      label: \"midi-qol.LaunchSetupWizard.Label\",\n      hint: i18n(\"midi-qol.LaunchSetupWizard.Hint\"),\n      icon: \"fas fa-magic\",\n      type: LaunchWizardSubmenu,\n      restricted: true\n    });\n  }\n\n  game.settings.registerMenu(\"midi-qol\", \"TargetConfirmationConfig\", {\n    name: i18n(\"midi-qol.TargetConfirmationConfig.Name\"),\n    label: i18n(\"midi-qol.TargetConfirmationConfig.Name\"),\n    hint: i18n(\"midi-qol.TargetConfirmationConfig.Hint\"),\n    icon: \"fas fa-dice-d20\",\n    type: TargetConfirmationConfig,\n    restricted: false\n  });\n\n  game.settings.registerMenu(\"midi-qol\", \"midi-qol-sounds\", {\n    name: i18n(\"midi-qol.SoundSettings.Name\"),\n    label: \"midi-qol.SoundSettings.Label\",\n    hint: i18n(\"midi-qol.SoundSettings.Hint\"),\n    icon: \"fas fa-dice-d20\",\n    type: SoundConfigPanel,\n    restricted: true\n  });\n\n  game.settings.registerMenu(\"midi-qol\", \"showRollStats\", {\n    name: i18n(\"midi-qol.ShowStats\"),\n    label: \"midi-qol.ShowStats\",\n    hint: i18n(\"midi-qol.KeepRollStats.Hint\"),\n    icon: \"fas fa-chart-bar\",\n    type: RollStatsDisplay as any,\n    restricted: false\n  });\n\n  game.settings.register(\"midi-qol\", \"playerControlsInvisibleTokens\", {\n    name: i18n(\"midi-qol.playerControlsInvisibleTokens.Name\"),\n    hint: i18n(\"midi-qol.playerControlsInvisibleTokens.Hint\"),\n    scope: \"world\",\n    default: false,\n    config: true,\n    type: Boolean,\n    requiresReload: true\n  });\n\n  game.settings.register(\"midi-qol\", \"pruneChatLog\", {\n    name: \"Prune Chat Log\",\n    hint: \"Automatically prune chat messages to limit those in memory.\",\n    scope: \"world\",\n    default: true,\n    type: Boolean,\n    config: true,\n    requiresReload: true,\n    onChange: (value: boolean) => {\n      pruneChatLog = value;\n      syncChatlogPruneSetting(value);\n    }\n  });\n\n  game.settings.register(\"midi-qol\", \"DebounceInterval\", {\n    name: \"Chat Message Cache Time (ms)\",\n    hint: \"Chat message updates will only happen this often\",\n    scope: \"world\",\n    default: 0,\n    type: Number,\n    config: true,\n    onChange: () => {debounceInterval = game.settings.get(\"midi-qol\", \"DebounceInterval\");}\n  });\n\n  game.settings.register(\"midi-qol\", \"Debug\", {\n    name: \"midi-qol.Debug.Name\",\n    hint: \"midi-qol.Debug.Hint\",\n    scope: \"world\",\n    default: \"None\",\n    type: String,\n    config: true,\n    choices: debugOptions,\n    onChange: fetchParams\n  });\n\n  game.settings.register(\"midi-qol\", \"SaveToChatCard\", {\n    name: \"Save to Chat Card\",\n    hint: \"save the workflow state to the chat card - so that it can be restored on reload\",\n    scope: \"world\",\n    default: false,\n    type: Boolean,\n    config: true,\n    onChange: fetchParams\n  });\n  game.settings.register(\"midi-qol\", \"UseWeakReferences\", {\n    name: \"Use Weak References for Workflows\",\n    hint: \"Only enable if Save to Chat Card is enabled. This will use WeakReferences to store workflows - should save some memory.\",\n    scope: \"world\",\n    default: false,\n    type: Boolean,\n    config: true,\n    onChange: fetchParams\n  });\n\n  game.settings.registerMenu(\"midi-qol\", \"dependentsExplorer\", {\n    name: i18n(\"midi-qol.DependentsExplorer.Name\"),\n    label: \"midi-qol.DependentsExplorer.Label\",\n    icon: \"fas fa-sitemap\",\n    hint: i18n(\"midi-qol.DependentsExplorer.Hint\"),\n    type: DependentsExplorer as any,\n    restricted: true\n  });\n\n  // Hide the Dependents Explorer button for non-GM clients\n  Hooks.on(\"renderSettingsConfig\", (app, html) => {\n    if (game.user?.isGM) return;\n    const element = html instanceof HTMLElement ? html : html[0];\n    if (!element) return;\n    const menuButton = element.querySelector('[data-key=\"midi-qol.dependentsExplorer\"]');\n    if (menuButton) {\n      const formGroup = menuButton.closest(\".form-group\");\n      if (formGroup) {\n        (formGroup as HTMLElement).style.display = \"none\";\n      }\n    }\n  });\n\n  game.settings.registerMenu(\"midi-qol\", \"troubleShooter\", {\n    name: i18n(\"midi-qol.TroubleShooter.Name\"),\n    label: \"midi-qol.TroubleShooter.Label\",\n    icon: \"fas fa-wrench\",\n    hint: i18n(\"midi-qol.TroubleShooter.Hint\"),\n    // icon: \"fas fa-dice-d20\",\n    type: TroubleShooter,\n    restricted: false\n  });\n}\n\nexport function disableWorkflowAutomation() {\n  enableWorkflow = false;\n}\n\nexport function safeGetGameSetting(moduleName: string, settingName: string): any | undefined {\n  // @ts-expect-error\n  if (game.settings.settings.get(`${moduleName}.${settingName}`))\n    //@ts-expect-error\n    return game.settings.get(moduleName, settingName);\n  else return undefined;\n}\n\n/**\n * Helper to check if save DCs should be displayed, based on dnd5e's challengeVisibility setting.\n * Replaces the deprecated midi-qol displaySaveDC setting.\n * @param actor Optional actor to check ownership for \"player\" visibility setting.\n *              When visibility is \"player\", DC is only shown if the actor has player ownership.\n * @returns true if DCs should be shown, false if hidden\n */\nexport function shouldDisplaySaveDC(actor?: Actor): boolean {\n  const visibility = safeGetGameSetting(\"dnd5e\", \"challengeVisibility\");\n  if (visibility === \"none\") return false;\n  if (visibility === \"all\") return true;\n  // \"player\" - only show DC if actor is player-owned (or no actor specified for backwards compat)\n  return !actor || (actor as any).hasPlayerOwner;\n}\n","export async function preloadTemplates() {\r\n  const templatePaths = [\r\n    \"modules/midi-qol/templates/activity-card.hbs\",\r\n    \"modules/midi-qol/templates/attack-roll.html\",\r\n    \"modules/midi-qol/templates/bonus-damage-roll.html\",\r\n    \"modules/midi-qol/templates/damage-results.html\",\r\n    \"modules/midi-qol/templates/damage-results-classic.html\",\r\n    \"modules/midi-qol/templates/damage-results-player.html\",\r\n    \"modules/midi-qol/templates/damage-results-player-classic.html\",\r\n    \"modules/midi-qol/templates/damage-roll-dialog.hbs\",\r\n    \"modules/midi-qol/templates/damage-roll.html\",\r\n    \"modules/midi-qol/templates/dialog.hbs\",\r\n    \"modules/midi-qol/templates/hits.html\",\r\n    \"modules/midi-qol/templates/other-damage-roll.html\",\r\n    \"modules/midi-qol/templates/roll-base.html\",\r\n    \"modules/midi-qol/templates/roll-dialog.hbs\",\r\n    \"modules/midi-qol/templates/roll.html\",\r\n    // \"modules/midi-qol/templates/roll-options.html\",\r\n    \"modules/midi-qol/templates/saves.html\",\r\n    \"modules/midi-qol/templates/tool-card.hbs\",\r\n    \"modules/midi-qol/templates/tooltip.html\",\r\n    \"modules/midi-qol/templates/activity/attack-effect.hbs\",\r\n    \"modules/midi-qol/templates/activity/check-effect.hbs\",\r\n    \"modules/midi-qol/templates/activity/damage-effect.hbs\",\r\n    \"modules/midi-qol/templates/activity/enchant-effect.hbs\",\r\n    \"modules/midi-qol/templates/activity/heal-effect.hbs\",\r\n    \"modules/midi-qol/templates/activity/save-effect.hbs\",\r\n    \"modules/midi-qol/templates/activity/utility-effect.hbs\",\r\n    \"modules/midi-qol/templates/activity/parts/attack-details.hbs\",\r\n    \"modules/midi-qol/templates/activity/parts/attack-extras.hbs\",\r\n    \"modules/midi-qol/templates/activity/parts/midi-activity-tab.hbs\",\r\n    \"modules/midi-qol/templates/activity/parts/save-damage.hbs\",\r\n    \"modules/midi-qol/templates/activity/parts/save-extras.hbs\",\r\n    \"modules/midi-qol/templates/activity/parts/overtime-extras.hbs\",\r\n    \"modules/midi-qol/templates/apps/ActorOnUseMacroConfig/actorOnUseMacrosConfig.hbs\",\r\n    \"modules/midi-qol/templates/apps/ConditionEditor/conditionEditor.hbs\",\r\n    \"modules/midi-qol/templates/apps/ConfigPanel/concentration.hbs\",\r\n    \"modules/midi-qol/templates/apps/ConfigPanel/footer.hbs\",\r\n    \"modules/midi-qol/templates/apps/ConfigPanel/gm.hbs\",\r\n    \"modules/midi-qol/templates/apps/ConfigPanel/mechanics.hbs\",\r\n    \"modules/midi-qol/templates/apps/ConfigPanel/misc.hbs\",\r\n    \"modules/midi-qol/templates/apps/ConfigPanel/player.hbs\",\r\n    \"modules/midi-qol/templates/apps/ConfigPanel/quick.hbs\",\r\n    \"modules/midi-qol/templates/apps/ConfigPanel/reactions.hbs\",\r\n    \"modules/midi-qol/templates/apps/ConfigPanel/rules.hbs\",\r\n    \"modules/midi-qol/templates/apps/ConfigPanel/workflow.hbs\",\r\n    \"modules/midi-qol/templates/apps/DependentsExplorer/dependentsExplorer.hbs\",\r\n    \"modules/midi-qol/templates/apps/ItemOnUseMacrosConfig/itemOnUseMacrosConfig.hbs\",\r\n    \"modules/midi-qol/templates/apps/OverTimeEditor/overTimeEditor.hbs\",\r\n    \"modules/midi-qol/templates/apps/RollStatsDisplay/config.hbs\",\r\n    \"modules/midi-qol/templates/apps/RollStatsDisplay/stats.hbs\",\r\n    \"modules/midi-qol/templates/apps/SoundConfigPanel/quick.hbs\",\r\n    \"modules/midi-qol/templates/apps/SoundConfigPanel/sounds.hbs\",\r\n    \"modules/midi-qol/templates/apps/TargetConfirmation/targetConfirmation.hbs\",\r\n    \"modules/midi-qol/templates/apps/TargetConfirmationConfig/targetConfirmationConfig.hbs\",\r\n    \"modules/midi-qol/templates/apps/ModuleReviewDialog/moduleReview.hbs\",\r\n    \"modules/midi-qol/templates/apps/TroubleShooter/common.hbs\",\r\n    \"modules/midi-qol/templates/apps/TroubleShooter/errors.hbs\",\r\n    \"modules/midi-qol/templates/apps/TroubleShooter/modules.hbs\",\r\n    \"modules/midi-qol/templates/apps/TroubleShooter/problems.hbs\",\r\n    \"modules/midi-qol/templates/apps/TroubleShooter/summary.hbs\",\r\n    \"modules/midi-qol/templates/apps/UndoWorkflow/undo-workflow.hbs\"\r\n  ];\r\n\treturn foundry.applications.handlebars.loadTemplates(templatePaths);\r\n}\r\n","import { i18n, debug, debugEnabled } from \"../midi-qol.js\";\nimport { configSettings } from \"./settings.js\";\nimport { areMidiKeysPressed, isAutoFastForward } from \"./utils.js\";\n\n/**\n * Supported dnd5e v13 actor sheet classes (ApplicationV2-based)\n */\nconst SUPPORTED_SHEETS = [\n  \"CharacterActorSheet\",\n  \"NPCActorSheet\"\n];\n\n/**\n * Set up hooks for injecting midi-qol buttons into actor sheets\n */\nexport function setupSheetQol() {\n  for (const sheetName of SUPPORTED_SHEETS) {\n    const hookName = `render${sheetName}`;\n    if (debugEnabled > 0) debug(\"Registering sheetQOL hook:\", hookName);\n    // @ts-expect-error Dynamic hook names not in HookConfig\n    Hooks.on(hookName, injectMidiButtons);\n  }\n}\n\n/**\n * Main function to inject midi buttons into the actor sheet\n * ApplicationV2 signature: (app, html, context, options)\n */\nfunction injectMidiButtons(app: any, html: HTMLElement, context?: object, options?: object) {\n  // Check if feature is enabled\n  if (!configSettings.addSheetButtons) return;\n\n  // Handle both jQuery and native element (ApplicationV2 uses native)\n  const element = html instanceof HTMLElement ? html : html[0];\n  if (!element) return;\n\n  if (debugEnabled > 0) debug(\"injectMidiButtons called for\", app.constructor.name);\n\n  // Find all item rows in the inventory and inject info icon\n  element.querySelectorAll(\".item.collapsible > .item-row\").forEach(itemRow => {\n    const itemElement = itemRow.closest(\".item\") as HTMLElement;\n    const itemId = itemElement?.dataset.itemId;\n    const item = app.document?.items?.get(itemId) ?? app.actor?.items?.get(itemId);\n    if (!item) return;\n\n    // Inject info icon after item name\n    injectInfoIcon(itemRow as HTMLElement, item);\n  });\n\n  // Find all expanded item wrappers for activity buttons\n  element.querySelectorAll(\".item.collapsible .item-description .wrapper\").forEach(wrapper => {\n    const itemElement = wrapper.closest(\".item\") as HTMLElement;\n    const itemId = itemElement?.dataset.itemId;\n    const item = app.document?.items?.get(itemId) ?? app.actor?.items?.get(itemId);\n    if (!item) return;\n\n    // Inject activity-level buttons (Attack, Damage) to each activity row\n    wrapper.querySelectorAll(\".activity-row\").forEach(activityRow => {\n      const activityId = (activityRow as HTMLElement).dataset.activityId;\n      const activity = item.system.activities?.get(activityId);\n      if (!activity) return;\n\n      injectActivityButtons(activityRow as HTMLElement, item, activity);\n    });\n  });\n\n  // Attach event handlers\n  attachMidiButtonHandlers(element, app);\n}\n\n/**\n * Inject info icon into the item row between the item icon and item name\n */\nfunction injectInfoIcon(itemRow: HTMLElement, item: any) {\n  // Check if already injected\n  if (itemRow.querySelector(\".midi-info-icon\")) return;\n\n  // Find the item-name element\n  const itemName = itemRow.querySelector(\".item-name\");\n  if (!itemName) return;\n\n  // Add a small info icon after the item image, before the name\n  const infoHtml = `<a class=\"midi-info-icon\" data-midi-action=\"info\" data-item-id=\"${item.id}\" data-tooltip=\"${i18n(\"midi-qol.buttons.showChatInfo\")}\"><i class=\"fas fa-info-circle\"></i></a>`;\n\n  // Insert after the item-image, before name-stacked\n  const itemImage = itemName.querySelector(\".item-image\");\n  if (itemImage) {\n    itemImage.insertAdjacentHTML(\"afterend\", infoHtml);\n  } else {\n    // Fallback: prepend to item-name\n    itemName.insertAdjacentHTML(\"afterbegin\", infoHtml);\n  }\n}\n\n/**\n * Inject activity-level buttons (Attack, Damage) into an activity row\n */\nfunction injectActivityButtons(activityRow: HTMLElement, item: any, activity: any) {\n  // Check if buttons already injected\n  if (activityRow.querySelector(\".midi-activity-buttons\")) return;\n\n  const buttons: string[] = [];\n  const itemId = item.id;\n  const activityId = activity.id;\n\n  if (activity.hasAttack) {\n    buttons.push(`\n      <button type=\"button\" data-midi-action=\"attack\" data-item-id=\"${itemId}\" data-activity-id=\"${activityId}\"\n              data-tooltip=\"${i18n(\"midi-qol.buttons.attack\")}\">\n        <dnd5e-icon src=\"systems/dnd5e/icons/svg/activity/attack.svg\"></dnd5e-icon>\n      </button>\n    `);\n  }\n\n  if (activity.hasDamage) {\n    buttons.push(`\n      <button type=\"button\" data-midi-action=\"damage\" data-item-id=\"${itemId}\" data-activity-id=\"${activityId}\"\n              data-tooltip=\"${i18n(\"midi-qol.buttons.damage\")}\">\n        <dnd5e-icon src=\"systems/dnd5e/icons/svg/activity/damage.svg\"></dnd5e-icon>\n      </button>\n    `);\n\n    // Add versatile button if item has versatile property (dnd5e getter)\n    if (item.isVersatile) {\n      buttons.push(`\n        <button type=\"button\" data-midi-action=\"versatile\" data-item-id=\"${itemId}\" data-activity-id=\"${activityId}\"\n                data-tooltip=\"${i18n(\"midi-qol.buttons.versatileDamage\")}\">\n          <i class=\"fas fa-hand-fist\"></i>\n        </button>\n      `);\n    }\n  }\n\n  // Add use button if activity has a rollable formula\n  if (activity.roll?.formula) {\n    buttons.push(`\n      <button type=\"button\" data-midi-action=\"use\" data-item-id=\"${itemId}\" data-activity-id=\"${activityId}\"\n              data-tooltip=\"${i18n(\"midi-qol.buttons.itemUse\")}\">\n        <dnd5e-icon src=\"systems/dnd5e/icons/svg/activity/utility.svg\"></dnd5e-icon>\n      </button>\n    `);\n  }\n\n  if (buttons.length === 0) return;\n\n  const buttonsHtml = `<div class=\"midi-activity-buttons\">${buttons.join(\"\")}</div>`;\n\n  // Append to end of activity row (after columns)\n  activityRow.insertAdjacentHTML(\"beforeend\", buttonsHtml);\n}\n\n\n/**\n * Attach click handlers to all midi buttons\n */\nfunction attachMidiButtonHandlers(html: HTMLElement, app: any) {\n  // Only attach to buttons that don't already have handlers\n  html.querySelectorAll(\"[data-midi-action]:not([data-midi-handled])\").forEach(button => {\n    button.setAttribute(\"data-midi-handled\", \"true\");\n\n    button.addEventListener(\"click\", async (event: Event) => {\n      event.preventDefault();\n      event.stopPropagation();\n\n      const btn = event.currentTarget as HTMLElement;\n      const action = btn.dataset.midiAction;\n      const itemId = btn.dataset.itemId;\n      const activityId = btn.dataset.activityId;\n\n      const actor = app.document ?? app.actor;\n      const item = actor?.items?.get(itemId);\n      if (!item) return;\n\n      if (debugEnabled > 1) debug(\"midi sheet button handler\", action, item.name, activityId);\n\n      const activity = activityId ? item.system.activities?.get(activityId) : null;\n\n      switch (action) {\n        case \"info\":\n          // Show item info card using dnd5e's displayCard\n          await item.displayCard();\n          break;\n\n        case \"attack\":\n          // Roll attack - respect midi auto fast forward and roll toggle settings\n          if (activity?.rollAttack) {\n            let configure = !isAutoFastForward(\"attack\");\n            if (areMidiKeysPressed(event as any, \"RollToggle\")) configure = !configure;\n            await activity.rollAttack({ event }, { configure }, { create: true });\n          }\n          break;\n\n        case \"damage\":\n          // Roll damage - respect midi auto fast forward and roll toggle settings\n          if (activity?.rollDamage) {\n            let configure = !isAutoFastForward(\"damage\");\n            if (areMidiKeysPressed(event as any, \"RollToggle\")) configure = !configure;\n            await activity.rollDamage({ event, versatile: false }, { configure }, { create: true });\n          }\n          break;\n\n        case \"versatile\":\n          // Roll versatile damage - respect midi auto fast forward and roll toggle settings\n          if (activity?.rollDamage) {\n            let configure = !isAutoFastForward(\"damage\");\n            if (areMidiKeysPressed(event as any, \"RollToggle\")) configure = !configure;\n            await activity.rollDamage({ event, versatile: true }, { configure }, { create: true });\n          }\n          break;\n\n        case \"use\":\n          // Use the activity (triggers full workflow including formula roll)\n          if (activity?.use) {\n            await activity.use({ event }, {}, {});\n          }\n          break;\n      }\n    });\n  });\n}\n","import { gameStats } from \"../midi-qol.js\";\nimport { RollStatsDisplay } from \"./apps/RollStatsDisplay.js\";\nimport { timedExecuteAsGM } from \"./GMAction.js\";\nimport { configSettings } from \"./settings.js\";\n\nconst blankStat = {\n  numAttacks: 0,\n  numAttack20: 0,\n  numAttackFumble: 0,\n  numAttackCritical: 0,\n  numAttackAdvantage: 0,\n  numAttackDisadvantage: 0,\n  criticalDamageTotal: 0,\n  numAttackMisses: 0,\n  attackRollsDiceTotal: 0,\n  attackRollTotal: 0,\n  numD20Rolls: 0,\n  numDamageRolls: 0,\n  damageApplied: 0,\n  damageTotal: 0,\n  numSaves: 0,\n  numSaveSuccess: 0,\n  numSaveFail: 0,\n  maxDamage: 0,\n  healingDone: 0,\n  kills: 0,\n  damageTaken: 0,\n  healingReceived: 0,\n  numConcentrationSaves: 0,\n  numConcentrationSuccess: 0,\n  numConcentrationFail: 0,\n  numDeathSaves: 0,\n  numDeathSaveSuccess: 0,\n  numDeathSaveFail: 0\n}\nlet blankStats = {\n  session: foundry.utils.duplicate(blankStat),\n  lifetime: foundry.utils.duplicate(blankStat),\n  itemStats: {},\n  sessionDamageTakenByType: {} as Record<string, number>,\n  lifetimeDamageTakenByType: {} as Record<string, number>,\n  sessionDamageDealtByType: {} as Record<string, number>,\n  lifetimeDamageDealtByType: {} as Record<string, number>,\n  sessionDamageAppliedByType: {} as Record<string, number>,\n  lifetimeDamageAppliedByType: {} as Record<string, number>\n}\n\n/**\n * Discriminated union of stat update messages sent from clients to GM.\n * Each client sends only the raw roll data; the GM applies it as\n * increments to its authoritative copy.\n */\nexport type StatUpdateMessage =\n  | { type: \"attackRoll\"; actorId: string; userId: string | undefined; itemName: string; rawRoll: number; fumble: boolean; critical: boolean; total: number; advantageMode: number }\n  | { type: \"damage\"; actorId: string; userId: string | undefined; itemName: string; hpDamage: number; totalDamage: number; maxDamage: number; healingDone: number; kills: number; hasAttackActivity: boolean; critical: boolean }\n  | { type: \"saveResult\"; actorId: string; userId: string | undefined; itemName: string; numSaves: number; numSuccess: number; numFail: number }\n  | { type: \"damageTaken\"; actorId: string; hpDamage: number; damageByType: Record<string, number> }\n  | { type: \"damageDealtByType\"; actorId: string; userId: string | undefined; dealtByType: Record<string, number>; appliedByType: Record<string, number> }\n  | { type: \"concentrationResult\"; actorId: string; success: boolean }\n  | { type: \"deathSaveResult\"; actorId: string; successes: number; failures: number };\n\nexport class RollStats {\n  currentStats: Record<string, Stats>;\n\n  public showStats() {\n    new RollStatsDisplay({ stats: this, playersOnly: configSettings.playerStatsOnly }).render({force: true});\n  }\n\n  getEntityStats(id?: string | null, collection?: ValidCollection) {\n    if (!id || !collection) return;\n    if (!this.currentStats[id]) {\n      const entity = collection?.get(id) as Actor.Implementation | User.Implementation | undefined;\n      if (!entity) return;\n      if (entity instanceof Actor && configSettings.playerStatsOnly && !entity.hasPlayerOwner) return;\n      if (entity instanceof User && configSettings.playerStatsOnly && entity.isGM) return;\n      this.currentStats[id] = foundry.utils.duplicate({...blankStats, name: collection?.get(id)?.name ?? \"\"});\n    } else {\n      this.currentStats[id] = foundry.utils.mergeObject(this.currentStats[id], blankStats,\n        { overwrite: false, inplace: true, insertKeys: true, insertValues: true });\n    }\n    // Sanitize any NaN/undefined numeric fields from corrupted or old stats\n    for (const scope of [this.currentStats[id].session, this.currentStats[id].lifetime]) {\n      for (const key of Object.keys(blankStat) as Array<keyof typeof blankStat>) {\n        if (!Number.isFinite(scope[key])) scope[key] = 0;\n      }\n    }\n    return this.currentStats[id];\n  }\n\n  public prepareStats(): Record<string, Stats> {\n    const stats = foundry.utils.duplicate(this.currentStats) as Record<string, Stats>;\n    Object.keys(stats).forEach(aid => {\n      const actStats = stats[aid];\n      const lifetime = actStats.lifetime;\n      const session = actStats.session;\n      lifetime.attackRollAverage = this.toPrecision(lifetime.attackRollTotal / (lifetime.numAttacks || 1), 1);\n      session.attackRollAverage = this.toPrecision(session.attackRollTotal / (session.numAttacks || 1), 1);\n\n      lifetime.damageTotalAverage = this.toPrecision(lifetime.damageTotal / (lifetime.numAttacks || 1), 1);\n      session.damageTotalAverage = this.toPrecision(session.damageTotal / (session.numAttacks || 1), 1);\n\n      lifetime.damageAppliedAverage = this.toPrecision(lifetime.damageApplied / (lifetime.numAttacks || 1), 1);\n      session.damageAppliedAverage = this.toPrecision(session.damageApplied / (session.numAttacks || 1), 1);\n\n      lifetime.hitRate = this.toPrecision(lifetime.numDamageRolls / (lifetime.numAttacks || 1) * 100, 0);\n      session.hitRate = this.toPrecision(session.numDamageRolls / (session.numAttacks || 1) * 100, 0);\n\n      lifetime.criticalDamageAverage = this.toPrecision(lifetime.criticalDamageTotal / (lifetime.numAttackCritical || 1), 1);\n      session.criticalDamageAverage = this.toPrecision(session.criticalDamageTotal / (session.numAttackCritical || 1), 1);\n\n      Object.keys(actStats.itemStats).forEach(iid => {\n        for (const itemStats of [actStats.itemStats[iid].session, actStats.itemStats[iid].lifetime]) {\n          if (!itemStats) continue;\n          itemStats.attackRollAverage = this.toPrecision(itemStats.attackRollTotal / (itemStats.numAttacks || 1), 1);\n          itemStats.damageTotalAverage = this.toPrecision(itemStats.damageTotal / (itemStats.numAttacks || 1), 1);\n          itemStats.damageAppliedAverage = this.toPrecision(itemStats.damageApplied / (itemStats.numAttacks || 1), 1);\n          itemStats.criticalDamageAverage = this.toPrecision(itemStats.criticalDamageTotal / (itemStats.numAttackCritical || 1), 1);\n        }\n      })\n    });\n    return stats;\n  }\n\n  getItemStats(item: Item.Implementation | undefined, itemName: string, id: string, collection: ValidCollection) {\n    if (!itemName) return { name: \"\", session: foundry.utils.duplicate(blankStat) as InnerStats, lifetime: foundry.utils.duplicate(blankStat) as InnerStats };\n    let currentStats = this.getEntityStats(id, collection);\n    if (!currentStats) return;\n    if (!currentStats.itemStats[itemName]) {\n      currentStats.itemStats[itemName] = { name: itemName, session: foundry.utils.duplicate(blankStat), lifetime: foundry.utils.duplicate(blankStat) }\n    }\n    // Backfill lifetime for pre-existing itemStats that lack it\n    if (!currentStats.itemStats[itemName].lifetime) {\n      currentStats.itemStats[itemName].lifetime = foundry.utils.duplicate(blankStat);\n    }\n    // Sanitize any NaN/undefined numeric fields from corrupted or old stats\n    for (const scope of [currentStats.itemStats[itemName].session, currentStats.itemStats[itemName].lifetime]) {\n      for (const key of Object.keys(blankStat) as Array<keyof typeof blankStat>) {\n        if (!Number.isFinite(scope[key])) scope[key] = 0;\n      }\n    }\n    return currentStats.itemStats[itemName];\n  }\n\n  rollCount: number;\n  constructor() {\n    this.currentStats = game.settings.get(\"midi-qol\", \"RollStats\");\n    this.rollCount = 0;\n  }\n\n  async endSession() {\n    if (!game.user?.isGM) return;\n    Object.keys(this.currentStats).forEach(actorId => {\n      this.currentStats[actorId].session = foundry.utils.duplicate(blankStat);\n      Object.values(this.currentStats[actorId].itemStats).forEach(item => {\n        item.session = foundry.utils.duplicate(blankStat);\n      });\n      this.currentStats[actorId].sessionDamageTakenByType = {};\n      this.currentStats[actorId].sessionDamageDealtByType = {};\n      this.currentStats[actorId].sessionDamageAppliedByType = {};\n    });\n    await game.settings.set(\"midi-qol\", \"RollStats\", this.currentStats);\n  }\n\n  async clearStats() {\n    if (!game.user?.isGM) return;\n    this.currentStats = {};\n    await game.settings.set(\"midi-qol\", \"RollStats\", {});\n  }\n  async clearActorStats(actorId: string) {\n    timedExecuteAsGM(\"removeStatsForActorId\", {\n      actorId: actorId\n    });\n  }\n\n  GMremoveActorStats(actorId: string) {\n    if (!game.user?.isGM) return;\n    delete this.currentStats[actorId];\n    game.settings.set(\"midi-qol\", \"RollStats\", this.currentStats);\n  }\n\n  toPrecision(number: number, digits: number) {\n    if (!Number.isFinite(number)) return 0;\n    return Math.round(number * (10 ** digits)) / (10 ** digits);\n  }\n\n  public get statData() {\n    return this.prepareStats();\n\n  }\n\n  public fetchStats() {\n    this.currentStats = game.settings.get(\"midi-qol\", \"RollStats\");\n  }\n\n  // ==================== Client-side methods ====================\n  // These send raw roll data to the GM via socket. The GM applies\n  // the increments to its authoritative copy (see GMrecordStats).\n\n  public addDamage(hpDamage: number, totalDamage: number, item: Item.Implementation | undefined, maxDamage: number = 0, healingDone: number = 0, kills: number = 0, critical: boolean = false) {\n    const actorId = item?.actor?.id;\n    if (!actorId) return;\n    // @ts-expect-error no dnd5e-types for activities\n    const hasAttackActivity = !!(item && item.system.activities?.some(a => a.hasAttack));\n    const userId = (game.user && item!.actor!.testUserPermission(game.user, \"OWNER\")) ? game.user.id : undefined;\n    timedExecuteAsGM(\"recordStats\", {\n      type: \"damage\", actorId, userId, itemName: item?.name ?? \"\",\n      hpDamage, totalDamage, maxDamage, healingDone, kills, hasAttackActivity, critical\n    } satisfies StatUpdateMessage);\n    Hooks.callAll(\"midi-qol.StatsUpdated\");\n  }\n\n  public addSaveResult(numSaves: number, numSuccess: number, numFail: number, item: Item.Implementation) {\n    const actorId = item?.actor?.id;\n    if (!actorId) return;\n    const userId = (game.user && item.actor!.testUserPermission(game.user, \"OWNER\")) ? game.user.id : undefined;\n    timedExecuteAsGM(\"recordStats\", {\n      type: \"saveResult\", actorId, userId, itemName: item.name,\n      numSaves, numSuccess, numFail\n    } satisfies StatUpdateMessage);\n    Hooks.callAll(\"midi-qol.StatsUpdated\");\n  }\n\n  public addAttackRoll({ rawRoll, fumble, critical, total, advantageMode }: { rawRoll: number; fumble: boolean; critical: boolean; total: number; advantageMode: number }, item: Item.Implementation) {\n    const actorId = item.actor?.id;\n    if (!actorId) return;\n    const userId = (game.user && item.actor?.testUserPermission(game.user, \"OWNER\")) ? game.user.id : undefined;\n    timedExecuteAsGM(\"recordStats\", {\n      type: \"attackRoll\", actorId, userId, itemName: item.name,\n      rawRoll, fumble, critical, total, advantageMode\n    } satisfies StatUpdateMessage);\n    Hooks.callAll(\"midi-qol.StatsUpdated\");\n  }\n\n  public addDamageTaken(actorId: string, hpDamage: number, damageByType: Record<string, number>) {\n    if (!actorId || hpDamage === 0) return;\n    timedExecuteAsGM(\"recordStats\", {\n      type: \"damageTaken\", actorId, hpDamage, damageByType\n    } satisfies StatUpdateMessage);\n    Hooks.callAll(\"midi-qol.StatsUpdated\");\n  }\n\n  public addDamageDealtByType(item: Item.Implementation, dealtByType: Record<string, number>, appliedByType: Record<string, number>) {\n    const actorId = item?.actor?.id;\n    if (!actorId) return;\n    const userId = (game.user && item.actor!.testUserPermission(game.user, \"OWNER\")) ? game.user.id : undefined;\n    timedExecuteAsGM(\"recordStats\", {\n      type: \"damageDealtByType\", actorId, userId, dealtByType, appliedByType\n    } satisfies StatUpdateMessage);\n  }\n\n  public addConcentrationResult(actor: Actor.Implementation, success: boolean) {\n    const actorId = actor?.id;\n    if (!actorId) return;\n    timedExecuteAsGM(\"recordStats\", {\n      type: \"concentrationResult\", actorId, success\n    } satisfies StatUpdateMessage);\n    Hooks.callAll(\"midi-qol.StatsUpdated\");\n  }\n\n  public addDeathSaveResult(actor: Actor.Implementation, successes: number, failures: number) {\n    const actorId = actor?.id;\n    if (!actorId) return;\n    timedExecuteAsGM(\"recordStats\", {\n      type: \"deathSaveResult\", actorId, successes, failures\n    } satisfies StatUpdateMessage);\n    Hooks.callAll(\"midi-qol.StatsUpdated\");\n  }\n\n  // ==================== GM-side recording ====================\n  // Only runs on the GM. Applies raw roll data as increments to\n  // the authoritative stats. Called via socket from any client.\n\n  /**\n   * GM-only: apply a stat update message as increments to the authoritative stats.\n   * This is the single entry point for all stat recording, ensuring no race conditions.\n   */\n  public async GMrecordStats(msg: StatUpdateMessage) {\n    if (!game.user?.isGM) return;\n\n    switch (msg.type) {\n      case \"attackRoll\":\n        this._recordAttackRoll(msg);\n        break;\n      case \"damage\":\n        this._recordDamage(msg);\n        break;\n      case \"saveResult\":\n        this._recordSaveResult(msg);\n        break;\n      case \"damageTaken\":\n        this._recordDamageTaken(msg);\n        break;\n      case \"damageDealtByType\":\n        this._recordDamageDealtByType(msg);\n        break;\n      case \"concentrationResult\":\n        this._recordConcentrationResult(msg);\n        break;\n      case \"deathSaveResult\":\n        this._recordDeathSaveResult(msg);\n        break;\n    }\n\n    // Periodic save\n    this.rollCount = (this.rollCount + 1) % Math.max(1, configSettings.saveStatsEvery);\n    if (this.rollCount === 0) {\n      await game.settings.set(\"midi-qol\", \"RollStats\", this.currentStats);\n    }\n  }\n\n  private _getPlayerStats(actorId: string, userId: string | undefined): Stats | undefined {\n    if (!userId) return undefined;\n    const user = game.users?.get(userId);\n    if (!user) return undefined;\n    const actor = game.actors?.get(actorId);\n    if (!actor || !actor.testUserPermission(user, \"OWNER\")) return undefined;\n    return this.getEntityStats(userId, game.users);\n  }\n\n  private _recordAttackRoll(msg: Extract<StatUpdateMessage, { type: \"attackRoll\" }>) {\n    const actorStats = this.getEntityStats(msg.actorId, game.actors);\n    if (!actorStats) return;\n    const playerStats = this._getPlayerStats(msg.actorId, msg.userId);\n\n    for (const stats of [actorStats, playerStats]) {\n      if (!stats) continue;\n      const itemData = (stats === actorStats)\n        ? this.getItemStats(undefined, msg.itemName, msg.actorId, game.actors!)\n        : this.getItemStats(undefined, msg.itemName, msg.userId ?? \"\", game.users!);\n      for (const s of [stats.session, stats.lifetime, itemData?.session, itemData?.lifetime]) {\n        if (!s) continue;\n        s.numAttacks += 1;\n        if (msg.rawRoll === 20) s.numAttack20 += 1;\n        if (msg.critical) s.numAttackCritical += 1;\n        if (msg.fumble) s.numAttackFumble += 1;\n        s.attackRollsDiceTotal += msg.rawRoll;\n        s.attackRollTotal += msg.total;\n        if (msg.advantageMode === 1) s.numAttackAdvantage += 1;\n        else if (msg.advantageMode === -1) s.numAttackDisadvantage += 1;\n      }\n    }\n  }\n\n  private _recordDamage(msg: Extract<StatUpdateMessage, { type: \"damage\" }>) {\n    const actorStats = this.getEntityStats(msg.actorId, game.actors);\n    if (!actorStats) return;\n    const playerStats = this._getPlayerStats(msg.actorId, msg.userId);\n    const didDamage = msg.totalDamage > 0 || msg.hpDamage > 0;\n\n    for (const stats of [actorStats, playerStats]) {\n      if (!stats) continue;\n      const itemData = (stats === actorStats)\n        ? this.getItemStats(undefined, msg.itemName, msg.actorId, game.actors!)\n        : this.getItemStats(undefined, msg.itemName, msg.userId ?? \"\", game.users!);\n      for (const s of [stats.session, stats.lifetime, itemData?.session, itemData?.lifetime]) {\n        if (!s) continue;\n        const isItemStats = (s === itemData?.session || s === itemData?.lifetime);\n        if (didDamage) {\n          s.numDamageRolls += 1;\n          s.damageApplied += msg.hpDamage;\n          s.damageTotal += msg.totalDamage;\n          s.maxDamage = Math.max(s.maxDamage, msg.maxDamage);\n          if (msg.critical) s.criticalDamageTotal += msg.totalDamage;\n        } else if (msg.healingDone > 0 && isItemStats) {\n          s.numDamageRolls += 1;\n          s.damageApplied -= msg.healingDone;\n          s.damageTotal -= msg.healingDone;\n        }\n        s.healingDone += msg.healingDone;\n        s.kills += msg.kills;\n        if ((didDamage || msg.healingDone > 0) && !msg.hasAttackActivity) {\n          s.numAttacks += 1;\n        }\n      }\n    }\n  }\n\n  private _recordSaveResult(msg: Extract<StatUpdateMessage, { type: \"saveResult\" }>) {\n    const actorStats = this.getEntityStats(msg.actorId, game.actors);\n    if (!actorStats) return;\n    const playerStats = this._getPlayerStats(msg.actorId, msg.userId);\n\n    for (const stats of [actorStats, playerStats]) {\n      if (!stats) continue;\n      const itemData = (stats === actorStats)\n        ? this.getItemStats(undefined, msg.itemName, msg.actorId, game.actors!)\n        : this.getItemStats(undefined, msg.itemName, msg.userId ?? \"\", game.users!);\n      for (const s of [stats.session, stats.lifetime, itemData?.session, itemData?.lifetime]) {\n        if (!s) continue;\n        s.numSaves += msg.numSaves;\n        s.numSaveSuccess += msg.numSuccess;\n        s.numSaveFail += msg.numFail;\n      }\n    }\n  }\n\n  private _recordDamageTaken(msg: Extract<StatUpdateMessage, { type: \"damageTaken\" }>) {\n    const actorStats = this.getEntityStats(msg.actorId, game.actors);\n    if (!actorStats) return;\n    if (msg.hpDamage > 0) {\n      actorStats.session.damageTaken += msg.hpDamage;\n      actorStats.lifetime.damageTaken += msg.hpDamage;\n      for (const [type, amount] of Object.entries(msg.damageByType)) {\n        if (amount <= 0) continue;\n        actorStats.sessionDamageTakenByType[type] = (actorStats.sessionDamageTakenByType[type] ?? 0) + amount;\n        actorStats.lifetimeDamageTakenByType[type] = (actorStats.lifetimeDamageTakenByType[type] ?? 0) + amount;\n      }\n    } else {\n      const healing = Math.abs(msg.hpDamage);\n      actorStats.session.healingReceived += healing;\n      actorStats.lifetime.healingReceived += healing;\n    }\n  }\n\n  private _recordDamageDealtByType(msg: Extract<StatUpdateMessage, { type: \"damageDealtByType\" }>) {\n    const actorStats = this.getEntityStats(msg.actorId, game.actors);\n    if (!actorStats) return;\n    const playerStats = this._getPlayerStats(msg.actorId, msg.userId);\n\n    for (const stats of [actorStats, playerStats]) {\n      if (!stats) continue;\n      for (const [type, amount] of Object.entries(msg.dealtByType)) {\n        if (amount <= 0) continue;\n        stats.sessionDamageDealtByType[type] = (stats.sessionDamageDealtByType[type] ?? 0) + amount;\n        stats.lifetimeDamageDealtByType[type] = (stats.lifetimeDamageDealtByType[type] ?? 0) + amount;\n      }\n      for (const [type, amount] of Object.entries(msg.appliedByType)) {\n        if (amount <= 0) continue;\n        stats.sessionDamageAppliedByType[type] = (stats.sessionDamageAppliedByType[type] ?? 0) + amount;\n        stats.lifetimeDamageAppliedByType[type] = (stats.lifetimeDamageAppliedByType[type] ?? 0) + amount;\n      }\n    }\n  }\n\n  private _recordConcentrationResult(msg: Extract<StatUpdateMessage, { type: \"concentrationResult\" }>) {\n    const actorStats = this.getEntityStats(msg.actorId, game.actors);\n    if (!actorStats) return;\n    for (const s of [actorStats.session, actorStats.lifetime]) {\n      s.numConcentrationSaves += 1;\n      if (msg.success) s.numConcentrationSuccess += 1;\n      else s.numConcentrationFail += 1;\n    }\n  }\n\n  private _recordDeathSaveResult(msg: Extract<StatUpdateMessage, { type: \"deathSaveResult\" }>) {\n    const actorStats = this.getEntityStats(msg.actorId, game.actors);\n    if (!actorStats) return;\n    for (const s of [actorStats.session, actorStats.lifetime]) {\n      s.numDeathSaves += 1;\n      s.numDeathSaveSuccess += msg.successes;\n      s.numDeathSaveFail += msg.failures;\n    }\n  }\n\n  // ==================== Legacy GM methods ====================\n\n  public exportToJSON() {\n    const data = this.currentStats;\n    const filename = `fvtt-midi-qol-stats.json`;\n    foundry.utils.saveDataToFile(JSON.stringify(data, null, 2), \"text/json\", filename);\n  }\n\n  public headerLine: string = `\"Actor\", \"Item Name\", \"#Attacks\", \"# Nat20\", \"#Fumbles\", \"#Critical\", \"#Advantage\", \"#Disadvantage\", \"Critical Damage Total\", \"Attack Roll Dice Total\", \"Attack Roll Total\", \"Damage Rolls\", \"Total Damage Applied\", \"Damage Total\", \"#Saves\", \"#Save Success\", \"#Save Fail\", \"Max Damage\", \"Max Heal\", \"Kills\", \"Damage Taken\", \"Healing Received\", \"#Conc Saves\", \"#Conc Success\", \"#Conc Fail\", \"#Death Saves\", \"#Death Save Success\", \"#Death Save Fail\"`;\n  dumpStatLine(actorName: string, itemName: string, stats: InnerStats): string {\n    return `\"${actorName}\",\"${itemName}\", ${stats.numAttacks || 0}, ${stats.numAttack20 || 0}, ${stats.numAttackFumble || 0}, ${stats.numAttackCritical || 0}, ${stats.numAttackAdvantage || 0}, ${stats.numAttackDisadvantage || 0}, ${stats.criticalDamageTotal || 0}, ${stats.attackRollsDiceTotal || 0}, ${stats.attackRollTotal || 0}, ${stats.numDamageRolls || 0}, ${stats.damageApplied || 0}, ${stats.damageTotal || 0}, ${stats.numSaves || 0}, ${stats.numSaveSuccess || 0}, ${stats.numSaveFail || 0}, ${stats.maxDamage || 0}, ${stats.healingDone || 0}, ${stats.kills || 0}, ${stats.damageTaken || 0}, ${stats.healingReceived || 0}, ${stats.numConcentrationSaves || 0}, ${stats.numConcentrationSuccess || 0}, ${stats.numConcentrationFail || 0}, ${stats.numDeathSaves || 0}, ${stats.numDeathSaveSuccess || 0}, ${stats.numDeathSaveFail || 0}`\n  }\n  public exportToCSV() {\n    let csvText: string = foundry.utils.duplicate(this.headerLine) + \"\\n\";\n    for (const period of [\"session\", \"lifetime\"] as const) {\n      for (let actorStats of Object.values(this.currentStats)) {\n        csvText += this.dumpStatLine(actorStats.name, period, actorStats[period]) + \"\\n\";\n        for (let itemStat of Object.values(actorStats.itemStats)) {\n          csvText += this.dumpStatLine(actorStats.name, `${itemStat.name} (${period})`, itemStat[period]) + \"\\n\";\n        }\n      }\n    }\n    const filename = `fvtt-midi-qol-stats.csv`;\n    foundry.utils.saveDataToFile(csvText, \"text/csv\", filename);\n  }\n\n  public async saveStats() {\n    if (game.user?.isGM) {\n      await game.settings.set(\"midi-qol\", \"RollStats\", this.currentStats);\n    } else {\n      await timedExecuteAsGM(\"saveAllStats\", {});\n    }\n  }\n\n  public async GMsaveAllStats() {\n    if (!game.user?.isGM) return;\n    await game.settings.set(\"midi-qol\", \"RollStats\", this.currentStats);\n  }\n}\n\ntype InnerStats = {\n  numAttacks: number;\n  numAttack20: number;\n  numAttackFumble: number;\n  numAttackCritical: number;\n  numAttackAdvantage: number;\n  numAttackDisadvantage: number;\n  criticalDamageTotal: number;\n  numAttackMisses: number;\n  attackRollsDiceTotal: number;\n  attackRollTotal: number;\n  numD20Rolls: number;\n  numDamageRolls: number;\n  damageApplied: number;\n  damageTotal: number;\n  numSaves: number;\n  numSaveSuccess: number;\n  numSaveFail: number;\n  maxDamage: number;\n  healingDone: number;\n  kills: number;\n  damageTaken: number;\n  healingReceived: number;\n  numConcentrationSaves: number;\n  numConcentrationSuccess: number;\n  numConcentrationFail: number;\n  numDeathSaves: number;\n  numDeathSaveSuccess: number;\n  numDeathSaveFail: number;\n  attackRollAverage?: number;\n  damageTotalAverage?: number;\n  damageAppliedAverage?: number;\n  criticalDamageAverage?: number;\n  hitRate?: number;\n};\ntype ItemStats = {\n  name: string;\n  session: InnerStats;\n  lifetime: InnerStats;\n};\nexport type Stats = {\n  name: string;\n  session: InnerStats;\n  lifetime: InnerStats;\n  itemStats: Record<string, ItemStats>;\n  sessionDamageTakenByType: Record<string, number>;\n  lifetimeDamageTakenByType: Record<string, number>;\n  sessionDamageDealtByType: Record<string, number>;\n  lifetimeDamageDealtByType: Record<string, number>;\n  sessionDamageAppliedByType: Record<string, number>;\n  lifetimeDamageAppliedByType: Record<string, number>;\n};\ntype ValidCollection = foundry.documents.collections.Actors | foundry.documents.collections.Users;\n","import { error, i18n } from \"../midi-qol.js\";\n\nexport class MidiKeyManager {\n  constructor() {\n  }\n  \n  initKeyMappings() {\n    if (!game.keybindings) {\n      error(\"MidiKeyManager | initKeyMappings | Game is not initialized\");\n      return;\n    }\n    const keybindings = game.keybindings;\n    const normalPrecedence = CONST.KEYBINDING_PRECEDENCE.NORMAL;\n\n    keybindings.register(\"midi-qol\", \"NoOptionalRules\", {\n      name: \"midi-qol.NoOptionalRules.Name\",\n      hint: \"midi-qol.NoOptionalRules.Hint\",\n      editable: [\n      ],\n      restricted: true,                         // Restrict this Keybinding to gamemaster only?\n      precedence: normalPrecedence\n    });\n    keybindings.register(\"midi-qol\", \"Versatile\", {\n      name: i18n(\"DND5E.Versatile\") ?? \"Versatile\",\n      hint: \"midi-qol.KeysVersatile.Hint\",\n      editable: [\n        { key: \"KeyV\" },\n      ],\n      restricted: false,                         // Restrict this Keybinding to gamemaster only?\n      precedence: normalPrecedence\n    });\n\n    keybindings.register(\"midi-qol\", \"RollToggle\", {\n      name: i18n(\"midi-qol.RollToggle.Name\") ?? \"Roll Toggle\",\n      hint: i18n(\"midi-qol.RollToggle.Hint\"),\n      editable: [\n        { key: \"KeyF\" }\n      ],\n      restricted: false,                         // Restrict this Keybinding to gamemaster only?\n      precedence: normalPrecedence\n    });\n  }\n}\n\n\n","import { i18n } from \"../../midi-qol.js\";\nimport { configSettings } from \"../settings.js\";\nimport { removeMostRecentWorkflow, undoDataQueue, undoMostRecentWorkflow } from \"../undo.js\";\nconst { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;\n\nexport class UndoWorkflow extends HandlebarsApplicationMixin(ApplicationV2) {\n  undoAddedHookId: number;\n  undoRemovedHookId: number;\n\n  constructor(options) {\n    super(options);\n    this.undoAddedHookId = Hooks.on(\"midi-qol.addUndoEntry\", () => {this.render()});\n    this.undoRemovedHookId = Hooks.on(\"midi-qol.removeUndoEntry\", () => {this.render()});\n    if (!configSettings.undoWorkflow) {\n      configSettings.undoWorkflow = true;\n      game.settings.set(\"midi-qol\", \"ConfigSettings\", configSettings);\n      ui.notifications?.warn(\"Undo Workflow enabled\");\n    }\n  }\n  \n  static override PARTS = {\n    main: { template: \"modules/midi-qol/templates/apps/UndoWorkflow/undo-workflow.hbs\" },\n  };\n  \n  static override DEFAULT_OPTIONS = {\n    id: \"midi-qol-undo-workflow\",\n    window: {\n      title: \"midi-qol.UndoWorkflow.title\",\n      resizable: true,\n      contentClasses: [\"standard-form\"]\n    },\n    position: {\n      width: 400,\n      height: 700\n    }\n  };\n  \n  async _prepareContext(options) {\n    const context: any = await super._prepareContext(options);\n    context.entries = [];\n    context.queueSize = new TextEncoder().encode(JSON.stringify(undoDataQueue)).length.toLocaleString();\n    context.queueCount = undoDataQueue.length;\n    for (let undoEntry of undoDataQueue) {\n      const entry: any = {};\n      entry.actorName = undoEntry.actorName;\n      entry.itemName = undoEntry.itemName;\n      entry.userName = undoEntry.userName;\n      entry.targets = [];\n      for (let targetEntry of undoEntry.allTargets ?? []) {\n        entry.targets.push(targetEntry);\n      }\n      context.entries.push(entry)\n    }\n    return context;\n  }\n\n  async _onRender(context, options) {\n    super._onRender(context, options);\n    this.element.querySelector(\"#undo-first-workflow\")?.addEventListener(\"click\", (e) => {\n      undoMostRecentWorkflow();\n    });\n    this.element.querySelector(\"#remove-first-workflow\")?.addEventListener(\"click\", (e) => {\n      removeMostRecentWorkflow();\n    })\n  }\n\n  get title() {\n    return i18n(\"midi-qol.UndoWorkflow.title\") ?? \"Undo Workflow\";\n  }\n\n  async close(options = {}) {\n    Hooks.off(\"midi-qol.addUndoEntry\", this.undoAddedHookId);\n    Hooks.off(\"midi-qol.removeUndoEntry\", this.undoRemovedHookId);\n    return super.close(options);\n  }\n}\n\nexport function showUndoWorkflowApp() {\n  if (game.user?.isGM) {\n    new UndoWorkflow({}).render({force: true});\n  } else {\n    ui.notifications?.warn(\"midi-qol.UndoWorkflow.GMOnly\")\n  }\n}","export class ChatLogMidi extends globalThis.dnd5e.applications.ChatLog5e {\n  #lastId: string | undefined;\n  #renderingBatch = false;\n  #renderingQueue = new foundry.utils.Semaphore(1);\n  #overflowingDebounce = foundry.utils.debounce(this.#setOverflowing.bind(this), 100);\n  #pruneDebounce = foundry.utils.debounce(this.#doPrune.bind(this), 100);\n  #renderedIds = new Set<string>(); // Track rendered messages per-instance\n\n  #doPrune() {\n    const scroll = this.element?.querySelector(\".chat-scroll .chat-log\");\n    const count = scroll?.children.length ?? 0;\n    const maxSize = CONFIG.ChatMessage.batchSize ?? 25;\n    if (count >= maxSize * 2) {\n      for (let index = 0; index < count - maxSize; index++) {\n        const firstChild = scroll?.firstElementChild;\n        const messageId = firstChild?.dataset?.messageId;\n        // Update per-instance tracking\n        if (messageId) this.#renderedIds.delete(messageId);\n        // Only main sidebar updates message.logged for compatibility\n        if (!this.isPopout && messageId) {\n          const message = game.messages?.get(messageId);\n          if (message) message.logged = false;\n        }\n        firstChild?.remove();\n        this.#lastId = messageId;\n      }\n    }\n  }\n\n  async pruneElement() {\n    this.#pruneDebounce();\n  }\n\n  async scrollBottom({ popout = false, waitImages = false, scrollOptions = {} } = {}) {\n    if (!this.rendered) return;\n    // Each instance prunes its own DOM independently\n    this.pruneElement();\n    return super.scrollBottom({ popout, waitImages, scrollOptions });\n  }\n\n  /** @inheritDoc */\n  async close(options = {}) {\n    // Clear per-instance state so reopening renders fresh\n    this.#renderedIds.clear();\n    this.#lastId = undefined;\n    return super.close(options);\n  }\n\n  async #doRenderBatch(size: number) {\n    if (!this.rendered) {\n      this.#renderingBatch = false;\n      return;\n    }\n\n    const messages = game.messages?.contents;\n    if (!messages) return;\n    const log = this.element?.querySelector(\".chat-log\");\n    if (!log) return;\n\n    // Get the index of the last rendered chat message\n    let lastIdx = messages.findIndex(m => m.id === this.#lastId);\n    lastIdx = lastIdx > -1 ? lastIdx : messages.length;\n    if (!lastIdx) {\n      this.#renderingBatch = false;\n      return;\n    }\n\n    // Get the next batch to render\n    const targetIdx = Math.max(lastIdx - size, 0);\n    const elements: HTMLElement[] = [];\n    for (let i = targetIdx; i < lastIdx; i++) {\n      const message = messages[i];\n      if (!message.visible) continue;\n      // Use per-instance tracking to prevent duplicate rendering\n      // This allows main log and popout to render independently\n      if (this.#renderedIds.has(message.id!)) continue;\n      this.#renderedIds.add(message.id!);\n      // Update message.logged for main sidebar only (for compatibility with core/other modules)\n      if (!this.isPopout) message.logged = true;\n      try {\n        //@ts-expect-error renderMessage exists on constructor\n        elements.push(await this.constructor.renderMessage(message));\n      } catch (err) {\n        Hooks.onError(\"ChatLog#doRenderBatch\", err as Error, {\n          msg: `Chat message ${message.id} failed to render`,\n          log: \"error\"\n        });\n      }\n    }\n\n    // Prepend the HTML\n    log.prepend(...elements);\n    this.#lastId = messages[targetIdx].id;\n    this.#renderingBatch = false;\n    if (!this.isPopout) this.#overflowingDebounce();\n  }\n\n  #setOverflowing() {\n    const scroll = this.element?.querySelector(\".chat-scroll\");\n    scroll?.classList.toggle(\"overflowed\", scroll.scrollHeight > scroll.offsetHeight);\n  }\n\n  async renderBatch(size: number) {\n    if (this.#renderingBatch) return;\n    this.#renderingBatch = true;\n    return this.#renderingQueue.add(this.#doRenderBatch.bind(this), size);\n  }\n}\n","/**\n * Midi-qol specific completions injected into macro-autocomplete via hook.\n *\n * Registers a \"macro-autocomplete.ready\" hook handler that injects:\n * - MidiQOL namespace (all API functions)\n * - workflow top-level variable (tracker, targets, hitTargets, etc.)\n * - scope midi-specific fields (workflow, macroPass, hitTargets, etc.)\n * - args[0] midi-specific info\n */\n\ninterface CompletionEntry {\n  type?: string;\n  detail?: string;\n  info?: string;\n  children?: CompletionNode;\n  staticChildren?: CompletionNode;\n  instanceChildren?: CompletionNode;\n  constructorDetail?: string;\n}\n\ninterface CompletionNode {\n  [key: string]: CompletionEntry;\n}\n\nconst MIDI_COMPLETIONS: CompletionNode = {\n  MidiQOL: {\n    children: {\n      // Workflow classes\n      Workflow: {\n        type: \"class\", detail: \"class\", info: \"Main workflow class\",\n        children: {\n          getWorkflow: { type: \"function\", detail: \"(uuid) => Workflow\", info: \"Get a workflow by its message UUID\" },\n        }\n      },\n      DamageOnlyWorkflow: { type: \"class\", detail: \"class\", info: \"Workflow for damage-only rolls\" },\n      TrapWorkflow: { type: \"class\", detail: \"class\", info: \"Workflow for trap effects\" },\n      RollModifierTracker: { type: \"class\", detail: \"class\", info: \"Tracks roll modifiers (advantage, critical, etc.)\" },\n\n      // Item/activity use\n      completeItemUse: { type: \"function\", detail: \"(item, config?, dialog?, message?) => Promise<Workflow>\", info: \"Complete an item use workflow.\\n- item: Item or UUID string\\n- config.chooseActivity: show dialog to pick activity\\n- config.midiOptions: {advantage, disadvantage, critical, fastForward, targetUuids, ...}\\nReturns: Workflow or undefined\" },\n      completeActivityUse: { type: \"function\", detail: \"(activity, usage?, dialog?, message?) => Promise<Workflow>\", info: \"Complete an activity use workflow.\\n- activity: Activity or UUID string\\n- usage.midiOptions: {advantage, disadvantage, critical, fastForward, fastForwardAttack, fastForwardDamage, targetUuids, targetsToUse, rollAs, ignoreUserTargets, ...}\\nReturns: Workflow or undefined\" },\n\n      // Distance and targeting\n      computeDistance: { type: \"function\", detail: \"(token1, token2, options?) => number\", info: \"Compute distance between two tokens in grid units.\\n- options.wallsBlock: block if no LOS (default false)\\n- options.includeCover: include cover calc (default true)\\n- options.includeElevation: include height difference\\nReturns: distance or -1 if fully blocked\" },\n      checkDistance: { type: \"function\", detail: \"(t1, t2, distance, options?) => boolean\", info: \"Check if two tokens are within a given distance.\\n- distance: max distance in grid units\\n- options.wallsBlock: block if no LOS (default false)\\n- options.includeCover: include cover calc (default true)\\nReturns: true if distance <= threshold\" },\n      findNearby: { type: \"function\", detail: \"(disposition, token, distance, options?) => Token[]\", info: \"Find all tokens within distance matching disposition.\\n- disposition: -1=hostile, 0=neutral, 1=friendly, null/\\\"all\\\"=any, or array\\n- options: {includeIncapacitated, canSee, isSeen, includeToken, maxSize, relative}\\n- relative (default true): disposition relative to token\\nReturns: Token[]\" },\n      findNearbyCount: { type: \"function\", detail: \"(disposition, token, distance, options?) => number\", info: \"Count tokens within distance matching disposition.\\n- disposition: -1=hostile, 0=neutral, 1=friendly, null/\\\"all\\\"=any, or array\\n- options: {includeIncapacitated, canSee, isSeen, includeToken, maxSize, relative}\\nReturns: number of matching tokens\" },\n      checkNearby: { type: \"function\", detail: \"(disposition, token, distance, options?) => boolean\", info: \"Check if any token is within distance matching disposition.\\n- disposition: -1=hostile, 0=neutral, 1=friendly, null/\\\"all\\\"=any\\n- options: {includeIncapacitated, canSee, isSeen, includeToken, maxSize, relative}\\nReturns: true if at least one match found\" },\n      computeCoverBonus: { type: \"function\", detail: \"(attacker, target, activity?) => number\", info: \"Compute cover AC bonus for target against attacker.\\n- attacker/target: Token or TokenDocument\\n- activity: optional, used for ignore-cover checks\\nReturns: 0=none, 2=half, 5=three-quarters, 999=full\" },\n      checkActivityRange: { type: \"function\", detail: \"(activity, token, targets?, showWarning?) => object\", info: \"Check if targets are within activity's range.\\n- showWarning: display UI warning if out of range (default true)\\nReturns: {result, attackingToken, range, longRange}\\n- result: \\\"normal\\\", \\\"longRange\\\", or \\\"outOfRange\\\"\" },\n      selectTargetsFromTemplates: { type: \"function\", detail: \"(templates, selfTokenRef?, ignoreSelf?, AoETargetType?, autoTarget?) => Token[]\", info: \"Target tokens in template area and update game.user.targets.\\n- AoETargetType: \\\"any\\\", \\\"enemy\\\", \\\"ally\\\", \\\"self\\\", \\\"neutral\\\"\\n- autoTarget: \\\"none\\\", \\\"wallsBlock\\\", \\\"wallsBlockIgnoreDefeated\\\", \\\"wallsBlockIgnoreIncapacitated\\\", \\\"walledtemplates\\\"\\nReturns: Token[]\" },\n      computeTargetsFromTemplates: { type: \"function\", detail: \"(templates, selfTokenRef?, ignoreSelf?, AoETargetType?, autoTarget?) => Token[]\", info: \"Compute tokens in template area WITHOUT modifying game.user.targets.\\n- AoETargetType: \\\"any\\\", \\\"enemy\\\", \\\"ally\\\", \\\"self\\\", \\\"neutral\\\"\\n- autoTarget: \\\"none\\\", \\\"wallsBlock\\\", \\\"wallsBlockIgnoreDefeated\\\", \\\"wallsBlockIgnoreIncapacitated\\\"\\nReturns: Token[]\" },\n\n      // Conditions and effects\n      hasCondition: { type: \"function\", detail: \"(actorRef, condition) => 0 | 1\", info: \"Check if actor/token has a condition.\\n- actorRef: Actor, Token, TokenDocument, or UUID string\\n- condition: status id (e.g. \\\"prone\\\", \\\"blinded\\\", \\\"concentrating\\\", \\\"stunned\\\")\\nReturns: 1 if condition exists, 0 if not or immune\" },\n      checkIncapacitated: { type: \"function\", detail: \"(actorRef?, log?, warn?) => string | false\", info: \"Check if actor is incapacitated.\\n- actorRef: Actor, Token, or UUID string\\n- log: log result to console (default true)\\n- warn: show UI warning (default false)\\nReturns: condition name (e.g. \\\"dead\\\", \\\"unconscious\\\") or false\" },\n      createConditionData: { type: \"function\", detail: \"({actor, condition, ...}) => object\", info: \"Create condition/rollData for evalCondition.\\n- Fields: {workflow, target, actor, item, activity, token, extraData, options}\\nReturns: object with rollData, damage info, combat state for condition evaluation\" },\n      getConcentrationEffect: { type: \"function\", detail: \"(actor?, item?) => ActiveEffect | undefined\", info: \"Get the concentration effect for an actor\" },\n      addConcentrationDependent: { type: \"function\", detail: \"(actorRef, dependent, item?) => Promise\", info: \"Add a concentration dependent\" },\n      createEffects: { type: \"function\", detail: \"({actorUuid, effects, options}) => Promise<boolean>\", info: \"Create active effects on an actor (runs as GM).\\n- actorUuid: actor UUID string\\n- effects: array of ActiveEffect.CreateData objects\\n- options: {keepId: boolean}\\nReturns: true on success, false on failure\" },\n      removeEffects: { type: \"function\", detail: \"({actorUuid, effects}) => Promise<boolean>\", info: \"Remove active effects from an actor (runs as GM).\\n- actorUuid: actor UUID string\\n- effects: array of effect ID strings\\nReturns: true on success, false on failure\" },\n      updateEffects: { type: \"function\", detail: \"({actorUuid, updates}) => Promise\", info: \"Update effects on an actor by UUID\" },\n      chooseEffect: { type: \"function\", detail: \"({actor, token?, item?, ...}) => Promise<ActiveEffect | false>\", info: \"Show dialog to choose which effect to apply from an item.\\n- Fields: {actor, token, item, workflow, options}\\n- options.chooseAll: auto-apply all without dialog\\n- options.timeout: dialog timeout in ms\\nReturns: selected ActiveEffect or false\" },\n\n      // Damage\n      applyTokenDamage: { type: \"function\", detail: \"(damageDetail, totalDamage, targets, item, saves, options?) => Promise<string[]>\", info: \"Apply damage to a set of tokens, creating damage cards.\\n- damageDetail: [{value, type, properties}] array\\n- targets/saves: Set<Token>\\n- options: {workflow, superSavers, semiSuperSavers, forceApply, noConcentrationCheck}\\nReturns: array of damage card UUIDs\" },\n      applyTokenDamageMany: { type: \"function\", detail: \"(targetDamages, item, options?) => Promise<string[]>\", info: \"Apply different damage/healing amounts to multiple targets, producing a single damage card.\\n- targetDamages: [{token, damageDetail, totalDamage}] — each entry has its own damage detail and total\\n- item: Item responsible for the damage (used for card display)\\n- options: {workflow, forceApply, updateOptions}\\nReturns: array of damage card UUIDs\" },\n      createDamageDetail: { type: \"function\", detail: \"({roll, activity, defaultType?}) => DamageDescription[]\", info: \"Create damage detail from roll results.\\n- roll: Roll or Roll[]\\n- activity: Activity (for damage type info)\\n- defaultType: fallback damage type\\nReturns: [{value, type, formula, properties}]\" },\n      getTraitMult: { type: \"function\", detail: \"(actor, damageType, item, props?) => number\", info: \"Get damage trait multiplier for an actor.\\n- damageType: e.g. \\\"fire\\\", \\\"slashing\\\", \\\"healing\\\"\\n- props: string[] of damage properties (e.g. \\\"mgc\\\")\\nReturns: -1=healing, 0=immune, 0.5=resistant, 1=normal, 2=vulnerable\" },\n      modifyDamageBy: { type: \"function\", detail: \"({damageItem, value, multiplier?, type?, reason?}) => object\", info: \"Modify damage during isDamaged macro pass only.\\n- damageItem: DamageListEntry from workflow\\n- value: amount to add/subtract\\n- multiplier: optional damage multiplier\\n- type/reason: for logging\\nReturns: damage modification object\" },\n\n      // Rolls\n      addRollTo: { type: \"function\", detail: \"(roll, bonusRoll) => Roll\", info: \"Add a bonus roll to another roll\" },\n      doConcentrationCheck: { type: \"function\", detail: \"(actor, saveDC) => Promise<Roll>\", info: \"Perform a concentration check\" },\n      contestedRoll: { type: \"function\", detail: \"(data) => Promise<{result, rolls}>\", info: \"Perform a contested roll between two actors.\\n- data.source/target: {rollType, ability, token, rollOptions}\\n- rollType: \\\"test\\\" (ability check), \\\"save\\\", \\\"skill\\\"\\n- data.success/failure/drawn: callback functions\\nReturns: {result: number (+source wins, -target wins, 0=draw), rolls}\" },\n      displayDSNForRoll: { type: \"function\", detail: \"(rolls?, rollType?, rollMode?) => Promise\", info: \"Display Dice So Nice 3D dice animation\" },\n      sumRolls: { type: \"function\", detail: \"(rolls?, countHealing?) => number\", info: \"Sum roll results\" },\n      computeAbilityAdvantage: { type: \"function\", detail: \"(actor, ability) => string | null\", info: \"Compute advantage/disadvantage for ability roll\" },\n      computeSkillAdvantage: { type: \"function\", detail: \"(actor, skill) => string | null\", info: \"Compute advantage/disadvantage for skill roll\" },\n      computeToolAdvantage: { type: \"function\", detail: \"(actor, tool) => string | null\", info: \"Compute advantage/disadvantage for tool check\" },\n\n      // Token/actor helpers\n      tokenForActor: { type: \"function\", detail: \"(actor) => Token | undefined\", info: \"Get the first token for an actor\" },\n      actorFromUuid: { type: \"function\", detail: \"(uuid?) => Actor | null\", info: \"Get actor from UUID string\" },\n      playerFor: { type: \"function\", detail: \"(target?) => User | null\", info: \"Get the player controlling a token\" },\n      playerForActor: { type: \"function\", detail: \"(actor?) => User | undefined\", info: \"Get the player controlling an actor\" },\n      getTokenPlayerName: { type: \"function\", detail: \"(token, checkGM?) => string\", info: \"Get the player name controlling a token\" },\n      raceOrType: { type: \"function\", detail: \"(entity) => string\", info: \"Get race (PCs) or creature type (NPCs)\" },\n      sizeNumeric: { type: \"function\", detail: \"(size: string) => number | undefined\", info: \"Get numerical size index (0=tiny, 1=sm, 2=med, 3=lg, 4=huge, 5=grg). Accepts short keys (\\\"sm\\\", \\\"lg\\\") or long names (\\\"Small\\\", \\\"Large\\\"), case insensitive.\" },\n      typeOrRace: { type: \"function\", detail: \"(entity) => string\", info: \"Get creature type (NPCs) or race (PCs)\" },\n      canSee: { type: \"function\", detail: \"(token, target) => boolean\", info: \"Check if token can see target (sight-based detection only).\\n- token/target: Token, TokenDocument, or UUID string\\nReturns: true if token has line of sight to target\" },\n      canSense: { type: \"function\", detail: \"(token, target, validModes?) => boolean\", info: \"Check if token can detect target via detection modes.\\n- validModes: [\\\"all\\\"] (default), or specific modes:\\n  \\\"basicSight\\\", \\\"lightPerception\\\", \\\"blindsight\\\", \\\"darkvision\\\", \\\"tremorsense\\\", \\\"truesight\\\"\\nReturns: true if any valid mode detects target\" },\n      canSenseModes: { type: \"function\", detail: \"(token, target, validModes?) => string[]\", info: \"Get detection modes token can use to sense target\" },\n      getOrCreateTokenForActor: { type: \"function\", detail: \"(actor?) => Token | undefined\", info: \"Get or create a token for an actor\" },\n      moveToken: { type: \"function\", detail: \"(tokenRef, newCenter, options?) => Promise\", info: \"Move a token to a new position (runs as GM). Uses Foundry's TokenDocument.move() for proper hook/region support.\\n- tokenRef: Token, TokenDocument, or UUID string\\n- newCenter: {x, y, elevation?} canvas center coordinates; elevation in grid units (default: unchanged)\\n- options: {animate?, teleport?, ignoreWalls?, ignoreTokens?, autoRotate?}\\n  animate: animate the movement (default true); false = instant but still checks walls/tokens\\n  teleport: instant move, ignores walls and tokens (default false)\\n  ignoreWalls: ignore wall collisions (default false)\\n  ignoreTokens: ignore token blocking (default false)\\n  autoRotate: rotate token to face movement direction (default false)\" },\n      moveTokenAwayFromPoint: { type: \"function\", detail: \"(targetRef, distance, point, options?) => Promise\", info: \"Push a token away from a point (runs as GM). Uses Foundry's TokenDocument.move() for proper hook/region support.\\n- targetRef: Token, TokenDocument, or UUID string\\n- distance: distance to push in grid units\\n- point: {x, y} origin point to push away from\\n- options: {animate?, teleport?, ignoreWalls?, ignoreTokens?, autoRotate?}\\n  animate: animate the movement (default true)\\n  teleport: instant move, ignores walls and tokens (default false)\\n  ignoreWalls: ignore wall collisions (default false)\\n  ignoreTokens: ignore token blocking (default false)\\n  autoRotate: rotate token to face movement direction (default false)\" },\n      teleportToken: { type: \"function\", detail: \"(tokenRef, destination) => Promise\", info: \"Teleport a token instantly (runs as GM). Supports cross-scene teleportation.\\n- tokenRef: Token, TokenDocument, or UUID string\\n- destination: {x, y, elevation?, sceneUuid?}\\n  x, y: center coordinates on destination scene\\n  elevation: elevation in grid units (optional)\\n  sceneUuid: destination scene UUID (omit for same scene)\" },\n\n      // Action economy\n      hasUsedReaction: { type: \"function\", detail: \"(actor) => boolean\", info: \"Check if reaction has been used this turn\" },\n      hasUsedBonusAction: { type: \"function\", detail: \"(actor) => boolean\", info: \"Check if bonus action has been used this turn\" },\n      setReactionUsed: { type: \"function\", detail: \"(actor, active?) => Promise\", info: \"Mark reaction as used (or remove if false)\" },\n      setBonusActionUsed: { type: \"function\", detail: \"(actor) => Promise\", info: \"Mark bonus action as used\" },\n      removeReactionUsed: { type: \"function\", detail: \"(actor, force?) => Promise\", info: \"Remove reaction used flag\" },\n      removeBonusActionUsed: { type: \"function\", detail: \"(actor, force?) => Promise\", info: \"Remove bonus action used flag\" },\n      removeActionUsed: { type: \"function\", detail: \"(actor) => Promise\", info: \"Remove action used flag\" },\n\n      // Over-time effects\n      doOverTimeEffect: { type: \"function\", detail: \"(actor, effect, startTurn?, options?) => Promise\", info: \"Execute an over-time effect\" },\n\n      // Conditions helpers\n      removeHiddenCondition: { type: \"function\", detail: \"(tokenRef?) => Promise\", info: \"Remove hidden condition from token\" },\n      removeInvisibleCondition: { type: \"function\", detail: \"(tokenRef?) => Promise\", info: \"Remove invisible condition from token\" },\n\n      // Undo\n      undoMostRecentWorkflow: { type: \"function\", detail: \"() => Promise\", info: \"Undo the most recent workflow\" },\n      showUndoQueue: { type: \"function\", detail: \"()\", info: \"Display the undo queue\" },\n      getUndoQueue: { type: \"function\", detail: \"() => ChatMessage[]\", info: \"Get the undo queue\" },\n\n      // Macro resolution\n      resolveItemMacro: { type: \"function\", detail: \"(item, macroName, macroText, rollData) => Promise\", info: \"Resolve and execute an item macro\" },\n      resolveActivityMacro: { type: \"function\", detail: \"(activity, macroName, macroText, rollData) => Promise\", info: \"Resolve and execute an activity macro\" },\n\n      // Condition evaluation\n      evalCondition: { type: \"function\", detail: \"(condition, conditionData, options?) => any\", info: \"Evaluate a condition expression using roll data.\\n- condition: formula string with @references, number, or boolean\\n- conditionData: rollData object (from createConditionData)\\n- options: {errorReturn (default false), async (default false)}\\nReturns: evaluated result (boolean/number), or Promise if async\" },\n      evalAllConditions: { type: \"function\", detail: \"(actorRef, flag, conditionData) => Promise<boolean>\", info: \"Evaluate all conditions for a flag\" },\n\n      // Settings and config\n      configSettings: { type: \"function\", detail: \"() => object\", info: \"Get current midi-qol configuration settings\" },\n      checkRule: { type: \"function\", detail: \"(rule) => any\", info: \"Get the value of a configured rule\" },\n      safeGetGameSetting: { type: \"function\", detail: \"(scope, key) => any\", info: \"Safely get a game setting\" },\n      enableWorkflow: { type: \"function\", detail: \"(workflowType) => boolean\", info: \"Check if a workflow type is enabled\" },\n\n      // Vitality system\n      hasVitalitySystem: { type: \"function\", detail: \"(actor?) => boolean\", info: \"Check if actor uses vitality system\" },\n      getVitalityItem: { type: \"function\", detail: \"(actor?) => Item | undefined\", info: \"Get the vitality item for an actor\" },\n      getVitalityValue: { type: \"function\", detail: \"(actor?) => number | undefined\", info: \"Get current vitality value\" },\n      getVitalityMax: { type: \"function\", detail: \"(actor?) => number | undefined\", info: \"Get max vitality value\" },\n\n      // Origin / item resolution\n      getItemFromEffectOrigin: { type: \"function\", detail: \"(origin: string) => Item | undefined\", info: \"Resolve an effect's origin to the source Item, traversing concentration and other ActiveEffect chains. Handles recursive origins with cycle detection.\" },\n\n      // Misc\n      showItemInfo: { type: \"function\", detail: \"(item) => Promise<ChatMessage>\", info: \"Show item information in chat\" },\n      getChanges: { type: \"function\", detail: \"(actorOrItem, key) => ActiveEffect[]\", info: \"Get effects that modify a specific key\" },\n      addDependent: { type: \"function\", detail: \"(document, dependent) => void\", info: \"Add a dependent to a document\" },\n\n      // Localization\n      i18n: { type: \"function\", detail: \"(key) => string\", info: \"Localize a string key\" },\n      i18nFormat: { type: \"function\", detail: \"(key, data?) => string\", info: \"Localize and format a string key\" },\n\n      // Logging\n      debug: { type: \"function\", detail: \"(...args) => void\", info: \"Log debug message (only when debug enabled)\" },\n      log: { type: \"function\", detail: \"(...args) => void\", info: \"Log normal message\" },\n      warn: { type: \"function\", detail: \"(...args) => void\", info: \"Log warning message\" },\n      error: { type: \"function\", detail: \"(...args) => void\", info: \"Log error message\" },\n    }\n  },\n\n  workflow: {\n    type: \"variable\", detail: \"Workflow\", info: \"The midi-qol workflow instance\",\n    children: {\n      tracker: {\n        type: \"property\", detail: \"RollModifierTracker\", info: \"The attack roll modifier tracker\",\n        children: {\n          advantage: {\n            type: \"property\", detail: \"AdvantageDisadvantageTracker\", info: \"Advantage sub-tracker\",\n            children: {\n              add: { type: \"method\", detail: \"(source?, displayName?)\", info: \"Add a source of advantage\" },\n              clear: { type: \"method\", detail: \"()\", info: \"Clear active state\" },\n              suppress: { type: \"method\", detail: \"(source?, displayName?)\", info: \"Suppress advantage\" },\n              setOverride: { type: \"method\", detail: \"(source?, displayName?)\", info: \"Force advantage, bypassing suppression\" },\n              clearOverride: { type: \"method\", detail: \"()\", info: \"Clear override state\" },\n              reset: { type: \"method\", detail: \"()\", info: \"Reset all state\" },\n              isActive: { type: \"property\", detail: \"true | undefined\", info: \"Computed final state\" },\n              isAdded: { type: \"property\", detail: \"boolean\", info: \"Whether at least one source was added\" },\n              isSuppressed: { type: \"property\", detail: \"boolean\", info: \"Whether suppressed\" },\n              hasOverride: { type: \"property\", detail: \"boolean\", info: \"Whether override is set\" },\n              get: { type: \"property\", detail: \"{ active, suppressed, override }\", info: \"Full state snapshot\" },\n            }\n          },\n          disadvantage: {\n            type: \"property\", detail: \"AdvantageDisadvantageTracker\", info: \"Disadvantage sub-tracker\",\n            children: {\n              add: { type: \"method\", detail: \"(source?, displayName?)\", info: \"Add a source of disadvantage\" },\n              clear: { type: \"method\", detail: \"()\", info: \"Clear active state\" },\n              suppress: { type: \"method\", detail: \"(source?, displayName?)\", info: \"Suppress disadvantage\" },\n              setOverride: { type: \"method\", detail: \"(source?, displayName?)\", info: \"Force disadvantage, bypassing suppression\" },\n              clearOverride: { type: \"method\", detail: \"()\", info: \"Clear override state\" },\n              reset: { type: \"method\", detail: \"()\", info: \"Reset all state\" },\n              isActive: { type: \"property\", detail: \"true | undefined\", info: \"Computed final state\" },\n              isAdded: { type: \"property\", detail: \"boolean\", info: \"Whether at least one source was added\" },\n              isSuppressed: { type: \"property\", detail: \"boolean\", info: \"Whether suppressed\" },\n              hasOverride: { type: \"property\", detail: \"boolean\", info: \"Whether override is set\" },\n              get: { type: \"property\", detail: \"{ active, suppressed, override }\", info: \"Full state snapshot\" },\n            }\n          },\n          critical: {\n            type: \"property\", detail: \"CriticalFumbleTracker\", info: \"Critical hit sub-tracker\",\n            children: {\n              setNatural: { type: \"method\", detail: \"(source, displayName?)\", info: \"Set from dice roll\" },\n              force: { type: \"method\", detail: \"(source, displayName?)\", info: \"Force critical hit\" },\n              suppress: { type: \"method\", detail: \"(source, displayName?)\", info: \"Prevent critical hit\" },\n              setOverride: { type: \"method\", detail: \"(value, source, displayName?)\", info: \"Absolute control (true=force, false=prevent)\" },\n              clearOverride: { type: \"method\", detail: \"()\", info: \"Clear override\" },\n              reset: { type: \"method\", detail: \"()\", info: \"Reset all state\" },\n              isActive: { type: \"property\", detail: \"boolean\", info: \"Computed final critical state\" },\n              isNatural: { type: \"property\", detail: \"boolean\", info: \"From dice roll\" },\n              isForced: { type: \"property\", detail: \"boolean\", info: \"Forced by flag\" },\n              isSuppressed: { type: \"property\", detail: \"boolean\", info: \"Prevented by flag\" },\n              hasOverride: { type: \"property\", detail: \"boolean\", info: \"Override is set\" },\n            }\n          },\n          fumble: {\n            type: \"property\", detail: \"CriticalFumbleTracker\", info: \"Fumble sub-tracker\",\n            children: {\n              setNatural: { type: \"method\", detail: \"(source, displayName?)\", info: \"Set from dice roll\" },\n              force: { type: \"method\", detail: \"(source, displayName?)\", info: \"Force fumble\" },\n              suppress: { type: \"method\", detail: \"(source, displayName?)\", info: \"Prevent fumble\" },\n              setOverride: { type: \"method\", detail: \"(value, source, displayName?)\", info: \"Absolute control\" },\n              clearOverride: { type: \"method\", detail: \"()\", info: \"Clear override\" },\n              reset: { type: \"method\", detail: \"()\", info: \"Reset all state\" },\n              isActive: { type: \"property\", detail: \"boolean\", info: \"Computed final fumble state\" },\n              isNatural: { type: \"property\", detail: \"boolean\", info: \"From dice roll\" },\n              isForced: { type: \"property\", detail: \"boolean\", info: \"Forced by flag\" },\n              isSuppressed: { type: \"property\", detail: \"boolean\", info: \"Prevented by flag\" },\n              hasOverride: { type: \"property\", detail: \"boolean\", info: \"Override is set\" },\n            }\n          },\n          modifiers: {\n            type: \"property\", detail: \"RollValueTracker\", info: \"Roll value modifier sub-tracker\",\n            children: {\n              fail: { type: \"method\", detail: \"(source, displayName?)\", info: \"Set auto-fail\" },\n              succeed: { type: \"method\", detail: \"(source, displayName?)\", info: \"Set auto-success\" },\n              min: { type: \"method\", detail: \"(value, source, displayName?)\", info: \"Set minimum roll value\" },\n              max: { type: \"method\", detail: \"(value, source, displayName?)\", info: \"Set maximum roll value\" },\n              forceMin: { type: \"method\", detail: \"(value, source, displayName?)\", info: \"Force minimum roll value\" },\n              forceMax: { type: \"method\", detail: \"(value, source, displayName?)\", info: \"Force maximum roll value\" },\n              reset: { type: \"method\", detail: \"()\", info: \"Reset all state\" },\n              willFail: { type: \"property\", detail: \"boolean\", info: \"Auto-fail is set\" },\n              willSucceed: { type: \"property\", detail: \"boolean\", info: \"Auto-success is set\" },\n              minValue: { type: \"property\", detail: \"number\", info: \"Minimum roll value\" },\n              maxValue: { type: \"property\", detail: \"number\", info: \"Maximum roll value\" },\n            }\n          },\n          hasAdvantage: { type: \"property\", detail: \"true | undefined\", info: \"Effective advantage state\" },\n          hasDisadvantage: { type: \"property\", detail: \"true | undefined\", info: \"Effective disadvantage state\" },\n          isCritical: { type: \"property\", detail: \"boolean\", info: \"Computed final critical state\" },\n          isFumble: { type: \"property\", detail: \"boolean\", info: \"Computed final fumble state\" },\n          advantageMode: { type: \"property\", detail: \"number\", info: \"ADV_MODE.ADVANTAGE, NORMAL, or DISADVANTAGE\" },\n          attribution: { type: \"property\", detail: \"object\", info: \"Attribution map { ADV: {...}, DIS: {...} }\" },\n          reset: { type: \"method\", detail: \"(options?)\", info: \"Reset all sub-trackers and attribution\" },\n        }\n      },\n      targets: {\n        type: \"property\", detail: \"Set<Token5e>\", info: \"The targeted tokens\",\n        children: {\n          size: { type: \"property\", detail: \"number\", info: \"Number of elements in the set\" },\n          has: { type: \"method\", detail: \"(value) => boolean\", info: \"Check if a value is in the set\" },\n          add: { type: \"method\", detail: \"(value) => Set\", info: \"Add a value to the set\" },\n          delete: { type: \"method\", detail: \"(value) => boolean\", info: \"Remove a value from the set\" },\n          clear: { type: \"method\", detail: \"() => void\", info: \"Remove all elements\" },\n          forEach: { type: \"method\", detail: \"(callback) => void\", info: \"Execute a function for each element\" },\n          values: { type: \"method\", detail: \"() => Iterator\", info: \"Returns an iterator of values\" },\n          first: { type: \"method\", detail: \"() => Token5e | undefined\", info: \"Get the first element (Foundry Set)\" },\n        }\n      },\n      hitTargets: {\n        type: \"property\", detail: \"Set<Token5e>\", info: \"Tokens that were hit\",\n        children: {\n          size: { type: \"property\", detail: \"number\", info: \"Number of elements in the set\" },\n          has: { type: \"method\", detail: \"(value) => boolean\", info: \"Check if a value is in the set\" },\n          add: { type: \"method\", detail: \"(value) => Set\", info: \"Add a value to the set\" },\n          delete: { type: \"method\", detail: \"(value) => boolean\", info: \"Remove a value from the set\" },\n          clear: { type: \"method\", detail: \"() => void\", info: \"Remove all elements\" },\n          forEach: { type: \"method\", detail: \"(callback) => void\", info: \"Execute a function for each element\" },\n          values: { type: \"method\", detail: \"() => Iterator\", info: \"Returns an iterator of values\" },\n          first: { type: \"method\", detail: \"() => Token5e | undefined\", info: \"Get the first element (Foundry Set)\" },\n        }\n      },\n      failedSaves: {\n        type: \"property\", detail: \"Set<Token5e>\", info: \"Tokens that failed saves\",\n        children: {\n          size: { type: \"property\", detail: \"number\", info: \"Number of elements in the set\" },\n          has: { type: \"method\", detail: \"(value) => boolean\", info: \"Check if a value is in the set\" },\n          add: { type: \"method\", detail: \"(value) => Set\", info: \"Add a value to the set\" },\n          delete: { type: \"method\", detail: \"(value) => boolean\", info: \"Remove a value from the set\" },\n          forEach: { type: \"method\", detail: \"(callback) => void\", info: \"Execute a function for each element\" },\n          values: { type: \"method\", detail: \"() => Iterator\", info: \"Returns an iterator of values\" },\n          first: { type: \"method\", detail: \"() => Token5e | undefined\", info: \"Get the first element (Foundry Set)\" },\n        }\n      },\n      savedTargets: {\n        type: \"property\", detail: \"Set<Token5e>\", info: \"Tokens that succeeded saves\",\n        children: {\n          size: { type: \"property\", detail: \"number\", info: \"Number of elements in the set\" },\n          has: { type: \"method\", detail: \"(value) => boolean\", info: \"Check if a value is in the set\" },\n          add: { type: \"method\", detail: \"(value) => Set\", info: \"Add a value to the set\" },\n          delete: { type: \"method\", detail: \"(value) => boolean\", info: \"Remove a value from the set\" },\n          forEach: { type: \"method\", detail: \"(callback) => void\", info: \"Execute a function for each element\" },\n          values: { type: \"method\", detail: \"() => Iterator\", info: \"Returns an iterator of values\" },\n          first: { type: \"method\", detail: \"() => Token5e | undefined\", info: \"Get the first element (Foundry Set)\" },\n        }\n      },\n      actor: {\n        type: \"property\", detail: \"Actor5e\", info: \"The D&D 5e actor performing the action\",\n        children: {\n          system: {\n            type: \"property\", detail: \"object\", info: \"Actor system data\",\n            children: {\n              abilities: { type: \"property\", detail: \"object\", info: \"Ability scores { str, dex, con, int, wis, cha }\" },\n              attributes: { type: \"property\", detail: \"object\", info: \"Actor attributes (hp, ac, movement, etc.)\" },\n              skills: { type: \"property\", detail: \"object\", info: \"Skill data\" },\n              traits: { type: \"property\", detail: \"object\", info: \"Damage/condition traits (di, dr, dv, ci)\" },\n              details: { type: \"property\", detail: \"object\", info: \"Character details (level, cr, race)\" },\n              spells: { type: \"property\", detail: \"object\", info: \"Spell slots\" },\n            }\n          },\n          items: { type: \"property\", detail: \"Collection<Item5e>\", info: \"Actor's item collection\" },\n          effects: { type: \"property\", detail: \"Collection<ActiveEffect5e>\", info: \"Actor's active effects\" },\n          classes: { type: \"property\", detail: \"object\", info: \"Character's class items\" },\n          rollAbilityTest: { type: \"method\", detail: \"(abilityId, options?) => Promise<D20Roll>\", info: \"Roll an ability check\" },\n          rollAbilitySave: { type: \"method\", detail: \"(abilityId, options?) => Promise<D20Roll>\", info: \"Roll a saving throw\" },\n          rollSkill: { type: \"method\", detail: \"(skillId, options?) => Promise<D20Roll>\", info: \"Roll a skill check\" },\n          applyDamage: { type: \"method\", detail: \"(amount, options?) => Promise<Actor5e>\", info: \"Apply damage/healing\" },\n          getRollData: { type: \"method\", detail: \"() => object\", info: \"Get data for roll formulas\" },\n          getFlag: { type: \"method\", detail: \"(scope, key) => any\", info: \"Get a flag value\" },\n          setFlag: { type: \"method\", detail: \"(scope, key, value) => Promise\", info: \"Set a flag value\" },\n        }\n      },\n      item: {\n        type: \"property\", detail: \"Item5e\", info: \"The D&D 5e item being used\",\n        children: {\n          system: {\n            type: \"property\", detail: \"object\", info: \"Item system data\",\n            children: {\n              description: { type: \"property\", detail: \"object\", info: \"Item description\" },\n              damage: { type: \"property\", detail: \"object\", info: \"Damage configuration\" },\n              save: { type: \"property\", detail: \"object\", info: \"Save configuration\" },\n              range: { type: \"property\", detail: \"object\", info: \"Range configuration\" },\n              target: { type: \"property\", detail: \"object\", info: \"Target configuration\" },\n              duration: { type: \"property\", detail: \"object\", info: \"Duration configuration\" },\n              uses: { type: \"property\", detail: \"object\", info: \"Limited uses\" },\n              level: { type: \"property\", detail: \"number\", info: \"Spell level\" },\n              properties: { type: \"property\", detail: \"Set<string>\", info: \"Item properties\" },\n            }\n          },\n          activities: { type: \"property\", detail: \"Collection<Activity>\", info: \"Item's activities\" },\n          effects: { type: \"property\", detail: \"Collection<ActiveEffect>\", info: \"Item's effects\" },\n          actor: { type: \"property\", detail: \"Actor5e | null\", info: \"Owning actor\" },\n          use: { type: \"method\", detail: \"(config?, dialog?, message?) => Promise<ChatMessage[]>\", info: \"Use the item\" },\n          getRollData: { type: \"method\", detail: \"() => object\", info: \"Get data for roll formulas\" },\n          getFlag: { type: \"method\", detail: \"(scope, key) => any\", info: \"Get a flag value\" },\n          setFlag: { type: \"method\", detail: \"(scope, key, value) => Promise\", info: \"Set a flag value\" },\n        }\n      },\n      activity: {\n        type: \"property\", detail: \"Activity\", info: \"The D&D 5e activity being used\",\n      },\n      token: {\n        type: \"property\", detail: \"Token5e\", info: \"The D&D 5e token performing the action\",\n        children: {\n          actor: { type: \"property\", detail: \"Actor5e | null\", info: \"The actor this token represents\" },\n          document: { type: \"property\", detail: \"TokenDocument5e\", info: \"The token document\" },\n          name: { type: \"property\", detail: \"string\", info: \"Token display name\" },\n          center: { type: \"property\", detail: \"{ x, y }\", info: \"Token center point\" },\n          visible: { type: \"property\", detail: \"boolean\", info: \"Whether token is visible\" },\n          inCombat: { type: \"property\", detail: \"boolean\", info: \"Whether token is in combat\" },\n        }\n      },\n      isCritical: { type: \"property\", detail: \"boolean\", info: \"Whether the attack is a critical hit\" },\n      isFumble: { type: \"property\", detail: \"boolean\", info: \"Whether the attack is a fumble\" },\n      attackRoll: {\n        type: \"property\", detail: \"D20Roll\", info: \"The attack roll\",\n        children: {\n          total: { type: \"property\", detail: \"number\", info: \"The total result of the roll\" },\n          formula: { type: \"property\", detail: \"string\", info: \"The roll formula\" },\n          result: { type: \"property\", detail: \"string\", info: \"The roll result string\" },\n          terms: { type: \"property\", detail: \"RollTerm[]\", info: \"The parsed roll terms\" },\n          dice: { type: \"property\", detail: \"DiceTerm[]\", info: \"The dice terms in the roll\" },\n          isCritical: { type: \"property\", detail: \"boolean\", info: \"Whether the roll is a natural 20\" },\n          isFumble: { type: \"property\", detail: \"boolean\", info: \"Whether the roll is a natural 1\" },\n          hasAdvantage: { type: \"property\", detail: \"boolean\", info: \"Whether rolled with advantage\" },\n          hasDisadvantage: { type: \"property\", detail: \"boolean\", info: \"Whether rolled with disadvantage\" },\n          toMessage: { type: \"method\", detail: \"(messageData?, options?) => Promise<ChatMessage>\", info: \"Send the roll to chat\" },\n        }\n      },\n      attackTotal: { type: \"property\", detail: \"number\", info: \"Attack roll total\" },\n      damageRolls: {\n        type: \"property\", detail: \"DamageRoll[]\", info: \"Damage rolls\",\n        children: {\n          length: { type: \"property\", detail: \"number\", info: \"Number of damage rolls\" },\n          forEach: { type: \"method\", detail: \"(callback) => void\", info: \"Execute a function for each roll\" },\n          map: { type: \"method\", detail: \"(callback) => Array\", info: \"Map each roll to a new value\" },\n          filter: { type: \"method\", detail: \"(callback) => DamageRoll[]\", info: \"Filter damage rolls\" },\n          reduce: { type: \"method\", detail: \"(callback, initial?) => any\", info: \"Reduce damage rolls to a value\" },\n          find: { type: \"method\", detail: \"(callback) => DamageRoll | undefined\", info: \"Find a damage roll matching a condition\" },\n        }\n      },\n      damageTotal: { type: \"property\", detail: \"number\", info: \"Total damage\" },\n      damageDetail: {\n        type: \"property\", detail: \"object[]\", info: \"Damage breakdown by type\",\n        children: {\n          length: { type: \"property\", detail: \"number\", info: \"Number of damage entries\" },\n          forEach: { type: \"method\", detail: \"(callback) => void\", info: \"Execute a function for each entry\" },\n          map: { type: \"method\", detail: \"(callback) => Array\", info: \"Map each entry to a new value\" },\n          filter: { type: \"method\", detail: \"(callback) => object[]\", info: \"Filter damage entries\" },\n          find: { type: \"method\", detail: \"(callback) => object | undefined\", info: \"Find a damage entry matching a condition\" },\n        }\n      },\n      saveResults: {\n        type: \"property\", detail: \"Map<string, object>\", info: \"Save results by token UUID\",\n        children: {\n          size: { type: \"property\", detail: \"number\", info: \"Number of entries in the map\" },\n          get: { type: \"method\", detail: \"(key) => object | undefined\", info: \"Get a save result by token UUID\" },\n          has: { type: \"method\", detail: \"(key) => boolean\", info: \"Check if a token UUID has a result\" },\n          set: { type: \"method\", detail: \"(key, value) => Map\", info: \"Set a save result for a token UUID\" },\n          delete: { type: \"method\", detail: \"(key) => boolean\", info: \"Remove a save result\" },\n          forEach: { type: \"method\", detail: \"(callback) => void\", info: \"Execute a function for each entry\" },\n          keys: { type: \"method\", detail: \"() => Iterator\", info: \"Returns an iterator of keys\" },\n          values: { type: \"method\", detail: \"() => Iterator\", info: \"Returns an iterator of values\" },\n          entries: { type: \"method\", detail: \"() => Iterator\", info: \"Returns an iterator of [key, value] pairs\" },\n        }\n      },\n      templateId: { type: \"property\", detail: \"string\", info: \"Placed template ID\" },\n      uuid: { type: \"property\", detail: \"string\", info: \"Workflow UUID\" },\n      id: { type: \"property\", detail: \"string\", info: \"Workflow ID\" },\n    }\n  },\n};\n\n/**\n * Scope entries from executeMacroWithScope() in Workflow.ts.\n * Foundry's Macro#executeScript destructures {speaker, actor, token} from scope\n * and spreads remaining keys as top-level variables in the macro.\n *\n * Each entry with a `ref` shares children/instanceChildren with that tree entry.\n * Entries already in the tree (workflow, item, args) are not overwritten.\n */\nconst MIDI_SCOPE_MAP: Array<{ key: string; detail: string; info: string; ref?: string }> = [\n  { key: \"workflow\", detail: \"Workflow\", info: \"The midi-qol workflow instance\" },\n  { key: \"rolledActivity\", detail: \"Activity\", info: \"The activity that was rolled/used\", ref: \"activity\" },\n  { key: \"macroActivity\", detail: \"Activity\", info: \"The activity the macro is attached to (may differ from rolledActivity)\", ref: \"activity\" },\n  { key: \"item\", detail: \"Item\", info: \"Item being used\" },\n  { key: \"rolledItem\", detail: \"Item\", info: \"The item that was rolled/used (same as item in most cases)\", ref: \"item\" },\n  { key: \"macroItem\", detail: \"Item\", info: \"The item the macro is attached to (may differ from rolledItem for transferred macros)\", ref: \"item\" },\n  { key: \"args\", detail: \"any[]\", info: \"Macro arguments array, args[0] is MidiMacroData\" },\n  { key: \"options\", detail: \"object\", info: \"Options passed to callMacro\" },\n  { key: \"midiData\", detail: \"MidiMacroData\", info: \"Full midi macro data object (same as args[0] and scope.midiData)\" },\n];\n\n/**\n * args[0] / midiData: the full MidiMacroData from getMacroData().\n * All fields from Workflow.getMacroData() plus tag/macroPass/speaker added by callMacros/callMacro.\n */\nconst MIDI_ARGS0: CompletionEntry = {\n  type: \"property\", detail: \"MidiMacroData\", info: \"Midi-qol macro data (from workflow.getMacroData())\",\n  children: {\n    // Actor info\n    actor: { type: \"property\", detail: \"Actor5e\", info: \"The actor performing the action\" },\n    actorData: { type: \"property\", detail: \"object\", info: \"Actor source data (actor.toObject(false))\" },\n    actorUuid: { type: \"property\", detail: \"string\", info: \"Actor UUID\" },\n\n    // Attack info\n    advantage: { type: \"property\", detail: \"boolean\", info: \"Whether the roll had advantage\" },\n    disadvantage: { type: \"property\", detail: \"boolean\", info: \"Whether the roll had disadvantage\" },\n    attackD20: { type: \"property\", detail: \"number\", info: \"The natural d20 roll result\" },\n    attackRoll: { type: \"property\", detail: \"Roll\", info: \"The attack roll\" },\n    attackTotal: { type: \"property\", detail: \"number\", info: \"The attack roll total\" },\n    diceRoll: { type: \"property\", detail: \"number\", info: \"The natural d20 roll result (same as attackD20)\" },\n    isCritical: { type: \"property\", detail: \"boolean\", info: \"Whether the attack was a critical hit\" },\n    isFumble: { type: \"property\", detail: \"boolean\", info: \"Whether the attack was a fumble\" },\n\n    // Damage info\n    damageDetail: { type: \"property\", detail: \"DamageDescription[]\", info: \"Damage breakdown by type\" },\n    damageList: { type: \"property\", detail: \"DamageListEntry[]\", info: \"Detailed damage list entries\" },\n    damageRoll: { type: \"property\", detail: \"Roll\", info: \"The combined damage roll\" },\n    damageRolls: { type: \"property\", detail: \"Roll[]\", info: \"Individual damage rolls\" },\n    damageTotal: { type: \"property\", detail: \"number\", info: \"Total damage dealt\" },\n\n    // Bonus damage\n    bonusDamageDetail: { type: \"property\", detail: \"DamageDescription[]\", info: \"Bonus damage breakdown by type\" },\n    bonusDamageHTML: { type: \"property\", detail: \"string\", info: \"Bonus damage HTML display\" },\n    bonusDamageRoll: { type: \"property\", detail: \"Roll\", info: \"The combined bonus damage roll\" },\n    bonusDamageRolls: { type: \"property\", detail: \"Roll[]\", info: \"Individual bonus damage rolls\" },\n    bonusDamageTotal: { type: \"property\", detail: \"number\", info: \"Total bonus damage\" },\n\n    // Other damage\n    otherDamageDetail: { type: \"property\", detail: \"DamageDescription[]\", info: \"Other damage breakdown by type\" },\n    otherDamageList: { type: \"property\", detail: \"DamageListEntry[]\", info: \"Other damage list entries\" },\n    otherDamageTotal: { type: \"property\", detail: \"number\", info: \"Other damage total\" },\n\n    // Targets\n    targets: { type: \"property\", detail: \"TokenDocument[]\", info: \"All targeted token documents\" },\n    targetUuids: { type: \"property\", detail: \"string[]\", info: \"UUIDs of all targeted tokens\" },\n    hitTargets: { type: \"property\", detail: \"TokenDocument[]\", info: \"Token documents that were hit\" },\n    hitTargetUuids: { type: \"property\", detail: \"string[]\", info: \"UUIDs of hit targets\" },\n    hitTargetsEC: { type: \"property\", detail: \"TokenDocument[]\", info: \"Token documents hit with EC (extra critical)\" },\n    hitTargetUuidsEC: { type: \"property\", detail: \"string[]\", info: \"UUIDs of EC hit targets\" },\n\n    // Saves\n    saves: { type: \"property\", detail: \"TokenDocument[]\", info: \"Token documents that saved\" },\n    saveUuids: { type: \"property\", detail: \"string[]\", info: \"UUIDs of tokens that saved\" },\n    failedSaves: { type: \"property\", detail: \"TokenDocument[]\", info: \"Token documents that failed saves\" },\n    failedSaveUuids: { type: \"property\", detail: \"string[]\", info: \"UUIDs of tokens that failed saves\" },\n    superSavers: { type: \"property\", detail: \"TokenDocument[]\", info: \"Token documents that super-saved (e.g. evasion)\" },\n    superSaverUuids: { type: \"property\", detail: \"string[]\", info: \"UUIDs of super savers\" },\n    semiSuperSavers: { type: \"property\", detail: \"TokenDocument[]\", info: \"Token documents that semi-super-saved\" },\n    semiSuperSaverUuids: { type: \"property\", detail: \"string[]\", info: \"UUIDs of semi-super savers\" },\n    criticalSaves: { type: \"property\", detail: \"TokenDocument[]\", info: \"Token documents that critically saved\" },\n    criticalSaveUuids: { type: \"property\", detail: \"string[]\", info: \"UUIDs of critical savers\" },\n    fumbleSaves: { type: \"property\", detail: \"TokenDocument[]\", info: \"Token documents that fumbled their save\" },\n    fumbleSaveUuids: { type: \"property\", detail: \"string[]\", info: \"UUIDs of fumble savers\" },\n\n    // Item info\n    item: { type: \"property\", detail: \"object\", info: \"Item source data (item.toObject(false)) with uuid\" },\n    itemData: { type: \"property\", detail: \"object\", info: \"Item source data (same as item)\" },\n    itemUuid: { type: \"property\", detail: \"string\", info: \"Item UUID\" },\n    itemCardUuid: { type: \"property\", detail: \"string\", info: \"Chat card UUID for the item use\" },\n\n    // Spell/cast info\n    castLevel: { type: \"property\", detail: \"number\", info: \"The level the spell was cast at\" },\n    spellLevel: { type: \"property\", detail: \"number\", info: \"The level the spell was cast at (same as castLevel)\" },\n    castData: { type: \"property\", detail: \"object\", info: \"Casting data\" },\n\n    // Roll info\n    rollData: { type: \"property\", detail: \"object\", info: \"Roll data for formula evaluation\" },\n    rollOptions: { type: \"property\", detail: \"object\", info: \"Workflow roll options\" },\n    event: { type: \"property\", detail: \"Event\", info: \"The triggering event (if any)\" },\n\n    // Workflow info\n    workflow: { type: \"property\", detail: \"Workflow\", info: \"The midi-qol workflow instance\" },\n    workflowId: { type: \"property\", detail: \"string\", info: \"Workflow ID\" },\n    workflowOptions: { type: \"property\", detail: \"object\", info: \"Workflow options\" },\n    id: { type: \"property\", detail: \"string\", info: \"Workflow ID\" },\n\n    // Macro context (added by callMacros/callMacro)\n    tag: { type: \"property\", detail: \"string\", info: \"Macro tag (OnUse, DamageBonus, etc.)\" },\n    macroPass: { type: \"property\", detail: \"string\", info: \"Current macro pass (preItemRoll, postActiveEffects, preSave, etc.)\" },\n    speaker: { type: \"property\", detail: \"object\", info: \"Chat speaker data\" },\n    sourceItemUuid: { type: \"property\", detail: \"string\", info: \"UUID of the source item the macro was found on\" },\n    options: { type: \"property\", detail: \"object\", info: \"Options passed to callMacro\" },\n\n    // Template/token\n    templateId: { type: \"property\", detail: \"string\", info: \"Placed template ID (deprecated)\" },\n    templateUuid: { type: \"property\", detail: \"string\", info: \"Placed template UUID\" },\n    tokenUuid: { type: \"property\", detail: \"string\", info: \"Token UUID of the acting token\" },\n    uuid: { type: \"property\", detail: \"string\", info: \"Item UUID (deprecated, use itemUuid)\" },\n  }\n};\n\n/**\n * Inject midi-qol completions into macro-autocomplete.\n * Called at module load time. Registers a handler for\n * \"macro-autocomplete.ready\" which fires when macro-autocomplete initializes.\n *\n * Foundry's Macro#executeScript destructures {speaker, actor, token} from scope\n * and spreads remaining scope keys as additional top-level variables.\n * So actor/token/speaker are already provided by core - midi doesn't re-add them.\n * But item, activity, workflow, etc. are spread from scope and available as top-level vars.\n */\nexport function injectMidiCompletions(): void {\n  // Register hook - macro-autocomplete fires this after it initializes\n  (Hooks as any).on(\"macro-autocomplete.ready\", ({ tree, rebuildSignatureMap, schemaToCompletions, mergeCompletions, classToCompletions,\n    registerCategoryConfigs, registerBlockColours, registerScopeMergeKeys }: {\n    tree: CompletionNode;\n    rebuildSignatureMap: () => void;\n    schemaToCompletions?: (schema: any) => CompletionNode;\n    mergeCompletions?: (target: { children?: CompletionNode }, additions: CompletionNode) => void;\n    classToCompletions?: (cls: any) => { staticChildren: CompletionNode; instanceChildren: CompletionNode; constructorDetail?: string };\n    registerCategoryConfigs?: (configs: Record<string, { display: string; colour: string; order: number; namespaceOnly?: boolean }>) => void;\n    registerBlockColours?: (colours: Record<string, number>) => void;\n    registerScopeMergeKeys?: (keys: string[]) => void;\n  }) => {\n    console.log(\"midi-qol | Injecting midi-qol completions into macro-autocomplete\");\n\n    // Register visual editor (Blockly) configuration\n    registerCategoryConfigs?.({\n      activity: { display: \"activity\", colour: \"#e76f51\", order: 10 },\n      workflow: { display: \"workflow\", colour: \"#e63946\", order: 13 },\n      rolledItem: { display: \"rolledItem\", colour: \"#6a994e\", order: 17 },\n      macroItem: { display: \"macroItem\", colour: \"#6a994e\", order: 18 },\n      rolledActivity: { display: \"rolledActivity\", colour: \"#e76f51\", order: 19 },\n      macroActivity: { display: \"macroActivity\", colour: \"#e76f51\", order: 20 },\n      options: { display: \"options\", colour: \"#a5805b\", order: 23 },\n      midiData: { display: \"midiData\", colour: \"#e63946\", order: 24 },\n      MidiQOL: { display: \"MidiQOL\", colour: \"#e63946\", order: 30 },\n      chrisPremades: { display: \"Chris Premades\", colour: \"#e76f51\", order: 31, namespaceOnly: true },\n      // Condition editor categories\n      \"Actor Data\": { display: \"Actor Data\", colour: \"#457b9d\", order: 70 },\n      \"Target Data\": { display: \"Target Data\", colour: \"#2a9d8f\", order: 71 },\n      \"Workflow\": { display: \"Workflow\", colour: \"#e63946\", order: 72 },\n      \"World\": { display: \"World\", colour: \"#e9c46a\", order: 73 },\n      \"Combat\": { display: \"Combat\", colour: \"#5ba580\", order: 74 },\n      \"Functions\": { display: \"Functions\", colour: \"#9b59b6\", order: 75 },\n    });\n    registerBlockColours?.({\n      MidiQOL: 0,\n      workflow: 350,\n    });\n    registerScopeMergeKeys?.([\"macroItem\", \"rolledItem\", \"macroActivity\", \"rolledActivity\"]);\n\n    const cfg = (globalThis as any).CONFIG;\n\n    // Inject MidiQOL namespace\n    tree.MidiQOL = MIDI_COMPLETIONS.MidiQOL;\n\n    // Inject workflow top-level variable (spread from scope by Foundry)\n    tree.workflow = MIDI_COMPLETIONS.workflow;\n\n    // Enrich item entry with midi-specific info (merge, don't replace — macro-autocomplete\n    // already enriched tree.item with document schema, runtime data, and prototype methods)\n    if (!tree.item) {\n      tree.item = { type: \"variable\", detail: \"Item\", info: \"Item being used (available in midi-qol macros, spread from scope)\", children: {} };\n    }\n    tree.item.type = \"variable\";\n    tree.item.detail = \"Item\";\n    tree.item.info = \"Item being used (available in midi-qol macros, spread from scope)\";\n    if (mergeCompletions) {\n      mergeCompletions(tree.item, {\n        name: { type: \"property\", detail: \"string\", info: \"Item name\" },\n        type: { type: \"property\", detail: \"string\", info: \"Item type (weapon, spell, feat, equipment, consumable, ...)\" },\n        img: { type: \"property\", detail: \"string\", info: \"Item image path\" },\n        uuid: { type: \"property\", detail: \"string\", info: \"Item UUID\" },\n        id: { type: \"property\", detail: \"string\", info: \"Item ID\" },\n        isOwner: { type: \"property\", detail: \"boolean\", info: \"Current user is owner\" },\n        items: { type: \"property\", detail: \"Collection<Item>\", info: \"Actor's item collection\" },\n        effects: { type: \"property\", detail: \"Collection<ActiveEffect>\", info: \"Item's effects\" },\n        actor: { type: \"property\", detail: \"Actor | null\", info: \"Owning actor\" },\n      });\n    }\n\n    // Inject activity as top-level variable (spread from scope by Foundry)\n    // Properties from dnd5e Activity + midi-qol MidiActivityMixin\n    const ACTIVITY_CHILDREN: CompletionNode = {\n      // Core identification\n      name: { type: \"property\", detail: \"string\", info: \"Activity name\" },\n      type: { type: \"property\", detail: \"string\", info: \"Activity type (e.g. 'attack', 'save', 'damage', 'heal', 'utility')\" },\n      identifier: { type: \"property\", detail: \"string\", info: \"Unique identifier (custom or name slugified)\" },\n      img: { type: \"property\", detail: \"string\", info: \"Activity image path\" },\n      uuid: { type: \"property\", detail: \"string\", info: \"Activity UUID\" },\n      sort: { type: \"property\", detail: \"number\", info: \"Sort order\" },\n\n      // Relationships\n      item: {\n        type: \"property\", detail: \"Item5e\", info: \"Parent item\",\n        children: {\n          system: {\n            type: \"property\", detail: \"object\", info: \"Item system data\",\n            children: {\n              description: { type: \"property\", detail: \"object\", info: \"Item description\" },\n              damage: { type: \"property\", detail: \"object\", info: \"Damage configuration\" },\n              save: { type: \"property\", detail: \"object\", info: \"Save configuration\" },\n              range: { type: \"property\", detail: \"object\", info: \"Range configuration\" },\n              target: { type: \"property\", detail: \"object\", info: \"Target configuration\" },\n              duration: { type: \"property\", detail: \"object\", info: \"Duration configuration\" },\n              uses: { type: \"property\", detail: \"object\", info: \"Limited uses\" },\n              level: { type: \"property\", detail: \"number\", info: \"Spell level\" },\n              properties: { type: \"property\", detail: \"Set<string>\", info: \"Item properties\" },\n            }\n          },\n          activities: { type: \"property\", detail: \"Collection<Activity>\", info: \"Item's activities\" },\n          effects: { type: \"property\", detail: \"Collection<ActiveEffect>\", info: \"Item's effects\" },\n          actor: { type: \"property\", detail: \"Actor5e | null\", info: \"Owning actor\" },\n          name: { type: \"property\", detail: \"string\", info: \"Item name\" },\n          type: { type: \"property\", detail: \"string\", info: \"Item type\" },\n          img: { type: \"property\", detail: \"string\", info: \"Item image path\" },\n          uuid: { type: \"property\", detail: \"string\", info: \"Item UUID\" },\n        }\n      },\n      actor: {\n        type: \"property\", detail: \"Actor5e\", info: \"Owning actor (via item.actor)\",\n        children: {\n          system: {\n            type: \"property\", detail: \"object\", info: \"Actor system data\",\n            children: {\n              abilities: { type: \"property\", detail: \"object\", info: \"Ability scores { str, dex, con, int, wis, cha }\" },\n              attributes: { type: \"property\", detail: \"object\", info: \"Actor attributes (hp, ac, movement, etc.)\" },\n              skills: { type: \"property\", detail: \"object\", info: \"Skill data\" },\n              traits: { type: \"property\", detail: \"object\", info: \"Damage/condition traits (di, dr, dv, ci)\" },\n              details: { type: \"property\", detail: \"object\", info: \"Character details (level, cr, race)\" },\n              spells: { type: \"property\", detail: \"object\", info: \"Spell slots\" },\n            }\n          },\n          items: { type: \"property\", detail: \"Collection<Item5e>\", info: \"Actor's item collection\" },\n          effects: { type: \"property\", detail: \"Collection<ActiveEffect5e>\", info: \"Actor's active effects\" },\n          name: { type: \"property\", detail: \"string\", info: \"Actor name\" },\n          uuid: { type: \"property\", detail: \"string\", info: \"Actor UUID\" },\n          getRollData: { type: \"method\", detail: \"() => object\", info: \"Get data for roll formulas\" },\n          getFlag: { type: \"method\", detail: \"(scope, key) => any\", info: \"Get a flag value\" },\n          setFlag: { type: \"method\", detail: \"(scope, key, value) => Promise\", info: \"Set a flag value\" },\n        }\n      },\n\n      // Type checks\n      actionType: { type: \"property\", detail: \"string\", info: \"Action type (e.g. 'mwak', 'rwak', 'msak', 'rsak', 'save', 'heal', 'utility')\" },\n      hasDamage: { type: \"property\", detail: \"boolean\", info: \"Whether activity has a damage roll\" },\n      hasHealing: { type: \"property\", detail: \"boolean\", info: \"Whether activity has healing\" },\n      hasAttack: { type: \"property\", detail: \"boolean\", info: \"Whether activity has an attack roll\" },\n      hasSave: { type: \"property\", detail: \"boolean\", info: \"Whether activity has a saving throw\" },\n\n      // Data sections\n      activation: {\n        type: \"property\", detail: \"object\", info: \"Activation configuration\",\n        children: {\n          type: { type: \"property\", detail: \"string\", info: \"Activation type (action, bonus, reaction, etc.)\" },\n          value: { type: \"property\", detail: \"number\", info: \"Activation value\" },\n          condition: { type: \"property\", detail: \"string\", info: \"Activation condition text\" },\n        }\n      },\n      consumption: {\n        type: \"property\", detail: \"object\", info: \"Consumption configuration\",\n        children: {\n          targets: { type: \"property\", detail: \"object[]\", info: \"Consumption targets\" },\n          scaling: { type: \"property\", detail: \"object\", info: \"Consumption scaling\" },\n        }\n      },\n      description: {\n        type: \"property\", detail: \"object\", info: \"Description data\",\n        children: {\n          chatFlavor: { type: \"property\", detail: \"string\", info: \"Chat flavor text\" },\n        }\n      },\n      duration: {\n        type: \"property\", detail: \"object\", info: \"Duration configuration\",\n        children: {\n          value: { type: \"property\", detail: \"number\", info: \"Duration value\" },\n          units: { type: \"property\", detail: \"string\", info: \"Duration units (turn, round, minute, hour, day, etc.)\" },\n          special: { type: \"property\", detail: \"string\", info: \"Special duration text\" },\n          concentration: { type: \"property\", detail: \"boolean\", info: \"Requires concentration\" },\n        }\n      },\n      range: {\n        type: \"property\", detail: \"object\", info: \"Range configuration\",\n        children: {\n          value: { type: \"property\", detail: \"number\", info: \"Range value\" },\n          units: { type: \"property\", detail: \"string\", info: \"Range units\" },\n          special: { type: \"property\", detail: \"string\", info: \"Special range text\" },\n          override: { type: \"property\", detail: \"boolean\", info: \"Override item range\" },\n        }\n      },\n      target: {\n        type: \"property\", detail: \"object\", info: \"Target configuration\",\n        children: {\n          template: {\n            type: \"property\", detail: \"object\", info: \"Area template configuration\",\n            children: {\n              type: { type: \"property\", detail: \"string\", info: \"Template shape (cone, cube, cylinder, line, radius, sphere, square, wall)\" },\n              size: { type: \"property\", detail: \"number\", info: \"Template size\" },\n              units: { type: \"property\", detail: \"string\", info: \"Template units\" },\n              contiguous: { type: \"property\", detail: \"boolean\", info: \"Must be contiguous\" },\n            }\n          },\n          affects: {\n            type: \"property\", detail: \"object\", info: \"Affected targets\",\n            children: {\n              type: { type: \"property\", detail: \"string\", info: \"Target type (creature, ally, enemy, self, willing, etc.)\" },\n              count: { type: \"property\", detail: \"string\", info: \"Number of targets\" },\n              special: { type: \"property\", detail: \"string\", info: \"Special targeting text\" },\n            }\n          },\n          prompt: { type: \"property\", detail: \"boolean\", info: \"Prompt for targets\" },\n        }\n      },\n      uses: {\n        type: \"property\", detail: \"object\", info: \"Limited uses\",\n        children: {\n          spent: { type: \"property\", detail: \"number\", info: \"Uses spent\" },\n          max: { type: \"property\", detail: \"string\", info: \"Maximum uses (formula)\" },\n          per: { type: \"property\", detail: \"string\", info: \"Recovery period\" },\n          recovery: { type: \"property\", detail: \"object[]\", info: \"Recovery profiles\" },\n        }\n      },\n      damage: {\n        type: \"property\", detail: \"object\", info: \"Damage configuration\",\n        children: {\n          parts: { type: \"property\", detail: \"object[]\", info: \"Damage parts (formula, type, scaling)\" },\n        }\n      },\n      healing: {\n        type: \"property\", detail: \"object\", info: \"Healing configuration\",\n        children: {\n          types: { type: \"property\", detail: \"Set<string>\", info: \"Healing types\" },\n        }\n      },\n      save: {\n        type: \"property\", detail: \"object\", info: \"Save configuration\",\n        children: {\n          ability: { type: \"property\", detail: \"Set<string>\", info: \"Save ability/abilities\" },\n          dc: {\n            type: \"property\", detail: \"object\", info: \"Save DC\",\n            children: {\n              calculation: { type: \"property\", detail: \"string\", info: \"DC calculation method\" },\n              formula: { type: \"property\", detail: \"string\", info: \"DC formula\" },\n            }\n          },\n        }\n      },\n      check: {\n        type: \"property\", detail: \"object\", info: \"Check configuration\",\n        children: {\n          ability: { type: \"property\", detail: \"string\", info: \"Check ability\" },\n          associated: { type: \"property\", detail: \"Set<string>\", info: \"Associated skills\" },\n          dc: {\n            type: \"property\", detail: \"object\", info: \"Check DC\",\n            children: {\n              calculation: { type: \"property\", detail: \"string\", info: \"DC calculation method\" },\n              formula: { type: \"property\", detail: \"string\", info: \"DC formula\" },\n            }\n          },\n        }\n      },\n      attack: {\n        type: \"property\", detail: \"object\", info: \"Attack configuration\",\n        children: {\n          ability: { type: \"property\", detail: \"string\", info: \"Attack ability\" },\n          bonus: { type: \"property\", detail: \"string\", info: \"Attack bonus formula\" },\n          type: {\n            type: \"property\", detail: \"object\", info: \"Attack type\",\n            children: {\n              value: { type: \"property\", detail: \"string\", info: \"Attack type (melee or ranged)\" },\n              classification: { type: \"property\", detail: \"string\", info: \"Classification (weapon or spell)\" },\n            }\n          },\n          flat: { type: \"property\", detail: \"boolean\", info: \"Flat attack bonus (no proficiency/ability)\" },\n        }\n      },\n\n      // Effects\n      effects: { type: \"property\", detail: \"ActivityEffectData[]\", info: \"Activity effect data entries\" },\n      applicableEffects: { type: \"property\", detail: \"ActiveEffect[]\", info: \"Active effects applicable from this activity\" },\n\n      // Conditions (midi-qol MidiActivityMixin getters)\n      useCondition: { type: \"property\", detail: \"string\", info: \"Use activation condition text\" },\n      effectCondition: { type: \"property\", detail: \"string\", info: \"Effect activation condition text\" },\n      otherActivity: { type: \"property\", detail: \"Activity | null\", info: \"Associated 'other activity' (ammunition, triggered, etc.)\" },\n\n      // Midi-specific\n      macro: { type: \"property\", detail: \"Macro\", info: \"Activity on-use macro\" },\n      midiProperties: {\n        type: \"property\", detail: \"object\", info: \"Midi-qol activity properties\",\n        children: {\n          ignoreTraits: { type: \"property\", detail: \"Set<string>\", info: \"Ignored damage traits (idi, idr, idv, ida)\" },\n          triggeredActivityId: { type: \"property\", detail: \"string\", info: \"Triggered activity ID\" },\n          triggeredActivityConditionText: { type: \"property\", detail: \"string\", info: \"Triggered activity condition\" },\n          triggeredActivityTargets: { type: \"property\", detail: \"string\", info: \"Triggered activity target mode\" },\n          triggeredActivityRollAs: { type: \"property\", detail: \"string\", info: \"Triggered activity roll-as mode\" },\n          autoConsume: { type: \"property\", detail: \"boolean\", info: \"Auto-consume resources\" },\n          confirmTargets: { type: \"property\", detail: \"string\", info: \"Target confirmation mode\" },\n          autoTargetType: { type: \"property\", detail: \"string\", info: \"Auto-targeting type\" },\n          automationOnly: { type: \"property\", detail: \"boolean\", info: \"Hidden from manual use (automation only)\" },\n          otherActivityCompatible: { type: \"property\", detail: \"boolean\", info: \"Can be used as 'other activity'\" },\n          identifier: { type: \"property\", detail: \"string\", info: \"Custom identifier\" },\n          displayActivityName: { type: \"property\", detail: \"boolean\", info: \"Show activity name on chat card\" },\n          rollMode: { type: \"property\", detail: \"string\", info: \"Roll mode override\" },\n          chooseEffects: { type: \"property\", detail: \"boolean\", info: \"Prompt to choose which effects to apply\" },\n          toggleEffect: { type: \"property\", detail: \"boolean\", info: \"Toggle effect on/off\" },\n          magicEffect: { type: \"property\", detail: \"boolean\", info: \"Effects are magical\" },\n          magicDamage: { type: \"property\", detail: \"boolean\", info: \"Damage is magical\" },\n          noConcentrationCheck: { type: \"property\", detail: \"boolean\", info: \"Skip concentration check\" },\n        }\n      },\n    };\n\n    tree.activity = {\n      type: \"variable\", detail: \"Activity\", info: \"Activity being used (available in midi-qol macros, spread from scope)\",\n      children: ACTIVITY_CHILDREN,\n    };\n\n    // Register Activity as a PascalCase class entry so type resolution works\n    // (e.g., \"Collection<Activity>\" in for-of loops resolves to Activity's instance members)\n    tree.Activity = {\n      type: \"class\", detail: \"Activity\", info: \"dnd5e Activity base class\",\n      instanceChildren: ACTIVITY_CHILDREN,\n    };\n\n    // Point workflow.activity to the full ACTIVITY_CHILDREN so the namespace\n    // block and sidebar show all activity properties (not just the abbreviated set)\n    if (tree.workflow?.children?.activity) {\n      tree.workflow.children.activity.children = ACTIVITY_CHILDREN;\n    }\n\n    // Register Workflow as a top-level class entry so typed_var blocks and type\n    // resolution (e.g., for-of loops yielding Workflow) can access workflow properties\n    tree.Workflow = {\n      type: \"class\", detail: \"Workflow\", info: \"midi-qol Workflow class\",\n      instanceChildren: tree.workflow?.children ?? {},\n    };\n\n    // Dynamically inject instance methods from runtime class prototypes\n    if (classToCompletions && mergeCompletions) {\n      // Item instance methods\n      const itemCls = cfg?.Item?.documentClass;\n      if (itemCls) {\n        const walked = classToCompletions(itemCls);\n        if (!tree.item.instanceChildren) tree.item.instanceChildren = {};\n        mergeCompletions({ children: tree.item.instanceChildren }, walked.instanceChildren);\n      }\n\n      // Activity instance methods — walk from CONFIG.DND5E.activityTypes to get\n      // MidiActivityMixin methods (use, rollDamage, setupTargets, etc.)\n      const activityTypes = cfg?.DND5E?.activityTypes;\n      if (activityTypes && typeof activityTypes === \"object\") {\n        for (const entry of Object.values(activityTypes) as any[]) {\n          const ActCls = entry?.documentClass;\n          if (ActCls?.prototype) {\n            const walked = classToCompletions(ActCls);\n            if (!tree.activity.instanceChildren) tree.activity.instanceChildren = {};\n            mergeCompletions({ children: tree.activity.instanceChildren }, walked.instanceChildren);\n            // Also merge into the PascalCase Activity class entry for type resolution\n            if (!tree.Activity.instanceChildren) tree.Activity.instanceChildren = {};\n            mergeCompletions({ children: tree.Activity.instanceChildren }, walked.instanceChildren);\n          }\n        }\n      }\n    }\n\n    // Inject item system schema completions if available\n    if (schemaToCompletions && mergeCompletions) {\n      const itemDataModels = cfg?.Item?.dataModels;\n      if (itemDataModels && typeof itemDataModels === \"object\" && tree.item?.children?.system) {\n        for (const [, DataModel] of Object.entries(itemDataModels) as [string, any][]) {\n          if (DataModel?.schema) {\n            const sc = schemaToCompletions(DataModel.schema);\n            mergeCompletions(tree.item.children.system, sc);\n          }\n        }\n      }\n    }\n\n    // Augment args[0] with full MidiMacroData structure\n    if (tree.args?.children) {\n      tree.args.children[\"0\"] = MIDI_ARGS0;\n    }\n\n    // Set midiData tree entry before scope loop (so loop's !tree[key] check skips it)\n    tree.midiData = {\n      type: \"variable\", detail: \"MidiMacroData\", info: \"Full midi macro data object (same as args[0] and scope.midiData)\",\n      children: MIDI_ARGS0.children,\n    };\n\n    // Inject all scope entries as top-level variables and into scope.children.\n    // This mirrors executeMacroWithScope() in Workflow.ts — Foundry's Macro#executeScript\n    // destructures {speaker, actor, token} and spreads the rest as top-level vars.\n    for (const { key, detail, info, ref } of MIDI_SCOPE_MAP) {\n      const source = ref ? tree[ref] : undefined;\n      // Add to scope.children for `scope.xxx` completion\n      if (tree.scope?.children) {\n        tree.scope.children[key] = {\n          type: \"property\", detail, info,\n          ...(source?.children && { children: source.children }),\n          ...(source?.instanceChildren && { instanceChildren: source.instanceChildren }),\n        };\n      }\n      // Create top-level variable entry if it doesn't already exist.\n      // Entries with a `ref` share children/instanceChildren with the referenced entry.\n      if (!tree[key]) {\n        tree[key] = {\n          type: \"variable\", detail, info,\n          ...(source?.children && { children: source.children }),\n          ...(source?.instanceChildren && { instanceChildren: source.instanceChildren }),\n        };\n      }\n    }\n\n    // Inject rich chrisPremades (CPR) completions — replaces the shallow\n    // objectToCompletions walk with properly typed function signatures\n    // extracted from the CPR source map.\n    if (mergeCompletions && (globalThis as any).chrisPremades) {\n      const fn = (detail: string, info: string): CompletionEntry => ({ type: \"function\", detail, info });\n      const prop = (detail: string, info: string): CompletionEntry => ({ type: \"property\", detail, info });\n      const method = (detail: string, info: string): CompletionEntry => ({ type: \"method\", detail, info });\n\n      const CPR_UTILS: CompletionNode = {\n        actorUtils: {\n          type: \"object\", detail: \"object\", info: \"Actor utility functions\",\n          children: {\n            getEffects: fn(\"(actor, options?) => ActiveEffect[]\", \"Get effects on an actor\"),\n            addFavorites: fn(\"async (actor, entities, type?) => Promise\", \"Add items to favorites\"),\n            removeFavorites: fn(\"async (actor, entities, type?) => Promise\", \"Remove items from favorites\"),\n            getFirstToken: fn(\"(actor) => Token5e\", \"Get first token for an actor\"),\n            getLevelOrCR: fn(\"(actor) => number\", \"Get character level or CR\"),\n            checkTrait: fn(\"(actor, type, trait) => boolean\", \"Check if actor has a damage/condition trait\"),\n            typeOrRace: fn(\"(actor) => string\", \"Get creature type or race\"),\n            raceOrType: fn(\"(actor) => string\", \"Get creature race or type\"),\n            getSize: fn(\"(actor, returnString?) => number|string\", \"Get creature size\"),\n            hasUsedReaction: fn(\"(actor) => boolean\", \"Check if actor has used reaction\"),\n            setReactionUsed: fn(\"async (actor) => Promise\", \"Mark reaction as used\"),\n            removeReactionUsed: fn(\"async (actor, force?) => Promise\", \"Clear reaction used\"),\n            hasUsedBonusAction: fn(\"(actor) => boolean\", \"Check if bonus action used\"),\n            setBonusActionUsed: fn(\"async (actor) => Promise\", \"Mark bonus action used\"),\n            removeBonusActionUsed: fn(\"async (actor, force?) => Promise\", \"Clear bonus action used\"),\n            hasSpellSlots: fn(\"(actor, atLeast?) => boolean\", \"Check for available spell slots\"),\n            getCastableSpells: fn(\"(actor) => Item[]\", \"Get spells the actor can cast\"),\n            isShapeChanger: fn(\"(actor) => boolean\", \"Check if actor is a shape changer\"),\n            doConcentrationCheck: fn(\"async (actor, saveDC) => Promise\", \"Force a concentration check\"),\n            polymorph: fn(\"async (origActor, newActor, options, renderSheet?) => Promise\", \"Polymorph an actor\"),\n            getEquippedArmor: fn(\"(actor, types?) => Item|undefined\", \"Get equipped armor\"),\n            getEquippedShield: fn(\"(actor) => Item|undefined\", \"Get equipped shield\"),\n            compareSize: fn(\"(source, target, goal) => boolean\", \"Compare creature sizes\"),\n            getBestAbility: fn(\"(actor, abilities) => string\", \"Get highest ability from list\"),\n            getTokens: fn(\"(actor) => Token5e[]\", \"Get all tokens for an actor\"),\n            giveHeroicInspiration: fn(\"async (actor) => Promise\", \"Give heroic inspiration\"),\n          }\n        },\n        effectUtils: {\n          type: \"object\", detail: \"object\", info: \"Effect utility functions\",\n          children: {\n            createEffect: fn(\"async (entity, effectData, ...) => Promise<ActiveEffect>\", \"Create an active effect\"),\n            createEffects: fn(\"async (entity, effectDataArray, optionsArray) => Promise\", \"Create multiple effects\"),\n            getConcentrationEffect: fn(\"(actor, item) => ActiveEffect|undefined\", \"Get concentration effect for item\"),\n            getEffectByIdentifier: fn(\"(actor, identifier) => ActiveEffect|undefined\", \"Get effect by CPR identifier\"),\n            getAllEffectsByIdentifier: fn(\"(actor, identifier) => ActiveEffect[]\", \"Get all effects by identifier\"),\n            getEffectByStatusID: fn(\"(actor, statusID) => ActiveEffect|undefined\", \"Get effect by status ID\"),\n            applyConditions: fn(\"async (actor, conditions, ...) => Promise\", \"Apply conditions to actor\"),\n            addDependent: fn(\"async (entity, dependents, forceGM?) => Promise\", \"Add dependent entities\"),\n            addMacro: fn(\"(effectData, type, macroList) => void\", \"Add embedded macro to effect data\"),\n            getCastData: fn(\"(effect) => object\", \"Get cast data stored on effect\"),\n            getCastLevel: fn(\"(effect) => number\", \"Get cast level from effect\"),\n            getBaseLevel: fn(\"(effect) => number\", \"Get base spell level from effect\"),\n            setCastData: fn(\"async (effect, data) => Promise\", \"Set cast data on effect\"),\n            setCastLevel: fn(\"async (effect, level) => Promise\", \"Set cast level on effect\"),\n            getSaveDC: fn(\"(effect) => number\", \"Get save DC stored on effect\"),\n            setSaveDC: fn(\"async (effect, dc) => Promise\", \"Set save DC on effect\"),\n            syntheticActiveEffect: fn(\"async (effectData, entity) => Promise<ActiveEffect>\", \"Create synthetic effect\"),\n            getOriginItem: fn(\"async (effect) => Promise<Item>\", \"Get origin item of effect\"),\n            getOriginItemSync: fn(\"(effect) => Item|undefined\", \"Get origin item synchronously\"),\n            getConditions: fn(\"(effect) => string[]\", \"Get conditions from effect\"),\n          }\n        },\n        itemUtils: {\n          type: \"object\", detail: \"object\", info: \"Item utility functions\",\n          children: {\n            createItems: fn(\"async (actor, updates, ...) => Promise<Item[]>\", \"Create items on actor\"),\n            getItemByIdentifier: fn(\"(actor, identifier) => Item|undefined\", \"Get item by CPR identifier\"),\n            getAllItemsByIdentifier: fn(\"(actor, identifier) => Item[]\", \"Get all items by identifier\"),\n            syntheticItem: fn(\"async (itemData, actor) => Promise<Item>\", \"Create a synthetic (temporary) item\"),\n            enchantItem: fn(\"async (item, effectData, ...) => Promise\", \"Apply enchantment to item\"),\n            cloneItem: fn(\"(item, updates?) => Item\", \"Clone an item with optional updates\"),\n            getConfig: fn(\"(item, key) => any\", \"Get CPR config value from item\"),\n            setConfig: fn(\"async (item, key, value) => Promise\", \"Set CPR config value on item\"),\n            getSaveDC: fn(\"(item) => number\", \"Get save DC for item\"),\n            getVersion: fn(\"(item) => string\", \"Get CPR automation version\"),\n            getSource: fn(\"(item) => string\", \"Get CPR automation source\"),\n            isUpToDate: fn(\"async (item) => Promise<boolean>\", \"Check if automation is up to date\"),\n            isSpellFeature: fn(\"(item) => boolean\", \"Check if item is a spell feature\"),\n            convertDuration: fn(\"(entity) => object\", \"Convert duration to seconds\"),\n            getEquipmentState: fn(\"(item) => string\", \"Get equipment state\"),\n            getActivity: fn(\"(item, type) => Activity|undefined\", \"Get activity by type\"),\n            getEffectByIdentifier: fn(\"(item, identifier) => ActiveEffect|undefined\", \"Get effect on item by identifier\"),\n            getSpellActivities: fn(\"(item) => Activity[]\", \"Get spell-related activities\"),\n            canUse: fn(\"(item) => boolean\", \"Check if item can be used\"),\n          }\n        },\n        tokenUtils: {\n          type: \"object\", detail: \"object\", info: \"Token utility functions\",\n          children: {\n            getDistance: fn(\"(sourceToken, targetToken, ...) => number\", \"Get distance between tokens\"),\n            findNearby: fn(\"(token, range, disposition, ...) => Token5e[]\", \"Find nearby tokens\"),\n            pushToken: fn(\"async (sourceToken, targetToken, distance) => Promise\", \"Push token away\"),\n            canSee: fn(\"(sourceToken, targetToken) => boolean\", \"Check line of sight\"),\n            canSense: fn(\"(sourceToken, targetToken, senseModes?) => boolean\", \"Check if token can sense another\"),\n            checkIncapacitated: fn(\"(token, logResult?) => boolean\", \"Check if token is incapacitated\"),\n            checkForRoom: fn(\"(token, gridSquares) => boolean\", \"Check if room exists for token\"),\n            attachToToken: fn(\"async (token, uuidsToAttach) => Promise\", \"Attach entities to token\"),\n            detachFromToken: fn(\"async (token, uuidsToDetach) => Promise\", \"Detach entities from token\"),\n            getLightLevel: fn(\"(token) => string\", \"Get light level at token position\"),\n            grappleHelper: fn(\"async (sourceToken, targetToken, item, ...) => Promise\", \"Handle grapple mechanics\"),\n            moveTokenAlongRay: fn(\"async (targetToken, ray, distance) => Promise\", \"Move token along ray\"),\n            getMovementHitTokens: fn(\"(startPoint, endPoint, radius, ...) => Token5e[]\", \"Get tokens hit during movement\"),\n            getLinearDistanceMoved: fn(\"(token) => number\", \"Get linear distance moved this turn\"),\n            isGrappledBy: fn(\"(target, source) => boolean\", \"Check if target is grappled by source\"),\n            mountToken: fn(\"async (rider, target, ...) => Promise\", \"Mount a token on another\"),\n            checkCover: fn(\"(sourceToken, targetToken, ...) => number\", \"Check cover between tokens\"),\n            getBaseActor: fn(\"(token) => Actor5e\", \"Get base actor (unlinked original)\"),\n          }\n        },\n        workflowUtils: {\n          type: \"object\", detail: \"object\", info: \"Workflow utility functions\",\n          children: {\n            bonusDamage: fn(\"async (workflow, formula, ...) => Promise\", \"Add bonus damage to workflow\"),\n            bonusAttack: fn(\"async (workflow, formula) => Promise\", \"Add bonus to attack roll\"),\n            replaceDamage: fn(\"async (workflow, formula, ...) => Promise\", \"Replace workflow damage\"),\n            applyDamage: fn(\"async (tokens, value, damageType) => Promise\", \"Apply damage to tokens\"),\n            completeActivityUse: fn(\"async (activity, config?) => Promise\", \"Complete an activity use programmatically\"),\n            completeItemUse: fn(\"async (item, config?) => Promise\", \"Complete an item use programmatically\"),\n            syntheticActivityRoll: fn(\"async (activity, targets?, ...) => Promise\", \"Roll synthetic activity\"),\n            syntheticItemRoll: fn(\"async (item, targets, ...) => Promise\", \"Roll synthetic item\"),\n            syntheticItemDataRoll: fn(\"async (itemData, actor, targets, ...) => Promise\", \"Roll from item data\"),\n            syntheticActivityDataRoll: fn(\"async (activityData, item, actor, targets, ...) => Promise\", \"Roll from activity data\"),\n            negateDamageItemDamage: fn(\"(ditem) => void\", \"Negate all damage on a damage item\"),\n            setDamageItemDamage: fn(\"(ditem, amount, adjustRaw?) => void\", \"Set damage item damage amount\"),\n            getDamageTypes: fn(\"(damageRolls) => string[]\", \"Get damage types from rolls\"),\n            getTotalDamageOfType: fn(\"(damageDetail, actor, type) => number\", \"Get total damage of a type\"),\n            getCastData: fn(\"(workflow) => object\", \"Get cast data from workflow\"),\n            getCastLevel: fn(\"(workflow) => number\", \"Get cast level from workflow\"),\n            modifyDamageAppliedFlat: fn(\"(ditem, amount) => void\", \"Modify damage applied by flat amount\"),\n            handleInstantTemplate: fn(\"async (workflow) => Promise\", \"Handle instant template placement\"),\n            isAttackType: fn(\"(workflow, type?) => boolean\", \"Check workflow attack type\"),\n            getActionType: fn(\"(workflow) => string\", \"Get workflow action type\"),\n            swapAttackAbility: fn(\"async (workflow, ability?, ...) => Promise\", \"Swap attack ability modifier\"),\n            addEntityRemoval: fn(\"(workflow, entities) => void\", \"Mark entities for removal after workflow\"),\n            preventDeath: fn(\"(ditem) => void\", \"Prevent target death from this damage\"),\n            specialItemUse: fn(\"async (item, targets, sourceFeature, ...) => Promise\", \"Special item use flow\"),\n            updateTargets: fn(\"async (workflow, targets, ...) => Promise\", \"Update workflow targets\"),\n            removeTargets: fn(\"async (workflow, tokens, ...) => Promise\", \"Remove tokens from targets\"),\n          }\n        },\n        rollUtils: {\n          type: \"object\", detail: \"object\", info: \"Roll utility functions\",\n          children: {\n            contestedRoll: fn(\"async (...) => Promise\", \"Perform a contested roll\"),\n            rollDice: fn(\"async (formula, ...) => Promise<Roll>\", \"Roll a dice formula\"),\n            damageRoll: fn(\"async (formula, entity, options?) => Promise<DamageRoll>\", \"Roll damage\"),\n            getCriticalFormula: fn(\"async (formula, rollData) => Promise<string>\", \"Get critical hit formula\"),\n            getChangedDamageRoll: fn(\"async (origRoll, newType) => Promise<DamageRoll>\", \"Change damage roll type\"),\n            addToRoll: fn(\"async (roll, formula, ...) => Promise<Roll>\", \"Add formula to existing roll\"),\n            requestRoll: fn(\"async (token, request, ability, options?) => Promise\", \"Request a roll from player\"),\n            makeCritical: fn(\"(roll) => Roll\", \"Convert a roll to critical\"),\n            rollDiceSync: fn(\"(formula, ...) => Roll\", \"Roll dice synchronously\"),\n            replaceD20: fn(\"async (roll, number) => Promise<Roll>\", \"Replace d20 result\"),\n          }\n        },\n        dialogUtils: {\n          type: \"object\", detail: \"object\", info: \"Dialog utility functions\",\n          children: {\n            buttonDialog: fn(\"async (title, content, buttons, ...) => Promise<string>\", \"Show button dialog\"),\n            numberDialog: fn(\"async (title, content, input?) => Promise<number>\", \"Show number input dialog\"),\n            selectDialog: fn(\"async (title, content, input?) => Promise<string>\", \"Show select dialog\"),\n            selectTargetDialog: fn(\"async (title, content, targets, ...) => Promise\", \"Show target selection dialog\"),\n            selectDocumentDialog: fn(\"async (title, content, documents, ...) => Promise\", \"Show document selection dialog\"),\n            selectDocumentsDialog: fn(\"async (title, content, documents, ...) => Promise\", \"Show multi-document selection\"),\n            confirm: fn(\"async (title, content, ...) => Promise<boolean>\", \"Show confirmation dialog\"),\n            selectHitDie: fn(\"async (actor, title, content, ...) => Promise\", \"Show hit die selection\"),\n            selectSpellSlot: fn(\"async (actor, title, content, ...) => Promise<number>\", \"Show spell slot selection\"),\n            selectDamageType: fn(\"async (damageTypes, title, ...) => Promise<string>\", \"Show damage type selection\"),\n            confirmUseItem: fn(\"async (item, ...) => Promise<boolean>\", \"Confirm item use\"),\n          }\n        },\n        combatUtils: {\n          type: \"object\", detail: \"object\", info: \"Combat utility functions\",\n          children: {\n            currentTurn: fn(\"() => Combatant|undefined\", \"Get current turn combatant\"),\n            inCombat: fn(\"() => boolean\", \"Check if combat is active\"),\n            combatStarted: fn(\"() => boolean\", \"Check if combat has started\"),\n            perTurnCheck: fn(\"(entity, name, ownTurnOnly, tokenId) => boolean\", \"Check once-per-turn usage\"),\n            setTurnCheck: fn(\"async (entity, name, reset) => Promise\", \"Set per-turn usage flag\"),\n            getCurrentCombatantToken: fn(\"() => Token5e|undefined\", \"Get current combatant's token\"),\n            isOwnTurn: fn(\"(token) => boolean\", \"Check if it's this token's turn\"),\n          }\n        },\n        templateUtils: {\n          type: \"object\", detail: \"object\", info: \"Template utility functions\",\n          children: {\n            getTokensInTemplate: fn(\"(template) => Token5e[]\", \"Get tokens within a template\"),\n            getTokensInShape: fn(\"(shape, scene, ...) => Token5e[]\", \"Get tokens in a shape\"),\n            placeTemplate: fn(\"async (templateData, returnTokens?) => Promise\", \"Place a measured template\"),\n            getCastData: fn(\"(template) => object\", \"Get cast data from template\"),\n            getCastLevel: fn(\"(template) => number\", \"Get cast level from template\"),\n            getSaveDC: fn(\"(template) => number\", \"Get save DC from template\"),\n            getSourceActor: fn(\"async (template) => Promise<Actor5e>\", \"Get source actor of template\"),\n            overlap: fn(\"(template1, template2) => boolean\", \"Check if two templates overlap\"),\n            attachToTemplate: fn(\"async (template, uuids) => Promise\", \"Attach entities to template\"),\n            rayIntersectsTemplate: fn(\"(templateDoc, ray) => boolean\", \"Check if ray intersects template\"),\n          }\n        },\n        socketUtils: {\n          type: \"object\", detail: \"object\", info: \"Socket utility functions\",\n          children: {\n            gmID: fn(\"() => string\", \"Get the GM's user ID\"),\n            isTheGM: fn(\"() => boolean\", \"Check if current user is the GM\"),\n            hasPermission: fn(\"(entity, userId) => boolean\", \"Check user permission on entity\"),\n            firstOwner: fn(\"(document, useId) => User\", \"Get first owner of document\"),\n            remoteRollItem: fn(\"async (item, config, options, userId) => Promise\", \"Roll item as another user\"),\n          }\n        },\n        regionUtils: {\n          type: \"object\", detail: \"object\", info: \"Region utility functions\",\n          children: {\n            createRegions: fn(\"async (regionDatas, scene, ...) => Promise\", \"Create scene regions\"),\n            templateToRegionShape: fn(\"(template, ...) => object\", \"Convert template to region shape\"),\n            getCastData: fn(\"(region) => object\", \"Get cast data from region\"),\n            getCastLevel: fn(\"(region) => number\", \"Get cast level from region\"),\n            getSaveDC: fn(\"(region) => number\", \"Get save DC from region\"),\n            rayIntersectsRegion: fn(\"(region, ray) => boolean\", \"Check if ray intersects region\"),\n          }\n        },\n        macroUtils: {\n          type: \"object\", detail: \"object\", info: \"Embedded macro utility functions\",\n          children: {\n            getEmbeddedMacros: fn(\"(entity, type, options?) => object[]\", \"Get embedded macros on entity\"),\n            addEmbeddedMacro: fn(\"async (entity, macroData) => Promise\", \"Add embedded macro to entity\"),\n            removeEmbeddedMacro: fn(\"async (entity, type, name) => Promise\", \"Remove embedded macro\"),\n            getDocumentPasses: fn(\"(document, type) => string[]\", \"Get valid passes for doc+event type\"),\n            getEventTypes: fn(\"() => string[]\", \"Get all event type keys\"),\n            getAllDocumentPasses: fn(\"(document) => object\", \"Get all passes for all event types\"),\n            getAllEmbeddedMacros: fn(\"(entity) => object[]\", \"Get all embedded macros\"),\n          }\n        },\n        activityUtils: {\n          type: \"object\", detail: \"object\", info: \"Activity utility functions\",\n          children: {\n            getActivityByIdentifier: fn(\"(item, identifier, ...) => Activity|undefined\", \"Get activity by identifier\"),\n            getIdentifier: fn(\"(activity) => string\", \"Get CPR identifier of activity\"),\n            setIdentifier: fn(\"async (activity, identifier) => Promise\", \"Set CPR identifier\"),\n            withChangedDamage: fn(\"(activity, formula, types?, ...) => Activity\", \"Clone activity with changed damage\"),\n            duplicateActivity: fn(\"(activity) => Activity\", \"Duplicate an activity\"),\n            getSaveDC: fn(\"(activity) => number\", \"Get save DC of activity\"),\n            hasSave: fn(\"(activity) => boolean\", \"Check if activity has a save\"),\n            isSpellActivity: fn(\"(activity) => boolean\", \"Check if activity belongs to a spell\"),\n            canUse: fn(\"(activity) => boolean\", \"Check if activity can be used\"),\n            isHidden: fn(\"(activity) => boolean\", \"Check if activity is hidden\"),\n          }\n        },\n        genericUtils: {\n          type: \"object\", detail: \"object\", info: \"General utility functions\",\n          children: {\n            sleep: fn(\"(ms) => Promise<void>\", \"Sleep for ms milliseconds\"),\n            translate: fn(\"(key) => string\", \"Localize a string key\"),\n            format: fn(\"(key, obj) => string\", \"Format a localized string\"),\n            setProperty: fn(\"(object, key, value) => boolean\", \"Set a nested property\"),\n            getProperty: fn(\"(object, key) => any\", \"Get a nested property\"),\n            duplicate: fn(\"(object) => object\", \"Deep duplicate an object\"),\n            deepClone: fn(\"(object) => object\", \"Deep clone an object\"),\n            mergeObject: fn(\"(original, other, options?) => object\", \"Merge objects\"),\n            update: fn(\"async (entity, updates?, options?) => Promise\", \"Update entity (GM-safe)\"),\n            remove: fn(\"async (entity) => Promise\", \"Delete entity (GM-safe)\"),\n            setFlag: fn(\"async (entity, scope, key, value) => Promise\", \"Set flag (GM-safe)\"),\n            unsetFlag: fn(\"async (entity, scope, key) => Promise\", \"Unset flag (GM-safe)\"),\n            getCPRSetting: fn(\"(key) => any\", \"Get a CPR module setting\"),\n            setCPRSetting: fn(\"async (key, value) => Promise\", \"Set a CPR module setting\"),\n            randomID: fn(\"(length?) => string\", \"Generate random ID\"),\n            notify: fn(\"(message, type?, ...) => void\", \"Show notification\"),\n            getIdentifier: fn(\"(entity) => string\", \"Get CPR identifier from entity\"),\n            getRules: fn(\"(entity) => string\", \"Get rules version (legacy/modern)\"),\n            titleCase: fn(\"(inputString) => string\", \"Convert string to title case\"),\n            createEmbeddedDocuments: fn(\"async (entity, type, updates, options) => Promise\", \"Create embedded docs (GM-safe)\"),\n            updateEmbeddedDocuments: fn(\"async (entity, type, updates, options) => Promise\", \"Update embedded docs (GM-safe)\"),\n            deleteEmbeddedDocuments: fn(\"async (entity, type, ids, options) => Promise\", \"Delete embedded docs (GM-safe)\"),\n          }\n        },\n        compendiumUtils: {\n          type: \"object\", detail: \"object\", info: \"Compendium utility functions\",\n          children: {\n            getCPRAutomation: fn(\"async (item, ...) => Promise<object>\", \"Get CPR automation for item\"),\n            getAllAutomations: fn(\"async (item, options?) => Promise<object[]>\", \"Get all automations for item\"),\n            getItemFromCompendium: fn(\"async (key, name, ...) => Promise<Item>\", \"Get item from compendium\"),\n            getPreferredAutomation: fn(\"async (item, options) => Promise<object>\", \"Get preferred automation\"),\n            getActorFromCompendium: fn(\"async (key, name, ...) => Promise<Actor>\", \"Get actor from compendium\"),\n          }\n        },\n        constants: {\n          type: \"object\", detail: \"object\", info: \"CPR constants and lookup tables\",\n          children: {\n            packs: prop(\"object\", \"Compendium pack keys\"),\n            attacks: prop(\"string[]\", \"All attack types\"),\n            meleeAttacks: prop(\"string[]\", \"Melee attack types\"),\n            rangedAttacks: prop(\"string[]\", \"Ranged attack types\"),\n            weaponAttacks: prop(\"string[]\", \"Weapon attack types\"),\n            spellAttacks: prop(\"string[]\", \"Spell attack types\"),\n            sizes: prop(\"object\", \"Creature size mappings\"),\n            damageTypeOptions: prop(\"object[]\", \"Damage type select options\"),\n            creatureTypeOptions: prop(\"object[]\", \"Creature type select options\"),\n            itemTypes: prop(\"string[]\", \"Valid item types\"),\n            abilityOptions: prop(\"object[]\", \"Ability score select options\"),\n            statusOptions: prop(\"object[]\", \"Status condition options\"),\n            skillOptions: prop(\"object[]\", \"Skill select options\"),\n            overTimeOptions: prop(\"object[]\", \"Overtime effect options\"),\n            getBaseWeaponOptions: fn(\"() => object[]\", \"Get base weapon options\"),\n            getToolNames: fn(\"() => object[]\", \"Get tool proficiency names\"),\n            getFeatOptions: fn(\"() => object[]\", \"Get feat options\"),\n          }\n        },\n        errors: {\n          type: \"object\", detail: \"object\", info: \"Error helper functions\",\n          children: {\n            missingPack: fn(\"() => void\", \"Log missing pack error\"),\n            missingPackItem: fn(\"(key, name) => void\", \"Log missing pack item error\"),\n            missingActivity: fn(\"(identifier) => void\", \"Log missing activity error\"),\n          }\n        },\n        animationUtils: {\n          type: \"object\", detail: \"object\", info: \"Animation utility functions (Sequencer/JB2A)\",\n          children: {\n            sequencerCheck: fn(\"() => boolean\", \"Check if Sequencer is available\"),\n            jb2aCheck: fn(\"() => boolean\", \"Check if JB2A is available\"),\n            simpleAttack: fn(\"(sourceToken, targetToken, animation, ...) => void\", \"Play simple attack animation\"),\n            preloadAnimations: fn(\"async (animations, showProgress?) => Promise\", \"Preload animation files\"),\n          }\n        },\n        spellUtils: {\n          type: \"object\", detail: \"object\", info: \"Spell utility functions\",\n          children: {\n            getClassSpells: fn(\"(identifier) => string[]\", \"Get spells for a class\"),\n            getAllClassSpells: fn(\"() => object\", \"Get all class spell lists\"),\n            isClassSpell: fn(\"(item, identifier) => boolean\", \"Check if spell belongs to class\"),\n            getCompendiumSpell: fn(\"async (name, ...) => Promise<Item>\", \"Get spell from compendium\"),\n          }\n        },\n        crosshairUtils: {\n          type: \"object\", detail: \"object\", info: \"Crosshair utility functions\",\n          children: {\n            aimCrosshair: fn(\"async (...) => Promise<object>\", \"Show aiming crosshair\"),\n          }\n        },\n      };\n\n      const CPR_COMPLETIONS: CompletionNode = {\n        utils: {\n          type: \"object\", detail: \"object\", info: \"CPR utility modules\",\n          children: CPR_UTILS,\n        },\n        Summons: {\n          type: \"class\", detail: \"class\", info: \"CPR Summons handler\",\n          children: {\n            spawn: fn(\"async (sourceActors, updates?, originItem, summonerToken, options?) => Promise\", \"Spawn summoned creatures\"),\n          }\n        },\n        Teleport: {\n          type: \"class\", detail: \"class\", info: \"CPR Teleport handler\",\n        },\n        Crosshairs: {\n          type: \"class\", detail: \"class\", info: \"CPR Crosshairs class\",\n        },\n        DialogApp: {\n          type: \"class\", detail: \"class\", info: \"CPR Dialog application\",\n        },\n        EmbeddedMacros: {\n          type: \"class\", detail: \"class\", info: \"CPR Embedded Macros application\",\n        },\n        macros: prop(\"object\", \"CPR macro implementations\"),\n        legacyMacros: prop(\"object\", \"CPR legacy macro implementations\"),\n        integration: {\n          type: \"object\", detail: \"object\", info: \"Third-party integrations\",\n          children: {\n            ddbi: fn(\"(item) => Promise<object>\", \"Get D&D Beyond Importer automation\"),\n            acc: prop(\"object\", \"Additional Compendiums Companion integration\"),\n          }\n        },\n      };\n\n      if (!tree.chrisPremades) {\n        tree.chrisPremades = { type: \"object\", detail: \"object\", info: \"chris-premades (CPR) module namespace\" };\n      }\n      mergeCompletions(tree.chrisPremades, CPR_COMPLETIONS);\n      console.log(\"midi-qol | Injected rich chrisPremades completions\");\n    }\n\n    // Rebuild signature map with the new completions\n    rebuildSignatureMap();\n\n    console.log(\"midi-qol | Midi-qol completions injected successfully\");\n  });\n}\n","import { i18n, MODULE_ID, GameSystemConfig } from \"../../midi-qol.js\";\nimport { serializeOvertimeDetails, parseBool } from \"../utils.js\";\n\nconst { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;\n\ninterface OverTimeEditorOptions {\n  value: string;\n  effect: ActiveEffect;\n  parent: Actor | Item | null;\n  onSubmit: (value: string) => void;\n  onCancel: () => void;\n}\n\nexport class OverTimeEditor extends HandlebarsApplicationMixin(ApplicationV2) {\n  declare originalValue: string;\n  declare effect: ActiveEffect;\n  declare parentDoc: Actor | Item | null;\n  declare onSubmitCallback: (value: string) => void;\n  declare onCancelCallback: () => void;\n  declare submitted: boolean;\n  declare currentData: Record<string, any>;\n  declare originalSerialized: string;\n  declare originalPermanent: boolean;\n\n  constructor(editorOptions: OverTimeEditorOptions, appOptions?: Partial<foundry.applications.api.ApplicationV2.Configuration>) {\n    super(appOptions);\n    this.originalValue = editorOptions.value;\n    this.effect = editorOptions.effect;\n    this.parentDoc = editorOptions.parent;\n    this.onSubmitCallback = editorOptions.onSubmit;\n    this.onCancelCallback = editorOptions.onCancel;\n    this.submitted = false;\n    this.currentData = this.#buildFormData(this.originalValue);\n    this.originalSerialized = this.#serializeCurrentData();\n    this.originalPermanent = this.currentData.permanent;\n  }\n\n  static override DEFAULT_OPTIONS = {\n    id: \"midi-qol-overtime-editor\",\n    tag: \"form\" as const,\n    window: {\n      title: \"midi-qol.OverTimeEditor.Title\",\n      resizable: true,\n      contentClasses: [\"standard-form\"]\n    },\n    position: {\n      width: 550,\n      height: 700\n    },\n    form: {\n      closeOnSubmit: false,\n      submitOnChange: true,\n      handler: OverTimeEditor.#onFormChange as any\n    },\n    actions: {\n      save: OverTimeEditor.#onSave,\n      cancel: OverTimeEditor.#onCancel\n    }\n  };\n\n  static override PARTS = {\n    form: {\n      template: \"modules/midi-qol/templates/apps/OverTimeEditor/overTimeEditor.hbs\",\n      scrollable: [\".overtime-editor-scroll\"]\n    }\n  };\n\n  get title(): string {\n    return `${i18n(\"midi-qol.OverTimeEditor.Title\")}: ${this.effect?.name ?? \"\"}`;\n  }\n\n  /** Serialize currentData through the same serializer used for saving */\n  #serializeCurrentData(): string {\n    const data = { ...this.currentData };\n    data.saveAbility = data.saveAbilityString;\n    data.saveDC = data.saveDCRaw;\n    return serializeOvertimeDetails(data);\n  }\n\n  get hasUnsavedChanges(): boolean {\n    return this.#serializeCurrentData() !== this.originalSerialized;\n  }\n\n  override async close(options?: foundry.applications.api.ApplicationV2.ClosingOptions): Promise<this> {\n    if (!this.submitted && this.hasUnsavedChanges) {\n      const confirmed = await foundry.applications.api.DialogV2.confirm({\n        window: { title: i18n(\"midi-qol.OverTimeEditor.UnsavedTitle\") },\n        content: `<p>${i18n(\"midi-qol.OverTimeEditor.UnsavedContent\")}</p>`,\n        yes: { label: i18n(\"midi-qol.OverTimeEditor.CloseWithoutSaving\") },\n        no: { label: i18n(\"midi-qol.OverTimeEditor.Cancel\") }\n      });\n      if (!confirmed) return this;\n    }\n    return super.close(options);\n  }\n\n  /**\n   * Parse the raw OverTime string into key=value pairs without @-field evaluation.\n   * We don't call parseOvertimeDetails because that evaluates @-expressions via Roll.safeEval,\n   * which would lose the raw formula strings the user needs to edit.\n   */\n  parseRawOvertime(specString: string): Record<string, string> {\n    const raw: Record<string, string> = {};\n    if (!specString) return raw;\n\n    const cleanSpec = specString.replace(/\\s*=\\s*/g, \"=\").replace(/\\s*,\\s*/g, \",\").replace(\"\\n\", \"\");\n    let parts: string[];\n    if (cleanSpec.includes(\"#\")) parts = cleanSpec.split(\"#\");\n    else parts = cleanSpec.split(\",\");\n\n    for (const part of parts) {\n      const p = part.split(\"=\");\n      if (p.length >= 2) {\n        raw[p[0]] = p.slice(1).join(\"=\");\n      }\n    }\n    return raw;\n  }\n\n  /** Build the internal form data representation from a raw OverTime string */\n  #buildFormData(specString: string): Record<string, any> {\n    const raw = this.parseRawOvertime(specString);\n\n    const data: Record<string, any> = {\n      turn: raw.turn || \"start\",\n      label: (raw.name ?? raw.label ?? this.effect?.name ?? \"\").replace(/\"/g, \"\"),\n      rollType: raw.rollType ?? (raw.saveAbility ? \"save\" : \"damage\"),\n      saveAbilityString: raw.saveAbility ?? \"\",\n      saveDCRaw: raw.saveDC ?? \"\",\n      saveMagic: parseBool(raw.saveMagic, false),\n      damageRoll: raw.damageRoll ?? \"\",\n      damageType: raw.damageType ?? \"\",\n      damageBeforeSave: parseBool(raw.damageBeforeSave, false),\n      saveDamage: raw.saveDamage ?? \"nodamage\",\n      actionSave: raw.actionSave ?? \"none\",\n      applyCondition: raw.applyCondition ?? raw.condition ?? \"\",\n      removeCondition: raw.removeCondition ?? \"\",\n      macro: raw.macro ?? \"\",\n      itemName: raw.itemName ?? \"\",\n      chatFlavor: raw.chatFlavor ?? \"\",\n      rollMode: raw.rollMode ?? \"default\",\n      fastForwardDamage: parseBool(raw.fastForwardDamage, true),\n      fastForwardAttack: parseBool(raw.fastForwardAttack, true),\n      autoRollAttack: parseBool(raw.autoRollAttack, true),\n      autoRollDamage: parseBool(raw.autoRollDamage, true),\n      allowIncapacitated: parseBool(raw.allowIncapacitated, false),\n      killAnim: parseBool(raw.killAnim, false),\n      // Count fields — defaults\n      saveCountEnabled: false,\n      saveCountNum: 1,\n      saveCountMode: \"remove\",\n      saveCountConsecutive: false,\n      saveCountEffectSpec: \"\",\n      failCountEnabled: false,\n      failCountNum: 1,\n      failCountMode: \"permanent\",\n      failCountConsecutive: false,\n      failCountEffectSpec: \"\",\n      // Runtime state from effect flags (not part of spec string)\n      permanent: false,\n    };\n\n    // Parse save count\n    if (raw.saveCount !== undefined) {\n      data.saveCountEnabled = true;\n      const parsed = this.parseCountFields(raw.saveCount);\n      data.saveCountNum = parsed.count;\n      data.saveCountMode = parsed.mode;\n      data.saveCountConsecutive = parsed.consecutive;\n      data.saveCountEffectSpec = parsed.effectSpec;\n    } else if (raw.saveRemove !== undefined) {\n      foundry.utils.logCompatibilityWarning(`midi-qol | OverTimeEditor | saveRemove is deprecated, use saveCount instead (saveRemove=${raw.saveRemove})`,\n        { since: \"midi-qol 13.0.43\", until: \"midi-qol 13.1.0\" });\n      if (raw.saveRemove === \"true\" || raw.saveRemove === \"1\") {\n        data.saveCountEnabled = true;\n        data.saveCountNum = 1;\n        data.saveCountMode = \"remove\";\n      } else if (raw.saveRemove !== \"false\" && raw.saveRemove !== \"0\") {\n        data.saveCountEnabled = true;\n        const parsed = this.parseCountFields(raw.saveRemove);\n        data.saveCountNum = parsed.count;\n        data.saveCountMode = parsed.mode;\n        data.saveCountConsecutive = parsed.consecutive;\n        data.saveCountEffectSpec = parsed.effectSpec;\n      }\n    }\n\n    // Parse fail count\n    if (raw.failCount !== undefined) {\n      data.failCountEnabled = true;\n      const parsed = this.parseCountFields(raw.failCount);\n      data.failCountNum = parsed.count;\n      data.failCountMode = parsed.mode;\n      data.failCountConsecutive = parsed.consecutive;\n      data.failCountEffectSpec = parsed.effectSpec;\n    } else if (raw.failRemove !== undefined) {\n      foundry.utils.logCompatibilityWarning(`midi-qol | OverTimeEditor | failRemove is deprecated, use failCount instead (failRemove=${raw.failRemove})`,\n        { since: \"midi-qol 13.0.43\", until: \"midi-qol 13.1.0\" });\n      data.failCountEnabled = true;\n      const parsed = this.parseCountFields(raw.failRemove);\n      data.failCountNum = parsed.count;\n      data.failCountMode = parsed.mode;\n      data.failCountConsecutive = parsed.consecutive;\n      data.failCountEffectSpec = parsed.effectSpec;\n    }\n\n    // Read permanent flag from effect (runtime state, not part of spec string)\n    data.permanent = !!(this.effect as any)?.flags?.[MODULE_ID]?.overtime?.permanent;\n\n    return data;\n  }\n\n  override async _prepareContext(options: foundry.applications.api.ApplicationV2.RenderOptions) {\n    const context: Record<string, any> = await super._prepareContext(options);\n\n    context.details = this.currentData;\n\n    // Computed visibility flags\n    context.isSaveType = [\"save\", \"check\", \"skill\"].includes(this.currentData.rollType);\n    context.isSaveRoll = this.currentData.rollType === \"save\";\n    context.isCheckRoll = this.currentData.rollType === \"check\";\n    context.isSkillRoll = this.currentData.rollType === \"skill\";\n    context.showSaveDamage = context.isSaveType && !this.currentData.damageBeforeSave;\n\n    // Selected abilities/skills from saveAbilityString\n    const selectedValues = this.currentData.saveAbilityString\n      ? this.currentData.saveAbilityString.split(\"|\").map((s: string) => s.trim().toLowerCase())\n      : [];\n    context.selectedAbilities = selectedValues;\n    context.selectedAbility = selectedValues[0] ?? \"\";\n\n    // Ability options for selectOptions helper (save and check roll types)\n    const abilitySelectOptions: Record<string, string> = {};\n    for (const [key, value] of Object.entries(CONFIG.DND5E?.abilities ?? {})) {\n      abilitySelectOptions[key] = (value as any).label ?? key;\n    }\n    context.abilitySelectOptions = abilitySelectOptions;\n\n    // Skill options for selectOptions helper (skill roll type)\n    const skillSelectOptions: Record<string, string> = {};\n    for (const [key, value] of Object.entries(CONFIG.DND5E?.skills ?? {})) {\n      skillSelectOptions[key] = (value as any).label ?? key;\n    }\n    context.skillSelectOptions = skillSelectOptions;\n\n    // Count fields at top level for template access\n    context.saveCountEnabled = this.currentData.saveCountEnabled;\n    context.saveCountNum = this.currentData.saveCountNum;\n    context.saveCountMode = this.currentData.saveCountMode;\n    context.saveCountConsecutive = this.currentData.saveCountConsecutive;\n    context.saveCountEffectSpec = this.currentData.saveCountEffectSpec;\n    context.failCountEnabled = this.currentData.failCountEnabled;\n    context.failCountNum = this.currentData.failCountNum;\n    context.failCountMode = this.currentData.failCountMode;\n    context.failCountConsecutive = this.currentData.failCountConsecutive;\n    context.failCountEffectSpec = this.currentData.failCountEffectSpec;\n    context.permanent = this.currentData.permanent;\n\n    // Dropdown options\n    context.turnOptions = {\n      start: \"midi-qol.OverTimeEditor.TurnStart\",\n      end: \"midi-qol.OverTimeEditor.TurnEnd\"\n    };\n\n    context.rollTypeOptions = {\n      save: \"midi-qol.OverTimeEditor.RollTypeSave\",\n      check: \"midi-qol.OverTimeEditor.RollTypeCheck\",\n      skill: \"midi-qol.OverTimeEditor.RollTypeSkill\",\n      damage: \"midi-qol.OverTimeEditor.RollTypeDamage\"\n    };\n\n    // Build damage type options from dnd5e config\n    const damageTypeOptions: Record<string, string> = { \"\": \"None\" };\n    const damageTypes = CONFIG.DND5E?.damageTypes ?? {};\n    for (const [key, value] of Object.entries(damageTypes)) {\n      damageTypeOptions[key] = (value as any).label ?? key;\n    }\n    const healingTypes = CONFIG.DND5E?.healingTypes ?? {};\n    for (const [key, value] of Object.entries(healingTypes)) {\n      damageTypeOptions[key] = (value as any).label ?? key;\n    }\n    // Add vitality if registered by midi-qol\n    if (GameSystemConfig.damageTypes?.[\"vitality\"]) {\n      damageTypeOptions[\"vitality\"] = GameSystemConfig.damageTypes[\"vitality\"].label ?? \"Vitality\";\n    }\n    context.damageTypeOptions = damageTypeOptions;\n\n    context.saveDamageOptions = {\n      nodamage: \"midi-qol.OverTimeEditor.NoDamage\",\n      halfdamage: \"midi-qol.OverTimeEditor.HalfDamage\",\n      fulldamage: \"midi-qol.OverTimeEditor.FullDamage\"\n    };\n\n    context.countModeOptions = {\n      remove: \"midi-qol.OverTimeEditor.CountRemove\",\n      permanent: \"midi-qol.OverTimeEditor.CountPermanent\"\n    };\n\n    context.actionSaveOptions = {\n      none: \"midi-qol.OverTimeEditor.ActionSaveNone\",\n      dialog: \"midi-qol.OverTimeEditor.ActionSaveDialog\",\n      roll: \"midi-qol.OverTimeEditor.ActionSaveRoll\"\n    };\n\n    context.rollModeOptions = {\n      default: \"midi-qol.OverTimeEditor.RollModeDefault\",\n      publicroll: \"midi-qol.OverTimeEditor.RollModePublic\",\n      gmroll: \"midi-qol.OverTimeEditor.RollModeGM\",\n      blindroll: \"midi-qol.OverTimeEditor.RollModeBlind\",\n      selfroll: \"midi-qol.OverTimeEditor.RollModeSelf\"\n    };\n\n    return context;\n  }\n\n  /** Parse a count action string into its component fields for the form */\n  parseCountFields(value: string): { count: number; mode: string; consecutive: boolean; effectSpec: string } {\n    let consecutive = false;\n    let working = value;\n    const digitEnd = working.search(/\\D/);\n    if (digitEnd > 0 && working[digitEnd] === \"c\") {\n      consecutive = true;\n      working = working.substring(0, digitEnd) + working.substring(digitEnd + 1);\n    }\n\n    const minusIndex = working.indexOf(\"-\");\n    const plusIndex = working.indexOf(\"+\");\n\n    let actionIndex = -1;\n    let mode = \"remove\";\n    if (minusIndex > 0 && (plusIndex === -1 || minusIndex < plusIndex)) {\n      actionIndex = minusIndex;\n      mode = \"remove\";\n    } else if (plusIndex > 0) {\n      actionIndex = plusIndex;\n      mode = \"permanent\";\n    }\n\n    if (actionIndex === -1) {\n      return { count: Number(working) || 1, mode: \"remove\", consecutive, effectSpec: \"\" };\n    }\n\n    const count = Number(working.substring(0, actionIndex)) || 1;\n    const effectSpec = working.substring(actionIndex + 1) || \"\";\n    return { count, mode, consecutive, effectSpec };\n  }\n\n  override async _onRender(context: Record<string, any>, options: foundry.applications.api.ApplicationV2.RenderOptions) {\n    await super._onRender(context, options);\n\n    // Drag-drop support for itemName and macro fields\n    new foundry.applications.ux.DragDrop.implementation({\n      dropSelector: \"input[name='itemName'], input[name='macro']\",\n      callbacks: {\n        drop: this.#onDrop.bind(this)\n      }\n    }).bind(this.element);\n  }\n\n  async #onDrop(ev: DragEvent): Promise<void> {\n    ev.preventDefault();\n    const data: any = foundry.applications.ux.TextEditor.getDragEventData(ev);\n    if (data.uuid && ev.target) {\n      (ev.target as HTMLInputElement).value = data.uuid;\n    }\n  }\n\n  /** Handle form changes (submitOnChange) — updates internal state and re-renders */\n  static async #onFormChange(\n    this: OverTimeEditor,\n    event: Event | SubmitEvent,\n    form: HTMLFormElement,\n    formData: foundry.applications.ux.FormDataExtended\n  ): Promise<void> {\n    const data = foundry.utils.expandObject(formData.object) as Record<string, any>;\n\n    // Handle save ability/skill selection (multi-select returns array, single select returns string)\n    if (\"saveAbility\" in data) {\n      const val = data.saveAbility;\n      if (Array.isArray(val)) {\n        this.currentData.saveAbilityString = val.join(\"|\");\n      } else {\n        this.currentData.saveAbilityString = val ?? \"\";\n      }\n    }\n\n    // Handle renamed field\n    if (\"saveDC\" in data) {\n      this.currentData.saveDCRaw = data.saveDC;\n    }\n\n    // Direct-mapped fields (form name matches currentData name)\n    // Only update if the field is present in the form data (hidden fields won't be)\n    const directFields = [\n      \"turn\", \"label\", \"rollType\", \"saveMagic\",\n      \"damageRoll\", \"damageType\", \"damageBeforeSave\", \"saveDamage\",\n      \"actionSave\", \"applyCondition\", \"removeCondition\",\n      \"macro\", \"itemName\", \"chatFlavor\", \"rollMode\",\n      \"fastForwardDamage\", \"fastForwardAttack\", \"autoRollAttack\", \"autoRollDamage\",\n      \"allowIncapacitated\", \"killAnim\",\n      \"saveCountEnabled\", \"saveCountNum\", \"saveCountMode\", \"saveCountConsecutive\", \"saveCountEffectSpec\",\n      \"failCountEnabled\", \"failCountNum\", \"failCountMode\", \"failCountConsecutive\", \"failCountEffectSpec\",\n      \"permanent\",\n    ];\n\n    for (const field of directFields) {\n      if (field in data) {\n        this.currentData[field] = data[field];\n      }\n    }\n\n    this.render();\n  }\n\n  /** Save action — serialize current data and call the callback */\n  static async #onSave(this: OverTimeEditor): Promise<void> {\n    const data = { ...this.currentData };\n    // Map internal names to what serializeOvertimeDetails expects\n    data.saveAbility = data.saveAbilityString;\n    data.saveDC = data.saveDCRaw;\n\n    const result = serializeOvertimeDetails(data);\n\n    // Update permanent flag on effect only if it changed\n    if (this.currentData.permanent !== this.originalPermanent) {\n      const flagUpdate: Record<string, any> = {\n        [`flags.${MODULE_ID}.overtime.permanent`]: this.currentData.permanent || null\n      };\n      await (this.effect as ActiveEffect.Implementation).update(flagUpdate);\n    }\n\n    this.submitted = true;\n    this.onSubmitCallback(result);\n    this.close();\n  }\n\n  static #onCancel(this: OverTimeEditor): void {\n    this.submitted = true;\n    this.onCancelCallback();\n    this.close();\n  }\n\n  override async _preClose(options): Promise<void> {\n    await super._preClose(options);\n    if (!this.submitted) {\n      this.onCancelCallback();\n    }\n  }\n}\n","import { GameSystemConfig, MESSAGE_TYPES, MODULE_ID, MQDamageRollTypes, debugEnabled, i18n, log } from \"../../midi-qol.js\";\nimport { configSettings, safeGetGameSetting, saveToChatCard } from \"../settings.js\";\nimport { getToken } from \"../utils.js\";\nimport { setDamageRollMinTerms } from \"../activities/activityHelpers.js\";\n\nconst midiAutoAppliesDamage = () => !!configSettings.autoApplyDamage?.toLowerCase().includes(\"yes\");\nconst removeAll = (html: HTMLElement, sel: string) => html.querySelectorAll(sel).forEach(el => el.remove());\nconst hideAll = (html: HTMLElement, sel: string) => html.querySelectorAll<HTMLElement>(sel).forEach(el => el.style.display = \"none\");\nconst stripHighlight = (html: HTMLElement, sel: string) => html.querySelectorAll<HTMLElement>(sel).forEach(\n  el => el.classList.remove(\"success\", \"failure\", \"critical\", \"fumble\")\n);\n\nimport Token = foundry.canvas.placeables.Token;\nlet _highlighted: Token.Implementation | null = null;\n\nconst onTargetHover = (event) => {\n  event.preventDefault();\n  if (!canvas.scene?.active) return;\n  const token = canvas.tokens?.get(event.currentTarget?.dataset?.id ?? \"\");\n  if (token?.isVisible) {\n    //@ts-expect-error _onHoverIn\n    if (!token.controlled) token._onHoverIn(event);\n    _highlighted = token;\n  }\n}\n\nconst onTargetHoverOut = (event) => {\n  event.preventDefault();\n  if (!canvas.scene?.active) return;\n  //@ts-expect-error onHoverOut\n  if (_highlighted) _highlighted._onHoverOut(event);\n  _highlighted = null;\n}\n\nconst onTargetSelect = (event) => {\n  event.stopPropagation();\n  event.preventDefault();\n  if (!canvas.scene?.active) return;\n  const token = canvas.tokens?.get(event.currentTarget.dataset.id);\n  if (token?.controlled) token?.release();\n  else if (token && token?.isVisible && game.user && token.actor?.testUserPermission(game.user, \"OWNER\")) {\n    token.control({ releaseOthers: false });\n    canvas.animatePan(token.center)\n  }\n};\n\nfunction onTargetShow(event) {\n  event.stopImmediatePropagation();\n  event.preventDefault();\n  if (!canvas.scene?.active) return;\n  const token = canvas.tokens?.get(event.currentTarget.dataset.id);\n  if (game.user && token?.actor?.testUserPermission(game.user, \"OWNER\")) {\n    token.actor.sheet?.render(true);\n  }\n}\n\nexport let ChatMessageMidi: ReturnType<typeof defineChatMessageMidiClass>;\n\nexport function setupChatMessageMidi() {\n  ChatMessageMidi = defineChatMessageMidiClass(globalThis.dnd5e.documents.ChatMessage5e);\n  CONFIG.ChatMessage.batchSize = 25;\n  globalThis.dnd5e.documents.ChatMessage5e.TRAY_TYPES.push(\"midi-damage-application\");\n}\n\nexport function defineChatMessageMidiClass(baseClass: ChatMessage.ImplementationClass) {\n  return class ChatMessageMidi extends baseClass /*globalThis.dnd5e.documents.ChatMessage5e*/ {\n\n    prepareDerivedData() {\n      super.prepareDerivedData();\n\n      // Deserialize roll flags in-place from JSON to Roll instances (same pattern as Foundry core's ChatMessage.rolls)\n      const midiFlags = this.flags?.[MODULE_ID];\n      if (!midiFlags) return;\n\n      const attackData = midiFlags.attackRoll;\n      if (attackData && !(attackData instanceof Roll)) {\n        midiFlags.attackRoll = Roll.fromData(attackData) as Roll;\n      }\n\n      for (const field of [\"damageRolls\", \"bonusDamageRolls\", \"otherDamageRolls\",\n        \"utilityRolls\"] as const) {\n        const data = midiFlags[field];\n        if (data?.length) {\n          midiFlags[field] = data.map((r: any) => r instanceof Roll ? r : Roll.fromData(r));\n        }\n      }\n    }\n\n    static get TRAY_TYPES() {\n      return globalThis.dnd5e.documents.ChatMessage5e.TRAY_TYPES.concat([\"midi-damage-application\"]);\n    }\n    get isRoll() {\n      if (this.flags?.[MODULE_ID]?.messageType) return false // do this so that dsn won't trigger\n      return super.isRoll;\n    }\n\n    get hasRolls() {\n      if ((this.flags?.[MODULE_ID]?.roll?.length ?? 0) > 0) return true;\n      return super.isRoll;\n    }\n    // midi has it's own target handling so don't display the attack targets here (however, DO display the mastery)\n    _enrichAttackTargets(html) {\n      // This code borrowed from the start of the system's ChatMessage5e#_enrichAttackTargets method\n      const attackRoll = this.rolls[0];\n      // @ts-expect-error no dnd5e-types\n      if (!(attackRoll instanceof dnd5e.dice.D20Roll)) return;\n\n      // @ts-expect-error no dnd5e-types\n      const masteryConfig = CONFIG.DND5E.weaponMasteries[attackRoll.options.mastery];\n      if (!masteryConfig) return;\n\n      const p = document.createElement(\"p\");\n      p.classList.add(\"supplement\");\n      let mastery = masteryConfig.label;\n      if (masteryConfig.reference) mastery = `\n        <a class=\"content-link\" draggable=\"true\" data-link data-uuid=\"${masteryConfig.reference}\"\n           data-tooltip=\"${mastery}\" style=\"text-wrap: auto;\">${mastery}</a>\n      `;\n      p.innerHTML = `<string>${i18n(\"DND5E.WEAPON.Mastery.Flavor\")}</string> ${mastery}`;\n      const condensedSection = html.querySelector(\".midi-results > .flexrow\");\n      if (condensedSection) {\n        condensedSection.after(p);\n      } else {\n        html.querySelector(\".midi-qol-attack-roll\")?.appendChild(p);\n      }\n    }\n\n    get canSelectTargets() {\n      if (this.flags?.[MODULE_ID]?.messageType === \"attack\") return true;\n      // @ts-expect-error no dnd5e-types\n      return super.canSelectTargets;\n    }\n\n    get canApplyDamage() {\n      if ((this.flags?.[MODULE_ID]?.damageDetail?.length ?? 0) > 0 && this.isContentVisible && !!canvas.tokens?.controlled.length) return true;\n      // @ts-expect-error no dnd5e-types\n      return super.canApplyDamage;\n    }\n\n    // Patch for getAssociatedItem not preparing data on items recovered from item.data\n    getAssociatedItem() {\n      if (this.flags?.[MODULE_ID]?.syntheticItem) {\n        const storedData = this.flags.dnd5e?.item?.data;\n        //@ts-expect-error no dnd5e-types\n        const actor = super.getAssociatedActor();\n        if (storedData) return new Item.implementation(storedData, { parent: actor })\n      }\n      // @ts-expect-error no dnd5e-types\n      return super.getAssociatedItem();\n    }\n\n    /**\n  * Select the hit or missed targets.\n  * @param {HTMLElement} li    The chat entry which contains the roll data.\n  * @param {string} type       The type of selection ('hit' or 'miss').\n  */\n    selectTargets(li: HTMLElement, type: string) {\n      if (!canvas?.ready) return;\n      // @ts-expect-error no dnd5e-types\n      if (!this.flags?.[MODULE_ID]) return super.selectTargets(li, type);\n      const targetData = this.getFlag(MODULE_ID, \"targets\") || [];\n      const targetUuids: string[] = targetData.map(t => t.uuid);\n      let hitTargetUuids: string[] = this.getFlag(MODULE_ID, \"hitTargetUuids\") || [];\n      let uuids: string[];\n      if (type === \"hit\") uuids = hitTargetUuids\n      else uuids = targetUuids.filter(uuid => !hitTargetUuids.includes(uuid));\n      canvas.tokens?.releaseAll();\n      uuids.forEach(uuid => {\n        const token = getToken(uuid);\n        if (!token?.actor || !game.user) return;\n        if (token.isVisible && token.actor.testUserPermission(game.user, \"OWNER\")) {\n          token.control({ releaseOthers: false });\n        }\n      });\n    }\n\n    /**\n   * Apply rolled dice damage to the token or tokens which are currently controlled.\n   * This allows for damage to be scaled by a multiplier to account for healing, critical hits, or resistance\n   *\n   * @param {HTMLElement} li      The chat entry which contains the roll data\n   * @param {number} multiplier   A damage multiplier to apply to the rolled damage.\n   * @returns {Promise}\n   */\n    applyChatCardDamage(li: HTMLElement, multiplier: number) {\n      const type = this.flags.dnd5e?.roll?.type;\n      // @ts-expect-error no dnd5e-types\n      if (type !== undefined || !this.flags?.[MODULE_ID]) return super.applyChatCardDamage(li, multiplier);\n      const rollsToCheck = this.rolls.filter(r => MQDamageRollTypes.includes(foundry.utils.getProperty(r, \"options.midi-qol.rollType\") as string));\n      //@ts-expect-error no dnd5e-types\n      const damages = game.system.dice.aggregateDamageRolls(rollsToCheck, { respectProperties: true }).map(roll => ({\n        value: roll.total,\n        type: roll.options.type,\n        properties: new Set(roll.options.properties ?? [])\n      }));\n      if (canvas.tokens) {\n        return Promise.all(canvas.tokens.controlled.map(t => {\n          //@ts-expect-error no dnd5e-types\n          return t.actor?.applyDamage(damages, { multiplier, invertHealing: false, ignore: true });\n        }));\n      }\n    }\n    \n    applyChatCardTemp(li: HTMLElement) {\n      if (!canvas.tokens) return;\n      const rollsToCheck = this.rolls.filter(r => MQDamageRollTypes.includes(foundry.utils.getProperty(r, \"options.midi-qol.rollType\") as string));\n      const total = rollsToCheck.reduce((acc, roll) => acc + (roll.total ?? 0), 0);\n\n      return Promise.all(canvas.tokens.controlled.map(t => {\n        //@ts-expect-error no dnd5e-types\n        return t.actor?.applyTempHP(total);\n      }));\n    }\n\n    collectRolls(rollsToAccumulate: Roll[], multiRolls: boolean = false, options: { blind?: boolean }): any[] {\n      const returns: any[] = [];\n      setDamageRollMinTerms(rollsToAccumulate);\n      const formulaInToolTip = [\"formula\", \"formulaadv\"].includes(configSettings.rollAlternate);\n      const hideDetails = this.author?.isGM && !game.user?.isGM && ((configSettings.gmDamageDisplay ?? \"full\") !== \"full\");\n      const hideFormula = hideDetails || (options.blind && !game.user?.isGM);\n      const rollSets: Roll[][] = multiRolls ? rollsToAccumulate.map(r => [r]) : [rollsToAccumulate];\n      for (const rolls of rollSets) {\n        //@ts-expect-error\n        let { formula, total, breakdown } = game.system.dice.aggregateDamageRolls(rolls).reduce((obj: any, r) => {\n          obj.formula.push(r.formula);\n          obj.total += Math.max(0, r.total);\n          // @ts-expect-error no dnd5e-types\n          obj.breakdown.push(this._simplifyDamageRoll(r));\n          return obj;\n        }, { formula: [], total: 0, breakdown: [] });\n        formula = formula.join(\" \");\n        formula = formula.replace(/^\\s+\\+\\s+/, \"\");\n        formula = formula.replaceAll(/  /g, \" \");\n        if (multiRolls) {\n          foundry.utils.setProperty(rolls[0], \"flags.midi-qol.breakdown\", breakdown);\n          foundry.utils.setProperty(rolls[0], \"flags.midi-qol.total\", total);\n        }\n        if (hideDetails && (configSettings.gmDamageDisplay ?? \"full\") === \"hidden\") {\n          total = \"--\";\n        }\n        if (options.blind && !game.user?.isGM) total = \"--\";\n        const roll = document.createElement(\"div\");\n        roll.classList.add(\"dice-roll\");\n        let tooltipContents = \"\"\n        if (!hideDetails) tooltipContents = breakdown.reduce((str, { type, total, constant, dice }) => {\n          const config = GameSystemConfig.damageTypes[type] ?? GameSystemConfig.healingTypes[type];\n          return `${str}\n              <section class=\"tooltip-part\">\n                <div class=\"dice\">\n                  <ol class=\"dice-rolls\">\n                    ${dice.reduce((str, { result, classes }) => `\n                      ${str}<li class=\"roll ${classes}\">${result}</li>\n                    `, \"\")}\n                    ${constant ? `\n                    <li class=\"constant\"><span class=\"sign\">${constant < 0 ? \"-\" : \"+\"}</span>${Math.abs(constant)}</li>\n                    ` : \"\"}\n                  </ol>\n                  <div class=\"total\">\n                    ${config ? `<img src=\"${config.icon}\" alt=\"${config.label}\">` : \"\"}\n                    <span class=\"label\">${config?.label ?? \"\"}</span>\n                    <span class=\"value\">${total}</span>\n                  </div>\n                </div>\n              </section>\n            `;\n        }, \"\");\n\n        let diceFormula = \"\";\n        if (!hideFormula) diceFormula = `<div class=\"dice-formula\">${formula}</div>`;\n        roll.innerHTML = `\n      <div class=\"dice-result\">\n      ${formulaInToolTip ? \"\" : diceFormula}\n        <div class=\"dice-tooltip-collapser\">\n          <div class=\"dice-tooltip\">\n            ${formulaInToolTip ? diceFormula : \"\"}\n            ${tooltipContents}\n          </div>\n        </div>\n        <h4 class=\"dice-total\">${total}${this._buildDamageTypeIcons(breakdown)}</h4>\n      </div>\n    `;\n        returns.push(roll);\n      }\n      return returns;\n    }\n\n    _buildDamageTypeIcons(breakdown: { type: string }[]): string {\n      const uniqueTypes = [...new Set(breakdown.map(b => b.type).filter(Boolean))];\n      return uniqueTypes.map(type => {\n        const config = GameSystemConfig.damageTypes[type] ?? GameSystemConfig.healingTypes?.[type];\n        if (!config?.icon) return \"\";\n        return `<dnd5e-icon class=\"midi-damage-type-icon\" src=\"${config.icon}\" aria-label=\"${config.label ?? \"\"}\" data-tooltip=\"${config.label ?? \"\"}\"></dnd5e-icon>`;\n      }).join(\"\");\n    }\n\n    // Removes the dnd5e effects tray from the rendered chat card when midi's\n    // autoItemEffects suppresses the apply button. dnd5e v5.x emits an\n    // <effect-application> custom element from usage-card.hbs which renders\n    // itself in connectedCallback — there's no longer a _enrichUsageEffects\n    // method to skip, so we strip the element from the DOM after super runs.\n    _maybeStripEffectsTray(html: HTMLElement) {\n      if ([\"applyNoButton\", \"applyRemove\"].includes(configSettings.autoItemEffects)) {\n        html.querySelectorAll(\"effect-application\").forEach(el => el.remove());\n      }\n    }\n\n    _enrichDamageTooltip(rolls: Roll[], html: HTMLElement) {\n      if (this.flags?.dnd5e?.roll?.type !== undefined || !this.flags?.[MODULE_ID])\n        // @ts-expect-error no dnd5e-types\n        return super._enrichDamageTooltip(rolls, html);\n      for (let rollType of MQDamageRollTypes) {\n        const rollsToCheck = this.rolls.filter(r => foundry.utils.getProperty(r, \"options.midi-qol.rollType\") === rollType);\n        let rType = \"damage\";\n        if (rollType === \"otherDamage\") rType = \"other-damage\";\n        else if (rollType === \"bonusDamage\") rType = \"bonus-damage\";\n        if (rollsToCheck?.length) {\n          html.querySelectorAll(`.midi-${rType}-roll`)?.forEach(el => el.remove());\n          for (let roll of this.collectRolls(rollsToCheck, configSettings.mergeCardMultiDamage, { blind: this.blind })) {\n            roll.classList.add(`midi-${rType}-roll`);\n            if (rType === \"bonus-damage\") {\n              const flavor = document.createElement(\"div\");\n              // @ts-expect-error no dnd5e-types\n              const flavors = rollsToCheck.map(r => r.options.flavor ?? r.options.type);\n              const bonusDamageFlavor = flavors.join(\", \");\n              flavor.classList.add(\"midi-bonus-damage-flavor\");\n              flavor.innerHTML = bonusDamageFlavor;\n              html.querySelector(`.midi-qol-${rType}-roll`)?.appendChild(flavor);\n            }\n            html.querySelector(`.midi-qol-${rType}-roll`)?.appendChild(roll);\n          }\n        }\n      }\n\n      let shouldAddButtons = (configSettings.addChatDamageButtons === \"both\")\n        || ((configSettings.addChatDamageButtons === \"gm\") && game.user?.isGM)\n        || ((configSettings.addChatDamageButtons === \"pc\") && !game.user?.isGM);\n      if (game.user?.isGM && configSettings.autoApplyDamage === \"none\") shouldAddButtons = true;\n      if (shouldAddButtons) {\n        for (let dType of MQDamageRollTypes) {\n          rolls = this.rolls.filter(r => foundry.utils.getProperty(r, \"options.midi-qol.rollType\") === dType);\n          if (!rolls.length) continue;\n          let damageApplication = document.createElement(\"midi-damage-application\");\n          //@ts-expect-error\n          damageApplication.damageType = dType;\n          //@ts-expect-error\n          damageApplication.damages = game.system.dice.aggregateDamageRolls(rolls, { respectProperties: true }).map(roll => ({\n            value: Math.max(0, roll.total),\n            type: roll.options.type,\n            properties: new Set(roll.options.properties ?? [])\n          }));\n          // Set the initial open state directly so connectedCallback renders correctly.\n          // _collapseTrays (overridden below) keeps it in sync on re-render, bypassing the\n          // dnd5e _trayStates className/tagName collision.\n          damageApplication.toggleAttribute(\"open\", !midiAutoAppliesDamage());\n          html.querySelector(\".message-content\")?.appendChild(damageApplication);\n        }\n      }\n    }\n\n    _collapseTrays(html: HTMLElement) {\n      // @ts-expect-error no dnd5e-types\n      super._collapseTrays(html);\n      if (!this.flags?.[MODULE_ID]?.messageType) return;\n      const open = !midiAutoAppliesDamage();\n      html.querySelectorAll(\"midi-damage-application\").forEach(el => {\n        el.toggleAttribute(\"open\", open);\n        el.querySelector(\".collapsible\")?.classList.toggle(\"collapsed\", !open);\n      });\n    }\n\n    _highlightCriticalSuccessFailure(html: HTMLElement) {\n      // @ts-expect-error no dnd5e-types\n      super._highlightCriticalSuccessFailure(html);\n      // dnd5e only adds critical/fumble for attack and death saves.\n      // Add critical/fumble highlighting for other d20 rolls (saves, ability checks).\n      const totals = html.querySelectorAll(\".dice-total\");\n      for (let [index, d20Roll] of this.rolls.entries()) {\n        const total = totals[index];\n        if (!total || total.classList.contains(\"critical\") || total.classList.contains(\"fumble\")) continue;\n        const d0 = d20Roll?.dice?.[0];\n        if (!d0 || d0.faces !== 20 || d0.values?.length !== 1) continue;\n        // @ts-expect-error D20Roll not typed\n        const d20 = dnd5e.dice.D20Roll.fromRoll(d20Roll);\n        if (d20.isCritical) {\n          total.classList.add(\"critical\");\n          if (!total.querySelector(\".icons\")) {\n            const icons = document.createElement(\"div\");\n            icons.classList.add(\"icons\");\n            const icon = document.createElement(\"i\");\n            icon.classList.add(\"fas\", \"fa-check-double\");\n            icon.setAttribute(\"inert\", \"\");\n            icons.append(icon);\n            total.append(icons);\n          }\n        } else if (d20.isFumble) {\n          total.classList.add(\"fumble\");\n          if (!total.querySelector(\".icons\")) {\n            const icons = document.createElement(\"div\");\n            icons.classList.add(\"icons\");\n            for (let i = 0; i < 2; i++) {\n              const icon = document.createElement(\"i\");\n              icon.classList.add(\"fas\", \"fa-xmark\");\n              icon.setAttribute(\"inert\", \"\");\n              icons.append(icon);\n            }\n            total.append(icons);\n          }\n        }\n      }\n      this._applyMidiHighlightSettings(html);\n    }\n\n    /**\n     * Strip or adjust classes and icons based on midi highlight/visibility settings.\n     */\n    private _applyMidiHighlightSettings(html: HTMLElement) {\n      const isMidiMessage = !!this.flags?.[MODULE_ID]?.messageType;\n      const hideResult = isMidiMessage && !game.user?.isGM && ([\"whisper\", \"gmOnly\"].includes(configSettings.autoCheckHit) || safeGetGameSetting(\"dnd5e\", \"attackRollVisibility\") === \"none\");\n      const totals = html.querySelectorAll(\".dice-total\");\n      for (const total of Array.from(totals)) {\n        if (hideResult || !configSettings.highlightSuccess) {\n          total.classList.remove(\"success\", \"failure\", \"critical\", \"fumble\");\n          total.querySelector(\".icons\")?.remove();\n        } else if (configSettings.highLightCriticalAttackOnly) {\n          const hadSuccessOrFailure = total.classList.contains(\"success\") || total.classList.contains(\"failure\");\n          total.classList.remove(\"success\", \"failure\");\n          // Only remove icons if this total had success/failure but not critical/fumble\n          if (hadSuccessOrFailure && !total.classList.contains(\"critical\") && !total.classList.contains(\"fumble\")) {\n            total.querySelector(\".icons\")?.remove();\n          }\n        }\n      }\n    }\n\n    /**\n     * Add critical/fumble/success/failure classes and icons for midi messages.\n     * Used by _enrichChatCard for usage-type messages where _highlightCriticalSuccessFailure\n     * is not called by Foundry. Does not mutate document flags (safe during async super._enrichChatCard).\n     */\n    private _highlightMidiRolls(html: HTMLElement) {\n      function makeIcon(cls: string) {\n        const icon = document.createElement(\"i\");\n        icon.classList.add(\"fas\", cls);\n        icon.setAttribute(\"inert\", \"\");\n        return icon;\n      }\n      const totals = html.querySelectorAll(\".dice-total\");\n      for (let [index, d20Roll] of this.rolls.entries()) {\n        const total = totals[index];\n        if (!total) continue;\n        total.classList.remove(\"success\", \"failure\", \"critical\", \"fumble\");\n        total.querySelector(\".icons\")?.remove();\n\n        const d0 = d20Roll?.dice?.[0];\n        if (!d0 || d0.faces !== 20 || d0.values?.length !== 1) continue;\n\n        // @ts-expect-error D20Roll not typed\n        const d20 = dnd5e.dice.D20Roll.fromRoll(d20Roll);\n        if (d20.isCritical) total.classList.add(\"critical\");\n        if (d20.isFumble) total.classList.add(\"fumble\");\n        if (d20.dice[0]?.options?.target) {\n          if (d20.isSuccess) total.classList.add(\"success\");\n          else total.classList.add(\"failure\");\n        }\n\n        const icons = document.createElement(\"div\");\n        icons.classList.add(\"icons\");\n        if (total.classList.contains(\"critical\")) icons.append(makeIcon(\"fa-check-double\"));\n        else if (total.classList.contains(\"fumble\")) icons.append(makeIcon(\"fa-xmark\"), makeIcon(\"fa-xmark\"));\n        else if (total.classList.contains(\"success\")) icons.append(makeIcon(\"fa-check\"));\n        else if (total.classList.contains(\"failure\")) icons.append(makeIcon(\"fa-xmark\"));\n        if (icons.children.length) total.append(icons);\n      }\n    }\n\n    maskAttackRolls(html: HTMLElement) {\n      if (!this.author?.isGM || game.user?.isGM) return;\n      const hitFlag = this.flags?.[MODULE_ID]?.isHit;\n      const hitString = hitFlag === undefined ? \"\" : hitFlag ? i18n(\"midi-qol.hits\") : i18n(\"midi-qol.misses\");\n      const isCritical = this.flags?.[MODULE_ID]?.isCritical;\n      const isFumble = this.flags?.[MODULE_ID]?.isFumble;\n      const attackDisplay = configSettings.gmAttackDisplay ?? \"full\";\n      const damageDisplay = configSettings.gmDamageDisplay ?? \"full\";\n\n      // Attack roll masking\n      let attackRollText: string | undefined;\n      let hideCritFumble = false;\n      switch (attackDisplay) {\n        case \"full\":\n          break;\n        case \"hideFormula\":\n          break;\n        case \"d20Only\":\n          attackRollText = `(d20) ${this.rolls[0]?.terms[0].total ?? \"--\"}`;\n          break;\n        case \"attackTotal\":\n          attackRollText = `${this.rolls[0]?.total ?? \"--\"}`;\n          break;\n        case \"hitMiss\":\n          hideCritFumble = true;\n          attackRollText = hitString;\n          break;\n        case \"hitMissCrit\":\n          attackRollText = hitString;\n          if (isCritical) attackRollText = i18n(\"midi-qol.criticalHit\");\n          else if (isFumble) attackRollText = i18n(\"midi-qol.fumble\");\n          break;\n        case \"hidden\":\n          hideCritFumble = true;\n          attackRollText = \"--\";\n          break;\n      }\n      if (hideCritFumble) {\n        html.querySelectorAll(\".midi-qol-attack-roll .dice-total\")?.forEach(el => el.classList.remove(\"critical\", \"fumble\"));\n      }\n      if (attackRollText) html.querySelectorAll(\".midi-attack-roll .dice-total\")?.forEach(el => el.innerHTML = attackRollText);\n      if (attackDisplay !== \"full\") {\n        if (attackDisplay !== \"hideFormula\") {\n          removeAll(html, \".midi-attack-roll .dice-formula\");\n        }\n        removeAll(html, \".midi-attack-roll .dice-tooltip\");\n        html.querySelectorAll(\".midi-attack-roll .dice-roll\").forEach(el => el.addEventListener(\"click\", this.noDiceClicks.bind(this)));\n        removeAll(html, \".midi-attribution-info\");\n      }\n\n      // Damage roll masking\n      if (damageDisplay === \"totalOnly\") {\n        removeAll(html, \".midi-damage-roll .dice-formula\");\n        removeAll(html, \".midi-damage-roll .dice-tooltip\");\n        html.querySelectorAll(\".midi-damage-roll .dice-roll\").forEach(el => el.addEventListener(\"click\", this.noDiceClicks.bind(this)));\n      } else if (damageDisplay === \"hidden\") {\n        removeAll(html, \".midi-damage-roll .dice-formula\");\n        removeAll(html, \".midi-damage-roll .dice-tooltip\");\n        html.querySelectorAll(\".midi-damage-roll .dice-roll\").forEach(el => el.addEventListener(\"click\", this.noDiceClicks.bind(this)));\n        html.querySelectorAll(\".midi-damage-roll .dice-total\")?.forEach(el => el.innerHTML = \"--\");\n      }\n    }\n\n    applyChatVisibility(html: HTMLElement) {\n      if (html.style.display === \"none\") return; // Already hidden by hideStuffHandler (blind/gmHide)\n      const messageActor = (fromUuidSync(this.flags?.[MODULE_ID]?.[\"sourceActorUuid\"]) as Actor.Implementation ?? this.speakerActor);\n      const messageActorOwner = messageActor?.isOwner;\n\n      // Re-enable save/check buttons\n      if (foundry.utils.getProperty(this, \"flags.midi-qol.type\") === MESSAGE_TYPES.SAVES) {\n        html.querySelectorAll<HTMLButtonElement>('[data-action=\"rollSave\"]').forEach(el => el.disabled = false);\n        html.querySelectorAll<HTMLButtonElement>('[data-action=\"rollCheck\"]').forEach(el => el.disabled = false);\n      }\n\n      // Hide attack/damage buttons for non-authors\n      if (!this.isAuthor && !(messageActorOwner && saveToChatCard)) {\n        hideAll(html, \".midi-qol-attack-buttons\");\n        hideAll(html, \".midi-qol-damage-buttons\");\n        hideAll(html, \".midi-qol-otherDamage-button\");\n      }\n\n      // Target hover/select/show event listeners\n      html.querySelectorAll<HTMLLIElement>(\".midi-qol-target-select\").forEach(el => {\n        el.addEventListener(\"mouseenter\", onTargetHover);\n        el.addEventListener(\"mouseleave\", onTargetHoverOut);\n        el.addEventListener(\"click\", onTargetSelect);\n        el.addEventListener(\"contextmenu\", onTargetShow);\n      });\n\n      if (game.user?.isGM) {\n        removeAll(html, \".midi-qol-playerTokenName\");\n        if (configSettings.hidePlayerDamageCard && foundry.utils.getProperty(this, \"flags.midi-qol.playerDamageCard\")) {\n          html.style.display = \"none\";\n        }\n        html.querySelectorAll<HTMLDivElement>(\".midi-qol-hits-display\").forEach(el => el.style.display = \"\");\n        hideAll(html, \".midi-qol-target-npc-Player\");\n        if (!configSettings.highlightSuccess) {\n          stripHighlight(html, \".midi-qol-hits-display .midi-qol-hit-class\");\n          stripHighlight(html, \".midi-qol-saves-display .midi-qol-save-class\");\n        }\n      } else {\n        removeAll(html, \".midi-qol-gmTokenName\");\n        if (configSettings.autoCheckHit === \"gmOnly\") {\n          hideAll(html, \".midi-qol-hits-display\");\n        }\n        this.applySaveVisibility(html, messageActor);\n        this.applyAttackVisibility(html);\n\n        // Confirm damage buttons\n        if (!this.isAuthor || configSettings.confirmAttackDamage === \"gmOnly\") {\n          hideAll(html, \".midi-qol-confirm-damage-roll-complete-hit\");\n          hideAll(html, \".midi-qol-confirm-damage-roll-complete-miss\");\n          hideAll(html, \".midi-qol-confirm-damage-roll-complete-critical\");\n          hideAll(html, \".midi-qol-confirm-damage-roll-cancel\");\n        }\n\n        // Dice tooltip/click blocking for GM rolls hidden from players\n        const attackHidden = (configSettings.gmAttackDisplay ?? \"full\") !== \"full\";\n        const damageHidden = (configSettings.gmDamageDisplay ?? \"full\") !== \"full\";\n        if (this.author?.isGM && (attackHidden || damageHidden)) {\n          const noDice = this.noDiceClicks.bind(this);\n          if (attackHidden) {\n            html.querySelectorAll(\".midi-attack-roll .dice-roll\").forEach(el => el.addEventListener(\"click\", noDice));\n            html.querySelectorAll<HTMLDivElement>(\".midi-attack-roll .dice-tooltip\").forEach(el => el.style.height = \"0\");\n          }\n          if (damageHidden) {\n            html.querySelectorAll(\".midi-damage-roll .dice-roll\").forEach(el => el.addEventListener(\"click\", noDice));\n            html.querySelectorAll<HTMLDivElement>(\".midi-damage-roll .dice-tooltip\").forEach(el => el.style.height = \"0\");\n          }\n        }\n      }\n    }\n\n    private applySaveVisibility(html: HTMLElement, messageActor: Actor.Implementation | undefined) {\n      const shouldDisplayChallenge = safeGetGameSetting(\"dnd5e\", \"challengeVisibility\");\n      const autoCheckSaves = configSettings.autoCheckSaves;\n\n      if (autoCheckSaves === \"gmOnly\") {\n        hideAll(html, \".midi-qol-saves-display\");\n        return;\n      }\n\n      // Strip save attribution tooltip and info icons when players can't see save details\n      if (![\"all\", \"allShow\"].includes(autoCheckSaves)) {\n        html.querySelectorAll(\".midi-qol-target-name[data-tooltip-html]\")?.forEach(el => el.removeAttribute(\"data-tooltip-html\"));\n        removeAll(html, \".midi-save-attribution-info\");\n      }\n\n      const dcHidden = shouldDisplayChallenge === \"player\" && !(messageActor as any)?.hasPlayerOwner;\n      const displayNPCSaves = shouldDisplayChallenge === \"all\" || (shouldDisplayChallenge === \"player\" && !dcHidden);\n      const displayPlayerSaves = shouldDisplayChallenge !== \"none\";\n\n      if (!displayPlayerSaves || autoCheckSaves === \"whisper\" || this.blind) {\n        removeAll(html, \".midi-qol-save-total\");\n        removeAll(html, \".midi-qol-save-tooltip\");\n        removeAll(html, \".midi-qol-save-symbol\");\n        removeAll(html, \".midi-qol-saveDC\");\n      }\n      if (!displayNPCSaves || autoCheckSaves === \"whisper\" || this.blind) {\n        if (!dcHidden) removeAll(html, \".midi-qol-npc-save-symbol\");\n        removeAll(html, \".midi-qol-npc-save-tooltip\");\n        removeAll(html, \".midi-qol-npc-save-total\");\n        if (!displayNPCSaves && !messageActor?.hasPlayerOwner) {\n          removeAll(html, \".midi-qol-saveDC\");\n        }\n      } else if (autoCheckSaves !== \"allShow\") {\n        removeAll(html, \".midi-qol-npc-save-tooltip\");\n        if (autoCheckSaves === \"allNoRoll\") removeAll(html, \".midi-qol-npc-save-total\");\n      }\n\n      if (!configSettings.highlightSuccess || ![\"all\", \"player\"].includes(shouldDisplayChallenge) || [\"whisper\", \"none\"].includes(autoCheckSaves)) {\n        stripHighlight(html, \".midi-qol-saves-display .midi-qol-save-class\");\n      }\n      if ((!displayNPCSaves && !dcHidden) || !configSettings.highlightSuccess) {\n        stripHighlight(html, \".midi-qol-save-class.midi-qol-npc-target\");\n      }\n    }\n\n    private applyAttackVisibility(html: HTMLElement) {\n      if (!configSettings.optionalRules.ActiveDefenceDC) {\n        removeAll(html, \".midi-qol-active-defence-dc\");\n      }\n\n      const attackVisibility = safeGetGameSetting(\"dnd5e\", \"attackRollVisibility\");\n      const midiAttackVisibility = configSettings.autoCheckHit;\n\n      if (!configSettings.highlightSuccess || attackVisibility === \"none\" || midiAttackVisibility === \"whisper\" || this.blind) {\n        stripHighlight(html, \".midi-qol-hits-display .midi-qol-hit-class\");\n      }\n      if (attackVisibility === \"none\" || midiAttackVisibility !== \"all\" || this.blind) {\n        removeAll(html, \".midi-attack-roll .dice-total .icons\");\n        removeAll(html, \".midi-qol-hits-display .midi-qol-hit-symbol\");\n        removeAll(html, \".midi-qol-hit-symbol\");\n        removeAll(html, \".midi-qol-npc-ac\");\n      } else if (attackVisibility === \"hideAC\") {\n        removeAll(html, \".midi-qol-npc-ac\");\n      }\n    }\n\n    _enrichChatCard(html: HTMLElement) {\n      if (!this.flags?.[MODULE_ID]?.messageType) {\n        this.applyChatVisibility(html);\n        // @ts-expect-error no dnd5e-types\n        super._enrichChatCard(html);\n        this._maybeStripEffectsTray(html);\n        this._addMarkerClasses(html);\n        return;\n      }\n      if (debugEnabled > 1) log(\"Enriching chat card\", Date.now(), this.id);\n      this.maskAttackRolls(html); // This has to run first to stop errors when ChatMessage5e._enrichDamageTooltip runs\n\n      // @ts-expect-error no dnd5e-types\n      super._enrichChatCard(html);\n      this._maybeStripEffectsTray(html);\n      this.applyChatVisibility(html);\n      // For usage-type messages, Foundry skips _highlightCriticalSuccessFailure.\n      // Add classes + icons directly for midi messages, then apply midi settings.\n      if (this.flags?.[MODULE_ID]?.messageType) {\n        this._highlightMidiRolls(html);\n      }\n      this._applyMidiHighlightSettings(html);\n      this._addMarkerClasses(html);\n      if (debugEnabled > 1) log(\"Finished enriching chat card\", Date.now(), this.id);\n    }\n\n    /** Add CSS marker classes to avoid expensive :has() selectors during layout */\n    _addMarkerClasses(html: HTMLElement) {\n      if (html.querySelector(\".midi-qol-tooltiptext\")) {\n        html.querySelector(\".message-content\")?.classList.add(\"midi-qol-has-tooltip\");\n      }\n      if (html.querySelector(\".xmidi-qol-flex-container\")) {\n        html.classList.add(\"midi-qol-dmg-app-msg\");\n      }\n      if (html.querySelector(\".midi-qol-player-damage-card\")) {\n        html.classList.add(\"midi-qol-player-dmg-msg\");\n      }\n    }\n\n    noDiceClicks(event: Event) {\n      event.stopImmediatePropagation();\n      return;\n    }\n  }\n}","import { AnyMutableObject } from \"fvtt-types/utils\";\nimport { Activity, ActivityUseConfiguration, RollDialogConfig, RollMessageConfig, RollProcessConfig } from \"../../globals.js\";\nimport { debugEnabled, warn, i18n, GameSystemConfig } from \"../../midi-qol.js\";\nimport { Workflow } from \"../Workflow.js\";\nimport { replaceDefaultActivities, configSettings } from \"../settings.js\";\nimport { isAutoFastForward } from \"../utils.js\";\nimport { MidiActivityMixin, MidiActivityMixinSheet } from \"./MidiActivityMixin.js\";\nimport { getSceneTargets } from \"./activityHelpers.js\";\n\nexport let MidiSaveActivity: ReturnType<typeof defineMidiSaveActivityClass>;\nexport let MidiSaveSheet: ReturnType<typeof defineMidiSaveSheetClass>;\n\nexport function setupSaveActivity() {\n  if (debugEnabled > 0) warn(\"MidiQOL | SaveActivity | setupSaveActivity | Called\");\n  //@ts-expect-error\n  MidiSaveSheet = defineMidiSaveSheetClass(game.system.applications.activity.SaveSheet);\n  MidiSaveActivity = defineMidiSaveActivityClass(GameSystemConfig.activityTypes.save.documentClass as Activity);\n  if (replaceDefaultActivities) {\n    // GameSystemConfig.activityTypes[\"dnd5eSave\"] = GameSystemConfig.activityTypes.save;\n    GameSystemConfig.activityTypes.save = { documentClass: MidiSaveActivity };\n  } else {\n    GameSystemConfig.activityTypes[\"midiSave\"] = { documentClass: MidiSaveActivity };\n  }\n  // Localization.localizeDataModel(MidiSaveActivity);\n}\n\nlet defineMidiSaveActivityClass = <T extends Activity>(ActivityClass: T) => {\n  return class MidiSaveActivity extends MidiActivityMixin(ActivityClass) {\n    static LOCALIZATION_PREFIXES = [...super.LOCALIZATION_PREFIXES, \"DND5E.DAMAGE\", \"midi-qol.SAVE\"];\n    static metadata =\n      foundry.utils.mergeObject(\n        super.metadata, {\n        title: configSettings.activityNamePrefix ? \"midi-qol.SAVE.Title.one\" : ActivityClass.metadata.title,\n        dnd5eTitle: ActivityClass.metadata.title,\n        sheetClass: MidiSaveSheet,\n        usage: {\n          chatCard: \"modules/midi-qol/templates/activity-card.hbs\",\n          actions: {\n            rollDamage: MidiSaveActivity.#rollDamage,\n            rollSave: MidiSaveActivity.#rollSave, // Having this means needing to track the dnd5e SaveActivity.#rollSave changes\n            // Currently needed to tag the request id for midi-qol to pick up chat card saves as being for the current activity\n          }\n        },\n      }, { inplace: false, overwrite: true, insertKeys: true, insertValues: true });\n\n    static defineSchema() {\n      const { StringField, ArrayField, BooleanField, SchemaField, ObjectField } = foundry.data.fields;\n\n      //@ts-expect-error\n      const dataModels = game.system.dataModels;\n      const { ActivationField: ActivationField, CreatureTypeField, CurrencyTemplate, DamageData,\n        DamageField, DurationField, MovementField, RangeField, RollConfigField, SensesField,\n        SourceField, TargetField, UsesField } = dataModels.shared\n      const FormulaField = dataModels.fields.FormulaField;\n\n      return {\n        ...super.defineSchema(),\n        otherActivityId: new StringField({ name: \"otherActivity\", initial: \"none\" }),\n        otherActivityAsParentType: new BooleanField({\n          name: \"otherActivityAsParentType\",\n          initial: true,\n          required: false,\n          label: i18n(\"midi-qol.SHARED.FIELDS.otherActivityAsParentType.label\"),\n          hint: i18n(\"midi-qol.SHARED.FIELDS.otherActivityAsParentType.hint\")\n        }),\n        damage: new SchemaField({\n          onSave: new StringField({\n            initial: \"half\",\n            default: \"half\",\n            name: \"onSave\",\n            hint: i18n(\"DND5E.SAVE.FIELDS.damage.onSave.hint\"),\n            label: i18n(\"DND5E.SAVE.FIELDS.damage.onSave.label\")\n          }),\n          critical: new SchemaField({\n            allow: new BooleanField(),\n            bonus: new FormulaField(),\n          }),\n          parts: new ArrayField(new DamageField()),\n        }),\n        friendlySave: new StringField({ initial: \"default\", name: \"friendlySave\" }),\n        // WIP\n        // saveDisplay: new StringField({initial: \"default\"})\n      }\n    }\n\n    static #rollDamage(this: Activity, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      const workflow = Workflow.getWorkflow(message?.uuid);\n      if (workflow) workflow.activity = this;\n      return this.rollDamage({ event, workflow }, {}, {});\n    }\n\n    static async #rollSave(this: Activity, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      const workflow = Workflow.getWorkflow(message?.uuid);\n      if (workflow) workflow.activity = this;\n      // return ActivityClass.#rollSave.bind(this)(event, target, message);\n      // Can't call ActivityClass.#rollSave.bind(this)(event, target, message) as it's private\n      const targets: Array<foundry.canvas.placeables.Token.Implementation | Actor.Implementation> = getSceneTargets();\n      if (!targets.length && game.user?.character) targets.push(game.user?.character);\n      if (!targets.length) ui.notifications?.warn(\"DND5E.ActionWarningNoToken\", { localize: true });\n      const dc = parseInt(target.dataset.dc ?? \"0\");\n      for (const token of targets) {\n        const actor = token instanceof Actor ? token : token.actor;\n        const speaker = ChatMessage.getSpeaker({ actor, scene: canvas.scene, token: token instanceof Token ? token.document : null });\n        const message: AnyMutableObject = { data: { speaker } };\n        // if (!actor?.hasPlayerOwner && workflow) message.create = false - this breaks save checking from chat card\n        if (token instanceof foundry.canvas.placeables.Token) foundry.utils.setProperty(message, \"flags.midi-qol.requestId\", token.document.uuid);\n        else foundry.utils.setProperty(message, \"flags.midi-qol.requestId\", token?.uuid);\n        if ([\"none\", \"allShow\"].includes(configSettings.autoCheckSaves) || actor?.hasPlayerOwner) message.rollMode = game.settings.get(\"core\", \"rollMode\");\n        else message.rollMode = CONST.DICE_ROLL_MODES.PRIVATE;\n        if (!game.user?.isGM) {\n          if (configSettings.playerRollSaves === \"noneDialogPublic\") message.rollMode = CONST.DICE_ROLL_MODES.PUBLIC;\n          else if (configSettings.playerRollSaves === \"noneDialogPrivate\") message.rollMode = CONST.DICE_ROLL_MODES.PRIVATE;\n          else if (configSettings.playerRollSaves === \"noneDialogSelf\") message.rollMode = CONST.DICE_ROLL_MODES.SELF;\n          else if (configSettings.playerRollSaves === \"noneDialogBlind\") message.rollMode = CONST.DICE_ROLL_MODES.BLIND;\n          else message.rollMode = game.settings.get(\"core\", \"rollMode\");\n        }\n\n\n        //@ts-expect-error no dnd5e types\n        await actor?.rollSavingThrow({\n          event,\n          workflow,\n          //@ts-expect-error this has been bound to an activity\n          ability: target.dataset.ability ?? this.save.ability.first(),\n          //@ts-expect-error this has been bound to an activity\n          target: configSettings.autoCheckSaves === \"whisper\" ? undefined : (Number.isFinite(dc) ? dc : this.save.dc.value)\n        }, {}, message);\n      }\n    }\n\n    use(config: ActivityUseConfiguration = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n      return super.use(config, dialog, message);\n    }\n\n    get possibleOtherActivity() {\n      return true;\n    }    get canUseOtherActivity() {\n      return true;\n    }\n\n    async _triggerSubsequentActions(config, results) {\n    }\n    \n    getDamageConfig(config: RollProcessConfig = {}) {\n      const rollConfig = super.getDamageConfig(config);\n\n      rollConfig.critical ??= {};\n      rollConfig.critical.allow = this.damage?.critical.allow;\n      rollConfig.critical.bonusDamage = this.damage?.critical.bonus;\n\n      return rollConfig;\n    }\n    async rollDamage(config: RollProcessConfig = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n      message = foundry.utils.mergeObject({\n        \"data.flags.dnd5e.roll\": {\n          damageOnSave: this.damage?.onSave\n        }\n      }, message);\n      config.midiOptions ??= {};\n      config.midiOptions.fastForwardDamage ??= isAutoFastForward(\"damage\");\n      return super.rollDamage(config, dialog, message);\n    }\n  }\n}\n\nlet defineMidiSaveSheetClass = (baseClass: any) => {\n  return class MidiSaveSheet extends MidiActivityMixinSheet(baseClass) {\n    static PARTS = {\n      ...super.PARTS,\n      effect: {\n        template: \"modules/midi-qol/templates/activity/save-effect.hbs\",\n        templates: [\n          ...super.PARTS.effect.templates,\n          \"modules/midi-qol/templates/activity/parts/save-extras.hbs\",\n          \"modules/midi-qol/templates/activity/parts/save-damage.hbs\"\n        ]\n\n      }\n    };\n\n    static DEFAULT_OPTIONS = {\n      ...super.DEFAULT_OPTIONS,\n      classes: [\"save-activity\", \"damage-activity\"]\n    }\n    async _prepareContext(options) {\n      await this.activity.prepareData({});\n      const context = await super._prepareContext(options);\n      context.FriendlySaveOptions = [\n        { value: \"default\", label: i18n(\"midi-qol.SAVE.friendlySave.default\") },\n        { value: \"friendlySuccess\", label: i18n(\"midi-qol.SAVE.friendlySave.friendlySuccess\") },\n        { value: \"friendlyFail\", label: i18n(\"midi-qol.SAVE.friendlySave.friendlyFail\") },\n      ];\n      return context;\n    }\n  }\n}","import { AnyMutableObject } from \"fvtt-types/utils\";\nimport { Activity, RollDialogConfig, RollMessageConfig, RollProcessConfig } from \"../../globals.js\";\nimport { debugEnabled, i18n, warn, error, GameSystemConfig } from \"../../midi-qol.js\";\nimport { AugmentedEvent, Workflow } from \"../Workflow.js\";\nimport { TroubleShooter } from \"../apps/TroubleShooter.js\";\nimport { replaceDefaultActivities, configSettings } from \"../settings.js\";\nimport { areMidiKeysPressed, callActivityHooks, isAutoFastForward } from \"../utils.js\";\nimport { MidiActivityMixin, MidiActivityMixinSheet } from \"./MidiActivityMixin.js\";\nimport { displayDSNForRoll } from \"../utils.js\";\n\nexport let MidiUtilityActivity: ReturnType<typeof defineMidiUtilityActivityClass>;\nexport let MidiUtilitySheet: ReturnType<typeof defineMidiUtilitySheetClass>;\n\nexport function setupUtilityActivity() {\n  if (debugEnabled > 0) warn(\"MidiQOL | UtilityActivity | setupUtilityActivity | Called\");\n  //@ts-expect-error\n  MidiUtilitySheet = defineMidiUtilitySheetClass(game.system.applications.activity.UtilitySheet);\n\n  MidiUtilityActivity = defineMidiUtilityActivityClass(GameSystemConfig.activityTypes.utility.documentClass as Activity);\n  if (replaceDefaultActivities) {\n    // GameSystemConfig.activityTypes[\"dnd5eUtility\"] = GameSystemConfig.activityTypes.utility;\n    GameSystemConfig.activityTypes.utility = { documentClass: MidiUtilityActivity };\n  } else {\n    GameSystemConfig.activityTypes[\"midiUtility\"] = { documentClass: MidiUtilityActivity };\n  }\n}\n\nlet defineMidiUtilityActivityClass = <T extends Activity>(ActivityClass: T) => {\n  return class MidiUtilityActivity extends MidiActivityMixin(ActivityClass) {\n    static LOCALIZATION_PREFIXES = [\"midi-qol.UTILITY\", ...super.LOCALIZATION_PREFIXES];\n\n    static metadata =\n      foundry.utils.mergeObject(\n        super.metadata, {\n        title: configSettings.activityNamePrefix ? \"midi-qol.UTILITY.Title.one\" : ActivityClass.metadata.title,\n        dnd5eTitle: ActivityClass.metadata.title,\n        sheetClass: MidiUtilitySheet,\n        usage: {\n          chatCard: \"modules/midi-qol/templates/activity-card.hbs\",\n          actions: {\n            rollFormula: MidiUtilityActivity.#rollFormula\n          }\n        }\n      }, { inplace: false, insertKeys: true, insertValues: true });\n\n      static defineSchema() {\n        const { StringField, ArrayField, BooleanField, SchemaField, ObjectField } = foundry.data.fields;\n        //@ts-expect-error\n        const dataModels = game.system.dataModels;\n        const { ActivationField: ActivationField, CreatureTypeField, CurrencyTemplate, DamageData,\n          DamageField, DurationField, MovementField, RangeField, RollConfigField, SensesField,\n          SourceField, TargetField, UsesField } = dataModels.shared\n  \n        const schema = {\n          ...super.defineSchema(),\n          otherActivityId: new StringField({ name: \"otherActivity\", initial: \"none\" }),\n          otherActivityAsParentType: new BooleanField({\n            name: \"otherActivityAsParentType\",\n            initial: true,\n            required: false,\n            label: i18n(\"midi-qol.SHARED.FIELDS.otherActivityAsParentType.label\"),\n            hint: i18n(\"midi-qol.SHARED.FIELDS.otherActivityAsParentType.hint\")\n          }),\n        };\n        return schema;\n      }\n    static #rollFormula(this: Activity, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      const workflow = Workflow.getWorkflow(message?.uuid);\n      if (workflow) workflow.activity = this;\n\n      return this.rollFormula?.({ event, workflow }, {}, {});\n    }\n\n    get possibleOtherActivity() {\n      return true;\n    }\n\n    async _triggerSubsequentActions(config, results) {\n    }\n    \n    async rollFormula(config: RollProcessConfig, dialog: RollDialogConfig, message: RollMessageConfig) {\n      if (debugEnabled > 0)\n        warn(\"UtilityActivity | rollFormula | Called\", config, dialog, message);\n      config ??= {};\n      dialog ??= {};\n      message ??= {}\n      const workflow = config.workflow as Workflow;\n      if (!workflow) {\n        const errorMessage = \"MidiUtilityActivity | rollFormula | No workflow found\";\n        error(errorMessage);\n        TroubleShooter.recordError(new Error(\"No Workflow Found\"), errorMessage);\n        return;\n      }\n      config.midiOptions ??= {};\n      config.midiOptions.fastForwardDamage ??= isAutoFastForward(\"damage\", { workflow })\n      if (debugEnabled > 0) {\n        warn(\"MidiUtilityActivity | rollFormula | Called\", config, dialog, message);\n      }\n      if (await callActivityHooks(this, \"midi-qol.preFormulaRoll\", workflow) === false) {\n        console.warn(\"midi-qol | UtilityActivity | Formula roll blocked via pre-hook\");\n        return;\n      }\n\n      //@ts-expect-error\n      const areKeysPressed = game.system.utils.areKeysPressed;\n      const keys = {\n        normal: areKeysPressed(config.event, \"skipDialogNormal\") || areKeysPressed(config.event, \"skipDialogAdvantage\") || areKeysPressed(config.event, \"skipDialogDisadvantage\")\n      };\n      if (Object.values(keys).some((k) => k)) dialog.configure = this.midiProperties?.forceDamageDialog !== \"always\";\n      else if (dialog.configure === undefined) {\n          switch (this.midiProperties?.forceDamageDialog) {\n            case \"always\":\n              dialog.configure = true;\n              break;\n            case \"never\":\n              dialog.configure = false;\n              break;\n            default:\n              dialog.configure = !(config.midiOptions?.fastForwardDamage ?? config.workflow?.workflowOptions.fastForwardDamage ?? false);\n          }\n      }\n      if (workflow.rollOptions?.rollToggle) dialog.configure = !!!dialog.configure;\n      const rollToggle = areMidiKeysPressed(config.event, \"RollToggle\");\n      if (workflow) workflow.rollOptions.rollToggle = rollToggle;\n      if (rollToggle) dialog.configure = !!!dialog.configure;\n      message.create ??= false;\n      let result = await super.rollFormula!(config, dialog, message) as Roll[] | undefined;\n      if (result && workflow.workflowOptions?.formulaDSN !== false) await displayDSNForRoll(result[0], \"formulaD20\");\n\n      if (config.midiOptions.updateWorkflow !== false && workflow) {\n        if (result) await workflow.setUtilityRolls(result);\n        if (workflow.suspended)\n          workflow.unSuspend.bind(workflow)({ utilityRolls: result });\n      }\n      return result;\n    }\n    async _usageChatContext(message) {\n      const context = await super._usageChatContext(message);\n      context.hasRollFormula = true; // TODO fix this when able to do a proper card !!this.roll?.formula;\n      return context;\n    }\n  }\n}\n\nexport function defineMidiUtilitySheetClass(baseClass: any) {\n  return class MidiUtilitySheet extends MidiActivityMixinSheet(baseClass) {\n    static PARTS = {\n      ...super.PARTS,\n      effect: {\n        template: \"modules/midi-qol/templates/activity/utility-effect.hbs\",\n        templates: [\n          ...super.PARTS.effect.templates\n        ]\n      }\n    };\n  }\n}","import { AnyMutableObject } from \"fvtt-types/utils\";\nimport { Activity } from \"../../globals.js\";\nimport { debugEnabled, GameSystemConfig, i18n, warn } from \"../../midi-qol.js\";\nimport { Workflow } from \"../Workflow.js\";\nimport { replaceDefaultActivities, configSettings } from \"../settings.js\";\nimport { isAutoFastForward } from \"../utils.js\";\nimport { MidiActivityMixin, MidiActivityMixinSheet } from \"./MidiActivityMixin.js\";\n\nexport let MidiDamageActivity: ReturnType<typeof defineMidiDamageActivityClass>;\nexport let MidiDamageSheet: ReturnType<typeof defineMidiDamageSheetClass>;\n\nexport function setupDamageActivity() {\n  if (debugEnabled > 0) warn(\"MidiQOL | DamageActivity | setupDamageActivity | Called\");\n  //@ts-expect-error\n  MidiDamageSheet = defineMidiDamageSheetClass(game.system.applications.activity.DamageSheet);\n  MidiDamageActivity = defineMidiDamageActivityClass(GameSystemConfig.activityTypes.damage.documentClass as Activity);\n  if (replaceDefaultActivities) {\n    // GameSystemConfig.activityTypes[\"dnd5eDamage\"] = GameSystemConfig.activityTypes.damage;\n    GameSystemConfig.activityTypes.damage = { documentClass: MidiDamageActivity };\n  } else {\n    GameSystemConfig.activityTypes[\"midiDamage\"] = { documentClass: MidiDamageActivity };\n  }\n}\n\nlet defineMidiDamageActivityClass = <T extends Activity>(ActivityClass: T) => {\n  return class MidiDamageActivity extends MidiActivityMixin(ActivityClass) {\n    static LOCALIZATION_PREFIXES = [...super.LOCALIZATION_PREFIXES];\n    static metadata =\n      foundry.utils.mergeObject(\n        super.metadata, {\n        title: configSettings.activityNamePrefix ? \"midi-qol.DAMAGE.Title.one\" : ActivityClass.metadata.title,\n        dnd5eTitle: ActivityClass.metadata.title,\n        sheetClass: MidiDamageSheet,\n        usage: {\n          chatCard: \"modules/midi-qol/templates/activity-card.hbs\",\n          actions: {\n            rollDamage: MidiDamageActivity.#rollDamage\n          },\n        }\n      }, { inplace: false, insertKeys: true, insertValues: true });\n\n    static #rollDamage(this: Activity, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      const workflow = Workflow.getWorkflow(message?.uuid);\n      if (workflow) workflow.activity = this;\n      this.rollDamage({ event, workflow }, {}, {});\n    }\n\n    get possibleOtherActivity() {\n      return true;\n    }\n    \n    get canUseOtherActivity() {\n      return true;\n    }\n    async rollDamage(config: AnyMutableObject, dialog: AnyMutableObject, message: AnyMutableObject) {\n      config.midiOptions ??= {};\n      // @ts-expect-error config is AnyMutableObject\n      config.midiOptions.fastForwardDamage ??= isAutoFastForward(\"damage\");\n      return super.rollDamage(config, dialog, message);\n    }\n\n    async _triggerSubsequentActions(config, results) {\n    }\n  }\n}\n\nexport function defineMidiDamageSheetClass(baseClass: any) {\n  return class MidiDamageSheet extends MidiActivityMixinSheet(baseClass) {\n    static PARTS = {\n      ...super.PARTS,\n      effect: {\n        template: \"modules/midi-qol/templates/activity/damage-effect.hbs\",\n        templates: [\n          ...super.PARTS.effect.templates\n        ]\n      }\n    };\n  }\n}","import { AnyObject } from \"fvtt-types/utils\";\nimport { Activity, ActivityUseConfiguration, RollDialogConfig, RollMessageConfig } from \"../../globals.js\";\nimport { debugEnabled, GameSystemConfig, i18n, warn } from \"../../midi-qol.js\";\nimport { Workflow } from \"../Workflow.js\";\nimport { replaceDefaultActivities, configSettings } from \"../settings.js\";\nimport { asyncHooksCall } from \"../utils.js\";\nimport { MidiActivityMixin, MidiActivityMixinSheet } from \"./MidiActivityMixin.js\";\n\nexport let MidiCastActivity: ReturnType<typeof defineMidiCastActivityClass>;\nexport let MidiCastSheet: ReturnType<typeof defineMidiCastSheetClass>;\n\nexport function setupCastActivity() {\n  if (debugEnabled > 0) warn(\"MidiQOL | CastActivity | setupCastActivity | Called\");\n  //@ts-expect-error\n  MidiCastSheet = defineMidiCastSheetClass(game.system.applications.activity.CastSheet);\n  MidiCastActivity = defineMidiCastActivityClass(GameSystemConfig.activityTypes.cast.documentClass as Activity);\n  if (replaceDefaultActivities) {\n    // GameSystemConfig.activityTypes[\"dnd5eCast\"] = GameSystemConfig.activityTypes.cast;\n    GameSystemConfig.activityTypes.cast = { documentClass: MidiCastActivity };\n  } else {\n    GameSystemConfig.activityTypes[\"midiCast\"] = { documentClass: MidiCastActivity };\n  }\n}\nlet defineMidiCastSheetClass = (baseClass: any) => {\n  return class MidiCastSheet extends MidiActivityMixinSheet(baseClass) {\n  }\n}\n\nlet defineMidiCastActivityClass =  <T extends Activity>(ActivityClass: T) => {\n  return class MidiCastActivity extends MidiActivityMixin(ActivityClass) {\n    static LOCALIZATION_PREFIXES = [\"midi-qol.CAST\", ...super.LOCALIZATION_PREFIXES];\n    static metadata =\n      foundry.utils.mergeObject(\n        super.metadata, {\n        title: configSettings.activityNamePrefix ? \"midi-qol.CAST.Title.one\" : ActivityClass.metadata.title,\n        dnd5eTitle: ActivityClass.metadata.title,\n        sheetClass: MidiCastSheet,\n        usage: {\n          chatCard: \"modules/midi-qol/templates/activity-card.hbs\",\n          dialog: ActivityClass.metadata.usage.dialog,\n        },\n      }, { inplace: false, insertKeys: true, insertValues: true });\n\n    /** Resolve the effective activation type for Cast activities.\n     *  1. If activation.override is set, use the Cast activity's own activation type.\n     *  2. Otherwise, use the linked spell's first usable activity's activation type.\n     *  3. Fall back to the parent item's activation type.\n     */\n    get effectiveActivationType(): string | undefined {\n      // @ts-expect-error activation.override exists on dnd5e activities but not typed\n      if (this.activation?.override) return this.activation.type;\n      const spell = this.cachedSpell;\n      if (spell) {\n        const activities = spell.system?.activities;\n        const activityList = (activities instanceof Collection) ? activities.contents : Object.values(activities ?? {});\n        const spellActivity = activityList.find((a: any) => a.canUse) ?? activityList[0];\n        if (spellActivity?.activation?.type) return spellActivity.activation.type;\n      }\n      // @ts-expect-error item.system.activation not typed\n      return this.item?.system?.activation?.type ?? this.activation?.type;\n    }\n\n    async use(usage: ActivityUseConfiguration = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n      if (!this.item.isEmbedded || !this.item.isOwner || !this.canUse) {\n        // @ts-expect-error\n        return ActivityClass.prototype.use.bind(this)(usage, dialog, message);\n      }\n\n      usage.midiOptions ??= {};\n      usage.midiOptions.workflowOptions ??= {};\n      usage.midiOptions.proceedChecks ??= {};\n\n      // Create a temporary workflow so pre-checks (hooks, macros, reaction/bonus enforcement) can run\n      const speaker = ChatMessage.getSpeaker({ actor: this.item.actor });\n      const tempWorkflow = new Workflow(this.actor ?? null, this, speaker, null, { storeWorkflow: false });\n      usage.workflow = tempWorkflow;\n\n      try {\n        // Run preTargetingChecks (incapacitated, preTargeting hooks/macros)\n        if (!await this.preTargetingChecks(usage, dialog, message)) return false;\n\n        // Run preChatChecks for the Cast activity (hooks, macros, reaction/bonus enforcement)\n        // Skip spell component checks — those apply to the spell, not the Cast activity\n        if (!await this.preChatChecks(usage, dialog, message, { checkComponents: false })) return false;\n\n        // Extract reaction/bonus action state determined by preChatChecks\n        const castUsesReaction = tempWorkflow.itemUsesReaction;\n        const castUsesBonusAction = tempWorkflow.itemUsesBonusAction;\n\n        // Clean up the temporary workflow before delegating to dnd5e CastActivity\n        Workflow.removeWorkflow(tempWorkflow.id);\n        delete usage.workflow;\n\n        // Tell the downstream spell activity's preChatChecks to skip reaction/bonus re-checking\n        usage.midiOptions.proceedChecks.checkReaction = false;\n        usage.midiOptions.proceedChecks.checkBonusAction = false;\n\n        // Pass Cast activity's enforcement results so the spell workflow can mark them as used\n        usage.midiOptions.workflowOptions.castUsesReaction = castUsesReaction;\n        usage.midiOptions.workflowOptions.castUsesBonusAction = castUsesBonusAction;\n      } catch (err) {\n        Workflow.removeWorkflow(tempWorkflow.id);\n        delete usage.workflow;\n        throw err;\n      }\n      // Process the Cast activity's own consumption (e.g., activityUses on Paladin's Smite).\n      // dnd5e's CastActivity.use() bypasses Activity.use() entirely so consume() never runs.\n      // The spell's config.cause mechanism also fails when the cached spell's activity has\n      // consumption.spellSlot: false (ignoreLinkedConsumption becomes true).\n      // Delegate to dnd5e CastActivity.use() which fetches/creates the cached spell and calls spell.use().\n      // The spell's activity handles consuming the CastActivity's resources via config.cause in _prepareUsageUpdates.\n      // @ts-expect-error\n      return await ActivityClass.prototype.use.bind(this)(usage, dialog, message);\n    }\n\n    get possibleOtherActivity() {\n      return false;\n    }\n\n    get isSelfTriggerableOnly() {\n      return false;\n    }\n\n    get isTriggerableActivity() {\n      return true;\n    }\n    \n    get forcedTargetConfirmation() {\n      return \"never\";\n    }\n    async _triggerSubsequentActions(config, results) {\n    }\n  }\n}\n","import { AnyMutableObject } from \"fvtt-types/utils\";\nimport { Activity, RollDialogConfig, RollMessageConfig, RollProcessConfig } from \"../../globals.js\";\nimport { debugEnabled, GameSystemConfig, i18n, warn } from \"../../midi-qol.js\";\nimport { Workflow } from \"../Workflow.js\";\nimport { replaceDefaultActivities, autoCheckSavesOptions, configSettings } from \"../settings.js\";\nimport { MidiActivityMixin, MidiActivityMixinSheet } from \"./MidiActivityMixin.js\";\nimport { MidiSaveActivity } from \"./SaveActivity.js\";\nimport { getSceneTargets } from \"./activityHelpers.js\";\n\nexport let MidiCheckActivity: ReturnType<typeof defineMidiCheckActivityClass>;\nexport let MidiCheckSheet: ReturnType<typeof defineMidiCheckSheetClass>;\n\nexport function setupCheckActivity() {\n  if (debugEnabled > 0) warn(\"MidiQOL | CheckActivity | setupCheckActivity | Called\");\n  //@ts-expect-error\n  MidiCheckSheet = defineMidiCheckSheetClass(game.system.applications.activity.CheckSheet);\n  MidiCheckActivity = defineMidiCheckActivityClass(GameSystemConfig.activityTypes.check.documentClass as Activity);\n  if (replaceDefaultActivities) {\n    // GameSystemConfig.activityTypes[\"dnd5eAttack\"] = GameSystemConfig.activityTypes.attack;\n    GameSystemConfig.activityTypes.check = { documentClass: MidiCheckActivity };\n  } else {\n    GameSystemConfig.activityTypes[\"midiCheck\"] = { documentClass: MidiCheckActivity };\n  }\n}\n\nlet defineMidiCheckActivityClass = <T extends Activity>(ActivityClass: T) => {\n  return class MidiCheckActivity extends MidiActivityMixin(ActivityClass) {\n    static LOCALIZATION_PREFIXES = [ ...super.LOCALIZATION_PREFIXES, \"midi-qol.SAVE\", \"midi-qol.CHECK\", \"DND5E.DAMAGE\"];\n    static superMetadata = super.metadata;\n    static metadata =\n      foundry.utils.mergeObject(\n        super.metadata, {\n        title: configSettings.activityNamePrefix ? \"midi-qol.CHECK.Title.one\" : ActivityClass.metadata.title,\n        dnd5eTitle: ActivityClass.metadata.title,\n        sheetClass: MidiCheckSheet,\n        usage: {\n          chatCard: \"modules/midi-qol/templates/activity-card.hbs\",\n          actions: {\n            rollCheck: MidiCheckActivity.#rollCheck, // Having this means having to track CheckActivity.#rollCheck code changes\n            // Needed so the workflow can be inserted\n            rollDamage: MidiSaveActivity.metadata.usage.actions.rollDamage,\n          }\n        },\n      }, { inplace: false, insertKeys: true, insertValues: true })\n\n    static defineSchema() {\n      const { StringField, ArrayField, BooleanField, SchemaField, ObjectField } = foundry.data.fields;\n      //@ts-expect-error\n      const dataModels = game.system.dataModels;\n      const { ActivationField: ActivationField, CreatureTypeField, CurrencyTemplate, DamageData,\n        DamageField, DurationField, MovementField, RangeField, RollConfigField, SensesField,\n        SourceField, TargetField, UsesField } = dataModels.shared\n      const FormulaField = dataModels.fields.FormulaField;\n\n      const schema = {\n        ...super.defineSchema(),\n        otherActivityId: new StringField({ name: \"otherActivity\", initial: \"none\" }),\n        otherActivityAsParentType: new BooleanField({\n          name: \"otherActivityAsParentType\",\n          initial: true,\n          required: false,\n          label: i18n(\"midi-qol.SHARED.FIELDS.otherActivityAsParentType.label\"),\n          hint: i18n(\"midi-qol.SHARED.FIELDS.otherActivityAsParentType.hint\")\n        }),\n        damage: new SchemaField({\n          onSave: new StringField({\n            initial: \"half\",\n            default: \"half\",\n            name: \"onSave\",\n            hint: i18n(\"DND5E.SAVE.FIELDS.damage.onSave.hint\"),\n            label: i18n(\"DND5E.SAVE.FIELDS.damage.onSave.label\")\n          }),\n          parts: new ArrayField(new DamageField()),\n          critical: new SchemaField({\n            allow: new BooleanField(),\n            bonus: new FormulaField(),\n          }),\n        }),\n        friendlySave: new StringField({ initial: \"default\", name: \"friendlySave\" })\n        // WIP\n        // saveDisplay: new StringField({initial: \"default\"}),\n      };\n      return schema;\n    }\n\n    static async #rollCheck(this: Activity, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      let workflow = message ? Workflow.getWorkflow(message.uuid) : null;\n      if (workflow) workflow.activity = this;\n      // return ActivityClass.#rollCheck return ActivityClass.#rollCheck.bind(this)(event, target);\n      // Can't do this as it's private\n      const targets: Array<foundry.canvas.placeables.Token.Implementation | Actor.Implementation> = getSceneTargets();\n      if (!targets.length && game.user?.character) targets.push(game.user?.character);\n      if (!targets.length) ui.notifications?.warn(\"DND5E.ActionWarningNoToken\", { localize: true });\n      let { ability, dc: dcStr, skill, tool } = target.dataset;\n      let dc = parseInt(dcStr ?? \"0\");\n      const check = this.check;\n      const item = this.item;\n      const rollData: AnyMutableObject = { event, target: Number.isFinite(dc) ? dc : check!.dc.value };\n      if (ability && (ability in globalThis.dnd5e.config.abilities)) rollData.ability = ability;\n\n      for (const token of targets) {\n        const actor = token instanceof Actor ? token : token.actor;\n        const speaker = ChatMessage.getSpeaker({ actor, scene: canvas.scene, token: token instanceof Token ? token.document : null });\n        const messageData: AnyMutableObject = { data: { speaker } };\n        if (!actor) continue;\n        if ([\"none\", \"allShow\"].includes(configSettings.autoCheckSaves) || actor?.hasPlayerOwner) messageData.rollMode = game.settings.get(\"core\", \"rollMode\");\n        else messageData.rollMode = CONST.DICE_ROLL_MODES.PRIVATE;\n        if (!game.user?.isGM) {\n          if (configSettings.playerRollSaves === \"noneDialogPublic\") messageData.rollMode = CONST.DICE_ROLL_MODES.PUBLIC;\n          else if (configSettings.playerRollSaves === \"noneDialogPrivate\") messageData.rollMode = CONST.DICE_ROLL_MODES.PRIVATE;\n          else if (configSettings.playerRollSaves === \"noneDialogSelf\") messageData.rollMode = CONST.DICE_ROLL_MODES.SELF;\n          else if (configSettings.playerRollSaves === \"noneDialogBlind\") messageData.rollMode = CONST.DICE_ROLL_MODES.BLIND;\n          else messageData.rollMode = game.settings.get(\"core\", \"rollMode\");\n        }\n        //@ts-expect-error no dnd5e types\n        if (skill) await actor.rollSkill({ ...rollData, skill }, {}, messageData);\n        else if (tool) {\n          rollData.tool = tool;\n          // @ts-expect-error no dnd5e-types\n          if ((item.type === \"tool\") && !check!.associated.size) {\n            // @ts-expect-error no dnd5e-types\n            rollData.bonus = item.system.bonus;\n            // @ts-expect-error no dnd5e-types\n            rollData.prof = item.system.prof;\n            rollData.item = item;\n          }\n          //@ts-expect-error no dnd5e types\n          await actor.rollToolCheck(rollData, {}, messageData);\n        }\n        // @ts-expect-error no dnd5e types\n        else await actor.rollAbilityCheck(rollData, {}, messageData);\n      }\n    }\n\n    get possibleOtherActivity() {\n      return true;\n    }\n\n    get canUseOtherActivity() {\n      return true;\n    }\n\n    get isSelfTriggerableOnly() {\n      return false;\n    }\n\n    async _triggerSubsequentActions(config, results) {\n    }\n\n    async rollDamage(config: RollProcessConfig, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n      message = foundry.utils.mergeObject({\n        \"data.flags.dnd5e.roll\": {\n          damageOnSave: this.damage?.onSave\n        }\n      }, message);\n      return super.rollDamage(config, dialog, message);\n    }\n\n    prepareFinalData(rollData) {\n      super.prepareFinalData(rollData);\n    }\n\n    _usageChatButtons(message) {\n      const buttons: any[] = [];\n      if (this.damage!.parts.length) buttons.push({\n        label: i18n(\"DND5E.Damage\"),\n        icon: '<i class=\"fas fa-burst\" inert></i>',\n        dataset: {\n          action: \"rollDamage\"\n        }\n      });\n      const superButtons = super._usageChatButtons(message);\n      // If no check buttons were generated by super (no ability/skill/tool),\n      // add a plain d20 check button\n      const hasCheckButton = superButtons.some(b => b.dataset?.action === \"rollCheck\");\n      if (!hasCheckButton) {\n        const dc = this.check?.dc.value;\n        const label = i18n(\"midi-qol.plain-d20-roll\");\n        const dataset: any = { action: \"rollCheck\", visibility: \"all\" };\n        if (dc) dataset.dc = dc;\n        buttons.push({\n          label: dc ? `<span class=\"visible-dc\">${game.i18n!.format(\"EDITOR.DND5E.Inline.DC\", { dc: String(dc), check: label })}</span><span class=\"hidden-dc\">${label}</span>` : label,\n          icon: '<i class=\"dnd5e-icon\" data-src=\"systems/dnd5e/icons/svg/ability-score-improvement.svg\" inert></i>',\n          dataset\n        });\n      }\n      return buttons.concat(superButtons);\n    }\n  }\n\n}\n\nexport function defineMidiCheckSheetClass(baseClass: any) {\n  return class MidiCheckSheet extends MidiActivityMixinSheet(baseClass) {\n\n    static PARTS = {\n      ...super.PARTS,\n      effect: {\n        template: \"modules/midi-qol/templates/activity/check-effect.hbs\",\n        templates: [\n          ...super.PARTS.effect.templates,\n          \"modules/midi-qol/templates/activity/parts/save-extras.hbs\",\n          \"modules/midi-qol/templates/activity/parts/save-damage.hbs\",\n          \"systems/dnd5e/templates/activity/parts/damage-part.hbs\",\n          \"systems/dnd5e/templates/activity/parts/damage-parts.hbs\",\n        ]\n      }\n    };\n\n    async _prepareEffectContext(context) {\n      context = await super._prepareEffectContext(context);\n      context.FriendlySaveOptions = [\n        { value: \"default\", label: i18n(\"midi-qol.SAVE.friendlySave.default\") },\n        { value: \"friendlySuccess\", label: i18n(\"midi-qol.SAVE.friendlySave.friendlySuccess\") },\n        { value: \"friendlyFail\", label: i18n(\"midi-qol.SAVE.friendlySave.friendlyFail\") },\n      ];\n      context.onSaveOptions = [\n        { value: \"none\", label: i18n(\"DND5E.SAVE.FIELDS.damage.onSave.None\") },\n        { value: \"half\", label: i18n(\"DND5E.SAVE.FIELDS.damage.onSave.Half\") },\n        { value: \"full\", label: i18n(\"DND5E.SAVE.FIELDS.damage.onSave.Full\") }\n      ];\n      // WIP\n      let autoCheckOptions = foundry.utils.duplicate(autoCheckSavesOptions);\n      delete autoCheckOptions[\"none\"];\n      context.SaveDisplayOptions = Object.keys(autoCheckOptions).reduce((acc: any, key: string) => {\n        acc.push({ value: key, label: autoCheckOptions[key] });\n        return acc;\n      }, [{ value: \"default\", label: i18n(\"Default\") }]);\n      return context;\n    }\n  }\n}","import { AnyMutableObject } from \"fvtt-types/utils\";\nimport { Activity, RollDialogConfig, RollMessageConfig, RollProcessConfig } from \"../../globals.js\";\nimport { debugEnabled, GameSystemConfig, i18n, warn } from \"../../midi-qol.js\";\nimport { Workflow } from \"../Workflow.js\";\nimport { replaceDefaultActivities, configSettings } from \"../settings.js\";\nimport { isAutoFastForward } from \"../utils.js\";\nimport { MidiActivityMixin, MidiActivityMixinSheet } from \"./MidiActivityMixin.js\";\n\nexport let MidiHealActivity: ReturnType<typeof defineMidiHealActivityClass>;\nexport let MidiHealSheet: ReturnType<typeof defineMidiHealSheetClass>;\n\nexport function setupHealActivity() {\n  if (debugEnabled > 0) warn(\"MidiQOL | HealActivity | setupHealActivity | Called\");\n  //@ts-expect-error\n  MidiHealSheet = defineMidiHealSheetClass(game.system.applications.activity.HealSheet);\n  MidiHealActivity = defineMidiHealActivityClass(GameSystemConfig.activityTypes.heal.documentClass as Activity);\n  if (replaceDefaultActivities) {\n    // GameSystemConfig.activityTypes[\"dnd5eHeal\"] = GameSystemConfig.activityTypes.heal;\n    GameSystemConfig.activityTypes.heal = { documentClass: MidiHealActivity };\n  } else {\n    GameSystemConfig.activityTypes[\"midiHeal\"] = { documentClass: MidiHealActivity };\n  }\n}\n\nlet defineMidiHealActivityClass = <T extends Activity>(ActivityClass: T) => {\n  return class MidiHealActivity extends MidiActivityMixin(ActivityClass) {\n    static LOCALIZATION_PREFIXES = [\"midi-qol.HEAL\", ...super.LOCALIZATION_PREFIXES];\n    static metadata =\n      foundry.utils.mergeObject(\n        super.metadata, {\n        title: configSettings.activityNamePrefix ? \"midi-qol.HEAL.Title.one\" : ActivityClass.metadata.title,\n        dnd5eTitle: ActivityClass.metadata.title,\n        sheetClass: MidiHealSheet,\n        usage: {\n          chatCard: \"modules/midi-qol/templates/activity-card.hbs\",\n          actions: {\n            rollHealing: MidiHealActivity.#rollHealing\n          }\n        },\n      }, { inplace: false, insertKeys: true, insertValues: true })\n\n    static #rollHealing(this: Activity, event: PointerEvent, target: HTMLElement, message: ChatMessage.Implementation) {\n      const workflow = Workflow.getWorkflow(message?.uuid);\n      if (workflow) workflow.activity = this;\n      return this.rollDamage({event, workflow}, {}, {});\n    }\n    get possibleOtherActivity() { \n      return true;\n    }\n    get canUseOtherActivity() {\n      return true;\n    }\n    \n    async rollDamage(config: RollProcessConfig = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n      config.midiOptions ??= {};\n      config.midiOptions.fastForwardHeal ??= isAutoFastForward(\"damage\");\n      config.midiOptions.fastForwardDamage ??= isAutoFastForward(\"damage\");\n      return super.rollDamage(config, dialog, message);\n    }\n    \n    /*\n    getDamageConfig(config: any ={}) {\n      if ( !this.healing.formula ) return foundry.utils.mergeObject({ rolls: [] }, config);\n  \n      const rollConfig:any = foundry.utils.mergeObject({ critical: { allow: false }, scaling: 0 }, config);\n      const rollData = this.getRollData();\n      rollConfig.rolls = [this._processDamagePart(this.healing, rollConfig, rollData)].concat(config.rolls ?? []);\n  \n      return rollConfig;\n    }\n    */\n    async _triggerSubsequentActions(config, results) {\n    }\n  }\n}\n\nexport function defineMidiHealSheetClass(baseClass: any) {\n  return class MidiHealSheet extends MidiActivityMixinSheet(baseClass) {\n    static PARTS = {\n      ...super.PARTS,\n      effect: {\n        template: \"modules/midi-qol/templates/activity/heal-effect.hbs\",\n        templates: [\n          ...super.PARTS.effect.templates\n        ]\n      }\n    };\n  }\n}","import { Activity, RollDialogConfig, RollMessageConfig, RollProcessConfig } from \"../../globals.js\";\nimport { debugEnabled, GameSystemConfig, i18n, warn } from \"../../midi-qol.js\";\nimport { Workflow } from \"../Workflow.js\";\nimport { replaceDefaultActivities, configSettings } from \"../settings.js\";\nimport { asyncHooksCall } from \"../utils.js\";\nimport { MidiActivityMixin, MidiActivityMixinSheet } from \"./MidiActivityMixin.js\";\n\nexport let MidiForwardActivity: ReturnType<typeof defineMidiForwardActivityClass>;\nexport let MidiForwardSheet: ReturnType<typeof defineMidiForwardSheetClass>;\n\nexport function setupForwardActivity() {\n  if (debugEnabled > 0) warn(\"MidiQOL | ForwardActivity | setupForwardActivity | Called\");\n  //@ts-expect-error\n  MidiForwardSheet = defineMidiForwardSheetClass(game.system.applications.activity.ForwardSheet);\n  MidiForwardActivity = defineMidiForwardActivityClass(GameSystemConfig.activityTypes.forward.documentClass as Activity);\n  if (replaceDefaultActivities) {\n    // GameSystemConfig.activityTypes[\"dnd5eForward\"] = GameSystemConfig.activityTypes.forward;\n    GameSystemConfig.activityTypes.forward = { documentClass: MidiForwardActivity };\n  } else {\n    GameSystemConfig.activityTypes[\"midiForward\"] = { documentClass: MidiForwardActivity };\n  }\n}\nlet defineMidiForwardSheetClass = (baseClass: any) => {\n  return class MidiForwardSheet extends MidiActivityMixinSheet(baseClass) {\n  }\n}\n\nlet defineMidiForwardActivityClass = <T extends Activity>(ActivityClass: T) => {\n  return class MidiForwardActivity extends MidiActivityMixin(ActivityClass) {\n    static LOCALIZATION_PREFIXES = [\"midi-qol.FORWARD\", ...super.LOCALIZATION_PREFIXES];\n    static metadata =\n      foundry.utils.mergeObject(\n        super.metadata, {\n        title: configSettings.activityNamePrefix ? \"midi-qol.FORWARD.Title.one\" : ActivityClass.metadata.title,\n        dnd5eTitle: ActivityClass.metadata.title,\n        sheetClass: MidiForwardSheet,\n        usage: {\n          chatCard: \"modules/midi-qol/templates/activity-card.hbs\",\n        },\n      }, { inplace: false, insertKeys: true, insertValues: true });\n\n    get possibleOtherActivity() {\n      return false;\n    }\n    get effects() { return [] };\n\n    /** @override */\n    async use(usage: RollProcessConfig = {}, dialog: RollDialogConfig = {}, message: RollMessageConfig = {}) {\n      const usageConfig = foundry.utils.mergeObject({\n        cause: {\n          activity: this.relativeUUID\n        },\n        consume: {\n          resources: false,\n          spellSlot: false\n        }\n      }, usage);\n\n      // @ts-expect-error no dnd5e-types\n      const activity = this.item.system.activities.get(this.activity.id);\n      if (!activity) ui.notifications?.error(\"DND5E.FORWARD.Warning.NoActivity\", { localize: true });\n      return activity?.use(usageConfig, dialog, message);\n    }\n    get isSelfTriggerableOnly() {\n      return false;\n    }\n\n    get isTriggerableActivity() {\n      return false;\n    }\n\n    get forcedTargetConfirmation() {\n      return \"never\";\n    }\n\n    async _triggerSubsequentActions(config, results) {\n    }\n  }\n}\n","import { Activity } from \"../../globals.js\";\nimport { debugEnabled, GameSystemConfig, i18n, warn } from \"../../midi-qol.js\";\nimport { replaceDefaultActivities, configSettings } from \"../settings.js\";\nimport { MidiActivityMixin, MidiActivityMixinSheet } from \"./MidiActivityMixin.js\";\n\nexport let MidiEnchantActivity: ReturnType<typeof defineMidiEnchantActivityClass>;\nexport let MidiEnchantSheet: ReturnType<typeof defineMidiEnchantSheetClass>;\n\nexport function setupEnchantActivity() {\n  if (debugEnabled > 0) warn(\"MidiQOL | EnchantActivity | setupEnchantActivity | Called\");\n  //@ts-expect-error\n  MidiEnchantSheet = defineMidiEnchantSheetClass(game.system.applications.activity.EnchantSheet);\n  MidiEnchantActivity = defineMidiEnchantActivityClass(GameSystemConfig.activityTypes.enchant.documentClass as Activity);\n  if (replaceDefaultActivities) {\n    // GameSystemConfig.activityTypes[\"dnd5eEnchant\"] = GameSystemConfig.activityTypes.enchant;\n    GameSystemConfig.activityTypes.enchant = { documentClass: MidiEnchantActivity };\n  } else {\n    GameSystemConfig.activityTypes[\"midiEnchant\"] = { documentClass: MidiEnchantActivity };\n  }\n}\n\nlet defineMidiEnchantActivityClass = <T extends Activity>(ActivityClass: T) => {\n  return class MidiEnchantActivity extends MidiActivityMixin(ActivityClass) {\n    static LOCALIZATION_PREFIXES = [\"midi-qol.ENCHANT\", ...super.LOCALIZATION_PREFIXES];\n    static metadata =\n      foundry.utils.mergeObject(\n        super.metadata, {\n        title: configSettings.activityNamePrefix ? \"midi-qol.ENCHANT.Title.one\" : ActivityClass.metadata.title,\n        dnd5eTitle: ActivityClass.metadata.title,\n        sheetClass: MidiEnchantSheet,\n        usage: {\n          dialog: ActivityClass.metadata.usage.dialog,\n        },\n      }, { inplace: false, insertKeys: true, insertValues: true })\n\n    get possibleOtherActivity() { \n      return false;\n    }\n    get isTriggerableActivity() {\n      return true;\n    }\n\n    async _triggerSubsequentActions(config, results) {\n      // for enchantment activities we do want to support the dnd5e default behaviour\n      await super._triggerSubsequentActions(config, results);\n    }\n  }\n}\n\nexport function defineMidiEnchantSheetClass(baseClass: any) {\n  return class MidiEnchantSheet extends MidiActivityMixinSheet(baseClass) {\n    static PARTS = {\n      ...super.PARTS,\n      effect: {\n        template: \"modules/midi-qol/templates/activity/enchant-effect.hbs\",\n        templates: [\n          ...super.PARTS.effect.templates\n        ]\n      }\n    };\n  }\n}","import { configSettings } from \"./settings.js\";\n\n// TODO: Since we're just replacing this one function, maybe wrap instead of overriding the class\nexport class MidiCombat5e extends globalThis.dnd5e.documents.Combat5e {\n  async endCombat() {\n    if (configSettings.activationAutomation !== \"auto\") return super.endCombat();\n    await Reflect.apply(Combat.prototype.endCombat, this, []);\n    super._recoverUses({turn: true, turnEnd: true, turnStart: false});\n    return this;\n  }\n}","import { configSettings, isDnd5e53 } from \"../settings.js\";\nimport { GameSystemConfig, MODULE_ID, MQDamageRollTypes, debugEnabled, i18nFormat, log, warn } from \"../../midi-qol.js\";\nimport { TroubleShooter } from \"../apps/TroubleShooter.js\";\nimport { CombinedTargetDescriptor, DamageApplicationOptions } from \"../../globals.js\";\nimport { WorkflowDataFlags } from \"../Workflow.js\";\n\n// SVG Icons for midi-qol custom change sources (using dnd5e SVGs for consistent styling)\nconst MIDI_CHANGE_ICONS: Record<string, string> = {\n  saved: \"systems/dnd5e/icons/svg/activity/save.svg\",\n  superSaver: \"systems/dnd5e/icons/svg/checked-shield.svg\",\n  semiSuperSaver: \"systems/dnd5e/icons/svg/checked-shield.svg\",\n  uncannyDodge: \"systems/dnd5e/icons/svg/activity/utility.svg\",\n  absorption: \"systems/dnd5e/icons/svg/damage/healing.svg\",\n  DR: \"systems/dnd5e/icons/svg/damage/threshold.svg\",\n  spell: \"systems/dnd5e/icons/svg/activity/cast.svg\",\n  magic: \"systems/dnd5e/icons/svg/activity/enchant.svg\",\n  nonmagic: \"systems/dnd5e/icons/svg/activity/attack.svg\"\n};\n\nexport class DamageApplicationElementMidi extends globalThis.dnd5e.applications.components.DamageApplicationElement {\n  #targetOptions: Map<string, DamageApplicationOptions> = new Map();\n  chatMessage;\n  damages: any[] = [];\n  damageType: string = \"defaultDamage\";\n\n  /**\n   * Override to handle \"all\" type for consolidated save icons and other midi custom types\n   */\n  getChangeSourceButton({ change, icon, type }, targetOptions: DamageApplicationOptions): string {\n    // For midi custom change types with \"all\", provide custom icon and handling\n    if (type === \"all\" || !GameSystemConfig.damageTypes[type]) {\n      const customIcon = icon || MIDI_CHANGE_ICONS[change];\n      if (customIcon) {\n        const { label, pressed } = this.getChangeSourceOptions(type, change, targetOptions);\n        return `\n          <button class=\"change-source unbutton\" type=\"button\" data-type=\"${type}\" data-change=\"${change}\"\n                  data-tooltip aria-label=\"${label}\" aria-pressed=\"${pressed}\">\n            <dnd5e-icon src=\"${customIcon}\" inert></dnd5e-icon>\n            <i class=\"fa-solid fa-slash\" inert></i>\n            <i class=\"fa-solid fa-arrow-turn-down\" inert></i>\n          </button>\n        `;\n      }\n    }\n    // Fall back to parent implementation for standard damage types\n    return super.getChangeSourceButton({ change, icon, type }, targetOptions);\n  }\n\n  /**\n   * Override to handle \"all\" type and midi custom change types for labels\n   */\n  getChangeSourceOptions(type: string, change: string, options: DamageApplicationOptions): { label: string, pressed: string } {\n    let mode = \"active\";\n    if ((options.ignore?.[change] === true) || options.ignore?.[change]?.has?.(type)) mode = \"ignore\";\n    else if ((change === \"immunity\") && (options.downgrade as Set<string>)?.has(type)) mode = \"downgrade\";\n\n    const changeKey = change.charAt(0).toUpperCase() + change.slice(1);\n    const typeLabel = GameSystemConfig.damageTypes[type]?.label ?? GameSystemConfig.healingTypes?.[type]?.label ?? \"\";\n    let label = i18nFormat(`DND5E.DamageApplication.Change.${changeKey}`, { type: typeLabel });\n\n    if (mode === \"ignore\") label = i18nFormat(\"DND5E.DamageApplication.Ignoring\", { source: label });\n    if (mode === \"downgrade\") label = i18nFormat(\"DND5E.DamageApplication.Downgrading\", { source: label });\n\n    return { label, pressed: mode === \"active\" ? \"false\" : mode === \"ignore\" ? \"true\" : \"mixed\" };\n  }\n\n  /**\n   * Override to append midi custom change source buttons after parent builds the entry\n   */\n  buildTargetListEntry({ uuid, name }): HTMLLIElement | void {\n    // Let parent build the base entry\n    const li = super.buildTargetListEntry({ uuid, name }) as HTMLLIElement | undefined;\n    if (!li) return;\n\n    // Get the active flags which include our custom midi types\n    const targetOptions = this.getTargetOptions(uuid);\n    const actor = fromUuidSync(uuid) as Actor.Implementation | null;\n    if (!actor) return li;\n\n    const { active } = this.calculateDamage(actor, targetOptions);\n\n    // Find midi custom types that parent skipped (type \"all\" or types not in damageTypes config)\n    const subtitle = li.querySelector(\".subtitle\");\n    if (!subtitle) return li;\n\n    for (const [change, values] of Object.entries(active)) {\n      if (foundry.utils.getType(values) !== \"Set\") continue;\n      for (const type of values as Set<string>) {\n        // Skip types that parent already handled\n        if (GameSystemConfig.damageTypes[type] || GameSystemConfig.healingTypes?.[type]) continue;\n        // Add button for midi custom type\n        if (MIDI_CHANGE_ICONS[change]) {\n          const button = this.getChangeSourceButton({ type, change, icon: MIDI_CHANGE_ICONS[change] }, targetOptions);\n          subtitle.insertAdjacentHTML(\"beforeend\", button);\n        }\n      }\n    }\n\n    return li;\n  }\n\n  getTargetOptions(uuid: string): DamageApplicationOptions {\n    if (!this.#targetOptions.has(uuid)) this.#targetOptions.set(uuid, { multiplier: 1 } as DamageApplicationOptions);\n    const options = this.#targetOptions.get(uuid);\n    if (!options) return { multiplier: 1 } as DamageApplicationOptions; // just to keep the linter happy - can never happen\n    let sourceActorUuid = foundry.utils.getProperty(this.chatMessage, \"flags.midi-qol.sourceActorUuid\");\n    try {\n      let targetDetails;\n        const targets = (foundry.utils.getProperty(this.chatMessage, WorkflowDataFlags.targetDescriptors) ?? []) as Array<CombinedTargetDescriptor>;\n        targetDetails = targets.find(target => target.uuid === uuid);\n        if (!targetDetails) return options;\n        options.midi = foundry.utils.duplicate(targetDetails);\n        const saveMultiplier = targetDetails.saveMults?.[this.damageType];\n        if (targetDetails.saved) {\n          foundry.utils.setProperty(options, \"midi.saveMultiplier\", saveMultiplier ?? configSettings.defaultSaveMultiplier);\n        }\n        if (saveMultiplier !== undefined) {\n          if (targetDetails.superSaver && saveMultiplier === configSettings.defaultSaveMultiplier) {\n            foundry.utils.setProperty(options, \"midi.saveMultiplier\", targetDetails.saved ? 0 : configSettings.defaultSaveMultiplier);\n          }\n          if (targetDetails.semiSuperSaver && saveMultiplier === configSettings.defaultSaveMultiplier) {\n            foundry.utils.setProperty(options, \"midi.saveMultiplier\", targetDetails.saved ? 0 : 1);\n          }\n        }\n        if (targetDetails.uncannyDodge) {\n          foundry.utils.setProperty(options, \"midi.uncannyDodge\", true);\n        }\n        // Left in for backwards compatibility of previous midi versions\n        if (targetDetails.sourceActorUuid) {\n          sourceActorUuid = targetDetails.sourceActorUuid;\n        }\n    } catch (err) {\n      const message = `midi-qol | _DAgetTargetOptions failed to get target options`;\n      console.warn(message, err);\n      TroubleShooter.recordError(err, message);\n    }\n    foundry.utils.setProperty(options, \"midi.sourceActorUuid\", sourceActorUuid);\n    return options;\n  }\n  // Flag categories for active damage modifiers\n  static SET_FLAGS = [\"modification\", \"resistance\", \"vulnerability\", \"immunity\",\n    \"absorption\", \"spell\", \"magic\", \"nonmagic\", \"DR\", \"uncannyDodge\"];\n  static SAVE_FLAGS = [\"saved\", \"superSaver\", \"semiSuperSaver\"]; // Use \"all\" type for consolidated icon\n  static BOOL_FLAGS = [\"threshold\"];\n\n  calculateDamage(actor: Actor.Implementation, options: DamageApplicationOptions) {\n    // @ts-expect-error no dnd5e-types\n    const damages = actor.calculateDamage(this.damages, options) as DamageDescription[];\n    // @ts-expect-error amount, temp, tempMax are on the damages array\n    const { amount: total, temp: rawTemp, tempMax: rawTempMax } = damages;\n    const temp = Math.floor(Math.max(0, rawTemp ?? 0));\n    const tempMax = rawTempMax ?? 0;\n\n    // Build active object from flag categories\n    const active: Record<string, Set<string> | boolean> = {};\n    for (const flag of [...DamageApplicationElementMidi.SET_FLAGS, ...DamageApplicationElementMidi.SAVE_FLAGS]) {\n      active[flag] = new Set();\n    }\n    for (const flag of DamageApplicationElementMidi.BOOL_FLAGS) {\n      active[flag] = false;\n    }\n\n    try {\n      for (const damage of damages) {\n        const isDRType = [\"none\", \"midi-none\"].includes(damage.type);\n\n        // Set flags that use actual damage type\n        for (const flag of DamageApplicationElementMidi.SET_FLAGS) {\n          if (isDnd5e53) {\n            if (damage.active?.type?.[flag]) (active[flag] as Set<string>).add(damage.type);\n            if (damage.active?.all?.[flag]) (active[flag] as Set<string>).add(\"ALL\");\n          } else {\n            if (damage.active?.[flag]) (active[flag] as Set<string>).add(damage.type);\n          }\n        }\n        // Save flags use \"all\" for consolidated icon, skip DR types\n        if (!isDRType) {\n          for (const flag of DamageApplicationElementMidi.SAVE_FLAGS) {\n            if (isDnd5e53) {\n              if (damage.active?.type?.[flag] || damage.active?.all?.[flag]) (active[flag] as Set<string>).add(\"all\");\n            } else {\n              if (damage.active?.[flag]) (active[flag] as Set<string>).add(\"all\");\n            }\n          }\n        }\n        // Boolean flags (threshold stays flat in both versions)\n        for (const flag of DamageApplicationElementMidi.BOOL_FLAGS) {\n          if (damage.active?.[flag]) active[flag] = true;\n        }\n      }\n\n      // Union with ignore sets to preserve button display for ignored items\n      for (const flag of [...DamageApplicationElementMidi.SET_FLAGS, ...DamageApplicationElementMidi.SAVE_FLAGS]) {\n        if (foundry.utils.getType(options.ignore?.[flag]) === \"Set\") {\n          active[flag] = (active[flag] as Set<string>).union(options.ignore?.[flag]);\n        }\n      }\n      // Special cases\n      if (options.downgrade instanceof Set) {\n        active.immunity = (active.immunity as Set<string>).union(options.downgrade);\n      }\n      // @ts-expect-error threshold exists on dnd5e's ignore type\n      active.threshold ||= options.ignore?.threshold ?? false;\n    } catch (err) {\n      const message = `midi-qol | calculateDamage failed to calculate damage`;\n      console.warn(message, err);\n      TroubleShooter.recordError(err, message);\n    }\n    return { temp, tempMax, total, active };\n  }\n}\n","import { registerSettings, fetchParams, configSettings, checkRule, enableWorkflow, fetchSoundSettings, midiSoundSettingsBackup, readySettingsSetup, collectSettingData, exportSettingsToJSON, importSettingsFromJSON, safeGetGameSetting, shouldDisplaySaveDC, triggeredActivityTargetOptions, triggeredActivityRollAsOptions, resetConfigSettingsToDefaults } from './module/settings.js';\nimport { preloadTemplates } from './module/preloadTemplates.js';\nimport { checkModules, setupModules } from './module/setupModules.js';\nimport { itemPatching, visionPatching, actorAbilityRollPatching, readyPatching, initPatching, addDiceTermModifiers, computeAbilityAdvantage, computeSkillAdvantage, computeToolAdvantage, processWoundedStatus, getActorWoundedSemaphore } from './module/patching.js';\nimport { MidiDependentsRegistry } from './module/lib/MidiDependentsRegistry.js';\nimport { initHooks, readyHooks, setupHooks } from './module/Hooks.js';\nimport { SaferSocket, initGMActionSetup, setupSocket, socketlibSocket, unTimedExecuteAsGM } from './module/GMAction.js';\nimport { setupSheetQol } from './module/sheetQOL.js';\nimport { TrapWorkflow, DamageOnlyWorkflow, Workflow, DummyWorkflow, DDBGameLogWorkflow, UserWorkflow } from './module/Workflow.js';\nimport { addConcentrationDependent, addRollTo, applyTokenDamage, applyTokenDamageMany, canSee, canSense, canSenseModes, checkDistance, checkIncapacitated, checkNearby, chooseEffect, completeItemUse, computeCoverBonus, contestedRoll, createConditionData, throttledUpdate, displayDSNForRoll, doConcentrationCheck, doOverTimeEffect, evalAllConditions, evalCondition, findNearby, findNearbyCount, getCachedDocument, getChanges, getConcentrationEffect, getTokenDocument, getOrCreateTokenForActor, getOrCreateTokenForActorAsSet, getTokenPlayerName, getTokenPlayerNameForUser, getTraitMult, hasCondition, hasUsedBonusAction, hasUsedReaction, isValidTarget, midiRenderAttackRoll, midiRenderBonusDamageRoll, midiRenderDamageRoll, midiRenderOtherDamageRoll, midiRenderRoll, fromActorUuid, playerFor, playerForActor, raceOrType, reactionDialog, removeHiddenCondition, removeInvisibleCondition, removeReactionUsed, setBonusActionUsed, setReactionUsed, tokenForActor, typeOrRace, validRollAbility, actorFromUuid, removeActionUsed, removeBonusActionUsed, getCheckRollModeFor, getSaveRollModeFor, completeActivityUse, checkActivityRange, modifyDamageBy, computeDistance, getDistance, getItemFromEffectOrigin, addDependent, cleanCPRFlanked, updatesCache, createDamageDetail, activityHasEmanationNoTemplate, getVitalityItem, getVitalityValue, getVitalityMax, hasVitalitySystem, resolveItemMacro, resolveActivityMacro, setupMidiFlagTypes, initCoverConstants, ReactionDialog, RollModifyDialog, sizeNumeric } from './module/utils.js';\nimport { ConfigPanel } from './module/apps/ConfigPanel.js';\nimport { RollStats } from './module/RollStats.js';\nimport { OnUseMacroOptions } from './module/apps/Item.js';\nimport { MidiKeyManager } from './module/MidiKeyManager.js';\nimport { MidiSounds } from './module/midi-sounds.js';\nimport { addUndoChatMessage, getUndoQueue, removeMostRecentWorkflow, showUndoQueue, undoMostRecentWorkflow } from './module/undo.js';\nimport { UndoWorkflow, showUndoWorkflowApp } from './module/apps/UndoWorkflow.js';\nimport { TroubleShooter } from './module/apps/TroubleShooter.js';\nimport { TargetConfirmationDialog } from './module/apps/TargetConfirmation.js';\nimport { TargetConfirmationConfig } from './module/apps/TargetConfirmationConfig.js';\nimport { MidiAttackActivity, setupAttackActivity } from './module/activities/AttackActivity.js';\nimport { RollModifierTracker } from './module/lib/RollModifierTracker.js';\nimport { ChatLogMidi } from './module/ChatClasses/ChatLogMidi.js';\nimport { injectMidiCompletions } from './module/lib/midiCompletions.js';\nimport { OverTimeEditor } from './module/apps/OverTimeEditor.js';\nimport { ConditionEditor } from './module/apps/ConditionEditor.js';\nimport { ActorOnUseMacrosConfig } from './module/apps/ActorOnUseMacroConfig.js';\nimport { ItemOnUseMacrosConfig } from './module/apps/ItemOnUseMacrosConfig.js';\nimport { DependentsExplorer } from './module/apps/DependentsExplorer.js';\nimport { MidiActivityChoiceDialog } from './module/apps/MidiActivityChoiceDialog.js';\nimport { MidiRollChoiceDialog } from './module/apps/MidiRollChoiceDialog.js';\nimport { ModuleReviewDialog } from './module/apps/ModuleReviewDialog.js';\nimport { RollStatsDisplay } from './module/apps/RollStatsDisplay.js';\nimport { SoundConfigPanel } from './module/apps/SoundConfigPanel.js';\nimport { registerHandlebarsHelpers } from './module/lib/HandlebarsHelpers.js';\n\n// Register macro-autocomplete hook handler at module load time so it's\n// ready before macro-autocomplete fires \"macro-autocomplete.ready\" in its ready hook.\ninjectMidiCompletions();\n\nexport function getCanvas(): foundry.canvas.Canvas | undefined {\n  if (!canvas || !canvas.scene) {\n    error(\"Canvas/Scene not ready - roll automation will not function\");\n    return undefined;\n  }\n  return canvas;\n}\n\nexport let ceInterface: {\n  findEffects: () => ActiveEffect.Implementation[];\n  findEffect: (input: {\n    folderId?: string,\n    effectId?: string,\n    effectName?: string\n  }) => ActiveEffect.Implementation | null;\n  hasEffectApplied: (input: {\n    effectId?: string,\n    effectName?: string,\n    uuid?: string\n  }) => boolean;\n  addEffect: (input: {\n    effectId?: string,\n    effectName?: string,\n    effectData?: ActiveEffect.CreateData,\n    uuid?: string,\n    overlay?: boolean,\n    origin?: string | null,\n  }) => Promise<ActiveEffect.Implementation[]>;\n  removeEffect: (input: {\n    effectId?: string,\n    effectName?: string,\n    uuid?: string,\n    origin?: string | null,\n  }) => Promise<void>;\n  toggleEffect: (input: {\n    effectId?: string,\n    effectName?: string,\n    uuids?: string[],\n    overlay?: boolean;\n    prioritizeTargets?: boolean;\n    origin?: string | null\n  }) => Promise<void>\n} | undefined;\n\nexport let BaseChatLogClass;\nexport let debugEnabled = 0;\n// 0 = none, warnings = 1, debug = 2, all = 3\nexport let debug = (...args: any[]) => { if (debugEnabled > 1) console.log(\"DEBUG: midi-qol | \", ...args) };\nexport let log = (...args: any[]) => console.log(\"midi-qol | \", ...args);\nexport let warn = (...args: any[]) => { if (debugEnabled > 0) console.warn(\"midi-qol | \", ...args) };\nexport let error = (...args: any[]) => console.error(\"midi-qol | \", ...args);\nexport let timelog = (...args: any[]) => warn(\"midi-qol | \", Date.now(), ...args);\nexport let levelsAPI: any;\n// export let allDamageTypes;\nexport const MODULE_ID = \"midi-qol\";\n\nconst { StringField } = foundry.data.fields;\n\nexport let i18n = (key: SelectOptionValue) => {\n  const k = typeof key === \"object\" ? key.label : key;\n  return game.i18n?.localize(k) ?? k;\n}\n\nexport let i18nFormat = (key: string, data = {}) => {\n  return game.i18n?.format(key, data) ?? key;\n}\n\n// dnd5e 5.3 nested DND5E.Healing under DND5E.HEAL.HealingButton; older 5.2.x\n// has the flat key. Feature-detect via i18n.has so we work on both.\nexport function getHealingLabel(): string {\n  return game.i18n?.has(\"DND5E.HEAL.HealingButton\")\n    ? i18n(\"DND5E.HEAL.HealingButton\")\n    : i18n(\"DND5E.Healing\");\n}\n\nexport function getStaticID(id: string): string {\n  id = `dnd5e${id}`;\n  if (id.length >= 16) return id.substring(0, 16);\n  return id.padEnd(16, \"0\");\n}\n\nexport let setDebugLevel = (debugText: string) => {\n  debugEnabled = { \"none\": 0, \"warn\": 1, \"debug\": 2, \"all\": 3 }[debugText] || 0;\n  // 0 = none, warnings = 1, debug = 2, all = 3\n  if (debugEnabled >= 3) CONFIG.debug.hooks = true;\n}\n\nexport async function busyWait(milliSeconds: number) {\n  return (new Promise(resolve => setTimeout(resolve, milliSeconds)));\n}\n\nexport let midiFlags: { name: string, type?: string }[] = [];\n// Handle both init orderings: DAE's init may fire before or after midi's init.\n// midiInitComplete tracks whether midi's init has set up GameSystemConfig/allAttackTypes.\nlet daeAddAutoFields: Function | null = null;\nlet daeBooleanFormulaField: any = null;\nlet midiInitComplete = false;\nHooks.once(\"dae.addAutoFields\", (addAutoFields: Function, fields: any) => {\n  daeAddAutoFields = addAutoFields;\n  daeBooleanFormulaField = fields?.BooleanFormulaField;\n  // If midi's init already ran, register flags now (DAE init fired late)\n  if (midiInitComplete) {\n    setupMidiFlags();\n    daeAddAutoFields(midiFlags.filter(f => !!f.name));\n  }\n});\nexport let allAttackTypes: string[] = []\nexport let gameStats: RollStats;\nexport let overTimeEffectsToDelete: Record<string, { uuid: string }> = {};\nexport let savedOverTimeEffectsToDelete: Record<string, {\n  uuid: string;\n  saveCount?: number;         // Number of saves required\n  saveCountAction?: string;   // \"-\" = remove (default), \"+\" = permanent, or effectSpec (prefixed with \"c\" if consecutive)\n  saveConsecutive?: boolean;  // If true, counter resets on a failed save\n  failCount?: number;         // Number of fails required\n  failCountAction?: string;   // \"+\" = permanent (default), \"-\" = remove, or effectSpec (prefixed with \"c\" if consecutive)\n  failConsecutive?: boolean;  // If true, counter resets on a successful save\n}> = {}\nexport let MQItemMacroLabel: string;\nexport let MQActivityMacroLabel: string;\nexport let MQOnUseOptions: Record<string, string>;\nexport let GameSystemConfig: typeof CONFIG.DND5E;\nexport let systemConcentrationId: string;\nexport let midiReactionEffect: ActiveEffect.Implementation | undefined;\nexport let midiBonusActionEffect: ActiveEffect.Implementation | undefined;\nexport let midiFlankingEffect: ActiveEffect.Implementation | undefined;\nexport let midiFlankedEffect: ActiveEffect.Implementation | undefined;\n\nexport const MESSAGE_TYPES = {\n  HITS: 1,\n  SAVES: 2,\n  ATTACK: 3,\n  DAMAGE: 4,\n  OTHER: 5,\n  ITEM: 0\n};\nexport let MQDamageRollTypes = [\"defaultDamage\", \"otherDamage\", \"bonusDamage\"];\n\n/* ------------------------------------ */\n/* Initialize module\t\t\t\t\t*/\n/* ------------------------------------ */\n//@ts-expect-error\nHooks.once(\"levelsReady\", function () {\n  // @ts-expect-error\n  levelsAPI = CONFIG.Levels.API;\n});\nHooks.once(\"init\", () => {\n  registerHandlebarsHelpers();\n  setupChatMessageMidi();\n  //@ts-expect-error\n  CONFIG.ChatMessage.documentClass = ChatMessageMidi;\n  // @ts-expect-error\n  CONFIG.Combat.documentClass = MidiCombat5e;\n});\n\n// Phase 1: ES module load — pure function/class references available immediately\n// @ts-expect-error it'll get populated incrementally\nglobalThis.MidiQOL ??= {};\nObject.assign(globalThis.MidiQOL, {\n  activityHasEmanationNoTemplate,\n  addDependent,\n  addConcentrationDependent,\n  addRollTo,\n  addUndoChatMessage,\n  applyTokenDamage,\n  applyTokenDamageMany,\n  actorFromUuid,\n  canSee,\n  canSense,\n  canSenseModes,\n  checkActivityRange,\n  checkDistance,\n  checkIncapacitated,\n  checkNearby,\n  chooseEffect,\n  completeItemUse,\n  completeActivityUse,\n  computeAbilityAdvantage,\n  computeCoverBonus,\n  computeDistance,\n  computeSkillAdvantage,\n  computeToolAdvantage,\n  contestedRoll,\n  createConditionData,\n  createDamageDetail,\n  createEffects,\n  DamageOnlyWorkflow,\n  DDBGameLogWorkflow,\n  debug,\n  displayDSNForRoll,\n  doConcentrationCheck,\n  doOverTimeEffect,\n  DummyWorkflow,\n  evalAllConditions,\n  evalCondition,\n  findNearby,\n  findNearbyCount,\n  fromUuidSync,\n  getCachedChatMessage: getCachedDocument,\n  getChanges,\n  getConcentrationEffect,\n  getDistance,\n  getItemFromEffectOrigin,\n  getTokenPlayerName,\n  getTokenPlayerNameForUser,\n  getTokenForActor: getOrCreateTokenForActor,\n  getTokenForActorAsSet: getOrCreateTokenForActorAsSet,\n  getTraitMult,\n  getUndoQueue,\n  getActorWoundedSemaphore,\n  getVitalityItem,\n  getVitalityMax,\n  getVitalityValue,\n  hasCondition,\n  hasUsedBonusAction,\n  hasUsedReaction,\n  hasVitalitySystem,\n  isTargetable: isValidTarget,\n  log,\n  MidiDependentsRegistry,\n  midiRenderRoll,\n  midiRenderAttackRoll,\n  midiRenderDamageRoll,\n  midiRenderBonusDamageRoll,\n  midiRenderOtherDamageRoll,\n  MidiSounds,\n  modifyDamageBy,\n  moveToken,\n  moveTokenAwayFromPoint,\n  MQfromActorUuid: fromActorUuid,\n  MQfromUuid: fromUuidSync,\n  playerFor,\n  playerForActor,\n  processWoundedStatus,\n  raceOrType,\n  reactionDialog,\n  removeActionUsed,\n  removeBonusActionUsed,\n  removeEffects,\n  removeHiddenCondition,\n  removeInvisibleCondition,\n  removeMostRecentWorkflow,\n  removeReactionUsed,\n  resolveItemMacro,\n  resolveActivityMacro,\n  resolveTargetConfirmation,\n  RollModifierTracker,\n  setBonusActionUsed,\n  setReactionUsed,\n  sizeNumeric,\n  showUndoQueue,\n  showUndoWorkflowApp,\n  teleportToken,\n  testfunc,\n  tokenForActor,\n  TrapWorkflow,\n  typeOrRace,\n  undoMostRecentWorkflow,\n  updateEffects,\n  UserWorkflow,\n  validRollAbility,\n  warn,\n  Workflow,\n  workflowClass: Workflow,\n  Workflows: { \"Workflow\": Workflow, \"DamageOnlyWorkflow\": DamageOnlyWorkflow, \"TrapWorkflow\": TrapWorkflow, \"DummyWorkflow\": DummyWorkflow, \"DDBGameLogWorkflow\": DDBGameLogWorkflow },\n  ChatClasses: {\n    ChatLogMidi,\n    ChatMessageMidi,\n    DamageApplicationElementMidi\n  },\n  apps: {\n    ActorOnUseMacrosConfig,\n    ConditionEditor,\n    ConfigPanel,\n    DependentsExplorer,\n    ItemOnUseMacrosConfig,\n    MidiActivityChoiceDialog,\n    MidiRollChoiceDialog,\n    ModuleReviewDialog,\n    OverTimeEditor,\n    ReactionDialog,\n    RollModifyDialog,\n    RollStatsDisplay,\n    SoundConfigPanel,\n    TargetConfirmationConfig,\n    TargetConfirmationDialog,\n    TroubleShooter,\n    UndoWorkflow,\n  },\n  logEvaluationData: false,\n});\n\n// Deprecated top-level app class accessors — use MidiQOL.apps.X instead\nfor (const appName of [\"ConfigPanel\", \"TargetConfirmationDialog\", \"TroubleShooter\"] as const) {\n  Object.defineProperty(globalThis.MidiQOL, appName, {\n    get() {\n      foundry.utils.logCompatibilityWarning(\n        `MidiQOL.${appName} is deprecated. Use MidiQOL.apps.${appName} instead.`,\n        { since: \"midi-qol 13.0.50\", until: \"midi-qol 13.1.0\" }\n      );\n      return globalThis.MidiQOL.apps[appName];\n    },\n    configurable: true,\n    enumerable: true,\n  });\n}\n\nfunction setupActivities() {\n  // @ts-expect-error it'll get populated don't worry\n  globalThis.MidiQOL.activityTypes = {};\n  setupMidiActivityMixin();\n  setupAttackActivity();\n  globalThis.MidiQOL.activityTypes[\"attack\"] = { documentClass: MidiAttackActivity };\n  setupDamageActivity();\n  globalThis.MidiQOL.activityTypes[\"damage\"] = { documentClass: MidiDamageActivity };\n  setupCastActivity();\n  globalThis.MidiQOL.activityTypes[\"cast\"] = { documentClass: MidiCastActivity };\n  setupSaveActivity();\n  globalThis.MidiQOL.activityTypes[\"save\"] = { documentClass: MidiSaveActivity };\n  setupCheckActivity(); // must happen after setupSaveActivity\n  globalThis.MidiQOL.activityTypes[\"check\"] = { documentClass: MidiCheckActivity };\n  setupEnchantActivity();\n  globalThis.MidiQOL.activityTypes[\"enchant\"] = { documentClass: MidiEnchantActivity };\n  setupHealActivity();\n  globalThis.MidiQOL.activityTypes[\"heal\"] = { documentClass: MidiHealActivity };\n  setupSummonActivity();\n  globalThis.MidiQOL.activityTypes[\"summon\"] = { documentClass: MidiSummonActivity };\n  setupTransformActivity();\n  globalThis.MidiQOL.activityTypes[\"transform\"] = { documentClass: MidiTransformActivity };\n  setupUtilityActivity();\n  globalThis.MidiQOL.activityTypes[\"utility\"] = { documentClass: MidiUtilityActivity };\n  setupForwardActivity();\n  globalThis.MidiQOL.activityTypes[\"forward\"] = { documentClass: MidiForwardActivity };\n  globalThis.MidiQOL.activityTypes[\"MidiActivityMixin\"] = MidiActivityMixin;\n}\n\nHooks.once('init', async function () {\n  GameSystemConfig = CONFIG.DND5E;\n  initCoverConstants();\n  setupMidiFlagTypes();\n  log('Initializing midi-qol');\n  window.customElements.define(\"midi-damage-application\", DamageApplicationElementMidi as unknown as CustomElementConstructor);\n  setupActivities();\n\n  // Only install ChatLogMidi if chatlog-prune module is not active\n  if (game.settings.get(\"midi-qol\", \"pruneChatLog\") && !game.modules.get(\"chatlog-prune\")?.active) {\n    foundry.utils.logCompatibilityWarning(\n      \"midi-qol | Built-in chat log pruning is deprecated. Please install and activate the 'chatlog-prune' module instead.\",\n      { since: \"13.0.37\", until: \"13.1.0\" }\n    );\n    BaseChatLogClass = CONFIG.ui.chat;\n    //@ts-expect-error - lots of incorrect missing elements from the class\n    CONFIG.ui.chat = ChatLogMidi;\n  }\n\n  // @ts-expect-error no dnd5e-types\n  systemConcentrationId = CONFIG.specialStatusEffects.CONCENTRATING;\n  //@ts-expect-error\n  Hooks.once('dfreds-convenient-effects.ready', () => {\n    setupMidiStatusEffects();\n  });\n  Hooks.once(\"dae.ready\", api => setupMidiFlagEditors(api));\n\n  addConfigOptions();\n  GameSystemConfig.areaTargetTypes[\"emanationNoTemplate\"] = {\n    label: i18n(\"midi-qol.emanationNoTemplate\"),\n    template: \"rect\",\n    standard: true,\n    counted: \"midi-qol.emanationTemplate.counted\"\n  };\n\n  GameSystemConfig.damageTypes[\"none\"] = { label: i18n(\"midi-qol.noType\"), icon: `systems/${game.system?.id}/icons/svg/trait-damage-immunities.svg` };\n  GameSystemConfig.damageTypes[\"midi-none\"] = { label: i18n(\"midi-qol.midi-none\"), icon: `systems/${game.system?.id}/icons/svg/trait-damage-immunities.svg` };\n  GameSystemConfig.damageTypes[\"vitality\"] = { label: i18n(\"midi-qol.vitalityDamage\"), icon: `modules/${MODULE_ID}/icons/vitality.svg` };\n  GameSystemConfig.healingTypes[\"vitality\"] = { label: i18n(\"midi-qol.vitalityHealing\"), icon: `modules/${MODULE_ID}/icons/vitality.svg` };\n  allAttackTypes = [\"rwak\", \"mwak\", \"rsak\", \"msak\"];\n  midiInitComplete = true;\n  // Register midi flags with DAE if the hook already fired (normal case: DAE init before midi init).\n  // If the hook hasn't fired yet, the Hooks.once callback will handle it.\n  if (daeAddAutoFields) {\n    setupMidiFlags();\n    daeAddAutoFields(midiFlags.filter(f => !!f.name));\n  }\n  initHooks();\n\n  // globalThis.MidiQOL = { checkIncapacitated };\n  // Assign custom classes and constants here\n\n  // Register custom module settings\n  registerSettings();\n  fetchParams();\n  fetchSoundSettings();\n  // This seems to cause problems for localisation for the items compendium (at least for french)\n  // Try a delay before doing this - hopefully allowing localisation to complete\n  // If babele is installed then wait for it to be ready\n  if (game.modules.get(\"babele\")?.active) {\n    //@ts-expect-error\n    Hooks.once(\"babele.ready\", MidiSounds.getWeaponBaseTypes);\n  } else {\n    Hooks.once(\"ready\", MidiSounds.getWeaponBaseTypes);\n  }\n  // Preload Handlebars templates\n  preloadTemplates();\n  // Register custom sheets (if any)\n  initPatching();\n  addDiceTermModifiers();\n  globalThis.MidiKeyManager = new MidiKeyManager();\n  globalThis.MidiKeyManager.initKeyMappings();\n  Hooks.on(\"error\", (...args) => {\n    let [message, err] = args;\n    TroubleShooter.recordError(err, message);\n  });\n  gameStats = new RollStats();\n});\n//@ts-expect-error\nHooks.on(\"dae.modifySpecials\", (specKey, specials, _characterSpec) => {\n  specials[`flags.${MODULE_ID}.onUseMacroName`] = [new StringField(), CONST.ACTIVE_EFFECT_MODES.CUSTOM];\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.onUseMacroName`);\n  specials[`flags.${MODULE_ID}.optional.NAME.macroToCall`] = [new StringField(), CONST.ACTIVE_EFFECT_MODES.CUSTOM];\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.macroToCall`);\n  for (let type of [\"dm\", \"da\", \"di\", \"dv\", \"dr\"]) {\n    // specials[`system.traits.${type}.midi.all`] = [new StringField(), -1];\n    // daeFieldBrowserFields.push(`system.traits.${type}.midi.all`);\n    specials[`system.traits.${type}.midi.magical`] = [new StringField(), -1];\n    daeFieldBrowserFields.push(`system.traits.${type}.midi.magical`);\n    specials[`system.traits.${type}.midi.non-magical`] = [new StringField(), -1];\n    daeFieldBrowserFields.push(`system.traits.${type}.midi.non-magical`);\n    specials[`system.traits.${type}.midi.non-magical-physical`] = [new StringField(), -1];\n    daeFieldBrowserFields.push(`system.traits.${type}.midi.non-magical-physical`);\n    specials[`system.traits.${type}.midi.non-silver-physical`] = [new StringField(), -1];\n    daeFieldBrowserFields.push(`system.traits.${type}.midi.non-silver-physical`);\n    specials[`system.traits.${type}.midi.non-adamant-physical`] = [new StringField(), -1];\n    daeFieldBrowserFields.push(`system.traits.${type}.midi.non-adamant-physical`);\n    specials[`system.traits.${type}.midi.non-physical`] = [new StringField(), -1];\n    daeFieldBrowserFields.push(`system.traits.${type}.midi.non-physical`);\n    specials[`system.traits.${type}.midi.physical`] = [new StringField(), -1];\n    daeFieldBrowserFields.push(`system.traits.${type}.midi.physical`);\n    specials[`system.traits.${type}.midi.spell`] = [new StringField(), -1];\n    daeFieldBrowserFields.push(`system.traits.${type}.midi.spell`);\n    specials[`system.traits.${type}.midi.non-spell`] = [new StringField(), -1];\n    daeFieldBrowserFields.push(`system.traits.${type}.midi.non-spell`);\n    if (![\"dm\", \"da\"].includes(type)) allAttackTypes.forEach(attackType => {\n      specials[`system.traits.${type}.midi.${attackType}`] = [new StringField(), -1];\n      daeFieldBrowserFields.push(`system.traits.${type}.midi.${attackType}`);\n    });\n  }\n\n  if (GameSystemConfig.damageTypes) {\n    specials[`system.traits.dm.midi.all`] = [new StringField(), -1];\n    daeFieldBrowserFields.push(`system.traits.dm.midi.all`);\n    Object.keys(GameSystemConfig.damageTypes).forEach(dType => {\n      specials[`system.traits.dm.amount.${dType}`] = [new StringField(), -1]\n      daeFieldBrowserFields.push(`system.traits.dm.${dType}`);\n    });\n    Object.keys(GameSystemConfig.itemActionTypes).forEach(aType => {\n      specials[`system.traits.dm.midi.${aType}`] = [new StringField(), -1];\n      daeFieldBrowserFields.push(`system.traits.dm.midi.${aType}`);\n    });\n    Object.keys(GameSystemConfig.healingTypes).forEach(dType => {\n      specials[`system.traits.dm.amount.${dType}`] = [new StringField(), -1];\n      daeFieldBrowserFields.push(`system.traits.dm.midi.${dType}`);\n    });\n    specials[`system.traits.da.midi.all`] = [new StringField(), -1];\n    daeFieldBrowserFields.push(`system.traits.da.midi.all`);\n    Object.keys(GameSystemConfig.damageTypes).forEach(dType => {\n      specials[`system.traits.da.${dType}`] = [new StringField(), -1];\n      daeFieldBrowserFields.push(`system.traits.da.${dType}`);\n    });\n    Object.keys(GameSystemConfig.itemActionTypes).forEach(aType => {\n      specials[`system.traits.da.midi.${aType}`] = [new StringField(), -1];\n      daeFieldBrowserFields.push(`system.traits.da.midi.${aType}`);\n    });\n    Object.keys(GameSystemConfig.healingTypes).forEach(dType => {\n      specials[`system.traits.da.${dType}`] = [new StringField(), -1];\n      daeFieldBrowserFields[`system.traits.da.${dType}`] = [new StringField(), -1];\n    });\n  }\n\n  // specials[`system.traits.dm.midi.final`] = [new StringField(), -1];\n  specials[`system.traits.idi.value`] = [new StringField(), -1];\n  daeFieldBrowserFields.push(`system.traits.idi.value`);\n  specials[`system.traits.idr.value`] = [new StringField(), -1];\n  daeFieldBrowserFields.push(`system.traits.idr.value`);\n  specials[`system.traits.idv.value`] = [new StringField(), -1];\n  daeFieldBrowserFields.push(`system.traits.idv.value`);\n  specials[`system.traits.ida.value`] = [new StringField(), -1];\n  daeFieldBrowserFields.push(`system.traits.ida.value`);\n  specials[`system.traits.idm.value`] = [new StringField(), -1];\n  daeFieldBrowserFields.push(`system.traits.idm.value`);\n});\n\n//@ts-expect-error\nHooks.on(\"dae.modifyBaseValues\", (specKey: string, baseValues, _characterSpec) => {\n  baseValues[`flags.${MODULE_ID}.ActivityOverTime`] = [new StringField({ initial: \"\" }), -1];\n});\n//@ts-expect-error\nHooks.on(\"dae.addFieldMappings\", (fieldMappings) => {\n  GameSystemConfig = CONFIG.DND5E;\n  let allAttackTypes = [\"rwak\", \"mwak\", \"rsak\", \"msak\"];\n  registerSettings();\n  fetchParams();\n  for (let key of Object.keys(GameSystemConfig.damageTypes ?? {})) {\n    fieldMappings[`flags.${MODULE_ID}.DR.${key}`] = `system.traits.dm.amount.${key}`;\n  }\n  for (let key of Object.keys(GameSystemConfig.healingTypes ?? {})) {\n    fieldMappings[`flags.${MODULE_ID}.DR.${key}`] = `system.traits.dm.amount.${key}`;\n  }\n  fieldMappings[`flags.${MODULE_ID}.DR.all`] = \"system.traits.dm.midi.all\";\n\n  Object.keys(GameSystemConfig.itemActionTypes).forEach(aType => {\n    fieldMappings[`flags.${MODULE_ID}.DR.${aType}`] = `system.traits.dm.midi.${aType}`;\n  });\n  fieldMappings[`flags.${MODULE_ID}.DR.all`] = `system.traits.dm.midi.all`;\n  fieldMappings[`flags.${MODULE_ID}.DR.non-magical`] = `system.traits.dm.midi.non-magical`;\n  fieldMappings[`flags.${MODULE_ID}.DR.non-magical-physical`] = `system.traits.dm.midi.non-magical-physical`;\n  fieldMappings[`flags.${MODULE_ID}.DR.non-silver`] = `system.traits.dm.midi.non-silver-physical`;\n  fieldMappings[`flags.${MODULE_ID}.DR.non-adamant`] = `system.traits.dm.midi.non-adamant-physical`;\n  fieldMappings[`flags.${MODULE_ID}.DR.non-physical`] = `system.traits.dm.midi.non-physical`;\n  fieldMappings[`flags.${MODULE_ID}.DR.non-spell`] = `system.traits.dm.midi.non-spell`;\n  fieldMappings[`flags.${MODULE_ID}.DR.spell`] = `system.traits.dm.midi.spell`;\n\n  // fieldMappings[`flags.${MODULE_ID}.DR.final`] = `system.traits.dm.midi.final`;\n  fieldMappings[`flags.${MODULE_ID}.concentrationSaveBonus`] = \"system.attributes.concentration.bonuses.save\";\n  fieldMappings[`flags.${MODULE_ID}.fail.critical.all`] = `flags.${MODULE_ID}.grants.noCritical.all`;\n  for (let attackType of allAttackTypes) {\n    fieldMappings[`flags.${MODULE_ID}.fail.critical.${attackType}`] = `flags.${MODULE_ID}.grants.noCritical.${attackType}`;\n  }\n  let attackTypes = allAttackTypes.concat([\"save\", \"check\", \"skill\", \"tool\"])\n  attackTypes.forEach(attackType => {\n    fieldMappings[`flags.${MODULE_ID}.grants.fail.advantage.attack.${attackType}`] = `flags.${MODULE_ID}.grants.noAdvantage.attack.${attackType}`;\n    fieldMappings[`flags.${MODULE_ID}.grants.fail.disadvantage.attack.${attackType}`] = `flags.${MODULE_ID}.grants.noDisadvantage.attack.${attackType}`;\n  })\n  if (GameSystemConfig.skills) for (let skill of Object.keys(GameSystemConfig.skills)) {\n    fieldMappings[`flags.${MODULE_ID}.max.skill.${skill}`] = `system.skills.${skill}.roll.max`;\n    fieldMappings[`flags.${MODULE_ID}.min.skill.${skill}`] = `system.skills.${skill}.roll.min`;\n  }\n  fieldMappings[`flags.${MODULE_ID}.max.ability.save.concentration`] = `system.attributes.concentration.roll.max`;\n  fieldMappings[`flags.${MODULE_ID}.min.ability.save.concentration`] = `system.attributes.concentration.roll.min`;\n  fieldMappings[`flags.${MODULE_ID}.concentrationSaveBonus`] = `system.attributes.concentration.bonuses.save`;\n  fieldMappings[`flags.${MODULE_ID}.sharpShooter`] = `flags.dnd5e.sharpShooter`;\n  fieldMappings[`flags.${MODULE_ID}.grants.fail.advantage.attack.all`] = `flags.${MODULE_ID}.grants.noAdvantage.attack.all`;\n  fieldMappings[`flags.${MODULE_ID}.grants.fail.disadvantage.attack.all`] = `flags.${MODULE_ID}.grants.noDisadvantage.attack.all`;\n\n  if (debugEnabled > 0) warn(\"fieldMappings\", fieldMappings);\n\n});\n\nHooks.on(\"dae.addSpecialDurations\", daeSpecialDurations => {\n  daeSpecialDurations[\"1Action\"] = i18n(\"dae.1Action\");\n  daeSpecialDurations[\"Bonus Action\"] = i18n(\"dae.Bonus Action\");\n  daeSpecialDurations[\"Reaction\"] = i18n(\"dae.Reaction\");\n  daeSpecialDurations[\"Turn Action\"] = i18n(\"dae.Turn Action\");\n  daeSpecialDurations[\"1Spell\"] = i18n(\"dae.1Spell\");\n  daeSpecialDurations[\"1Attack\"] = i18nFormat(\"dae.1Attack\", { type: `${i18n(\"dae.spell\")}/${i18n(\"dae.weapon\")} ${i18n(\"dae.attack\")}` });\n  daeSpecialDurations[\"1Hit\"] = i18nFormat(\"dae.1Hit\", { type: `${i18n(\"dae.spell\")}/${i18n(\"dae.weapon\")}` });\n  daeSpecialDurations[\"1Critical\"] = i18n(\"dae.1Critical\");\n  daeSpecialDurations[\"1Fumble\"] = i18n(\"dae.1Fumble\");\n  //    daeSpecialDurations[\"1Hit\"] = i18n(\"dae.1Hit\");\n  daeSpecialDurations[\"1Reaction\"] = i18n(\"dae.1Reaction\")\n  let attackTypes = [\"mwak\", \"rwak\", \"msak\", \"rsak\"];\n  attackTypes.forEach(at => {\n    daeSpecialDurations[`1Attack:${at}`] = `${GameSystemConfig.itemActionTypes[at]}: ${i18nFormat(\"dae.1Attack\", { type: GameSystemConfig.itemActionTypes[at] })}`;\n    daeSpecialDurations[`1Hit:${at}`] = `${GameSystemConfig.itemActionTypes[at]}: ${i18nFormat(\"dae.1Hit\", { type: GameSystemConfig.itemActionTypes[at] })}`;\n  })\n  daeSpecialDurations[\"DamageDealt\"] = i18n(\"dae.DamageDealt\");\n  daeSpecialDurations[\"isAttacked\"] = i18n(\"dae.isAttacked\");\n  daeSpecialDurations[\"isDamaged\"] = i18n(\"dae.isDamaged\");\n  daeSpecialDurations[\"isHealed\"] = i18n(\"dae.isHealed\");\n  daeSpecialDurations[\"zeroHP\"] = i18n(\"dae.ZeroHP\");\n  daeSpecialDurations[\"isHit\"] = i18n(\"dae.isHit\");\n  daeSpecialDurations[\"isHitCritical\"] = i18n(\"dae.isHitCritical\");\n  daeSpecialDurations[\"isSave\"] = `${i18n(\"dae.isRollBase\")} ${i18n(\"dae.isSaveDetail\")}`;\n  daeSpecialDurations[\"isSaveSuccess\"] = `${i18n(\"dae.isRollBase\")} ${i18n(\"dae.isSaveDetail\")}: ${i18n(\"dae.success\")}`;\n  daeSpecialDurations[\"isSaveFailure\"] = `${i18n(\"dae.isRollBase\")} ${i18n(\"dae.isSaveDetail\")}: ${i18n(\"dae.failure\")}`;\n  daeSpecialDurations[\"isConcentrationSave\"] = i18n(\"dae.isConcentrationSave\");\n  daeSpecialDurations[\"isConcentrationSaveFail\"] = `${i18n(\"dae.isConcentrationSave\")}: ${i18n(\"dae.failure\")}`;\n  daeSpecialDurations[\"isConcentrationSaveSuccess\"] = `${i18n(\"dae.isConcentrationSave\")}: ${i18n(\"dae.success\")}`;\n  daeSpecialDurations[\"isCheck\"] = `${i18n(\"dae.isRollBase\")} ${i18n(\"dae.isCheckDetail\")}`;\n  daeSpecialDurations[\"isSkill\"] = `${i18n(\"dae.isRollBase\")} ${i18n(\"dae.isSkillDetail\")}`;\n  daeSpecialDurations[\"isInitiative\"] = `${i18n(\"dae.isRollBase\")} ${i18n(\"dae.isInitiativeDetail\")}`;\n\n  daeSpecialDurations[\"isMoved\"] = i18n(\"dae.isMoved\");\n  daeSpecialDurations[\"longRest\"] = i18n(\"DND5E.LongRest\");\n  daeSpecialDurations[\"shortRest\"] = i18n(\"DND5E.ShortRest\");\n  daeSpecialDurations[\"newDay\"] = `${i18n(\"DND5E.NewDay\")}`;\n  Object.keys(GameSystemConfig.abilities).forEach(abl => {\n    let ablString = GameSystemConfig.abilities[abl].label;\n    daeSpecialDurations[`isSave.${abl}`] = `${i18n(\"dae.isRollBase\")} ${ablString} ${i18n(\"dae.isSaveDetail\")}`;\n    daeSpecialDurations[`isSaveSuccess.${abl}`] = `${i18n(\"dae.isRollBase\")} ${ablString} ${i18n(\"dae.isSaveDetail\")}: ${i18n(\"dae.success\")}`;\n    daeSpecialDurations[`isSaveFailure.${abl}`] = `${i18n(\"dae.isRollBase\")} ${ablString} ${i18n(\"dae.isSaveDetail\")}: ${i18n(\"dae.failure\")}`;\n    daeSpecialDurations[`isCheck.${abl}`] = `${i18n(\"dae.isRollBase\")} ${ablString} ${i18n(\"dae.isCheckDetail\")}`;\n  });\n  Object.keys(GameSystemConfig.damageTypes).forEach(key => {\n    daeSpecialDurations[`isDamaged.${key}`] = `${i18n(\"dae.isDamaged\")}: ${GameSystemConfig.damageTypes[key].label}`;\n  });\n  daeSpecialDurations[`isDamaged.healing`] = `${i18n(\"dae.isDamaged\")}: ${GameSystemConfig.healingTypes[\"healing\"].label}`;\n  Object.keys(GameSystemConfig.skills).forEach(skillId => {\n    daeSpecialDurations[`isSkill.${skillId}`] = `${i18n(\"dae.isRollBase\")} ${i18n(\"dae.isSkillDetail\")} ${GameSystemConfig.skills[skillId].label}`;\n  });\n\n})\n\nlet daeFieldBrowserFields: Array<string> = [];\n\nHooks.on(\"dae.setFieldData\", fieldData => {\n  fieldData[\"MidiQOL\"] = Array.from(new Set(daeFieldBrowserFields)).sort();\n  log(\"setDaeFieldData | fieldData\", fieldData);\n});\n\n/* ------------------------------------ */\n/* Setup module\t\t\t\t\t\t\t*/\n/* ------------------------------------ */\nHooks.once('setup', function () {\n  // Do anything after initialization but before ready\n  setupModules();\n  setupSocket();\n  fetchParams();\n  fetchSoundSettings();\n  itemPatching();\n  visionPatching();\n  initGMActionSetup();\n  setupHooks();\n  MidiQOL.MQdefaultDamageType = i18n(\"midi-qol.defaultDamageType\");\n  MQItemMacroLabel = i18n(\"midi-qol.ItemMacroText\") ?? \"ItemMacro\";\n  MQActivityMacroLabel = i18n(\"midi-qol.ActivityMacroText\") ?? \"ActivityMacro\";\n  setupSheetQol();\n  createMidiMacros();\n  setupMidiQOLApi();\n});\n\nHooks.once(\"dae.setupComplete\", () => {\n  applyPendingLocalizations();\n});\n\nHooks.once(\"ready\", () => {\n  // can't hook off simple cover ready as it fires too early to be able to call api.setLibraryMode\n  // if (configSettings.optionalRules.coverCalculation === \"simplecover5e\" && game.modules.get(\"simplecover5e\")?.active) {\n  //   //@ts-expect-error\n  //   game.modules.get(\"simplecover5e\")?.api?.setLibraryMode(true);\n  // }\n})\n\nfunction addConfigOptions() {\n\n  let config = GameSystemConfig ?? {};\n  config.damageTypes[\"none\"] = { label: i18n(\"midi-qol.noType\"), icon: \"systems/dnd5e/icons/svg/trait-damage-immunities.svg\" };\n  config.damageTypes[\"midi-none\"] = { label: i18n(\"midi-qol.midi-none\"), icon: \"systems/dnd5e/icons/svg/trait-damage-immunities.svg\" };\n  // sliver, adamant, spell, nonmagic, magic are all deprecated and should only appear as custom\n  config.customDamageResistanceTypes = {\n    \"spell\": i18n(\"midi-qol.SpellDamage\"),\n    \"nonSpell\": i18n(\"midi-qol.NonSpellDamage\"),\n    \"magical\": i18n(\"midi-qol.Magical\"),\n    \"nonMagical\": i18n(\"midi-qol.NonMagical\"),\n    \"physical\": i18n(\"midi-qol.Physical\"),\n    \"nonMagicalPhysical\": i18n(\"midi-qol.NonMagicalPhysical\"),\n    \"nonSilverPhysical\": i18n(\"midi-qol.NonSilverPhysical\"),\n    \"nonAdamantPhysical\": i18n(\"midi-qol.NonAdamantinePhysical\"),\n  };\n\n  // config.damageResistanceTypes = config.damageResistanceTypes ?? {};\n  // config.damageResistanceTypes[\"silver\"] = i18n(\"midi-qol.NonSilverPhysical\");\n  // config.damageResistanceTypes[\"adamant\"] = i18n(\"midi-qol.NonAdamantinePhysical\");\n  // config.damageResistanceTypes[\"physical\"] = i18n(\"midi-qol.NonMagicalPhysical\");\n  // config.damageResistanceTypes[\"spell\"] = i18n(\"midi-qol.spell-damage\");\n  // config.damageResistanceTypes[\"nonmagic\"] = i18n(\"midi-qol.NonMagical\");\n  // config.damageResistanceTypes[\"magic\"] = i18n(\"midi-qol.Magical\");\n  // config.damageResistanceTypes[\"healing\"] = config.healingTypes?.healing?.label;\n  // config.damageResistanceTypes[\"temphp\"] = config.healingTypes?.temphp?.label;\n\n  config.traits.di.configKey = \"damageTypes\";\n  config.traits.dr.configKey = \"damageTypes\";\n  config.traits.dv.configKey = \"damageTypes\";\n  if (!config.traits.da && game.system?.id === \"dnd5e\") {\n    config.traits.da = {\n      labels: { title: \"Damage Absorption\", localization: \"midi-qol.DamageAbsorption\" },\n      icon: \"systems/dnd5e/icons/svg/damageresistances.svg\",\n      configKey: \"damageTypes\"\n    }\n  } else if (config.traits.da) {\n    config.traits.da.configKey = \"damageTypes\"\n  }\n  const dnd5eReaction = `DND5E.Reaction`;\n  // config.abilityActivationTypes[\"reactionpreattack\"] = `${i18n(dnd5eReaction)} ${i18n(\"midi-qol.reactionPreAttack\")}`;\n  // config.abilityActivationTypes[\"reactiondamage\"] = `${i18n(dnd5eReaction)} ${i18n(\"midi-qol.reactionDamaged\")}`;\n  // config.abilityActivationTypes[\"reactionmanual\"] = `${i18n(dnd5eReaction)} ${i18n(\"midi-qol.reactionManual\")}`;\n  globalThis.dnd5e.config.characterFlags[\"DamageBonusMacro\"] = {\n    type: String,\n    name: \"Damage Bonus Macro\",\n    hint: \"Macro to use for damage bonus\",\n    section: \"Midi QOL\"\n  };\n  globalThis.dnd5e.config.characterFlags[\"initiativeHalfProficiency\"] = {\n    type: Boolean,\n    name: \"Half Proficiency for Initiative\",\n    hint: \"add 1/2 proficiency to initiative\",\n    section: \"Midi QOL\"\n  };\n  globalThis.dnd5e.config.characterFlags[\"initiativeDisadv\"] = {\n    type: Boolean,\n    name: \"Disadvantage on Initiative\",\n    hint: \"Provided by fears or magical items\",\n    section: \"Midi QOL\"\n  };\n  globalThis.dnd5e.config.characterFlags[\"spellSniper\"] = {\n    type: Boolean,\n    name: \"Spell Sniper\",\n    hint: \"Provided by feats or magical items\",\n    section: \"Midi QOL\"\n  };\n\n  globalThis.dnd5e.config.characterFlags[\"sharpShooter\"] = {\n    type: Boolean,\n    name: \"Sharp Shooter\",\n    hint: \"Provided by feats or magical items\",\n    section: \"Midi QOL\"\n  };\n}\n/* ------------------------------------ */\n/* When ready\t\t\t\t\t\t\t*/\n/* ------------------------------------ */\nHooks.once('ready', function () {\n  cleanCPRFlanked();\n  addConfigOptions();\n  // allDamageTypes = {};\n  // allDamageTypes.none = foundry.utils.duplicate(GameSystemConfig.damageTypes[\"midi-none\"]);\n  // allDamageTypes.none.label = i18n(\"DND5E.None\");\n  // allDamageTypes[\"\"] = allDamageTypes.none\n  // allDamageTypes = foundry.utils.mergeObject(allDamageTypes, foundry.utils.mergeObject(GameSystemConfig.damageTypes, GameSystemConfig.healingTypes, { inplace: false }));\n  registerSettings();\n  actorAbilityRollPatching();\n  setupMidiStatusEffects();\n\n  MQOnUseOptions = {\n    \"preTargeting\": \"Called before targeting is resolved (*)\",\n    \"preItemRoll\": \"Called before the item is rolled (*)\",\n    \"templatePlaced\": \"Only called once a template is placed\",\n    \"preAttackRoll\": \"Before Attack Roll\",\n    \"preAttackRollConfig\": \"Before Attack Configuration\",\n    \"preCheckHits\": \"Before Check Hits\",\n    \"postAttackRoll\": \"After Attack Roll\",\n    \"preSave\": \"Before Save\",\n    \"postSave\": \"After Save\",\n    \"preDamageRoll\": \"Before Damage Roll\",\n    \"postDamageRoll\": \"After Damage Roll\",\n    \"damageBonus\": \"return a damage bonus\",\n    \"preDamageRollConfig\": \"Before Damage Configuration\",\n    \"preDamageApplication\": \"Before Damage Application\",\n    \"preActiveEffects\": \"Before Active Effects\",\n    \"postActiveEffects\": \"After Active Effects \",\n    \"isTargeted\": \"Target is targeted but before item is rolled\",\n    \"isPreAttacked\": \"Target is about to be attacked, before reactions\",\n    \"isAttacked\": \"Target is attacked\",\n    \"isHit\": \"Target is hit\",\n    \"preTargetSave\": \"Target is about to roll a saving throw\",\n    \"isSave\": \"Target rolled a save\",\n    \"isSaveSuccess\": \"Target rolled a successful save\",\n    \"isSaveFailure\": \"Target failed a saving throw\",\n    \"preTargetDamageApplication\": \"Target is about to be damaged by an item\",\n    \"postTargetEffectApplication\": \"Target has an effect applied by a rolled item\",\n    \"isDamaged\": \"Target is damaged by an attack\",\n    \"all\": \"All\"\n  }\n  for (let key of Object.keys(Workflow.stateTable)) {\n    const camelKey = `${key.charAt(0).toUpperCase()}${key.slice(1)}`;\n    if (MQOnUseOptions[`pre${camelKey}`] === undefined) {\n      MQOnUseOptions[`pre${camelKey}`] = `Before state ${camelKey}`;\n    } else error(`pre${camelKey} already exists`);\n    if (MQOnUseOptions[`post${camelKey}`] === undefined) {\n      MQOnUseOptions[`post${camelKey}`] = `After state ${camelKey}`;\n    } else error(`post${camelKey} already exists`);\n  }\n  OnUseMacroOptions.setOptions(MQOnUseOptions);\n  globalThis.MidiQOL.MQOnUseOptions = MQOnUseOptions;\n\n  MidiSounds.midiSoundsReadyHooks();\n\n  globalThis.dnd5e.config.areaTargetTypes[\"emanationNoTemplate\"] = {\n    label: i18n(\"midi-qol.emanationNoTemplate\"),\n    template: \"rect\",\n    standard: true,\n    counted: \"midi-qol.emanationTemplate.counted\"\n  };\n\n  if (game.user?.isGM && game.settings) {\n    const instanceId = game.settings.get(MODULE_ID, \"instanceId\") as string;\n    if ([undefined, \"\"].includes(instanceId)) {\n      game.settings.set(MODULE_ID, \"instanceId\", foundry.utils.randomID());\n    }\n    const oldVersion = game.settings.get(MODULE_ID, \"last-run-version\") as number | string;\n    const newVersion = game.modules.get(MODULE_ID)?.version;\n    if (foundry.utils.isNewerVersion(newVersion, oldVersion)) {\n      console.warn(`midi-qol | instance ${game.settings.get(MODULE_ID, \"instanceId\")} version change from ${oldVersion} to ${newVersion}`);\n      game.settings.set(MODULE_ID, \"last-run-version\", newVersion);\n      // look at sending a new version has been installed.\n    }\n    readySettingsSetup();\n  }\n  Hooks.callAll(\"midi-qol.ready\")\n\n  checkModules();\n  readyHooks();\n  readyPatching();\n  // injectMidiCompletions() moved to module load time (top-level) so the\n  // Hooks.on(\"macro-autocomplete.ready\") handler is registered before\n  // macro-autocomplete fires it during its own ready hook.\n\n  // @ts-expect-error no types for CE\n  ceInterface = game.modules.get(\"dfreds-convenient-effects\")?.api;\n\n  if (midiSoundSettingsBackup) game.settings.set(MODULE_ID, \"MidiSoundSettings-backup\", midiSoundSettingsBackup)\n\n  // Make midi-qol targets hoverable\n  // TODO: Does this work? Consider moving away from jquery\n  $(document).on(\"mouseover\", \".midi-qol-target-name\", (e) => {\n    const tokenId = e.currentTarget.id\n    const tokenObj = canvas.tokens?.get(tokenId)\n    if (!tokenObj) return;\n    tokenObj.hover = true\n  });\n\n  Hooks.callAll(\"midi-qol.midiReady\");\n  if (game.user?.isGM) { // need to improve the test\n    const problems = TroubleShooter.collectTroubleShooterData().problems\n    for (let problem of problems) {\n      const message = `midi-qol ${problem.problemSummary} | Open TroubleShooter to fix`;\n      if (problem.severity === \"Error\")\n        ui.notifications?.error(message, { permanent: false });\n      else console.warn(message);\n    }\n  }\n});\n\nimport { setupChatMessageMidi, ChatMessageMidi } from './module/ChatClasses/ChatMessageMidi.js';\nimport { MidiSaveActivity, setupSaveActivity } from './module/activities/SaveActivity.js';\nimport { MidiUtilityActivity, setupUtilityActivity } from './module/activities/UtilityActivity.js';\nimport { MidiSummonActivity, setupSummonActivity } from './module/activities/SummonActivity.js';\nimport { MidiDamageActivity, setupDamageActivity } from './module/activities/DamageActivity.js';\nimport { MidiCastActivity, setupCastActivity } from './module/activities/CastActivity.js';\nimport { MidiCheckActivity, setupCheckActivity } from './module/activities/CheckActivity.js';\nimport { MidiHealActivity, setupHealActivity } from './module/activities/HealActivity.js';\nimport { computeTargetsFromTemplates, resolveTargetConfirmation, selectTargetsFromTemplates, showItemInfo } from './module/activities/activityHelpers.js';\nimport { MidiActivityMixin, setupMidiActivityMixin } from './module/activities/MidiActivityMixin.js';\nimport { MidiForwardActivity, setupForwardActivity } from './module/activities/ForwardActivity.js';\nimport { MidiEnchantActivity, setupEnchantActivity } from './module/activities/EnchantActivity.js';\nimport { MidiTransformActivity, setupTransformActivity } from './module/activities/TransformActivity.js';\nimport { MidiCombat5e } from './module/MidiCombat5e.js';\nimport { MoveTokenOptions, TeleportTokenDestination, TokenOrDocument, SelectOptionValue } from './globals.js';\nimport { DamageApplicationElementMidi } from './module/ChatClasses/DamageApplicationElementMidi.js';\n\n// Add any additional hooks if necessary\n// Phase 2: setup hook — properties that depend on CONFIG, settings, i18n, or game state\nfunction setupMidiQOLApi() {\n\n  const detectionModes = CONFIG.Canvas.detectionModes;\n  const InvisibleDisadvantageVisionModes = Object.keys(detectionModes)\n    //@ts-expect-error I think imprecise is added by a module - TODO Check\n    .filter(dm => !detectionModes[dm].imprecise);\n\n  const humanoid = [\"human\", \"humanoid\", \"elven\", \"elf\", \"half-elf\", \"drow\", \"dwarf\", \"dwarven\", \"halfling\", \"gnome\", \"tiefling\", \"orc\", \"dragonborn\", \"half-orc\"];\n\n  Object.assign(globalThis.MidiQOL, {\n    checkRule,\n    collectSettingData,\n    computeTargetsFromTemplates,\n    configSettings: () => { return configSettings },\n    debouncedUpdate: throttledUpdate,\n    enableWorkflow,\n    exportSettingsToJSON,\n    fetchParams,\n    gameStats,\n    getCheckRollModeFor,\n    getSaveRollModeFor,\n    humanoid,\n    importSettingsFromJSON,\n    incapacitatedConditions: [\"incapacitated\", \"Convenient Effect: Incapacitated\", \"stunned\", \"Convenient Effect: Stunned\", \"paralyzed\", \"paralysis\", \"Convenient Effect: Paralyzed\", \"unconscious\", \"Convenient Effect: Unconscious\", \"dead\", \"Convenient Effect: Dead\", \"petrified\", \"Convenient Effect: Petrified\"],\n    InvisibleDisadvantageVisionModes,\n    midiFlags,\n    midiPropertiesOptions: {\n      triggeredActivityTargetOptions: Object.entries(triggeredActivityTargetOptions).map(([value, opt]) => {\n        return { value, label: i18n(opt) }\n      }),\n      triggeredActivityRollAsOptions: Object.entries(triggeredActivityRollAsOptions).map(([value, opt]) => {\n        return { value, label: i18n(opt) }\n      }),\n    },\n    MQOnUseOptions,\n    resetConfigSettingsToDefaults,\n    safeGetGameSetting,\n    selectTargetsFromTemplates,\n    shouldDisplaySaveDC,\n    showItemInfo: (item: Item.Implementation) => { return showItemInfo.bind(item)() },\n    socket: () => { return new SaferSocket(socketlibSocket) },\n    WallsBlockConditions: [\"burrow\"],\n  });\n\n  // Define getters that need live access to settings/game state\n  Object.defineProperties(globalThis.MidiQOL, {\n    currentConfigSettings: {\n      get() { return configSettings },\n      configurable: true,\n      enumerable: true,\n    },\n    midiSoundSettings: {\n      get() { return game.settings.get(\"midi-qol\", \"MidiSoundSettings\") },\n      configurable: true,\n      enumerable: true,\n    },\n    updatesCache: {\n      get() { return updatesCache },\n      configurable: true,\n      enumerable: true,\n    },\n  });\n\n  //@ts-expect-error\n  game.modules.get(\"midi-qol\").api = globalThis.MidiQOL;\n\n  globalThis.MidiDAEEval = {\n    testfunc,\n    canSee,\n    canSense,\n    canSenseModes,\n    checkIncapacitated,\n    checkDistance,\n    checkNearby,\n    checkActivityRange,\n    checkRule,\n    computeCoverBonus,\n    computeDistance,\n    getDistance,\n    contestedRoll,\n    displayDSNForRoll,\n    doConcentrationCheck,\n    chooseEffect,\n    findNearby,\n    findNearbyCount,\n    getTraitMult,\n    hasCondition,\n    hasUsedBonusAction,\n    hasUsedReaction,\n    humanoid,\n    isTargetable: isValidTarget,\n    raceOrType,\n    typeOrRace,\n    safeGetGameSetting,\n    setBonusActionUsed,\n    setReactionUsed,\n  }\n  globalThis.MidiQOL.actionQueue = new foundry.utils.Semaphore();\n  Hooks.callAll(\"midi-qol.setup\", globalThis.MidiQOL);\n}\n\nexport function testfunc(...args: any[]) {\n  console.warn(\"MidiQOL testfunc called \", ...args)\n}\n\nexport async function moveToken(tokenRef: TokenOrDocument | string, newCenter: { x: number, y: number, elevation?: number }, options?: MoveTokenOptions | boolean, legacyOptions?: MoveTokenOptions) {\n  // Backward compatibility: moveToken(token, center, animate: boolean, options?)\n  let resolvedOptions: MoveTokenOptions | undefined;\n  if (typeof options === \"boolean\") {\n    foundry.utils.logCompatibilityWarning(\"MidiQOL.moveToken: passing 'animate' as a boolean third argument is deprecated. Use options: { animate: false } or { teleport: true } instead.\", { since: \"13.0.56\", until: \"14.0.0\" });\n    resolvedOptions = { ...legacyOptions, teleport: !options ? true : (legacyOptions?.teleport ?? false) };\n  } else {\n    resolvedOptions = options;\n  }\n  const tokenUuid = getTokenDocument(tokenRef)?.uuid;\n  if (tokenUuid) return unTimedExecuteAsGM(\"moveToken\", { tokenUuid, newCenter, options: resolvedOptions });\n}\n\nexport async function moveTokenAwayFromPoint(targetRef: TokenOrDocument | string, distance: number, point: { x: number, y: number }, options?: MoveTokenOptions | boolean, legacyCheckCollision?: boolean, legacyOptions?: MoveTokenOptions) {\n  // Backward compatibility: moveTokenAwayFromPoint(target, distance, point, animate: boolean, checkCollision: boolean, options?)\n  let resolvedOptions: MoveTokenOptions | undefined;\n  if (typeof options === \"boolean\") {\n    foundry.utils.logCompatibilityWarning(\"MidiQOL.moveTokenAwayFromPoint: passing 'animate' and 'checkCollision' as positional arguments is deprecated. Use options: { animate, ignoreWalls, ignoreTokens } instead.\", { since: \"13.0.56\", until: \"14.0.0\" });\n    const animate = options;\n    const checkCollision = legacyCheckCollision ?? false;\n    resolvedOptions = {\n      ...legacyOptions,\n      animate: legacyOptions?.animate ?? animate,\n      teleport: !animate ? true : (legacyOptions?.teleport ?? false),\n      ignoreWalls: legacyOptions?.ignoreWalls ?? !checkCollision,\n      ignoreTokens: legacyOptions?.ignoreTokens ?? !checkCollision,\n    };\n  } else {\n    resolvedOptions = options;\n  }\n  const targetUuid = getTokenDocument(targetRef)?.uuid;\n  if (point && targetUuid && distance)\n    return unTimedExecuteAsGM(\"moveTokenAwayFromPoint\", { targetUuid, distance, point, options: resolvedOptions })\n}\n\nexport async function teleportToken(tokenRef: TokenOrDocument | string, destination: TeleportTokenDestination) {\n  const tokenUuid = getTokenDocument(tokenRef)?.uuid;\n  if (tokenUuid) return unTimedExecuteAsGM(\"teleportToken\", { tokenUuid, destination });\n}\n\nexport async function createEffects(data: { actorUuid: string, effects: ActiveEffect.CreateData[], options: { keepId: boolean } }) {\n  const { actorUuid, effects, options = { keepId: true } } = data;\n  if (!actorUuid) {\n    error(\"createEffects failed. Missing actorUuid\")\n    return false;\n  }\n  if (effects?.length)\n    return unTimedExecuteAsGM(\"createEffects\", { actorUuid, effects, options });\n  else {\n    error(\"createEffects failed with missing data, which should include {actorUuid, effects: [], options: {}} but got\", data);\n    return false;\n  }\n}\n\nexport async function removeEffects(data: { actorUuid: string, effects: string[] }) {  // data: {actorUuid, effects: [<effect.ids>]}\n  if (!data.actorUuid) {\n    error(\"createEffects failed. Missing actorUuid\")\n    return false;\n  };\n  if (!data.effects.length) {\n    error(\"removeEffects failed with missing data, which should include {actorUuid, effects: [<effectIDs>],} but got\", data)\n    return false;\n  }\n  const statusEffectIds = new Set(CONFIG.statusEffects.map((statusEffect) => statusEffect.id));\n\n  for (let i = 0; i < data.effects.length; i++) {\n    const statusId = data.effects[i];\n    if (statusEffectIds.has(statusId)) {\n      data.effects[i] = getStaticID(statusId);\n    }\n  }\n  return unTimedExecuteAsGM(\"removeEffects\", data);\n}\n\nexport async function updateEffects(data: { actorUuid: string, updates: ActiveEffect.UpdateData[] }) {\n  if (data.actorUuid && data.updates?.length)\n    return unTimedExecuteAsGM(\"updateEffects\", data);\n  else {\n    error(\"updateEffects failed missing data which should include {actorUuid, updates: []} but got\", data)\n    return false;\n  }\n}\n\nlet pendingLocalizations: {flagPath: string, templateKey: string, label: string | (() => string)}[] = [];\n\nfunction registerFlagLocalization(flagPath: string, templateKey: string, label: string | (() => string)) {\n  pendingLocalizations.push({flagPath, templateKey, label});\n}\n\nfunction applyPendingLocalizations() {\n  const lm = globalThis.DAE?.localizationMap;\n  if (!lm || !game.i18n) return;\n  for (const {flagPath, templateKey, label} of pendingLocalizations) {\n    const resolvedLabel = typeof label === \"function\" ? label() : label;\n    lm[flagPath] = {\n      name: i18nFormat(`midi-qol.flagTemplate.${templateKey}.name`, { label: resolvedLabel }),\n      description: i18nFormat(`midi-qol.flagTemplate.${templateKey}.description`, { label: resolvedLabel })\n    };\n  }\n  pendingLocalizations = [];\n}\n\nfunction setupMidiFlags() {\n  const booleanFormula = (flag: string) => midiFlags.push({ name: flag, type: daeBooleanFormulaField });\n  const untyped = (flag: string) => midiFlags.push({ name: flag });\n\n  booleanFormula(`flags.${MODULE_ID}.advantage.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.advantage.all`);\n  booleanFormula(`flags.${MODULE_ID}.disadvantage.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.disadvantage.all`);\n  // Global flags not generated by per-key loops\n  booleanFormula(`flags.${MODULE_ID}.fail.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.fail.all`);\n  booleanFormula(`flags.${MODULE_ID}.success.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.success.all`);\n  booleanFormula(`flags.${MODULE_ID}.neverTarget`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.neverTarget`);\n  untyped(`flags.${MODULE_ID}.grants.critical.range`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.critical.range`);\n  untyped(`flags.${MODULE_ID}.grants.criticalThreshold`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.criticalThreshold`);\n  booleanFormula(`flags.${MODULE_ID}.advantage.concentration`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.advantage.concentration`);\n  booleanFormula(`flags.${MODULE_ID}.disadvantage.concentration`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.disadvantage.concentration`);\n  booleanFormula(`flags.${MODULE_ID}.noAdvantage.concentration`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.noAdvantage.concentration`);\n  booleanFormula(`flags.${MODULE_ID}.noDisadvantage.concentration`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.noDisadvantage.concentration`);\n  booleanFormula(`flags.${MODULE_ID}.noAdvantage.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.noAdvantage.all`);\n  booleanFormula(`flags.${MODULE_ID}.noDisadvantage.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.noDisadvantage.all`);\n  booleanFormula(`flags.${MODULE_ID}.initiativeAdv`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.initiativeAdv`);\n  booleanFormula(`flags.${MODULE_ID}.initiativeDisadv`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.initiativeDisadv`);\n  booleanFormula(`flags.${MODULE_ID}.initiativeNoAdv`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.initiativeNoAdv`);\n  booleanFormula(`flags.${MODULE_ID}.initiativeNoDisadv`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.initiativeNoDisadv`);\n  booleanFormula(`flags.${MODULE_ID}.ignoreNearbyFoes`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.ignoreNearbyFoes`);\n  untyped(`flags.${MODULE_ID}.bloodsense`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.bloodsense`);\n  untyped(`flags.${MODULE_ID}.`);\n  untyped(`flags.${MODULE_ID}.concentrationSaveBonus`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.concentrationSaveBonus`);\n  booleanFormula(`flags.${MODULE_ID}.potentCantrip`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.potentCantrip`);\n  booleanFormula(`flags.${MODULE_ID}.sculptSpells`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.sculptSpells`);\n  booleanFormula(`flags.${MODULE_ID}.carefulSpells`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.carefulSpells`);\n  // magicResistance.all and magicVulnerability.all generated by abilities loop\n  // range.all, long.all, rangeOverride.attack.all generated by attack types loop\n  booleanFormula(`flags.${MODULE_ID}.magicResistance.save.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.magicResistance.save.all`);\n  booleanFormula(`flags.${MODULE_ID}.magicResistance.check.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.magicResistance.check.all`);\n  booleanFormula(`flags.${MODULE_ID}.magicResistance.skill.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.magicResistance.skill.all`);\n  const extendedAttackTypeLabels: Record<string, string> = { check: \"Ability Check\", skill: \"Skill Check\", tool: \"Tool Check\", all: \"All\" };\n  let attackTypes = allAttackTypes.concat([\"save\", \"check\", \"skill\", \"tool\", \"all\"])\n  attackTypes.forEach(at => {\n    booleanFormula(`flags.${MODULE_ID}.grants.noAdvantage.attack.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noAdvantage.attack.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.disadvantage.attack.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.disadvantage.attack.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noDisadvantage.attack.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noDisadvantage.attack.${at}`);\n    const label = () => (GameSystemConfig.itemActionTypes[at] ?? extendedAttackTypeLabels[at] ?? at).replace(/ Attack$/, \"\");\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noAdvantage.attack.${at}`, \"grants.noAdvantage.attack\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.disadvantage.attack.${at}`, \"grants.disadvantage.attack\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noDisadvantage.attack.${at}`, \"grants.noDisadvantage.attack\", label);\n  });\n  attackTypes = allAttackTypes.concat([\"heal\", \"other\", \"save\", \"util\", \"all\"])\n  attackTypes.forEach(at => {\n    untyped(`flags.${MODULE_ID}.range.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.range.${at}`);\n    untyped(`flags.${MODULE_ID}.long.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.long.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.advantage.attack.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.advantage.attack.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.disadvantage.attack.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.disadvantage.attack.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.noAdvantage.attack.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noAdvantage.attack.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.noDisadvantage.attack.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noDisadvantage.attack.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.fail.attack.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.fail.attack.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.success.attack.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.success.attack.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.critical.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.critical.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.noCritical.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noCritical.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.noFumble.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noFumble.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.fumble.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.fumble.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.advantage.attack.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.advantage.attack.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.critical.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.critical.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noCritical.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noCritical.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noFumble.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noFumble.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.fumble.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.fumble.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.fail.critical.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.fail.critical.${at}`);\n    untyped(`flags.${MODULE_ID}.grants.attack.bonus.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.attack.bonus.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.attack.success.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.attack.success.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.attack.fail.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.attack.fail.${at}`);\n    if (at !== \"heal\") untyped(`flags.${MODULE_ID}.DR.${at}`);\n    booleanFormula(`flags.${MODULE_ID}.advantage.damage.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.advantage.damage.${at}`);\n    untyped(`flags.${MODULE_ID}.max.damage.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.max.damage.${at}`);\n    untyped(`flags.${MODULE_ID}.min.damage.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.min.damage.${at}`);\n    untyped(`flags.${MODULE_ID}.grants.max.damage.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.max.damage.${at}`);\n    untyped(`flags.${MODULE_ID}.grants.min.damage.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.min.damage.${at}`);\n    untyped(`flags.${MODULE_ID}.grants.bonus.damage.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.bonus.damage.${at}`);\n    untyped(`flags.${MODULE_ID}.optional.NAME.attack.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.attack.${at}`);\n    untyped(`flags.${MODULE_ID}.optional.NAME.attack.fail.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.attack.fail.${at}`);\n    untyped(`flags.${MODULE_ID}.optional.NAME.damage.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.damage.${at}`);\n    untyped(`flags.${MODULE_ID}.rangeOverride.attack.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.rangeOverride.attack.${at}`);\n    const label = () => (GameSystemConfig.itemActionTypes[at] ?? extendedAttackTypeLabels[at] ?? at).replace(/ Attack$/, \"\");\n    registerFlagLocalization(`flags.${MODULE_ID}.range.${at}`, \"range\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.long.${at}`, \"long\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.advantage.attack.${at}`, \"advantage.attack\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.disadvantage.attack.${at}`, \"disadvantage.attack\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noAdvantage.attack.${at}`, \"noAdvantage.attack\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noDisadvantage.attack.${at}`, \"noDisadvantage.attack\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.fail.attack.${at}`, \"fail.attack\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.success.attack.${at}`, \"success.attack\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.critical.${at}`, \"critical\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noCritical.${at}`, \"noCritical\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noFumble.${at}`, \"noFumble\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.fumble.${at}`, \"fumble\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.advantage.attack.${at}`, \"grants.advantage.attack\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.critical.${at}`, \"grants.critical\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noCritical.${at}`, \"grants.noCritical\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noFumble.${at}`, \"grants.noFumble\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.fumble.${at}`, \"grants.fumble\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.fail.critical.${at}`, \"fail.critical\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.attack.bonus.${at}`, \"grants.attack.bonus\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.attack.success.${at}`, \"grants.attack.success\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.attack.fail.${at}`, \"grants.attack.fail\", label);\n    if (at !== \"heal\") registerFlagLocalization(`flags.${MODULE_ID}.DR.${at}`, \"DR.attackType\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.advantage.damage.${at}`, \"advantage.damage\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.max.damage.${at}`, \"max.damage\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.min.damage.${at}`, \"min.damage\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.max.damage.${at}`, \"grants.max.damage\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.min.damage.${at}`, \"grants.min.damage\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.bonus.damage.${at}`, \"grants.bonus.damage\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.optional.NAME.attack.${at}`, \"optional.NAME.attack\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.optional.NAME.attack.fail.${at}`, \"optional.NAME.attack.fail\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.optional.NAME.damage.${at}`, \"optional.NAME.damage\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.rangeOverride.attack.${at}`, \"rangeOverride.attack\", label);\n  });\n  // Ability-scope flags not generated by per-ability loop\n  // (advantage.save.all, advantage.check.all, etc. now generated by abilities loop with \"all\" key)\n  booleanFormula(`flags.${MODULE_ID}.advantage.ability.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.advantage.ability.all`);\n  booleanFormula(`flags.${MODULE_ID}.disadvantage.ability.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.disadvantage.ability.all`);\n  booleanFormula(`flags.${MODULE_ID}.fail.ability.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.fail.ability.all`);\n  booleanFormula(`flags.${MODULE_ID}.success.ability.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.success.ability.all`);\n  untyped(`flags.${MODULE_ID}.max.ability.save.concentration`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.max.ability.save.concentration`);\n  untyped(`flags.${MODULE_ID}.min.ability.save.concentration`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.min.ability.save.concentration`);\n  booleanFormula(`flags.${MODULE_ID}.sharpShooter`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.sharpShooter`);\n\n  untyped(`flags.${MODULE_ID}.rollModifiers.damage.all.all`);\n  Object.keys(GameSystemConfig.damageTypes).forEach(dt => {\n    untyped(`flags.${MODULE_ID}.rollModifiers.damage.all.${dt}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.rollModifiers.damage.all.${dt}`);\n  })\n  untyped(`flags.${MODULE_ID}.rollModifiers.attack.all`);\n\n  attackTypes.forEach(at => {\n    untyped(`flags.${MODULE_ID}.rollModifiers.attack.${at}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.rollModifiers.attack.${at}`);\n    untyped(`flags.${MODULE_ID}.rollModifiers.damage.${at}.all`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.rollModifiers.damage.${at}.all`);\n    Object.keys(GameSystemConfig.damageTypes).forEach(dt => {\n      untyped(`flags.${MODULE_ID}.rollModifiers.damage.${at}.${dt}`);\n      daeFieldBrowserFields.push(`flags.${MODULE_ID}.rollModifiers.damage.${at}.${dt}`);\n    })\n  });\n  [\"weapon\", \"spell\", \"tool\", \"feat\"].forEach(it => {\n    untyped(`flags.${MODULE_ID}.rollModifiers.attack.${it}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.rollModifiers.attack.${it}`);\n    untyped(`flags.${MODULE_ID}.rollModifiers.damage.${it}.all`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.rollModifiers.damage.${it}.all`);\n    Object.keys(GameSystemConfig.damageTypes).forEach(dt => {\n      untyped(`flags.${MODULE_ID}.rollModifiers.damage.${it}.${dt}`);\n      daeFieldBrowserFields.push(`flags.${MODULE_ID}.rollModifiers.damage.${it}.${dt}`);\n    })\n  })\n  untyped(`flags.${MODULE_ID}.actions.reactionsMax`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.actions.reactionsMax`);\n  untyped(`flags.${MODULE_ID}.actions.reactionsReset`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.actions.reactionsReset`);\n  untyped(`flags.${MODULE_ID}.actions.bonusActionsMax`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.actions.bonusActionsMax`);\n  untyped(`flags.${MODULE_ID}.actions.bonusActionsReset`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.actions.bonusActionsReset`);\n  // nbs(`flags.${MODULE_ID}.actions.reactionUsed`);\n  // daeFieldBrowserFields.push(`flags.${MODULE_ID}.actions.reactionUsed`);\n\n  Object.keys(GameSystemConfig.abilities).concat([\"all\"]).forEach(abl => {\n    // New consistent flag names (without .ability. prefix - matches attack/skill/tool pattern)\n    booleanFormula(`flags.${MODULE_ID}.advantage.check.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.advantage.check.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.disadvantage.check.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.disadvantage.check.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.advantage.save.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.advantage.save.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.disadvantage.save.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.disadvantage.save.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.noAdvantage.check.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noAdvantage.check.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.noAdvantage.save.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noAdvantage.save.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.noDisadvantage.check.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noDisadvantage.check.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.noDisadvantage.save.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noDisadvantage.save.${abl}`);\n    // bs(`flags.${MODULE_ID}.advantage.attack.${abl}`);\n    // daeFieldBrowserFields.push(`flags.${MODULE_ID}.advantage.attack.${abl}`);\n    // bs(`flags.${MODULE_ID}.disadvantage.attack.${abl}`);\n    // daeFieldBrowserFields.push(`flags.${MODULE_ID}.disadvantage.attack.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.fail.ability.check.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.fail.ability.check.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.fail.ability.save.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.fail.ability.save.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.success.ability.check.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.success.ability.check.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.success.ability.save.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.success.ability.save.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.superSaver.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.superSaver.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.semiSuperSaver.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.semiSuperSaver.${abl}`);\n    untyped(`flags.${MODULE_ID}.max.ability.save.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.max.ability.save.${abl}`);\n    untyped(`flags.${MODULE_ID}.min.ability.save.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.min.ability.save.${abl}`);\n    untyped(`flags.${MODULE_ID}.max.ability.check.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.max.ability.check.${abl}`);\n    untyped(`flags.${MODULE_ID}.min.ability.check.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.min.ability.check.${abl}`);\n    untyped(`flags.${MODULE_ID}.optional.NAME.save.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.save.${abl}`);\n    untyped(`flags.${MODULE_ID}.optional.NAME.save.fail.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.save.fail.${abl}`);\n    untyped(`flags.${MODULE_ID}.optional.NAME.check.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.check.${abl}`);\n    untyped(`flags.${MODULE_ID}.optional.NAME.check.fail.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.check.fail.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.magicResistance.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.magicResistance.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.magicVulnerability.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.magicVulnerability.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.advantage.save.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.advantage.save.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.advantage.check.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.advantage.check.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.advantage.skill.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.advantage.skill.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.disadvantage.save.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.disadvantage.save.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.disadvantage.check.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.disadvantage.check.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.disadvantage.skill.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.disadvantage.skill.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noAdvantage.save.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noAdvantage.save.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noDisadvantage.save.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noDisadvantage.save.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noAdvantage.check.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noAdvantage.check.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noDisadvantage.check.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noDisadvantage.check.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noAdvantage.skill.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noAdvantage.skill.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noDisadvantage.skill.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noDisadvantage.skill.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.advantage.skill.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.advantage.skill.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.disadvantage.skill.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.disadvantage.skill.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.noAdvantage.skill.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noAdvantage.skill.${abl}`);\n    booleanFormula(`flags.${MODULE_ID}.noDisadvantage.skill.${abl}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noDisadvantage.skill.${abl}`);\n    const label = () => GameSystemConfig.abilities[abl]?.label ?? (abl === \"all\" ? \"All\" : abl);\n    registerFlagLocalization(`flags.${MODULE_ID}.advantage.check.${abl}`, \"advantage.check\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.disadvantage.check.${abl}`, \"disadvantage.check\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.advantage.save.${abl}`, \"advantage.save\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.disadvantage.save.${abl}`, \"disadvantage.save\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noAdvantage.check.${abl}`, \"noAdvantage.check\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noAdvantage.save.${abl}`, \"noAdvantage.save\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noDisadvantage.check.${abl}`, \"noDisadvantage.check\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noDisadvantage.save.${abl}`, \"noDisadvantage.save\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.fail.ability.check.${abl}`, \"fail.ability.check\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.fail.ability.save.${abl}`, \"fail.ability.save\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.success.ability.check.${abl}`, \"success.ability.check\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.success.ability.save.${abl}`, \"success.ability.save\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.superSaver.${abl}`, \"superSaver\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.semiSuperSaver.${abl}`, \"semiSuperSaver\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.max.ability.save.${abl}`, \"max.ability.save\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.min.ability.save.${abl}`, \"min.ability.save\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.max.ability.check.${abl}`, \"max.ability.check\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.min.ability.check.${abl}`, \"min.ability.check\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.optional.NAME.save.${abl}`, \"optional.NAME.save\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.optional.NAME.save.fail.${abl}`, \"optional.NAME.save.fail\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.optional.NAME.check.${abl}`, \"optional.NAME.check\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.optional.NAME.check.fail.${abl}`, \"optional.NAME.check.fail\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.magicResistance.${abl}`, \"magicResistance\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.magicVulnerability.${abl}`, \"magicVulnerability\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.advantage.save.${abl}`, \"grants.advantage.save\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.advantage.check.${abl}`, \"grants.advantage.check\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.advantage.skill.${abl}`, \"grants.advantage.abilitySkill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.disadvantage.save.${abl}`, \"grants.disadvantage.save\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.disadvantage.check.${abl}`, \"grants.disadvantage.check\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.disadvantage.skill.${abl}`, \"grants.disadvantage.abilitySkill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noAdvantage.save.${abl}`, \"grants.noAdvantage.save\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noDisadvantage.save.${abl}`, \"grants.noDisadvantage.save\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noAdvantage.check.${abl}`, \"grants.noAdvantage.check\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noDisadvantage.check.${abl}`, \"grants.noDisadvantage.check\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noAdvantage.skill.${abl}`, \"grants.noAdvantage.abilitySkill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noDisadvantage.skill.${abl}`, \"grants.noDisadvantage.abilitySkill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.advantage.skill.${abl}`, \"advantage.abilitySkill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.disadvantage.skill.${abl}`, \"disadvantage.abilitySkill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noAdvantage.skill.${abl}`, \"noAdvantage.abilitySkill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noDisadvantage.skill.${abl}`, \"noDisadvantage.abilitySkill\", label);\n  })\n\n  // Spell school save advantage/disadvantage flags\n  Object.keys(GameSystemConfig.spellSchools).forEach(school => {\n    booleanFormula(`flags.${MODULE_ID}.advantage.save.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.advantage.save.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.disadvantage.save.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.disadvantage.save.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.noAdvantage.save.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noAdvantage.save.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.noDisadvantage.save.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noDisadvantage.save.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.fail.save.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.fail.save.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.success.save.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.success.save.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.advantage.save.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.advantage.save.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.disadvantage.save.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.disadvantage.save.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noAdvantage.save.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noAdvantage.save.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noDisadvantage.save.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noDisadvantage.save.school.${school}`);\n    const label = () => GameSystemConfig.spellSchools[school]?.label ?? school;\n    registerFlagLocalization(`flags.${MODULE_ID}.advantage.save.school.${school}`, \"advantage.save.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.disadvantage.save.school.${school}`, \"disadvantage.save.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noAdvantage.save.school.${school}`, \"noAdvantage.save.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noDisadvantage.save.school.${school}`, \"noDisadvantage.save.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.fail.save.school.${school}`, \"fail.save.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.success.save.school.${school}`, \"success.save.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.advantage.save.school.${school}`, \"grants.advantage.save.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.disadvantage.save.school.${school}`, \"grants.disadvantage.save.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noAdvantage.save.school.${school}`, \"grants.noAdvantage.save.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noDisadvantage.save.school.${school}`, \"grants.noDisadvantage.save.school\", label);\n\n    // Attack advantage/disadvantage per spell school\n    booleanFormula(`flags.${MODULE_ID}.advantage.attack.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.advantage.attack.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.disadvantage.attack.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.disadvantage.attack.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.noAdvantage.attack.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noAdvantage.attack.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.noDisadvantage.attack.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noDisadvantage.attack.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.advantage.attack.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.advantage.attack.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.disadvantage.attack.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.disadvantage.attack.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noAdvantage.attack.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noAdvantage.attack.school.${school}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noDisadvantage.attack.school.${school}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noDisadvantage.attack.school.${school}`);\n    registerFlagLocalization(`flags.${MODULE_ID}.advantage.attack.school.${school}`, \"advantage.attack.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.disadvantage.attack.school.${school}`, \"disadvantage.attack.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noAdvantage.attack.school.${school}`, \"noAdvantage.attack.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noDisadvantage.attack.school.${school}`, \"noDisadvantage.attack.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.advantage.attack.school.${school}`, \"grants.advantage.attack.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.disadvantage.attack.school.${school}`, \"grants.disadvantage.attack.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noAdvantage.attack.school.${school}`, \"grants.noAdvantage.attack.school\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noDisadvantage.attack.school.${school}`, \"grants.noDisadvantage.attack.school\", label);\n  })\n\n  // advantage/disadvantage/fail/success.skill.all generated by skills loop with \"all\" key\n  // max/min.skill.all kept here since per-skill max/min is replaced by core\n  untyped(`flags.${MODULE_ID}.max.skill.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.max.skill.all`);\n  untyped(`flags.${MODULE_ID}.min.skill.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.min.skill.all`);\n  Object.keys(GameSystemConfig.skills).concat([\"all\"]).forEach(skill => {\n    booleanFormula(`flags.${MODULE_ID}.advantage.skill.${skill}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.advantage.skill.${skill}`);\n    booleanFormula(`flags.${MODULE_ID}.disadvantage.skill.${skill}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.disadvantage.skill.${skill}`);\n    booleanFormula(`flags.${MODULE_ID}.noAdvantage.skill.${skill}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noAdvantage.skill.${skill}`);\n    booleanFormula(`flags.${MODULE_ID}.noDisadvantage.skill.${skill}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noDisadvantage.skill.${skill}`);\n    booleanFormula(`flags.${MODULE_ID}.fail.skill.${skill}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.fail.skill.${skill}`);\n    booleanFormula(`flags.${MODULE_ID}.success.skill.${skill}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.success.skill.${skill}`);\n    // bs(`flags.${MODULE_ID}.max.skill.${skill}`); replaced by core\n    // bs(`flags.${MODULE_ID}.min.skill.${skill}`); replaced by core\n    untyped(`flags.${MODULE_ID}.optional.NAME.skill.${skill}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.skill.${skill}`);\n    // Per-skill grants flags\n    booleanFormula(`flags.${MODULE_ID}.grants.advantage.skill.${skill}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.advantage.skill.${skill}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.disadvantage.skill.${skill}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.disadvantage.skill.${skill}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noAdvantage.skill.${skill}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noAdvantage.skill.${skill}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noDisadvantage.skill.${skill}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noDisadvantage.skill.${skill}`);\n    const label = () => GameSystemConfig.skills[skill]?.label ?? (skill === \"all\" ? \"All\" : skill);\n    registerFlagLocalization(`flags.${MODULE_ID}.advantage.skill.${skill}`, \"advantage.skill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.disadvantage.skill.${skill}`, \"disadvantage.skill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noAdvantage.skill.${skill}`, \"noAdvantage.skill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noDisadvantage.skill.${skill}`, \"noDisadvantage.skill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.fail.skill.${skill}`, \"fail.skill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.success.skill.${skill}`, \"success.skill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.optional.NAME.skill.${skill}`, \"optional.NAME.skill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.advantage.skill.${skill}`, \"grants.advantage.skill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.disadvantage.skill.${skill}`, \"grants.disadvantage.skill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noAdvantage.skill.${skill}`, \"grants.noAdvantage.skill\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noDisadvantage.skill.${skill}`, \"grants.noDisadvantage.skill\", label);\n  })\n  booleanFormula(`flags.${MODULE_ID}.advantage.deathSave`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.advantage.deathSave`);\n  booleanFormula(`flags.${MODULE_ID}.disadvantage.deathSave`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.disadvantage.deathSave`);\n  booleanFormula(`flags.${MODULE_ID}.noAdvantage.deathSave`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.noAdvantage.deathSave`);\n  booleanFormula(`flags.${MODULE_ID}.noDisadvantage.deathSave`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.noDisadvantage.deathSave`);\n  untyped(`flags.${MODULE_ID}.deathSaveBonus`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.deathSaveBonus`);\n  booleanFormula(`flags.${MODULE_ID}.fail.deathSave`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.fail.deathSave`);\n  booleanFormula(`flags.${MODULE_ID}.success.deathSave`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.success.deathSave`);\n  // All tool .all entries generated by tools loop with \"all\" key\n  Object.keys(GameSystemConfig.tools).concat([\"all\"]).forEach(tool => {\n    booleanFormula(`flags.${MODULE_ID}.advantage.tool.${tool}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.advantage.tool.${tool}`);\n    booleanFormula(`flags.${MODULE_ID}.disadvantage.tool.${tool}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.disadvantage.tool.${tool}`);\n    booleanFormula(`flags.${MODULE_ID}.noAdvantage.tool.${tool}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noAdvantage.tool.${tool}`);\n    booleanFormula(`flags.${MODULE_ID}.noDisadvantage.tool.${tool}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.noDisadvantage.tool.${tool}`);\n    booleanFormula(`flags.${MODULE_ID}.fail.tool.${tool}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.fail.tool.${tool}`);\n    booleanFormula(`flags.${MODULE_ID}.success.tool.${tool}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.success.tool.${tool}`);\n    untyped(`flags.${MODULE_ID}.max.tool.${tool}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.max.tool.${tool}`);\n    untyped(`flags.${MODULE_ID}.min.tool.${tool}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.min.tool.${tool}`);\n    // Per-tool grants flags\n    booleanFormula(`flags.${MODULE_ID}.grants.advantage.tool.${tool}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.advantage.tool.${tool}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.disadvantage.tool.${tool}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.disadvantage.tool.${tool}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noAdvantage.tool.${tool}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noAdvantage.tool.${tool}`);\n    booleanFormula(`flags.${MODULE_ID}.grants.noDisadvantage.tool.${tool}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.grants.noDisadvantage.tool.${tool}`);\n    const label = () => tool === \"all\" ? \"All\" : ((globalThis.dnd5e?.documents.Trait.keyLabel(`tool:${tool}`) as string) ?? tool);\n    registerFlagLocalization(`flags.${MODULE_ID}.advantage.tool.${tool}`, \"advantage.tool\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.disadvantage.tool.${tool}`, \"disadvantage.tool\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noAdvantage.tool.${tool}`, \"noAdvantage.tool\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.noDisadvantage.tool.${tool}`, \"noDisadvantage.tool\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.fail.tool.${tool}`, \"fail.tool\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.success.tool.${tool}`, \"success.tool\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.max.tool.${tool}`, \"max.tool\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.min.tool.${tool}`, \"min.tool\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.advantage.tool.${tool}`, \"grants.advantage.tool\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.disadvantage.tool.${tool}`, \"grants.disadvantage.tool\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noAdvantage.tool.${tool}`, \"grants.noAdvantage.tool\", label);\n    registerFlagLocalization(`flags.${MODULE_ID}.grants.noDisadvantage.tool.${tool}`, \"grants.noDisadvantage.tool\", label);\n  });\n  // fix for translations\n  [\"vocal\", \"somatic\", \"material\"].forEach(comp => {\n    booleanFormula(`flags.${MODULE_ID}.fail.spell.${comp.toLowerCase()}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.fail.spell.${comp.toLowerCase()}`);\n  });\n  untyped(`flags.${MODULE_ID}.DR.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.DR.all`);\n\n  untyped(`flags.${MODULE_ID}.DR.non-magical`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.DR.non-magical`);\n  untyped(`flags.${MODULE_ID}.DR.non-magical-physical`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.DR.non-magical-physical`);\n  untyped(`flags.${MODULE_ID}.DR.non-silver`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.DR.non-silver`);\n  untyped(`flags.${MODULE_ID}.DR.non-adamant`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.DR.non-adamant`);\n  untyped(`flags.${MODULE_ID}.DR.non-physical`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.DR.non-physical`);\n  untyped(`flags.${MODULE_ID}.DR.final`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.DR.final`);\n  untyped(`flags.${MODULE_ID}.damage.reroll-kh`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.damage.reroll-kh`);\n  untyped(`flags.${MODULE_ID}.damage.reroll-kl`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.damage.reroll-kl`);\n\n  Object.keys(GameSystemConfig.damageTypes).forEach(key => {\n    untyped(`flags.${MODULE_ID}.DR.${key}`);\n    daeFieldBrowserFields.push(`flags.${MODULE_ID}.DR.${key}`);\n    const label = () => GameSystemConfig.damageTypes[key]?.label ?? key;\n    registerFlagLocalization(`flags.${MODULE_ID}.DR.${key}`, \"DR.damageType\", label);\n  });\n\n  untyped(`flags.${MODULE_ID}.DR.healing`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.DR.healing`);\n  untyped(`flags.${MODULE_ID}.DR.temphp`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.DR.temphp`);\n\n  // optional.NAME.attack/damage/check/save/skill.all generated by attack types/abilities/skills loops\n  untyped(`flags.${MODULE_ID}.optional.NAME.displayBonusRolls`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.displayChatCard`);\n  untyped(`flags.${MODULE_ID}.optional.NAME.label`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.label`);\n  untyped(`flags.${MODULE_ID}.optional.NAME.skill.fail.all`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.skill.fail.all`);\n  untyped(`flags.${MODULE_ID}.optional.NAME.count`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.count`);\n  untyped(`flags.${MODULE_ID}.optional.NAME.countAlt`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.countAlt`);\n  untyped(`flags.${MODULE_ID}.optional.NAME.ac`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.ac`);\n  untyped(`flags.${MODULE_ID}.optional.NAME.criticalDamage`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.criticalDamage`);\n  untyped(`flags.${MODULE_ID}.optional.NAME.activation`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.activation`);\n  untyped(`flags.${MODULE_ID}.optional.NAME.force`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.optional.NAME.force`);\n\n  booleanFormula(`flags.${MODULE_ID}.uncanny-dodge`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.uncanny-dodge`);\n  untyped(`flags.${MODULE_ID}.OverTime`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.OverTime`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.ActivityOverTime`);\n  booleanFormula(`flags.${MODULE_ID}.inMotion`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.inMotion`);\n  booleanFormula(`flags.${MODULE_ID}.fail.disadvantage.heavy`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.fail.disadvantage.heavy`);\n  booleanFormula(`flags.${MODULE_ID}.canFlank`);\n  daeFieldBrowserFields.push(`flags.${MODULE_ID}.canFlank`);\n  /*\n  bs(`flags.${MODULE_ID}.grants.advantage.attack.all`);\n  bs(`flags.${MODULE_ID}.grants.disadvantage.attack.all`);\n  bs(``);\n\n  bs(``);\n  bs(``);\n  */\n}\n\nfunction setupMidiFlagEditors(DAEapi: any) {\n  // Register pluggable OverTime editor with DAE's field editor API\n  if (DAEapi.registerFieldEditor) {\n    DAEapi.registerFieldEditor({\n      keyMatch: `flags.${MODULE_ID}.OverTime`,\n      editor: async (currentValue: string, context: any) => {\n        return new Promise<string | null>((resolve) => {\n          new OverTimeEditor({\n            value: currentValue,\n            effect: context.effect,\n            parent: context.parent,\n            onSubmit: (newValue: string) => resolve(newValue),\n            onCancel: () => resolve(null),\n          }).render({ force: true });\n        });\n      },\n      icon: \"fas fa-clock\",\n      tooltip: i18n(\"midi-qol.OverTimeEditor.Tooltip\"),\n    });\n\n    // Register condition expression editor for midi-qol condition flags\n    // Only available when macro-autocomplete is active (provides CodeMirror autocompletion)\n    const macroAutoComplete = (game as Game).modules?.get(\"macro-autocomplete\");\n    if (macroAutoComplete?.active) {\n      const conditionFlagPrefixes = [\n        `flags.${MODULE_ID}.advantage.`,\n        `flags.${MODULE_ID}.disadvantage.`,\n        `flags.${MODULE_ID}.noAdvantage.`,\n        `flags.${MODULE_ID}.noDisadvantage.`,\n        `flags.${MODULE_ID}.grants.advantage.`,\n        `flags.${MODULE_ID}.grants.disadvantage.`,\n        `flags.${MODULE_ID}.grants.noAdvantage.`,\n        `flags.${MODULE_ID}.grants.noDisadvantage.`,\n        `flags.${MODULE_ID}.fail.`,\n        `flags.${MODULE_ID}.success.`,\n        `flags.${MODULE_ID}.max.`,\n        `flags.${MODULE_ID}.min.`,\n        `flags.${MODULE_ID}.optional.`,\n      ];\n      for (const prefix of conditionFlagPrefixes) {\n        DAEapi.registerFieldEditor({\n          keyMatch: prefix,\n          editor: async (currentValue: string, context: any) => {\n            return new Promise<string | null>((resolve) => {\n              new ConditionEditor({\n                value: currentValue,\n                key: context.key,\n                effect: context.effect,\n                parent: context.parent,\n                onSubmit: (newValue: string) => resolve(newValue),\n                onCancel: () => resolve(null),\n              }).render({ force: true });\n            });\n          },\n          icon: \"fas fa-code\",\n          tooltip: i18n(\"midi-qol.ConditionEditor.Tooltip\"),\n        });\n      }\n    }\n  }\n}\n\n// Revisit to find out how to set execute as GM\nconst MQMacros = [\n  {\n    name: \"MidiQOL.showTroubleShooter\",\n    checkVersion: true,\n    version: \"11.0.9\",\n    permission: { default: 1 },\n    commandText: `\n    new MidiQOL.TroubleShooter().render(true)`\n  },\n  {\n    name: \"MidiQOL.exportTroubleShooterData\",\n    checkVersion: true,\n    version: \"11.0.9.1\",\n    permission: { default: 1 },\n    commandText: `MidiQOL.TroubleShooter.exportTroubleShooterData()`\n  },\n  {\n    name: \"MidiQOL.GMShowPlayerDamageCards\",\n    checkVersion: true,\n    version: \"11.4.10\",\n    commandText: `\n    const matches = document.querySelectorAll(\".midi-qol-player-damage-card\");\n    matches.forEach(element => {\n      let target = element.parentElement.parentElement.parentElement;\n      target.style.display = \"inherit\";\n    })`\n  }\n]\n\n// TODO: Examine what's needed here\nexport async function createMidiMacros() {\n  const midiVersion = \"11.0.9\"\n  if (game.user?.isGM) {\n    for (let macroSpec of MQMacros) {\n      try {\n        let existingMacros = game.macros?.filter(m => m.name === macroSpec.name) ?? [];\n        if (existingMacros.length > 0) {\n          for (let macro of existingMacros) {\n            if (macroSpec.checkVersion\n              && !foundry.utils.isNewerVersion(macroSpec.version, (macro.flags[\"midi-version\"] ?? \"0.0.0\")))\n              continue; // already up to date\n            //@ts-expect-error\n            await macro.update({ command: macroSpec.commandText, \"flags.midi-version\": macroSpec.version }, {} as never);\n          }\n        } else {\n          const macroData = {\n            _id: null,\n            name: macroSpec.name,\n            type: \"script\",\n            author: game.user?.id,\n            img: 'icons/svg/dice-target.svg',\n            scope: 'global',\n            command: macroSpec.commandText,\n            folder: null,\n            sort: 0,\n            permission: {\n              default: 1,\n            },\n            flags: { \"midi-version\": macroSpec.version ?? \"midiVersion\" }\n          };\n          // @ts-expect-error createDocuments bug\n          await Macro.createDocuments([macroData]);\n          log(`Macro ${macroData.name} created`);\n        }\n      } catch (err) {\n        const message = `createMidiMacros | failed to create macro ${macroSpec.name}`\n        TroubleShooter.recordError(err, message);\n        error(err, message);\n      }\n    }\n  }\n}\n\nexport function setupMidiStatusEffects() {\n  // @ts-expect-error no dnd5e-types\n  systemConcentrationId = CONFIG.specialStatusEffects.CONCENTRATING;\n  if (!CONFIG.statusEffects.find(e => e.id === systemConcentrationId)) {\n    // @ts-expect-error not expecting special\n    CONFIG.statusEffects.push({ id: systemConcentrationId, name: i18n(\"EFFECT.DND5E.StatusConcentrating\"), img: \"systems/dnd5e/icons/svg/statuses/concentrating.svg\", special: \"CONCENTRATING\" });\n  }\n  // Initialise these effects so that we don't need to make a raft of code async only to fetch these\n  if (configSettings.enforceBonusActions !== \"none\") {\n    if (!CONFIG.statusEffects.find(e => e._id === getStaticID(\"bonusaction\"))) {\n      CONFIG.statusEffects.push({\n        id: \"bonusaction\",\n        _id: getStaticID(\"bonusaction\"),\n        name: i18n(\"midi-qol.bonusActionUsed\"),\n        changes: [\n          { key: \"flags.midi-qol.actions.bonus\", mode: CONST.ACTIVE_EFFECT_MODES.CUSTOM, value: \"true\" },\n          { key: \"flags.midi-qol.actions.bonusActionsUsed\", mode: CONST.ACTIVE_EFFECT_MODES.ADD, value: \"1\", priority: 20 }\n        ],\n        img: \"modules/midi-qol/icons/bonus-action.svg\",\n\n        flags: { dae: { specialDuration: [\"turnStart\", \"combatEnd\", \"shortRest\"] } }\n      });\n    }\n    ActiveEffect.implementation.fromStatusEffect(\"bonusaction\").then(effect => {\n      midiBonusActionEffect = effect\n      globalThis.MidiQOL.midiBonusActionEffect = effect;\n    });\n  }\n\n  if (configSettings.enforceReactions !== \"none\") {\n    if (!CONFIG.statusEffects.find(e => e._id === getStaticID(\"reaction\"))) {\n      CONFIG.statusEffects.push({\n        id: \"reaction\",\n        _id: getStaticID(\"reaction\"),\n        name: i18n(\"midi-qol.reactionUsed\"),\n        changes: [\n          { key: \"flags.midi-qol.actions.reaction\", mode: CONST.ACTIVE_EFFECT_MODES.CUSTOM, value: \"true\" },\n          { key: \"flags.midi-qol.actions.reactionsUsed\", mode: CONST.ACTIVE_EFFECT_MODES.ADD, value: \"1\", priority: 20 }\n        ],\n        img: \"modules/midi-qol/icons/reaction.svg\",\n        // effectData: { transfer: false },\n        flags: { dae: { specialDuration: [\"turnStart\", \"combatEnd\", \"shortRest\"] } }\n      });\n    }\n    ActiveEffect.implementation.fromStatusEffect(\"reaction\").then(effect => {\n      midiReactionEffect = effect;\n      globalThis.MidiQOL.midiReactionEffect = effect;\n    });\n  }\n  if (!CONFIG.statusEffects.find(e => e._id === getStaticID(\"flanking\"))) {\n    CONFIG.statusEffects.push({\n      id: \"flanking\",\n      _id: getStaticID(\"flanking\"),\n      name: i18n(\"midi-qol.Flanking\"),\n      changes: getFlankingStatusChanges(),\n      img: \"icons/svg/sword.svg\",\n      // effectData: { transfer: false },\n      flags: { dae: { specialDuration: [\"combatEnd\"] } }\n    });\n  }\n\n  ActiveEffect.implementation.fromStatusEffect(\"flanking\").then(effect => {\n    midiFlankingEffect = effect;\n    globalThis.MidiQOL.midiFlankingEffect = effect;\n  });\n\n  if (!CONFIG.statusEffects.find(e => e._id === getStaticID(\"flanked\"))) {\n    CONFIG.statusEffects.push({\n      id: \"flanked\",\n      _id: getStaticID(\"flanked\"),\n      name: i18n(\"midi-qol.Flanked\"),\n      changes: getFlankedStatusChanges(),\n      img: \"modules/midi-qol/icons/encirclement.svg\",\n      // effectData: { transfer: false },\n      flags: { dae: { specialDuration: [\"combatEnd\"] } }\n    });\n  };\n\n  ActiveEffect.implementation.fromStatusEffect(\"flanked\").then(effect => {\n    midiFlankedEffect = effect;\n    globalThis.MidiQOL.midiFlankedEffect = effect;\n  });\n}\n\nfunction getFlankingStatusChanges(): object[] {\n  const bonus = configSettings.optionalRules?.flankingBonus ?? \"advantage\";\n  if (bonus === \"advantage\") {\n    return [\n      { key: \"flags.midi-qol.advantage.attack.mwak\", mode: CONST.ACTIVE_EFFECT_MODES.CUSTOM, value: \"true\" },\n      { key: \"flags.midi-qol.advantage.attack.msak\", mode: CONST.ACTIVE_EFFECT_MODES.CUSTOM, value: \"true\" }\n    ];\n  }\n  // Fixed bonus: flanking status is visual-only; bonus computed per-target in recordFlankingBonuses\n  return [];\n}\n\nfunction getFlankedStatusChanges(): object[] {\n  const bonus = configSettings.optionalRules?.flankingBonus ?? \"advantage\";\n  if (bonus === \"advantage\") {\n    return [\n      { key: \"flags.midi-qol.grants.advantage.attack.mwak\", mode: CONST.ACTIVE_EFFECT_MODES.CUSTOM, value: \"true\" },\n      { key: \"flags.midi-qol.grants.advantage.attack.msak\", mode: CONST.ACTIVE_EFFECT_MODES.CUSTOM, value: \"true\" }\n    ];\n  }\n  // Fixed bonus: flanked status is visual-only; bonus computed per-target in recordFlankingBonuses\n  return [];\n}\n\nexport function updateFlankingStatusEffects() {\n  const flanking = CONFIG.statusEffects.find(e => e.id === \"flanking\") as any;\n  const flanked = CONFIG.statusEffects.find(e => e.id === \"flanked\") as any;\n  if (flanking) flanking.changes = getFlankingStatusChanges();\n  if (flanked) flanked.changes = getFlankedStatusChanges();\n\n  // Rebuild cached effect instances (only if statuses have been registered)\n  if (flanking) {\n    ActiveEffect.implementation.fromStatusEffect(\"flanking\").then(effect => {\n      midiFlankingEffect = effect;\n      globalThis.MidiQOL.midiFlankingEffect = effect;\n    });\n  }\n  if (flanked) {\n    ActiveEffect.implementation.fromStatusEffect(\"flanked\").then(effect => {\n      midiFlankedEffect = effect;\n      globalThis.MidiQOL.midiFlankedEffect = effect;\n    });\n  }\n}\n"],"mappings":"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","names":["ApplicationV2","HandlebarsApplicationMixin","error","report","error","ApplicationV2","DialogV2","HandlebarsApplicationMixin","options","error","document","error","ApplicationV2","HandlebarsApplicationMixin","DialogV2","ApplicationV2","HandlebarsApplicationMixin","ApplicationV2","HandlebarsApplicationMixin","ApplicationV2","HandlebarsApplicationMixin","actor","message","error","document","i18nFormat","addAttribution","ApplicationV2","HandlebarsApplicationMixin","error","ApplicationV2","HandlebarsApplicationMixin","actor","user","i18nFormat","error","DialogV2","isRangeTargeting","MidiActivityMixin","error","StringField","i18nFormat","cancelWorkflow","message","evalActivationCondition","workflow","midiFlags","creatureTargetTypes","getActivityAutoTargetAction","MidiAttackActivity","StringField","isAutoFastForward","rolls","config","dialog","message","i18nFormat","error","i18nFormat","error","isVisible","i18nFormat","isAutoFastForward","dialog","message","chosenAbility","error","midiFlags","snapped","isAutoFastForward","message","error","ApplicationV2","HandlebarsApplicationMixin","HandlebarsApplicationMixin","getActivityAutoTargetAction","getAoETargetType","error","completeActivityUse","isAutoFastForward","canvas","midiFlags","Token","ApplicationV2","DialogV2","HandlebarsApplicationMixin","midiFlag","roll","traitList","error","defaultSaveMultiplier","saveMultiplier","midiFlags","error","completeActivityUse","options","c2","range","longRange","canOverride","coverData","error","isAutoFastForward","Token","HandlebarsApplicationMixin","ApplicationV2","DialogV2","asyncHooksCall","midiFlags","result","endTime","dialog","completeActivityUse","evalActivationCondition","rollAbility","midiFlag","asyncHooksCall","error","asyncHooksCall","CEAddEffectWith","getChanges","error","getCachedDocument","Token","Token","getActivityAutoTargetAction","getAoETargetType","DialogV2","document","getCachedDocument","error","document","error","Token","getCEEffectByName","CEAddEffectWith","socketlibSocket","error","error","completeActivityUse","CEAddEffectWith","document","result","undoFlag","undoDamageData","button","multiplierSelect","newTempHP","newHP","newTempMax","DialogV2","i18nFormat","WorkflowDataFlags","error","getCachedDocument","isAutoFastForward","activity","options","getAoETargetType","getActivityAutoTargetAction","i18nFormat","saveDisplay","evalActivationCondition","getCEEffectByName","damageComponents","CEAddEffectWith","completeActivityUse","inCombat","midiFlag","asyncHooksCall","rollAbility","promise","NumericTerm","midiFlags","bonusFlags","conditionData","DialogV2","resetConfigSettingsToDefaults","resetConfigSettingsToDefaults","playerRollSavesOptionsReduced","isAutoFastForward","error","ApplicationV2","HandlebarsApplicationMixin","log","ApplicationV2","HandlebarsApplicationMixin","midiFlags","total","str","MidiSaveActivity","StringField","message","isAutoFastForward","MidiUtilityActivity","StringField","error","isAutoFastForward","MidiDamageActivity","isAutoFastForward","MidiCheckActivity","StringField","MidiHealActivity","isAutoFastForward","i18nFormat","isDRType","error","i18nFormat","completeActivityUse","createEffects","getCachedDocument","getChanges","removeEffects","updateEffects","allAttackTypes","resetConfigSettingsToDefaults"]}