{"version":3,"file":"module.js","sources":["../../src/scripts/constants.js","../../src/scripts/lib/Logger.js","../../src/scripts/systems/a5e.js","../../src/scripts/systems/dnd5e.js","../../src/scripts/systems/generic.js","../../src/scripts/systems/pf2e.js","../../src/scripts/systems/swade.js","../../src/scripts/systems.js","../../src/scripts/settings.js","../../src/scripts/preloadTemplates.js","../../src/scripts/Chatlink.js","../../src/scripts/settings-form.js","../../src/scripts/ChatPortraitModels.js","../../src/scripts/api.js","../../src/scripts/ChatPortrait.js","../../src/scripts/socket.js","../../src/scripts/apps/speaking-as.js","../../src/scripts/apps/speak-as.js","../../src/scripts/main.js","../../src/module.js"],"sourcesContent":["const CONSTANTS = {\n    MODULE_ID: \"chat-portrait\",\n    PATH: `modules/chat-portrait/`,\n    INV_UNIDENTIFIED_BOOK: `modules/chat-portrait/assets/inv-unidentified-book.png`,\n    DEF_TOKEN_IMG_NAME: \"mystery-man\",\n    DEF_TOKEN_IMG_PATH: \"icons/svg/mystery-man.svg\",\n};\nCONSTANTS.PATH = `modules/${CONSTANTS.MODULE_ID}/`;\nexport default CONSTANTS;\n","import CONSTANTS from \"../constants.js\";\n\n// ================================\n// Logger utility\n// ================================\nexport default class Logger {\n    static get DEBUG() {\n        return (\n            game.settings.get(CONSTANTS.MODULE_ID, \"debug\") ||\n            game.modules.get(\"_dev-mode\")?.api?.getPackageDebugValue(CONSTANTS.MODULE_ID, \"boolean\")\n        );\n    }\n    // export let debugEnabled = 0;\n    // 0 = none, warnings = 1, debug = 2, all = 3\n\n    static debug(msg, ...args) {\n        try {\n            if (\n                game.settings.get(CONSTANTS.MODULE_ID, \"debug\") ||\n                game.modules.get(\"_dev-mode\")?.api?.getPackageDebugValue(CONSTANTS.MODULE_ID, \"boolean\")\n            ) {\n                console.log(`DEBUG | ${CONSTANTS.MODULE_ID} | ${msg}`, ...args);\n            }\n        } catch (e) {\n            console.error(e.message);\n        }\n        return msg;\n    }\n\n    static logObject(...args) {\n        return this.log(\"\", args);\n    }\n\n    static log(message, ...args) {\n        try {\n            message = `${CONSTANTS.MODULE_ID} | ${message}`;\n            console.log(message.replace(\"<br>\", \"\\n\"), ...args);\n        } catch (e) {\n            console.error(e.message);\n        }\n        return message;\n    }\n\n    static notify(message, ...args) {\n        try {\n            message = `${CONSTANTS.MODULE_ID} | ${message}`;\n            ui.notifications?.notify(message);\n            console.log(message.replace(\"<br>\", \"\\n\"), ...args);\n        } catch (e) {\n            console.error(e.message);\n        }\n        return message;\n    }\n\n    static info(info, notify = false, ...args) {\n        try {\n            info = `${CONSTANTS.MODULE_ID} | ${info}`;\n            if (notify) {\n                ui.notifications?.info(info);\n            }\n            console.log(info.replace(\"<br>\", \"\\n\"), ...args);\n        } catch (e) {\n            console.error(e.message);\n        }\n        return info;\n    }\n\n    static warn(warning, notify = false, ...args) {\n        try {\n            warning = `${CONSTANTS.MODULE_ID} | ${warning}`;\n            if (notify) {\n                ui.notifications?.warn(warning);\n            }\n            console.warn(warning.replace(\"<br>\", \"\\n\"), ...args);\n        } catch (e) {\n            console.error(e.message);\n        }\n        return warning;\n    }\n\n    static errorObject(...args) {\n        return this.error(\"\", false, args);\n    }\n\n    static error(error, notify = true, ...args) {\n        try {\n            error = `${CONSTANTS.MODULE_ID} | ${error}`;\n            if (notify) {\n                ui.notifications?.error(error);\n            }\n            console.error(error.replace(\"<br>\", \"\\n\"), ...args);\n        } catch (e) {\n            console.error(e.message);\n        }\n        return new Error(error.replace(\"<br>\", \"\\n\"));\n    }\n\n    static errorPermanent(error, notify = true, ...args) {\n        try {\n            error = `${CONSTANTS.MODULE_ID} | ${error}`;\n            if (notify) {\n                ui.notifications?.error(error, {\n                    permanent: true,\n                });\n            }\n            console.error(error.replace(\"<br>\", \"\\n\"), ...args);\n        } catch (e) {\n            console.error(e.message);\n        }\n        return new Error(error.replace(\"<br>\", \"\\n\"));\n    }\n\n    static timelog(message) {\n        this.warn(Date.now(), message);\n    }\n\n    static i18n = (key) => {\n        return game.i18n.localize(key)?.trim();\n    };\n\n    static i18nFormat = (key, data = {}) => {\n        return game.i18n.format(key, data)?.trim();\n    };\n\n    // setDebugLevel = (debugText): void => {\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\n    static dialogWarning(message, icon = \"fas fa-exclamation-triangle\") {\n        return `<p class=\"${CONSTANTS.MODULE_ID}-dialog\">\n        <i style=\"font-size:3rem;\" class=\"${icon}\"></i><br><br>\n        <strong style=\"font-size:1.2rem;\">${CONSTANTS.MODULE_ID}</strong>\n        <br><br>${message}\n    </p>`;\n    }\n}\n","import CONSTANTS from \"../constants.js\";\nexport default {\n    SYSTEM_ID: \"a5e\",\n    imageReplacerDamageType: [\n        { name: \"A5E.DamageAcid\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/acid.svg` },\n        { name: \"A5E.DamageBludgeoning\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/bludgeoning.svg` },\n        { name: \"A5E.DamageCold\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/cold.svg` },\n        { name: \"A5E.DamageFire\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/fire.svg` },\n        { name: \"A5E.DamageForce\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/force.svg` },\n        { name: \"A5E.DamageLightning\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/lightning.svg` },\n        { name: \"A5E.DamageNecrotic\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/necrotic.svg` },\n        { name: \"A5E.DamagePiercing\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/piercing.svg` },\n        { name: \"A5E.DamagePoison\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/poison.svg` },\n        { name: \"A5E.DamagePsychic\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/psychic.svg` },\n        { name: \"A5E.DamageRadiant\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/radiant.svg` },\n        { name: \"A5E.DamageSlashing\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/slashing.svg` },\n        { name: \"A5E.DamageThunder\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/thunder.svg` },\n        { name: \"A5E.DamageUnknown\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/non_magical_physical.svg` },\n    ],\n    imageReplacerWeaponProperties: [\n        { name: \"A5E.WeaponPropertyBurn\", icon: `` },\n        { name: \"A5E.WeaponPropertyBreaker\", icon: `` },\n        { name: \"A5E.WeaponPropertyCompounding\", icon: `` },\n        { name: \"A5E.WeaponPropertyDefensive\", icon: `` },\n        { name: \"A5E.WeaponPropertyDualWielding\", icon: `` },\n        { name: \"A5E.WeaponPropertyFinesse\", icon: `` },\n        { name: \"A5E.WeaponPropertyFlamboyant\", icon: `` },\n        { name: \"A5E.WeaponPropertyHandMounted\", icon: `` },\n        { name: \"A5E.WeaponPropertyHeavy\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/heavy.svg` },\n        { name: \"A5E.WeaponPropertyInaccurate\", icon: `` },\n        { name: \"A5E.WeaponPropertyLoading\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/loading.svg` },\n        { name: \"A5E.WeaponPropertyMounted\", icon: `` },\n        { name: \"A5E.WeaponPropertyMuzzleLoading\", icon: `` },\n        { name: \"A5E.WeaponPropertyParrying\", icon: `` },\n        { name: \"A5E.WeaponPropertyParryingImmunity\", icon: `` },\n        { name: \"A5E.WeaponPropertyQuickdraw\", icon: `` },\n        { name: \"A5E.WeaponPropertyRange\", icon: `` },\n        { name: \"A5E.WeaponPropertyReach\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/reach.svg` },\n        { name: \"A5E.WeaponPropertyRifled\", icon: `` },\n        { name: \"A5E.WeaponPropertyScatter\", icon: `` },\n        { name: \"A5E.WeaponPropertyShock\", icon: `` },\n        { name: \"A5E.WeaponPropertySimple\", icon: `` },\n        { name: \"A5E.WeaponPropertyThrown\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/thrown.svg` },\n        { name: \"A5E.WeaponPropertyTriggerCharge\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/special.svg` },\n        { name: \"A5E.WeaponPropertyTrip\", icon: `` },\n        { name: \"A5E.WeaponPropertyTwoHanded\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/two-Handed.svg` },\n        { name: \"A5E.WeaponPropertyVersatile\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/versatile.svg` },\n        { name: \"A5E.WeaponPropertyVicious\", icon: `` },\n    ],\n    imageReplacerIconizer: [\n        { name: \"A5E.AbilityDefault\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/gaming_set.svg` },\n        { name: \"A5E.AbilitySpellcasting\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/arcana.svg` },\n        { name: \"A5E.AbilityCheck\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/survival.svg` },\n        { name: \"A5E.AbilityStr\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/strength.svg` },\n        { name: \"A5E.AbilityDex\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/dexterity.svg` },\n        { name: \"A5E.AbilityCon\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/constitution.svg` },\n        { name: \"A5E.AbilityInt\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/intelligence.svg` },\n        { name: \"A5E.AbilityWis\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/wisdom.svg` },\n        { name: \"A5E.AbilityCha\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/charisma.svg` },\n        { name: \"A5E.SkillAcr\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/acrobatics.svg` },\n        { name: \"A5E.SkillAni\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/animal_handling.svg` },\n        { name: \"A5E.SkillArc\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/arcana.svg` },\n        { name: \"A5E.SkillAth\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/athletics.svg` },\n        { name: \"A5E.SkillCul\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/culture.svg` },\n        { name: \"A5E.SkillDec\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/deception.svg` },\n        { name: \"A5E.SkillEng\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/engineering.svg` },\n        { name: \"A5E.SkillHis\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/history.svg` },\n        { name: \"A5E.SkillIns\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/insight.svg` },\n        { name: \"A5E.SkillItm\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/intimidation.svg` },\n        { name: \"A5E.SkillInv\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/investigation.svg` },\n        { name: \"A5E.SkillMed\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/medicine.svg` },\n        { name: \"A5E.SkillNat\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/nature.svg` },\n        { name: \"A5E.SkillPrc\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/perception.svg` },\n        { name: \"A5E.SkillPrf\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/performance.svg` },\n        { name: \"A5E.SkillPer\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/persuasion.svg` },\n        { name: \"A5E.SkillRel\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/religion.svg` },\n        { name: \"A5E.SkillSlt\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/sleight_of_hand.svg` },\n        { name: \"A5E.SkillSte\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/stealth.svg` },\n        { name: \"A5E.SkillSur\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/survival.svg` },\n        { name: \"A5E.SkillSpecialties\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/specialties.svg` },\n        { name: \"A5E.SkillSpecialtyAberrations\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/aberrations.svg` },\n        { name: \"A5E.SkillSpecialtyActing\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/acting.svg` },\n        { name: \"A5E.SkillSpecialtyAppraisal\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/appraisal.svg` },\n        { name: \"A5E.SkillSpecialtyAlignment\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/alignment.svg` },\n        { name: \"A5E.SkillSpecialtyAnimals\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/animals.svg` },\n        { name: \"A5E.SkillSpecialtyAnonymity\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/anonymity.svg` },\n        { name: \"A5E.SkillSpecialtyArchitecture\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/architecture.svg` },\n        { name: \"A5E.SkillSpecialtyArts\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/arts.svg` },\n        { name: \"A5E.SkillSpecialtyAstronomy\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/astronomy.svg` },\n        { name: \"A5E.SkillSpecialtyAuthority\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/authority.svg` },\n        { name: \"A5E.SkillSpecialtyAutopsy\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/autopsy.svg` },\n        { name: \"A5E.SkillSpecialtyBalancing\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/balancing.svg` },\n        { name: \"A5E.SkillSpecialtyBeastLore\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/beast Lore.svg` },\n        { name: \"A5E.SkillSpecialtyBoasting\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/boasting.svg` },\n        { name: \"A5E.SkillSpecialtyBribery\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/bribery.svg` },\n        { name: \"A5E.SkillSpecialtyCalming\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/calming.svg` },\n        { name: \"A5E.SkillSpecialtyCelestials\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/celestials.svg` },\n        { name: \"A5E.SkillSpecialtyCamouflage\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/camouflage.svg` },\n        { name: \"A5E.SkillSpecialtyCasing\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/casing.svg` },\n        { name: \"A5E.SkillSpecialtyChemistry\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/chemistry.svg` },\n        { name: \"A5E.SkillSpecialtyCiphers\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/ciphers.svg` },\n        { name: \"A5E.SkillSpecialtyClimbing\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/climbing.svg` },\n        {\n            name: \"A5E.SkillSpecialtyConcealingEmotions\",\n            icon: `modules/${CONSTANTS.MODULE_ID}/assets/concealing_emotions.svg`,\n        },\n        { name: \"A5E.SkillSpecialtyComposing\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/composing.svg` },\n        { name: \"A5E.SkillSpecialtyConstructs\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/constructs.svg` },\n        {\n            name: \"A5E.SkillSpecialtyCourtlyManners\",\n            icon: `modules/${CONSTANTS.MODULE_ID}/assets/courtly_manners.svg`,\n        },\n        { name: \"A5E.SkillSpecialtyCults\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/cults.svg` },\n        { name: \"A5E.SkillSpecialtyDancing\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/dancing.svg` },\n        { name: \"A5E.SkillSpecialtyDeciphering\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/deciphering.svg` },\n        {\n            name: \"A5E.SkillSpecialtyDetectingLies\",\n            icon: `modules/${CONSTANTS.MODULE_ID}/assets/detecting_lies.svg`,\n        },\n        { name: \"A5E.SkillSpecialtyDetection\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/detection.svg` },\n        { name: \"A5E.SkillSpecialtyDiseases\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/diseases.svg` },\n        { name: \"A5E.SkillSpecialtyDistraction\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/distraction.svg` },\n        { name: \"A5E.SkillSpecialtyDragons\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/dragons.svg` },\n        { name: \"A5E.SkillSpecialtyDriving\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/driving.svg` },\n        { name: \"A5E.SkillSpecialtyDungeoneering\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/dungeoneering.svg` },\n        { name: \"A5E.SkillSpecialtyElementals\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/elementals.svg` },\n        { name: \"A5E.SkillSpecialtyEmpires\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/empires.svg` },\n        {\n            name: \"A5E.SkillSpecialtyEscapeArtistry\",\n            icon: `modules/${CONSTANTS.MODULE_ID}/assets/escape_artistry.svg`,\n        },\n        { name: \"A5E.SkillSpecialtyEtiquette\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/etiquette.svg` },\n        { name: \"A5E.SkillSpecialtyExplosives\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/explosives.svg` },\n        { name: \"A5E.SkillSpecialtyFarming\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/farming.svg` },\n        { name: \"A5E.SkillSpecialtyFarsight\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/farsight.svg` },\n        { name: \"A5E.SkillSpecialtyFerocity\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/ferocity.svg` },\n        { name: \"A5E.SkillSpecialtyFey\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/fey.svg` },\n        { name: \"A5E.SkillSpecialtyFineArt\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/fine_art.svg` },\n        { name: \"A5E.SkillSpecialtyFlattery\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/flattery.svg` },\n        { name: \"A5E.SkillSpecialtyForaging\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/foraging.svg` },\n        {\n            name: \"A5E.SkillSpecialtyForbiddenKnowledge\",\n            icon: `modules/${CONSTANTS.MODULE_ID}/assets/forbidden_knowledge.svg`,\n        },\n        { name: \"A5E.SkillSpecialtyForensics\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/forensics.svg` },\n        { name: \"A5E.SkillSpecialtyFiends\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/fiends.svg` },\n        { name: \"A5E.SkillSpecialtyGadgetry\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/gadgetry.svg` },\n        {\n            name: \"A5E.SkillSpecialtyGatheringRumors\",\n            icon: `modules/${CONSTANTS.MODULE_ID}/assets/gathering_rumors.svg`,\n        },\n        { name: \"A5E.SkillSpecialtyGenealogy\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/genealogy.svg` },\n        { name: \"A5E.SkillSpecialtyGods\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/gods.svg` },\n        { name: \"A5E.SkillSpecialtyHerbalism\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/herbalism.svg` },\n        { name: \"A5E.SkillSpecialtyHolySymbols\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/holy_symbols.svg` },\n        { name: \"A5E.SkillSpecialtyHunting\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/hunting.svg` },\n        { name: \"A5E.SkillSpecialtyInterrogation\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/interrogation.svg` },\n        {\n            name: \"A5E.SkillSpecialtyInvisibleObjects\",\n            icon: `modules/${CONSTANTS.MODULE_ID}/assets/invisible _objects.svg`,\n        },\n        { name: \"A5E.SkillSpecialtyJumping\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/jumping.svg` },\n        { name: \"A5E.SkillSpecialtyLaws\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/laws.svg` },\n        { name: \"A5E.SkillSpecialtyLeadership\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/leadership.svg` },\n        { name: \"A5E.SkillSpecialtyLegends\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/legends.svg` },\n        { name: \"A5E.SkillSpecialtyLegerdemain\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/legerdemain.svg` },\n        { name: \"A5E.SkillSpecialtyLifting\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/lifting.svg` },\n        { name: \"A5E.SkillSpecialtyLinguistics\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/linguistics.svg` },\n        { name: \"A5E.SkillSpecialtyListening\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/listening.svg` },\n        { name: \"A5E.SkillSpecialtyMathematics\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/mathematics.svg` },\n        {\n            name: \"A5E.SkillSpecialtyMechanicalTraps\",\n            icon: `modules/${CONSTANTS.MODULE_ID}/assets/mechanical_traps.svg`,\n        },\n        { name: \"A5E.SkillSpecialtyMimicry\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/mimicry.svg` },\n        { name: \"A5E.SkillSpecialtyMonstrosities\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/monstrosities.svg` },\n        { name: \"A5E.SkillSpecialtyMorality\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/morality.svg` },\n        { name: \"A5E.SkillSpecialtyNegotiation\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/negotiation.svg` },\n        { name: \"A5E.SkillSpecialtyOozes\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/oozes.svg` },\n        { name: \"A5E.SkillSpecialtyPeacemaking\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/peacemaking.svg` },\n        { name: \"A5E.SkillSpecialtyPickpocketing\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/pickpocketing.svg` },\n        { name: \"A5E.SkillSpecialtyThePlanes\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/the_planes.svg` },\n        { name: \"A5E.SkillSpecialtyPlantLore\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/plant_lore.svg` },\n        { name: \"A5E.SkillSpecialtyPoisons\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/poisons.svg` },\n        { name: \"A5E.SkillSpecialtyProphecy\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/prophecy.svg` },\n        {\n            name: \"A5E.SkillSpecialtyReadingEmotions\",\n            icon: `modules/${CONSTANTS.MODULE_ID}/assets/reading_emotions.svg`,\n        },\n        {\n            name: \"A5E.SkillSpecialtyRegionalGoods\",\n            icon: `modules/${CONSTANTS.MODULE_ID}/assets/regional_goods.svg`,\n        },\n        { name: \"A5E.SkillSpecialtyResearch\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/research.svg` },\n        { name: \"A5E.SkillSpecialtyRiding\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/riding.svg` },\n        { name: \"A5E.SkillSpecialtyRunning\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/running.svg` },\n        { name: \"A5E.SkillSpecialtyScent\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/scent.svg` },\n        {\n            name: \"A5E.SkillSpecialtySensingMotives\",\n            icon: `modules/${CONSTANTS.MODULE_ID}/assets/sensing_motives.svg`,\n        },\n        { name: \"A5E.SkillSpecialtySiegecraft\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/siegecraft.svg` },\n        { name: \"A5E.SkillSpecialtySinging\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/singing.svg` },\n        { name: \"A5E.SkillSpecialtySpeaking\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/speaking.svg` },\n        { name: \"A5E.SkillSpecialtyStreetwise\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/streetwise.svg` },\n        {\n            name: \"A5E.SkillSpecialtySubtleThreats\",\n            icon: `modules/${CONSTANTS.MODULE_ID}/assets/subtle_threats.svg`,\n        },\n        { name: \"A5E.SkillSpecialtySwimming\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/swimming.svg` },\n        { name: \"A5E.SkillSpecialtySwinging\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/swinging.svg` },\n        { name: \"A5E.SkillSpecialtyThrowing\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/throwing.svg` },\n        { name: \"A5E.SkillSpecialtyTracking\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/tracking.svg` },\n        { name: \"A5E.SkillSpecialtyTrade\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/trade.svg` },\n        { name: \"A5E.SkillSpecialtyTraining\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/training.svg` },\n        { name: \"A5E.SkillSpecialtyTrapfinding\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/trapfinding.svg` },\n        { name: \"A5E.SkillSpecialtyTumbling\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/tumbling.svg` },\n        { name: \"A5E.SkillSpecialtyUndead\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/undead.svg` },\n        { name: \"A5E.SkillSpecialtyWars\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/wars.svg` },\n        { name: \"A5E.SkillSpecialtyWayfinding\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/wayfinding.svg` },\n        {\n            name: \"A5E.SkillSpecialtyWeaponDisplays\",\n            icon: `modules/${CONSTANTS.MODULE_ID}/assets/weapon_displays.svg`,\n        },\n        { name: \"A5E.SkillSpecialtyWeather\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/weather.svg` },\n        { name: \"A5E.SkillSpecialtyWriting\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/writing.svg` },\n    ],\n};\n","import CONSTANTS from \"../constants.js\";\nexport default {\n    SYSTEM_ID: \"dnd5e\",\n    /**\n     * based on https://github.com/game-icons/icons/issues/516\n     */\n    imageReplacerDamageType: [\n        { name: \"DND5E.DamageAcid\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/acid.svg` },\n        { name: \"DND5E.DamageBludgeoning\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/bludgeoning.svg` },\n        { name: \"DND5E.DamageCold\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/cold.svg` },\n        { name: \"DND5E.DamageFire\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/fire.svg` },\n        { name: \"DND5E.DamageForce\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/force.svg` },\n        { name: \"DND5E.DamageLightning\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/lightning.svg` },\n        { name: \"DND5E.DamageNecrotic\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/necrotic.svg` },\n        { name: \"DND5E.DamagePiercing\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/piercing.svg` },\n        { name: \"DND5E.DamagePhysical\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/non_magical_physical.svg` },\n        { name: \"DND5E.DamagePoison\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/poison.svg` },\n        { name: \"DND5E.DamagePsychic\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/psychic.svg` },\n        { name: \"DND5E.DamageRadiant\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/radiant.svg` },\n        { name: \"DND5E.DamageSlashing\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/slashing.svg` },\n        { name: \"DND5E.DamageThunder\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/thunder.svg` },\n    ],\n    imageReplacerWeaponProperties: [\n        { name: \"DND5E.WeaponPropertiesAda\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/adamantine.svg` },\n        { name: \"DND5E.WeaponPropertiesAmm\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/ammunition.svg` },\n        { name: \"DND5E.WeaponPropertiesFin\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/finesse.svg` },\n        { name: \"DND5E.WeaponPropertiesFir\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/firearm.svg` },\n        { name: \"DND5E.WeaponPropertiesFoc\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/focus.svg` },\n        { name: \"DND5E.WeaponPropertiesHvy\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/heavy.svg` },\n        { name: \"DND5E.WeaponPropertiesLgt\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/light.svg` },\n        { name: \"DND5E.WeaponPropertiesLod\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/loading.svg` },\n        { name: \"DND5E.WeaponPropertiesMgc\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/magical.svg` },\n        { name: \"DND5E.WeaponPropertiesRch\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/reach.svg` },\n        { name: \"DND5E.WeaponPropertiesRel\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/reload.svg` },\n        { name: \"DND5E.WeaponPropertiesRet\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/returning.svg` },\n        { name: \"DND5E.WeaponPropertiesSil\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/silvered.svg` },\n        { name: \"DND5E.WeaponPropertiesSpc\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/special.svg` },\n        { name: \"DND5E.WeaponPropertiesThr\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/thrown.svg` },\n        { name: \"DND5E.WeaponPropertiesTwo\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/two-Handed.svg` },\n        { name: \"DND5E.WeaponPropertiesVer\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/versatile.svg` },\n    ],\n    /**\n     * based on https://github.com/game-icons/icons/issues/516\n     */\n    imageReplacerIconizer: [\n        // =======================================================================\n        // dnd5e\n        // =======================================================================\n        { name: \"DND5E.DamageRoll\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/damage_roll.svg` },\n        { name: \"DND5E.AttackRoll\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/attack_roll.svg` },\n        { name: \"DND5E.SkillAcr\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/acrobatics.svg` },\n        { name: \"DND5E.SkillAni\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/animal_handling.svg` },\n        { name: \"DND5E.SkillArc\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/arcana.svg` },\n        { name: \"DND5E.SkillAth\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/athletics.svg` },\n        { name: \"DND5E.SkillDec\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/deception.svg` },\n        { name: \"DND5E.SkillHis\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/history.svg` },\n        { name: \"DND5E.SkillIns\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/insight.svg` },\n        { name: \"DND5E.SkillItm\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/intimidation.svg` },\n        { name: \"DND5E.SkillInv\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/investigation.svg` },\n        { name: \"DND5E.SkillMed\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/medicine.svg` },\n        { name: \"DND5E.SkillNat\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/nature.svg` },\n        { name: \"DND5E.SkillPrc\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/perception.svg` },\n        { name: \"DND5E.SkillPrf\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/performance.svg` },\n        { name: \"DND5E.SkillPer\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/persuasion.svg` },\n        { name: \"DND5E.SkillRel\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/religion.svg` },\n        { name: \"DND5E.SkillSlt\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/sleight_of_hand.svg` },\n        { name: \"DND5E.SkillSte\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/stealth.svg` },\n        { name: \"DND5E.SkillSur\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/survival.svg` },\n        { name: \"DND5E.ToolArtisans\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/artisan_s_tools.svg` },\n        { name: \"DND5E.ToolDisguiseKit\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/disguise_kit.svg` },\n        { name: \"DND5E.ToolForgeryKit\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/forgery_kit` },\n        { name: \"DND5E.ToolGamingSet\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/gaming_set.svg` },\n        { name: \"DND5E.ToolHerbalismKit\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/herbalism_kit` },\n        {\n            name: \"DND5E.ToolMusicalInstrument\",\n            icon: `modules/${CONSTANTS.MODULE_ID}/assets/musical_instrument.svg`,\n        },\n        { name: \"DND5E.ToolNavigators\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/navigator_s_tools.svg` },\n        { name: \"DND5E.ToolPoisonersKit\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/poisoner_s_kit.svg` },\n        { name: \"DND5E.ToolThieves\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/thieves_tools.svg` },\n        { name: \"DND5E.ShortRest\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/short_rest.svg` },\n        { name: \"DND5E.LongRest\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/long_rest.svg` },\n        { name: \"DND5E.DeathSave\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/death_saves.svg` },\n        { name: \"DND5E.AbilityStr\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/strength.svg` },\n        { name: \"DND5E.AbilityDex\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/dexterity.svg` },\n        { name: \"DND5E.AbilityCon\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/constitution.svg` },\n        { name: \"DND5E.AbilityInt\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/intelligence.svg` },\n        { name: \"DND5E.AbilityWis\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/wisdom.svg` },\n        { name: \"DND5E.AbilityCha\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/charisma.svg` },\n        { name: \"DND5E.Initiative\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/initiative.svg` }, //https://game-icons.net/1x1/delapouite/acoustic-megaphone.html\n        // TODO CONDITION I JUST DON'T KNOW HO CAN BE USEFUL\n        // { name : 'DND5E.ConBlinded', icon : `Blinded\",\n        // { name : 'DND5E.ConCharmed', icon : `Charmed\",\n        // { name : 'DND5E.ConDeafened', icon : `Deafened\",\n        // { name : 'DND5E.ConDiseased', icon : `Diseased\",\n        // { name : 'DND5E.ConExhaustion', icon : `Exhaustion\",\n        // { name : 'DND5E.ConFrightened', icon : `Frightened\",\n        // { name : 'DND5E.ConGrappled', icon : `Grappled\",\n        // { name : 'DND5E.ConImm', icon : `Condition Immunities\",\n        // { name : 'DND5E.ConIncapacitated', icon : `Incapacitated\",\n        // { name : 'DND5E.ConInvisible', icon : `Invisible\",\n        // { name : 'DND5E.ConParalyzed', icon : `Paralyzed\",\n        // { name : 'DND5E.ConPetrified', icon : `Petrified\",\n        // { name : 'DND5E.ConPoisoned', icon : `Poisoned\",\n        // { name : 'DND5E.ConProne', icon : `Prone\",\n        // { name : 'DND5E.ConRestrained', icon : `Restrained\",\n        // { name : 'DND5E.ConStunned', icon : `Stunned\",\n        // { name : 'DND5E.ConUnconscious', icon : `Unconscious\",\n        // { name : 'DND5E.Concentration', icon : `Concentration\",\n    ],\n};\n","export default {\n    SYSTEM_ID: \"\",\n    imageReplacerDamageType: [],\n    imageReplacerWeaponProperties: [],\n    imageReplacerIconizer: [],\n};\n","import CONSTANTS from \"../constants.js\";\nexport default {\n    SYSTEM_ID: \"pf2e\",\n    imageReplacerDamageType: [],\n    imageReplacerWeaponProperties: [],\n    imageReplacerIconizer: [\n        // { name : 'PF2E.AbilityBoost', icon : `Ability Boost\",\n        // { name : 'PF2E.AbilityBoostLevels', icon : `Ability Boost Levels\",\n        { name: \"PF2E.AbilityCha\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/charisma.svg` },\n        { name: \"PF2E.AbilityCon\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/constitution.svg` },\n        { name: \"PF2E.AbilityDex\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/dexterity.svg` },\n        { name: \"PF2E.AbilityFlaw\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/flaw.svg` },\n        { name: \"PF2E.AbilityInt\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/intelligence.svg` },\n        // { name : 'PF2E.AbilityModifierLabel', icon : `Ability Modifier\",\n        // { name : 'PF2E.AbilityScoresHeader', icon : `Ability Scores\",\n        { name: \"PF2E.AbilityFree\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/free.svg` },\n        { name: \"PF2E.AbilityStr\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/strength.svg` },\n        // { name : 'PF2E.AbilityTitle', icon : `Ability\",\n        { name: \"PF2E.AbilityWis\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/wisdom.svg` },\n        { name: \"PF2E.AbilityCheck.str\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/strength.svg` },\n        { name: \"PF2E.AbilityCheck.dex\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/dexterity.svg` },\n        { name: \"PF2E.AbilityCheck.con\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/constitution.svg` },\n        { name: \"PF2E.AbilityCheck.int\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/intelligence.svg` },\n        { name: \"PF2E.AbilityCheck.wis\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/wisdom.svg` },\n        { name: \"PF2E.AbilityCheck.cha\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/charisma.svg` },\n        { name: \"PF2E.ActionsCheck.acrobatics\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/acrobatics.svg` },\n        { name: \"PF2E.ActionsCheck.arcana\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/arcana.svg` },\n        { name: \"PF2E.ActionsCheck.athletics\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/athletics.svg` },\n        { name: \"PF2E.ActionsCheck.crafting\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/crafting.svg` },\n        { name: \"PF2E.ActionsCheck.deception\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/deception.svg` },\n        { name: \"PF2E.ActionsCheck.diplomacy\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/diplomacy.svg` },\n        { name: \"PF2E.ActionsCheck.intimidation\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/intimidation.svg` },\n        { name: \"PF2E.ActionsCheck.medicine\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/medicine.svg` },\n        { name: \"PF2E.ActionsCheck.nature\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/nature.svg` },\n        { name: \"PF2E.ActionsCheck.occultism\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/occultism.svg` },\n        { name: \"PF2E.ActionsCheck.perception\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/perception.svg` },\n        { name: \"PF2E.ActionsCheck.performance\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/performance.svg` },\n        { name: \"PF2E.ActionsCheck.religion\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/religion.svg` },\n        { name: \"PF2E.ActionsCheck.society\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/society.svg` },\n        { name: \"PF2E.ActionsCheck.stealth\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/stealth.svg` },\n        { name: \"PF2E.ActionsCheck.survival\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/survival.svg` },\n        { name: \"PF2E.ActionsCheck.thievery\", icon: `modules/${CONSTANTS.MODULE_ID}/assets/thievery.svg` },\n    ],\n};\n","export default {\n    SYSTEM_ID: \"swade\",\n    imageReplacerDamageType: [],\n    imageReplacerWeaponProperties: [],\n    imageReplacerIconizer: [],\n};\n","// ↓ IMPORT SYSTEMS HERE ↓\nimport a5e from \"./systems/a5e.js\";\nimport dnd5e from \"./systems/dnd5e.js\";\nimport generic from \"./systems/generic.js\";\nimport pf2e from \"./systems/pf2e.js\";\nimport swade from \"./systems/swade.js\";\n// ↑ IMPORT SYSTEMS HERE ↑\n/**\n * NOTE: YOUR PULL REQUEST WILL NOT BE ACCEPTED IF YOU DO NOT\n * FOLLOW THE CONVENTION IN THE D&D 5E SYSTEM FILE\n */\nexport const SYSTEMS = {\n    get DATA() {\n        return {\n            // ↓ ADD SYSTEMS HERE ↓\n            a5e,\n            dnd5e,\n            generic,\n            pf2e,\n            swade,\n            // ↑ ADD SYSTEMS HERE ↑\n        }?.[game.system.id];\n    },\n};\n","// import { ChatPortraitForm } from './ChatPortraitForm';\nimport CONSTANTS from \"./constants.js\";\nimport Logger from \"./lib/Logger.js\";\nimport { SYSTEMS } from \"./systems.js\";\n// export const CONSTANTS.MODULE_ID = 'chat-portrait';\n// export const INV_UNIDENTIFIED_BOOK = `modules/${CONSTANTS.MODULE_ID}/assets/inv-unidentified-book.png`;\n// export const CHAT_PORTRAIT_DEF_TOKEN_IMG_NAME = 'mystery-man';\nexport const registerSettings = function () {\n    game.settings.registerMenu(CONSTANTS.MODULE_ID, \"resetAllSettings\", {\n        name: `${CONSTANTS.MODULE_ID}.setting.reset.name`,\n        hint: `${CONSTANTS.MODULE_ID}.setting.reset.hint`,\n        icon: \"fas fa-coins\",\n        type: ResetSettingsDialog,\n        restricted: true,\n    });\n    // =====================================================================\n    // game.settings.registerMenu(CONSTANTS.MODULE_ID, CONSTANTS.MODULE_ID, {\n    //   name: CONSTANTS.MODULE_ID + '.form',\n    //   label: CONSTANTS.MODULE_ID + '.form-title',\n    //   hint: CONSTANTS.MODULE_ID + '.form-hint',\n    //   icon: 'fas fa-portrait',\n    //   type: ChatPortraitForm,\n    //   restricted: true,\n    // });\n    // Form setitngs\n    game.settings.register(CONSTANTS.MODULE_ID, \"disableChatPortrait\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.disableChatPortrait.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.disableChatPortrait.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    // Form setitngs\n    game.settings.register(CONSTANTS.MODULE_ID, \"useTokenImage\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.useTokenImage.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.useTokenImage.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"doNotUseTokenImageWithSpecificType\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.doNotUseTokenImageWithSpecificType.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.doNotUseTokenImageWithSpecificType.hint`,\n        scope: \"world\",\n        config: true,\n        type: String,\n        default: \"\",\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"useTokenName\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.useTokenName.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.useTokenName.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"useAvatarImage\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.useAvatarImage.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.useAvatarImage.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"displayPlayerName\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.displayPlayerName.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.displayPlayerName.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"portraitSize\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.portraitSize.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.portraitSize.hint`,\n        scope: \"client\",\n        config: true,\n        type: Number,\n        default: 36,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"portraitSizeItem\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.portraitSizeItem.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.portraitSizeItem.hint`,\n        scope: \"client\",\n        config: true,\n        type: Number,\n        default: 36,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"borderShape\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.borderShape.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.borderShape.hint`,\n        scope: \"client\",\n        config: true,\n        type: String,\n        default: \"square\",\n        choices: {\n            square: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.borderShape.choice.square`),\n            circle: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.borderShape.choice.circle`),\n            none: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.borderShape.choice.none`),\n        },\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"useUserColorAsBorderColor\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.useUserColorAsBorderColor.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.useUserColorAsBorderColor.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: true,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"borderColor\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.borderColor.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.borderColor.hint`,\n        scope: \"client\",\n        config: true,\n        type: String,\n        default: \"#000000\",\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"borderWidth\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.borderWidth.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.borderWidth.hint`,\n        scope: \"client\",\n        config: true,\n        type: Number,\n        default: 2,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"useUserColorAsChatBackgroundColor\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.useUserColorAsChatBackgroundColor.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.useUserColorAsChatBackgroundColor.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"useUserColorAsChatBorderColor\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.useUserColorAsChatBorderColor.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.useUserColorAsChatBorderColor.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: true,\n    });\n    // game.settings.register(CONSTANTS.MODULE_ID, \"flavorNextToPortrait\", {\n    // \tname: `${CONSTANTS.MODULE_ID}.settings.flavorNextToPortrait.name`,\n    // \thint: `${CONSTANTS.MODULE_ID}.settings.flavorNextToPortrait.hint`,\n    // \tscope: \"client\",\n    // \tconfig: true,\n    // \ttype: Boolean,\n    // \tdefault: false,\n    // });\n    game.settings.register(CONSTANTS.MODULE_ID, \"forceNameSearch\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.forceNameSearch.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.forceNameSearch.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    // game.settings.register(CONSTANTS.MODULE_ID,'hoverTooltip', {\n    //   // name : game.i18n.localize('chat-portrait.settings.hoverTooltip.name'),\n    //   // hint : game.i18n.localize('chat-portrait.settings.hoverTooltip.hint'),\n    //   scope : 'world',\n    //   config : false,\n    //   type : Boolean,\n    //   default : false,\n    //   onChange: value => { ChatLink.updateSettings(); }\n    // });\n    game.settings.register(CONSTANTS.MODULE_ID, \"textSizeName\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.textSizeName.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.textSizeName.hint`,\n        scope: \"client\",\n        config: true,\n        type: Number,\n        default: 0,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"displayMessageTag\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.displayMessageTag.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.displayMessageTag.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    // game.settings.register(CONSTANTS.MODULE_ID, \"displayMessageTagNextToName\", {\n    // \tname: `${CONSTANTS.MODULE_ID}.settings.displayMessageTagNextToName.name`,\n    // \thint: `${CONSTANTS.MODULE_ID}.settings.displayMessageTagNextToName.hint`,\n    // \tscope: \"client\",\n    // \tconfig: true,\n    // \ttype: Boolean,\n    // \tdefault: false,\n    // });\n    game.settings.register(CONSTANTS.MODULE_ID, \"useImageReplacer\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.useImageReplacer.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.useImageReplacer.hint`,\n        scope: \"world\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"useImageReplacerDamageType\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.useImageReplacerDamageType.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.useImageReplacerDamageType.hint`,\n        scope: \"world\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"imageReplacerDamageType\", {\n        name: `${CONSTANTS.MODULE_ID}.setting.imageReplacerDamageType.name`,\n        hint: `${CONSTANTS.MODULE_ID}.setting.imageReplacerDamageType.hint`,\n        scope: \"world\",\n        config: false,\n        default: SYSTEMS.DATA ? SYSTEMS.DATA.imageReplacerDamageType : [],\n        type: Array,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"imageReplacerWeaponProperties\", {\n        name: `${CONSTANTS.MODULE_ID}.setting.imageReplacerWeaponProperties.name`,\n        hint: `${CONSTANTS.MODULE_ID}.setting.imageReplacerWeaponProperties.hint`,\n        scope: \"world\",\n        config: false,\n        default: SYSTEMS.DATA ? SYSTEMS.DATA.imageReplacerWeaponProperties : [],\n        type: Array,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"imageReplacerIconizer\", {\n        name: `${CONSTANTS.MODULE_ID}.setting.imageReplacerIconizer.name`,\n        hint: `${CONSTANTS.MODULE_ID}.setting.imageReplacerIconizer.hint`,\n        scope: \"world\",\n        config: false,\n        default: SYSTEMS.DATA ? SYSTEMS.DATA.imageReplacerIconizer : [],\n        type: Array,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"applyOnCombatTracker\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.applyOnCombatTracker.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.applyOnCombatTracker.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    // game.settings.register(CONSTANTS.MODULE_ID, \"applyPreCreateChatMessagePatch\", {\n    // \tname: `${CONSTANTS.MODULE_ID}.settings.applyPreCreateChatMessagePatch.name`,\n    // \thint: `${CONSTANTS.MODULE_ID}.settings.applyPreCreateChatMessagePatch.hint`,\n    // \tscope: \"client\",\n    // \tconfig: true,\n    // \ttype: Boolean,\n    // \tdefault: false,\n    // });\n    game.settings.register(CONSTANTS.MODULE_ID, \"displaySetting\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.displaySetting.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.displaySetting.hint`,\n        scope: \"client\",\n        config: true,\n        default: \"allCards\",\n        type: String,\n        choices: {\n            allCards: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.displaySetting.choice.allCards`),\n            selfAndGM: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.displaySetting.choice.selfAndGM`),\n            self: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.displaySetting.choice.self`),\n            gm: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.displaySetting.choice.gm`),\n            player: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.displaySetting.choice.player`),\n            none: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.displaySetting.choice.none`),\n        },\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"displaySettingOTHER\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.displaySettingOTHER.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.displaySettingOTHER.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: true,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"displaySettingOOC\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.displaySettingOOC.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.displaySettingOOC.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: true,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"displaySettingIC\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.displaySettingIC.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.displaySettingIC.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: true,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"displaySettingEMOTE\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.displaySettingEMOTE.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.displaySettingEMOTE.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: true,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"displaySettingWHISPER\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.displaySettingWHISPER.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.displaySettingWHISPER.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: true,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"displaySettingROLL\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.displaySettingROLL.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.displaySettingROLL.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: true,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"displaySettingWhisperToOther\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.displaySettingWhisperToOther.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.displaySettingWhisperToOther.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    //   game.settings.register(CONSTANTS.MODULE_ID, \"displayUnknown\", {\n    //     name: `${CONSTANTS.MODULE_ID}.settings.displayUnknown.name`,\n    //     hint: `${CONSTANTS.MODULE_ID}.settings.displayUnknown.hint`,\n    //     scope: \"world\",\n    //     config: true,\n    //     default: \"none\",\n    //     type: String,\n    //     choices: {\n    //       allCards: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.displayUnknown.choice.allCards`),\n    //       selfAndGM: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.displayUnknown.choice.selfAndGM`),\n    //       self: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.displayUnknown.choice.self`),\n    //       gm: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.displayUnknown.choice.gm`),\n    //       player: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.displayUnknown.choice.player`),\n    //       none: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.displayUnknown.choice.none`),\n    //       onlyNpc: Logger.i18n(`${CONSTANTS.MODULE_ID}.settings.displayUnknown.choice.onlyNpc`),\n    //     },\n    //   });\n    //   game.settings.register(CONSTANTS.MODULE_ID, \"displayUnknownPlaceHolderActorName\", {\n    //     name: `${CONSTANTS.MODULE_ID}.settings.displayUnknownPlaceHolderActorName.name`,\n    //     hint: `${CONSTANTS.MODULE_ID}.settings.displayUnknownPlaceHolderActorName.hint`,\n    //     scope: \"world\",\n    //     config: true,\n    //     type: String,\n    //     default: \"Unknown Actor\",\n    //   });\n    //   game.settings.register(CONSTANTS.MODULE_ID, \"displayUnknownPlaceHolderItemName\", {\n    //     name: `${CONSTANTS.MODULE_ID}.settings.displayUnknownPlaceHolderItemName.name`,\n    //     hint: `${CONSTANTS.MODULE_ID}.settings.displayUnknownPlaceHolderItemName.hint`,\n    //     scope: \"world\",\n    //     config: true,\n    //     type: String,\n    //     default: \"Unknown Item\",\n    //   });\n    //   game.settings.register(CONSTANTS.MODULE_ID, \"displayUnknownPlaceHolderItemIcon\", {\n    //     name: `${CONSTANTS.MODULE_ID}.settings.displayUnknownPlaceHolderItemIcon.name`,\n    //     hint: `${CONSTANTS.MODULE_ID}.settings.displayUnknownPlaceHolderItemIcon.hint`,\n    //     scope: \"world\",\n    //     config: true,\n    //     type: String,\n    //     default: `modules/${CONSTANTS.MODULE_ID}/assets/inv-unidentified.png`,\n    //   });\n\n    // game.settings.register(CONSTANTS.MODULE_ID, 'customStylingMessageSystem', {\n    //   name: `${CONSTANTS.MODULE_ID}.settings.customStylingMessageSystem.name`,\n    //   hint: `${CONSTANTS.MODULE_ID}.settings.customStylingMessageSystem.hint`,\n    //   scope: 'client',\n    //   config: true,\n    //   type: Boolean,\n    //   default: true,\n    // });\n    game.settings.register(CONSTANTS.MODULE_ID, \"customStylingMessageText\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.customStylingMessageText.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.customStylingMessageText.hint`,\n        scope: \"client\",\n        config: true,\n        type: String,\n        default: \"\",\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"customStylingMessageImage\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.customStylingMessageImage.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.customStylingMessageImage.hint`,\n        scope: \"client\",\n        config: true,\n        type: String,\n        default: \"\",\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"disablePortraitForAliasGmMessage\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.disablePortraitForAliasGmMessage.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.disablePortraitForAliasGmMessage.hint`,\n        scope: \"world\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"setUpPortraitForAliasGmMessage\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.setUpPortraitForAliasGmMessage.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.setUpPortraitForAliasGmMessage.hint`,\n        scope: \"world\",\n        config: true,\n        type: String,\n        default: \"\",\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"enableSpeakingAs\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.enableSpeakingAs.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.enableSpeakingAs.hint`,\n        scope: \"client\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"speakingAsWarningCharacters\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.speakingAsWarningCharacters.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.speakingAsWarningCharacters.hint`,\n        scope: \"client\",\n        config: true,\n        type: String,\n        default: '\".+\"',\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"enableSpeakAs\", {\n        name: `${CONSTANTS.MODULE_ID}.settings.enableSpeakAs.name`,\n        hint: `${CONSTANTS.MODULE_ID}.settings.enableSpeakAs.hint`,\n        scope: \"world\",\n        config: true,\n        type: Boolean,\n        default: false,\n    });\n    // ========================================================================\n    game.settings.register(CONSTANTS.MODULE_ID, \"debug\", {\n        name: `${CONSTANTS.MODULE_ID}.setting.debug.name`,\n        hint: `${CONSTANTS.MODULE_ID}.setting.debug.hint`,\n        scope: \"world\",\n        config: true,\n        default: false,\n        type: Boolean,\n    });\n    // game.settings.register(CONSTANTS.MODULE_ID, 'debugHooks', {\n    //   scope: 'world',\n    //   config: false,\n    //   default: false,\n    //   type: Boolean,\n    // });\n    game.settings.register(CONSTANTS.MODULE_ID, \"systemFound\", {\n        scope: \"world\",\n        config: false,\n        default: false,\n        type: Boolean,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"systemNotFoundWarningShown\", {\n        scope: \"world\",\n        config: false,\n        default: false,\n        type: Boolean,\n    });\n    game.settings.register(CONSTANTS.MODULE_ID, \"preconfiguredSystem\", {\n        name: `${CONSTANTS.MODULE_ID}.setting.preconfiguredSystem.name`,\n        hint: `${CONSTANTS.MODULE_ID}.setting.preconfiguredSystem.hint`,\n        scope: \"world\",\n        config: false,\n        default: false,\n        type: Boolean,\n    });\n};\nclass ResetSettingsDialog extends FormApplication {\n    constructor(...args) {\n        //\n        super(...args);\n        //\n        return new Dialog({\n            title: game.i18n.localize(`${CONSTANTS.MODULE_ID}.dialogs.resetsettings.title`),\n            content:\n                '<p style=\"margin-bottom:1rem;\">' +\n                game.i18n.localize(`${CONSTANTS.MODULE_ID}.dialogs.resetsettings.content`) +\n                \"</p>\",\n            buttons: {\n                confirm: {\n                    icon: '<i class=\"fas fa-check\"></i>',\n                    label: game.i18n.localize(`${CONSTANTS.MODULE_ID}.dialogs.resetsettings.confirm`),\n                    callback: async () => {\n                        const worldSettings = game.settings.storage\n                            ?.get(\"world\")\n                            ?.filter((setting) => setting.key.startsWith(`${CONSTANTS.MODULE_ID}.`));\n                        for (let setting of worldSettings) {\n                            Logger.log(`Reset setting '${setting.key}'`);\n                            await setting.delete();\n                        }\n                        //window.location.reload();\n                    },\n                },\n                cancel: {\n                    icon: '<i class=\"fas fa-times\"></i>',\n                    label: game.i18n.localize(`${CONSTANTS.MODULE_ID}.dialogs.resetsettings.cancel`),\n                },\n            },\n            default: \"cancel\",\n        });\n    }\n    async _updateObject(event, formData) {\n        // do nothing\n    }\n}\n","import CONSTANTS from \"./constants.js\";\nexport const preloadTemplates = async function () {\n    const templatePaths = [\n        // Add paths to \"module/XXX/templates\"\n        //`modules/${MODULE_ID}/templates/XXX.html`,\n        `modules/${CONSTANTS.MODULE_ID}/templates/chat-portrait-form.html`,\n        // `modules/${CONSTANTS.MODULE_ID}/templates/instructions.html`,\n    ];\n    return loadTemplates(templatePaths);\n};\n","import { ChatPortrait } from \"./ChatPortrait.js\";\nimport CONSTANTS from \"./constants.js\";\nimport Logger from \"./lib/Logger.js\";\n\nexport class ChatLink {\n    static init() {\n        ChatLink.updateSettings();\n    }\n    static updateSettings() {\n        ChatLink.showTooltip = game.settings.get(CONSTANTS.MODULE_ID, \"hoverTooltip\");\n    }\n    static prepareEvent(message, html, speakerInfo, gameSystemId) {\n        // let clickable = html.find('.chat-card'); // message-sender\n        // if(!clickable){\n        //     clickable = html.find('.message-sender');\n        // }\n        const clickable = html.find(`.chat-portrait-message-portrait-${gameSystemId}`);\n        if (!clickable) {\n            // Ignored some system as strange behavior\n            return;\n        }\n        const speaker = speakerInfo.message ? speakerInfo.message.speaker : speakerInfo;\n        if (!(speaker.actor || speaker.token)) {\n            return;\n        }\n        // Removed 4535992 just a bug i can avoid to manage\n        //ChatLink.formatLink(clickable);\n        const speakerName =\n            clickable[0]?.textContent ?? speaker.alias ?? ChatLink.i18n(CONSTANTS.MODULE_ID + \".genericName\");\n        const speakerData = {\n            idScene: speaker.scene,\n            idActor: speaker.actor,\n            idToken: speaker.token,\n            name: speakerName,\n        };\n        if (!speakerData.idScene) {\n            if (speakerInfo.author) {\n                speakerData.idScene = speakerInfo.author.viewedScene;\n            } else {\n                speakerData.idScene = game.scenes?.current?.id;\n            }\n        }\n        clickable.hover((event) => {\n            ChatLink.hoverIn(event, speaker);\n        }, ChatLink.hoverOut);\n        clickable.dblclick((event) => ChatLink.panToToken(speakerData));\n        // function clicks(e, speakerData) {\n        //     ChatLink.clickCount++;\n        //     if (ChatLink.clickCount == 1) {\n        //         ChatLink.clickTimer = setTimeout(() => {\n        //             ChatLink.clickCount = 0;\n        //             ChatLink.selectToken(e, speakerData);\n        //         }, ChatLink.clickTimeout);\n        //     } else {\n        //         ChatLink.clickCount = 0;\n        //         clearTimeout(ChatLink.clickTimer);\n        //         ChatLink.panToToken(speakerData);\n        //     }\n        // }\n        // clickable.on('click', (e) => {\n        //     clicks(e, speakerData)\n        // }).on('dblclick', (e) => {\n        //     e.preventDefault();\n        // });\n    }\n    static prepareEventImage(message, html, speakerInfo, gameSystemId) {\n        const clickable = html.find(`.chat-portrait-message-portrait-${gameSystemId}`);\n        const speaker = speakerInfo.message ? speakerInfo.message.speaker : speakerInfo;\n        if (!(speaker.actor || speaker.token)) {\n            return;\n        }\n        // Removed 4535992 just a bug i can avoid to manage\n        //ChatLink.formatLink(clickable);\n        const speakerName =\n            clickable[0]?.textContent ?? speaker.alias ?? ChatLink.i18n(CONSTANTS.MODULE_ID + \".genericName\");\n        const speakerData = {\n            idScene: speaker.scene,\n            idActor: speaker.actor,\n            idToken: speaker.token,\n            name: speakerName,\n        };\n        if (!speakerData.idScene) {\n            if (speakerInfo.author) {\n                speakerData.idScene = speakerInfo.author.viewedScene;\n            } else {\n                speakerData.idScene = game.scenes?.current?.id;\n            }\n        }\n        clickable.hover((event) => {\n            ChatLink.hoverIn(event, speaker);\n        }, ChatLink.hoverOut);\n        clickable.dblclick((event) => ChatLink.panToToken(speakerData));\n        // function clicks(e, speakerData) {\n        //     ChatLink.clickCount++;\n        //     if (ChatLink.clickCount == 1) {\n        //         ChatLink.clickTimer = setTimeout(() => {\n        //             ChatLink.clickCount = 0;\n        //             ChatLink.selectToken(e, speakerData);\n        //         }, ChatLink.clickTimeout);\n        //     } else {\n        //         ChatLink.clickCount = 0;\n        //         clearTimeout(ChatLink.clickTimer);\n        //         ChatLink.panToToken(speakerData);\n        //     }\n        // }\n        // clickable.on('click', (e) => {\n        //     clicks(e, speakerData)\n        // }).on('dblclick', (e) => {\n        //     e.preventDefault();\n        // });\n    }\n    // If it's reached this far, assume scene is correct.\n    static panToToken(speakerData) {\n        const user = game.user;\n        const token = ChatLink.getToken(speakerData);\n        if (!ChatLink.tokenExists(user, speakerData, token)) {\n            return;\n        }\n        if (!ChatLink.permissionToSee(user, speakerData, token)) {\n            return;\n        }\n        ChatLink.doPanToToken(user, token);\n    }\n    static selectToken(event, speakerData) {\n        const user = game.user;\n        const token = ChatLink.getToken(speakerData);\n        if (!ChatLink.tokenExists(user, speakerData, token)) return;\n        if (!ChatLink.permissionToSee(user, speakerData, token)) return;\n        ChatLink.doSelectToken(event, user, token);\n    }\n    static getToken(speakerData) {\n        let token = canvas.tokens?.placeables.find((t) => t.id === speakerData.idToken);\n        if (!token) token = canvas.tokens?.placeables.find((t) => t.actor?.id === speakerData.idActor);\n        return token;\n    }\n    static tokenExists(user, speakerData, token) {\n        if (token && token.visible) {\n            return true;\n        }\n        if (!ChatLink.isRightScene(user, speakerData)) {\n            return false;\n        }\n        const message = user.isGM\n            ? ChatLink.playerWarning(speakerData) + ` ${ChatLink.i18n(CONSTANTS.MODULE_ID + \".noTokenFound\")}`\n            : ChatLink.playerWarning(speakerData);\n        ChatLink.warning(message);\n        return false;\n    }\n    static isRightScene(user, speakerData) {\n        if (canvas.scene?.id === speakerData.idScene) {\n            return true;\n        }\n        let sceneNote;\n        if (!speakerData.idScene) {\n            sceneNote = ` ${ChatLink.i18n(CONSTANTS.MODULE_ID + \".noSceneFound\")}`;\n        } else {\n            const tokenScene = game.scenes?.find((s) => s.id === speakerData.idScene);\n            sceneNote = ` ${ChatLink.i18nFormat(CONSTANTS.MODULE_ID + \".checkScene\", {\n                sceneName: tokenScene?.name,\n            })}`;\n        }\n        const message = user.isGM\n            ? ChatLink.playerWarning(speakerData) + sceneNote\n            : ChatLink.playerWarning(speakerData);\n        ChatLink.warning(message);\n        return false;\n    }\n    static permissionToSee(user, speakerData, token) {\n        if (user.isGM || token.visible) {\n            return true;\n        }\n        ChatLink.warning(ChatLink.playerWarning(speakerData));\n        return false;\n    }\n    static permissionToControl(user, token) {\n        // return user.isGM || token.actor?.hasPerm(user, 'OWNER');\n        return user.isGM || token.actor?.hasPlayerOwner;\n    }\n    static doSelectToken(event, user, token) {\n        const ctrlKey = event.ctrlKey;\n        if (!ChatLink.permissionToControl(user, token)) {\n            ChatLink.targetToken(event, user, token, ctrlKey);\n            return;\n        }\n        const shiftKey = event.shiftKey;\n        if (shiftKey) {\n            ChatLink.targetToken(event, user, token, ctrlKey);\n        } else {\n            ChatLink.controlToken(event, user, token, ctrlKey);\n        }\n    }\n    static doPanToToken(user, token) {\n        //\n        const scale = canvas.scene?._viewPosition.scale;\n        canvas.animatePan({ x: token.x, y: token.y, scale: scale, duration: 500 });\n        if (token && token.isVisible) {\n            canvas.animatePan({ ...token.center, duration: 250 });\n        }\n    }\n    static controlToken(event, user, token, ctrlKey) {\n        const releaseOthers = { releaseOthers: !ctrlKey };\n        if (ctrlKey) {\n            if (token._controlled) token.release();\n            else token.control(releaseOthers);\n            return;\n        }\n        if (token._controlled || canvas.tokens?.controlled.length !== 1) token.control(releaseOthers);\n        else if (!token._controlled && canvas.tokens?.controlled.length === 1) token.control(releaseOthers);\n        else token.release();\n    }\n    static targetToken(event, user, token, ctrlKey) {\n        const releaseOthers = { releaseOthers: !ctrlKey };\n        if (ctrlKey) {\n            if (token.isTargeted) token.setTarget(false, releaseOthers);\n            else token.setTarget(true, releaseOthers);\n            return;\n        }\n        if (token.isTargeted && game.user?.targets.size !== 1) token.setTarget(true, releaseOthers);\n        else if (token.isTargeted && game.user?.targets.size === 1) token.setTarget(false, releaseOthers);\n        else token.setTarget(true, releaseOthers);\n    }\n    static getCoords(token) {\n        const result = { x: token.center.x, y: token.center.y, width: 1, height: 1 };\n        return result;\n    }\n    static warning(message) {\n        Logger.warn(message, true);\n    }\n}\nChatLink.clickTimeout = 250;\nChatLink.clickCount = 0;\nChatLink.playerWarning = (data) => ChatLink.i18nFormat(CONSTANTS.MODULE_ID + \".notInSight\", data);\nChatLink.showTooltip = true;\nChatLink.hoverTimeout = 1000;\nChatLink.hoverTimer = null;\nChatLink.i18n = (toTranslate) => game.i18n.localize(toTranslate);\nChatLink.i18nFormat = (toTranslate, data) => game.i18n.format(toTranslate, data);\nChatLink.hoverIn = (event, speaker) => {\n    const token = ChatPortrait.getTokenFromSpeaker(speaker);\n    if (token && token.visible) {\n        event.fromChat = true;\n        //\n        if (token._object) {\n            //\n            token._object._onHoverIn(event);\n            ChatLink.lastHoveredToken = token;\n        } else {\n            // Bug fix : https://github.com/p4535992/foundryvtt-chat-portrait/issues/35\n            //   Logger.warn(`Can't hover in the chat portrait of the token '${token}'`);\n        }\n    }\n};\nChatLink.hoverOut = (event) => {\n    //\n    if (ChatLink.lastHoveredToken && ChatLink.lastHoveredToken._hover) {\n        event.fromChat = true;\n        //\n        ChatLink.lastHoveredToken._onHoverOut(event);\n        ChatLink.lastHoveredToken = null;\n    }\n};\n// export class TooltipHelper {\n//     static getContent() {\n//         let tips = game.user.isGM ? TooltipHelper.gmTips() : TooltipHelper.playerTips();\n//         let tooltipData = {\n//             title: game.i18n.localize(CONSTANTS.MODULE_ID+\".instructionsTitle\"),\n//             tips: tips\n//         }\n//         //let template = Handlebars.compile(`{{> modules/${CONSTANTS.MODULE_ID}/templates/instructions.html}}`);\n//         let template = Handlebars.compile(`{{> modules/${CONSTANTS.MODULE_ID}/templates/instructions.hbs }}`);\n//         let content = template(tooltipData);\n//         return content;\n//     }\n//     static gmTips() {\n//         return [\n//             game.i18n.localize(CONSTANTS.MODULE_ID+\".gmClick\"),\n//             game.i18n.localize(CONSTANTS.MODULE_ID+\".shiftClick\"),\n//             game.i18n.localize(CONSTANTS.MODULE_ID+\".doubleClick\"),\n//             game.i18n.localize(CONSTANTS.MODULE_ID+\".gmCtrlClick\"),\n//             game.i18n.localize(CONSTANTS.MODULE_ID+\".gmCtrlShiftClick\")\n//         ]\n//     }\n//     static playerTips() {\n//         return [\n//             game.i18n.localize(CONSTANTS.MODULE_ID+\".playerClick\"),\n//             game.i18n.localize(CONSTANTS.MODULE_ID+\".shiftClick\"),\n//             game.i18n.localize(CONSTANTS.MODULE_ID+\".doubleClick\"),\n//             game.i18n.localize(CONSTANTS.MODULE_ID+\".playerCtrlClick\"),\n//             game.i18n.localize(CONSTANTS.MODULE_ID+\".playerCtrlShiftClick\")\n//         ]\n//     }\n// }\n","import CONSTANTS from \"./constants.js\";\n/**\n * Provides functionality for interaction with module settings\n */\nexport class SettingsForm {\n    //#region getters and setters\n    // static getBorderShapeList() {\n    //     return game.settings.get(MODULE_ID, 'borderShapeList');\n    // }\n    static getDisableChatPortrait() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"disableChatPortrait\");\n    }\n    static setDisableChatPortrait(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"disableChatPortrait\", value);\n    }\n    static getUseTokenImage() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"useTokenImage\");\n    }\n    static setUseTokenImage(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"useTokenImage\", value);\n    }\n    static getDoNotUseTokenImageWithSpecificType() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"doNotUseTokenImageWithSpecificType\");\n    }\n    static setDoNotUseTokenImageWithSpecificType(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"doNotUseTokenImageWithSpecificType\", value);\n    }\n    static getUseTokenName() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"useTokenName\");\n    }\n    static setUseTokenName(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"useTokenName\", value);\n    }\n    static getPortraitSize() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"portraitSize\");\n    }\n    static setPortraitSize(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"portraitSize\", value);\n    }\n    static getPortraitSizeItem() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"portraitSizeItem\");\n    }\n    static setPortraitSizeItem(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"portraitSizeItem\", value);\n    }\n    static getBorderShape() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"borderShape\");\n    }\n    static setBorderShape(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"borderShape\", value);\n    }\n    static getUseUserColorAsBorderColor() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"useUserColorAsBorderColor\");\n    }\n    static setUseUserColorAsBorderColor(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"useUserColorAsBorderColor\", value);\n    }\n    static getBorderColor() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"borderColor\");\n    }\n    static setBorderColor(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"borderColor\", value);\n    }\n    static getBorderWidth() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"borderWidth\");\n    }\n    static setBorderWidth(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"borderWidth\", value);\n    }\n    static getUseUserColorAsChatBackgroundColor() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"useUserColorAsChatBackgroundColor\");\n    }\n    static setUseUserColorAsChatBackgroundColor(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"useUserColorAsChatBackgroundColor\", value);\n    }\n    static getUseUserColorAsChatBorderColor() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"useUserColorAsChatBorderColor\");\n    }\n    static setUseUserColorAsChatBorderColor(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"useUserColorAsChatBorderColor\", value);\n    }\n    // static getFlavorNextToPortrait() {\n    // \treturn <boolean>game.settings.get(CONSTANTS.MODULE_ID, \"flavorNextToPortrait\");\n    // }\n    // static setFlavorNextToPortrait(value: boolean) {\n    // \tgame.settings.set(CONSTANTS.MODULE_ID, \"flavorNextToPortrait\", value);\n    // }\n    static getForceNameSearch() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"forceNameSearch\");\n    }\n    static setForceNameSearch(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"forceNameSearch\", value);\n    }\n    // static getHoverTooltip() {\n    //     return <boolean>game.settings.get(CONSTANTS.MODULE_ID, 'hoverTooltip');\n    // }\n    // static setHoverTooltip(value:boolean) {\n    //     game.settings.set(CONSTANTS.MODULE_ID,'hoverTooltip',value);\n    // }\n    static getTextSizeName() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"textSizeName\");\n    }\n    static setTextSizeName(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"textSizeName\", value);\n    }\n    static getDisplaySetting() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"displaySetting\");\n    }\n    static setDisplaySetting(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"displaySetting\", value);\n    }\n    static getUseAvatarImage() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"useAvatarImage\");\n    }\n    static setUseAvatarImage(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"useAvatarImage\", value);\n    }\n    static getDisplayPlayerName() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"displayPlayerName\");\n    }\n    static setDisplayPlayerName(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"displayPlayerName\", value);\n    }\n    //   static getDisplayUnknown() {\n    //     return game.settings.get(CONSTANTS.MODULE_ID, \"displayUnknown\");\n    //   }\n    //   static setDisplayUnknown(value) {\n    //     game.settings.set(CONSTANTS.MODULE_ID, \"displayUnknown\", value);\n    //   }\n    //   static getDisplayUnknownPlaceHolderActorName() {\n    //     return game.settings.get(CONSTANTS.MODULE_ID, \"displayUnknownPlaceHolderActorName\");\n    //   }\n    //   static setDisplayUnknownPlaceHolderActorName(value) {\n    //     game.settings.set(CONSTANTS.MODULE_ID, \"displayUnknownPlaceHolderActorName\", value);\n    //   }\n    //   static getDisplayUnknownPlaceHolderItemName() {\n    //     return game.settings.get(CONSTANTS.MODULE_ID, \"displayUnknownPlaceHolderItemName\");\n    //   }\n    //   static setDisplayUnknownPlaceHolderItemName(value) {\n    //     game.settings.set(CONSTANTS.MODULE_ID, \"displayUnknownPlaceHolderItemName\", value);\n    //   }\n    //   static getDisplayUnknownPlaceHolderItemIcon() {\n    //     return game.settings.get(CONSTANTS.MODULE_ID, \"displayUnknownPlaceHolderItemIcon\");\n    //   }\n    //   static setDisplayUnknownPlaceHolderItemIcon(value) {\n    //     game.settings.set(CONSTANTS.MODULE_ID, \"displayUnknownPlaceHolderItemIcon\", value);\n    //   }\n    static getDisplaySettingOTHER() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"displaySettingOTHER\");\n    }\n    static setDisplaySettingOTHER(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"displaySettingOTHER\", value);\n    }\n    static getDisplaySettingOOC() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"displaySettingOOC\");\n    }\n    static setDisplaySettingOOC(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"displaySettingOOC\", value);\n    }\n    static getDisplaySettingIC() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"displaySettingIC\");\n    }\n    static setDisplaySettingIC(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"displaySettingIC\", value);\n    }\n    static getDisplaySettingEMOTE() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"displaySettingEMOTE\");\n    }\n    static setDisplaySettingEMOTE(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"displaySettingEMOTE\", value);\n    }\n    static getDisplaySettingWHISPER() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"displaySettingWHISPER\");\n    }\n    static setDisplaySettingWHISPER(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"displaySettingWHISPER\", value);\n    }\n    static getDisplaySettingROLL() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"displaySettingROLL\");\n    }\n    static setDisplaySettingROLL(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"displaySettingROLL\", value);\n    }\n    static getDisplaySettingWhisperToOther() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"displaySettingWhisperToOther\");\n    }\n    static setDisplaySettingWhisperToOther(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"displaySettingWhisperToOther\", value);\n    }\n    // static getCustomStylingMessageSystem() {\n    //   return <boolean>game.settings.get(CONSTANTS.MODULE_ID, 'customStylingMessageSystem');\n    // }\n    // static setCustomStylingMessageSystem(value: boolean) {\n    //   game.settings.set(CONSTANTS.MODULE_ID, 'customStylingMessageSystem', value);\n    // }\n    static getCustomStylingMessageText() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"customStylingMessageText\");\n    }\n    static setCustomStylingMessageText(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"customStylingMessageText\", value);\n    }\n    static getCustomStylingMessageImage() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"customStylingMessageImage\");\n    }\n    static setCustomStylingMessageImage(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"customStylingMessageImage\", value);\n    }\n    static getDisplayMessageTag() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"displayMessageTag\");\n    }\n    static setDisplayMessageTag(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"displayMessageTag\", value);\n    }\n    // static getDisplayMessageTagNextToName() {\n    // \treturn <boolean>game.settings.get(CONSTANTS.MODULE_ID, \"displayMessageTagNextToName\");\n    // }\n    // static setDisplayMessageTagNextToName(value: boolean) {\n    // \tgame.settings.set(CONSTANTS.MODULE_ID, \"displayMessageTagNextToName\", value);\n    // }\n    static getUseImageReplacer() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"useImageReplacer\");\n    }\n    static setUseImageReplacer(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"useImageReplacer\", value);\n    }\n    static getUseImageReplacerDamageType() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"useImageReplacerDamageType\");\n    }\n    static setUseImageReplacerDamageType(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"useImageReplacerDamageType\", value);\n    }\n    static getApplyOnCombatTracker() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"applyOnCombatTracker\");\n    }\n    static setApplyOnCombatTracker(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"applyOnCombatTracker\", value);\n    }\n    // static getApplyPreCreateChatMessagePatch() {\n    // \treturn <boolean>game.settings.get(CONSTANTS.MODULE_ID, \"applyPreCreateChatMessagePatch\");\n    // }\n    // static setApplyPreCreateChatMessagePatch(value: boolean) {\n    // \tgame.settings.set(CONSTANTS.MODULE_ID, \"applyPreCreateChatMessagePatch\", value);\n    // }\n    static getDisablePortraitForAliasGmMessage() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"disablePortraitForAliasGmMessage\");\n    }\n    static setDisablePortraitForAliasGmMessage(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"disablePortraitForAliasGmMessage\", value);\n    }\n    static getSetUpPortraitForAliasGmMessage() {\n        return game.settings.get(CONSTANTS.MODULE_ID, \"setUpPortraitForAliasGmMessage\");\n    }\n    static setSetUpPortraitForAliasGmMessage(value) {\n        game.settings.set(CONSTANTS.MODULE_ID, \"setUpPortraitForAliasGmMessage\", value);\n    }\n}\n","export class ImageReplacerData {\n    constructor() {\n        this.iconMainReplacer = \"\";\n        this.iconsDamageType = [];\n    }\n}\nexport class ChatPortraitCustomData {\n    constructor() {\n        this.customIconPortraitImage = \"\";\n    }\n}\nexport class ImageReplaceVoiceData {}\n","import CONSTANTS from \"./constants.js\";\nimport Logger from \"./lib/Logger.js\";\nimport { SYSTEMS } from \"./systems.js\";\nconst API = {\n    /**\n     * The attributes used to track dynamic attributes in this system\n     *\n     * @returns {array}\n     */\n    get imageReplacerDamageType() {\n        let arr = game.settings.get(CONSTANTS.MODULE_ID, \"imageReplacerDamageType\") || [];\n        if (arr.length <= 0) {\n            arr = SYSTEMS.DATA?.imageReplacerDamageType;\n        }\n        return arr;\n    },\n    /**\n     * Sets the inAttribute used to track the passive perceptions in this system\n     *\n     * @param {String} inAttribute\n     * @returns {Promise}\n     */\n    async setImageReplacerDamageType(inAttribute) {\n        if (typeof inAttribute !== \"string\") {\n            throw Logger.error(\"setImageReplacerDamageType | inAttribute must be of type string\");\n        }\n        await game.settings.set(CONSTANTS.MODULE_ID, \"preconfiguredSystem\", true);\n        return game.settings.set(CONSTANTS.MODULE_ID, \"imageReplacerDamageType\", inAttribute);\n    },\n    /**\n     * The attributes used to track dynamic attributes in this system\n     *\n     * @returns {array}\n     */\n    get imageReplacerWeaponProperties() {\n        let arr = game.settings.get(CONSTANTS.MODULE_ID, \"imageReplacerWeaponProperties\") || [];\n        if (arr.length <= 0) {\n            arr = SYSTEMS.DATA?.imageReplacerWeaponProperties;\n        }\n        return arr;\n    },\n    /**\n     * Sets the inAttribute used to track the passive perceptions in this system\n     *\n     * @param {String} inAttribute\n     * @returns {Promise}\n     */\n    async setImageReplacerWeaponProperties(inAttribute) {\n        if (typeof inAttribute !== \"string\") {\n            throw error(\"setImageReplacerWeaponProperties | inAttribute must be of type string\");\n        }\n        await game.settings.set(CONSTANTS.MODULE_ID, \"preconfiguredSystem\", true);\n        return game.settings.set(CONSTANTS.MODULE_ID, \"imageReplacerWeaponProperties\", inAttribute);\n    },\n    /**\n     * The attributes used to track dynamic attributes in this system\n     *\n     * @returns {array}\n     */\n    get imageReplacerIconizer() {\n        let arr = game.settings.get(CONSTANTS.MODULE_ID, \"imageReplacerIconizer\") || [];\n        if (arr.length <= 0) {\n            arr = SYSTEMS.DATA?.imageReplacerIconizer;\n        }\n        return arr;\n    },\n    /**\n     * Sets the inAttribute used to track the passive perceptions in this system\n     *\n     * @param {String} inAttribute\n     * @returns {Promise}\n     */\n    async setImageReplacerIconizer(inAttribute) {\n        if (typeof inAttribute !== \"string\") {\n            throw error(\"setImageReplacerIconizer | inAttribute must be of type string\");\n        }\n        await game.settings.set(CONSTANTS.MODULE_ID, \"preconfiguredSystem\", true);\n        return game.settings.set(CONSTANTS.MODULE_ID, \"imageReplacerIconizer\", inAttribute);\n    },\n    retrieveSystemId() {\n        const sys = SYSTEMS.DATA?.SYSTEM_ID;\n        if (sys && game.system.id === sys) {\n            return sys;\n        } else {\n            return \"generic\";\n        }\n    },\n};\nexport default API;\n","import { ChatLink } from \"./Chatlink.js\";\nimport { SettingsForm } from \"./settings-form.js\";\nimport { ImageReplacerData } from \"./ChatPortraitModels.js\";\nimport CONSTANTS from \"./constants.js\";\nimport API from \"./api.js\";\nimport Logger from \"./lib/Logger.js\";\n/**\n * Main class wrapper for all of our features.\n */\nexport class ChatPortrait {\n    /**\n     * @param  {ChatMessage} chatMessage\n     * @param  {JQuery} html\n     * @param  {MessageRenderData} messageData\n     */\n    static onRenderChatMessage(chatMessage, html, speakerInfo, imageReplacer) {\n        let doNotStyling = false;\n        let doNotPrintPortrait = false;\n        let doOnlyPortrait = false;\n        const gameSystemId = API.retrieveSystemId();\n        // PATCH Compatibility with DF Chat Enhancements module\n        // multiple portrait when chat merged by DF Chat Enhancements\n        const elementMessageHeaderBySystem1 = html.find(`chat-portrait-message-header-${gameSystemId}`);\n        // TODO TO REMOVE\n        const elementMessageHeaderBySystem2 = html.find(`chat-portrait-message-portrait-${gameSystemId}`);\n        // TODO TO REMOVE\n        const elementMessageHeaderBySystem3 = html.find(`chat-portrait-message-portrait`);\n        if (\n            elementMessageHeaderBySystem1?.length > 0 ||\n            elementMessageHeaderBySystem2?.length > 0 ||\n            elementMessageHeaderBySystem3?.length > 0\n        ) {\n            return undefined;\n        }\n        // PreHook (can abort the interaction with the door)\n        if (Hooks.call(\"ChatPortraitEnabled\", chatMessage, html, speakerInfo) === false) {\n            return html;\n        }\n        if (!ChatPortrait.shouldOverrideMessageStyling(speakerInfo)) {\n            // Do not style this\n            doNotStyling = true;\n        }\n        if (!ChatPortrait.settings.displaySettingWhisperToOther && ChatPortrait.isWhisperToOther(speakerInfo)) {\n            // Don't update whispers that the current player isn't privy to\n            doNotStyling = true;\n        }\n        const messageType = ChatPortrait.getMessageTypeVisible(speakerInfo);\n        if (!ChatPortrait.settings.displaySettingOTHER && messageType == CONST.CHAT_MESSAGE_STYLES.OTHER) {\n            doNotStyling = true;\n        }\n        if (!ChatPortrait.settings.displaySettingOOC && messageType == CONST.CHAT_MESSAGE_STYLES.OOC) {\n            doNotStyling = true;\n        }\n        if (!ChatPortrait.settings.displaySettingIC && messageType == CONST.CHAT_MESSAGE_STYLES.IC) {\n            doNotStyling = true;\n        }\n        if (!ChatPortrait.settings.displaySettingEMOTE && messageType == CONST.CHAT_MESSAGE_STYLES.EMOTE) {\n            doNotStyling = true;\n        }\n        if (!ChatPortrait.settings.displaySettingWHISPER && messageType == chatMessage.whisper) {\n            doNotStyling = true;\n        }\n        if (!ChatPortrait.settings.displaySettingROLL && messageType == chatMessage.rolls) {\n            doNotStyling = true;\n        }\n        if (ChatPortrait.settings.disablePortraitForAliasGmMessage) {\n            const userByAlias = game.users?.find((u) => {\n                return (speakerInfo.alias === u.name || speakerInfo.author.name === u.name) && u?.isGM;\n            });\n            if (userByAlias) {\n                doNotStyling = true;\n            }\n        }\n        // PATCH MODULE NARRATOR TOOLS\n        // Do not styling narrator message because it's make no sense the module has is own css customizing\n        if (speakerInfo.alias == Logger.i18n(\"NT.Narrator\")) {\n            //  && game.modules.get('narrator-tools')?.active\n            return html;\n        }\n        // PATCH MODULE koboldworks-turn-announcer\n        const isTurnAnnouncer = html.find(\".message-content .turn-announcer .portrait\")[0];\n        if (isTurnAnnouncer) {\n            //  && game.modules.get('koboldworks-turn-announcer')?.active\n            const size = ChatPortrait.settings.portraitSize;\n            if (size && size > 0) {\n                isTurnAnnouncer.style.width = size + \"px\";\n                isTurnAnnouncer.style.height = size + \"px\";\n                isTurnAnnouncer.style.flex = \"0 0 \" + size + \"px\";\n            }\n            doNotStyling = true;\n        }\n        // PATCH MODULE TOKEN BAR  - IS MONK TOKEN BAR XP\n        const isMonkTokenBarXP = html.find(\".message-content\")[0]?.firstElementChild?.classList;\n        if (isMonkTokenBarXP && isMonkTokenBarXP.length > 0) {\n            if (isMonkTokenBarXP.contains(\"monks-tokenbar\") && \"assignxp\") {\n                doNotStyling = true;\n            }\n        }\n        // PATCH IRON MONK LITTLE UTILITIES ROUND UP MESSAGE\n        const isMonkLittleUtilitiesRoundUp = foundry.utils.getProperty(\n            chatMessage,\n            `flags.monks-little-details.roundmarker`,\n        );\n        if (String(isMonkLittleUtilitiesRoundUp) === \"true\") {\n            doNotStyling = true;\n        }\n        // PATCH IRON MONK SHOP ACTION\n        const isMonkEnhancedJournal = foundry.utils.getProperty(chatMessage, `flags.monks-enhanced-journal.action`);\n        if (isMonkEnhancedJournal) {\n            doOnlyPortrait = true;\n        }\n        // PATCH MODULE CHAT IMAGE\n        const isChatImage = html.find(\".message-content .chat-images-container img\")[0];\n        if (isChatImage) {\n            isChatImage.style.width = \"100%\";\n            isChatImage.style.height = \"100%\";\n            doNotStyling = true;\n        }\n        // PATCH INNOCENTI LOOT\n        const isInnocentiLoot = html.find(\".message-content .innocenti-loot\")[0];\n        if (isInnocentiLoot) {\n            doNotStyling = true;\n        }\n        // PATCH MONK UTILTIIES ROUND UP (https://github.com/ShoyuVanilla/FoundryVTT-Chat-Portrait/issues/121)\n        const isMonkRoundup = html.find(\".message-content .round-marker\")[0];\n        if (isMonkRoundup) {\n            doNotStyling = true;\n        }\n        // PATCH DragonFlagon Chat Enhancements\n        let hasTop = false;\n        let hasBottom = false;\n        let hasMiddle = false;\n        if (html[0]?.classList.contains(`dfce-cm-top`)) {\n            hasTop = true;\n        }\n        if (html[0]?.classList.contains(`dfce-cm-middle`)) {\n            hasMiddle = true;\n        }\n        if (html[0]?.classList.contains(`dfce-cm-bottom`)) {\n            hasBottom = true;\n        }\n        if (hasBottom || hasMiddle) {\n            doNotPrintPortrait = true;\n        }\n        // MULTISYSTEM MANAGEMENT\n        let messageSenderElement;\n        let messageHeaderElementBase;\n        let elementItemImageList;\n        let elementItemNameList;\n        let elementItemContentList;\n        let elementItemTextList;\n        messageSenderElement = html.find(\".message-sender\")[0];\n        if (!messageSenderElement) {\n            messageSenderElement = html.find(\".chat-card\")[0];\n        }\n        messageHeaderElementBase = html.find(\".message-header\")[0];\n        if (!messageHeaderElementBase) {\n            messageHeaderElementBase = html.find(\".card-header\")[0];\n        }\n        elementItemImageList = html.find(\".message-content img\");\n        if (!elementItemImageList) {\n            elementItemImageList = html.find(\".card-content img\");\n        }\n        elementItemNameList = html.find(\".message-content h3\");\n        if (!elementItemNameList) {\n            elementItemNameList = html.find(\".card-content h3\");\n        }\n        elementItemContentList = html.find(\".message-content\");\n        if (!elementItemContentList) {\n            elementItemContentList = html.find(\".card-content\");\n        }\n        elementItemTextList = html.find(\".message-header .flavor-text\");\n        if (!elementItemTextList) {\n            elementItemTextList = html.find(\".card-header p\");\n        }\n        if (!elementItemContentList[0]?.innerText) {\n            return html;\n        }\n        if (!elementItemContentList[0]?.innerText.replace(/(\\r\\n|\\r|\\n)/g, \"\").trim()) {\n            return html;\n        }\n\n        if (ChatPortrait.settings.disableChatPortrait) {\n            doNotPrintPortrait = true;\n        }\n\n        if (doNotStyling) {\n            /*\n            const headerImageElement2 = document.createElement(\"header\");\n            headerImageElement2.classList.add(\"message-header\");\n            headerImageElement2.classList.add(\"chat-portrait-flexrow\");\n            if (!headerImageElement2.classList.contains(`chat-portrait-message-content-${gameSystemId}`)) {\n                headerImageElement2.classList.add(`chat-portrait-message-content-${gameSystemId}`);\n            }\n            const messageHeaderElement2 = <HTMLElement>(\n                messageHeaderElementBase.parentElement?.insertBefore(\n                    headerImageElement2,\n                    messageHeaderElementBase.parentElement?.firstChild\n                )\n            );\n            const headerTextElement2 = document.createElement(\"h4\");\n            headerTextElement2.classList.add(\"message-sender\");\n            headerTextElement2.classList.add(`chat-portrait-text-content-name-${gameSystemId}`);\n            messageHeaderElement2.appendChild(headerTextElement2);\n\n            const headerImageElement = document.createElement(\"header\");\n            headerImageElement.classList.add(\"message-header\");\n            headerImageElement.classList.add(\"chat-portrait-flexrow\");\n            if (!headerImageElement.classList.contains(`chat-portrait-message-header-${gameSystemId}`)) {\n                headerImageElement.classList.add(`chat-portrait-message-header-${gameSystemId}`);\n            }\n            const messageHeaderElement = <HTMLElement>(\n                messageHeaderElementBase.parentElement?.insertBefore(\n                    headerImageElement,\n                    messageHeaderElementBase.parentElement?.firstChild\n                )\n            );\n            // Text is transfer to header\n            const headerTextElement = document.createElement(\"h4\");\n            if (messageSenderElement.textContent) {\n                headerTextElement.innerHTML = <string>messageSenderElement.innerHTML;\n            } else {\n                const useTokenName: boolean = ChatPortrait.settings.useTokenName;\n                const speaker = speakerInfo.message.speaker;\n                const actorName = (ChatPortrait.getActorName(speaker) || \"\").trim();\n                const tokenName = (ChatPortrait.getTokenName(speaker) || \"\").trim();\n                if (useTokenName) {\n                    headerTextElement.innerHTML = tokenName;\n                } else {\n                    headerTextElement.innerHTML = actorName;\n                }\n            }\n            headerTextElement.classList.add(\"message-sender\");\n            headerTextElement.classList.add(`chat-portrait-text-header-name-${gameSystemId}`);\n            messageHeaderElement.appendChild(headerTextElement);\n            messageSenderElement.textContent = \"\";\n            */\n            let authorColor = \"black\";\n            if (speakerInfo.author) {\n                authorColor = speakerInfo.author.color;\n            } else {\n                //\n                authorColor = speakerInfo?.user.color;\n            }\n            const messageData = speakerInfo.message;\n            ChatPortrait.setCustomStylingText(html, messageData, authorColor, gameSystemId);\n            ChatPortrait.setChatMessageBackground(html, messageData, authorColor);\n            ChatPortrait.setChatMessageBorder(html, messageData, authorColor);\n            if (ChatPortrait.settings.displayPlayerName) {\n                ChatPortrait.appendPlayerName(\n                    messageHeaderElementBase,\n                    messageSenderElement,\n                    speakerInfo.author,\n                    gameSystemId,\n                );\n            }\n            if (ChatPortrait.settings.displayMessageTag) {\n                ChatPortrait.injectMessageTag(html, speakerInfo, messageHeaderElementBase, gameSystemId);\n                ChatPortrait.injectWhisperParticipants(html, speakerInfo, gameSystemId);\n            }\n            ChatLink.prepareEvent(chatMessage, html, speakerInfo, gameSystemId);\n            return html;\n        } else {\n            //\n            const myPromise = ChatPortrait.onRenderChatMessageInternal(\n                chatMessage,\n                html,\n                speakerInfo,\n                messageSenderElement,\n                messageHeaderElementBase,\n                elementItemImageList,\n                elementItemNameList,\n                elementItemContentList,\n                elementItemTextList,\n                imageReplacer,\n                gameSystemId,\n                doNotPrintPortrait,\n                doOnlyPortrait,\n            );\n            if (myPromise) {\n                myPromise.then((html) => {\n                    return html;\n                });\n            } else {\n                return html;\n            }\n            return undefined;\n        }\n    }\n    /**\n     * @param  {ChatMessage} chatMessage\n     * @param  {JQuery} html\n     * @param  {MessageRenderData} messageData\n     */\n    static onRenderChatMessageInternal(\n        chatMessage,\n        html,\n        speakerInfo,\n        messageSender,\n        messageHeaderBase,\n        elementItemImageList,\n        elementItemNameList,\n        elementItemContentList,\n        elementItemTextList,\n        imageReplacer,\n        gameSystemId,\n        doNotPrintPortrait,\n        doOnlyPortrait,\n    ) {\n        const messageDataBase = speakerInfo;\n        let imgPath;\n        let authorColor = \"black\";\n        if (messageDataBase.author) {\n            authorColor = messageDataBase.author.color;\n        } else {\n            //\n            authorColor = messageDataBase?.user.color;\n        }\n        let speaker;\n        if (speakerInfo.message?.author) {\n            speaker = speakerInfo;\n        }\n        if (!speaker && speakerInfo.message) {\n            speaker = speakerInfo.message.speaker;\n        }\n        if (!speaker) {\n            speaker = speakerInfo;\n        }\n        if (speaker && !speaker.alias && speaker.document?.alias) {\n            speaker.alias = speaker.document?.alias;\n        }\n        const message = speaker ? (speaker.message ? speaker.message : speaker.document) : null;\n        if (!message) {\n            Logger.warn(\n                'No message thi is usually a error from other modules like midi-qol, dnd5e helper, ecc you can try to use the \"preCreateChatMessage\" hook by enable the module setting',\n            );\n            return null;\n        }\n        const useTokenName = ChatPortrait.settings.useTokenName;\n        if (useTokenName) {\n            ChatPortrait.replaceSenderWithTokenName(messageSender, speaker);\n        }\n        if (ChatPortrait.shouldOverrideMessageUnknown(messageDataBase)) {\n            imgPath = CONSTANTS.DEF_TOKEN_IMG_PATH;\n        } else {\n            imgPath = ChatPortrait.loadImagePathForChatMessage(speaker);\n        }\n        const chatPortraitCustomData = {\n            customIconPortraitImage: imgPath,\n            customImageReplacer: {},\n            customImageReplacerData: API.imageReplacerIconizer,\n        };\n        Hooks.call(\"ChatPortraitReplaceData\", chatPortraitCustomData, chatMessage);\n        if (chatPortraitCustomData.customIconPortraitImage) {\n            imgPath = chatPortraitCustomData.customIconPortraitImage;\n        }\n        // ty to Mejari for the contribute\n        let imageReplacerToUse = [];\n        if (\n            !!chatPortraitCustomData.customImageReplacerData &&\n            typeof chatPortraitCustomData.customImageReplacerData == \"object\"\n        ) {\n            imageReplacerToUse = chatPortraitCustomData.customImageReplacerData;\n        } else if (\n            chatPortraitCustomData.customImageReplacer &&\n            !!chatPortraitCustomData.customImageReplacer &&\n            typeof chatPortraitCustomData.customImageReplacer == \"object\"\n        ) {\n            const imageReplacerToUseOLD = chatPortraitCustomData.customImageReplacer;\n            for (const key in imageReplacerToUseOLD) {\n                imageReplacerToUse.push({\n                    name: key,\n                    icon: imageReplacerToUseOLD[key],\n                });\n            }\n        }\n        return ChatPortrait.generatePortraitImageElement(imgPath, gameSystemId).then((imgElement) => {\n            // Very very rare use case ????\n            if (!imgElement) {\n                imgElement = document.createElement(\"img\");\n                imgElement.src = \"\";\n                const size = ChatPortrait.settings.portraitSize;\n                if (size && size > 0) {\n                    imgElement.width = size;\n                    imgElement.height = size;\n                }\n                // WE TRY TO GET THE AVATAR IMAGE ANYWAY\n                if (ChatPortrait.settings.useAvatarImage) {\n                    imgElement.src = ChatPortrait.getUserAvatarImageFromChatMessage(speaker);\n                }\n                if (!imgElement.src || imgElement.src.length <= 0) {\n                    imgElement.src = CONSTANTS.INV_UNIDENTIFIED_BOOK;\n                }\n                if (!imgElement.classList.contains(`chat-portrait-message-portrait-${gameSystemId}`)) {\n                    imgElement.classList.add(`chat-portrait-message-portrait-${gameSystemId}`);\n                }\n            }\n            // const headerTextElement = <HTMLElement>document.querySelector(\".message-header\");\n            // headerTextElement.prepend(imgElement);\n            const headerTextElement = messageHeaderBase; //<HTMLElement>html.find('.message-header')[0];\n            headerTextElement.prepend(imgElement);\n            if (!headerTextElement.classList.contains(`chat-portrait-message-header-${gameSystemId}`)) {\n                headerTextElement.classList.add(`chat-portrait-message-header-${gameSystemId}`);\n            }\n            const headerTextElement3 = document.createElement(\"h4\");\n            if (!headerTextElement3.classList.contains(`chat-portrait-text-content-name-${gameSystemId}`)) {\n                headerTextElement3.classList.add(`chat-portrait-text-content-name-${gameSystemId}`);\n            }\n            if (!headerTextElement3.classList.contains(`chat-portrait-flexrow`)) {\n                headerTextElement3.classList.add(`chat-portrait-flexrow`);\n            }\n            const messageContent = html.find(\".message-content\")[0];\n            messageContent?.insertBefore(headerTextElement3, messageContent.firstChild);\n            /*\n            // I need this orribile piece of code for better manage the multisystem use case\n            const headerImageElement3 = document.createElement(\"header\");\n            // headerImageElement3.classList.add(\"message-header\");\n            headerImageElement3.classList.add(\"chat-portrait-flexrow\");\n            if (!headerImageElement3.classList.contains(`chat-portrait-message-content-${gameSystemId}`)) {\n                headerImageElement3.classList.add(`chat-portrait-message-content-${gameSystemId}`);\n            }\n            const messageHeaderElement3 = <HTMLElement>(\n                messageHeaderBase.parentElement?.insertBefore(\n                    headerImageElement3,\n                    messageHeaderBase.parentElement?.firstChild\n                )\n            );\n            const headerTextElement3 = document.createElement(\"h4\");\n            headerTextElement3.classList.add(\"message-sender\");\n            headerTextElement3.classList.add(`chat-portrait-text-content-name-${gameSystemId}`);\n            messageHeaderElement3.appendChild(headerTextElement3);\n\n            const headerImageElement = document.createElement(\"header\");\n            // headerImageElement.classList.add(\"message-header\");\n            headerImageElement.classList.add(\"chat-portrait-flexrow\");\n            if (!headerImageElement.classList.contains(`chat-portrait-message-header-${gameSystemId}`)) {\n                headerImageElement.classList.add(`chat-portrait-message-header-${gameSystemId}`);\n            }\n            headerImageElement.appendChild(imgElement);\n\n            const messageHeader = <HTMLElement>(\n                messageHeaderBase.parentElement?.insertBefore(\n                    headerImageElement,\n                    messageHeaderBase.parentElement?.firstChild\n                )\n            );\n            // Text is transfer to header\n            const headerTextElement = document.createElement(\"h4\");\n            if (messageSender.textContent) {\n                headerTextElement.innerHTML = <string>messageSender.innerHTML;\n            } else {\n                const useTokenName: boolean = ChatPortrait.settings.useTokenName;\n                const speaker = speakerInfo.message.speaker;\n                const actorName = (ChatPortrait.getActorName(speaker) || \"\").trim();\n                const tokenName = (ChatPortrait.getTokenName(speaker) || \"\").trim();\n                if (useTokenName) {\n                    headerTextElement.innerHTML = tokenName;\n                } else {\n                    headerTextElement.innerHTML = actorName;\n                }\n            }\n            headerTextElement.classList.add(\"message-sender\");\n            headerTextElement.classList.add(`chat-portrait-text-header-name-${gameSystemId}`);\n            messageHeader.appendChild(headerTextElement);\n\n            const messageMetadata: HTMLElement = <HTMLElement>html.find(\".message-metadata\")[0];\n            messageHeader.appendChild(messageMetadata);\n            // hide old header\n            if (<HTMLElement>messageSender.parentElement) {\n                (<HTMLElement>messageSender.parentElement).style.display = \"none\";\n            }\n            */\n            if (doOnlyPortrait) {\n                return html;\n            }\n            const messageData = messageDataBase.message;\n            // GOD HELP ME: Use case where we not must prepend the image or imagReplacer\n            // PATCH\n            const isRollTable = messageData.flags?.core?.RollTable ? true : false;\n            let messageHtmlContent = undefined;\n            try {\n                messageHtmlContent = $(messageData.content);\n            } catch (e) {\n                messageHtmlContent = undefined;\n            }\n            // PATCH CUB - Enhanced Cconditions\n            const isEnhancedConditionsCUB = messageHtmlContent\n                ? messageHtmlContent.hasClass(\"enhanced-conditions\")\n                : false;\n            // PATCH MIDIQOL - SAVE DISPLAY\n            const isMidiDisplaySave = messageHtmlContent\n                ? $(messageData.content).find(\".midi-qol-saves-display\")?.length > 0\n                : false;\n            // PATCH STARWARSFFG SYSTEM - DICE ROLL\n            const isStarwarsffgDiceRoll = messageHtmlContent\n                ? messageHtmlContent.hasClass(\"starwarsffg dice-roll\")\n                : false;\n            const doNotPrependImage =\n                isRollTable || isEnhancedConditionsCUB || isMidiDisplaySave || isStarwarsffgDiceRoll;\n            const doNotImageReplacer = isMidiDisplaySave;\n            if (doNotPrintPortrait) {\n                imgElement.style.display = \"none\";\n            }\n            ChatPortrait.setImageBorder(imgElement, authorColor);\n            // Place the image to left of the header by injecting the HTML\n            // const messageHeader: HTMLElement = <HTMLElement>html.find('.message-header')[0];\n            // TODO OLD SETTING ??\n            // messageHeader.prepend(imgElement);\n            /*\n            if (ChatPortrait.settings.flavorNextToPortrait) {\n                const flavorElement: JQuery = html.find(\".flavor-text\");\n                if (flavorElement && flavorElement.length > 0) {\n                    const copiedElement: Node = <Node>flavorElement[0]?.cloneNode(true);\n                    flavorElement.remove();\n                    const brElement: HTMLElement = document.createElement(\"br\");\n\n                    messageSender.appendChild(brElement);\n                    messageSender.appendChild(copiedElement);\n                }\n            }\n            */\n            // Default style\n            if (!messageSender.classList.contains(`chat-portrait-text-size-name-${gameSystemId}`)) {\n                messageSender.classList.add(`chat-portrait-text-size-name-${gameSystemId}`);\n                messageSender.style.alignSelf = \"center\";\n            }\n            // Update size text name by settings\n            if (ChatPortrait.settings.textSizeName > 0) {\n                const size = ChatPortrait.settings.textSizeName;\n                messageSender.style.fontSize = size + \"px\";\n            }\n            //   if (ChatPortrait.shouldOverrideMessageUnknown(messageData)) {\n            //     messageSender.innerText = ChatPortrait.settings.displayUnknownPlaceHolderActorName; //'Unknown Actor';\n            //   }\n            // TODO can't remember why i'm doing this\n            // if (!headerTextElement.classList.contains(`chat-portrait-text-size-name-${gameSystemId}`)) {\n            // \theaderTextElement.classList.add(`chat-portrait-text-size-name-${gameSystemId}`);\n            // \theaderTextElement.style.alignSelf = \"center\";\n            // }\n            // Update size text name by settings\n            if (ChatPortrait.settings.textSizeName > 0) {\n                const size = ChatPortrait.settings.textSizeName;\n                headerTextElement.style.fontSize = size + \"px\";\n            }\n            //   if (ChatPortrait.shouldOverrideMessageUnknown(messageData)) {\n            //     headerTextElement.innerText = ChatPortrait.settings.displayUnknownPlaceHolderActorName; //'Unknown Actor';\n            //   }\n            // Add click listener to image and text\n            ChatLink.prepareEventImage(chatMessage, html, speaker, gameSystemId);\n            // Update size item image by settings\n            if (\n                elementItemImageList.length > 0 &&\n                ChatPortrait.settings.portraitSizeItem != 36 &&\n                ChatPortrait.settings.portraitSizeItem > 0\n            ) {\n                for (let i = 0; i < elementItemImageList.length; i++) {\n                    const elementItemImage = elementItemImageList[i];\n                    if (!elementItemImage) {\n                        continue;\n                    }\n                    const size = ChatPortrait.settings.portraitSizeItem;\n                    if (size && size > 0) {\n                        elementItemImage.width = size;\n                        elementItemImage.height = size;\n                    }\n                    if (!elementItemImage.classList.contains(`chat-portrait-message-portrait-${gameSystemId}`)) {\n                        elementItemImage.classList.add(`chat-portrait-message-portrait-${gameSystemId}`);\n                    }\n                }\n            }\n            // Update hide info about the weapon\n            //   if (ChatPortrait.shouldOverrideMessageUnknown(messageData)) {\n            //     for (let i = 0; i < elementItemImageList.length; i++) {\n            //       const elementItemImage = elementItemImageList[i];\n            //       if (!elementItemImage) {\n            //         continue;\n            //       }\n            //       elementItemImage.src = ChatPortrait.settings.displayUnknownPlaceHolderItemIcon; //`modules/${MODULE_ID}/assets/inv-unidentified.png`;\n            //       const size = ChatPortrait.settings.portraitSizeItem;\n            //       if (size && size > 0) {\n            //         elementItemImage.width = size;\n            //         elementItemImage.height = size;\n            //       }\n            //       if (!elementItemImage.classList.contains(`chat-portrait-message-portrait-${gameSystemId}`)) {\n            //         elementItemImage.classList.add(`chat-portrait-message-portrait-${gameSystemId}`);\n            //       }\n            //     }\n            //\n            //     for (let i = 0; i < elementItemNameList.length; i++) {\n            //       const elementItemName = elementItemNameList[i];\n            //       elementItemName.innerText = ChatPortrait.settings.displayUnknownPlaceHolderItemName; //'Unknown Weapon';\n            //     }\n            //     for (let i = 0; i < elementItemContentList.length; i++) {\n            //       const elementItemContent = elementItemContentList[i];\n            //       elementItemContent.innerText = ChatPortrait.settings.displayUnknownPlaceHolderItemName; //'Unknown Weapon';\n            //     }\n            //   }\n            // Check for Ability/Skills/Tools/Saving Throw for avoid the double portrait\n            if (elementItemNameList.length > 0) {\n                for (let i = 0; i < elementItemNameList.length; i++) {\n                    const elementItemName = elementItemNameList[i];\n                    if (elementItemName) {\n                        if (!elementItemName.classList.contains(`chat-portrait-text-size-name-${gameSystemId}`)) {\n                            elementItemName.classList.add(`chat-portrait-text-size-name-${gameSystemId}`);\n                        }\n                        let value = \"\";\n                        let images = { iconMainReplacer: \"\", iconsDamageType: [] };\n                        if (ChatPortrait.useImageReplacer(html)) {\n                            images = ChatPortrait.getImagesReplacerAsset(\n                                imageReplacerToUse,\n                                elementItemName.innerText,\n                                elementItemContentList[i],\n                            );\n                            if (images && images.iconMainReplacer) {\n                                value = images.iconMainReplacer;\n                            }\n                        }\n                        if (value) {\n                            if (elementItemImageList.length > 0) {\n                                const elementItemImage = elementItemImageList[i];\n                                if (!elementItemImage) {\n                                    continue;\n                                }\n                                const size = ChatPortrait.settings.portraitSizeItem;\n                                if (size && size > 0) {\n                                    elementItemImage.width = size;\n                                    elementItemImage.height = size;\n                                }\n                                // Just ignore if a image is provided\n                                //if(!elementItemImage.src || elementItemImage.src?.includes(CHAT_PORTRAIT_DEF_TOKEN_IMG_NAME)){\n                                if (value.length > 0 && !doNotImageReplacer) {\n                                    elementItemImage.src = value;\n                                }\n                                //}\n                                if (\n                                    elementItemImage.classList.contains(\n                                        `chat-portrait-message-portrait-${gameSystemId}`,\n                                    )\n                                ) {\n                                    elementItemImage.classList.remove(`chat-portrait-message-portrait-${gameSystemId}`);\n                                }\n                                if (\n                                    !doNotImageReplacer &&\n                                    !doNotPrependImage &&\n                                    !elementItemImage.src.endsWith(\"/game\")\n                                ) {\n                                    if (\n                                        // PATCH FOR MONK JOURNAL https://github.com/p4535992/foundryvtt-chat-portrait/issues/16\n                                        !elementItemImage.classList.contains(`chat-actor-icon`) &&\n                                        // PATCH FOR PF2E DAMAGE https://github.com/p4535992/foundryvtt-chat-portrait/issues/15\n                                        !(\n                                            game.system.id === \"pf2e\" &&\n                                            messageContent.querySelectorAll(\".damage-application\")?.length > 0\n                                        )\n                                    ) {\n                                        elementItemImage.classList.add(`chat-portrait-image-size-name-${gameSystemId}`);\n                                        elementItemName.prepend(elementItemImage);\n                                    }\n                                }\n                                // DAMAGE TYPES\n                                if (\n                                    images &&\n                                    images.iconsDamageType.length > 0 &&\n                                    ChatPortrait.settings.useImageReplacerDamageType\n                                ) {\n                                    const elementItemContainerDamageTypes = document.createElement(\"div\");\n                                    for (const [index, itemImage] of images.iconsDamageType.entries()) {\n                                        const elementItemImage2 = document.createElement(\"img\");\n                                        const size = ChatPortrait.settings.portraitSizeItem;\n                                        if (size && size > 0) {\n                                            elementItemImage2.width = size;\n                                            elementItemImage2.height = size;\n                                        }\n                                        // Just ignore if a image is provided\n                                        if (itemImage.length > 0) {\n                                            elementItemImage2.src = itemImage; //images[1];\n                                        }\n                                        if (\n                                            !elementItemImage2.classList.contains(\n                                                `chat-portrait-message-portrait-${gameSystemId}`,\n                                            )\n                                        ) {\n                                            elementItemImage2.classList.add(\n                                                `chat-portrait-message-portrait-${gameSystemId}`,\n                                            );\n                                        }\n                                        elementItemContainerDamageTypes.appendChild(elementItemImage2);\n                                    }\n                                    // https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore\n                                    // If elementItemText does not have a next sibling, then it must be the last child — elementItemText.nextSibling returns null,\n                                    // and elementItemContainerDamageTypes is inserted at the end of the child node list (immediately after elementItemText).\n                                    elementItemName.parentNode?.insertBefore(\n                                        elementItemContainerDamageTypes,\n                                        elementItemName.nextSibling,\n                                    );\n                                }\n                            } else {\n                                if (ChatPortrait.useImageReplacer(html)) {\n                                    const elementItemImage = document.createElement(\"img\");\n                                    const size = ChatPortrait.settings.portraitSizeItem;\n                                    if (size && size > 0) {\n                                        elementItemImage.width = size;\n                                        elementItemImage.height = size;\n                                    }\n                                    // Just ignore if a image is provided\n                                    //if(!elementItemImage.src || elementItemImage.src?.includes(CHAT_PORTRAIT_DEF_TOKEN_IMG_NAME)){\n                                    if (value.length > 0 && !doNotImageReplacer) {\n                                        elementItemImage.src = value;\n                                    }\n                                    //}\n                                    if (\n                                        elementItemImage.classList.contains(\n                                            `chat-portrait-message-portrait-${gameSystemId}`,\n                                        )\n                                    ) {\n                                        elementItemImage.classList.remove(\n                                            `chat-portrait-message-portrait-${gameSystemId}`,\n                                        );\n                                    }\n                                    if (\n                                        !doNotImageReplacer &&\n                                        !doNotPrependImage &&\n                                        !elementItemImage.src.endsWith(\"/game\")\n                                    ) {\n                                        if (\n                                            // PATCH FOR MONK JOURNAL https://github.com/p4535992/foundryvtt-chat-portrait/issues/16\n                                            !elementItemImage.classList.contains(`chat-actor-icon`) &&\n                                            // PATCH FOR PF2E DAMAGE https://github.com/p4535992/foundryvtt-chat-portrait/issues/15\n                                            !(\n                                                game.system.id === \"pf2e\" &&\n                                                messageContent.querySelectorAll(\".damage-application\")?.length > 0\n                                            )\n                                        ) {\n                                            elementItemImage.classList.add(\n                                                `chat-portrait-image-size-name-${gameSystemId}`,\n                                            );\n                                            elementItemName.prepend(elementItemImage);\n                                        }\n                                    }\n                                    // DAMAGE TYPES\n                                    if (\n                                        images &&\n                                        images.iconsDamageType.length > 0 &&\n                                        ChatPortrait.settings.useImageReplacerDamageType\n                                    ) {\n                                        const elementItemContainerDamageTypes = document.createElement(\"div\");\n                                        for (const [index, itemImage] of images.iconsDamageType.entries()) {\n                                            const elementItemImage2 = document.createElement(\"img\");\n                                            const size = ChatPortrait.settings.portraitSizeItem;\n                                            if (size && size > 0) {\n                                                elementItemImage2.width = size;\n                                                elementItemImage2.height = size;\n                                            }\n                                            // Just ignore if a image is provided\n                                            if (itemImage.length > 0) {\n                                                elementItemImage2.src = itemImage; //images[1];\n                                            }\n                                            if (\n                                                !elementItemImage2.classList.contains(\n                                                    `chat-portrait-message-portrait-${gameSystemId}`,\n                                                )\n                                            ) {\n                                                elementItemImage2.classList.add(\n                                                    `chat-portrait-message-portrait-${gameSystemId}`,\n                                                );\n                                            }\n                                            elementItemContainerDamageTypes.appendChild(elementItemImage2);\n                                        }\n                                        // https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore\n                                        // If elementItemText does not have a next sibling, then it must be the last child — elementItemText.nextSibling returns null,\n                                        // and elementItemContainerDamageTypes is inserted at the end of the child node list (immediately after elementItemText).\n                                        elementItemName.parentNode?.insertBefore(\n                                            elementItemContainerDamageTypes,\n                                            elementItemName.nextSibling,\n                                        );\n                                    }\n                                }\n                            }\n                        } else {\n                            if (elementItemImageList.length > 0) {\n                                const elementItemImage = elementItemImageList[i];\n                                if (!elementItemImage) {\n                                    continue;\n                                }\n                                const size = ChatPortrait.settings.portraitSizeItem;\n                                if (size && size > 0) {\n                                    elementItemImage.width = size;\n                                    elementItemImage.height = size;\n                                }\n                                if (\n                                    !elementItemImage.src ||\n                                    elementItemImage.src?.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)\n                                ) {\n                                    // TODO DA RIVEDERE\n                                    elementItemImage.src = \"\";\n                                    if (messageHtmlContent) {\n                                        // PATCH MODULE MERCHANT SHEET\n                                        const itemName =\n                                            messageHtmlContent.find(\".item-name\").length > 0\n                                                ? messageHtmlContent.find(\".item-name\")[0].textContent\n                                                : \"\";\n                                        if (itemName) {\n                                            const actorIdMerchant = messageHtmlContent.attr(\"data-actor-id\");\n                                            let item;\n                                            if (actorIdMerchant) {\n                                                item = game.actors?.get(actorIdMerchant)?.items?.find((myItem) => {\n                                                    return myItem.name == itemName;\n                                                });\n                                            } else {\n                                                item = game.items?.find((myItem) => {\n                                                    return myItem.name == itemName;\n                                                });\n                                            }\n                                            if (item?.img) {\n                                                elementItemImage.src = item.img;\n                                            }\n                                            if (\n                                                !elementItemImage.src ||\n                                                elementItemImage.src?.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)\n                                            ) {\n                                                elementItemImage.src = \"\";\n                                            }\n                                        }\n                                    }\n                                }\n                                if (\n                                    elementItemImage.classList.contains(\n                                        `chat-portrait-message-portrait-${gameSystemId}`,\n                                    )\n                                ) {\n                                    elementItemImage.classList.remove(`chat-portrait-message-portrait-${gameSystemId}`);\n                                }\n                                if (\n                                    !doNotImageReplacer &&\n                                    !doNotPrependImage &&\n                                    !elementItemImage.src.endsWith(\"/game\")\n                                ) {\n                                    if (\n                                        // PATCH FOR MONK JOURNAL https://github.com/p4535992/foundryvtt-chat-portrait/issues/16\n                                        !elementItemImage.classList.contains(`chat-actor-icon`) &&\n                                        // PATCH FOR PF2E DAMAGE https://github.com/p4535992/foundryvtt-chat-portrait/issues/15\n                                        !(\n                                            game.system.id === \"pf2e\" &&\n                                            messageContent.querySelectorAll(\".damage-application\")?.length > 0\n                                        )\n                                    ) {\n                                        elementItemImage.classList.add(`chat-portrait-image-size-name-${gameSystemId}`);\n                                        elementItemName.prepend(elementItemImage);\n                                    }\n                                }\n                                // DAMAGE TYPES\n                                if (\n                                    images &&\n                                    images.iconsDamageType.length > 0 &&\n                                    ChatPortrait.settings.useImageReplacerDamageType\n                                ) {\n                                    const elementItemContainerDamageTypes = document.createElement(\"div\");\n                                    for (const [index, itemImage] of images.iconsDamageType.entries()) {\n                                        const elementItemImage2 = document.createElement(\"img\");\n                                        const size = ChatPortrait.settings.portraitSizeItem;\n                                        if (size && size > 0) {\n                                            elementItemImage2.width = size;\n                                            elementItemImage2.height = size;\n                                        }\n                                        // Just ignore if a image is provided\n                                        if (itemImage.length > 0) {\n                                            elementItemImage2.src = itemImage; //images[1];\n                                        }\n                                        if (\n                                            !elementItemImage2.classList.contains(\n                                                `chat-portrait-message-portrait-${gameSystemId}`,\n                                            )\n                                        ) {\n                                            elementItemImage2.classList.add(\n                                                `chat-portrait-message-portrait-${gameSystemId}`,\n                                            );\n                                        }\n                                        elementItemContainerDamageTypes.appendChild(elementItemImage2);\n                                    }\n                                    // https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore\n                                    // If elementItemText does not have a next sibling, then it must be the last child — elementItemText.nextSibling returns null,\n                                    // and elementItemContainerDamageTypes is inserted at the end of the child node list (immediately after elementItemText).\n                                    elementItemName.parentNode?.insertBefore(\n                                        elementItemContainerDamageTypes,\n                                        elementItemName.nextSibling,\n                                    );\n                                }\n                            } else {\n                                if (ChatPortrait.useImageReplacer(html)) {\n                                    const elementItemImage = document.createElement(\"img\");\n                                    const size = ChatPortrait.settings.portraitSizeItem;\n                                    if (size && size > 0) {\n                                        elementItemImage.width = size;\n                                        elementItemImage.height = size;\n                                    }\n                                    if (\n                                        !doNotImageReplacer &&\n                                        (!elementItemImage.src ||\n                                            elementItemImage.src?.includes(CONSTANTS.DEF_TOKEN_IMG_NAME))\n                                    ) {\n                                        // TODO DA RIVEDERE\n                                        elementItemImage.src = \"\";\n                                        if (messageHtmlContent) {\n                                            // PATCH MODULE MERCHANT SHEET\n                                            const itemName =\n                                                messageHtmlContent.find(\".item-name\").length > 0\n                                                    ? messageHtmlContent.find(\".item-name\")[0].textContent\n                                                    : \"\";\n                                            if (itemName) {\n                                                const actorIdMerchant = messageHtmlContent.attr(\"data-actor-id\");\n                                                let item;\n                                                if (actorIdMerchant) {\n                                                    item = game.actors?.get(actorIdMerchant)?.items?.find((myItem) => {\n                                                        return myItem.name == itemName;\n                                                    });\n                                                } else {\n                                                    item = game.items?.find((myItem) => {\n                                                        return myItem.name == itemName;\n                                                    });\n                                                }\n                                                if (item?.img) {\n                                                    elementItemImage.src = item.img;\n                                                }\n                                                if (\n                                                    !elementItemImage.src ||\n                                                    elementItemImage.src?.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)\n                                                ) {\n                                                    elementItemImage.src = \"\";\n                                                }\n                                            }\n                                        }\n                                    }\n                                    if (\n                                        elementItemImage.classList.contains(\n                                            `chat-portrait-message-portrait-${gameSystemId}`,\n                                        )\n                                    ) {\n                                        elementItemImage.classList.remove(\n                                            `chat-portrait-message-portrait-${gameSystemId}`,\n                                        );\n                                    }\n                                    if (\n                                        !doNotImageReplacer &&\n                                        !doNotPrependImage &&\n                                        !elementItemImage.src.endsWith(\"/game\")\n                                    ) {\n                                        if (\n                                            // PATCH FOR MONK JOURNAL https://github.com/p4535992/foundryvtt-chat-portrait/issues/16\n                                            !elementItemImage.classList.contains(`chat-actor-icon`) &&\n                                            // PATCH FOR PF2E DAMAGE https://github.com/p4535992/foundryvtt-chat-portrait/issues/15\n                                            !(\n                                                game.system.id === \"pf2e\" &&\n                                                messageContent.querySelectorAll(\".damage-application\")?.length > 0\n                                            )\n                                        ) {\n                                            elementItemImage.classList.add(\n                                                `chat-portrait-image-size-name-${gameSystemId}`,\n                                            );\n                                            elementItemName.prepend(elementItemImage);\n                                        }\n                                    }\n                                    // DAMAGE TYPES\n                                    if (\n                                        images &&\n                                        images.iconsDamageType.length > 0 &&\n                                        ChatPortrait.settings.useImageReplacerDamageType\n                                    ) {\n                                        const elementItemContainerDamageTypes = document.createElement(\"div\");\n                                        for (const [index, itemImage] of images.iconsDamageType.entries()) {\n                                            const elementItemImage2 = document.createElement(\"img\");\n                                            const size = ChatPortrait.settings.portraitSizeItem;\n                                            if (size && size > 0) {\n                                                elementItemImage2.width = size;\n                                                elementItemImage2.height = size;\n                                            }\n                                            // Just ignore if a image is provided\n                                            if (itemImage.length > 0) {\n                                                elementItemImage2.src = itemImage; //images[1];\n                                            }\n                                            if (\n                                                !elementItemImage2.classList.contains(\n                                                    `chat-portrait-message-portrait-${gameSystemId}`,\n                                                )\n                                            ) {\n                                                elementItemImage2.classList.add(\n                                                    `chat-portrait-message-portrait-${gameSystemId}`,\n                                                );\n                                            }\n                                            elementItemContainerDamageTypes.appendChild(elementItemImage2);\n                                        }\n                                        // https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore\n                                        // If elementItemText does not have a next sibling, then it must be the last child — elementItemText.nextSibling returns null,\n                                        // and elementItemContainerDamageTypes is inserted at the end of the child node list (immediately after elementItemText).\n                                        elementItemName.parentNode?.insertBefore(\n                                            elementItemContainerDamageTypes,\n                                            elementItemName.nextSibling,\n                                        );\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            } else {\n                for (let i = 0; i < elementItemTextList.length; i++) {\n                    const elementItemText = elementItemTextList[i];\n                    if (!elementItemText.classList.contains(`chat-portrait-text-size-name-${gameSystemId}`)) {\n                        elementItemText.classList.add(`chat-portrait-text-size-name-${gameSystemId}`);\n                    }\n                    let value = \"\";\n                    let images = { iconMainReplacer: \"\", iconsDamageType: [] };\n                    if (ChatPortrait.useImageReplacer(html)) {\n                        images = ChatPortrait.getImagesReplacerAsset(\n                            imageReplacerToUse,\n                            elementItemText.innerText,\n                            elementItemContentList[i],\n                        );\n                        if (images && images.iconMainReplacer) {\n                            value = images.iconMainReplacer;\n                        }\n                    }\n                    if (value) {\n                        if (elementItemImageList.length > 0) {\n                            const elementItemImage = elementItemImageList[i];\n                            if (!elementItemImage) {\n                                continue;\n                            }\n                            const size = ChatPortrait.settings.portraitSizeItem;\n                            if (size && size > 0) {\n                                elementItemImage.width = size;\n                                elementItemImage.height = size;\n                            }\n                            // Just ignore if a image is provided\n                            //if(!elementItemImage.src || elementItemImage.src?.includes(CHAT_PORTRAIT_DEF_TOKEN_IMG_NAME)){\n                            if (value.length > 0 && !doNotImageReplacer) {\n                                elementItemImage.src = value;\n                            }\n                            //}\n                            if (elementItemImage.classList.contains(`chat-portrait-message-portrait-${gameSystemId}`)) {\n                                elementItemImage.classList.remove(`chat-portrait-message-portrait-${gameSystemId}`);\n                            }\n                            if (!doNotImageReplacer && !doNotPrependImage && !elementItemImage.src.endsWith(\"/game\")) {\n                                if (\n                                    // PATCH FOR MONK JOURNAL https://github.com/p4535992/foundryvtt-chat-portrait/issues/16\n                                    !elementItemImage.classList.contains(`chat-actor-icon`) &&\n                                    // PATCH FOR PF2E DAMAGE https://github.com/p4535992/foundryvtt-chat-portrait/issues/15\n                                    !(\n                                        game.system.id === \"pf2e\" &&\n                                        messageContent.querySelectorAll(\".damage-application\")?.length > 0\n                                    )\n                                ) {\n                                    elementItemImage.classList.add(`chat-portrait-image-size-name-${gameSystemId}`);\n                                    elementItemText.prepend(elementItemImage);\n                                }\n                            }\n                            // DAMAGE TYPES\n                            if (\n                                images &&\n                                images.iconsDamageType.length > 0 &&\n                                ChatPortrait.settings.useImageReplacerDamageType\n                            ) {\n                                const elementItemContainerDamageTypes = document.createElement(\"div\");\n                                for (const [index, itemImage] of images.iconsDamageType.entries()) {\n                                    const elementItemImage2 = document.createElement(\"img\");\n                                    const size = ChatPortrait.settings.portraitSizeItem;\n                                    if (size && size > 0) {\n                                        elementItemImage2.width = size;\n                                        elementItemImage2.height = size;\n                                    }\n                                    // Just ignore if a image is provided\n                                    if (itemImage.length > 0) {\n                                        elementItemImage2.src = itemImage; //images[1];\n                                    }\n                                    if (\n                                        !elementItemImage2.classList.contains(\n                                            `chat-portrait-message-portrait-${gameSystemId}`,\n                                        )\n                                    ) {\n                                        elementItemImage2.classList.add(\n                                            `chat-portrait-message-portrait-${gameSystemId}`,\n                                        );\n                                    }\n                                    elementItemContainerDamageTypes.appendChild(elementItemImage2);\n                                }\n                                // https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore\n                                // If elementItemText does not have a next sibling, then it must be the last child — elementItemText.nextSibling returns null,\n                                // and elementItemContainerDamageTypes is inserted at the end of the child node list (immediately after elementItemText).\n                                elementItemText.parentNode?.insertBefore(\n                                    elementItemContainerDamageTypes,\n                                    elementItemText.nextSibling,\n                                );\n                            }\n                        } else {\n                            if (ChatPortrait.useImageReplacer(html)) {\n                                const elementItemImage = document.createElement(\"img\");\n                                const size = ChatPortrait.settings.portraitSizeItem;\n                                if (size && size > 0) {\n                                    elementItemImage.width = size;\n                                    elementItemImage.height = size;\n                                }\n                                // Just ignore if a image is provided\n                                //if(!elementItemImage.src || elementItemImage.src?.includes(CHAT_PORTRAIT_DEF_TOKEN_IMG_NAME)){\n                                if (value.length > 0 && !doNotImageReplacer) {\n                                    elementItemImage.src = value;\n                                }\n                                //}\n                                if (\n                                    elementItemImage.classList.contains(\n                                        `chat-portrait-message-portrait-${gameSystemId}`,\n                                    )\n                                ) {\n                                    elementItemImage.classList.remove(`chat-portrait-message-portrait-${gameSystemId}`);\n                                }\n                                if (\n                                    !doNotImageReplacer &&\n                                    !doNotPrependImage &&\n                                    !elementItemImage.src.endsWith(\"/game\")\n                                ) {\n                                    if (\n                                        // PATCH FOR MONK JOURNAL https://github.com/p4535992/foundryvtt-chat-portrait/issues/16\n                                        !elementItemImage.classList.contains(`chat-actor-icon`) &&\n                                        // PATCH FOR PF2E DAMAGE https://github.com/p4535992/foundryvtt-chat-portrait/issues/15\n                                        !(\n                                            game.system.id === \"pf2e\" &&\n                                            messageContent.querySelectorAll(\".damage-application\")?.length > 0\n                                        )\n                                    ) {\n                                        elementItemImage.classList.add(`chat-portrait-image-size-name-${gameSystemId}`);\n                                        elementItemText.prepend(elementItemImage);\n                                    }\n                                }\n                                // DAMAGE TYPES\n                                if (\n                                    images &&\n                                    images.iconsDamageType.length > 0 &&\n                                    ChatPortrait.settings.useImageReplacerDamageType\n                                ) {\n                                    const elementItemContainerDamageTypes = document.createElement(\"div\");\n                                    for (const [index, itemImage] of images.iconsDamageType.entries()) {\n                                        const elementItemImage2 = document.createElement(\"img\");\n                                        const size = ChatPortrait.settings.portraitSizeItem;\n                                        if (size && size > 0) {\n                                            elementItemImage2.width = size;\n                                            elementItemImage2.height = size;\n                                        }\n                                        // Just ignore if a image is provided\n                                        if (itemImage.length > 0) {\n                                            elementItemImage2.src = itemImage; //images[1];\n                                        }\n                                        if (\n                                            !elementItemImage2.classList.contains(\n                                                `chat-portrait-message-portrait-${gameSystemId}`,\n                                            )\n                                        ) {\n                                            elementItemImage2.classList.add(\n                                                `chat-portrait-message-portrait-${gameSystemId}`,\n                                            );\n                                        }\n                                        elementItemContainerDamageTypes.appendChild(elementItemImage2);\n                                    }\n                                    // https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore\n                                    // If elementItemText does not have a next sibling, then it must be the last child — elementItemText.nextSibling returns null,\n                                    // and elementItemContainerDamageTypes is inserted at the end of the child node list (immediately after elementItemText).\n                                    elementItemText.parentNode?.insertBefore(\n                                        elementItemContainerDamageTypes,\n                                        elementItemText.nextSibling,\n                                    );\n                                }\n                            }\n                        }\n                    } else {\n                        if (elementItemImageList.length > 0) {\n                            const elementItemImage = elementItemImageList[i];\n                            if (!elementItemImage) {\n                                continue;\n                            }\n                            const size = ChatPortrait.settings.portraitSizeItem;\n                            if (size && size > 0) {\n                                elementItemImage.width = size;\n                                elementItemImage.height = size;\n                            }\n                            //   if (!elementItemImage.src || elementItemImage.src?.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                            //     elementItemImage.src = ChatPortrait.settings.displayUnknownPlaceHolderItemIcon;\n                            //   }\n                            if (elementItemImage.classList.contains(`chat-portrait-message-portrait-${gameSystemId}`)) {\n                                elementItemImage.classList.remove(`chat-portrait-message-portrait-${gameSystemId}`);\n                            }\n                            if (!doNotImageReplacer && !doNotPrependImage && !elementItemImage.src.endsWith(\"/game\")) {\n                                if (\n                                    // PATCH FOR MONK JOURNAL https://github.com/p4535992/foundryvtt-chat-portrait/issues/16\n                                    !elementItemImage.classList.contains(`chat-actor-icon`) &&\n                                    // PATCH FOR PF2E DAMAGE https://github.com/p4535992/foundryvtt-chat-portrait/issues/15\n                                    !(\n                                        game.system.id === \"pf2e\" &&\n                                        messageContent.querySelectorAll(\".damage-application\")?.length > 0\n                                    )\n                                ) {\n                                    elementItemImage.classList.add(`chat-portrait-image-size-name-${gameSystemId}`);\n                                    elementItemText.prepend(elementItemImage);\n                                }\n                            }\n                        } else {\n                            if (ChatPortrait.useImageReplacer(html)) {\n                                // REMOVED SEEM OVERKILL\n                                /*\n                const elementItemImage:HTMLImageElement = <HTMLImageElement> document.createElement(\"img\");\n                if(!elementItemImage){\n                    continue;\n                }\n                const size: number = ChatPortrait.settings.portraitSizeItem;\n                if(size && size > 0){\n                    elementItemImage.width = size;\n                    elementItemImage.height = size;\n                }\n                if( !doNotImageReplacer && (!elementItemImage.src || elementItemImage.src?.includes(CHAT_PORTRAIT_DEF_TOKEN_IMG_NAME))){\n                    elementItemImage.src = ChatPortrait.settings.displayUnknownPlaceHolderItemIcon;\n                }\n                if(!elementItemImage.classList.contains(`chat-portrait-message-portrait-${gameSystemId}`)){\n                    elementItemImage.classList.add(`chat-portrait-message-portrait-${gameSystemId}`);\n                }\n                if(!isRollTable) elementItemText.prepend(elementItemImage);\n                */\n                            }\n                        }\n                    }\n                    //   if (ChatPortrait.shouldOverrideMessageUnknown(messageData)) {\n                    //     elementItemText.innerText = ChatPortrait.settings.displayUnknownPlaceHolderItemName;\n                    //   }\n                }\n            }\n            ChatPortrait.setCustomStylingText(html, messageData, authorColor, gameSystemId);\n            ChatPortrait.setChatMessageBackground(html, messageData, authorColor);\n            ChatPortrait.setChatMessageBorder(html, messageData, authorColor);\n            // Final settings\n            if (ChatPortrait.settings.displayPlayerName) {\n                ChatPortrait.appendPlayerName(headerTextElement3, messageSender, speaker.author, gameSystemId);\n                // ChatPortrait.appendPlayerName(headerTextElement, messageSender, speaker.author, gameSystemId);\n            }\n            if (ChatPortrait.settings.displayMessageTag) {\n                ChatPortrait.injectMessageTag(html, messageData, headerTextElement3, gameSystemId);\n                // ChatPortrait.injectMessageTag(html, messageData, headerTextElement, gameSystemId);\n                ChatPortrait.injectWhisperParticipants(html, messageData, gameSystemId);\n            }\n            ChatLink.prepareEvent(chatMessage, html, speakerInfo, gameSystemId);\n            return html;\n        });\n    }\n    /**\n     * Load the appropriate actor image path for a given message, leveraging token or actor or actor search.\n     * @param  {{scene?:string;actor?:string;token?:string;alias?:string;}} speaker\n     * @returns string\n     */\n    static loadImagePathForChatMessage(speakerInfo) {\n        const message = speakerInfo.message\n            ? speakerInfo.message\n            : speakerInfo.document\n              ? speakerInfo.document\n              : speakerInfo;\n        const speaker = message.speaker ? message.speaker : speakerInfo;\n        const isOOC = ChatPortrait.getMessageTypeVisible(speakerInfo) === CONST.CHAT_MESSAGE_STYLES.OOC;\n        const imgFinal = CONSTANTS.DEF_TOKEN_IMG_PATH;\n        const flaggedPreChatSrc = message.flags?.[CONSTANTS.MODULE_ID]?.src;\n        if (flaggedPreChatSrc) {\n            if (message.author && isOOC) {\n                const imgAvatar = ChatPortrait.getUserAvatarImageFromChatMessage(message);\n                if (imgAvatar && !imgAvatar.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                    return imgAvatar;\n                } else {\n                    Logger.warn(\n                        `No specific avatar player image found it for player \"'${ChatPortrait.getUserNameFromChatMessage(\n                            message,\n                        )}'\"`,\n                    );\n                    return imgAvatar ? imgAvatar : imgFinal;\n                }\n            } else {\n                return flaggedPreChatSrc;\n            }\n        }\n        if (\n            !ChatPortrait.settings.disablePortraitForAliasGmMessage &&\n            ChatPortrait.settings.setUpPortraitForAliasGmMessage?.length > 0\n        ) {\n            const userByAlias = game.users?.find((u) => {\n                return (speakerInfo.alias === u.name || speakerInfo.author.name === u.name) && u?.isGM;\n            });\n            if (userByAlias) {\n                return ChatPortrait.settings.setUpPortraitForAliasGmMessage;\n            }\n        }\n        if (message.author && isOOC) {\n            const imgAvatar = ChatPortrait.getUserAvatarImageFromChatMessage(message);\n            if (imgAvatar && !imgAvatar.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                return imgAvatar;\n            } else {\n                Logger.warn(\n                    'No specific avatar player image found it for player \"' +\n                        ChatPortrait.getUserNameFromChatMessage(message) +\n                        '\"',\n                );\n                return imgAvatar ? imgAvatar : imgFinal;\n            }\n        }\n        if (speaker) {\n            // CASE 1\n            if ((!speaker.token && !speaker.actor) || ChatPortrait.settings.useAvatarImage) {\n                if (message.author && ChatPortrait.settings.useAvatarImage && !ChatPortrait.isSpeakerGM(message)) {\n                    const imgAvatar = ChatPortrait.getUserAvatarImageFromChatMessage(message);\n                    if (imgAvatar && !imgAvatar.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                        return imgAvatar;\n                    } else {\n                        Logger.warn(\n                            'No specific avatar player image found it for player \"' +\n                                ChatPortrait.getUserNameFromChatMessage(message) +\n                                '\"',\n                        );\n                        return imgAvatar ? imgAvatar : imgFinal;\n                    }\n                } else if (!speaker.token && !speaker.actor) {\n                    if (message.author && ChatPortrait.settings.useAvatarImage) {\n                        const imgAvatar = ChatPortrait.getUserAvatarImageFromChatMessage(message);\n                        if (imgAvatar && !imgAvatar.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                            return imgAvatar;\n                        } else {\n                            // This is just a partial solution....\n                            // const currentToken:Token = ChatPortrait.getFirstPlayerToken();\n                            // if(currentToken){\n                            //   speaker.token = currentToken;\n                            //   return currentToken.document.texture.src;\n                            // }else{\n                            //Logger.warn(\"No specific avatar player image found it for player '\"+ChatPortrait.getUserName(message)+\"'\");\n                            //return imgAvatar ? imgAvatar : imgFinal;\n                            // }\n                        }\n                    } else {\n                        //Logger.warn(\"No message user is found\");\n                        return imgFinal;\n                    }\n                }\n            }\n            // It's a chat message associated with an actor\n            let useTokenImage = ChatPortrait.settings.useTokenImage;\n            const actor = ChatPortrait.getActorFromSpeaker(speaker);\n            const doNotUseTokenImageWithSpecificType = ChatPortrait.settings.doNotUseTokenImageWithSpecificType\n                ? String(ChatPortrait.settings.doNotUseTokenImageWithSpecificType).split(\",\")\n                : [];\n            if (\n                doNotUseTokenImageWithSpecificType.length > 0 &&\n                doNotUseTokenImageWithSpecificType.includes(actor?.type)\n            ) {\n                useTokenImage = false;\n            }\n            // Make sense only for player and for non GM\n            if (\n                actor?.type == \"character\" &&\n                ChatPortrait.settings.useAvatarImage &&\n                !ChatPortrait.isSpeakerGM(message)\n            ) {\n                const imgAvatar = ChatPortrait.getUserAvatarImageFromChatMessage(message);\n                if (imgAvatar && !imgAvatar.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                    return imgAvatar;\n                } else {\n                    //Logger.warn(\"No specific avatar player image found it for player '\"+ChatPortrait.getUserName(message)+\"'\");\n                }\n            }\n            // let tokenDocument: TokenDocument;\n            let tokenDocumentData;\n            if (speaker.token) {\n                let tokenDocument = ChatPortrait.getTokenFromSpeaker(speaker);\n                // THIS PIECE OF CODE IS PROBABLY NOT NECESSARY ANYMORE ??\n                if (!tokenDocument) {\n                    try {\n                        tokenDocument = canvas?.tokens?.getDocuments().find((token) => token.id === speaker.token);\n                        //token = canvas?.tokens?.getDocuments().find(speaker.token);\n                    } catch (e) {\n                        // Do nothing\n                    }\n                    if (!tokenDocument) {\n                        tokenDocumentData = game.scenes\n                            ?.get(speaker.scene)\n                            ?.tokens?.find((t) => t.id === speaker.token); // Deprecated on 0.8.6\n                    } else {\n                        tokenDocumentData = tokenDocument;\n                    }\n                } else {\n                    tokenDocumentData = tokenDocument;\n                }\n                let imgToken = \"\";\n                if (tokenDocumentData) {\n                    if (useTokenImage) {\n                        //\n                        if (tokenDocumentData?.randomImg) {\n                            //\n                            if (tokenDocumentData?.texture?.src) {\n                                //\n                                imgToken = tokenDocumentData.texture.src;\n                            } else {\n                                // particolar case...\n                                imgToken = CONSTANTS.DEF_TOKEN_IMG_PATH;\n                            }\n                        }\n                        //\n                        if (tokenDocumentData?.texture?.src) {\n                            //\n                            imgToken = tokenDocumentData.texture.src;\n                        }\n                        //\n                        if ((!imgToken || ChatPortrait.isWildcardImage(imgToken)) && tokenDocumentData?.img) {\n                            //\n                            imgToken = tokenDocumentData?.texture.src;\n                        }\n                    } else {\n                        //\n                        if (tokenDocumentData?.delta?.img) {\n                            //\n                            imgToken = tokenDocumentData.delta.img;\n                        }\n                        if (\n                            (!imgToken || ChatPortrait.isWildcardImage(imgToken)) &&\n                            //\n                            tokenDocumentData?.delta?.img\n                        ) {\n                            //\n                            imgToken = tokenDocumentData?.delta.img;\n                        }\n                        //\n                        if (tokenDocumentData?.actor?.img) {\n                            //\n                            imgToken = tokenDocumentData.actor.img;\n                        }\n                        if (\n                            (!imgToken || ChatPortrait.isWildcardImage(imgToken)) &&\n                            //\n                            tokenDocumentData?.actor?.img\n                        ) {\n                            //\n                            imgToken = tokenDocumentData?.actor.img;\n                        }\n                    }\n                    // if((!imgToken || ChatPortrait.isWildcardImage(imgToken)) || imgToken.includes(CHAT_PORTRAIT_DEF_TOKEN_IMG_NAME)){\n                    //return useTokenImage ? <string>actor?.token.texture.src : <string>actor?.token?.texture.src; // actor?.img; // Deprecated on 0.8.6\n                    //return useTokenImage ? actor?.token?.texture.src; : actor.img; // actor?.img; // Deprecated on 0.8.6\n                    //}\n                    if (\n                        imgToken &&\n                        !ChatPortrait.isWildcardImage(imgToken) &&\n                        !imgToken.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)\n                    ) {\n                        return imgToken;\n                    }\n                }\n            }\n            let imgActor = \"\";\n            if (actor) {\n                if ((!imgActor || imgActor.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) && useTokenImage) {\n                    //\n                    imgActor = actor?.token?.texture.src;\n                    if (imgActor && ChatPortrait.isWildcardImage(imgActor)) {\n                        imgActor = \"\";\n                    }\n                }\n                if ((!imgActor || imgActor.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) && useTokenImage) {\n                    //\n                    imgActor = actor?.token?.texture.src;\n                    if (imgActor && ChatPortrait.isWildcardImage(imgActor)) {\n                        imgActor = \"\";\n                    }\n                }\n                if (!imgActor || imgActor.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                    imgActor = actor.img;\n                }\n                if (imgActor && !imgActor.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                    return imgActor;\n                }\n            }\n            const imgAvatar = ChatPortrait.getUserAvatarImageFromChatMessage(message);\n            // if (isMonkTokenBarXP(html)) {\n            //   return imgAvatar;\n            // } else {\n            if (imgAvatar && !imgAvatar.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                return imgAvatar;\n            } else {\n                //Logger.warn(\"No specific avatar player image found it for player '\"+ChatPortrait.getUserName(message)+\"'\");\n                return imgAvatar ? imgAvatar : CONSTANTS.INV_UNIDENTIFIED_BOOK;\n            }\n            // }\n            //return  useTokenImage ? <string>actor?.token.texture.src : <string>actor?.img;\n            //return useTokenImage ? actor?.token?.texture.src : actor.img;\n        } else if (message && message.author) {\n            // CASE 2\n            const imgAvatar = ChatPortrait.getUserAvatarImageFromChatMessage(message);\n            if (imgAvatar && !imgAvatar.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                return imgAvatar;\n            } else {\n                Logger.warn(\n                    \"No specific avatar player image found it for player '\" +\n                        ChatPortrait.getUserNameFromChatMessage(message) +\n                        \"'\",\n                );\n                return imgAvatar ? imgAvatar : imgFinal;\n            }\n        } else {\n            // CASE 3\n            return imgFinal;\n        }\n    }\n    /**\n     * Generate portrait HTML Image Element to insert into chat messages.\n     * @param  {string} imgPath\n     * @returns HTMLImageElement\n     */\n    static async generatePortraitImageElement(imgPath, gameSystemId) {\n        if (!imgPath) {\n            return;\n        }\n        const img = document.createElement(\"img\");\n        img.src = \"\";\n        const size = ChatPortrait.settings.portraitSize;\n        // Support for video or webm file\n        //let thumb = diff.img;\n        //if (VideoHelper.hasVideoExtension(diff.img))\n        //    thumb = await ImageHelper.createThumbnail(diff.img, { width: 48, height: 48 });\n        //let thumb = CONSTANTS.DEF_TOKEN_IMG_PATH;\n        if (imgPath.includes(\".webm\") || ChatPortrait.isVideo(imgPath)) {\n            try {\n                const video = ChatPortrait.createVideoElement(imgPath);\n                if (!video) {\n                    const imgThumb =\n                        size && size > 0\n                            ? await ImageHelper.createThumbnail(imgPath, { width: size, height: size })\n                            : await ImageHelper.createThumbnail(imgPath);\n                    if (imgPath.includes(\".webm\")) {\n                        img.src = imgThumb.thumb;\n                        // If a url we need these anyway\n                        if (size && size > 0) {\n                            img.width = size;\n                            img.height = size;\n                        }\n                    } else {\n                        img.src = imgThumb.src;\n                        if (size && size > 0) {\n                            // If a url we need these anyway\n                            img.width = size;\n                            img.height = size;\n                        }\n                    }\n                } else {\n                    // If a url we need these anyway\n                    if (size && size > 0) {\n                        video.width = size;\n                        video.height = size;\n                    }\n                    if (!video.classList.contains(`chat-portrait-message-portrait-${gameSystemId}`)) {\n                        video.classList.add(`chat-portrait-message-portrait-${gameSystemId}`);\n                    }\n                    return video;\n                }\n            } catch {\n                img.src = imgPath;\n                if (size && size > 0) {\n                    img.width = size;\n                    img.height = size;\n                }\n            }\n        } else {\n            img.src = imgPath;\n            if (size && size > 0) {\n                img.width = size;\n                img.height = size;\n            }\n        }\n        if (!img.classList.contains(`chat-portrait-message-portrait-${gameSystemId}`)) {\n            img.classList.add(`chat-portrait-message-portrait-${gameSystemId}`);\n        }\n        return img;\n    }\n    /**\n     * Set portrait image border shape\n     * @param  {HTMLImageElement} img\n     * @param  {string} authorColor\n     */\n    static setImageBorder(img, authorColor) {\n        const borderShape = ChatPortrait.settings.borderShape;\n        const borderWidth = ChatPortrait.settings.borderWidth;\n        const borderColor = ChatPortrait.settings.useUserColorAsBorderColor\n            ? authorColor\n            : ChatPortrait.settings.borderColor;\n        switch (borderShape) {\n            case \"square\":\n                img.style.border = `${borderWidth}px solid ${borderColor}`;\n                break;\n            case \"circle\":\n                img.style.border = `${borderWidth}px solid ${borderColor}`;\n                img.style.borderRadius = \"50%\";\n                break;\n            case \"none\":\n                img.style.border = \"none\";\n                break;\n        }\n    }\n    static setCustomStylingText(html, messageData, authorColor, gameSystemId) {\n        const elementItemTextList = html.find(`.chat-portrait-text-size-name-${gameSystemId}`);\n        for (let i = 0; i < elementItemTextList.length; i++) {\n            const elementItemText = elementItemTextList[i];\n            if (elementItemText) {\n                if (ChatPortrait.settings.customStylingMessageText) {\n                    elementItemText.style.cssText = ChatPortrait.settings.customStylingMessageText;\n                }\n                // else if (game.settings.get(CONSTANTS.MODULE_ID, 'customStylingMessageSystem')) {\n                //   if (!elementItemText.classList.contains(`chat-portrait-system-${gameSystemId}`)) {\n                //     elementItemText.classList.add(`chat-portrait-system-${gameSystemId}`);\n                //   }\n                // }\n                // You need this anyway\n                //elementItemText.style.display = 'flex';\n            }\n        }\n        const elementItemImageList = html.find(`.chat-portrait-image-size-name-${gameSystemId}`);\n        for (let i = 0; i < elementItemImageList.length; i++) {\n            const elementItemImage = elementItemTextList[i];\n            if (elementItemImage) {\n                if (ChatPortrait.settings.customStylingMessageImage) {\n                    elementItemImage.style.cssText = ChatPortrait.settings.customStylingMessageImage;\n                }\n                // else if (game.settings.get(CONSTANTS.MODULE_ID, 'customStylingMessageSystem')) {\n                //   if (!elementItemImage.classList.contains(`chat-portrait-system-${gameSystemId}`)) {\n                //     elementItemImage.classList.add(`chat-portrait-system-${gameSystemId}`);\n                //   }\n                // }\n            }\n        }\n    }\n    /**\n     * Set the background color of the entire message to be the color for the author.\n     * Only do so if\n     *  - chatBackgroundColor setting is true AND\n     * @param  {JQuery} html\n     * @param  {MessageRenderData} messageData\n     * @param  {string} authorColor\n     */\n    static setChatMessageBackground(html, messageData, authorColor) {\n        const useUserBackgroundColor = ChatPortrait.settings.useUserColorAsChatBackgroundColor;\n        if (useUserBackgroundColor) {\n            //html[0].setAttribute('style','background-color:' + authorColor + ';background-blend-mode:screen;');\n            html[0].style.background = \"url(../ui/parchment.jpg) repeat\";\n            html[0].style.backgroundColor = authorColor;\n            //\n            html[0].style.backgroundBlendMode = \"screen\";\n        }\n    }\n    /**\n     * Set the border color of the entire message to be the color for the author.\n     * Only do so if\n     *  - chatBorderColor setting is true AND\n     *  - someone further up the chain hasn't already changed the color\n     * @param  {JQuery} html\n     * @param  {MessageRenderData} messageData\n     * @param  {string} authorColor\n     */\n    static setChatMessageBorder(html, messageData, authorColor) {\n        const useUserBorderColor = ChatPortrait.settings.useUserColorAsChatBorderColor;\n        // only override the border color if someone further up the chain hasn't already done so.\n        if (useUserBorderColor && !messageData.borderColor) {\n            html[0].style.borderColor = authorColor;\n            messageData.borderColor = authorColor;\n        }\n    }\n    static get settings() {\n        //return mergeObject(this.defaultSettings, <ChatPortraitSettings>game.settings.get(MODULE_ID, 'settings'));\n        //return mergeObject(this.defaultSettings,{\n        return {\n            //borderShapeList: Settings.getBorderShapeList(),\n            disableChatPortrait: SettingsForm.getDisableChatPortrait(),\n            useTokenImage: SettingsForm.getUseTokenImage(),\n            doNotUseTokenImageWithSpecificType: SettingsForm.getDoNotUseTokenImageWithSpecificType(),\n            useTokenName: SettingsForm.getUseTokenName(),\n            portraitSize: SettingsForm.getPortraitSize(),\n            portraitSizeItem: SettingsForm.getPortraitSizeItem(),\n            borderShape: SettingsForm.getBorderShape(),\n            useUserColorAsBorderColor: SettingsForm.getUseUserColorAsBorderColor(),\n            borderColor: SettingsForm.getBorderColor(),\n            borderWidth: SettingsForm.getBorderWidth(),\n            useUserColorAsChatBackgroundColor: SettingsForm.getUseUserColorAsChatBackgroundColor(),\n            useUserColorAsChatBorderColor: SettingsForm.getUseUserColorAsChatBorderColor(),\n            // flavorNextToPortrait: SettingsForm.getFlavorNextToPortrait(),\n            forceNameSearch: SettingsForm.getForceNameSearch(),\n            // hoverTooltip: SettingsForm.getHoverTooltip(),\n            textSizeName: SettingsForm.getTextSizeName(),\n            displaySetting: SettingsForm.getDisplaySetting(),\n            useAvatarImage: SettingsForm.getUseAvatarImage(),\n            displayPlayerName: SettingsForm.getDisplayPlayerName(),\n            // displayUnknown: SettingsForm.getDisplayUnknown(),\n            // displayUnknownPlaceHolderActorName: SettingsForm.getDisplayUnknownPlaceHolderActorName(),\n            // displayUnknownPlaceHolderItemName: SettingsForm.getDisplayUnknownPlaceHolderItemName(),\n            // displayUnknownPlaceHolderItemIcon: SettingsForm.getDisplayUnknownPlaceHolderItemIcon(),\n            displaySettingOTHER: SettingsForm.getDisplaySettingOTHER(),\n            displaySettingOOC: SettingsForm.getDisplaySettingOOC(),\n            displaySettingIC: SettingsForm.getDisplaySettingIC(),\n            displaySettingEMOTE: SettingsForm.getDisplaySettingEMOTE(),\n            displaySettingWHISPER: SettingsForm.getDisplaySettingWHISPER(),\n            displaySettingROLL: SettingsForm.getDisplaySettingROLL(),\n            displaySettingWhisperToOther: SettingsForm.getDisplaySettingWhisperToOther(),\n            // customStylingMessageSystem: SettingsForm.getCustomStylingMessageSystem(),\n            customStylingMessageText: SettingsForm.getCustomStylingMessageText(),\n            customStylingMessageImage: SettingsForm.getCustomStylingMessageImage(),\n            displayMessageTag: SettingsForm.getDisplayMessageTag(),\n            // displayMessageTagNextToName: SettingsForm.getDisplayMessageTagNextToName(),\n            useImageReplacer: SettingsForm.getUseImageReplacer(),\n            useImageReplacerDamageType: SettingsForm.getUseImageReplacerDamageType(),\n            applyOnCombatTracker: SettingsForm.getApplyOnCombatTracker(),\n            // applyPreCreateChatMessagePatch: SettingsForm.getApplyPreCreateChatMessagePatch(),\n            disablePortraitForAliasGmMessage: SettingsForm.getDisablePortraitForAliasGmMessage(),\n            setUpPortraitForAliasGmMessage: SettingsForm.getSetUpPortraitForAliasGmMessage(),\n        };\n    }\n    /**\n     * Get default settings object.\n     * @returns ChatPortraitSetting\n     */\n    static get defaultSettings() {\n        return {\n            useTokenImage: false,\n            doNotUseTokenImageWithSpecificType: \"\",\n            useTokenName: false,\n            portraitSize: 36,\n            portraitSizeItem: 36,\n            borderShape: \"square\",\n            useUserColorAsBorderColor: true,\n            borderColor: \"#000000\",\n            borderWidth: 2,\n            useUserColorAsChatBackgroundColor: false,\n            useUserColorAsChatBorderColor: false,\n            // flavorNextToPortrait: false,\n            forceNameSearch: false,\n            // hoverTooltip: false,\n            textSizeName: 0,\n            displaySetting: \"allCards\",\n            useAvatarImage: false,\n            displayPlayerName: false,\n            //   displayUnknown: \"none\",\n            //   displayUnknownPlaceHolderActorName: \"Unknown Actor\",\n            //   displayUnknownPlaceHolderItemName: \"Unknown Item\",\n            //   displayUnknownPlaceHolderItemIcon: `modules/${CONSTANTS.MODULE_ID}/assets/inv-unidentified.png`,\n            displaySettingOTHER: true,\n            displaySettingOOC: true,\n            displaySettingIC: true,\n            displaySettingEMOTE: true,\n            displaySettingWHISPER: true,\n            displaySettingROLL: true,\n            displaySettingWhisperToOther: false,\n            // customStylingMessageSystem: false,\n            customStylingMessageText: \"\",\n            customStylingMessageImage: \"\",\n            displayMessageTag: false,\n            // displayMessageTagNextToName: false,\n            useImageReplacer: true,\n            useImageReplacerDamageType: true,\n            applyOnCombatTracker: false,\n            // applyPreCreateChatMessagePatch: false,\n            disablePortraitForAliasGmMessage: false,\n            setUpPortraitForAliasGmMessage: \"\",\n        };\n    }\n    // static getSpeakerImage = function (message, useTokenImage):string {\n    //   const speaker = message.speaker;\n    //   if (speaker) {\n    //       if (speaker.token && useTokenImage) {\n    //           const token = canvas?.tokens?.getDocuments().get(speaker.token);\n    //           if (token) {\n    //               return token.texture.src;\n    //           }\n    //       }\n    //       if (speaker.actor && !useTokenImage) {\n    //           const actor = Actors.instance.get(speaker.actor);\n    //           if (actor) {\n    //             return actor.img;\n    //           }\n    //       }\n    //   }\n    //   return \"icons/svg/mystery-man.svg\";\n    // }\n    // static showSpeakerImage = function (message, useTokenImage):boolean {\n    //   const speaker = message.speaker;\n    //   if (!speaker) {\n    //       return false;\n    //   } else {\n    //     let bHasImage = false;\n    //     if (speaker.token && useTokenImage) {\n    //         const token = canvas?.tokens?.getDocuments().get(speaker.token);\n    //         if (token) {\n    //             bHasImage = bHasImage || token.texture.src != null;\n    //         }\n    //     }\n    //     if (speaker.actor) {\n    //         const actor = Actors.instance.get(speaker.actor);\n    //         if (actor) {\n    //             bHasImage = bHasImage || actor.img != null;\n    //         }\n    //     }\n    //     if (!bHasImage) {\n    //         return false;\n    //     }else{\n    //       return true;\n    //     }\n    //   }\n    // }\n    static getActorFromSpeaker(speaker) {\n        let actor = game.actors?.get(speaker.actor);\n        if (!actor) {\n            actor = game.actors?.tokens[speaker.token];\n        }\n        if (!actor) {\n            //actor = game.actors.get(speaker.actor); // Deprecated on 0.8.6\n            actor = Actors.instance.get(speaker.actor);\n        }\n        const forceNameSearch = ChatPortrait.settings.forceNameSearch;\n        if (!actor && forceNameSearch) {\n            actor = game.actors?.find((a) => a.token?.name === speaker.alias);\n        }\n        return actor;\n    }\n    static getActorFromActorID(actorID, tokenID) {\n        let actor = game.actors?.get(actorID);\n        if (!actor) {\n            actor = game.actors?.tokens[tokenID];\n        }\n        if (!actor) {\n            //actor = game.actors.get(actorID); // Deprecated on 0.8.6\n            actor = Actors.instance.get(actorID);\n        }\n        // const forceNameSearch = ChatPortrait.settings.forceNameSearch;\n        // if (!actor && forceNameSearch) {\n        //     actor = game.actors?.find((a: Actor) => a.token.name === speaker.alias);\n        // }\n        return actor;\n    }\n    static getImagesReplacerAsset(imageReplacer, innerText, elementItemContent) {\n        //let value:string[] = new Array();\n        const value = new ImageReplacerData();\n        let innerTextTmp = innerText;\n        //let betterRollLabelAttack = ($(elementItemContent).find(\".br5e-roll-label\")[0])?.innerText;\n        //let betterRollLabelDamage = ($(elementItemContent).find(\".br5e-roll-label\")[1])?.innerText;\n        // const fullTextContent = $(elementItemContent)[0]?.innerText;\n        const textToCheck = $(elementItemContent)[0]?.innerText || \"\";\n        const fullTextContent = textToCheck.toLowerCase().trim();\n        // TODO special word for integration multisystem and help to identify the chat text\n        const check = Logger.i18n(`${CONSTANTS.MODULE_ID}.labels.check`);\n        const ability = Logger.i18n(`${CONSTANTS.MODULE_ID}.labels.ability`);\n        const skill = Logger.i18n(`${CONSTANTS.MODULE_ID}.labels.skill`);\n        const checkEN = Logger.i18n(`${CONSTANTS.MODULE_ID}.labels.checkEN`);\n        const abilityEN = Logger.i18n(`${CONSTANTS.MODULE_ID}.labels.abilityEN`);\n        const skillEN = Logger.i18n(`${CONSTANTS.MODULE_ID}.labels.skillEN`);\n        const innerTextDamageTmp = fullTextContent; //Damage -Slashing\n        if (innerTextTmp) {\n            // Clean up the string for multisystem (D&D5, PF2, ecc.)\n            //let text:string = \"\";\n            innerTextTmp = innerTextTmp.toLowerCase().trim();\n            const arr1 = innerTextTmp.split(/\\r?\\n/);\n            for (let i = 0; i < arr1.length; i++) {\n                let text = arr1[i];\n                if (text) {\n                    // Keywords to avoid for all the system ?\n                    if (\n                        text.indexOf(check) !== -1 ||\n                        text.indexOf(ability) !== -1 ||\n                        text.indexOf(skill) !== -1 ||\n                        text.indexOf(checkEN) !== -1 ||\n                        text.indexOf(abilityEN) !== -1 ||\n                        text.indexOf(skillEN) !== -1\n                    ) {\n                        // is ok ??\n                    } else {\n                        continue;\n                    }\n                    text = text.replace(/\\W/g, \" \");\n                    text = text.replace(skill, \"\");\n                    text = text.replace(check, \"\");\n                    text = text.replace(ability, \"\");\n                    text = text.replace(skillEN, \"\");\n                    text = text.replace(checkEN, \"\");\n                    text = text.replace(abilityEN, \"\");\n                    text = text.replace(/[0-9]/g, \"\");\n                    text = text.toLowerCase().trim();\n                    for (const objKey in imageReplacer) {\n                        const obj = imageReplacer[objKey];\n                        if (obj) {\n                            const key = obj.name;\n                            const mykeyvalue = Logger.i18n(key);\n                            if (mykeyvalue) {\n                                //mykeyvalue = mykeyvalue.toLowerCase().trim();\n                                //let arr2 = mykeyvalue.split(/\\r?\\n/);\n                                //for (let j = 0; j < arr2.length; j++) {\n                                let keyValue = mykeyvalue; //arr2[j];\n                                if (keyValue) {\n                                    keyValue = keyValue.replace(/\\W/g, \" \");\n                                    keyValue = keyValue.replace(skill, \"\");\n                                    keyValue = keyValue.replace(check, \"\");\n                                    keyValue = keyValue.replace(ability, \"\");\n                                    keyValue = keyValue.replace(skillEN, \"\");\n                                    keyValue = keyValue.replace(checkEN, \"\");\n                                    keyValue = keyValue.replace(abilityEN, \"\");\n                                    keyValue = keyValue.replace(/[0-9]/g, \"\");\n                                    keyValue = keyValue.toLowerCase().trim();\n                                    if (text.trim().indexOf(Logger.i18n(keyValue).toLowerCase()) !== -1) {\n                                        // if (text.trim().indexOf(keyValue) !== -1) {\n                                        //value.push(imageReplacer[key]);\n                                        value.iconMainReplacer = obj.icon; //imageReplacer[key];\n                                        break;\n                                    }\n                                }\n                                //}\n                            }\n                        }\n                    }\n                }\n            }\n        } // InnerTexTmp\n        if (ChatPortrait.settings.useImageReplacerDamageType && innerTextDamageTmp) {\n            const damageTypes = [];\n            const arr4 = innerTextDamageTmp.split(/\\r?\\n/);\n            for (let i = 0; i < arr4.length; i++) {\n                let textDamage = arr4[i];\n                if (textDamage) {\n                    textDamage = textDamage.replace(/\\W/g, \" \");\n                    textDamage = textDamage.replace(skill, \"\");\n                    textDamage = textDamage.replace(check, \"\");\n                    textDamage = textDamage.replace(ability, \"\");\n                    textDamage = textDamage.replace(skillEN, \"\");\n                    textDamage = textDamage.replace(checkEN, \"\");\n                    textDamage = textDamage.replace(abilityEN, \"\");\n                    textDamage = textDamage.replace(/[0-9]/g, \"\");\n                    textDamage = textDamage.toLowerCase().trim();\n                    for (const keydamageObjeKey in API.imageReplacerDamageType) {\n                        const keydamageObj = API.imageReplacerDamageType[keydamageObjeKey];\n                        const keydamage = keydamageObj.name;\n                        const mykeydamagevalue = Logger.i18n(keydamage);\n                        if (mykeydamagevalue) {\n                            //mykeydamagevalue = mykeydamagevalue.toLowerCase().trim();\n                            //let arr3 = mykeydamagevalue.split(/\\r?\\n/);\n                            //for (let x = 0; x < arr3.length; x++) {\n                            let damageValue = mykeydamagevalue; //arr3[x];\n                            if (damageValue) {\n                                damageValue = damageValue.replace(/\\W/g, \" \");\n                                damageValue = damageValue.replace(skill, \"\");\n                                damageValue = damageValue.replace(check, \"\");\n                                damageValue = damageValue.replace(ability, \"\");\n                                damageValue = damageValue.replace(skillEN, \"\");\n                                damageValue = damageValue.replace(checkEN, \"\");\n                                damageValue = damageValue.replace(abilityEN, \"\");\n                                damageValue = damageValue.replace(/[0-9]/g, \"\");\n                                damageValue = damageValue.toLowerCase().trim();\n                                damageValue = \" \" + damageValue;\n                                if (textDamage.trim().indexOf(Logger.i18n(damageValue).toLowerCase()) !== -1) {\n                                    // if (textDamage.toLowerCase().trim().indexOf(damageValue) !== -1) {\n                                    const srcdamageType = keydamageObj.icon; //imageReplacerDamageType[keydamage];\n                                    damageTypes.push(srcdamageType);\n                                    // Add all damage types\n                                }\n                            }\n                            //}\n                        }\n                    }\n                }\n                value.iconsDamageType = damageTypes;\n            }\n        }\n        return value;\n    }\n    static useImageReplacer(html) {\n        if (ChatPortrait.settings.useImageReplacer) {\n            // if (isMonkTokenBarXP(html)) {\n            //   return false;\n            // }\n            return true;\n        }\n        return false;\n    }\n    static injectMessageTag(html, messageData, messageElement, gameSystemId) {\n        /*\n        let timestampTag = html.find(\".message-timestamp\");\n        if (ChatPortrait.settings.displayMessageTagNextToName) {\n            // timestampTag = html.find(`h4.chat-portrait-text-size-name-${gameSystemId}`);\n            timestampTag = html.find(`h4.chat-portrait-text-content-name-${gameSystemId}`);\n        }\n        */\n        //const timestampTag = html.find(`h4.chat-portrait-text-content-name-${gameSystemId}`);\n        // const timestampTag = $(messageElement);\n        // const indicatorElement = $(\"<span>\");\n        // indicatorElement.addClass(`chat-portrait-indicator-${gameSystemId}`);\n        const indicatorElement = document.createElement(\"span\");\n        if (!indicatorElement.classList.contains(`chat-portrait-indicator-${gameSystemId}`)) {\n            indicatorElement.classList.add(`chat-portrait-indicator-${gameSystemId}`);\n        }\n        const whisperTargets = messageData.whisper;\n        const isBlind = messageData.blind || false;\n        const isWhisper = whisperTargets?.length > 0 || false;\n        const isSelf = isWhisper && whisperTargets.length === 1 && whisperTargets[0] === messageData.user;\n        //\n        const isRoll = messageData.rolls !== undefined;\n        // Inject tag to the left of the timestamp\n        if (isBlind) {\n            // indicatorElement.text(Logger.i18n(\"CHAT.RollBlind\"));\n            // timestampTag.before(indicatorElement);\n            indicatorElement.innerText = Logger.i18n(\"CHAT.RollBlind\");\n            messageElement.appendChild(indicatorElement);\n        } else if (isSelf && whisperTargets[0]) {\n            // indicatorElement.text(Logger.i18n(\"CHAT.RollSelf\"));\n            // timestampTag.before(indicatorElement);\n            indicatorElement.innerText = Logger.i18n(\"CHAT.RollSelf\");\n            messageElement.appendChild(indicatorElement);\n        } else if (isRoll && isWhisper) {\n            // indicatorElement.text(Logger.i18n(\"CHAT.RollPrivate\"));\n            // timestampTag.before(indicatorElement);\n            indicatorElement.innerText = Logger.i18n(\"CHAT.RollPrivate\");\n            messageElement.appendChild(indicatorElement);\n        } else if (isWhisper) {\n            // indicatorElement.text(Logger.i18n(\"chat-portrait.whisper\"));\n            // timestampTag.before(indicatorElement);\n            indicatorElement.innerText = Logger.i18n(\"chat-portrait.whisper\");\n            messageElement.appendChild(indicatorElement);\n        }\n    }\n    static injectWhisperParticipants(html, messageData, gameSystemId) {\n        const alias = messageData.alias;\n        const whisperTargetString = messageData.whisperTo;\n        const whisperTargetIds = messageData.whisper;\n        const isWhisper = whisperTargetIds?.length > 0 || false;\n        //\n        const isRoll = messageData.rolls !== undefined;\n        const authorId = messageData.user;\n        const userId = game.user?.id;\n        if (!isWhisper) return;\n        if (userId !== authorId && !whisperTargetIds.includes(userId)) return;\n        // remove the old whisper to content, if it exists\n        html.find(`.chat-portrait-whisper-to-${gameSystemId}`).detach();\n        // if this is a roll\n        if (isRoll) return;\n        // add new content\n        const messageHeader = html.find(\".card-header\"); // message-header\n        const whisperParticipants = $(\"<span>\");\n        whisperParticipants.addClass(`chat-portrait-whisper-to-${gameSystemId}`);\n        const whisperFrom = $(\"<span>\");\n        whisperFrom.text(`${Logger.i18n(\"chat-portrait.from\")}: ${alias}`);\n        const whisperTo = $(\"<span>\");\n        whisperTo.text(`${Logger.i18n(\"CHAT.To\")}: ${whisperTargetString}`);\n        whisperParticipants.append(whisperFrom);\n        whisperParticipants.append(whisperTo);\n        messageHeader.append(whisperParticipants);\n    }\n    static isWildcardImage(imgUrl) {\n        try {\n            const filename = imgUrl.split(\"/\").pop();\n            const baseFileName = filename.substr(0, filename.lastIndexOf(\".\"));\n            return baseFileName == \"*\";\n        } catch (e) {\n            //TODO must check other systems\n            return false;\n        }\n    }\n    static isVideo(imgSrc) {\n        const re = /(?:\\.([^.]+))?$/;\n        const ext = re.exec(imgSrc)?.[1];\n        return ext === \"webm\";\n    }\n    static createVideoElement(videoSrc) {\n        const video = document.createElement(\"video\");\n        video.src = videoSrc;\n        video.autoplay = false;\n        video.controls = false;\n        video.muted = true;\n        return video;\n    }\n    static loadImagePathForCombatTracker(tokenID, actorID, userID, sceneID, isOwnedFromPLayer) {\n        const imgFinal = CONSTANTS.DEF_TOKEN_IMG_PATH;\n        //\n        // CASE 1\n        if ((!tokenID && !actorID) || ChatPortrait.settings.useAvatarImage) {\n            if (userID && ChatPortrait.settings.useAvatarImage && !ChatPortrait.isGMFromUserID(userID)) {\n                const imgAvatar = ChatPortrait.getUserAvatarImageFromUserID(userID);\n                if (imgAvatar && !imgAvatar.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                    return imgAvatar;\n                } else {\n                    Logger.warn(\n                        \"No specific avatar player image found it for player '\" +\n                            ChatPortrait.getUserNameFromUserID(userID) +\n                            \"'\",\n                    );\n                    return imgAvatar ? imgAvatar : imgFinal;\n                }\n            } else if (!tokenID && !actorID) {\n                if (userID && ChatPortrait.settings.useAvatarImage) {\n                    const imgAvatar = ChatPortrait.getUserAvatarImageFromUserID(userID);\n                    if (imgAvatar && !imgAvatar.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                        return imgAvatar;\n                    } else {\n                        // This is just a partial solution....\n                        // const currentToken:Token = ChatPortrait.getFirstPlayerToken();\n                        // if(currentToken){\n                        //   speaker.token = currentToken;\n                        //   return currentToken.texture.src;\n                        // }else{\n                        //Logger.warn(\"No specific avatar player image found it for player '\"+ChatPortrait.getUserName(message)+\"'\");\n                        //return imgAvatar ? imgAvatar : imgFinal;\n                        // }\n                    }\n                } else {\n                    //Logger.warn(\"No message user is found\");\n                    return imgFinal;\n                }\n            }\n        }\n        // It's a chat message associated with an actor\n        let useTokenImage = ChatPortrait.settings.useTokenImage;\n        const actor = ChatPortrait.getActorFromActorID(actorID, tokenID);\n        const doNotUseTokenImageWithSpecificType = ChatPortrait.settings.doNotUseTokenImageWithSpecificType\n            ? String(ChatPortrait.settings.doNotUseTokenImageWithSpecificType).split(\",\")\n            : [];\n        if (doNotUseTokenImageWithSpecificType.length > 0 && doNotUseTokenImageWithSpecificType.includes(actor?.type)) {\n            useTokenImage = false;\n        }\n        // Make sense only for player and for non GM\n        if (\n            actor?.type == \"character\" &&\n            ChatPortrait.settings.useAvatarImage &&\n            !ChatPortrait.isGMFromUserID(userID)\n        ) {\n            const imgAvatar = ChatPortrait.getUserAvatarImageFromUserID(userID);\n            if (imgAvatar && !imgAvatar.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                return imgAvatar;\n            } else {\n                //Logger.warn(\"No specific avatar player image found it for player '\"+ChatPortrait.getUserName(message)+\"'\");\n            }\n        }\n        let tokenDocument;\n        //\n        let tokenDocumentData;\n        if (tokenID) {\n            tokenDocument = ChatPortrait.getTokenFromIds(sceneID, tokenID, actorID);\n            // THIS PIECE OF CODE IS PROBABLY NOT NECESSARY ANYMORE ??\n            if (!tokenDocument) {\n                try {\n                    tokenDocument = canvas?.tokens?.getDocuments().find((token) => token.id === tokenID);\n                    //token = canvas?.tokens?.getDocuments().find(speaker.token);\n                } catch (e) {\n                    // Do nothing\n                }\n                if (!tokenDocument) {\n                    tokenDocumentData = game.scenes?.get(sceneID)?.tokens?.find((t) => t.id === tokenID); // Deprecated on 0.8.6\n                } else {\n                    tokenDocumentData = tokenDocument;\n                }\n            } else {\n                tokenDocumentData = tokenDocument;\n            }\n            let imgToken = \"\";\n            if (tokenDocumentData) {\n                if (useTokenImage) {\n                    if (tokenDocumentData?.img) {\n                        imgToken = tokenDocumentData.img;\n                    }\n                    if ((!imgToken || ChatPortrait.isWildcardImage(imgToken)) && tokenDocumentData?.img) {\n                        imgToken = tokenDocumentData?.img;\n                    }\n                } else {\n                    if (tokenDocumentData?.delta?.img) {\n                        imgToken = tokenDocumentData.delta.img;\n                    }\n                    if ((!imgToken || ChatPortrait.isWildcardImage(imgToken)) && tokenDocumentData?.delta?.img) {\n                        imgToken = tokenDocumentData.delta.img;\n                    }\n                }\n                // if((!imgToken || ChatPortrait.isWildcardImage(imgToken)) || imgToken.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)){\n                //return useTokenImage ? <string>actor?.token.texture.src  : <string>actor?.token.texture.src ; // actor?.img; // Deprecated on 0.8.6\n                //return useTokenImage ? actor?.token.texture.src : actor.img; // actor?.img; // Deprecated on 0.8.6\n                //}\n                if (\n                    imgToken &&\n                    !ChatPortrait.isWildcardImage(imgToken) &&\n                    !imgToken.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)\n                ) {\n                    return imgToken;\n                }\n            }\n        }\n        // MOD COMBAT TRACKER NEED TOKEN RETRIEVE ANYWAY IF TOKEN IS NOT OWNED\n        let imgToken = \"\";\n        if (!useTokenImage && !isOwnedFromPLayer) {\n            if (tokenDocumentData?.img) {\n                imgToken = tokenDocumentData.img;\n            }\n            if ((!imgToken || ChatPortrait.isWildcardImage(imgToken)) && tokenDocumentData?.texture.src) {\n                imgToken = tokenDocumentData?.texture.src;\n            }\n            if (\n                imgToken &&\n                !ChatPortrait.isWildcardImage(imgToken) &&\n                !imgToken.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)\n            ) {\n                return imgToken;\n            }\n        }\n        // END MOD COMBAT TRACKER IF TOKEN IS NOT OWNED\n        let imgActor = \"\";\n        if (actor) {\n            if ((!imgActor || imgActor.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) && useTokenImage) {\n                //\n                imgActor = actor?.token?.texture.src;\n                if (imgActor && ChatPortrait.isWildcardImage(imgActor)) {\n                    imgActor = \"\";\n                }\n            }\n            if ((!imgActor || imgActor.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) && useTokenImage) {\n                //\n                imgActor = actor?.token?.texture.src;\n                if (imgActor && ChatPortrait.isWildcardImage(imgActor)) {\n                    imgActor = \"\";\n                }\n            }\n            if (!imgActor || imgActor.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                imgActor = actor?.img;\n            }\n            if (imgActor && !imgActor.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n                return imgActor;\n            }\n        }\n        const imgAvatar = ChatPortrait.getUserAvatarImageFromUserID(userID);\n        // if (isMonkTokenBarXP(html)) {\n        //   return imgAvatar;\n        // }else {\n        if (imgAvatar && !imgAvatar.includes(CONSTANTS.DEF_TOKEN_IMG_NAME)) {\n            return imgAvatar;\n        } else {\n            //Logger.warn(\"No specific avatar player image found it for player '\"+ChatPortrait.getUserName(message)+\"'\");\n            return imgAvatar ? imgAvatar : CONSTANTS.INV_UNIDENTIFIED_BOOK;\n        }\n        // }\n        //return  useTokenImage ? <string>actor?.token.texture.src : <string>actor?.img;\n        //return useTokenImage ? actor?.token.texture.src : actor.img;\n    }\n}\nChatPortrait.getActorNameFromSpeaker = function (speaker) {\n    const actor = ChatPortrait.getActorFromSpeaker(speaker); //game.actors.get(speaker.actor);\n    if (actor) {\n        return actor.name;\n    }\n    return speaker.alias;\n};\nChatPortrait.getPrototypeTokenNameFromSpeaker = function (speaker) {\n    const actor = ChatPortrait.getActorFromSpeaker(speaker); //game.actors.get(speaker.actor);\n    if (actor) {\n        //\n        if (actor?.prototypeToken) {\n            //\n            return actor?.prototypeToken.name;\n        } else if (actor.token) {\n            return actor.token.name;\n        }\n    }\n    return speaker.alias;\n};\nChatPortrait.getTokenNameFromSpeaker = function (speaker) {\n    // TODO token before actor ?\n    if (speaker.token) {\n        const token = ChatPortrait.getTokenFromSpeaker(speaker);\n        if (token) {\n            return token.name;\n        }\n    }\n    if (speaker.actor) {\n        const actor = game.actors?.get(speaker.actor);\n        if (actor) {\n            // if(game.modules.get('anonymous')?.active && actor) {\n            //     return game.modules.get('anonymous').api.getName(actor);\n            // }\n            //\n            if (actor?.prototypeToken) {\n                //\n                return actor?.prototypeToken.name;\n            } else if (actor.token) {\n                return actor.token.name;\n            }\n            if (actor.hasPlayerOwner) {\n                return actor.name;\n            }\n        }\n    }\n    if (game.user?.isGM) {\n        return speaker.alias;\n    }\n    // return ChatPortrait.settings.displayUnknownPlaceHolderActorName; //'???';\n    return \"\";\n};\nChatPortrait.getTokenFromSpeaker = function (speaker) {\n    let token = null;\n    if (speaker.token) {\n        const sceneSpeaker = speaker.scene ? speaker.scene : game.scenes?.current?.id;\n        const scene = game.scenes?.get(sceneSpeaker);\n        const tokenSpeaker = scene?.tokens.get(speaker.token);\n        token = ChatPortrait._getTokenFromScene(scene?.id, tokenSpeaker?.id);\n        if (!token) {\n            token = ChatPortrait._getTokenFromId(tokenSpeaker?.id);\n        }\n        if (!token && speaker.actor) {\n            token = ChatPortrait._getTokenFromActor(speaker.actor);\n        }\n    }\n    if (!token) {\n        const actor = game.actors?.get(speaker.actor);\n        if (actor) {\n            //\n            if (actor?.prototypeToken) {\n                //\n                token = actor?.prototypeToken;\n            } else if (actor.token) {\n                token = actor.token;\n            }\n        }\n    }\n    return !token ? null : token;\n};\nChatPortrait.getTokenFromIds = function (sceneID, tokenID, actorID) {\n    let tokenDocument = ChatPortrait._getTokenFromScene(sceneID, tokenID);\n    if (!tokenDocument) {\n        tokenDocument = ChatPortrait._getTokenFromId(tokenID);\n    }\n    if (!tokenDocument && actorID) {\n        tokenDocument = ChatPortrait._getTokenFromActor(actorID);\n    }\n    return tokenDocument;\n};\nChatPortrait._getTokenFromActor = function (actorID) {\n    let token = null;\n    const scene = game.scenes?.get(game.user?.viewedScene);\n    if (scene) {\n        const thisSceneToken = scene.tokens.find((tokenTmp) => {\n            return tokenTmp.actor && tokenTmp.actor.id === actorID;\n        });\n        if (thisSceneToken) {\n            token = ChatPortrait._getTokenFromId(thisSceneToken.id);\n        }\n    }\n    return token;\n};\nChatPortrait._getTokenFromId = function (tokenId) {\n    try {\n        return canvas.tokens?.get(tokenId)?.document;\n    } catch (e) {\n        return null;\n    }\n};\nChatPortrait._getTokenFromScene = function (sceneID, tokenID) {\n    const specifiedScene = game.scenes?.get(sceneID);\n    if (specifiedScene) {\n        //return ChatPortrait.getTokenForScene(specifiedScene, tokenID);\n        if (!specifiedScene) {\n            return null;\n        }\n        const tokenDoc = specifiedScene.tokens.find((tokenTmp) => {\n            return tokenTmp.id === tokenID;\n        });\n        return tokenDoc;\n    }\n    let foundToken = null;\n    game.scenes?.find((sceneTmp) => {\n        //foundToken = ChatPortrait.getTokenForScene(scene, tokenID);\n        if (!sceneTmp) {\n            foundToken = null;\n        }\n        foundToken = sceneTmp.tokens.find((token) => {\n            return token.id === tokenID;\n        });\n        return !!foundToken;\n    });\n    return foundToken;\n};\n// static getTokenForScene = function(scene, tokenID) {\n//   if (!scene) {\n//     return null;\n//   }\n//   return scene.tokens.find((token) => {\n//     return token.id === tokenID;\n//   });\n// }\n/**\n * Returns a list of selected (or owned, if no token is selected)\n * note: ex getSelectedOrOwnedToken\n */\nChatPortrait.getFirstSelectedToken = function () {\n    try {\n        canvas;\n    } catch (e) {\n        // Canvas not ready\n        return null;\n    }\n    // Get controlled token\n    let token = null;\n    const controlled = canvas.tokens?.controlled;\n    // Do nothing if multiple tokens are selected\n    if (controlled.length && controlled.length > 1) {\n        token = controlled[0];\n    }\n    // If exactly one token is selected, take that\n    return token;\n};\n/**\n * Returns a list of selected (or owned, if no token is selected)\n * note: ex getSelectedOrOwnedToken\n */\nChatPortrait.getFirstPlayerToken = function () {\n    try {\n        canvas;\n    } catch (e) {\n        // Canvas not ready\n        return null;\n    }\n    // Get controlled token\n    let token = ChatPortrait.getFirstSelectedToken();\n    if (!token) {\n        //if(!controlled.length || controlled.length == 0 ){\n        // If no token is selected use the token of the users character\n        //\n        token = canvas.tokens.placeables.find((token) => token.id === game.user?.character.id);\n        //}\n        // If no token is selected use the first owned token of the users character you found and is not GM\n        if (!token && !game.user?.isGM) {\n            token = canvas.tokens?.ownedTokens[0];\n        }\n    }\n    return token;\n};\nChatPortrait.isSpeakerGM = function (message) {\n    if (message.author) {\n        let user = game.users?.get(message.author);\n        if (!user) {\n            user = game.users?.get(message?.author?.id);\n        }\n        if (user) {\n            return user.isGM;\n        } else {\n            return false;\n        }\n    }\n    return false;\n};\nChatPortrait.isGMFromUserID = function (userID) {\n    if (userID) {\n        const user = game.users?.get(userID);\n        if (user) {\n            return user.isGM;\n        } else {\n            return false;\n        }\n    }\n    return false;\n};\nChatPortrait.shouldOverrideMessageUnknown = function (message) {\n    const speaker = message?.message?.speaker;\n    let actor;\n    let mytype;\n    if (!speaker) {\n        actor = game.users?.get(message.author)?.character;\n        mytype = actor?.type;\n    } else if (!speaker.token && !speaker.actor) {\n        actor = game.users?.get(message.author)?.character;\n        mytype = actor?.type;\n    } else {\n        actor = ChatPortrait.getActorFromSpeaker(speaker);\n        mytype = actor?.type;\n    }\n    /* REMOVED IN FAVOR OF ANONYMUS MODULE\n  const setting = game.settings.get(CONSTANTS.MODULE_ID, \"displayUnknown\");\n  if (setting !== \"none\") {\n    //const user = game.users.get(message.author);\n    let user = game.users?.get(message.author);\n    if (!user) {\n      user = game.users?.get(message.author.id);\n    }\n    if (!user) {\n      user = game.users?.get(message.document?.user?.id);\n    }\n    if (user) {\n      const isSelf = user.id === game.user?.id;\n      const isGM = user.isGM;\n      if (\n        setting === \"allCards\" ||\n        (setting === \"self\" && isSelf) ||\n        (setting === \"selfAndGM\" && (isSelf || isGM)) ||\n        (setting === \"gm\" && isGM) ||\n        (setting === \"player\" && !isGM) ||\n        (setting === \"onlyNpc\" && mytype == \"npc\" && !isGM)\n      ) {\n        return true;\n      }\n    } else {\n      Logger.error(\"Impossibile to get message user\");\n    }\n  }\n  */\n    // if(game.modules.get('anonymous')?.active && actor) {\n    //   if(!game.modules.get('anonymous').api.playersSeeName(actor)){\n    //       return true;\n    //   }\n    // }\n    return false;\n};\nChatPortrait.shouldOverrideMessageStyling = function (message) {\n    const setting = game.settings.get(CONSTANTS.MODULE_ID, \"displaySetting\");\n    if (setting !== \"none\") {\n        //const user = game.users.get(message.author);\n        let user = game.users?.get(message.author);\n        if (!user) {\n            user = game.users?.get(message.author?.id);\n        }\n        if (!user) {\n            user = game.users?.get(message.document?.user?.id);\n        }\n        if (user) {\n            const isSelf = user.id === game.user?.id;\n            const isGM = user.isGM;\n            if (\n                setting === \"allCards\" ||\n                (setting === \"self\" && isSelf) ||\n                (setting === \"selfAndGM\" && (isSelf || isGM)) ||\n                (setting === \"gm\" && isGM) ||\n                (setting === \"player\" && !isGM)\n            ) {\n                return true;\n            }\n        } else {\n            Logger.error(\"Impossible to get message user\");\n        }\n    }\n    return false;\n};\nChatPortrait.getUserColor = function (message) {\n    let user = game.users?.get(message.author);\n    if (!user) {\n        user = game.users?.get(message.author.id);\n        if (user) {\n            return user.color;\n        }\n    }\n    return \"\";\n};\nChatPortrait.getUserAvatarImageFromChatMessage = function (message) {\n    let userId = \"\";\n    // TODO CHECK THESE FOR FVTT10\n    if (message.document?.user?.id) {\n        userId = message.document.user.id;\n    }\n    if (!userId && message.author?.id) {\n        userId = message.author.id;\n    }\n    if (!userId && message.author) {\n        userId = message.author;\n    }\n    if (userId) {\n        const user = game.users?.get(userId);\n        if (user) {\n            if (user && user.avatar) {\n                // image path\n                return user.avatar;\n            }\n        }\n    }\n    return CONSTANTS.DEF_TOKEN_IMG_PATH;\n};\nChatPortrait.getUserAvatarImageFromUserID = function (userId) {\n    const user = game.users?.get(userId);\n    if (user) {\n        if (user && user.avatar) {\n            // image path\n            return user.avatar;\n        }\n    }\n    return CONSTANTS.DEF_TOKEN_IMG_PATH;\n};\nChatPortrait.getUserNameFromChatMessage = function (message) {\n    let user = game.users?.get(message.author);\n    if (!user) {\n        user = game.users?.get(message.author.id);\n    }\n    if (user) {\n        if (user && user.avatar) {\n            // image path\n            return user.name;\n        }\n    }\n    return \"\";\n};\nChatPortrait.getUserNameFromUserID = function (userID) {\n    const user = game.users?.get(userID);\n    if (user) {\n        if (user && user.avatar) {\n            // image path\n            return user.name;\n        }\n    }\n    return \"\";\n};\nChatPortrait.isWhisperToOther = function (speakerInfo) {\n    const whisper = speakerInfo?.message?.whisper;\n    return whisper && whisper.length > 0 && whisper.indexOf(game.userId) === -1;\n};\nChatPortrait.replaceSenderWithTokenName = function (messageSenderElem, speakerInfo) {\n    const speaker = speakerInfo.message.speaker;\n    const alias = speaker.alias;\n    const actorName = (ChatPortrait.getActorNameFromSpeaker(speaker) || \"\").trim();\n    const prototypeTokenName = (ChatPortrait.getPrototypeTokenNameFromSpeaker(speaker) || \"\").trim();\n    const tokenName = (ChatPortrait.getTokenNameFromSpeaker(speaker) || \"\").trim();\n    Logger.debug(`replaceSenderWithTokenName | Alias '${alias}'`);\n    Logger.debug(`replaceSenderWithTokenName | Actor Name '${actorName}'`);\n    Logger.debug(`replaceSenderWithTokenName | Prototype Token Name '${prototypeTokenName}'`);\n    Logger.debug(`replaceSenderWithTokenName | Token Name '${tokenName}'`);\n    if (tokenName && tokenName !== alias) {\n        Logger.debug(`replaceSenderWithTokenName | Use token name replaced '${alias}' with '${tokenName}'`);\n        ChatPortrait.replaceMatchingTextNodes(messageSenderElem[0], tokenName, alias);\n    }\n    // else {\n    // \tif (actorName !== name) {\n    // \t\tChatPortrait.replaceMatchingTextNodes(messageSenderElem[0], actorName, name);\n    // \t}\n    // }\n};\nChatPortrait.replaceMatchingTextNodes = function (parent, match, replacement) {\n    if (!parent || !parent.hasChildNodes()) {\n        return;\n    }\n    for (const node of parent.childNodes) {\n        if (node.nodeType === Node.TEXT_NODE) {\n            if (node.wholeText.trim() === match) {\n                node.parentNode.replaceChild(document.createTextNode(replacement), node);\n            }\n        } else {\n            ChatPortrait.replaceMatchingTextNodes(node, match, replacement);\n        }\n    }\n};\nChatPortrait.appendPlayerName = function (headerTextElement, messageSenderElem, author, gameSystemId) {\n    const playerName = author.name;\n    const playerNameElem = document.createElement(\"span\");\n    playerNameElem.appendChild(document.createTextNode(playerName));\n    if (!playerNameElem.classList.contains(`chat-portrait-playerName-${gameSystemId}`)) {\n        playerNameElem.classList.add(`chat-portrait-playerName-${gameSystemId}`);\n    }\n    // messageSenderElem.append(playerNameElem);\n    headerTextElement.appendChild(playerNameElem);\n};\nChatPortrait.getMessageTypeVisible = function (speakerInfo) {\n    let messageType = speakerInfo.message?.style;\n    switch (messageType) {\n        case CONST.CHAT_MESSAGE_STYLES.OTHER:\n            return CONST.CHAT_MESSAGE_STYLES.OTHER;\n        case CONST.CHAT_MESSAGE_STYLES.OOC:\n            return CONST.CHAT_MESSAGE_STYLES.OOC;\n        case CONST.CHAT_MESSAGE_STYLES.IC:\n            return CONST.CHAT_MESSAGE_STYLES.IC;\n        case CONST.CHAT_MESSAGE_STYLES.EMOTE:\n            return CONST.CHAT_MESSAGE_STYLES.EMOTE;\n        default:\n            // \"Unknown tab\n            return;\n    }\n    //return; // if there is some future new message type, its probably better to default to be visible than to hide it.\n};\nChatPortrait.getLogElement = function (chatLog) {\n    const el = chatLog.element;\n    const log = el.length ? el[0].querySelector(\"#chat-log\") : null;\n    return log;\n};\nChatPortrait.shouldScrollToBottom = function (log) {\n    // If more than half chat log height above the actual bottom, don't do the scroll.\n    const propOfClientHeightScrolled = (log.scrollHeight - log.clientHeight - log.scrollTop) / log.clientHeight;\n    return propOfClientHeightScrolled <= 0.5;\n};\n","import CONSTANTS from \"./constants.js\";\nimport \"./api.js\";\nimport { setSocket } from \"../module.js\";\nimport Logger from \"./lib/Logger.js\";\nexport const SOCKET_HANDLERS = {\n    // TODO ADD SOCKET HANLDER\n};\nexport let chatPortraitSocket;\nexport function registerSocket() {\n    Logger.debug(\"Registered chatPortraitSocket\");\n    if (chatPortraitSocket) {\n        return chatPortraitSocket;\n    }\n    //\n    chatPortraitSocket = socketlib.registerModule(CONSTANTS.MODULE_ID);\n    // TODO add some socket method ?\n    setSocket(chatPortraitSocket);\n    return chatPortraitSocket;\n}\n","import CONSTANTS from \"../constants.js\";\nimport Logger from \"../lib/Logger.js\";\nconst CSS_PREFIX = `${CONSTANTS.MODULE_ID}--`;\nconst CSS_CURRENT_SPEAKER = CSS_PREFIX + \"currentSpeaker\";\nconst CHAT_MESSAGE_SUB_TYPES = {\n    NONE: 0,\n    DESC: 1,\n    AS: 2,\n};\nlet image;\n// Add name\nlet text;\n// Add buttons / indicators\nlet locked;\nlet lastHoveredToken;\nlet currentSpeakerDisplay;\nfunction getThisSceneTokenObj(speaker) {\n    let token = getTokenObj(speaker.token);\n    if (!token) {\n        token = getThisSceneTokenObjForActor(speaker.actor);\n    }\n    return token;\n}\nfunction getThisSceneTokenObjForActor(actorID) {\n    let token = null;\n    const scene = game.scenes?.get(game.user?.viewedScene);\n    if (scene) {\n        const thisSceneToken = scene.tokens.find((token) => {\n            return token.actor && token.actor.id === actorID;\n        });\n        if (thisSceneToken) {\n            token = getTokenObj(thisSceneToken.id);\n        }\n    }\n    return token;\n}\nfunction getTokenObj(id) {\n    if (!canvas.ready) {\n        Logger.info(`getTokenObj(${id}) bailed - canvas is not ready yet`);\n        return undefined;\n    }\n    return canvas.tokens?.get(id);\n}\nexport const initSpeakingAs = function () {\n    // Create our div\n    currentSpeakerDisplay = document.createElement(\"div\");\n    currentSpeakerDisplay.classList.add(CSS_CURRENT_SPEAKER);\n    // Add images\n    image = `<img class=\"${CSS_CURRENT_SPEAKER}--icon\">`;\n    // Add name\n    text = `<span class=\"${CSS_CURRENT_SPEAKER}--text\"></span>`;\n    // Add buttons / indicators\n    locked = `<i class=\"fa-solid fa-unlock ${CSS_CURRENT_SPEAKER}--locked\"></i>`;\n    // Once: <i class=\"fa-solid fa-circle-1\"></i>\n    // Repeat: <i class=\"fa-solid fa-repeat\"></i>\n    let oocButton = $(\n        $.parseHTML(\n            `<i class=\"fa-solid fa-user ${CSS_CURRENT_SPEAKER}--button\" data-tooltip=\"\"><i class=\"${CSS_CURRENT_SPEAKER}--buttonInset fa-solid fa-inverse\" mode=\"0\"></i></i>`,\n        ),\n    );\n    oocButton.click(function (event) {\n        event.stopPropagation();\n        let classes = [\"\", \"fa-circle-1\", \"fa-repeat\"];\n        $(`.${CSS_CURRENT_SPEAKER}--buttonInset`).attr(\"mode\", mode() >= 2 ? 0 : mode() + 1);\n        $(`.${CSS_CURRENT_SPEAKER}--buttonInset`)\n            .removeClass(classes.at(mode() - 1) ?? \"\")\n            .addClass(classes.at(mode()));\n        updateSpeaker();\n    });\n    $(currentSpeakerDisplay).append(image).append(text).append(locked).append(oocButton);\n};\nconst hoverIn = (event, speaker) => {\n    let token = getThisSceneTokenObj(speaker);\n    if (token && token.isVisible) {\n        event.fromChat = true;\n        //\n        token._onHoverIn(event);\n        //\n        lastHoveredToken = token;\n    }\n};\nconst hoverOut = (event) => {\n    if (lastHoveredToken) {\n        event.fromChat = true;\n        //\n        lastHoveredToken._onHoverOut(event);\n        lastHoveredToken = null;\n    }\n};\nconst panToSpeaker = (speaker) => {\n    panToToken(getThisSceneTokenObj(speaker));\n};\nconst panToToken = (token) => {\n    if (token && token.isVisible) {\n        //\n        const scale = Math.max(1, canvas.stage?.scale.x);\n        canvas.animatePan({ ...token.center, scale, duration: 1000 });\n    }\n};\nconst hasTokenOnSheet = (actor) => {\n    return !!getThisSceneTokenObjForActor(actor.id);\n};\nconst selectActorToken = (actor) => {\n    let token = getThisSceneTokenObjForActor(actor.id);\n    token.control();\n    panToToken(token);\n};\nfunction updateMessageData(messageData, ...args) {\n    return messageData.updateSource.apply(messageData, args);\n}\n// https://github.com/cs96and/FoundryVTT-CGMP/blob/c9ff185fb5dcdde67815039dc78a5de409a24956/module/scripts/chat-resolver.js#L122\nfunction convertToOoc(messageData) {\n    // For all types of messages, change the speaker to the GM.\n    // Convert in-character message to out-of-character, and remove the actor and token.\n    const isInCharacter = CONST.CHAT_MESSAGE_STYLES.IC === messageData.style;\n    const newType = isInCharacter ? CONST.CHAT_MESSAGE_STYLES.OOC : messageData.style;\n    const newActor = isInCharacter ? null : messageData.speaker.actor;\n    const newToken = isInCharacter ? null : messageData.speaker.token;\n    const newTokenD = isInCharacter ? null : messageData.token;\n    const newActorD = isInCharacter ? null : messageData.actor;\n    const user = messageData.user instanceof User ? messageData.user : game.users?.get(messageData.user);\n    updateMessageData(messageData, {\n        type: newType,\n        speaker: {\n            actor: newActor,\n            alias: user.name,\n            token: newToken,\n        },\n        token: newTokenD,\n        actor: newActorD,\n    });\n}\nexport function overrideMessage(messageData) {\n    if (mode() === 0) return;\n    switch (messageData?.flags?.cgmp?.subType) {\n        case CHAT_MESSAGE_SUB_TYPES.AS:\n        case CHAT_MESSAGE_SUB_TYPES.DESC: {\n            break;\n        }\n        default: {\n            //\n            convertToOoc(messageData, true);\n            break;\n        }\n    }\n    if (mode() === 1) {\n        $(`.${CSS_CURRENT_SPEAKER}--buttonInset`).attr(\"mode\", 0);\n        $(`.${CSS_CURRENT_SPEAKER}--buttonInset`).removeClass(\"fa-circle-1\");\n        updateSpeaker();\n    }\n}\nfunction mode() {\n    return Number($(`.${CSS_CURRENT_SPEAKER}--buttonInset`).attr(\"mode\"));\n}\nexport function updateSpeaker() {\n    // Get the token speaker, if it doesn't exist it turns undefined.\n    let tokenDocument = fromUuidSync(`Scene.${ChatMessage.getSpeaker().scene}.Token.${ChatMessage.getSpeaker().token}`);\n    let name = ChatMessage.getSpeaker().alias;\n    let lockReason = false;\n    if (mode() !== 0) {\n        lockReason = game.i18n.localize(\"chat-portrait.self-locked\");\n        name = game.user?.name;\n    }\n    const speakerObject =\n        name !== game.user?.name\n            ? {\n                  actor: tokenDocument?.actor?.id,\n                  alias: name,\n                  scene: tokenDocument?.parent?.id ?? game.user?.viewedScene,\n                  token: tokenDocument?.id,\n              }\n            : {\n                  alias: name,\n                  scene: game.user?.viewedScene,\n              };\n    // Compatibility with Cautious Gamemaster's Pack\n    // 1 - Disable Speaking as PC (GM ONLY, you can still speak as non-player owned tokens)\n    // 2 - Force in Character (only ASSIGNED characters)\n    // 3 - Force out of Character (always out of character)\n    // If the module is active\n    if (game.modules.get(\"CautiousGamemastersPack\")?.active) {\n        // If the user is a player and is forced to be always out of character (3)\n        // If the user is a gamemaster and is forced to be always out of character (3)\n        if (\n            (game.user?.isGM && game.settings.get(\"CautiousGamemastersPack\", \"gmSpeakerMode\") === 3) ||\n            (!game.user?.isGM && game.settings.get(\"CautiousGamemastersPack\", \"playerSpeakerMode\") === 3)\n        ) {\n            name = game.user?.name;\n            lockReason = `${game.i18n.format(\"chat-portrait.locked\", { module: \"Cautious Gamemaster's Pack\" })}`;\n        }\n        // If the user is a gamemaster and cannot speak as PC tokens (1)\n        if (\n            game.user?.isGM &&\n            game.settings.get(\"CautiousGamemastersPack\", \"gmSpeakerMode\") === 1 &&\n            tokenDocument?.actor?.hasPlayerOwner\n        ) {\n            name = game.user?.name;\n            lockReason = `${game.i18n.format(\"chat-portrait.locked\", { module: \"Cautious Gamemaster's Pack\" })}`;\n        }\n        // If the user is a gamemaster and is forced to be always in character (2)\n        if (\n            (game.user?.isGM && game.settings.get(\"CautiousGamemastersPack\", \"gmSpeakerMode\") === 2) ||\n            (!game.user?.isGM && game.settings.get(\"CautiousGamemastersPack\", \"playerSpeakerMode\") === 2)\n        ) {\n            //\n            tokenDocument = game.user?.character?.prototypeToken;\n            name = game.user?.character?.name;\n            lockReason = `${game.i18n.format(\"chat-portrait.locked\", { module: \"Cautious Gamemaster's Pack\" })}`;\n        }\n    }\n    // If a token is available and the user can speak as the character.\n    if (tokenDocument && name !== game.user?.name) {\n        //\n        image = `<img src=\"${tokenDocument.texture?.src}\" class=\"${CSS_CURRENT_SPEAKER}--icon\" style=\"transform: scale(${tokenDocument.texture.scaleX})\">`;\n    } else {\n        image = `<img src=\"${game.user?.avatar}\" class=\"${CSS_CURRENT_SPEAKER}--icon\">`;\n    }\n    text = `<span class=\"${CSS_CURRENT_SPEAKER}--text\">${name}</span>`;\n    locked = $(\n        $.parseHTML(\n            `<i class=\"fa-solid fa-unlock ${CSS_CURRENT_SPEAKER}--locked\" data-tooltip=\"${game.i18n.localize(\n                \"chat-portrait.unlocked\",\n            )}\"></i>`,\n        ),\n    );\n    if (lockReason) {\n        $(locked).attr(\"data-tooltip\", lockReason);\n        $(locked).removeClass(\"fa-unlock\").addClass(\"fa-lock\");\n    }\n    image = $(image);\n    text = $(text);\n    locked = $(locked);\n    var textAndImage = $().add(image).add(text);\n    textAndImage\n        // hover over token\n        .hover(\n            (event) => {\n                hoverIn(event, speakerObject);\n            },\n            (event) => {\n                //\n                hoverOut(event, speakerObject);\n            },\n        )\n        // add hover glow on token\n        .hover(function () {\n            if (name !== game.user?.name) $(this).toggleClass(`shadow`);\n        })\n        // double click to pan to the token\n        .dblclick(() => panToSpeaker(speakerObject));\n    $(image).on(\"load\", () => {\n        if ($(`${CSS_CURRENT_SPEAKER}--icon`).html() !== image.html()) {\n            $(`.${CSS_CURRENT_SPEAKER}--icon`).replaceWith(image);\n        }\n        if ($(`${CSS_CURRENT_SPEAKER}--text`).html() !== text.html()) {\n            $(`.${CSS_CURRENT_SPEAKER}--text`).replaceWith(text);\n        }\n        if ($(`${CSS_CURRENT_SPEAKER}--locked`).html() !== locked.html()) {\n            $(`.${CSS_CURRENT_SPEAKER}--locked`).replaceWith(locked);\n        }\n        setTimeout(checkWarn(), 0);\n    });\n}\nHooks.once(\"renderChatLog\", () => {\n    if (game.settings.get(CONSTANTS.MODULE_ID, \"enableSpeakingAs\")) {\n        const chatControls = document.getElementById(\"chat-controls\");\n        // \"be last\" magic trick from Supe\n        setTimeout(async () => {\n            chatControls.parentNode?.insertBefore(currentSpeakerDisplay, chatControls);\n            // Apparently game.i18n.localize is not loaded when the button is added so it's here instead.\n            $(`.${CSS_CURRENT_SPEAKER}--button`).attr(\"data-tooltip\", Logger.i18n(\"chat-portrait.buttonHint\"));\n        }, 0);\n        const currentSpeakerToggleMenu = new ContextMenu($(chatControls?.parentNode), \".\" + CSS_CURRENT_SPEAKER, []);\n        const originalRender = currentSpeakerToggleMenu.render.bind(currentSpeakerToggleMenu);\n        currentSpeakerToggleMenu.render = (...args) => {\n            const actors = game.actors?.contents.filter((a) => a.isOwner && hasTokenOnSheet(a));\n            const speakerOptions = [];\n            for (let actor of actors) {\n                speakerOptions.push({\n                    name: actor.name,\n                    icon: \"\",\n                    callback: () => {\n                        selectActorToken(actor);\n                    },\n                });\n            }\n            currentSpeakerToggleMenu.menuItems = speakerOptions;\n            originalRender(...args);\n        };\n        setTimeout(async () => {\n            updateSpeaker();\n            $(\"#chat-message\").on(\"input\", () => {\n                checkWarn();\n            });\n            $(\"#chat-message\").on(\"keydown\", () => {\n                $(\"#chat-message\").removeClass(CSS_PREFIX + \"warning\");\n                //\n                game.tooltip.deactivate();\n            });\n        }, 0);\n        // Remove Illandril's Chat Enhancements display\n        if (game.modules.get(\"illandril-chat-enhancements\")?.active) {\n            document.getElementsByClassName(\"illandril-chat-enhancements--current-speaker\")[0]?.remove();\n        }\n    }\n});\nfunction checkWarn() {\n    // Add a warning on key enter if the textarea contains quotes, as if you were talking in character.\n    if (\n        game.settings.get(CONSTANTS.MODULE_ID, \"speakingAsWarningCharacters\") === \"\" ||\n        $(\".chat-portrait--currentSpeaker--text\").text() !== game.user?.name || // Return if speaking out of character\n        [\"/ic\", \"/ooc\", \"/emote\"].some((str) => $(\"#chat-message\").val()?.includes(str)) // Return if the message contains a command that would deliberately make you speak in or out of character\n    ) {\n        $(\"#chat-message\").removeClass(CSS_PREFIX + \"warning\");\n        //\n        game.tooltip.deactivate();\n        return;\n    }\n    const regex = new RegExp(game.settings.get(CONSTANTS.MODULE_ID, \"speakingAsWarningCharacters\"));\n    if (regex.test($(\"#chat-message\").val())) {\n        $(\"#chat-message\").addClass(CSS_PREFIX + \"warning\");\n        //\n        game.tooltip.activate($(\"#chat-message\")[0], {\n            text: Logger.i18nFormat(\"chat-portrait.speakingAs.buttonHint.warning\", {\n                characters: game.settings.get(CONSTANTS.MODULE_ID, \"speakingAsWarningCharacters\"),\n            }),\n            direction: \"LEFT\",\n        });\n    } else {\n        $(\"#chat-message\").removeClass(CSS_PREFIX + \"warning\");\n        //\n        game.tooltip.deactivate();\n    }\n}\n// Hooks.on(\"controlToken\", updateSpeaker);\n// Hooks.on('preCreateChatMessage', overrideMessage);\n","import \"../constants.js\";\nimport Logger from \"../lib/Logger.js\";\nvar color;\nvar height;\nvar bgcolor;\nvar width = \"80%\";\nvar checkedSetting = false;\nexport const readySpeakAs = function () {\n    const btn = document.querySelector(\"#speakerSwitch\");\n    btn?.addEventListener(\"click\", (event) => {\n        //\n        checkedSetting = document?.getElementById(\"speakerSwitch\")?.checked;\n    });\n    Hooks.on(\"chatMessage\", (dialog, $element, targets) => {\n        let namelist = document.getElementById(\"namelist\");\n        //\n        let checkedSpeakAS = document.getElementById(\"speakerSwitch\")?.checked;\n        if (!checkedSpeakAS) {\n            Logger.debug(`checkedSpeakAS is not checked`);\n            return;\n        }\n        if (!namelist) {\n            Logger.warn(`namelist is not checked`);\n            return;\n        }\n        switch (namelist.value) {\n            case \"userName\": {\n                targets.speaker.actor = null;\n                targets.speaker.token = null;\n                //\n                targets.speaker.alias = null;\n                break;\n            }\n            default: {\n                let map = game.scenes?.find((scene) => scene.isView);\n                if (map) {\n                    let tokenTarget = map.tokens.find((token) => {\n                        return (\n                            // token.name === namelist.options[namelist.selectedIndex].text ||\n                            // token.actor?.name === namelist.options[namelist.selectedIndex].text ||\n                            token.id === namelist.options[namelist.selectedIndex].value ||\n                            token.actor?.id === namelist.options[namelist.selectedIndex].value\n                        );\n                    });\n                    if (!tokenTarget) {\n                        Logger.debug(`No target is been found`);\n                        // targets.speaker.token = \"Speak As zzzz\";\n                        let myactors = game.actors.filter((actor) => actor.permission >= 2);\n                        let actorTarget = myactors?.find((actor) => {\n                            return (\n                                actor?.name === namelist.options[namelist.selectedIndex].text ||\n                                actor?.id === namelist.options[namelist.selectedIndex].value\n                            );\n                        });\n                        if (actorTarget) {\n                            //targets.speaker.token = actorTarget.id;\n                            targets.speaker.actor = actorTarget.id;\n                        }\n                        targets.speaker.alias = namelist.options[namelist.selectedIndex].text;\n                    }\n                    if (tokenTarget) {\n                        targets.speaker.token = tokenTarget.id;\n                        targets.speaker.alias = namelist.options[namelist.selectedIndex].text;\n                    }\n                } else {\n                    Logger.debug(`No scene is viewed at this moment`);\n                }\n                break;\n            }\n        }\n    });\n    Hooks.on(\"renderActorDirectory\", (dialog, $element, targets) => {\n        $(\"#divnamelist\").remove();\n        $(\"#chat-controls.flexrow\").before(updateSpeakerList());\n        check();\n        $(\".roll-type-select\").css(\"color\") ? (color = $(\".roll-type-select\").css(\"color\")) : null;\n        $(\".roll-type-select\").css(\"height\") ? (height = $(\".roll-type-select\").css(\"height\")) : null;\n        $(\".roll-type-select\").css(\"background\") ? (bgcolor = $(\".roll-type-select\").css(\"background\")) : null;\n        var x = document.querySelectorAll(\"#namelist\");\n        if (!x.length) {\n            return;\n        }\n        if (width) {\n            //\n            x[0].style.setProperty(\"width\", width, \"important\");\n        }\n        if (color) {\n            //\n            x[0].style.setProperty(\"color\", color, \"important\");\n        }\n        if (height) {\n            //\n            x[0].style.setProperty(\"height\", height, \"important\");\n        }\n        if (bgcolor) {\n            //\n            x[0].style.setProperty(\"background\", bgcolor, \"important\");\n        }\n    });\n};\nexport const renderSidebarTabSpeakAs = function (dialog, $element, targets) {\n    /**\n     * 自己的登入名字\n     * 自己擁有的角色\n     */\n    let HTML = $(\"div#chat-controls.flexrow\")[0]; // $element.find(`div#chat-controls.flexrow`)[0];\n    if (!HTML) {\n        return;\n    }\n    $(\"#divnamelist\").remove();\n    $(\"#chat-controls.flexrow\").before(updateSpeakerList());\n    $(\".roll-type-select\").css(\"color\") ? (color = $(\".roll-type-select\").css(\"color\")) : null;\n    $(\".roll-type-select\").css(\"height\") ? (height = $(\".roll-type-select\").css(\"height\")) : null;\n    $(\".roll-type-select\").css(\"background\") ? (bgcolor = $(\".roll-type-select\").css(\"background\")) : null;\n    check();\n    var x = document.querySelectorAll(\"#namelist\");\n    if (width) {\n        //\n        x[0].style.setProperty(\"width\", width, \"important\");\n    }\n    if (color) {\n        //\n        x[0].style.setProperty(\"color\", color, \"important\");\n    }\n    if (height) {\n        //\n        x[0].style.setProperty(\"height\", height, \"important\");\n    }\n    if (bgcolor) {\n        //\n        x[0].style.setProperty(\"background\", bgcolor, \"important\");\n    }\n    $(\"#namelist\").attr(\"title\", \"Speak As……\");\n    $(\"#speakerSwitch\").attr(\"title\", \"Disable Speak As…… if unchecked\");\n};\nfunction resortCharacter(activeActor, characterList, selectedCharacter) {\n    let newCharacterList = [];\n    for (let index = 0; index < characterList.length; index++) {\n        let check = false;\n        for (let index2 = 0; index2 < activeActor.length; index2++) {\n            if (activeActor[index2] === characterList[index].name) {\n                check = true;\n                break;\n            }\n        }\n        if (selectedCharacter === characterList[index].name) break;\n        if (check) newCharacterList.unshift(characterList[index]);\n        else newCharacterList.push(characterList[index]);\n    }\n    let uniq = [...new Set(newCharacterList)];\n    return uniq;\n}\nfunction updateSpeakerList() {\n    let myUser = game.users?.find((user) => user.id == game.userId);\n    let myactors = game.actors?.filter((actor) => actor.permission >= 2);\n    myactors = myactors.sort((a, b) => a.name.localeCompare(b.name));\n    let selectedCharacter = myactors.find((actor) => actor.id === myUser.character?.id);\n    const users = game.users.filter((user) => user.active);\n    let playerNames = users.map((u) => u.character?.name);\n    myactors = resortCharacter(playerNames, myactors, selectedCharacter?.name);\n    let formConfig = ``;\n    const options = [];\n    if (selectedCharacter) {\n        options.push(\n            `<option data-image=\"${selectedCharacter.img}\" selected=\"selected\" value=\"${selectedCharacter.id}\">${selectedCharacter.name}</option>`,\n        );\n        options.push(\n            `<option data-image=\"${myUser.avatar}\" name=\"${myUser.name}\" value=\"userName\">${myUser.name}</option>`,\n        );\n    } else {\n        options.push(\n            `<option data-image=\"${myUser.avatar}\" selected=\"selected\" name=\"${myUser.name}\" value=\"userName\">${myUser.name}</option>`,\n        );\n    }\n    myactors.forEach((a) => {\n        options.push(`<option data-image=\"${a.img}\"  value=\"${a.id}\">${a.name}</option>`);\n    });\n    let addText = `\n\t<div style=\"flex: 0;\" id=\"divnamelist\">\n\t\t<input type=\"checkbox\" id=\"speakerSwitch\" name=\"speakerSwitch\" checked>\n\t\t<select \n\t\t\tclass=\"actor-template\" \n\t\t\tid=\"namelist\"\n\t\t\tname=\"namelist\" \n\t\t\tclass=\"namelist\"\n\t\t\tdata-dtype=\"String\" \n\t\t\tis=\"ms-dropdown-chat-portrait\"\n\t\t\tdata-enable-auto-filter\n\t\t\t>\n\t\t\t<optgroup label=\"Speak As....\">\n\t\t\t${options.join(\"\")}\n\t\t\t</optgroup>\n\t\t</select>\n    </div>\n    `;\n    /*\n    let addText = `<div style=\"flex: 0;\" id=\"divnamelist\">\n    <input type=\"checkbox\" id=\"speakerSwitch\" name=\"speakerSwitch\" checked>\n    <select name=\"namelist\" id=\"namelist\" class=\"namelist\">\n    <optgroup label=\"Speak As....\">`;\n    if (selectedCharacter) {\n        addText += `<option value=\"${selectedCharacter.id}\">${selectedCharacter.name}</option>`;\n    }\n    addText += `<option value=\"userName\" name=\"XX\">${myUser.name}</option>`;\n    for (let index = 0; index < myactors.length; index++) {\n        addText += `\\n<option value=\"${myactors[index].id}\">${myactors[index].name}</option>`;\n    }\n    addText += `\\n</select></div>`;\n    */\n    return addText;\n}\nfunction check() {\n    // let checkedSetting = game.settings.get(CONSTANTS.MODULE_ID, \"speak-as-checked\");\n    let speaker = document.getElementById(\"speakerSwitch\");\n    if (speaker) {\n        //\n        speaker.checked = checkedSetting;\n    }\n}\n","import { ChatPortrait } from \"./ChatPortrait.js\";\nimport CONSTANTS from \"./constants.js\";\nimport { setApi } from \"../module.js\";\nimport API from \"./api.js\";\nimport { registerSocket } from \"./socket.js\";\nimport { initSpeakingAs, overrideMessage, updateSpeaker } from \"./apps/speaking-as.js\";\nimport { readySpeakAs, renderSidebarTabSpeakAs } from \"./apps/speak-as.js\";\nconst mapCombatTrackerPortrait = new Map();\nexport const initHooks = () => {\n    // debug(\"Init Hooks processing\");\n    Hooks.once(\"socketlib.ready\", registerSocket);\n    if (game.settings.get(CONSTANTS.MODULE_ID, \"enableSpeakingAs\")) {\n        initSpeakingAs();\n    }\n};\nexport const setupHooks = async () => {\n    // debug(\"Setup Hooks processing\");\n    setApi(API);\n    // setup all the hooks\n    let imageReplacer;\n    // if (ChatPortrait.settings.useImageReplacer) {\n    //   imageReplacer = ImageReplacerInit();\n    // }\n    let currentSpeakerBackUp;\n    /**\n     * This line connects our method above with the chat rendering.\n     * Note that this happens after the core code has already generated HTML.\n     * Bind to any newly rendered chat cards at runtime\n     * For whatever reason, this callback is sometimes called with unattached html elements\n     */\n    Hooks.on(\"renderChatMessage\", async (message, html, speakerInfo) => {\n        if (!speakerInfo.message.speaker.token && currentSpeakerBackUp?.token) {\n            if (currentSpeakerBackUp.scene) {\n                speakerInfo.message.speaker.scene = currentSpeakerBackUp.scene;\n            }\n            if (currentSpeakerBackUp.actor) {\n                speakerInfo.message.speaker.actor = currentSpeakerBackUp.actor;\n            }\n            if (currentSpeakerBackUp.token) {\n                speakerInfo.message.speaker.token = currentSpeakerBackUp.token;\n            }\n            if (currentSpeakerBackUp.alias) {\n                speakerInfo.message.speaker.alias = currentSpeakerBackUp.alias;\n            }\n        }\n        //\n        if (!message.speaker.token && currentSpeakerBackUp?.token) {\n            //\n            if (currentSpeakerBackUp.scene) {\n                //\n                message.speaker.scene = currentSpeakerBackUp.scene;\n            }\n            //\n            if (currentSpeakerBackUp.actor) {\n                //\n                message.speaker.actor = currentSpeakerBackUp.actor;\n            }\n            //\n            if (currentSpeakerBackUp.token) {\n                //\n                message.speaker.token = currentSpeakerBackUp.token;\n            }\n            //\n            if (currentSpeakerBackUp.alias) {\n                //\n                message.speaker.alias = currentSpeakerBackUp.alias;\n            }\n        }\n        ChatPortrait.onRenderChatMessage(message, html, speakerInfo, imageReplacer);\n        setTimeout(function () {\n            const log = document.querySelector(\"#chat-log\");\n            const shouldForceScroll = log ? ChatPortrait.shouldScrollToBottom(log) : false;\n            if (log && shouldForceScroll) {\n                log.scrollTo({ behavior: \"smooth\", top: log.scrollHeight });\n            }\n        }, 50);\n        // ChatPortraitChatCard.bind(message, html, speakerInfo, imageReplacer);\n    });\n    // Hooks.on('createChatMessage', async (message:ChatMessage, render, userId) => {\n    //   if(!message.speaker.token && currentSpeakerBackUp?.token){\n    //     if(currentSpeakerBackUp.scene) message.speaker.scene = currentSpeakerBackUp.scene;\n    //     if(currentSpeakerBackUp.actor) message.speaker.actor = currentSpeakerBackUp.actor;\n    //     if(currentSpeakerBackUp.token) message.speaker.token = currentSpeakerBackUp.token;\n    //     if(currentSpeakerBackUp.alias) message.speaker.alias = currentSpeakerBackUp.alias;\n    //   }\n    //   if(render.render){\n    //     const html:JQuery<HTMLElement> = $(\"<div>\" + message.content + \"</div>\");\n    //     let speakerInfo = message.speaker;\n    //     //\n    //     if(!speakerInfo.alias && speakerInfo.document?.alias){\n    //       //\n    //       speakerInfo.alias = speakerInfo.document?.alias;\n    //     }\n    //     await ChatPortrait.onRenderChatMessage(message, html, speakerInfo, imageReplacer);\n    //     let updates = {\n    //       content: html.html()\n    //     };\n    //     message.update(updates);\n    //     //\n    //     speakerInfo.message = {};\n    //      //\n    //     speakerInfo.message = message;\n    //   }\n    // });\n    // let chatData:any = {\n    //   type: ChatPortrait.getMessageTypeVisible(speakerInfo),\n    //   user: game.user,\n    //   speaker: speakerInfo,\n    //   content: message.content,\n    //   //\n    //   whisper: message.whisper ? message.whisper : speakerInfo.document.whisper,\n    // };\n    // await ChatMessage.create(chatData,{});\n    // Hooks.on(\"chatMessage\", (chatlog, messageText, chatData) => {\n    //   let test = \"\";\n    // });\n    // Hooks.on('updateChatMessage', (message, update, options, user) => {\n    // });\n    // let flag = true;\n    /**\n     * Catch chat message creations and add some more data if we need to\n     */\n    Hooks.on(\"preCreateChatMessage\", (message, options, render, userId) => {\n        //\n        // const src = ChatPortrait.getTokenFromSpeaker(message.speaker);\n        let speakerInfo = {};\n        //\n        if (message.speaker?.token) {\n            //\n            const src = ChatPortrait.loadImagePathForChatMessage(message.speaker);\n            if (src) {\n                //\n                message.updateSource({\n                    flags: {\n                        \"chat-portrait\": {\n                            src: src,\n                        },\n                    },\n                });\n            }\n        }\n        if (game.settings.get(CONSTANTS.MODULE_ID, \"enableSpeakingAs\")) {\n            overrideMessage(message);\n        }\n        // if (game.settings.get(CONSTANTS.MODULE_ID, \"applyPreCreateChatMessagePatch\")) {\n        // \tif (options) {\n        // \t\t// Update the speaker\n        // \t\tif (!options.speaker || (!options.speaker.token && !options.speaker.actor)) {\n        // \t\t\tlet user = game.users?.get(options.user);\n        // \t\t\tlet avatar;\n        // \t\t\tif (!user && options.user) {\n        // \t\t\t\tuser = game.users?.get(options.user?.id);\n        // \t\t\t} else {\n        // \t\t\t\tuser = game.users?.get(userId);\n        // \t\t\t}\n        // \t\t\tconst speakerInfo: any = {};\n        // \t\t\tconst mytoken = ChatPortrait.getFirstPlayerToken();\n        // \t\t\tspeakerInfo.alias = message.alias;\n        // \t\t\tspeakerInfo.token = mytoken;\n        // \t\t\tspeakerInfo.actor = game.actors?.get(<string>user?.character?.id);\n        // \t\t\tconst updates = {\n        // \t\t\t\tspeaker: speakerInfo,\n        // \t\t\t};\n        // \t\t\tmessage.update(updates);\n        // \t\t}\n        // \t\t// MidiQol , Better Rolls, and other modules.. sometime destroy the info\n        // \t\t// for my purpose i backup the speaker i will found on the preCreateChatMessage\n        // \t\telse if (options.speaker) {\n        // \t\t\tcurrentSpeakerBackUp = options.speaker;\n        // \t\t\tif (options.speaker.token) {\n        // \t\t\t\tcurrentSpeakerBackUp.token = options.speaker.token?.id;\n        // \t\t\t}\n        // \t\t}\n        // \t}\n        // \t// if(render.render){\n        // \t//   const html:JQuery<HTMLElement> = $(\"<div>\" + message.content + \"</div>\");\n        // \t//   let speakerInfo = message.speaker;\n        // \t//   //\n        // \t//   if(!speakerInfo.alias && speakerInfo.document?.alias){\n        // \t//     //\n        // \t//     speakerInfo.alias = speakerInfo.document?.alias;\n        // \t//   }\n        // \t//   await ChatPortrait.onRenderChatMessage(message, html, speakerInfo, imageReplacer);\n        // \t//   let updates = {\n        // \t//     content: html.html()\n        // \t//   };\n        // \t//   message.update(updates);\n        // \t//   //\n        // \t//   speakerInfo.message = {};\n        // \t//    //\n        // \t//   speakerInfo.message = message;\n        // \t//   if(flag){\n        // \t//     let chatData:any = {\n        // \t//       type: ChatPortrait.getMessageTypeVisible(speakerInfo),\n        // \t//       user: game.user,\n        // \t//       speaker: speakerInfo,\n        // \t//       content: message.content,\n        // \t//       //\n        // \t//       whisper: message.whisper ? message.whisper : speakerInfo.document.whisper,\n        // \t//     };\n        // \t//     flag = false;\n        // \t//     ChatMessage.create(chatData,{});\n        // \t//   }else{\n        // \t//     flag = true;\n        // \t//   }\n        // \t// }\n        // }\n    });\n    Hooks.on(\"controlToken\", (token, options) => {\n        if (game.settings.get(CONSTANTS.MODULE_ID, \"enableSpeakingAs\")) {\n            updateSpeaker();\n        }\n    });\n};\nexport const readyHooks = async () => {\n    if (game.settings.get(CONSTANTS.MODULE_ID, \"enableSpeakAs\")) {\n        readySpeakAs();\n    }\n    Hooks.on(\"renderSidebarTab\", (dialog, $element, targets) => {\n        if (game.settings.get(CONSTANTS.MODULE_ID, \"enableSpeakAs\")) {\n            renderSidebarTabSpeakAs(dialog, $element, targets);\n        }\n    });\n    // debug(\"Ready Hooks processing\");\n    // When the combat tracker is rendered, we need to completely replace\n    // its HTML with a custom version.\n    Hooks.on(\"renderCombatTracker\", async (app, html, options) => {\n        if (game.settings.get(CONSTANTS.MODULE_ID, \"applyOnCombatTracker\")) {\n            // If there's as combat, we can proceed.\n            if (game.combat) {\n                // Retrieve a list of the combatants\n                const combatants = game.combat?.combatants;\n                combatants.forEach(async (c) => {\n                    // Add class to trigger drag events.\n                    const $combatant = html.find(`.combatant[data-combatant-id=\"${c.id}\"]`);\n                    //$combatant.addClass('actor-elem');\n                    //\n                    const img = $combatant.find(\".token-image\")[0];\n                    const tokenID = c.token?.id;\n                    let imgPath = CONSTANTS.DEF_TOKEN_IMG_PATH;\n                    if (!mapCombatTrackerPortrait.get(tokenID)) {\n                        const actorID = c.actor?.id;\n                        const token = ChatPortrait._getTokenFromId(tokenID);\n                        let userID = \"\";\n                        let isOwnedFromPLayer = false;\n                        let useTokenImage = ChatPortrait.settings.useTokenImage;\n                        const actor = ChatPortrait.getActorFromSpeaker(token.actor);\n                        const doNotUseTokenImageWithSpecificType = ChatPortrait.settings\n                            .doNotUseTokenImageWithSpecificType\n                            ? String(ChatPortrait.settings.doNotUseTokenImageWithSpecificType).split(\",\")\n                            : [];\n                        if (\n                            doNotUseTokenImageWithSpecificType.length > 0 &&\n                            doNotUseTokenImageWithSpecificType.includes(actor?.type)\n                        ) {\n                            useTokenImage = false;\n                        }\n                        if (ChatPortrait.settings.useAvatarImage && !useTokenImage) {\n                            // if user not admin is owner of the token\n                            //userID = (!game.user?.isGM && token.actor?.hasPerm(<User>game.user, \"OWNER\")) ? <string>game.user?.id : \"\";\n                            //userID = (!game.user?.isGM && (token.document.permission === CONST.ENTITY_PERMISSIONS.OWNER)) ? <string>game.user?.id : \"\";\n                            const permissions = token.actor?.permission;\n                            for (const keyPermission in permissions) {\n                                const valuePermission = permissions[keyPermission];\n                                if (game.user?.isGM) {\n                                    if (\n                                        game.user?.id != keyPermission &&\n                                        valuePermission === CONST.ENTITY_PERMISSIONS.OWNER\n                                    ) {\n                                        userID = keyPermission;\n                                        break;\n                                    }\n                                } else {\n                                    if (\n                                        game.user?.id === keyPermission &&\n                                        valuePermission === CONST.ENTITY_PERMISSIONS.OWNER\n                                    ) {\n                                        userID = game.user?.id;\n                                        isOwnedFromPLayer = true;\n                                        break;\n                                    }\n                                }\n                            }\n                        }\n                        const sceneID = (canvas.tokens?.get(token.id)).scene.id;\n                        imgPath = ChatPortrait.loadImagePathForCombatTracker(\n                            tokenID,\n                            actorID,\n                            userID,\n                            sceneID,\n                            isOwnedFromPLayer,\n                        );\n                        if (imgPath?.includes(\".webm\")) {\n                            try {\n                                const imgThumb = await ImageHelper.createThumbnail(imgPath);\n                                if (imgPath.includes(\".webm\")) {\n                                    imgPath = imgThumb.thumb;\n                                } else {\n                                    imgPath = imgThumb.src;\n                                }\n                            } catch {\n                                //img.src = imgPath;\n                            }\n                        }\n                        mapCombatTrackerPortrait.set(tokenID, imgPath);\n                    } else {\n                        imgPath = mapCombatTrackerPortrait.get(tokenID);\n                    }\n                    if (imgPath) {\n                        img.setAttribute(\"data-src\", imgPath);\n                    }\n                });\n            } else {\n                mapCombatTrackerPortrait.clear();\n            }\n        }\n    });\n    Hooks.on(\"renderSettingsConfig\", (app, html, data) => {\n        // Add colour pickers to the Configure Game Settings: Module Settings menu\n        const nameBorderColor = `${CONSTANTS.MODULE_ID}.borderColor`;\n        const colourBorderColor = game.settings.get(CONSTANTS.MODULE_ID, \"borderColor\");\n        $(\"<input>\")\n            .attr(\"type\", \"color\")\n            .attr(\"data-edit\", nameBorderColor)\n            .val(colourBorderColor)\n            .insertAfter($(`input[name=\"${nameBorderColor}\"]`, html).addClass(\"color\"));\n        const nameCustomStylingMessageText = `${CONSTANTS.MODULE_ID}.customStylingMessageText`;\n        const customStylingMessageText = game.settings.get(CONSTANTS.MODULE_ID, \"customStylingMessageText\");\n        $(`input[name=\"${nameCustomStylingMessageText}\"]`)\n            .attr(\n                \"placeholder\",\n                `.chat-portrait-text-size-name-dnd5e .chat-portrait-system-dnd5e {\n\t\t\tdisplay: flex;\n\t\t\tmargin: auto;\n\t\t}\n\t\t`,\n            )\n            .attr(\"id\", nameCustomStylingMessageText)\n            .each(function () {\n                const style = $(this).attr(\"style\");\n                const name = $(this).attr(\"name\");\n                const id = $(this).attr(\"id\");\n                const datadtype = $(this).attr(\"data-dtype\");\n                const value = $(this).attr(\"value\");\n                const placeholder = $(this).attr(\"placeholder\");\n                const textbox = $(document.createElement(\"textarea\"))\n                    .attr(\"style\", style)\n                    .attr(\"name\", name)\n                    .attr(\"id\", id)\n                    .attr(\"data-dtype\", datadtype)\n                    .attr(\"value\", value)\n                    .attr(\"placeholder\", placeholder);\n                textbox.val(value);\n                $(this).replaceWith(textbox);\n            });\n        const nameCustomStylingMessageImage = `${CONSTANTS.MODULE_ID}.customStylingMessageImage`;\n        const customStylingMessageImage = game.settings.get(CONSTANTS.MODULE_ID, \"customStylingMessageImage\");\n        $(`input[name=\"${nameCustomStylingMessageImage}\"]`)\n            .attr(\n                \"placeholder\",\n                `.chat-portrait-image-size-name-dnd5e .chat-portrait-system-dnd5e {\n\t\t\tdisplay: flex;\n\t\t\tmargin: auto;\n\t\t}\n\t\t`,\n            )\n            .attr(\"id\", nameCustomStylingMessageImage)\n            .each(function () {\n                const style = $(this).attr(\"style\");\n                const name = $(this).attr(\"name\");\n                const id = $(this).attr(\"id\");\n                const datadtype = $(this).attr(\"data-dtype\");\n                const value = $(this).attr(\"value\");\n                const placeholder = $(this).attr(\"placeholder\");\n                const textbox = $(document.createElement(\"textarea\"))\n                    .attr(\"style\", style)\n                    .attr(\"name\", name)\n                    .attr(\"id\", id)\n                    .attr(\"data-dtype\", datadtype)\n                    .attr(\"value\", value)\n                    .attr(\"placeholder\", placeholder);\n                textbox.val(value);\n                $(this).replaceWith(textbox);\n            });\n    });\n};\n","/**\n * This is your TypeScript entry file for Foundry VTT.\n * Register custom settings, sheets, and constants using the Foundry API.\n * Change this heading to be more descriptive to your module, or remove it.\n * Author: [your name]\n * Content License: [copyright and-or license] If using an existing system\n * \t\t\t\t\tyou may want to put a (link to a) license or copyright\n * \t\t\t\t\tnotice here (e.g. the OGL).\n * Software License: [your license] Put your desired license here, which\n * \t\t\t\t\t determines how others may use and modify your module\n */\n// Import JavaScript modules\n// Import TypeScript modules\nimport { registerSettings } from \"./scripts/settings.js\";\nimport { preloadTemplates } from \"./scripts/preloadTemplates.js\";\nimport { initHooks, readyHooks, setupHooks } from \"./scripts/main.js\";\nimport CONSTANTS from \"./scripts/constants.js\";\n/* ------------------------------------ */\n/* Initialize module\t\t\t\t\t*/\n/* ------------------------------------ */\nHooks.once(\"init\", async () => {\n    // console.log(`${CONSTANTS.MODULE_ID} | Initializing ${CONSTANTS.MODULE_ID}`);\n    // Register custom module settings\n    registerSettings();\n    initHooks();\n    // Assign custom classes and constants here\n    // Register custom module settings\n    // registerSettings();\n    // fetchParams();\n    // Preload Handlebars templates\n    await preloadTemplates();\n    // Register custom sheets (if any)\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    setupHooks();\n    // registerSettings();\n});\n/* ------------------------------------ */\n/* When ready\t\t\t\t\t\t\t*/\n/* ------------------------------------ */\nHooks.once(\"ready\", () => {\n    // Do anything once the module is ready\n    // if (!game.modules.get(\"lib-wrapper\")?.active && game.user.isGM){\n    // \tui.notifications.error(`The '${MODULE_ID}' module requires to install and activate the 'libWrapper' module.`);\n    // \treturn;\n    // }\n    readyHooks();\n});\n/**\n * Initialization helper, to set API.\n * @param api to set to game module.\n */\nexport function setApi(api) {\n    const data = game.modules.get(CONSTANTS.MODULE_ID);\n    data.api = api;\n}\n/**\n * Returns the set API.\n * @returns Api from games module.\n */\nexport function getApi() {\n    const data = game.modules.get(CONSTANTS.MODULE_ID);\n    return data.api;\n}\n/**\n * Initialization helper, to set Socket.\n * @param socket to set to game module.\n */\nexport function setSocket(socket) {\n    const data = game.modules.get(CONSTANTS.MODULE_ID);\n    data.socket = socket;\n}\n/*\n * Returns the set socket.\n * @returns Socket from games module.\n */\nexport function getSocket() {\n    const data = game.modules.get(CONSTANTS.MODULE_ID);\n    return data.socket;\n}\n"],"names":["error","html","size","imgAvatar","check","text","imgToken","token"],"mappings":"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"}