TS-Mod

Evades.io TS script.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==UserScript== 
// @name        TS-Mod
// @version     1.1.91
// @description	Evades.io TS script.
// @author      Script by: DepressionOwU (🎀Depression🎀#5556), Most (begining) ideas: Piger (Piger#2917).
// @match       https://evades.io/*
// @match       https://evades.online/*
// @match       https://eu.evades.io/*
// @run-at      document-start
// @grant       none
// @namespace https://greasyfork.org/users/941435
// ==/UserScript==


globalThis.temp1 = undefined;
globalThis.temp2 = undefined;
globalThis.temp3 = undefined;
globalThis.CANR = true;

console.log("%c IMPORTANT! \nIF THERE IS NO 'Script loaded.' TEXT, YOU PROBABLY HAVE MORE THAT 1 SCRIPT ENABLED THAT CONFLICTS. PLEASE TURN OF THE SCRIPTS YOU DONT NEED.","color: red; font-size: 20px; background: black;border-radius:10px;");
console.log("%cScript loading... ","color: green; font-size: 20px");
console.groupCollapsed("what happened between loading")
console.log("...")
window.customTags = [
	{
		names: [],
		color: "#FFA390",
		text: "[TW]",
		rainbow: false,
		prior:0,
		lock:false,
	},
	{
		names: ["DepressionOwU"],
		color: "#767676",
		text: "[",
		rainbow: false,
		join: true,
		prior:1,
		lock:false,
	},
	{
		names: ["DepressionOwU"],
		color: "#ff0000",
		text: "S",
		rainbow: false,
		join: true,
		prior:2,
		lock:false,
	},
	{
		names: ["DepressionOwU"],
		color: "#00ff14",
		text: "C",
		rainbow: false,
		join: true,
		prior:3,
		lock:false,
	},
	{
		names: ["DepressionOwU"],
		color: "#0095ff",
		text: "R",
		rainbow: false,
		join: true,
		prior:4,
		lock:false,
	},
	{
		names: ["DepressionOwU"],
		color: "#767676",
		text: "]",
		rainbow: false,
		prior:5,
		lock:false,
	},
	{
		names: ["Gianni"],
		color: "#009b77",
		text: "[evader]",
		rainbow: false,
		prior:1,
		lock:false,
	},
	{
		names: ["Invi"],
		color: "#51dddd",
		text: "[Invi]",
		rainbow: false,
		prior:1,
		lock:false,
	},
	{
		names: ["LightY"],
		color: "#f19dba",
		text: "[litijo]",
		rainbow: false,
		prior:1,
		lock:false,
	},
	{
		names: ["Jayyyyyyyyyyyyyy", "GuеstZunolo"/*thats me, not jay lol*/],
		color: "#f00",
		text: "[Dep's BFF]",
		rainbow: true,
		prior:1,
		lock:false,
	},
	{
		names: ["R0YqL"],
		color: "#009b77",
		text: "[Roy]",
		rainbow: true,
		rglow:true,
		prior:1,
		lock:false,
	},
	{
        names: ["Skrip"],
		color: "#009b77",
		text: "[Скрипач]",
		rainbow: true,
		rglow:true,
		prior:1,
		lock:false,
	},
	{
        names: ["ArStar"],
		color: "#009b77",
		text: "[Соль:)]",
		rainbow: true,
		rglow:true,
		prior:1,
		lock:false,
	},
    {
		names: ["Pasemrus"],
		color: "#51dddd",
		text: "[Air]",
		rainbow: false,
		prior:1,
		lock:false,
	},
	{
		names: ["thiccsucc"],
		color: "#9D2005",
		text: "[THICC]",
		rainbow: false,
		prior:1,
		lock:false,
	},
	{
		names: ["L0YqL"],
		color: "#009b77",
		text: "[Loy]",
		rainbow: true,
		rglow:true,
		prior:1,
		lock:false,
	},
	{
		names: ["AWEN"],
		color: "#12e612",
		text: "[buster,legenda]",
		rainbow: true,
		rglow:true,
		prior:1,
		lock:false,
	},
	{
		names: ["NoAwen"],
		color: "#12e612",
		text: "[REALLY]",
		rainbow: false,
		prior:1,
		lock:false,
	},
	{
		names: ["Vikenti"],
		color: "#B026FF",
		text: "[wap cat]",
		rainbow: false,
		prior:1,
		lock:false,
	},
	{
		names: ["haha0201"],
		color: "#c01fed",
		text: "[h",
		join: true,
		rainbow: false,
		prior:1,
		lock:false,
	},
	{
		names: ["haha0201"],
		color: "#25e8be",
		text: "u]",
		rainbow: false,
		prior:2,
		lock:false,
	},
	{
		names: ["nosok"],
		color: "#25e8be",
		text: "🤡",
		rainbow: false,
		prior:1,
		lock:false,
	},
	{
		names: ["koraiii"],
		color: "#fff",
		text: "[Kyng]",
		rainbow: true,
		prior:1,
		lock:false,
	},
	{
		names: ["trevr", "away"],
		color: "#fff",
		text: "[oop]",
		rainbow: true,
		prior:1,
		lock:false,
	},
]

window.vers = {
	v: "1.1.89",
	cl:{
		ts:`#ad86d8`,
		to:`#6f8fd5`,
		jrm:`#f1c40f`,
		mod:`#e67e22`,
		sm:`#ff6b5b`,
		hm:`#f03333`,
		example: `#f99261`,
		cmd: `#aaa`,
		scriptmsg: `#ffceb7`,
		scripter: `#ff00bc`,
	},

	toVers:function(v){
		return `<b style="text-decoration: underline;" onclick="document.querySelector(\`[logid='${v}']\`).scrollIntoView()">${v}</b>`;
	},

	filllogp:function(){

		window.vers.changeLog = [
			{
				version:`1.1.89`,
				news:[
					`Some fixes.`,
					`Some Updates with the new pormotions (late).`,
					[
						`Thirteenth and fourteenth custom tags:`,
						`${`[Jr. Mod]`.fontcolor(this.cl.jrm)} <font class="rainbowText">[Kyng]</font> koraiii`,
						`${`[Jr. Mod]`.fontcolor(this.cl.jrm)} <font class="rainbowText">[oop]</font> trevr`,
					],
					`Removed TS and TO tags from display.<br>`+
					`<details><summary>Reasons:</summary><ul>`+
					`<li>Left TO</li>`+
					`<li>Hard To manage unlike moderator tags</li>`+
					`<li>Requested by Piger</li>`+
					`</ul></details>`
				],
			},
			{
				version:`1.1.88`,
				news:[
					`Fixed new heroes and maps displaying in the user card and logs`,
					[`New promotions for ${`[TO]`.fontcolor(this.cl.to)}:`,
						`${`[Mod]`.fontcolor(this.cl.mod)} Amasterclasher`,
						`${`[TS]`.fontcolor(this.cl.ts)} trevr`,
						`${`[TS]`.fontcolor(this.cl.ts)} Raqzv`,
					],

					[`New promotions for ${`[TS]`.fontcolor(this.cl.ts)}:`,	
						`Dreamz`,
						`4chan.org`,
						`Dinonuggy`,
						`BJG`
					],
					[
						`Twelfth custom tag:`,
						`${`[Mod]`.fontcolor(this.cl.mod)} 🤡 nosok`
					],
				],
			},
			{
				version:`1.1.87`,
				news:[
					`${`Glob`.fontcolor(`#14a300`)}, ${`Magon`.fontcolor(`#ff005d`)}, ${`Ignis`.fontcolor(`#cd501f`)} and`+
					` ${`Burning Bunker Hard`.fontcolor(`#e01b1b`)}, ${`Magnetic Monopole Hard`.fontcolor(`#bf00ff`)}, ${`Toxic Territory Hard`.fontcolor(`#5c5c5c`)}, ${`Restless Ridge Hard`.fontcolor(`#a88b64`)},`+
					` are now displayed properly in the user card and logs.`,
					
					[`New promotions for ${`[Mod]`.fontcolor(this.cl.mod)}:`,	
						`${`[Jr. Mod]`.fontcolor(this.cl.jrm)} Nickchm`,
						`${`[Jr. Mod]`.fontcolor(this.cl.jrm)} nosok`,
						`Vikenti`
					],

					[`New promotions for ${`[TS]`.fontcolor(this.cl.ts)}:`,	
						`${`[Mod]`.fontcolor(this.cl.mod)} nosok`,
						`Jester`,
						`546000`
					]
				],
			},
			{
				version:`1.1.86`,
				news:[
					[`New promotions for ${`[TS]`.fontcolor(this.cl.ts)}:`,	
						`trevr`,
						'Ventinari',
						`Ashton94949`,
					]
				],
			},
			{
				version:`1.1.85`,
				news:[
					`Fixed the chat that was breaking the game.`,
					`Added a badge to Evades Olympics winners.`
				],
			},
			{
				version:`1.1.84`,
				news:[
					[`New promotion for ${`[TS]`.fontcolor(this.cl.ts)}:`,
						`CZheng`,
					],
					[`New command ${`#arealb`.fontcolor(this.cl.cmd)}.<br>`+
					`By using the command you will see a leaderboard in the chat in this format:<br>`+
					`Name ;; Level ;; XP ;; Hero<br>`+
					`You can sort it by typing ${`#arealb arg`.fontcolor(this.cl.cmd)} where arg is:`,
					`area`,
					`xp`,
					`hero`,
					`name`],
				],
			},
			{
				version:`1.1.83`,
				news:[
					[`New promotion for ${`[TS]`.fontcolor(this.cl.ts)}:`,
						`Lann`,
					],
					`Bug fixes.`,
				],
			},
			{
				version:`1.1.82`,
				news:[
					[
						`Eleventh custom tag:`,
						`${`[h`.fontcolor("#c01fed")}${`u]`.fontcolor("#25e8be")} haha0201`
					],
					[`New promotions for ${`[TS]`.fontcolor(this.cl.ts)}:`,
						`Raqzv`,
					],
					[
						`Recolored custom tag:`,
						`<font class="rainbowText">[buster]</font> AWEN<br>`
					],
					`Bug fixes.`,
				],
			},
			{
				version:`1.1.81`,
				news:[
					`Removed ${`[TS]`.fontcolor(this.cl.ts)} from ThatHodgeGuy.`,
					[
						`Tenth custom tag:`,
						`${`[Capri-Sun]`.fontcolor("#B026FF")} Vikenti`
					],
					[
						`Recolored custom tags:`,
						`<font class="rainbowText">[Loy]</font> L0YqL<br>`
					],
					`Bug fixes.`,
				],
			},
			{
				version:`1.1.80`,
				news:[
					`In the profile page you can now see the users hats too!`,
					`3rd tab in the changelog - links. It contains some faq links and videoes.`,
					`Bug fixes.`,
				],
			},
			{
				version:`1.1.79`,
				news:[
					[`New promotions for ${`[TO]`.fontcolor(this.cl.to)}:`,
						`${`[TS]`.fontcolor(this.cl.ts)} nexxyst`,
					],
					`In the profile page you can now see the VP graph!<br>`+
					`${`<i>Actually something new?</i>`.fontcolor(this.cl.cmd)}`,
					
				],
			},
			{
				version:`1.1.78`,
				news:[
					[`New promotions for ${`[TS]`.fontcolor(this.cl.ts)}:`,
						`๖ۣۜCorrupt 🆉`,
					],
				],
			},
			{
				version:`1.1.77`,
				news:[
					[`New promotion for ${`[Jr. Mod]`.fontcolor(this.cl.jrm)}:`,
						`${`[YouTuber]`.fontcolor("#2accac")} R0YqL`
					],
					[`New promotion for ${`[Mod]`.fontcolor(this.cl.mod)}:`,
						`${`[Jr. Mod]`.fontcolor(this.cl.jrm)} LightY`
					],
					`${`[Jr. Mod]`.fontcolor(this.cl.jrm)} Exscord got demoted.`,
				],
			},
			{
				version:`1.1.76`,
				news:[
					[`New promotions for ${`[Jr. Mod]`.fontcolor(this.cl.jrm)}:`,
						`nosok`,
						`${`[TO]`.fontcolor(this.cl.to)} DepressionOwU`,
						`${`[TO]`.fontcolor(this.cl.to)} Nickchm`,
						`${`[TS]`.fontcolor(this.cl.ts)} Zade`
					],
					`Congratulations to <br>${`[Sr. Mod]`.fontcolor(this.cl.sm)} Jackal with his promotion to ${`[H. Mod]`.fontcolor(this.cl.hm)}!`,
				],
			},
			{
				version:`1.1.75`,
				news:[
					[`New promotions for ${`[TS]`.fontcolor(this.cl.ts)}:`,
						`nexxyst`,
					],
					`${`[Jr. Mod]`.fontcolor(this.cl.jrm)} Exscord is back.`,
				],
			},
			{
				version:`1.1.74`,
				news:[
					`fAtKiD got his ${`[TO]`.fontcolor(this.cl.to)} tag.`,
					`Removed ${`[TS]`.fontcolor(this.cl.ts)} from Ventinari.`
				],
			},
			{
				version:`1.1.73`,
				news:[
					[`New promotions for ${`[TO]`.fontcolor(this.cl.to)}:`,
						`${`[TS]`.fontcolor(this.cl.ts)} Nickchm`,
						`[BREAK POINT]`,
						`<i>fAtKiD became a ${`[TO]`.fontcolor(this.cl.to)} too but no tag for him.. yet..</i>`
					],
					`New command ${`#autodc`.fontcolor(this.cl.cmd)}, also added in to the R -> Commands.<br>`+
					`The command allows you to automatically disconnect on F5 / Ctrl + R instead of being supposed to type /dc in to the chat.`
				],
			},
			{
				version:`1.1.72`,
				news:[
					`Fixed leaderboard being thin when showing heroes is enabled.`,
					[`New promotion and demotions.`,
						`${`[Mod]`.fontcolor("#e67e22")} Pasemrus`,
						`${`<strike>[Jr. Mod]</strike>`.fontcolor(this.cl.jrm)} piger`,
						`${`[Jr. Mod]`.fontcolor(this.cl.jrm)} AWEN`,
					],
				],
			},
			{
				version:`1.1.71`,
				news:[
					`Main menu now has a shortcut button to the leaderboard.`,
				],
			},
			{
				version:`1.1.70`,
				news:[
					`Removed ${`TO`.fontcolor(this.cl.to)} from CrEoP.`,
					[
						`New VP colors in the usercard:`,
						`${`### / Not found`.fontcolor(`#aaa`)}`,
						`${`0-74`.fontcolor(`#ff0000`)}`,
						`${`75-499`.fontcolor(`#00ff00`)}`,
						`${`500-19'999`.fontcolor(`#0095ff`)}`,
						`<font class="rainbowText">20'000 and more</font>`,
					],
				],
			},
			{
				version:`1.1.69`,
				news:[
					`A bugfix :/`
				],
			},
			{
				version:`1.1.68`,
				news:[
					`FPS and ping??<br>`+
					`${`<i>Note: fps is updating every second, Ping is updating when YOU send a message.</i>`.fontcolor(this.cl.cmd)}`,
					[
						`1 new command (# for help)`,
						`${`#togglefps`.fontcolor(this.cl.cmd)}`,
						`[BREAK POINT]`,
						`This command toggles ping and fps. It was also added to the ${`R -> Commands.`.fontcolor(this.cl.cmd)}`
					],
					`${`[TW]`.fontcolor(`#FFA390`)} tag is now remade to the new way too. It will now be possible to see someone like:<br>`+
					`${`[TO]`.fontcolor(this.cl.to)} ${`[TW]`.fontcolor(`#FFA390`)} ${`[Hu]`.fontcolor(`#2FA390`)} Cool Guy.`
				],
			},
			{
				version:`1.1.67`,
				news:[
					[
						`Tags are now done in a different way. Now there is an ability to have multiple tags.<br>`+
						`Some tags now:`,
						`${`[TS]`.fontcolor(this.cl.ts)} <font class="rainbowText">[Roy]</font> R0YqL`,
						`${`[TO]`.fontcolor(this.cl.to)} ${`[SCR]`.fontcolor(this.cl.scripter)} DepressionOwU`,
						`${`[TO]`.fontcolor(this.cl.to)} <font class="rainbowText">[Dep's BFF]</font> Jayyyyyyyyyyyyyy`,
						`[BREAK POINT]`,
						`${`<i>For people with custom tag scripts: The old tags are still supported.</i>`.fontcolor(this.cl.cmd)}`,
					],
					`The change logs are now a one-piece thing, editing the css wont make other stuff go off if you do it correctly.`
				],
			},
			{
				version:`1.1.66`,
				news:[
					[
						`New promotions for ${`[TO]`.fontcolor(this.cl.to)}:`,
						`${`[Jr. Mod]`.fontcolor(this.cl.jrm)} piger`,
						`${`[TS]`.fontcolor(this.cl.ts)} DepressionOwU`
					],
					[`Added new ${`TS`.fontcolor(this.cl.ts)}:`, `Lumaz`]
				],
			},
			{
				version:`1.1.65`,
				news:[
					`Removed ${`TS`.fontcolor(this.cl.ts)} from Creazy.`,
					[`Added new ${`TS`.fontcolor(this.cl.ts)}:`, `TimiT`, `Ventinari`]
				],
			},
			{
				version:`1.1.64`,
				news:[
					`Added a new permanent badge for the people who won in the olympics:`+
					`<br><br><image src="https://cdn.discordapp.com/attachments/617049086452957189/869889869827178516/olympics.png"></image>`,
					`The ${window.vers.toVers("1.1.63")} update now works with the ban commands too.`
				],
			},
			{
				version:`1.1.63`,
				news:[
					`For mods:<br>The mute command has more abilities now. The example of usage:<br><b>/mute <name> 1d 1s</b> - mutes for 1 day and 1 second<br>`+
					`available duration letters: <b>s, m, h, d, w,</b> (russian keys<b>, с, м, ч, д, н</b>).<br>`+
					`Note: you can use multiple same arguments e.g. <b>1s 1s 1h</b> will be the same as <b>2s 1h</b>.<br>`+
					`${`<i>It works only if the player is currently in the server.</i>`.fontcolor(this.cl.cmd)}`,
				],
			},
			{
				version:`1.1.62`,
				news:[
					[
						`Ninth custom tag:`,
						`${`[10$]`.fontcolor("#12e612")} AWEN`,
						`${`[REALLY]`.fontcolor("#12e612")} NoAwen`,
					]
				],
			},
			{
				version:`1.1.61`,
				news:[
					`In the Export/Import logs window when you click on the name a user card will appear instead of simpe logs.`,
					[
						`Eighth custom tags:`,
						`${`[Capri-Sun]`.fontcolor("#ff8700")} L0YqL`,
					],
					[
						`Recolored custom tags:`,
						`<font class="rainbowText">[Roy]</font> R0YqL<br>`,
						`${`[SCR]`.fontcolor(this.cl.scripter)} DepressionOwU`
					]
				],
			},
			{
				version:`1.1.60`,
				news:[
					[`Added new ${`TS`.fontcolor(this.cl.ts)}:`, `ElFeyer`],
				]
			},
			{
				version:`1.1.59`,
				news:[
					`Some bug fixes.`,
				]
			},
			{
				version:`1.1.58`,
				news:[
					`Some bug fixes.`,
					`${`[TW]`.fontcolor(`#FFA390`)} no longer shows in the leaderboard. ${`<i>Yes, that wasnt a feature.</i>`.fontcolor(this.cl.cmd)}`,
					[
						`new buttons in the R key window:`,
						`Team logger`,
						`Friends & Notes`
					],
					[`new ${`[TS]`.fontcolor(this.cl.ts)} and ${`[TO]`.fontcolor(this.cl.to)}:`,
					`${`[YouTuber]`.fontcolor("#2accac")} Strat`]
				]
			},
			{
				version:`1.1.57`,
				news:[
					`${`Burning Bunker`.fontcolor(`#e01b1b`)} is now displayed properly in logs.`,
					`In the usercard you can left-click on the users name and a window will appear.<br>`+
					`In the window you can mark the user as a friend (${`[F]`.fontcolor(`#0f0`)}) or put a warning (${`[!]`.fontcolor(`#f00`)}) that will appear in the leaderboard to the left of the users name.<br>`+
					`You can also leave a note on the user.`,
					`The R key now works in a different way. Too much to explain, just try it out.`,
					`Some fixes with the list of players with a role e.g. TS, TO, etc.`,
				]
			},
			{
				version:`1.1.56`,
				news:[
					`Bug fixes.`,
					`The ${window.vers.toVers("1.1.41")} update 1st part:<br>`+
					`The place where you need to sellect the team players now has a button <b>[A]</b><br>`+
					`The button toggles between 2 list. The 1st list is with the players who were in the area at the time the window got opened.<br>`+
					`The 2nd list shows all players that have been detected.`,
					`In the leaderboard you can now see ${`[M]`.fontcolor(`#e67e22`)} and ${`[D]`.fontcolor(`#3498db`)} tags. ${`[M]`.fontcolor(`#e67e22`)} is for moderators, ${`[D]`.fontcolor(`#3498db`)} is for developers`,
					[
						`1 new command (# for help)`,
						`${`#togglelbtags`.fontcolor(this.cl.cmd)}`,
						`[BREAK POINT]`,
						`This command toggles the tags in the leaderboard. The ${window.vers.toVers("1.1.52")} update is changed again.`
					],
					`The log of death in SS now shows the level instead of area.`,
					`More stuff for the custom commands.`,
				]
			},
			{
				version:`1.1.55`,
				news:[
					`Bug fixes.`,
					`Custom commands? Well.. You need to know how stuff works to make them...`,
					`The ${window.vers.toVers("1.1.52")} update is now changed a bit.<br>Check the <a style="color:${this.cl.cmd}" target="_blank" href="https://github.com/Neondertalec/tsmod#update-1152">[README.md]</a> and update it to the new way.`,
					`New tag ${`[TW]`.fontcolor(`#FFA390`)} is added. It will not require you to update the script when a tourney is over.`
				]
			},
			{
				version:`1.1.54`,
				news:[
					`Bug fixes.`
				]
			},
			{
				version:`1.1.53`,
				news:[
					[`Added new ${`TS`.fontcolor(this.cl.ts)}:`, `prepackagedsushi`],
				]
			},
			{
				version:`1.1.52`,
				news:[
					`Bug fixes.`,
					[`Added new ${`TS`.fontcolor(this.cl.ts)}:`, `Rxpct`, `Antony666`],
					[
						`Seventh custom tag:`,
						`${`[THICC]`.fontcolor("#9D2005")} thiccsucc`
					],
					`Local tag (chat) and prefix (ingame over the name #toggletag) support.<br><a style="color:${this.cl.cmd}" target="_blank" href="https://github.com/Neondertalec/tsmod#update-1152">[see this for details]</a>.`
				]
			},
			{
				version:`1.1.51`,
				news:[
					[
						`New promotions for ${`[Jr. Mod]`.fontcolor(this.cl.jrm)}:`,
						`${`[TS]`.fontcolor(this.cl.ts)} Exscord`,
					],
					[
						`Fourth, fifth and sixth custom tags:`,
						`${`[Roy]`.fontcolor("#009b77")} R0YqL`,
						`${`[Air]`.fontcolor("#51dddd")} Pasemrus`
					],
					`<font class="rainbowText">[Dep's BFF]</font> Jayyyyyyyyyyyyyy<br>`+
					`${`WaIt... It ChAnGeS CoLoRs?!`.fontcolor(this.cl.cmd)}`
				]
			},
			{
				version:`1.1.50`,
				news:[
					`Some css fixes.`,
					[
						`Second and Third custom tags:`,
						`${`[Invi]`.fontcolor("#51dddd")} Invi`,
						`${`[litijo]`.fontcolor(`#f19dba`)} LightY`
					],
				]
			},
			{
				version:`1.1.49`,
				news:[
					[`1 new command (# for help)`, `${`#toggletimer`.fontcolor(this.cl.cmd)}`],
					[
						`New promotions for ${`[Jr. Mod]`.fontcolor(this.cl.jrm)}:`,
						`${`[TS]`.fontcolor(this.cl.ts)} piger`,
						`${`[TS]`.fontcolor(this.cl.ts)} LightY`,
						`${`[TO]`.fontcolor(this.cl.to)} asdfasdfasdf1234`,
						`${`[TO]`.fontcolor(this.cl.to)} Pasemrus`,
						`${`[TO]`.fontcolor(this.cl.to)} thiccsucc`
					],
					[`First ever custom tag:`,`${`[evader]`.fontcolor(`#009b77`)} Gianni`],
				]
			},
			{
				version:`1.1.48`,
				news:[
					`GRB go woosh...`,
					`Removed ${`TS`.fontcolor(this.cl.ts)} from DEFA <i>${`(temporally)`.fontcolor(this.cl.cmd)}<i>.`,
				]
			},
			{
				version:`1.1.47`,
				news:[
					`Bug fixes`,
					[
						`the following keys now can accept a splitter argument:`,
						`${`{name}`.fontcolor(this.cl.cmd)}`,
						`${`{hero}`.fontcolor(this.cl.cmd)}`,
						`${`{hero num}`.fontcolor(this.cl.cmd)}`,
						`[BREAK POINT]`,
						`For example if you type ${`{name}`.fontcolor(this.cl.cmd)}, the splitter will be "+".<br>But if you type ${`{name &}`.fontcolor(this.cl.cmd)}, the splitter will be "&".`,
					]
				]
			},
			{
				version:`1.1.46`,
				news:[
					[
						`GRB Bug fixes:`,
						`The command doesn't lock upgrade buttons anymore.`,
						`When you turn GRB off you automatically stop.`,
					],
				]
			},
			{
				version:`1.1.45`,
				news:[
					`Bug fixes.`,
					`The hero displayed in the user card is now depending on the last log time you sellect analogically to the ${window.vers.toVers("1.1.44")} update.`,
					`Team result generation window in the format part now has buttons.<br>By clicking on a button the text of it will be added to the end of the format input.`
				]
			},
			{
				version:`1.1.44`,
				news:[
					`The hero in the result generator now depends on the last log time you sellect.<br>`+
					`That means: if a user rejoins the game with another hero and your last log for the generation is before the refresh log, `+
					`the log generator will give the hero, the player was before reconnecting.<br><b title="`+
					`log 1: join as Magmax\n`+
					`log 23: join as Necro\n`+
					`log 52: join as Shade\n`+
					`if last log sellected is 1-22 - Magmax\n`+
					`if last log sellected is 23-51 - Necro\n`+
					`if last log sellected is 52+ - Shade\n`+
					`" style="text-decoration: underline;">${`[Hoverable example]`.fontcolor(this.cl.example)}</b>`,
					`New log key for the team log generator: ${`{hero num}`.fontcolor(this.cl.cmd)}<br>Example: 1 Necro + 4 Chrono.`,
					[`Added new ${`TS`.fontcolor(this.cl.ts)}:`, `PotatoNuke`],
					//`Removed ${`TS`.fontcolor(`#ad86d8`)} from Creazy.`,
					`Some bug fixes.`,
					]
			},
			{
				version:`1.1.43`,
				news:[
					`Now you need to see a player just one time to know its vp instead of being suppost to be in the same area as the player.`,
					`Current result format is now clickable too.`,
					`"Show heroes" in settings now saves.`,
					`Leaderboard now shows "EU" or "NA" too.`,
					`When you open user log window it will be automatically scrolled down.<br>`+
					`If the window is fully scrolled down and a new log adds, it will automatically get scrolled.`,
				]
			},
			{
				version:`1.1.42`,
				news:[`Some bug fixes.`,
				[`1 new command (# for help)`, `${`#toggleusercard`.fontcolor(this.cl.cmd)}`],
				`Every <b>bold</b> text from the ${`[SCRIPT]`.fontcolor(this.cl.scriptmsg)} message is now acting as a button. Some buttons replace the text in the chat input and others add the text.`]
			},
			{
				version:`1.1.41`,
				news:[[`When you leftclick on the area on the leaderboard a window will show.<br>In the window you need to:`,
						`Sellect the players that were on that area when the popup was opened`,
						`Sellect log id's that you need. (a R button is there to update the list)`,
						`Set the format of the result (It saves), hover for the hint.`],
					`Areas in the leaderboard now have a number to the left of them that show the amount of players that are in it right now`,
					[`1 new command (# for help)`, `${`#toggleusers`.fontcolor(this.cl.cmd)}`]]
			},
			{
				version:`1.1.40`,
				news:[`Removed ${`TS`.fontcolor(this.cl.ts)} from prod1gy.`]
			},
			{
				version:`1.1.39`,
				news:[`${`Boldrock`.fontcolor(`#a18446`)} and ${`Assorted Alcove`.fontcolor(`#805b12`)} are now displayed properly in the user card and logs.`]
			},
			{
				version:`1.1.38`,
				news:[[`Added new ${`TS`.fontcolor(this.cl.ts)}:`, `R0YqL`, `Nickchm`]]
			},
			{
				version:`1.1.37`,
				news:[
					`New Log type of ${`purple color`.fontcolor("#7b478e")} that shows when the user leaves or joins the server.`,
					`Some CSS fixes.`,
					`Bug fixes.`
				]
			},
			{
				version:`1.1.36`,
				news:[`Leaderboard now has a number to the right of it that shows the server you are in right now.`,
					[`2 new commands (# for help)`, `${`#format`.fontcolor(this.cl.cmd)}`, `${`#setformat`.fontcolor(this.cl.cmd)}`],
					`New button G in the user card.<br>By clicking on it you get the run of the user coppied in to your clipboard by the format setd by the commands above.`,
					`Some CSS fixes.`
				]
			},
			{
				version:`1.1.35`,
				news:[`Fixed a bug where you needed to change area to be able to rightclick on a player in the leaderboard.`]
			},
			{
				version:`1.1.34`,
				news:[[`Added piger's alt to ${`TS`.fontcolor(this.cl.ts)}:`, `1333333`]]
			},
			{
				version:`1.1.33`,
				news:[`Changelog!`, `Fixed a bug when you could get a gray screen at a random moment.`]
			},
			{
				version:`1.1.32`,
				news:[`Display current and new version if an update is available.`]
			},
			{
				version:`1.1.29`,
				news:[[`Added new ${`TS`.fontcolor(this.cl.ts)}:`, `DEFA`]]
			},
			{
				version:`1.1.28`,
				news:[[`Added new ${`TS`.fontcolor(this.cl.ts)}:`, `,DSG,`,`piger`]]
			},
			{
				version:`1.1.27`,
				news:[`GRB (Go Right Bot)<br>Added new command: ${`#grb`.fontcolor(this.cl.cmd)}.`]
			},
			{
				version:`1.1.26`,
				news:[[`Added new ${`TS`.fontcolor(this.cl.ts)}:`, `prod1gy`, `Zade`]]
			},
			{
				version:`1.1.23`,
				news:[`Allowed heroes.<br>On hero click a popup will appear.<br>In the popup you can sellect heroes you want to see crossed in the user card.`]
			},
			{
				version:`1.1.22`,
				news:[`Removed ${`TS`.fontcolor(this.cl.ts)} from Priox.`]
			},
			{
				version:`1.1.21`,
				news:[`Made user cards and user logs dragable.`]
			},
			{
				version:`1.1.19`,
				news:[`Added 'BANNED' to user who are banned from tournaments.`]
			},
			{
				version:`1.1.15`,
				news:[`Removed ${`TS`.fontcolor(this.cl.ts)} from drippyk.`]
			},
			{
				version:`1.1.13`,
				news:[[`Added new ${`TS`.fontcolor(this.cl.ts)}:`, `LightY`]]
			},
			{
				version:`1.1.12`,
				news:[`From now on the script will work all the time.`]
			},
			{
				version:`1.1.10`,
				news:[[`Added new ${`TS`.fontcolor(this.cl.ts)}:`, `Stryker123`], `Became a TS and made my tag ${`[TS&Scripter]`.fontcolor(this.cl.scripter)} instead of ${`[Scripter]`.fontcolor(this.cl.scripter)}.`]
			},
			{
				version:`1.1.2`,
				news:[`Updated user card.`, `Export/Import logs.`]
			},
		];

		window.vers.links = [
			{
				version: ["1", `<a href="https://github.com/Neondertalec/tsmod">Info</a>`],
				news:[
					`<a href="https://www.youtube.com/watch?v=XRXmW23zyWw&feature=youtu.be&ab_channel=itsme">How to install (18s video).</a>`,
					`<a href="https://www.youtube.com/watch?v=MA9A8OmK0Xo&ab_channel=PigerthePig">1.0.0 version video (by piger).</a>`,
					`Found a bug or someone is missing a tag? lmk:<br><i><b>${`🎀Depression🎀#5556`.fontcolor("#ff00ff")}</b></i>`,
				],
			},
			{
				version: ["1", `<a href="https://github.com/Neondertalec/tsmod/blob/main/faq.md">FAQ</a>`],
				news:[
					`<a href="https://github.com/Neondertalec/tsmod/blob/main/faq.md#how-to-install">How to install.</a>`,
					`<a href="https://github.com/Neondertalec/tsmod/blob/main/faq.md#how-to-update">How to update.</a>`,
					`<a href="https://github.com/Neondertalec/tsmod/blob/main/faq.md#script-doesnt-work">Something is wrong/not working?</a>`,
				],
			}
		];
	},
	getm: function(){
		var xm=new XMLHttpRequest();
		xm.open("GET","https://raw.githubusercontent.com/Neondertalec/tsmod/main/meta.json",false);
		xm.send();
		let data = JSON.parse(xm.response);
		if(data["ol-tw"]){
			xm.open("GET",data["ol-tw"],false);
			xm.send();
			data.tw = JSON.parse(xm.response).tw;
		}
		return data;
	},
	
	checkVer: function(v1, v2){
		[v1, v2] = [v1.split(".").map((v)=>parseInt(v)), v2.split(".").map((v)=>parseInt(v))]
		for(var i = 0; i < v1.length; i++){    
			if(v1[i] < v2[i]){
				return true;
			}
		}
		return false;
	},

	check: function(){
		const d = this.getm();
		if(d.tw){
			let names = d.tw;
	
			globalThis.tags.tags["[TW]"] = names;
			globalThis.customTags[0].names = names;
		}

		if(this.checkVer(this.v,d.v)){
			const ver = document.createElement("div");
			ver.id = "version-warning";
			
			ver.innerHTML = `<div class="v-title">TS mod</div><br><div class="v-cv">Current version: </div><div>${this.v}</div><br><div class="v-nv">Latest version: </div><div>${d.v}</div>`;

			document.body.appendChild(ver);
		}
	},

	
	genLog: function(version, news){
		let id = version, ver = version;
		if(typeof version == "object"){
			id = version[0]; ver = version[1];
		}
		let newData = 
		`<div class="changelog-section" logid="${id}">`+
			`<div class="changelog-section-header">`+
				`<span style="vertical-align: middle;">${ver}</span>`+
			`</div>`+
			`<ul class="changelog-change-list">`;

		for(let i = 0; i < news.length; i++){
			if(typeof news[i] == "string"){
				newData += `<li>${news[i]}</li>`
			}else{
				newData += `<li>${news[i][0]}`
				newData += `<ul>`;
				let brkd = -1;
				for(let j = 1; j < news[i].length; j++){
					if(news[i][j] === "[BREAK POINT]"){
						brkd = j+1;
						break;
					}
					newData += `<li>${news[i][j]}</li>`
				}
				if(brkd != -1){
					newData += `</ul>`
					for(let j = brkd; j < news[i].length; j++){
						newData += news[i][j];
					}
					newData += `</li>`
				}else{
					newData += `</ul></li>`
				}
			}
		}
		newData +=
			`</ul>`+
		`</div>`;
		
		return newData;
	},

	chlog:[null,null],
	swi: function(who){
		this.chlog[0] = document.querySelector(".changelog");
		this.chlog[1] = document.querySelector(".ts-changelog");
		this.chlog[2] = document.querySelector(".ts-links");
		
		if(this.chlog[1].innerHTML == ""){
			this.chlog[1].innerHTML = `<div class="changelog-header">TS Mod Changelog</div>`;
			const arr = window.vers.changeLog;
			for(let i = 0; i < arr.length; i++){
				this.chlog[1].innerHTML += window.vers.genLog(arr[i].version, arr[i].news);
			}
		}
		if(this.chlog[2].innerHTML == ""){
			this.chlog[2].innerHTML = `<div class="changelog-header">Links</div>`;
			const arr = window.vers.links;
			for(let i = 0; i < arr.length; i++){
				this.chlog[2].innerHTML += window.vers.genLog(arr[i].version, arr[i].news);
			}
		}

		if(!this.chlog[0])return void (console.warn(".changelog not found"));
		if(!this.chlog[1])return void (console.warn(".ts-changelog not found"));
		if(!this.chlog[2])return void (console.warn(".ts-links not found"));
		
		let l = ["ev", "ts", "li"]
		this.chlog.forEach((e,i)=>{
			if(who != l[i]){
				e.classList.contains("hidden")||
				e.classList.add("hidden")
			}else{
				e.classList.contains("hidden")&&
				e.classList.remove("hidden")
			}
		});
	}
	/*color: function(text, color){
		return `<aa style="${color}">${text}</aa>`;
	}*/
}
document.createElementP = function(name, args = null, fnc=null){
	const element = document.createElement(name)
	if(["input", "textarea"].includes(name))element.setAttribute("c-lock", "") 
	if(args != null)Object.assign(element,args);
	if(fnc) fnc(element);
	return element;
}

window.vers.filllogp();

globalThis.CacheTs = class CacheTs{
	_data = {};
	
	setVal(key, val){
		return this._data[key] = val;
	}

	getVal(key, def = undefined){
		return this._data[key] ?? def;
	}

	delVal(key){
		if(key in this._data) delete this._data[key];
	}

	hasVal(key){
		return key in this._data;
	}
}

new MutationObserver(function (m){
	if(document.querySelector(".leaderboard-line.Central-Core-Dull")){
		window.updateLeaderboard();
		this.disconnect();
	}
}).observe(document, {childList: true, subtree: true});

window.blaclist = ["GuestRex", "TournamentPlox", "Wayward", "xxloki", "Zeratuone1", "papumpirulitoPD", "Creazy", "creæzy", "【𝟔𝟗】ᴄʀᴇᴀᴢʏ", "wre4th", "CrEaZy‏‏‎ ‎", "Strat", "Zwaze"];


try{
	var xm=new XMLHttpRequest();
	xm.open("GET","https://docs.google.com/document/d/1kk2PaGMxSIO7fnvF2PHL2rOiI7ApUMrI34evAaGdN8E/edit",false);
	xm.send();
	if(xm.response.length > 1000){
		let newArr = [];
		xm.response.slice(xm.response.indexOf("anned Players\\n\\n\\u0010\\u0012\\u001cPlayer"), xm.response.indexOf("\\n\\u0011")).replace(/\\u0012\\u001c/gm, "\n").replace(/\\n\\u001c/gm, "/n").split("\n").forEach((e,i)=>{if(i>1){newArr._d = 1;newArr.push(e.split("/n")[0])}})
		if(newArr._d){
			delete newArr._d
			window.blaclist = newArr;
		}
	}
}catch{}

globalThis.tagsEX = globalThis.tagsEX ?? {};
globalThis.tagDataEX = globalThis.tagsEX ?? {};

globalThis.tagsEX = {...globalThis.tagsEX,...{'[SCR]':['DepressionOwU'],}}
globalThis.tagDataEX = {...globalThis.tagDataEX,...{'[SCR]': {presudo:"[TO&Scripter]", color:"#ff00bc"},}};
const atwne = "atwnebissatwnebiss";
globalThis.tags = {
	chatTags: new globalThis.CacheTs(),
	tags:{
		'[oly1]':[atwne,'Pentagonis', 'R0YqL', 'Fauderix', 'AWEN', 'снегири', 'piger', 'Damasus', '⚝Simba⚝', 'Lumaz', 'Invi'],
		'[oly2]':[atwne,'Ventinari', 'Nickchm', 'Strat', 'fAtKiD', 'koraiii', 'eagle45', 'PotatoNuke', 'Harmony556', 'Amasterclasher', 'Zade'],
		'[oly3]':[atwne,'Vikenti', '546000', 'Defa', 'AWEN', 'DD1', '4chаn.org', 'tтеуmlI', 'R0YqL', 'Zxynn', 'nosok'],
		'[oly4]':[atwne,"Ventinari", 'Ndaverr', 'Tetar', 'Bluemonkey14', '9jd8fn48fnf8rnr', 'PotatoNuke', 'lindsay', 'Koraiii', 'BJG', 'Harmony556'],
		'[custom]': [atwne,'DepressionOwU', ...window.customTags.reduce(function(vv,ii){vv.push(...ii.names);return vv},[])],
		'[YT]':[atwne,'R0YqL', 'Strat', 'mRDDanik', 'DD1'],
		'[ST]':[atwne,'Zaxoosh'],
		'[SCR]':[atwne,'DepressionOwU'],
		'[TS]': [atwne,'yIzaac😎👌',
			//'Creazy',
			'Aries', /*'goldy',*/ /*'drippyk',*/ /*'SANDWICH',*/ /*'Damasus'*/, '☺♣○•♣♥☻♦♠◘', 'Stryker123', /*'prod1gy',*/ 'Zade',
			'1Phoenix1',
			'DepressionOwU',
			/*'Exscord'*/,
			'piger',
			//'DEFA', 'ZaLo', 'notdefa',
			'R0YqL',
			'Nickchm',
			'Rxpct',
			'Antony666',
			'prepackagedsushi',
			'AWEN',
			'LightY',
			'PotatoNuke',
			'thiccsucc',
			'⚝Simba⚝',
			'Amasterclasher',
			'asdfasdfasdf1234',
			'Pasemrus',
			'Jayyyyyyyyyyyyyy',
			'Gazebr',
			'Zero〩',
			'Frenzy',
			'Mel',
			'Strat',
			'ElFeyer',
			//'TimiT',
			'Lumaz',
			'fAtKiD',
			'nexxyst',
			`Koraiii`,
			//`ThatHodgeGuy`,
			`๖ۣۜCorrupt 🆉`,
			`Asylum`,
			`Raqzv`,
			`ʕっ•ᴥ•ʔっ`,
			`Lann`,
			`CZheng`,
			`trevr`,
			'Ventinari',
			`Ashton94949`,
			`Jester`,
			`nosok`,
			`546000`,
			`Dreamz`,
			`4chan.org`,
			`Dinonuggy`,
			`BJG`,
		],
		'[TO]': [atwne,'Jayyyyyyyyyyyyyy', 'AWEN', 'Stov'/*awenalt*/, 'Invi', /*'asdfasdfasdf1234',*/ /*'Pasemrus',*/ /*'thiccsucc',*/ /*'Zero〩',*/ 'Gianni', /*'Darklight',*/ /*'Frenzy',*/ /*'Strat',*/ 'piger', 'DepressionOwU', /*'Nickchm',*/ /*'fAtKiD',*/ /*'nexxyst',*/ 'Raqzv', 'trevr', 'Amasterclasher'],
		'[Jr. Mod]': [atwne,'AWEN', 'Gazebr', 'CrEoP', 'Ram', 'piger', /*'LightY',*/ /*'Exscord',*/ /*'Zade',*/ 'Raqzv', 'trevr', 'koraiii'],
		'[Mod]': [atwne,'Invi','Amasterclasher', 'Mel', 'Gianni', 'Zero〩', '1Phoenix1', /*'Rc',*/ /*'Pasemrus',*/ /*'Frenzy',*/ /*'NxMarko',*/ 'Darklight','⚝Simba⚝', 'LightY', /*'thiccsucc',*/ 'Vikenti', 'nosok', /*'Nickchm'*/'DepressionOwU', 'asdfasdfasdf1234', 'R0YqL'],
		'[Sr. Mod]': [atwne],
		'[H. Mod]': [atwne,'Exoriz', 'extirpater', 'Jackal'],
		'[Dev]': [atwne,'Stovoy', 'MiceLee', 'DDBus']
	},
	alts:{
		"Creazy": ['Wre4th','CrEaZy','creæzy','【𝟔𝟗】ᴄʀᴇᴀᴢʏ'],
		"Exscord": [',DSG,', 'Дракончик)))'],
		"piger": ['noPiger'],
		"DEFA": ['ZaLo', 'notdefa'],
		"Zero〩": ['akane🦋'],
		"1Phoenix1": ['«Ƥħǿēƞɨx»'],
		"DDBus": ['TTTruck'],
		"ElFeyer": ['Teasah', '[ᴀᴄᴇ] Teasah'],
		"Ventinari":[/*'maxdebekker',*/ 'Crystal✓','Cjayy','Walkers'],
		"ThatHodgeGuy":['TurtlesRock'],
		"trevr":['away'],
		"Dreamz":['Quilt']
	},
	tagsData:{
		'[custom]':{
			priority:100,
			noOlnTag: true,
			badge:{
				bg:"#000",
				border:"#000",
				textcolor:"#000",
				text:"[Custom]",
				rainbow:true,
			},
		},
		'[TW]':{
			priority:50,
			noOlnTag: true,
			badge:{
				bg:"#ffa390",
				border:"#bd7869",
				textcolor:"#7d493f",
				text:"[TW]",
				rainbow:false,
			},
		},
		'[oly1]':{
			priority:60,
			noOlnTag: true,
			badge:{
				bg:"#cedf48",
				border:"#8e9a31",
				textcolor:"#484e1f",
				text:"[Olympic]",
				subText:"[1st season]",
				rainbow:false,
			},
		},
		'[oly2]':{
			priority:61,
			noOlnTag: true,
			badge:{
				bg:"#cedf48",
				border:"#8e9a31",
				textcolor:"#484e1f",
				text:"[Olympic]",
				subText:"[2nd season]",
				rainbow:false,
			},
		},
		'[oly3]':{
			priority:62,
			noOlnTag: true,
			badge:{
				bg:"#cedf48",
				border:"#8e9a31",
				textcolor:"#484e1f",
				text:"[Olympic]",
				subText:"[3rd season]",
				rainbow:false,
			},
		},
		'[oly4]':{
			priority:63,
			noOlnTag: true,
			badge:{
				bg:"#cedf48",
				border:"#8e9a31",
				textcolor:"#484e1f",
				text:"[Olympic]",
				subText:"[4th season]",
				rainbow:false,
			},
		},
		'[oly5]':{
			priority:64,
			noOlnTag: true,
			badge:{
				bg:"#cedf48",
				border:"#8e9a31",
				textcolor:"#484e1f",
				text:"[Olympic]",
				subText:"[5th season]",
				rainbow:false,
			},
		},
		'[YT]': {
			priority:0,
			prefix:{
				color:"#2accac",
				text:"[YouTuber]",
			},
			badge:{
				bg:"#1abc9c",
				border:"#0a8a70",
				textcolor:"#044437",
				text:"[YouTube]",
				rainbow:false,
			},
		},
		'[ST]': {
			priority:1,
			prefix:{
				color:"#a258ea",
				text:"[Streamer]",
			},
			badge:{
				bg:"#9248da",
				border:"#6220a2",
				textcolor:"#2e0854",
				text:"[Stream]",
				rainbow:false,
			},
		},
		'[TS]': {
			priority:2,
			chat:{
				color:"#ad86d8",
				text:"[TS]",
				rainbow:false,
			},
			prefix:{
				color:"#ad86d8",
				text:"[TS]",
			},
			badge:{
				bg:"#ad86d8",
				border:"#7650a0",
				textcolor:"#470054",
				text:"[TS]",
				rainbow:false,
			},
		},
		'[TO]': {
			priority:3,
			chat:{
				color:"#6f8fd5",
				text:"[TO]",
				rainbow:false,
			},
			prefix:{
				color:"#6f8fd5",
				text:"[TO]",
			},
			badge:{
				bg:"#6f8fd5",
				border:"#2f5098",
				textcolor:"#203154",
				text:"[TO]",
				rainbow:false,
			},
		},
		'[Jr. Mod]': {
			priority:4,
			lb:{
				color:"#f1c40f",
				text:"[M]",
				rainbow:false,
			},
			prefix:{
				color:"#f1c40f",
				text:"[Junior Mod]",
			},
			badge:{
				bg:"#f1c40f",
				border:"#a28200",
				textcolor:"#655100",
				text:"[Jr. Mod]",
				rainbow:false,
			},
		},
		'[Mod]': {
			priority:5,
			lb:{
				color:"#e67e22",
				text:"[M]",
				rainbow:false,
			},
			prefix:{
				color:"#e67e22",
				text:"[Moderator]",
			},
			badge:{
				bg:"#e67e22",
				border:"#a75105",
				textcolor:"#6b3200",
				text:"[Mod]",
				rainbow:false,
			},
		},
		'[Sr. Mod]': {
			priority:6,
			lb:{
				color:"#ff6b5b",
				text:"[M]",
				rainbow:false,
			},
			prefix:{
				color:"#e74c3c",
				text:"[Senior Mod]",
			},
			badge:{
				bg:"#e05b49",
				border:"#a23e30",
				textcolor:"#611e17",
				text:"[Sr. Mod]",
				rainbow:false,
			},
		},
		'[H. Mod]': {
			priority:7,
			lb:{
				color:"#f03333",
				text:"[M]",
				rainbow:false,
			},
			prefix:{
				color:"#f03333",
				text:"[Head Mod]",
			},
			badge:{
				bg:"#f03333",
				border:"#961b1b",
				textcolor:"#6d0909",
				text:"[H. Mod]",
				rainbow:false,
			},
		},
		'[Dev]': {
			priority:8,
			lb:{
				color:"#3498db",
				text:"[D]",
				rainbow:false,
			},
			prefix:{
				color:"#3498db",
				text:"[Developer]",
			},
			badge:{
				bg:"#3498db",
				border:"#1a6394",
				textcolor:"#0e334c",
				text:"[Dev]",
				rainbow:false,
			},
		},
		'[SCR]': {
			priority:9,
			noOlnTag: true,
			cantH: true,
			badge:{
				bg:"#ff00bc",
				border:"#ab007e",
				textcolor:"#52003d",
				text:"[SCR]",
				rainbow:false,
			},
		},
		'[guest]': {
			priority:-1,
			noOlnTag: true,
			cantH: true,
			chat:{
				color:"#91b800",
				text:"[guest]",
				rainbow:false,
			},
		},
	},
	getUsersTags:function(name){
		let res = [];
		
		for(let rname in this.alts){
			if(this.alts[rname].includes(name)){
				name = rname;
				break;
			}
		}

		for(let key in this.tags){
			if(this.tags[key].includes(name))res.push(key);
		}
		res.sort((e1,e2)=>this.tagsData[e1].priority - this.tagsData[e2].priority);
		return res;
	},

	getUserHighestTagByType: function(utags, type){
		for(let t of utags.reverse()){
			if(!tags.tagsData[t].cantH && tags.tagsData[t][type]) return t;
		}
		return null
	},

	oldTags:{},
	calcOldTags:function(){
		console.log("started");
		this.oldTags = {};
		let allNames = []
		for(let key in this.tags){
			if(this.tagsData[key].noOlnTag)continue;
			allNames = [...allNames, ...this.tags[key]]
		}

		allNames = new Set(allNames);
		
		for(let name of allNames){
			let userHa = this.getUsersTags(name);
			userHa = this.getUserHighestTagByType(userHa, "prefix");
			if(!this.oldTags[userHa]) this.oldTags[userHa] = [];
			this.oldTags[userHa].push(name)
			if(this.alts[name]){
				this.oldTags[userHa] = [...this.oldTags[userHa], ...this.alts[name]]
			}
		}
		console.log("finished");
	},

	init:function(){
		this.tags["[TO]"] = [];
		this.tags["[TS]"] = [];
		this.calcOldTags();
	},

	getChatTag:function(c,e,l,i, name){
		if(this.chatTags.hasVal(name)){
			return this.chatTags.getVal(name);
		}else{
			let code = `e.default.createElement("span",null`;
			if(name.startsWith("Guest")){
				let tagData = window.tags.tagsData["[guest]"];
				code += `,e.default.createElement("span",{className:"${tagData.chat.rainbow?"rainbowText":""}", style:{color: "${tagData.chat.color}"}},"${tagData.chat.text}"," ")`
			}else{
				if(l) code += `,e.default.createElement("span",{className:i},l," ")`;
			
				let customs = [],lock = false;
			
				for(let tagdata of window.customTags){
					for(let tname of tagdata.names){
						if(tname == name){
							customs.push([tagdata, `,e.default.createElement("span",{className:"${tagdata.rainbow?("rainbowText" + (tagdata.rglow ? " rainbowTextGlow" : "")):""}", style:{color: "${tagdata.color}"}},"${tagdata.text}",${tagdata.join?`""` : `" "`})`]);
							if(tagdata.lock) lock = true;
							break;
						}
					}
				}
				customs = customs.sort((v1,v2)=>v1[0].prior - v2[0].prior)
			
				if(!lock) tagSearch: for(let tag in window.tags.tagsData){
					let tagData = window.tags.tagsData[tag];
					{//chat
						if(tagData.chat){
							for(let i in window.tags.oldTags[tag]){
								if(window.tags.oldTags[tag][i] == name){
									code += `,e.default.createElement("span",{className:"${tagData.chat.rainbow?"rainbowText":""}", style:{color: "${tagData.chat.color}"}},"${tagData.chat.text}"," ")`
									break tagSearch;
								}
							}
						}
					}
				}
				for(let str of customs)code += str[1];
			}
			code += `,c)`;
			return this.chatTags.setVal(name, code);
		}
	}
}
window.tags.init();

globalThis.profiler = {
	profilestats:null,
	lib: null,
	libl: false,
	hats: {
		"area-50": "/area-50.b6dc004f.png",
		"gold-crown": "/gold-crown.131786e0.png",
		"bronze-crown": "/bronze-crown.c9530af4.png",
		"silver-crown": "/silver-crown.ffa388d3.png",
		"halo": "/halo.cb0eb721.png",
		"santa-hat": "/santa-hat.8ff7f164.png",
		"gold-wreath": "/gold-wreath.92569ed3.png",
		"summer-wreath": "/summer-wreath.778ebaa8.png",
		"autumn-wreath": "/autumn-wreath.59c95666.png",
		"winter-wreath": "/winter-wreath.07f00139.png",
		"spring-wreath": "/spring-wreath.490fbc9e.png",
		"olympics-wreath": "/olympics-wreath.a8b838b7.png",

		"blue-flames": "/blue-flames.3beec8e5.png",
		"blue-santa-hat": "/blue-santa-hat.9e42565d.png",
		"flames": "/flames.b3703c82.png",
		"orbit-ring": "/orbit-ring.53e4adb3.png",
		"stars": "/stars.1958914c.png",
		"sticky-coat": "/sticky-coat.1412b8a0.png",
		"toxic-coat": "/toxic-coat.a27cd6c9.png",
	},
	graph: {
		el: null,
		graph:null,
	},
	setState:function(state){
		this.profilestats = state;
		setTimeout(()=>{
			this.loadHats();
		}, 100)
	},
	showGraph: function(){
		if(this.lib == null){
			this.lib = document.createElement("script");
			this.lib.src = "https://canvasjs.com/assets/script/canvasjs.min.js";
			document.head.appendChild(this.lib);
			console.log("lib added");
			this.lib.onload = ()=>{this.libl = true;this.displayGraph();console.log("l")}
		}
		if(!this.libl)return;
		this.displayGraph();
		console.log(this.profilestats);
	},
	displayGraph: function(){
		if(!this.libl)return;
		if(!this.graph.el){
			this.graph.el = document.createElementP("div", {className: "graphw"}, (e)=>{
				e.onclick = ()=>{
					this.hideGrapth();
				}
				e.innerHTML = `<div id="chartContainer" style="height: 370px; width: 80%;"></div>`;
				e.children[0].onclick = (e)=>{e.stopPropagation()};
				document.body.appendChild(e);
			});
		}

		if(this.graph.graph == null) this.createGraph();
		console.log("LOOK!")
		this.graph.graph.render();
	},
	hideGrapth: function(){
		if(this.graph.graph){
			this.graph.graph.destroy();
			this.graph.graph = null;
		}
		if(this.graph.el){
			this.graph.el.remove();
			this.graph.el = null;
		}
	},
	createGraph: function(){
		let loadedData = this.profilestats;

		let points = [];
        let cw = parseInt(document.querySelector(".profile-week-name").innerHTML.slice(5));
        let player = this.profilestats.username + ` (${this.profilestats.stats.highest_area_achieved_counter})`;
        let fd = [];
        for(let i in loadedData.stats.week_record){
            let cd = loadedData.stats.week_record[i];
            if(loadedData.stats.week_record[i]){
                let ii = parseInt(i);
                let nd = {
                    x:ii,
                    y: cd.wins,
                }
                
                if(!loadedData.stats.week_record[ii-1] && !fd.includes(ii-1)){
                    
                    points.push({
                        x:ii-1,
                        y: 0,
                    })
                }

                if(cd.finish != null){
                    nd.markerType = "cross";
                    //nd.indexLabel = cd.finish;
                    nd.markerColor = cd.finish == "gold"? "gold" : cd.finish == "silver"? "gray" : "brown"; 
                }
                points.push(nd)

                if(!loadedData.stats.week_record[ii+1] && !fd.includes(ii+1) && ii < cw){
                    points.push({
                        x:ii+1,
                        y: 0,
                    })
                }
            }
        }

		this.graph.graph = new CanvasJS.Chart("chartContainer", {
            theme: "dark2",
            zoomEnabled: true,
            exportEnabled: true,
            backgroundColor: "#222",
            title:{
                text: "VP of " + player,
            },
            axisY:{
                tickColor: '#444',
                gridColor: "#444",
            },
            data: [{        
                type: "line",
                color: "orange",
                indexLabelFontSize: 16,
                dataPoints: points
            }]
        });
	},
	loadHats: function(){
		let el = document.querySelector(".profile-hats-container");
		console.log(el);
		let hat = this.profilestats.accessories.hat_selection;
		let hats = this.profilestats.accessories.hat_collection;

		for(let i in hats){
			if(hats[i]){
				/*el.appendChild(document.createElementP("div", {className:`hat-accessory ${i==hat?"hat-accessory-selected":""}`},
					(e)=>{
						e.appendChild(document.createElementP("img", {src:this.hats[i]}))
					})
				);*/
				el.appendChild(
					document.createElementP("img", {src:this.hats[i], className : `profile-hat-accessory ${i==hat?"profile-hat-accessory-selected":""}`})
				);
			}
		}
	}
}

globalThis.getLocal = (key, def)=>{
	let res = localStorage.getItem(key)
	return res !== null? res : def;
}

window.secondsFormat = (time, m=true, t=0) =>{
	
	return	t === 1 ? `${m?(time/60>>0)+":":""}`+ `${time%60 < 10 ? "0" + (time%60) : time%60}` :
			`${m?(time/60>>0)+"m ":""}`+ `${time%60}s`
};

window.timeZero = 0;
window.getTime = ()=>{
	if(window.timeZero == 0){
		window.timeZero = Date.now();
		const vc = document.getElementById("version-warning");
		
		if(vc) vc.remove();

		let styles = document.createElement('style');
		styles.innerHTML = `body{overflow:hidden;}`;
		document.head.appendChild(styles);
	}

	return Math.floor((Date.now() - window.timeZero)/1000);//client.state.self.entity.survivalTime;
};

globalThis.client = {
	events:{
		events:{
			chatMessage:0,
			playerCountChange:1,
		},
		listners:{},
		/**
		 * @param {number} key 
		 * @param {function()} fnc 
		 */
		addEventListener:function(key, fnc){
			if(!this.listners[key]){
				this.listners[key] = [];
			}
			this.listners[key].push(fnc);
		},
		/**
		 * @param {number} key 
		 * @param {function()} fnc 
		 */
		removeEventListener:function(key, fnc){
			if(this.listners[key]){
				let index = this.listners[key].indexOf(fnc);
				if(index != -1) this.listners[key].splice(this.listners[key].indexOf(fnc),1);
			}
		},

		/**
		 * @param {number} key 
		 * @param {object} data 
		 */
		emit: function(key, data){
			if(this.listners[key]){
				this.listners[key].forEach((f)=>{f(data)});
			}
		},
	},

	state: undefined,
	main: undefined,

    elem:{
		level:null,
		speed:null,
		xp:null,
		hero:null,
		logsstor:null,
	},

	pingNfps:{
		ping:0,
		fps:0,
		sendTime:0,
		lastFpsTime:0,
		frames:0,

		frame: function(){
			this.frames++;
			let d, now = Date.now();
			if((d = now - this.lastFpsTime) > 1000){
				this.fps = Math.round(this.frames * (1000-(d % 1000)) * 0.001);
                this.frames = 0;
				this.lastFpsTime = now
			}
		}
	},

	areaData:{
		data:{},
		check: ()=>{
			if (!client.state)return;
			window.client.areaData.data = {};
			for (let i in client.state.globalEntities) {
				const user = client.state.globalEntities[i];
				window.client.areaData.addUser(user);
			}
			window.client.areaData.updateLb();
		},
		addUser: (user)=>{
			const data = window.client.areaData.data;
			if(user.regionName in data){
				data[user.regionName].users[user.name] = user;
				data[user.regionName].len ++;
			}else{
				data[user.regionName] = {users:{}, len:0};
				window.client.areaData.addUser(user);
			}
		},
		updateLb:()=>{
			for (let areas of [...document.getElementsByClassName('leaderboard-world-title')]) {
				let aname = areas.getAttribute("areaName");
				if(!aname){
					areas.setAttribute("areaName", aname = areas.innerText);
					areas.addEventListener("click", ()=>{
						window.client.areaData.openAreaPopup(false, aname);
					});
				}
				if(window.client.textCommandConsts.showUIACnt)areas.innerText = `${window.client.areaData.data[aname]?.len} ${aname}`;
				else areas.innerText = aname
			}
		},
		openAreaPopup:(closeOnly = false, areaName = "")=>{
			if(closeOnly){
				let bp = document.getElementById("areaData");
				if(bp) bp.remove();
				return true;
			}
			let area = window.client.areaData.data[areaName];
			if(!area) area = {users:{}, len:0};

			const backpan = document.createElement("div");
			backpan.style.position = "absolute";
			backpan.id = "areaData";
			backpan.style.width = "100%";
			backpan.style.height = "100%";
			backpan.style.top = "0";
			backpan.style.zIndex = "1002";

			backpan.addEventListener("click", ()=>{
				window.client.areaData.openAreaPopup(true);
			});

			document.body.appendChild(backpan);

			const popup = document.createElement("div");
			popup.className = "areaPopup";
			
			popup.addEventListener("click", (e)=>{
				e.stopPropagation();
			});

			let allObjs = [];
			let names = [];
			let all = 0;

			//{//sellect logs
				const popup_logs = document.createElement("div")
				popup_logs.className = "log_part";

				popup_logs.innerHTML = `<div class="theader">logs</div>`;

				const refreshButton = document.createElement("button");
				refreshButton.className = "refresh";
				refreshButton.innerHTML = "Refresh";
				refreshButton.style.width = "70px";
				popup_logs.children[0].appendChild(refreshButton);

				const popup_logs_scroll = document.createElement("div");
				popup_logs_scroll.className = "scoll_elem";

				const setLogs = ()=>{
					popup_logs_scroll.innerHTML = "";
					for(let i of allObjs){
						popup_logs_scroll.appendChild(window.client.createLogLine(i));
					}
				}
				popup_logs.appendChild(popup_logs_scroll);

				const startInput = document.createElement("input");
				const endInput = document.createElement("input");

				startInput.type = endInput.type = "number";

				popup_logs.appendChild(startInput);
				popup_logs.appendChild(endInput);
				startInput.setAttribute("c-lock","");
				endInput.setAttribute("c-lock","");
				//c-lock

			//}

			//{//result
				const popup_result = document.createElement("div")
				popup_result.className = "result_part";

				popup_result.innerHTML = `<div class="theader">Result</div>`;

				const popup_result_text = document.createElement("textarea");
				popup_result_text.className = "result_elem";
				popup_result_text.setAttribute("c-lock", "")
				popup_result_text.readOnly = true;

				const genResult = (p, regetArr = true)=>{

					if(regetArr){
						allObjs = [];
						names = [];
						p.querySelectorAll(".scoll_user.sellected").forEach((e)=>{
							let n = e.innerHTML.substring(1, e.innerHTML.length -1);
							let u = all == 2 ? window.client.userlog2[n] : window.client.userlog[n];
							if(u){
								names.push(n);
								allObjs = [...allObjs, ...u.deaths, ...u.travel];
							}
						})
						let index = 0;
						allObjs = allObjs.filter((a)=>a[2] == areaName).sort((a,b)=>a[0] - b[0]).map((l)=>(l[5] = ++index, l));
					}

					setLogs();
					if(allObjs.length == 0)return;

					
					const name = names.join(" + "),
					time = window.client.getTimeDiff("", parseInt(startInput.value), parseInt(endInput.value), null, allObjs),
					lastMapData = allObjs[time[4]],
					map = window.getShortName(lastMapData[2]),
					area = window.normalizeArea(lastMapData[3]),
					time1 = time[1],
					time2 = time[2];

					let hero = [];
					let heroes = [];
					let heroNum = [];
					
					let difherocnt = 0;
					for(let i = 0; i < names.length; i++){
						let nh = window.id2name(window.client.getUserHero(names[i], time[6]));
						if(!hero.includes(nh)) difherocnt++;
						hero.push(nh)
						let hnu = heroNum.find((v)=>v[0] == nh);
						if(hnu){
							hnu[1] ++;
						}else{
							heroNum.push([nh, 1])
						}
					}
					heroes = difherocnt == 1 ? hero[0] : hero;
					hero = difherocnt == 1 ? hero[0] : hero.join(" + ");
					
					const splres = window.client.splitArgKeys(window.client.teamFormat);
					let res = "```\n" + window.client.teamFormat;
					splres.forEach((r)=>{
						if(r.startsWith("name") && r.length > 4 && r[4] == " "){
							let arg = r.substring(5, r.length);
							res = res.replaceAll(`{${r}}`, names.join(` ${arg} `));
						}else
						if(r.startsWith("hero num") && r.length > 8 && r[8] == " "){
							let arg = r.substring(9, r.length);
							res = res.replaceAll(`{${r}}`, heroNum.reduce((v,v2)=>{v.push(v2[1] +" "+ v2[0]); return v}, []).join(` ${arg} `));
						}else
						if(r.startsWith("hero") && r != "hero num" && r.length > 4 && r[4] == " "){
							let arg = r.substring(5, r.length);
							res = res.replaceAll(`{${r}}`, heroes.join(` ${arg} `));
						}else{
							switch(r){
								case "name":
									res = res.replaceAll("{name}", name);
									break;
								case "map":
									res = res.replaceAll("{map}", map);
									break;
								case "area":
									res = res.replaceAll("{area}", area);
									break;
								case "time":
									res = res.replaceAll("{time}", time[0]);
									break;
								case "start time":
									res = res.replaceAll("{start time}", time1);
									break;
								case "end time":
									res = res.replaceAll("{end time}", time2);
									break;
								case "hero":
									res = res.replaceAll("{hero}", hero);
									break;
								case "hero num":
									res = res.replaceAll("{hero num}", heroNum.reduce((v,v2)=>{v.push(v2[1] +" "+ v2[0]); return v}, []).join(" + "));
									break;
							}
						}
					});
					res += "\n```";

					popup_result_text.innerHTML = res;

				}

				popup_result.appendChild(popup_result_text);
			//}

			//{//sellect users team
				const popup_users = document.createElement("div")
				popup_users.className = "users_part";

				popup_users.innerHTML = `<div class="theader">Users</div>`;
				

				const popup_users_scroll = document.createElement("div");
				popup_users_scroll.className = "scoll_elem";
				
				

				let fillusers=()=>{
					for(let i = popup_users_scroll.childNodes.length-1; i >= 0; i--){
						popup_users_scroll.childNodes[i].remove();
					}
					for(let user in all == 0 ? area.users: all == 1 ? window.client.userlog : window.client.userlog2){
				//for(let user in area.users){
					const userelem = document.createElement("div");
					userelem.className = "scoll_user";
					userelem.innerText = " "+user+" ";

					userelem.addEventListener("click", ()=>{
						if(userelem.classList.contains("sellected")){
							userelem.classList.remove("sellected");
						}else{
							userelem.classList.add("sellected");
						}
						genResult(popup_users_scroll);
					});
					
					
					popup_users_scroll.appendChild(userelem);
				}genResult(popup_users_scroll);}
				fillusers();

				const resetUsersButton = document.createElement("button");
				resetUsersButton.className = "refresh";
				resetUsersButton.innerHTML = "current";
				resetUsersButton.style.width = "70px";
				popup_users.childNodes[0].appendChild(resetUsersButton);
				resetUsersButton.addEventListener("click", ()=>{
					all = ++all%3;
					resetUsersButton.innerHTML = ["current", "all", "imported"][all];
					fillusers();
				});

				popup_users.appendChild(popup_users_scroll);
				startInput.addEventListener("input", ()=>{
					genResult(popup_users_scroll, false);
				});
				endInput.addEventListener("input", ()=>{
					genResult(popup_users_scroll, false);
				});
				refreshButton.addEventListener("click", ()=>{
					genResult(popup_users_scroll);
				})
			//}

			//{//set result format
				const popup_format = document.createElement("div")
				popup_format.className = "format_part";

				popup_format.innerHTML = `<div class="theader">Result format</div>`;

				const popup_format_input = document.createElement("input");
				popup_format_input.setAttribute("c-lock","");
				popup_format_input.id = "gresf-input";
				popup_format_input.className = "format_elem";
				popup_format_input.value = window.client.teamFormat;

				const oic = ()=>{
					localStorage.setItem("ts-resTFormat", window.client.teamFormat = popup_format_input.value);
					genResult(popup_users_scroll, false);
				}
				popup_format_input.addEventListener("input", oic)

				//sellect
				const popup_format_hint_input = document.createElement("div");
				popup_format_hint_input.className = "cmds_elem";
				
				const cmdf = (te)=>window.client.editChatInput(true, te, ` {${te}}`, "gresf-input", false)
				const si = ` class="cmd" title="`;

				popup_format_hint_input.innerHTML = 
				`${cmdf("name").replace(" ", si+`Team players names e.g. player1 + player2 + player3."`)}`
				+`${cmdf("hero").replace(" ", si+`Team heroes e.g. magmax + magmax + shade. If all team is magmax, it will say magmax only 1 time."`)}`
				+`${cmdf("hero num").replace(" ", si+`Team heroes e.g. 2 magmax + 1 shade."`)}`
				+`${cmdf("map").replace(" ", si+`The name of the map."`)}`
				+`${cmdf("area").replace(" ", si+`The last log area."`)}`
				+`${cmdf("time").replace(" ", si+`The time from 1st to last log."`)}`
				+`${cmdf("start time").replace(" ", si+`The first log time."`)}`
				+`${cmdf("end time").replace(" ", si+`The last log time."`)}`;

				for(let i of popup_format_hint_input.children){
					let conc = i.onclick;
					i.onclick = ()=>{
						conc();
						oic();
					}
				}

				popup_format.appendChild(popup_format_hint_input);
				popup_format.appendChild(popup_format_input);
			//}

			popup.appendChild(popup_users);
			popup.appendChild(popup_logs);
			popup.appendChild(popup_format);
			popup.appendChild(popup_result);
			backpan.appendChild(popup);
		}
	},

	logTypesToShow:[0,1,2,3,4,5,6],

	freeze_time: +new Date(),
    opos:[null,null],
	userlog:{},
	userlog2:{},
	chat:null,
	teamFormat: getLocal("ts-resTFormat", "{name} ;; {map} {area} ;; {time} ;; (0/2)"),
	format: getLocal("ts-resFormat", "No format yet. Do #format for help"),
	allowedHeroes: JSON.parse(getLocal("ts-allowedHeroes", "[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]")),
	textCommandConstsE:[],
	textCommandConsts:{
		prefix: getLocal("ts-prefix", "#"),
		showTag: getLocal("ts-showTag", "false") == "true",
		bannedType: +getLocal("ts-bannedType", "0"),
		showUIACnt: getLocal("ts-showUIACnt", "false") == "true",
		showUcard: getLocal("ts-showUcard", "true") == "true",
		timerReal: (temp1 = getLocal("ts-timerReal", "1"), temp1 == "true" ? 1 : temp1 == "false"? 2 : +temp1),
		lbTags: getLocal("ts-lbTags", "true") == "true",
		togglefps: getLocal("ts-togglefps", "true") == "true",
		autodc: getLocal("ts-autodc", "false") == "true",
		//ssxp: getLocal("ts-ssxp", "false") == "true",
		
	},
	grb:{
		on: false,
		grbKey: 3,
		toggle: function(){
			const lt = window.getTag(window.client.main.name);
			if(lt=="")return 2;
			if(!(window.client.grb.on = !window.client.grb.on)){
				setTimeout(()=>{
					window.client.state.keys.keyUp(window.client.grb.grbKey);
				}, 75)
			}
		}
	},
	userMetas: JSON.parse(getLocal("ts-userMetas", "{}")),

	splitArgKeys:function(text, isTeam){
		const r = text.match(/\{(name|map|area|time|start time|end time|hero|hero num).*?\}/gm);
		if(r) return r.map((e)=>e.substring(1, e.length -1));
		return [];
	},

	genResult:function(name){
		let format = window.client.format;//"{name} ;; {map} {area} ;; {time} ;; (0/2)";
		let res, u = window.client.elem.logsstor[name];
		if(u){
			const list = [...u.travel, ...u.deaths].sort((a1,a2)=>{return a1[0]-a2[0]}),
			time = window.client.getTimeDiff(name, u.logids[0], u.logids[1]),
			hero = window.id2name(window.client.getUserHero(name, time[6])),//window.client.elem.hero.innerText,
			lastMapData = list[time[4]],
			map = window.getShortName(lastMapData[2]),
			area = window.normalizeArea(lastMapData[3]),
			time1 = time[1],
			time2 = time[2];

			const splres = window.client.splitArgKeys(format);
			res = "```\n" + format;
			splres.forEach((r)=>{
				switch(r){
					case "name":
						res = res.replaceAll("{name}", name);
						break;
					case "map":
						res = res.replaceAll("{map}", map);
						break;
					case "area":
						res = res.replaceAll("{area}", area);
						break;
					case "time":
						res = res.replaceAll("{time}", time[0]);
						break;
					case "start time":
						res = res.replaceAll("{start time}", time1);
						break;
					case "end time":
						res = res.replaceAll("{end time}", time2);
						break;
					case "hero":
						res = res.replaceAll("{hero}", hero);
						break;
				}
			});
			res += "\n```";
		}
		let sellector;
		if(!(sellector = document.getElementById("copy-sellector2"))){

			const cs = document.createElement("div");
			cs.innerHTML = `<input id="copy-sellector2" value="nop" style="position:absolute; left:-100%; width:10px; border:none;">`;
			document.body.appendChild(cs);
			sellector = cs.childNodes[0];
		}
		sellector.value = res;
		sellector.select();
		document.execCommand('copy');
	},

	toggleAllowedHeroe: function(nr){
		
		let f = (t)=>{
			if(window.client.elem.hero != null){
				if(window.client.elem.hero.innerText == window.id2name(nr)){
					if(t) window.client.elem.hero.className = "";
					else window.client.elem.hero.className = "blacklisted";
				}
			}
		}

		if(window.client.allowedHeroes.includes(nr)){
			window.client.allowedHeroes.splice(window.client.allowedHeroes.indexOf(nr), 1);
			f(false);
		}else{
			window.client.allowedHeroes.push(nr);
			f(true);
		}
		
		localStorage.setItem("ts-allowedHeroes", JSON.stringify(window.client.allowedHeroes));
	},

	toggleHeroList: function(hideOnly = false){
		const THELEM = document.querySelector(".herolist");
		if(THELEM){
			THELEM.parentNode.remove();
		}
		if(hideOnly){
			return;
		}
		const backpan = document.createElement("div");
		backpan.style.position = "absolute";
		backpan.style.width = "100%";
		backpan.style.height = "100%";
		backpan.style.top = "0";

		backpan.addEventListener("click", ()=>{
			window.client.toggleHeroList(true);
		});

		document.body.appendChild(backpan);

		const popup = document.createElement("div");
		popup.className = "herolist";
		
		popup.addEventListener("click", (e)=>{
			e.stopPropagation();
		});

		for(let i = 0; i < 24; i++){
			let hero = window.id2name(i);
			let color = window.getHeroRealColor(hero);
			const block = document.createElement("div");
			block.className = `block asnr${i}`;

			block.innerHTML +=
			`<div class="hero" style="background-color: ${color}"></div>`+
			`<div class="text" style="color: ${color}">${hero}</div>`
			;

			if(window.client.allowedHeroes.includes(i)) block.style.backgroundColor = "#000";
			else block.style.backgroundColor = "#330000";
			block.addEventListener("click", ()=>{
				window.client.toggleAllowedHeroe(i);
				if(window.client.allowedHeroes.includes(i)) block.style.backgroundColor = "#000";
				else block.style.backgroundColor = "#330000";
			});
			popup.appendChild(block);
		}

		backpan.appendChild(popup);
	},

	ucardCssElem: null,
	toggleUcard: function(on){
		if(on){
			if(!window.client.ucardCssElem){
				window.client.ucardCssElem = document.createElement("style");
				document.head.appendChild(window.client.ucardCssElem);
			}
			window.client.ucardCssElem.innerHTML = 
			`#leaderboard +
			.player-contextmenu{
				display:none!important;
			}`
		}else{
			if(!window.client.ucardCssElem){
				window.client.ucardCssElem = document.createElement("style");
				document.head.appendChild(window.client.ucardCssElem);
			}
			window.client.ucardCssElem.innerHTML = 
			`.chat-message-contextmenu.fake{
				display:none!important;
			}
			`
		}
	},

	openUcard: function(namee, pos, logs){
		if(window.client.textCommandConsts.showUcard){
			let HeroT, Hero, Level, Name, targetName;
			window.z = targetName = namee;
			if (client.state) {
				for (let i in client.state.globalEntities) {
					const element = client.state.globalEntities[i];
	
					//targetName = getAttrInParents(event.target,"ariaLabel");
					
					if (element.name == targetName) {
						//window.z = element.name;
						HeroT = element.heroType;
						Hero = window.id2name(HeroT);
						Level = element.level;
						Name = element.name;
						break;
					}
				}
			} else {
				Hero = "undefined"
				Name = "undefined"
			}
	
			client.count = 1;
	
			const name = targetName;
	
			let o = null;
			if(client.state)for(var i in client.state.entities){
				let obj = client.state.entities[i]
				if(obj.name == window.z){
					o = obj;//experience
					break;
				}
			}
			window.client.elem.logsstor = logs;
			window.client.hideLogs();
			window.removeFakes();
			const elem = document.createElement("div");
			elem.className = "chat-message-contextmenu fake";
			elem.style = `top: ${pos[1]}px; right: ${pos[0]+"px"}; ${(window.client.textCommandConsts.bannedType == 1 && window.blaclist.includes(name)) ? "height:326px!important;" : ""}`;
			elem.id = "elem-"+name
			elem.setAttribute("realname", name);
			const vpcolor = window.getVpColor(o?.winCount ? o.winCount : logs[name].vp);
			elem.innerHTML =
			`<aa class="banned-text${window.client.textCommandConsts.bannedType}" style="${!window.blaclist.includes(name) ? 'display: none!important;' : ''}">BANNED</aa>`+
			`<button id="log"class="bbtn"onClick="window.client.showLog('${name}', ${pos[1]}, window.client.openLogger(false))"title="Open logs popup.">L</button>`+
			`<button id="add"class="bbtn"onClick="window.client.customLog('${name}')"title="Add a custom (special) log.">+</button>`+
			`<button id="gen"class="bbtn"onClick="window.client.genResult('${name}')"title="Generate the runs data.">G</button>`+
			`<button id="reset"class="bbtn"onClick="window.client.resetAreaLog('${name}')"title="Reset the log that shows when the user entered the game area.">R</button>`+
			`<button id="close"class="bbtn"onClick="window.client.hideLogs();this.parentNode.remove()"title="Close the popup.">X</button>`+
			`<div id="name"class="chat-message-contextmenu-header" style="text-align:center;margin-top: 30px;">${name}</div>`+
			`<ul style="display: table-cell;">`+
				`<li style="display: table-cell;">`+
					`<a href="/profile/${name}" target="_blank">Profile</a>`+
					`<p>Hero: <b id="c4" class="${window.client.allowedHeroes.includes(HeroT)? '' : 'blacklisted'}" style="color:${window.getHeroColor(Hero)};text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 2px 2px 0 #000;font-size: larger; margin-bottom:0;">${Hero}</b></p>`+
					`<p id="c0">VP: <b ${vpcolor == "rainbow" ? `class="rainbowText" style="` : `style="color:${vpcolor};`}text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 2px 2px 0 #000;font-size: larger; margin-top:0;">${o != null ? o.winCount: (logs[name].vp !== undefined ? logs[name].vp : "###") }</b></p>`+
					`<p id="c1">Level: ${Level || -1}</p>`+
					`<p id="c2">Speed: ${-1}</p>`+
					`<p id="c3">XP: ${o != null ? o.experience: "not in same area" }</p>`+
					`<div id="timecounter">`+
					`<input c-lock id="tc-from" type="number" value="${window.client.getUserLogIds(name)[0]}" title="Users log id to start time counting from.">`+
					`<input c-lock id="tc-to" type="number" value="${window.client.getUserLogIds(name)[1]}"title="End time users log id.">`+
					`<p id="tc-result"></p>`+
					`</div>`+
				`</li>`+
			`</ul>`;
			if(document.getElementById('chat'))document.getElementById('chat').parentNode.parentNode.append(elem);
			else document.body.append(elem)
			window.client.elem.level = elem.querySelector("ul>li>p#c1");
			window.client.elem.speed = elem.querySelector("ul>li>p#c2");
			window.client.elem.xp = elem.querySelector("ul>li>p#c3");
			window.client.elem.hero = elem.querySelector("ul>li>p>b#c4");
			//window.client.refreshHeroOnUcard(name, ct2[0]);
			window.r = elem;
			elem.onClick = function(e) {
				return e.stopPropagation()
			}
			window.makeDragable(elem, [elem]);
	
			window.client.elem.hero.addEventListener("click", ()=>{
				window.client.toggleHeroList();
			});
	
			const removcl = (el)=>{
				el.addEventListener("click", (e)=>{
					e.stopPropagation();
				});
				el.addEventListener("mousedown", (e)=>{
					e.stopPropagation();
				});
			}
			
			removcl(window.client.elem.hero);
			let btns = elem.querySelectorAll("button");
			btns.forEach((btn)=>{
				removcl(btn);
			});
	
			const nameEmem = elem.querySelector("#name")
			nameEmem.addEventListener("mousedown", (e)=>{e.stopPropagation();});
			
			nameEmem.addEventListener("click", (e)=>{
				window.client.openUserMetas(getAttrInParents(e.target, "realname"));
				e.stopPropagation();
			});
			
			
			const el1 = elem.querySelector("ul>li>#timecounter>#tc-from");
			const el2 = elem.querySelector("ul>li>#timecounter>#tc-to");
			const el3 = elem.querySelector("ul>li>#timecounter>#tc-result");
	
			const f = ()=>{
	
				if(el3){
					window.client.getTimeDiff(name, el1.value, el2.value, el3);
				}
			}
	
			el1.addEventListener("input", f);
			el2.addEventListener("input", f);
			f();
	
			return false;
		}
	},

	toggleLbTagscsscode:"",
	toggleLbTagscsscodeElem: null,
	toggleLbTags:function(on){
		if(!window.client.toggleLbTagscsscodeElem){
			window.client.toggleLbTagscsscodeElem = document.createElement("style");
			document.head.appendChild(window.client.toggleLbTagscsscodeElem);
		}
		if(on) window.client.toggleLbTagscsscodeElem.innerHTML = window.client.toggleLbTagscsscode;
		else window.client.toggleLbTagscsscodeElem.innerHTML = "";
	},
	metascsscodeElem: null,
	recalcUserMetas: function(){
		if(!window.client.metascsscodeElem){
			window.client.metascsscodeElem = document.createElement("style");
			document.head.appendChild(window.client.metascsscodeElem);
		}
		let newiHtml = ``;

		let arr1=[],arr2=[];
		for(let i in window.client.userMetas){
			let data = window.client.userMetas[i];
			if(data.lbtag == "Friend")arr1.push('#leaderboard span[arialabel="'+i+'"]::before')
			else if(data.lbtag == "Warning")arr2.push('#leaderboard span[arialabel="'+i+'"]::before')
		}
		if(arr1.length > 0){
			newiHtml+=`
			${arr1.join(",")}{
				content: "[F]";
				margin-right: 4px;
				color: #00ff00;
				text-shadow: -1px -1px 5px #0000006e, 1px -1px 5px #0000006e, -1px 1px 20px #0000006e, 1px 1px 5px #0000006e;
			}
			`;
		}
		if(arr2.length > 0){
			newiHtml+=`
			${arr2.join(",")}{
				content: "[!]";
				margin-right: 4px;
				color: #ff0000;
				text-shadow: -1px -1px 5px #0000006e, 1px -1px 5px #0000006e, -1px 1px 20px #0000006e, 1px 1px 5px #0000006e;
			}
			`;
		}
		window.client.metascsscodeElem.innerHTML = newiHtml;
	},

	editChatInput: function(add, disptext, edittext, inputId = "chat-input", doStyle = true){
		let etext = edittext ? edittext : disptext;
		let newText = 
		`<font ${doStyle? `style="font-weight:bold;"` : ""} onclick="let e = document.getElementById('${inputId}');e.focus();${add?`e.value+='${etext}'`:`e.value='${etext}'`};e">${disptext}</font>`;
		newText = newText.replaceAll("{prefix}", window.client.textCommandConsts.prefix);
		return newText;
	},

	/*toggleExtendLb: function(){
		globalThis.client.extendLb = globalThis.client.textCommandConsts.ssxp;// || smth
	},*/

	checkMsg: function(value){
		if(!value) return;
		let p = window.client.textCommandConsts.prefix;
		if(value.startsWith("#") || value.startsWith(p)){
			const messageS = value.split(" ");
			
			if(["#", p, p+"help"].includes(messageS[0])){
				let f = (t)=> `<font style="font-weight:bold;" onclick="let e = document.getElementById('chat-input');e.focus();e.value='${t}';e">${t}</font>`

				let sysText = `${p} is the prefix.<br>`+
				`${window.client.editChatInput(false, `{prefix}prefix`)} - set prefix.<br>`+
				`${window.client.editChatInput(false, `{prefix}toggletag`)} - switches ON/OFF.<br>`+
				`${window.client.editChatInput(false, `{prefix}togglelbtags`)} - changes the format of the generated run results.<br>`+
				`${window.client.editChatInput(false, `{prefix}toggleusers`)} - toggles users count on the leaderboard.<br>`+
				`${window.client.editChatInput(false, `{prefix}toggleusercard`)} - toggles users card on the leaderboard.<br>`+
				`${window.client.editChatInput(false, `{prefix}toggletimer`)} - changes the timer (if on - timer shows real time. if off - timer shows the time that will be shown on the death screen.).<br>`+
				`${window.client.editChatInput(false, `{prefix}togglefps`)} - toggles fps and ping.<br>`+
				`${window.client.editChatInput(false, `{prefix}banned`)} - change the way users banned from tournaments are shown.<br>`+
				`${window.getTag(window.client.main.name)!=""? `${window.client.editChatInput(false, `{prefix}grb`)} - toggle grb mode (if on - only D and arrow right works. type again to stop)${"<br>^Do not abuse this command.^".fontcolor("#d00")}<br>`:""}`+
				`${window.client.editChatInput(false, `{prefix}format`)} - shows the details of ${p}setformat.<br>`+
				`${window.client.editChatInput(false, `{prefix}setformat`)} - changes the format of the generated run results.<br>`+
				`${window.client.editChatInput(false, `{prefix}autodc`)} - toggle automatic disconnection on F5/CTRL+R.<br>`+
				`${window.client.editChatInput(false, `{prefix}arealb`)} - send a message (for you only) with a simple leaderboard<br>`;
				//`${window.client.editChatInput(false, `{prefix}ssxp`)} - toggle SS leaderboard between XP and Level.<br>`;

				if(window.client.textCommandConstsE.length > 0){
					sysText += `<br>CUSTOM COMMANDS<br><br>`;
					for(let cmd of window.client.textCommandConstsE){
						sysText += `${window.client.editChatInput(false, `{prefix}${cmd[1]}`)} - ${cmd[2]}<br>`;
					}
				}

				window.client.sendSystemMessage(sysText);
			}else
			if([p+"prefix"].includes(messageS[0])){//nd
				if(messageS[1]?.length > 0 && messageS[1] != "/"){
					localStorage.setItem("ts-prefix", window.client.textCommandConsts.prefix = messageS[1]);
					window.client.sendSystemMessage(`The prefix is changed from ${p} is to ${messageS[1]}`);
				}else{
					window.client.sendSystemMessage(`Prefix should contain atleast 1 character and cannot be a /`);
				}
			}else
			if([p+"toggletag"].includes(messageS[0])){
				localStorage.setItem("ts-showTag", window.client.textCommandConsts.showTag = !window.client.textCommandConsts.showTag);
				window.client.sendSystemMessage(`User tags are now turned ${["off","on"][+window.client.textCommandConsts.showTag]}`);
			}else
			if([p+"autodc"].includes(messageS[0])){
				localStorage.setItem("ts-autodc", window.client.textCommandConsts.autodc = !window.client.textCommandConsts.autodc);
				window.client.sendSystemMessage(`autodc is now turned ${["off","on"][+window.client.textCommandConsts.autodc]}`);
			}else
			/*if([p+"ssxp"].includes(messageS[0])){
				localStorage.setItem("ts-ssxp", window.client.textCommandConsts.ssxp = !window.client.textCommandConsts.ssxp);
				window.client.sendSystemMessage(`ssxp is now turned ${["off","on"][+window.client.textCommandConsts.ssxp]}`);
				window.client.toggleExtendLb();
			}else*/
			if([p+"togglelbtags"].includes(messageS[0])){
				localStorage.setItem("ts-lbTags", window.client.textCommandConsts.lbTags = !window.client.textCommandConsts.lbTags);
				window.client.toggleLbTags(window.client.textCommandConsts.lbTags);
				window.client.sendSystemMessage(`Leaderboard tags are now turned ${["off","on"][+window.client.textCommandConsts.lbTags]}`);
			}else
			/*if([p+"toggletimer"].includes(messageS[0])){//nd
				localStorage.setItem("ts-timerReal", window.client.textCommandConsts.timerReal = !window.client.textCommandConsts.timerReal);
				window.client.sendSystemMessage(`timer now shows ${["end screen time","real time"][+window.client.textCommandConsts.timerReal]}`);
			}else*/
			if([p+"toggleusers"].includes(messageS[0])){
				localStorage.setItem("ts-showUIACnt", window.client.textCommandConsts.showUIACnt = !window.client.textCommandConsts.showUIACnt);
				window.client.areaData.updateLb();
				window.client.sendSystemMessage(`User count is now turned ${["off","on"][+window.client.textCommandConsts.showUIACnt]}`);
			}else
			if([p+"toggleusercard"].includes(messageS[0])){
				localStorage.setItem("ts-showUcard", window.client.textCommandConsts.showUcard = !window.client.textCommandConsts.showUcard);
				window.client.toggleUcard(window.client.textCommandConsts.showUcard);
				window.client.sendSystemMessage(`User card is now turned ${["off","on"][+window.client.textCommandConsts.showUcard]}`);
			}else
			if([p+"togglefps"].includes(messageS[0])){
				localStorage.setItem("ts-togglefps", window.client.textCommandConsts.togglefps = !window.client.textCommandConsts.togglefps);
				window.client.sendSystemMessage(`User card is now turned ${["off","on"][+window.client.textCommandConsts.togglefps]}`);
			}else
			if([p+"banned"].includes(messageS[0])){
				if(messageS.length > 1){
					if(!isNaN(parseInt(messageS[1]))){
						localStorage.setItem("ts-bannedType", ""+(window.client.textCommandConsts.bannedType = +messageS[1]));
						window.client.sendSystemMessage(`Banned user show type is now ${window.client.textCommandConsts.bannedType}`);
						return false;
					}
				}
				window.client.sendSystemMessage(`Invalid input. Use a number from 0 to 1`);
			}else
			if([p+"grb"].includes(messageS[0])){
				let r = window.client.grb.toggle();
				window.client.sendSystemMessage(r != 2 ? `GRB is now turned ${["off","on"][window.client.grb.on ? 1 : 0]}` : `GRB is currently unavailable!`);
			}else
			if([p+"format"].includes(messageS[0])){
				let sf = window.client.editChatInput;
				let f = (t)=>sf(true,t,` {${t}}`);
				window.client.sendSystemMessage(
					`Keywords: ${f("name")}, ${f("map")}, ${f("area")}, ${f("time")}, ${f("start time")}, ${f("end time")}, ${f("hero")}.`+
					`<br>Working example:<br>${sf(false, `{prefix}setformat {name} ;; {map} {area} ;; {time}`)}<br>`+
					`current: ${sf(false,window.client.format, `{prefix}setformat ${window.client.format}`)}`
				);
			}else
			if([p+"setformat"].includes(messageS[0])){
				let newFromat = [...messageS];
				newFromat.splice(0, 1);
				newFromat = newFromat.join(" ");
				localStorage.setItem("ts-resFormat", window.client.format = newFromat);
				window.client.sendSystemMessage(`Newformat is setd to "${newFromat}"`);
			}else
			if([p+"arealb"].includes(messageS[0])){
				let sort = (e1, e2)=> 0;
				if(messageS[1] == "xp") sort = (e1, e2)=>e2.experience - e1.experience;
				if(messageS[1] == "area") sort = (e1, e2)=>e2.areaNumber - e1.areaNumber;
				if(messageS[1] == "name") sort = (e1, e2)=>e1.name > e2.name ? 1 : -1;
				if(messageS[1] == "hero") sort = (e1, e2)=>e1.heroType - e2.heroType;

				client.sendSystemMessage(`${globalThis.client.main.regionName} ${globalThis.client.main.areaName}<br>`+
				Object.values(globalThis.client.state.entities).filter(e=>e.entityType == 0)
				.sort(sort)
				.map(e=>`${e.name} ;; ${e.level} LVL ;; ${e.experience} XP ;; ${id2name(e.heroType)}`).join("<br>"))
			}
			else{

				if(window.client.textCommandConstsE.length > 0){
					for(let cmd of window.client.textCommandConstsE){
						if(p+cmd[1] == messageS[0]){
							cmd[3](cmd, value);
						}
					}
				}

			}
			return false;
		}
		return true;
	},

	checkMsgSend: function(value){
		if(!value) return value;

		let valueS = value.split(" ");
		if(["/mute", "/ipmute", "/ban", "/ipban"].includes(valueS[0])){
			let pref = valueS.splice(0, 1);
			let tempval = valueS.join(" ");
			let similarNames = [], theName = "";
			for(let i in client.state.globalEntities){
				if(tempval.startsWith(client.state.globalEntities[i].name + " ")){
					similarNames.push(client.state.globalEntities[i].name);
				}
			}
			if(similarNames.length == 0) return value;
			if(similarNames.length == 1){
				theName = similarNames[0];
			}else{
				theName = similarNames.sort((a,b)=>b.length - a.length)[0];
			}

			let times = tempval.substring(theName.length).split(" ");

			let resTime = 0;
			let passed = false;
			for(let timeD of times){
				let data = [+(timeD.substring(0,timeD.length-1)), timeD[timeD.length-1]];
				
				if(isNaN(data[0]))continue;
				switch(data[1]){
					case "с":
					case "s":
						resTime += data[0];
						passed = true;
						break;
					case "м":
					case "m":
						resTime += data[0] * 60;
						passed = true;
						break;
					case "ч":
					case "h":
						resTime += data[0] * 60 * 60;
						passed = true;
						break;
					case "д":
					case "d":
						resTime += data[0] * 60 * 60 * 24;
						passed = true;
						break;
					case "н":
					case "w":
						resTime += data[0] * 60 * 60 * 24 * 7;
						passed = true;
						break;
				}
			}
			if(!passed) return value;
			let end = "s";
			resTime = Math.round(resTime);
			if((resTime % 60) == 0 && resTime/60 != 0){
				resTime /= 60;
				end = "m";
			}
			if((resTime % 60) == 0 && resTime/60 != 0){
				resTime /= 60;
				end = "h";
			}
			if((resTime % 24) == 0 && resTime/24 != 0){
				resTime /= 24;
				end = "d";
			}
			return `${pref} ${theName} ${resTime}${end}`
		}
		window.client.pingNfps.sendTime = window.client.pingNfps.sendTime == 0 ? Date.now() : window.client.pingNfps.sendTime;
		return value;
	},

	sendSystemMessage: function(message = ""){
		let chat = window.client.chat?.parentNode ? window.client.chat : (window.client.chat = document.getElementById("chat-window"));
		if(chat){
			if(message != ""){
				chat.innerHTML = chat.innerHTML+
				`<div class="chat-message">`+
					`<span class="server-warning">`+
						`<span class="chat-message-sender" arialabel="[SCRIPT]">`+
							`[SCRIPT]`+
						`</span>`+
						`: ${message}`+
					`</span>`+
				`</div>`
			}
			chat.scrollTop = chat.scrollHeight;
		}
	},

	editLogType:function(input){
		if(input){
			const cname = input.className.split(" ").splice(1,1).join(" ");
			const nr = window.nrByStyle(cname);
			const key = window.client.logTypesToShow.findIndex((k) => {return k == nr})

			const f = (act)=>{
				document.querySelector(".log-popup").childNodes.forEach((el)=>{
					
					if(el.className == "ele " + cname){
						el.style.display = act ? "" : "none";
					}
				});
			}
			
			if(input.checked && key == -1){
				window.client.logTypesToShow.push(nr);
				f(true);
			}else
			if(!input.checked && key != -1){
				window.client.logTypesToShow.splice(key, 1);
				f(false);
			}

		}
	},

	resetAreaLog:function(name = ""){
		const u = window.client.userlog[name];
		if(u){
			u.exited = false;
		}
	},

	showLog:function(name = "", y = 0, deleted = false, dragable=true){
		let u = null;
		if(Object.keys(window.client.userlog2)?.length > 0){
			u = window.client.userlog2[name] ?? window.client.userlog[name];
		}else{
			u = window.client.userlog[name];
		}
		if(u){
			if(!document.getElementById("log-" + name) && !deleted){
				const elpos = document.querySelector(".chat-message-contextmenu.fake");
				let elposy = parseInt(elpos?.style?.top?.substring(0, elpos?.style?.top?.length-2));
				let elposx = parseInt(elpos?.style?.right?.substring(0, elpos?.style?.right?.length-2));
				elposy = isNaN(elposy) ? 0 : elposy;
				elposx = isNaN(elposx) ? 0 : elposx;
				const elem = document.createElement("div");
				elem.id = "log-" + name;
				elem.style.top = `${elposy}px`;
				elem.style.right = `${elposx + 230}px`;
				elem.className = "log-popup";
				//ele
				
				
				let list = [...u.travel, ...u.deaths].sort((a1,a2)=>{return a1[0]-a2[0]});
				
				for(var i = 0; i < list.length; i++){
					const line = document.createElement("div");
					line.style.display = window.client.logTypesToShow.includes(list[i][4]) ? "": "none";
					line.className = `ele ${window.styleByNr(list[i][4])}`;
					
					line.innerHTML = `<div id="logid">${list[i][5]}|</div><div id="time">${list[i][1]}</div><div id="map">${window.getShortName(list[i][2])}</div><div id="area">${window.normalizeArea(list[i][3])}</div>`
					
					elem.appendChild(line);
				}
				
				document.body.appendChild(elem);
				elem.scrollTop = elem.scrollHeight;
				
				const elem2 = document.createElement("div");
				elem2.id = "log-h-" + name;
				elem2.style.top = `${elposy}px`;
				elem2.style.right = `${elposx + 490}px`;
				elem2.className = "log-popup-extra";
				
				for(let i = 0; i < 7; i++){
					elem2.innerHTML += `<input type="checkbox" onclick="window.client.editLogType(this)" ${window.client.logTypesToShow.includes(i) ? "checked": ""} class="custombox ${window.styleByNr(i)}"></input>`;
				}
				
				document.body.appendChild(elem2);
				if(dragable) window.makeDragable(elem, [elem, elem2])
				return [elem, elem2];
			}else
			if(!deleted){
				document.getElementById("log-" + name).remove();
				document.getElementById("log-h-" + name).remove();
			}
		}
	},

	openUserMetas: function(name, closeonly = false, cb = null){
		const THELEM = document.querySelector(".usermetas");
		if(THELEM){
			globalThis.CANR = true;
			if(cb)cb();
			THELEM.parentNode.remove();
			return;
		}else
		if(!closeonly){
			globalThis.CANR = false;
			const res = window.client.userMetas[name]?{...window.client.userMetas[name]}:{
				lbtag:"",
				note:"",
			};
			const backpan = document.createElement("div");
			backpan.style.position = "absolute";
			backpan.style.width = "100%";
			backpan.style.height = "100%";
			backpan.style.top = "0";

			document.body.appendChild(backpan);
			
			const popup = document.createElement("div");
			popup.className = "usermetas";
			backpan.appendChild(popup);
			popup.addEventListener("click", (e)=>{
				e.stopPropagation();
			});

			const header = document.createElementP("div", {className:"header",innerText:name});
			popup.appendChild(header);

			const buttonsLay = document.createElement("div");
			buttonsLay.className = "buttonslay";
			popup.appendChild(buttonsLay);

			const currentState = document.createElementP("div",{className:"currentState",innerText:res.lbtag}),
			buttonFriend = document.createElementP("button",{className:"friend",innerText:"Friend"},(e)=>{
				e.addEventListener("click",()=>{
					currentState.className = "currentState " + (currentState.innerText = res.lbtag = res.lbtag == e.innerText? "" : e.innerText);
				})
			}),

			buttonWarning = document.createElementP("button",{className:"warning",innerText:"Warning"},(e)=>{
				e.addEventListener("click",()=>{
					currentState.className = "currentState " + (currentState.innerText = res.lbtag = res.lbtag == e.innerText? "" : e.innerText);				})
			});
			buttonsLay.appendChild(buttonFriend);
			buttonsLay.appendChild(currentState);
			buttonsLay.appendChild(buttonWarning);


			const noteLay = document.createElement("div");
			noteLay.className = "notelay";
			popup.appendChild(noteLay);

			const noteInput = document.createElementP("textarea",null,(e)=>{
				e.setAttribute("c-lock", "");
				e.value = res.note;
			});
			noteLay.appendChild(noteInput);

			const badgesLay = document.createElementP("div",{className:"badgeslay"},(e)=>{
				const rolesArr = window.tags.getUsersTags(name);
				for(let i of rolesArr){
					let tagData = window.tags.tagsData[i];
					if(tagData.badge){
						const badge = document.createElementP("div",{className:"badge",innerText:tagData.badge.text},(e)=>{
							e.setAttribute("badge", i);
						})
						e.appendChild(badge);
					}
				}
				if(e.childElementCount > 6){
					e.className = "badgeslay small";
				}
			});
			popup.appendChild(badgesLay);

			
			const buttonSave = document.createElementP("button",{id: "save", innerText:"Save"}, (e)=>{
				e.addEventListener("click", ()=>{
					res.note = noteInput.value;
					if(res.note == "" && res.lbtag == ""){
						if(name in window.client.userMetas)
						delete window.client.userMetas[name];
					}
					else
					window.client.userMetas[name] = res;
					localStorage.setItem("ts-userMetas", JSON.stringify(window.client.userMetas));
					window.client.recalcUserMetas();
					window.client.openUserMetas(name, true, cb);
				})
			});

			const buttonCancel = document.createElementP("button",{id: "cancel", innerText:"Cancel"}, (e)=>{
				e.addEventListener("click", ()=>{
					window.client.openUserMetas(name, true, cb);
				});
			});

			popup.appendChild(buttonSave);
			popup.appendChild(buttonCancel);
		}
	},

	timeDiffRes:[0, null],

	getTimeDiff:function(name = "", t1 = 0, t2 = 0, res = null, customData = null){
		const u = customData ? null : window.client.elem.logsstor[name];
		if(u || customData){
			if(!customData) u.logids = [t1,t2];
			let list = customData ? customData : [...u.travel, ...u.deaths];
			let ct1 = list.find((e)=>{return e[5] == t1});
			let ct2 = 0;

			if(t2 == 0){
				list = list.sort((a,b)=>{return a[0]-b[0]})
				ct2 = list[list.length-1];
			}else{
				ct2 = list.find((e)=>{return e[5] == t2})
				if(!ct2){
					list = list.sort((a,b)=>{return a[0]-b[0]})
					ct2 = list[list.length-1];
				}
			}

			if(ct1){
				window.client.timeDiffRes[0] = ct1[0];
			}else{
				window.client.timeDiffRes[0] = 0;
			}

			if(t2){
				window.client.timeDiffRes[1] = null;
			}else{
				if(res) window.client.timeDiffRes[1] = res;
			}

			if(ct1 && t2){
				const timed = Math.abs(ct1[0] - ct2[0])
				if(res) res.innerHTML = window.secondsFormat(timed);
				window.client.refreshHeroOnUcard(name, ct2[0]);
				return [window.secondsFormat(timed, true, 1), window.secondsFormat(ct1[0], true, 1), window.secondsFormat(ct2[0], true, 1), ct1[5]-1, ct2[5]-1, ct1[0], ct2[0]];
			}else
			{
				if(!ct1) ct1 = list[0];
				const timed = Math.abs(Math.floor(ct1[0] - ct2[0]));
				if(res) res.innerHTML = window.secondsFormat(timed);
				window.client.refreshHeroOnUcard(name, ct2[0]);
				return [window.secondsFormat(timed, true, 1), window.secondsFormat(ct1[0], true, 1), window.secondsFormat(ct2[0], true, 1), ct1[5]-1, ct2[5]-1, ct1[0], ct2[0]];
			}
		}
		const timed = window.secondsFormat(0, true, 1);
		if(res) res.innerHTML = window.secondsFormat(0);
		return [timed, timed, timed, 0, 0, 0, 0];
	},

	refreshHeroOnUcard: function(name, lasttime){
		if(name && window.client.elem.hero){
			let h = window.client.elem.hero
			let HeroT = window.client.getUserHero(name, lasttime),
			Hero = window.id2name(HeroT),
			Color = window.getHeroColor(Hero);
			h.style.color = Color;
			h.className = window.client.allowedHeroes.includes(HeroT)? '' : 'blacklisted';
			h.innerText = Hero;

		}
	},

	onNewLog: function(name = "", log = null){
		if(name == window.z && log && window.client.timeDiffRes[1]){
			window.client.refreshHeroOnUcard(name, log[0]);
			window.client.timeDiffRes[1].innerHTML = window.secondsFormat(Math.abs(Math.floor(log[0] - window.client.timeDiffRes[0])));
		}
	},

	hideLogs:function(){
		document.querySelectorAll(".log-popup").forEach((e)=>{e.remove()});
		document.querySelectorAll(".log-popup-extra").forEach((e)=>{e.remove()});

	},

	getDeaths: function(name = ""){
		const u = window.client.elem.logsstor[name];
		if(u){
			return u.totalDeaths;
		}else{
			return "-"
		}
	},

	getHasExited: function(name = ""){
		const u = window.client.userlog[name];
		if(u){
			return u.exited;
		}else{
			return true;
		}
	},

	globalEntitiesFind: (f)=>{
		for(let i in window.client.state.globalEntities){
			let e = window.client.state.globalEntities[i];
			if(f(e)){
				return e;
			}
		}
		return null;
	},

	customLog: function(name, type = 3, arrname = "travel", onlyElem = false){
		if(window.client.userlog[name]){
			const time = window.getTime();
			const ctime = secondsFormat(Math.floor(time));

			let uo = window.client.userlog[name];
			if(uo && uo[arrname]){
				let len = uo[arrname].length;

				if(!onlyElem){
					let o;
					uo[arrname].push([
						time, ctime, uo[arrname][len-1][2], uo[arrname][len-1][2] != "Stellar Square" ? uo[arrname][len-1][3] :
						(o = window.client.globalEntitiesFind((ee)=>ee.name == name),o?o.level+"":uo[arrname][len-1][3]),
						 type, uo.logid++
					]);
				}else{
					len --;
				}

				let logElem = document.getElementById("log-" + name)
				if(logElem && Object.keys(window.client.userlog2).length == 0 ){
					let sctb = false;
					if(logElem.scrollTop + logElem.clientHeight == logElem.scrollHeight)sctb = true;
					logElem.appendChild(window.client.createLogLine(uo[arrname][len]));
					if(sctb)logElem.scrollTop = logElem.scrollHeight;
				}

				window.client.onNewLog(name, uo[arrname][len]);
			}
		}
	},

	createLogLine: function(dataArray){
		const line = document.createElement("div");
		line.style.display = window.client.logTypesToShow.includes(dataArray[4]) ? "": "none";
		line.className = `ele ${window.styleByNr(dataArray[4])}`;
		line.title = dataArray[5];

		line.innerHTML = `<div id="logid">${dataArray[5]}|</div><div id="time">${dataArray[1]}</div><div id="map">${window.getShortName(dataArray[2])}</div><div id="area">${window.normalizeArea(dataArray[3])}</div>`
		return line			
	},

	logUserAreas: function(usr){
		const time = window.getTime();
		const ctime = secondsFormat(Math.floor(time));

		if(window.client.userlog[usr.name]){
			let uo = window.client.userlog[usr.name];
			let len = uo.travel.length;
			if(uo.q)return;
			if(uo.travel[len-1][3] != usr.areaName
			|| uo.travel[len-1][2] != usr.regionName){
				uo.travel.push([
					time, ctime, usr.regionName, usr.areaName, usr.victoryArea ? 5 : 0, uo.logid++
				]);

				window.client.customLog(usr.name, usr.victoryArea ? 5 : 0, "travel", true);
			}

			if(usr.deathTimer != -1){
				if(!uo.dead){
					uo.dead = true;
					uo.deaths.push([time, ctime, usr.regionName, usr.regionName != "Stellar Square" ? usr.areaName :(usr.level+""), 1, uo.logid++]);

					window.client.customLog(usr.name, 1, "deaths", true);

					uo.totalDeaths ++;
				}
			}else
			if(uo.dead){
				uo.dead = false;
				uo.deaths.push([time, ctime, usr.regionName, usr.areaName, 2, uo.logid++]);

				window.client.customLog(usr.name, 2, "deaths", true);
			}
			return false;
		}else{
			window.client.userlog[usr.name] = {
				dead:false,exited:false,q:false,totalDeaths:0,logid:2,logids:["",""],
				deaths:[/*[time, ctime, usr.regionName, usr.areaName, 2, 2]*/],
				travel:[[time, ctime, usr.regionName, usr.areaName, 6, 1]/*[time, ctime, usr.regionName, usr.areaName, usr.victoryArea ? 5 : 0, 1]*/],
				heroes:[[usr.heroType, time]],
				vp: undefined,
			};
				
			window.updateLeaderboard();
				return true;
		}
	},

	getUserLogIds:function(name){
		const u = window.client.elem.logsstor[name];
		if(u){
			return u.logids;
		}
		return ["",""];
	},

	getUserHero:function(name, time){
		const u = window.client.elem.logsstor[name];
		if(u){
			for(let i = u.heroes.length-1; i >= 0; i--){
				let hd = u.heroes[i];
				if(hd[1] <= time){
					return hd[0];
				}
			}
		}
		return -1;
	},

    drBefore: function(e, t) {
		window.client.pingNfps.frame();
		let namesA = [];
		let namesB = [];

		let uc = 0;
		for(let i in window.client.userlog){
			if(!window.client.userlog[i].q)namesA.push(i);
		}

		let newpt = [];
		for(let i in client.state.globalEntities){
			uc++;
			namesB.push(client.state.globalEntities[i].name);
			let isnew = window.client.logUserAreas(client.state.globalEntities[i]);
			let uo = window.client.userlog[client.state.globalEntities[i].name];
			if(uo && uo.heroes[uo.heroes.length-1][0] != client.state.globalEntities[i].heroType)uo.heroes.push([client.state.globalEntities[i].heroType, window.getTime()]);
			if(client.state.globalEntities[i].name == window.z){
				window.client.opos[0] = client.state.globalEntities[i];
			}
			if(isnew){
				newpt.push({
					name:client.state.globalEntities[i].name,
					logs:uo
				});
			}
		}
		
		if(newpt.length > 0){
			globalThis.client.events.emit(globalThis.client.events.events.playerCountChange, {
				players:newpt,
				count:uc,
				action:"joined",
			});
		}

		for(let i = namesA.length; i >= 0; i--){
			if(namesB.includes(namesA[i])){
				namesB.splice(namesB.indexOf(namesA[i]), 1);
				namesA.splice(i, 1);
			}
		}
		if(namesA.length > 0 ||namesB.length > 0){
			setTimeout(window.updateLeaderboard,50);
		}

		newpt = [];
		for(i of namesA){
			if(!window.client.userlog[i].q){
				let uo = window.client.userlog[i];
				newpt.push({
					name:i,
					logs:uo
				});
				uo.q = true;
				uo.dead = false;
				uo.exited = false;
				//"leave?"
				window.client.customLog(i, 6, "travel", false);
			}
		}

		if(newpt.length > 0){
			globalThis.client.events.emit(globalThis.client.events.events.playerCountChange, {
				players:newpt,
				count:uc,
				action:"left",
			});
		}

		newpt = [];
		for(i of namesB){
			if(window.client.userlog[i].q){
				//"join?"
				let uo = window.client.userlog[i];
				const time = window.getTime();
				const ctime = secondsFormat(Math.floor(time));
				
				uo.q = false;

				for(let j in client.state.globalEntities){
					if(client.state.globalEntities[j].name == i){
						let usr = client.state.globalEntities[j];
						uo.travel.push([time, ctime, usr.regionName, usr.areaName, 6, uo.logid++]);
						uo.heroes.push([usr.heroType, time]);
						window.client.customLog(i, 6, "travel", true);
						return;
					}
				}

				newpt.push({
					name:i,
					logs:uo
				});
			}
		}
		if(newpt.length > 0){

			globalThis.client.events.emit(globalThis.client.events.events.playerCountChange, {
				players:newpt,
				count:uc,
				action:"joined",
			});
		}

		let o = null;
		let m = null;
		{
			for(var i in client.state.entities){
				let obj = client.state.entities[i]
				if(obj.name == window.z){
					o = obj;//experience
				}
				if(obj.name){
					window.client.userlog[obj.name].vp = obj.winCount;
					if(!window.client.getHasExited(obj.name)){
						if(!m){
							for(var j in client.state.map.area.zones.zones){
								let zone = client.state.map.area.zones.zones[j]
								if(zone.type == 0){
									m = zone;
									break;
								}
							}
						}
						if(m){
							if(obj.x + obj.radius - m.x > 0
							&& obj.x - obj.radius - m.x - m.width < 0
							&& obj.y + obj.radius - m.y > 0
							&& obj.y - obj.radius - m.y - m.height < 0
							){
								window.client.userlog[obj.name].exited = true;
								window.client.customLog(obj.name, 4);
							}
						}
					}
				}
			}
		}
		if(window.client.elem.xp != null){
			try{
				window.client.elem.xp.innerText = `XP: ${o != null ? o.experience: "not in same area"}`;
			}catch{
				window.client.elem.xp = null;
			}
		}

		if(window.client.elem.level != null){
			try{
				window.client.elem.level.innerText = `Level: ${window.client.opos[0].level || -1} | Deaths: ${window.client.getDeaths(window.z)}`;
			}catch{
				window.client.elem.level = null;
			}
		}

		if(window.client.elem.speed != null){
			try{

				if(!window.client.opos[1]){
					window.client.opos[1] = {...window.client.opos[0]};
				}

				var dx = (window.client.opos[0].x || 0) - (window.client.opos[1].x || 0);
				var dy = (window.client.opos[0].y || 0) - (window.client.opos[1].y || 0);
				let diff1 = Math.abs(dx);
				let diff2 = Math.abs(dy);

				window.client.elem.speed.innerText = `Speed X: ${diff1.toFixed(2)}\nSpeed Y: ${diff2.toFixed(2)}`;
				window.client.opos[1] = {...window.client.opos[0]};
			}catch{
				window.client.elem.speed = null;
			}
		}
		//}
    },

	getShownLogs: function(){
		let json = {};

		for(var i of window.client.loggerShown){
			let u = window.client.userlog[i]
			if(u){
				json[i] = u;
			}
		}
		return JSON.stringify(json);
	},

	/*logger popup -g*/
	loggerShown:[],
	loggerShownOnly:false,
	logger:null,
	openLogger: function(notOnlyLogs = true, olyClose = false){
		const p = document.querySelector(".log-popup");
		if(!window.client.logger && notOnlyLogs && !olyClose){
			const popup = document.createElement("div");
			popup.id = "LOGGER-S";
			popup.className = "logger-users";


			{
				const extras = document.createElement("div");
				extras.id = "extras";

				extras.innerHTML =
				`<input type="checkbox" ${window.client.loggerShownOnly ? " checked" : ""} class="custombox lp">`+
				`<button onclick="document.getElementById('copy-sellector').value = window.client.getShownLogs();document.getElementById('copy-sellector').select();document.execCommand('copy');">Export</button>`+
				`<input id="copy-sellector" value="suck" style="position:absolute; left:-100%; width:10px; border:none;">`+
				`<input id="pastesel" placeholder="import">`;

				let cb = extras.querySelector(".custombox.lp");
				cb.addEventListener("click", ()=>{
					window.client.loggerShownOnly = cb.checked;
					if(window.client.logger) window.client.logger.remove();
					window.client.logger = null;
					window.client.openLogger();
				});

				let el = extras.querySelector("#pastesel");
				el.addEventListener("blur", ()=>{
					let json = "";
					try{
						json = JSON.parse(el.value);
					}catch{}

					let f = ()=>{
						if(window.client.logger) window.client.logger.remove();
						window.client.logger = null;
						window.client.openLogger();
					}

					if(typeof json == "object"){
						window.client.userlog2 = json;
						f();
					}else{
						let kl = Object.keys(window.client.userlog2)?.length;
						window.client.userlog2 = {};
						if(kl > 0) f();
					}
				})

				popup.appendChild(extras);
			}

			{
				const holder = document.createElement("div");
				holder.id = "holder";
				popup.appendChild(holder);
				let who = 0;
				const keys = Object.keys(Object.keys(window.client.userlog2)?.length > 0 ? (who = 2, window.client.userlog2) : (who = 1, window.client.userlog));
				for(let i = 0; i < keys.length; i++){
					const elem = document.createElement("div");

					elem.innerHTML =``;
					let includes = window.client.loggerShown.includes(keys[i]);

					elem.style.display = !includes && window.client.loggerShownOnly ? "none":"";

					if(who == 1) elem.innerHTML += `<input type="checkbox" ${includes ? " checked" : ""} class="custombox lp">`;
								 elem.innerHTML += `<p>${keys[i]}</p>`
					;

					elem.querySelector("input")?.addEventListener("click", (e)=>{
						e.stopPropagation();
						let el = elem.querySelector("input")
						if(!el) return;

						if(el.checked){
							window.client.loggerShown.push(keys[i]);
							if(window.client.loggerShownOnly){
								elem.style.display = "";
							}
						}else{
							let index = window.client.loggerShown.findIndex((a)=>{return a == keys[i]})
							if(index != -1) window.client.loggerShown.splice(index, 1);
							if(window.client.loggerShownOnly){
								elem.style.display = "none";
							}
						}
					});

					//elem.querySelector("p").innerText = keys[i];

					elem.addEventListener("click", ()=>{
						let popup = document.querySelector(".log-popup");
						if(popup) popup.remove();
						const p2 = document.querySelector(".log-popup-extra");
						if(p2){
							p2.remove();
						}

						const o = window.client.openUcard(keys[i], [window.innerWidth/2 -100,window.innerHeight/2 -150], who == 1 ? window.client.userlog : window.client.userlog2)//window.client.showLog(keys[i], 100, false, false);
						if(o && o[0]){
							o[0].style.top = "50%";
							o[0].style.right = "50%";
							o[0].style.transform = "translate(50%, -50%)";

							if(o[1]){
								o[1].style.left = "50%";
								o[1].style.top = "50%";
								o[1].style.transform = "translate(-150px,-50%)";
							}
						}
					});

					holder.appendChild(elem);
				}
			}

			window.client.logger = popup;
			document.body.appendChild(popup);
		}else
		if(p){
			p.remove();
			const p2 = document.querySelector(".log-popup-extra");
			if(p2){
				p2.remove();
			}
			return true;
		}
		else
		if(notOnlyLogs){
			if(window.client.logger){
				window.client.logger.remove();
				window.client.logger = null;
			}
		}
		return false;
	},

	openCustomSettings:function(removeOnly = false){
		window.client.openCustomCommands(true);
		window.client.openAllUserMetas(true);
		window.client.areaData.openAreaPopup(true);
		if(window.client.openLogger(true, true))return;
		const element = document.querySelector(".customSettings");
		if(element){
			element.parentNode.remove();
			return;
		}else
		if(!removeOnly){
			document.createElementP("div",null,(backpan)=>{
				backpan.style.position = "absolute";
				backpan.style.width = "100%";
				backpan.style.height = "100%";
				backpan.style.top = "0";
				backpan.style.left = "0";
				backpan.style.top = "0";

				document.body.appendChild(backpan);
	
				backpan.addEventListener("click", (e)=>{
					window.client.openCustomSettings(true);
				});

				let genButton = (popup, btnn, btnt, click)=>{
					popup.appendChild(document.createElementP("div",{className:"lay"},(lay)=>{
						lay.appendChild(document.createElementP("button",{className:btnn,innerHTML:btnt},(el)=>{
							el.addEventListener("click", click);
						}));
					}));
				}

				backpan.appendChild(document.createElementP("div",{className:"customSettings"},(popup)=>{
					popup.addEventListener("click", (e)=>{
						e.stopPropagation();
					});

					genButton(popup, "Logger", "Logger", (e)=>{
						window.client.openCustomSettings(true);
						window.client.openLogger();
						e.stopPropagation();
					})
					
					genButton(popup, "Commands", "Commands", (e)=>{
						window.client.openCustomSettings(true);
						window.client.openCustomCommands();
						e.stopPropagation();
					})

					genButton(popup, "FriendsNNotes", "Friends & Notes", (e)=>{
						window.client.openCustomSettings(true);
						window.client.openAllUserMetas();
						e.stopPropagation();
					})

					for(let btnn of (globalThis.RBtns || [])){
						genButton(popup, btnn[0], btnn[1], btnn[2])
					}

					popup.appendChild(document.createElementP("div",{className:"lay"},(lay)=>{
						let mapToOpen = "Central Core";
						lay.appendChild(document.createElementP("button",{className:"TeamLogger",innerHTML:"Team logger"},(el)=>{
							el.addEventListener("click", (e)=>{
								window.client.openCustomSettings(true);
								window.client.areaData.openAreaPopup(false, mapToOpen);
								e.stopPropagation();
							});
						}));
						lay.appendChild(document.createElementP("select",null,(el)=>{
							for(let d in maps){
								el.innerHTML += `<option value="${d}">${maps[d]}</option>`
							}
							el.value = mapToOpen;
							el.addEventListener("input", ()=>{
								mapToOpen = el.value;
							})
						}));
					}));

				}));
			});
		}
	},

	openAllUserMetas:function(removeOnly = false){
		const element = document.querySelector(".allmetas");
		if(element){
			element.parentNode.remove();
			return true;
		}else
		if(!removeOnly){
			document.createElementP("div",null,(backpan)=>{
				backpan.style.position = "absolute";
				backpan.style.width = "100%";
				backpan.style.height = "100%";
				backpan.style.top = "0";
				backpan.style.left = "0";
				document.body.appendChild(backpan);
	
				backpan.addEventListener("click", (e)=>{
					window.client.openAllUserMetas(true);
				});

				backpan.appendChild(document.createElementP("div",{className:"allmetas"},(popup)=>{
					popup.addEventListener("click", (e)=>{
						e.stopPropagation();
					});
					
					popup.appendChild(document.createElementP("div", {className:"lay header"}, (lay)=>{
						lay.innerHTML += `<label>Friends & Notes</label>`;
						lay.appendChild(document.createElementP("button", {innerHTML:"X"}, (btn)=>{
							btn.addEventListener("click", ()=>{
								window.client.openAllUserMetas(true);
							});
						}));
					}));


					let input, itemsContainer,
					prior = (t)=>t==""?0:t=="Warning"?1:2,
					allNames = Object.keys(window.client.userMetas).sort().sort((a,b)=>prior(window.client.userMetas[b].lbtag) - prior(window.client.userMetas[a].lbtag)),
					displaynames = [...allNames],
					fill = ()=>{};

					let research = ()=>{
						displaynames = [...allNames].filter((n)=>n.toLocaleLowerCase().startsWith(input.value.toLocaleLowerCase()));
						fill();
					}
					

					popup.appendChild(document.createElementP("div", {className:"lay"}, (lay)=>{
						input = lay.appendChild(document.createElementP("input", {className:"search"}, (el)=>{
							el.addEventListener("input", ()=>{
								console.log("changes to", input.value)
								research();
							});
						}));
						lay.appendChild(document.createElementP("button", {innerHTML:"search"}, (btn)=>{
							btn.addEventListener("click", ()=>{
								window.client.openAllUserMetas(true);
								globalThis.CANR = false;
								window.client.openUserMetas(input.value, false, ()=>{
									window.client.openAllUserMetas();
									globalThis.CANR = true;
								});
							});
						}));
					}));

					popup.appendChild(itemsContainer = document.createElementP("div", {className:"container"}, (lay)=>{
						(fill=()=>{
							lay.innerHTML = "";
							for(let i = 0, l = displaynames.length; i < l; i++){
								let bgcolor = prior(window.client.userMetas[displaynames[i]].lbtag);
								bgcolor = bgcolor == 0 ? "transparent" : bgcolor == 1 ? "red" : "green";
								lay.appendChild(document.createElementP("div", {innerHTML:
									`<div class="trangleshape" style="border-left-color:${bgcolor}"></div>`+displaynames[i]
								}, (el)=>{
									el.setAttribute("uname", displaynames[i]);
									el.addEventListener("click", ()=>{
										window.client.openAllUserMetas(true);
										globalThis.CANR = false;
										window.client.openUserMetas(el.getAttribute("uname"), false, ()=>{
											window.client.openAllUserMetas();
											globalThis.CANR = true;
										});
									});
								}));
							}	
						})();
					}));
					
				}));
			});
		}
		return false
	},

	openCustomCommands:function(removeOnly = false){
		const element = document.querySelector(".customCommands");
		if(element){
			element.parentNode.remove();
			return true;
		}else
		if(!removeOnly){
			document.createElementP("div",null,(backpan)=>{
				backpan.style.position = "absolute";
				backpan.style.width = "100%";
				backpan.style.height = "100%";
				backpan.style.top = "0";
				backpan.style.left = "0";
				document.body.appendChild(backpan);
	
				backpan.addEventListener("click", (e)=>{
					window.client.openCustomCommands(true);
				});

				backpan.appendChild(document.createElementP("div",{className:"customCommands"},(popup)=>{
					popup.addEventListener("click", (e)=>{
						e.stopPropagation();
					});

					const cmdStruct=[
						["bool", "User tags", "showTag", "ts-showTag", ()=>{}],
						["bool", "User LB tags", "lbTags", "ts-lbTags", (r)=>{window.client.toggleLbTags(r);}],
						["bool", "LB users count", "showUIACnt", "ts-showUIACnt", ()=>{window.client.areaData.updateLb();}],
						["bool", "User card", "showUcard", "ts-showUcard", (r)=>{window.client.toggleUcard(r);}],
						["bool", "Show fps and ping", "togglefps", "ts-togglefps", ()=>{}],
						["option", "Timer:",[
							["Real time", "1"],
							["Ingame time", "2"],
							["None", "3"]
						],"timerReal", "ts-timerReal", ()=>{}],
						["bool", "Automatic disconnect", "autodc", "ts-autodc", ()=>{}],
						//["bool", "SS leaderboard shows xp", "ssxp", "ts-ssxp", ()=>{window.client.toggleExtendLb()}],
					]
					let i = 0;
					popup.appendChild(document.createElementP("div", {className:"lay header"}, (lay)=>{
						lay.innerHTML += `<label>Custom Settings</label>`;
						lay.appendChild(document.createElementP("button", {innerHTML:"X"}, (btn)=>{
							btn.addEventListener("click", ()=>{
								window.client.openCustomCommands(true);
							});
						}));
					}));
					for(let cmd of cmdStruct){
						popup.appendChild(document.createElementP("div", {className:"lay"}, (lay)=>{
							if(i == cmdStruct.length-1) lay.style.marginBottom = "10px";
							if(cmd[0] == "bool"){
								lay.innerHTML += `<label>${cmd[1]}</label>`;
								//lay.appendChild(document.createElementP("div",{innerHTML:cmd[1]},(el)=>{
								let checkbox; lay.appendChild(checkbox = document.createElementP("input", {type: "checkbox"}))
								let r=()=>{checkbox.checked = window.client.textCommandConsts[cmd[2]]};
								r()
								checkbox.addEventListener("click", (e)=>{
									let res;
									localStorage.setItem(cmd[3], res= window.client.textCommandConsts[cmd[2]] = !window.client.textCommandConsts[cmd[2]]); 
									//r()
									if(cmd[4])cmd[4](res);
									e.stopPropagation();
								});
								//}));
							}else
							if(cmd[0] == "option"){
								lay.innerHTML += `<label>${cmd[1]}</label>`;
								//lay.appendChild(document.createElementP("div",{className:"droplist",innerHTML:`<label>${cmd[1]}</label>`},(el)=>{
								lay.appendChild(document.createElementP("select",null,(el)=>{
									for(let d of cmd[2]){
										el.innerHTML += `<option value="${d[1]}">${d[0]}</option>`
									}
									el.value = window.client.textCommandConsts[cmd[3]];
									el.addEventListener("input", ()=>{
										localStorage.setItem(cmd[4], window.client.textCommandConsts[cmd[3]] = el.value);
									})
								}));
								//}));
							}
						}));
						i++;
					}
				}));
			});
		}
		return false
	},

	init: function(){
		globalThis.client.events.addEventListener(globalThis.client.events.events.playerCountChange, (e)=>{
			if(e.action == "left"){
				for(let player of e.players){
					globalThis.tags.chatTags.delVal(player.name);
				}
			}
		})

		globalThis.client.events.addEventListener(globalThis.client.events.events.chatMessage, (e)=>{
			if(e.name == window.client.main.name){
				if(window.client.pingNfps.sendTime != 0){
					window.client.pingNfps.ping = Date.now() - window.client.pingNfps.sendTime;
					window.client.pingNfps.sendTime = 0;
				};
			}
		})

		window.client.elem.logsstor = window.client.userlog;
		//window.client.toggleExtendLb();
	},

	showClasses: getLocal("ts-showClasses", "false") == "true",

	autoMode: false,
	script: false,
	count: 0,
	load: false,
};

globalThis.client.init();

HTMLElement.prototype.removeChild2 = HTMLElement.prototype.removeChild;
HTMLElement.prototype.removeChild = function(e, e2){
    try{this.removeChild2(e, e2)}catch(e){};
}

setInterval(()=>{
	if(!client.chat)client.chat = document.getElementById("chat-window");
	if(client.chat){
		while(client.chat.childElementCount > 100){
			client.chat.childNodes[0].remove();
		}
	}
}, 10000)


window.replaces = {
	id2: function (e,t,l) {
		if(window.client.textCommandConsts.timerReal != 3){
			t.font = 'bold ' + e.default.font(30);
			let secs = secondsFormat(window.client.textCommandConsts.timerReal == 1 ? window.getTime() : window.client.main.survivalTime);
			t.strokeText(secs, l, 80);
			t.fillText(secs, l, 80);

		}
		let olw = t.lineWidth, fis = t.strokeStyle, strs =t.fillStyle;

		if(window.client.textCommandConsts.togglefps && client.state){
            t.textAlign="right"
            t.lineWidth = 3;
			t.font = 'bold ' + e.default.font(13);
            t.strokeStyle = window.client.pingNfps.fps >= 28 ? "#060" : window.client.pingNfps.fps >= 20 ? "#770" : "#700";
            t.fillStyle = window.client.pingNfps.fps >= 28 ? "#0f0" : window.client.pingNfps.fps >= 20 ? "#ff0" : "#f00";
			t.strokeText("fps: " + window.client.pingNfps.fps, 1260, 640);
			t.fillText("fps: " + window.client.pingNfps.fps, 1260, 640);
            
			t.strokeStyle = window.client.pingNfps.ping <= 115 ? "#060" : window.client.pingNfps.ping <= 210 ? "#770" : "#700";
            t.fillStyle = window.client.pingNfps.ping <= 115 ? "#0f0" : window.client.pingNfps.ping <= 210 ? "#ff0" : "#f00";

            t.strokeText("ping: " + window.client.pingNfps.ping, 1260, 670);
			t.fillText("ping: " + window.client.pingNfps.ping, 1260, 670);
		}
		t.lineWidth = olw;
		t.textAlign="center";
        t.strokeStyle = fis;
        t.fillStyle = strs;
		t.font = 'bold ' + e.default.font(35);
	},
	id4: function () {
		return this.default.createElement(
			"label",
			{htmlFor: "showClasses"},
			this.default.createElement(
				"div",
				{className: "settings-setting"},
				"Show Heroes",
				this.default.createElement(
					"input",
					{
						type: "checkbox",
						className: "settings-checkbox",
						id: "showClasses",
						checked: client.showClasses,
						onChange: function (e) {
							localStorage.setItem("ts-showClasses", client.showClasses = !client.showClasses);
							if(client.showClasses){
								document.getElementById("leaderboard").ariaLabel = "fat"
							}else{
								document.getElementById("leaderboard").ariaLabel = ""
							}
							setTimeout(window.createNewLeaderboard, 1);
						}
					}
				)
			)
		);
	}
}

window.nrByStyle = (style)=>{
	return ["","dead", "alive", "custom", "arexit", "victory", "qoj"].findIndex((v)=>{return v == style})
}
window.styleByNr = (nr)=>{
	return ["","dead", "alive", "custom", "arexit", "victory", "qoj"][nr];
}

globalThis.id2name = (id)=>{
	return [
	'Magmax',
	'Rime',
	'Morfe',
	'Aurora',
	'Necro',
	'Nexus',
	'Brute',
	'Shade',
	'Euclid',
	'Chrono',
	'Reaper',
	'Rameses',
	'Jolt',
	'Ghoul',
	'Cent',
	'Jotunn',
	'Candy',
	'Mirage',
	'Boldrock',
	'Glob',
	'Magno',
	'Ignis',
	'Stella',
	'Viola',
	'new 1',
	'new 2',
	'new 3',
	'new 4',
	][id];
}

const maps = {
	"Central Core": 		  "CC",
	"Vicious Valley": 		  "VV",
	"Elite Expanse": 		  "EE",
	"Wacky Wonderland": 	  "WW",
	"Glacial Gorge": 		  "GG",
	"Dangerous District": 	  "DD",
	"Peculiar Pyramid": 	  "PP",
	"Monumental Migration":   "MM",
	"Humongous Hollow": 	  "HuHo",
	"Haunted Halls": 		  "HaHa",
	"Quiet Quarry": 		  "QQ",
	"Frozen Fjord": 		  "FF",
	"Ominous Occult": 		  "OO",
	"Restless Ridge": 		  "RR",
	"Toxic Territory": 		  "TT",
	"Magnetic Monopole": 	  "MM2",
	"Stellar Square": 		  "SS",
	"Assorted Alcove": 		  "AA",
	"Burning Bunker": 		  "BB",
	"Grand Garden": 		  "GG2",

	"Central Core Hard": 	  "CCH",
	"Vicious Valley Hard": 	  "VVH",
	"Elite Expanse Hard": 	  "EEH",
	"Wacky Wonderland Hard":  "WWH",
	"Glacial Gorge Hard": 	  "GGH",
	"Dangerous District Hard":"DDH",
	"Peculiar Pyramid Hard":  "PPH",
	"Humongous Hollow Hard":  "HuHoH",
	"Haunted Halls Hard":     "HaHaH",
	"Quiet Quarry Hard": 	  "QQH",
	"Frozen Fjord Hard": 	  "FFH",
	"Ominous Occult Hard":    "OOH",
	"Restless Ridge Hard": 	  "RRH",
	"Toxic Territory Hard":   "TTH",
	"Magnetic Monopole Hard": "MM2H",
	"Assorted Alcove Hard":   "AAH",
	"Burning Bunker Hard": 	  "BBH",
	"Grand Garden Hard":	  "GGH2",
}

window.getShortName = (map)=>{

	return maps[map] ? maps[map] : map
}

window.normalizeArea = (area)=>{
	return area
	.replace("Tunnel", 			"Tun.")
	.replace("Perimeter", 		"Per.")
	.replace("Outer", 			"Out.")
	.replace("Inner", 			"Inn.")
	.replace("Chamber",			"Cha.")
	.replace("Level",			"L")
	.replace("Locked Ladder",	"L. L.")
	.replace("Boss",			"B.")
	.replace("Evades",			"Ev.")
}

window.getVpColor = (vp)=>{
	if(typeof vp == "number")
	return vp < 75 ? "#ff0000" :
			vp < 500 ? "#00ff00" :
			vp < 20000 ? "#0095ff" :
			"rainbow"
	else return "#aaa";
}

window.getHeroRealColor = function(Hero){
	switch(Hero){
		case "Rime":
			return "#3333ff";//"#3333ff";
		case "Reaper":
			return "#424a59";//"#424a59";
	}
	return window.getHeroColor(Hero);
}

window.getHeroColor = function(Hero){
	switch(Hero){
		case "Magmax":
			return "#ff0000";
		case "Rime":
			return "#3377ff";//"#3333ff";
		case "Morfe":
			return "#00dd00";
		case "Aurora":
			return "#ff7f18";
		case "Necro":
			return "#ff00ff";
		case "Nexus":
			return "#29ffc6";
		case "Brute":
			return "#9b5800";
		case "Shade":
			return "#826565";
		case "Euclid":
			return "#5e4d66";
		case "Chrono":
			return "#00b270";
		case "Reaper":
			return "#787b81";//"#424a59";
		case "Rameses":
			return "#989b4a";
		case "Jolt":
			return "#e1e100";
		case "Ghoul":
			return "#bad7d8";
		case "Cent":
			return "#727272";
		case "Jotunn":
			return "#5cacff";
		case "Candy":
			return "#ff80bd";
		case "Mirage":
			return "#020fa2";
		case "Boldrock":
			return "#a18446";
		case "Glob":
			return "#14a300";
		case "Magno":
			return "#ff005d";
		case "Ignis":
			return "#cd501f";
		case "Stella":
			return "#fefa8b";
		case "Viola":
			return "#d9b130";
	}
	return "white";
}

window.addEventListener('DOMContentLoaded', e=>{
	window.vers.check();
	document.body.oncontextmenu = e => false;

	let styles = document.createElement('style');
	let newihtml = `
	body{overflow-x:hidden;}
	.hidden{display:none;}
	
	#version-warning{
		position: absolute;
		top: 0;
		left: 0;
	}
	#version-warning > div{
		float:left;
		margin-left: 10px;
	}

	#version-warning > .v-title{
		text-align: center;
    	width: 100%;
		color: darksalmon;
	}

	#version-warning > .v-cv, #version-warning > .v-cv + div{
		color: goldenrod;
	}

	#version-warning > .v-nv{
		margin-right: 12px;
		color: forestgreen;
	}

	#version-warning > .v-nv + div{
		color: forestgreen;
	}

	/*otherrrrrrr*/
	.settings {
		position: absolute;
		top: 30%;
		left: 50%;
		transform: translateX(-50%);
		width: 250px;
		height: 380px;
		background-color: #000E;
		border-radius: 5px;
		color: #fff;
		padding: 10px;
	}
	.leaderboard-title{
		font-size: 18px;
	}

	.leaderboard-title-break > .leaderboard-world-title{
		font-size: 15px;
	}

	.chat-message-contextmenu.fake{
		width:200px;
		height: 306px;
		position: absolute;
		right: 20px;
		padding:10px;
		background-color: #000000aa;
		border: solid 2px #222;
		border-radius: 10px;
		color:white;
		z-index: 10;
	}

	.chat-message-contextmenu.fake > aa.banned-text0{
		position: absolute;
		color: #ff000045;
		top: 120px;
		left: -10px;
		font-size: 3.6em;
		z-index: -1;
		transform: rotate(316deg);
	}

	.chat-message-contextmenu.fake > aa.banned-text1{
		position: absolute;
		color: #ff0000;
		bottom: 0;
		right: 2px;
		font-size: 1.6em;
		z-index: -1;
	}

	.chat-message-contextmenu.fake button.bbtn{
		position:absolute;
		border-radius: 4px;
		width: 30px;
		height: 20px;
		border: none;
		font-weight: bold;
	}

	.chat-message-contextmenu.fake button.bbtn{
		color: #2a2a2a;
    	background-color: #9b9b9b;
	}

	.chat-message-contextmenu.fake button#close.bbtn{
		right: 10px;
	}

	.chat-message-contextmenu.fake button#log.bbtn{
		left: 10px;
	}

	.chat-message-contextmenu.fake button#add.bbtn{
		left: 53px;
	}

	.chat-message-contextmenu.fake button#reset.bbtn{
		left: 95px;
	}
	.chat-message-contextmenu.fake button#gen.bbtn{
		right: 53px;
	}

	.chat-message-contextmenu.fake > ul{
		display: inline-block;
		width:200px;
		padding-inline-start: 0;
	}

	.chat-message-contextmenu.fake > ul > li{
		text-align:center;
		width:200px;
	}

	.chat-message-contextmenu.fake > ul > li > #timecounter > input{
		width: 40px;
		float: left;
	}

	.chat-message-contextmenu.fake > ul > li > #timecounter > #tc-result{
		width: 100px;
		float: right;
		text-align: right;
		margin: 0;
	}

	.blacklisted{
		position:relative;
	}

	.blacklisted::after{
		content: " ";
		background-color: red;
		width: 110%;
		height: 2px;
		position: absolute;
		left: -5%;
		top: 50%;
		border-radius: 50%;
		border: solid 1px #2f0000;
		transform: translateY(-10%);
	}
	/*------------*/
	.log-popup{
		width:250px;
		min-height: 0;
    	max-height: 270px;
		/*height:270px;*/
		background-color:#c8c8c8;
		z-index:1001;
		position:absolute;
		border: solid 2px #222;
		border-radius: 10px;
		overflow-y: auto;
	}

	.areaPopup > .log_part > .scoll_elem > .ele,
	.log-popup > .ele{
		color:white;
		width:100%;
		height:25px;
		background-color:#000;
		margin-bottom:2px;
		font-size: 8pt;
		line-height: 22px;
		text-align: center;
	}

	.areaPopup > .log_part > .scoll_elem > .ele.dead,
	.log-popup > .ele.dead{
		background-color:#7c5d5a;
	}

	.areaPopup > .log_part > .scoll_elem > .ele.alive,
	.log-popup > .ele.alive{
		background-color:#576a4d;
	}

	.areaPopup > .log_part > .scoll_elem > .ele.custom,
	.log-popup > .ele.custom{
		background-color: #807f45/*#949494*/;
	}

	.areaPopup > .log_part > .scoll_elem > .ele.arexit,
	.log-popup > .ele.arexit{
		background-color: #949494;
	}

	.areaPopup > .log_part > .scoll_elem > .ele.victory,
	.log-popup > .ele.victory{
		background-color: #aa6600;
	}

	.areaPopup > .log_part > .scoll_elem > .ele.qoj,
	.log-popup > .ele.qoj{
		background-color: #7b478e;
	}
	
	.areaPopup > .log_part > .scoll_elem > .ele > div,
	.log-popup > .ele > div{
		float:left;
	}

	.areaPopup > .log_part > .scoll_elem > .ele > div#logid,
	.log-popup > .ele > div#logid{
		width:16%;
	}

	.areaPopup > .log_part > .scoll_elem > .ele > div#time,
	.log-popup > .ele > div#time{
		width:25%;
	}

	.areaPopup > .log_part > .scoll_elem > .ele > div#map,
	.log-popup > .ele > div#map{
		width:35%;
	}

	.areaPopup > .log_part > .scoll_elem > .ele > div#area,
	.log-popup > .ele > div#area{
		width:24%;
	}

	.log-popup > .ele > div#map,
	.log-popup > .ele > div#area{
		text-overflow: ellipsis;
		overflow: hidden;
		white-space: nowrap;
	}

	.logger-users::-webkit-scrollbar-track-piece,
	.log-popup::-webkit-scrollbar-track-piece{ /*scrollbar back*/
		/*background: #000000 !important;*/
		background: rgba(0, 0, 0, 0)!important;
		border: solid 5px rgba(0, 0, 0, 0)!important;
	}

	.logger-users::-webkit-scrollbar-thumb,
	.log-popup::-webkit-scrollbar-thumb{ /*scrollbar thingie*/
		/*background: #000000 !important;*/
		background: rgb(82, 82, 82)!important;
		border: solid 5px rgba(0, 0, 0, 0)!important;
		border-radius: 5px!important;
	}

	.logger-users::-webkit-scrollbar,
	.log-popup::-webkit-scrollbar{
		width: 7px!important;
	}

	.log-popup-extra{
		position: absolute;
		background-color: #808080;
		right: 520px;
		width: 20px;
		border-radius: 10px;
	}

	.log-popup-extra > input{
		margin-top: 5px;
		margin-bottom: 5px;
		margin-left: 4px;
		margin-right: 4px;
	}

	/*chechbox ------------------------------------*/
	.custombox[type="checkbox"]:before {
		position: relative;
		display: block;
		width: 11px;
		height: 11px;
		border: 1px solid #000;
		content: "";
	}

	.custombox[type="checkbox"]:after {
		position: relative;
		display: block;
		left: 2px;
		top: -11px;
		width: 7px;
		height: 7px;
		border-width: 1px;
		border-style: solid;
		border-color: transparent;
		content: "";
		background-color: darkder;
		background-repeat: no-repeat;
		background-position: center;
	}

	.custombox[type="checkbox"]:checked:after,
	.custombox[type="checkbox"]:not(:disabled):checked:hover:after{
		filter: brightness(100);
		background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAQAAABuW59YAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAB2SURBVHjaAGkAlv8A3QDyAP0A/QD+Dam3W+kCAAD8APYAAgTVZaZCGwwA5wr0AvcA+Dh+7UX/x24AqK3Wg/8nt6w4/5q71wAAVP9g/7rTXf9n/+9N+AAAtpJa/zf/S//DhP8H/wAA4gzWj2P4lsf0JP0A/wADAHB0Ngka6UmKAAAAAElFTkSuQmCC);
	}

	.custombox[type="checkbox"]:disabled:after {
		-webkit-filter: opacity(0.4);
	}

	.custombox[type="checkbox"]:not(:disabled):hover:before {
		border-color: white;
	}

	/*normal----------------------------------------------------------------*/
	.custombox[type="checkbox"]:before{
		background: #000;
	}

	/*dead----------------------------------------------------------------*/
	.custombox.dead[type="checkbox"]:before{
		background: #7c5d5a;
	}

	/*alive--------------------------------------------------------------*/
	.custombox.alive[type="checkbox"]:before{
		background: #576a4d;
	}

	/*custom-------------------------------------------------------------*/

	.custombox.custom[type="checkbox"]:before{
		background: #807f45;
	}
	/*arexit-------------------------------------------------------------*/

	.custombox.arexit[type="checkbox"]:before{
		background: #949494;
	}

	/*victory-------------------------------------------------------------*/

	.custombox.victory[type="checkbox"]:before{
		background: #aa6600;
	}

	/*quit or join--------------------------------------------------------*/

	.custombox.qoj[type="checkbox"]:before{
		background: #7b478e;
	}
	

	/*toggle show users-------------------------------------------------------------*/

	.custombox.lp[type="checkbox"]:before{
		background: #890000;
	}









	/*leaderboard*/
	#leaderboard{
		transform-origin: 100% 0%!important;
		left: unset!important;
		right: 10px!important;
	}
	#leaderboard[aria-label="fat"]{
		width:230px;
	}



	/*herolist and base areaPopup*/

	.areaPopup *::-webkit-scrollbar-track-piece,
	.areaPopup::-webkit-scrollbar-track-piece,
	.herolist::-webkit-scrollbar-track-piece{ /*scrollbar back*/
		/*background: #000000 !important;*/
		background: #ffffff40!important;
		border: solid 5px rgba(0, 0, 0, 0)!important;
	}

	.areaPopup *::-webkit-scrollbar-thumb,
	.areaPopup::-webkit-scrollbar-thumb,
	.herolist::-webkit-scrollbar-thumb{ /*scrollbar thingie*/
		/*background: #000000 !important;*/
		background: #c1c1c1!important;
		border: solid 5px rgba(0, 0, 0, 0)!important;
		border-radius: 5px!important;
	}
	.areaPopup *::-webkit-scrollbar,
	.areaPopup::-webkit-scrollbar,
	.herolist::-webkit-scrollbar{
		width: 7px!important;
		height: 7px!important;
	}

	.areaPopup,
	.herolist{
		width: 500px;
		height: 400px;
		max-height: 50%;
		position: absolute;
		left: 50%;
		top: 50%;
		transform: translate(-50%, -50%);
		background-color: #000000aa;
		z-index: 10;
		overflow-y: scroll;
		display: flex;
		flex-direction: row;
		align-items: flex-start;
		flex-wrap: wrap;
		justify-content: center;
	}

	.herolist > .block{
		width: 100px;
		height: 100px;
		background-color: #000;
		margin: 11px 11px 11px 12px;
		float:left;
	}

	.herolist > .block > .hero{
		width: 50%;
		height: 50%;
		background-color: red;
		margin-left: 25%;
		margin-top: 10px;
		border-radius: 100%;
	}

	.herolist > .block > .text{
		color: red;
		text-align: center;
		width: 100%;
		margin-top: 10px;
	}

	/*areaPopup*/
	.areaPopup{
		background-color: #000000a1;
	}

	.areaPopup > .users_part{
		height: 88px;
		width: 100%;
	}
	.areaPopup > .log_part{
		max-height: 330px;
		width: 100%;
	}
	.areaPopup > .result_part{
		min-height: 100px;
	}
	.areaPopup > .format_part{
		height: 120px;
		width: 100%;
	}

	.areaPopup > .format_part > .cmds_elem{

	}

	.areaPopup > .format_part > .format_elem{
		height: 26px;
		font-size: 11pt;
		width: 485px;
		background-color: darkgray;
		border: solid 2px grey;
	}

	.areaPopup > .result_part > .result_elem{
		background-color: #4c4c4c;
		color: beige;
		text-align: center;
		padding: 5px;
		width:480px;
		height:60px;
		resize: none;
	}

	.areaPopup > .log_part > .scoll_elem{
		max-height: 250px;
    	overflow-y: auto;
		margin-top: 5px;
	}

	.areaPopup > .log_part > input{
		text-align: center;
		background-color: darkgray;
		width: 236px;
		border: solid 2px grey;
		margin-right: 1px;
		margin-left: 1px;
}
	
	.areaPopup > div > .theader,
	.areaPopup > div > .theader{
		width: 100%;
		font-size: 30pt;
		height: fit-content;
		text-align: center;
		line-height: unset;
		color: #8e8e8e;
		text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 2px 2px 0 #000;
	}

	.areaPopup > div > .theader > button{
		background-color: burlywood;
		border: solid 2px #967b59;
		float: right;
		width: 40px;
		height: 40px;
		position: absolute;
		right: 4px;
		transform: translateY(4px);
	}

	.areaPopup > .format_part > .cmds_elem,
	.areaPopup > .users_part > .scoll_elem{
		text-align: center;
		width: 100%;
		height: 34px;
		overflow-x: auto;
		overflow-y: hidden;
		padding-top: 5px;
	
	}
	.areaPopup > .format_part > .cmds_elem > .cmd,
	.areaPopup > .users_part > .scoll_elem > .scoll_user{
		display: unset;
		color: beige;
		background: #222222;
		height: 20px;
		padding: 5px;
		border: solid 1px #444444;
		min-width: fit-content;
		margin-left: 2px;
		margin-right: 2px;
		white-space: nowrap;

		user-select: none;
		-webkit-user-select: none;
		-moz-user-select: none;
		-khtml-user-select: none;
	    -ms-user-select: none;

	}
	.areaPopup > .users_part > .scoll_elem > .scoll_user.sellected{
		background: #0b2700;
		border: solid 1px #0a3502;

	}

	/*logger-users*/

	.logger-users{
		position:absolute;
		width:300px;
		max-height:40%;
		left:50%;
		top:50%;
		transform: translate(-50%, -50%);
		background-color: #000000aa;
		color: white;
		overflow-y: auto;
		border-radius: 10px;
	}

	.logger-users > #extras > button, .logger-users > #extras > input#pastesel{
		background-color: #1e1e1e;
		border: solid 2px #272727;
		margin-left: 10px;
		margin-top: 5px;
		margin-bottom: 5px;
		width: 110px;
		font-size: 12pt;
	}

	.logger-users > #extras > button{
		color: #b04300;
    	font-weight: bold;
	}

	.logger-users > #extras > input#pastesel{
		width: 120px;
		color: #a3b000;
    	font-weight: bold;
	}

	.logger-users > #extras > input#pastesel::placeholder{
		color: #b04300;
    	font-weight: bold;
		font-size: 12pt;
	}

	.logger-users > #extras > input.custombox.lp{
		margin-left: 8px;
	}

	.logger-users > #holder > div{
		text-align: center;
		height: 30px;
		line-height: 30px;
		background-color: transparent;
		border-bottom: solid 1px white;
	}

	.logger-users > #holder > div > input{
		float: left;
		margin-top: 8px;
		margin-left: 8px;
	}
	.logger-users > #holder > div > p{
		margin: 0;
		margin-right: 25px;
	}

	.logger-users > #holder::-webkit-scrollbar-thumb{
		background: rgb(183 183 183)!important;
	}
	
	.rainbowText{
		animation-name: rainbowTextkf;
		animation-duration: 20s;
		animation-iteration-count: infinite;
	}
	`

	if(window.tags){
		for(let tag in window.tags.tagsData){
			let tagData = window.tags.tagsData[tag];
			{//lb
				if(tagData.lb){
					let newarr = [];
					for(let i in window.tags.oldTags[tag]){
						newarr.push('#leaderboard span[arialabel="'+ window.tags.oldTags[tag][i] +'"]::before')
					}
					window.client.toggleLbTagscsscode += newarr.join(",");
					window.client.toggleLbTagscsscode += `{
						content: "${tagData.lb.text}";
						margin-right: 4px;
						color: ${tagData.lb.color};
						text-shadow: -1px -1px 5px #0000006e, 1px -1px 5px #0000006e, -1px 1px 20px #0000006e, 1px 1px 5px #0000006e;
						${tagData.lb.rainbow?
							`animation-name: rainbowTextkf;
							animation-duration: 20s;
							animation-iteration-count: infinite;`:
							``
						}
					}`
				}
				window.client.toggleLbTags(window.client.textCommandConsts.lbTags);
			}
			{//badge
				if(tagData.badge){
					newihtml += `.usermetas > .badgeslay > .badge[badge="${tag}"]{
						background-color: ${tagData.badge.bg};
						border-color: ${tagData.badge.border};
						color: ${tagData.badge.textcolor};
						${tagData.badge.rainbow?`
						animation-name: rainbowBadgekf;
						animation-duration: 10s;
						animation-iteration-count: infinite;
						animation-timing-function: linear;`:``
						}
					}`
					if(tagData.badge.subText){
						newihtml += `.usermetas > .badgeslay > .badge[badge="${tag}"]::after{
							content:"${tagData.badge.subText}";
							color: ${tagData.badge.textcolor};
							${tagData.badge.rainbow?`
							animation-name: rainbowBadgeSubTextkf;
							animation-duration: 10s;
							animation-iteration-count: infinite;
							animation-timing-function: linear;`:``
							}
						}`
					}
				}
			}
		}
	}
	newihtml +=`
	.usermetas > .badgeslay > .badge::after{
		position: absolute;
		top: 13px;
		font-size: 8px;
		text-align: center;
		width: 100%;
		left: 0px;
	}
	
	@keyframes rainbowTextkf {
		0%   {color: hsl(0, 100%, 50%);}
		25%   {color: hsl(90, 100%, 50%);}
		50%   {color: hsl(180, 100%, 50%);}
		75%   {color: hsl(270, 100%, 50%);}
		100% {color: hsl(360, 100%, 50%);}
	}

	@keyframes rainbowTextkfGlow {
		0%   {color: hsl(0, 100%, 50%); text-shadow: 0 0 4px hsl(0, 100%, 50%);}
		25%   {color: hsl(90, 100%, 50%); text-shadow: 0 0 4px hsl(90, 100%, 50%);}
		50%   {color: hsl(180, 100%, 50%); text-shadow: 0 0 4px hsl(180, 100%, 50%);}
		75%   {color: hsl(270, 100%, 50%); text-shadow: 0 0 4px hsl(270, 100%, 50%);}
		100% {color: hsl(360, 100%, 50%); text-shadow: 0 0 4px hsl(360, 100%, 50%);}
	}

	@keyframes rainbowBadgekf {
		0%    {color: hsl(0, 100%, 13%); border-color: hsl(0, 100%, 33%); background-color: hsl(0, 100%, 50%);}
		25%   {color: hsl(90, 100%, 13%); border-color: hsl(90, 100%, 33%); background-color: hsl(90, 100%, 50%);}
		50%   {color: hsl(180, 100%, 13%); border-color: hsl(180, 100%, 33%); background-color: hsl(180, 100%, 50%);}
		75%   {color: hsl(270, 100%, 13%); border-color: hsl(270, 100%, 33%); background-color: hsl(270, 100%, 50%);}
		100%  {color: hsl(360, 100%, 13%); border-color: hsl(360, 100%, 33%); background-color: hsl(360, 100%, 50%);}
	}
	@keyframes rainbowBadgeSubTextkf {
		0%    {color: hsl(0, 100%, 13%);}
		25%   {color: hsl(90, 100%, 13%);}
		50%   {color: hsl(180, 100%, 13%);}
		75%   {color: hsl(270, 100%, 13%);}
		100%  {color: hsl(360, 100%, 13%);}
	}
	
	.rainbowText {
		color: red;
		animation-name: rainbowTextkf;
		animation-duration: 20s;
		animation-iteration-count: infinite;
	}

	.rainbowTextGlow {
		animation-name: rainbowTextkfGlow!important;
	}
	/*THE USERMETAS---------------------------------------*/

	.usermetas{
		position: absolute;
		width: 300px;
		height: 400px;
		left: 50%;
		top: 50%;
		transform: translate(-50%, -50%);
		background-color: #000000aa;
		overflow: hidden;
		border-radius: 10px;
		border: solid 1px #000;
		z-index:11;
	}

	.usermetas > .header{
		width: 100%;
		height: 40px;
		line-height: 42px;
		font-size: 18pt;
	}

	.usermetas > .buttonslay{
		margin-top:10px;
		width: 100%;
		height: 40px;
	}

	.usermetas > .buttonslay > button{
		width: 100px;
		height: 40px;
		float: left;
		font-size: 13pt;
	}
	.usermetas > .buttonslay > button.friend{
		background-color: #00a200;
		border: solid 2px green;
		border-top-left-radius: 10px;
	}

	.usermetas > .buttonslay > button.warning{
		background-color: #ca0000;
    	border: solid 2px #6f0000;
		border-top-right-radius: 10px;
	}

	.usermetas > .buttonslay > .currentState{
		width: 96px;
		height: 36px;
		float: left;
		background-color: burlywood;
		border: solid 2px #a06500;
		text-align: center;
		font-size: 13pt;
		line-height: 33px;
	}

	.usermetas > .notelay{
		width: 100%;
		height: 112px;
		margin-top: 10px;
	}

	.usermetas > .notelay > textarea{
		width: 290px;
		height: 100px;
		resize: none;
		margin: 0;
		padding: 5px;
		border: none;
		border-top: solid 1px #00000052;
		border-bottom: solid 1px #00000052;
    	background: #0000002e;
		color: antiquewhite;
	}

	.usermetas > button#cancel,
	.usermetas > button#save{
		width: 100px;
		height: 40px;
		position: absolute;
		bottom: 5px;
		right: 5px;
		background-color: #00a200;
		border: solid 2px green;
	}
	.usermetas > button#cancel{
		background-color: #ca7500!important;
		border: solid 2px #733e00!important;
		left: 5px!important;
	}

	.usermetas > .badgeslay{
		width: auto;
		height: 135px;
		overflow-y: auto;
		display: flex;
		flex-wrap: wrap;
		justify-content: space-evenly;
		align-content: flex-start;
	}

	.usermetas > .badgeslay > .badge{
		position: relative;	
		font-size: 13px;
		font-weight: bold;
		width: 80px;
   		margin-top: 6px;
		margin-bottom: 6px;
		height: 37px;
		line-height: 34px;
		background: lemonchiffon;
		text-align: center;
		border: solid 4px #000;
		border-radius: 12px;
	}

	.usermetas > .badgeslay.small > .badge{
		margin-bottom: 0;
		margin-right: 0;
	}

	.allmetas *::-webkit-scrollbar-thumb, /*scrollbar thingie*/
	.usermetas *::-webkit-scrollbar-thumb{ /*scrollbar thingie*/
		background: #8e8e8e!important;
		border-radius: 5px!important;
	}

	.allmetas *::-webkit-scrollbar,
	.usermetas *::-webkit-scrollbar{
		width: 7px!important;
		height: 7px!important;
	}

	/*custom settingssssssss*/

	.allmetas,
	.customCommands,
	.customSettings{
		position: absolute;
		width: 300px;
		max-height: 400px;
		left: 50%;
		top: 50%;
		transform: translate(-50%, -50%);
		background-color: #000E;
		overflow: hidden;
		border-radius: 10px;
		border: aliceblue;
		display: inline-grid;
		justify-items: center;
		z-index: 1000;
	}

	.customSettings > .lay{
		width: 100%;
		height: 30px;
		display: inline-block;
		margin-top: 10px;
		margin-bottom: 10px;
		border-radius: 10px;
	}

	.customSettings > .lay > button{
		width: 150px;
		height: 30px;
		display: inline-block;
		border-radius: 10px;
		background: #bbb;
		border: solid 2px #3e3e3e;
		color: #000;
		font-weight: bold;
		margin-left: 75px;
	}

	.customSettings > .lay > select{
		float: right;
		width: 60px;
		margin-right: 10px;
		height: 29px;
	}
	.allmetas > .lay.header,
	.customCommands > .lay{
		font-size: 16px;
		margin-top: 10px;
		background-color: #404040;
		border-radius: 5px;
		padding: 5px;
		width: 272px;
		text-align: left;
		color: white;
		height: 19px;
		display: inline-block;
	}

	.allmetas > .lay.header,
	.customCommands > .lay.header{
		background: none;
		font-size: 20px;
	}

	.allmetas > .lay.header > button,
	.customCommands > .lay.header > button{
		height: 20px;
		width: 25px;
	}
	
	.customCommands > .lay > label{
		float: left;
	}

	.customCommands > .lay > *{
		float: right;
	}

	/*.customCommands > button{
		width: 150px;
		height: 30px;
		display: inline-block;
		margin-top: 10px;
		margin-bottom: 10px;
		border-radius: 10px;
		background: #bbb;
		border: solid 2px #3e3e3e;
		color: #000;
		font-weight: bold;
	}*/

	/*.customCommands > button.red{
		background: #c10000;
    	border-color: #6f0000;
	}

	.customCommands > button.green{
		background: #20a000;
   		border-color: #066700;
	}*/

	.customCommands > .droplist{
		width: 100%;
		height: 30px;
		margin-top: 10px;
		margin-bottom: 10px;
		background: #bbb;
		border: solid 2px #3e3e3e;
		border-radius: 10px;
		line-height: 27px;
		text-align: center;
	}

	.customCommands > .lay > select{
		background-color: #777;
		color: #000;
		font-weight: bold;
	}
	.customCommands > .lay > select > option{
		font-weight: bold;
	}

	.allmetas{
		border: solid 1px #000;
	}

	.allmetas > .lay{
		display: inline-grid;
		justify-items: center;
		width: 100%;
		grid-auto-flow: column;
		margin-top: 10px;
	}

	.allmetas > .lay.header > button{
		float: right;
	}

	.allmetas > .container{
		width: 100%;
		margin-top: 10px;
		max-height: 320px;
		overflow-y: auto;
	}

	.allmetas > .container > div{
		width: 100%;
		height: 30px;
		color: white;
		text-align: center;
		line-height: 27px;
		background-color:#111;
		position: relative;
	}
	.allmetas > .container > div:nth-child(2n){
		background-color:#222;
	}

	.trangleshape{
		position: absolute;
		background-color: transparent;
		width: 0;
		border-top: 11px inset transparent;
		border-left: 15px solid #0f0;
		border-bottom: 11px solid transparent;
		border-radius: 100px;
		left: 5px;
    	top: 4px;
	}

	/*CHANGELOGS*/
	#changelogs {
		float: left;
		width: 300px;
		height: 275px;
		position: relative;
		left: 50%;
		transform: translate(-500px);
		border: 1px solid #585858;
		border-radius: 5px;
		color: #fff;
	}

	#chlbuttons{
		width: 100%;
   		height: 24px;
	}

	#chlbuttons > button{
		width: 33.333%;
   		height: 24px;
		background: antiquewhite;
		border: solid 2px #000;
		border-radius: 6px;
	}

	.ts-changelog,
	.ts-links,
	.changelog {
		float: left;
		width: 300px;
		height: 250px;
		position: relative;
		left: 0;
		transform: translate(0, 0);
		overflow: auto;
		border: 1px solid #585858;
		border-radius: 5px;
		color: #fff;
	}


	.quick-play-button{
		color: #db1512;
	}


	.graphw{
		width: 100%;
		height: 100%;
		position: absolute;
		top: 0;
		background: #00000088;
	}
	
	.graphw > #chartContainer{
		height: 370px;
		width: 100%;
		position: absolute;
		left: 50%;
		top: 50%;
		transform: translate(-50%, -50%);
	}

	.subtitle-profile>div>b>button{
		margin-left: 20px;
		position: relative;
		top: -7px;
		font-size: 20px;
		font-family: Verdana,Arial,Times,serif;
		background-color: #222;
		border: solid 2px #5a3c00;
		color: #ffa900;
	}
	.subtitle-profile>div>b>button:hover{
		background-color: #333;
		border: solid 2px #885b00;
		color: #ffc249;
	}

	.profile-hat-accessory{
		border: 1px solid #b9b9b9;
		width: 50px;
		height: 50px;
		margin: 10px 10px 0 10px;
	}

	.profile-hat-accessory-selected{
		border-color: #89ff85;
	}

	`;
	window.client.recalcUserMetas();
	styles.innerHTML = newihtml;

	document.head.appendChild(styles);

	document.addEventListener("keydown", (e)=>{
		if(client.textCommandConsts.autodc && (e.code == "F5" || (e.code == "KeyR" && e.ctrlKey)) && client.load){
            if(client.state && client.state.chatMessages)client.state.chatMessages.push("/dc");
            e.preventDefault();
			if(socket) socket.onclose = ()=>{document.location.reload();};
            else document.location.reload();
			return;
        }
		if(document.activeElement.hasAttribute("c-lock")||document.activeElement.localName === "input"){
			if(document.activeElement?.getAttribute("type") != "checkbox") return;
		}
		if(e.code == "KeyR"){
			globalThis.CANR&&window.client.openCustomSettings();
			//window.client.openLogger();
		}else
		if(e.code == "Escape"){
			window.client.toggleHeroList(true);
		}
	});
});

window.checkGlobalError = ()=>{
	if(globalThis._babelPolyfill){
		return false;
	}else{
		return true;
	}
}

window.fireB = () => {
	let event = document.createEvent("Event");
	event.initEvent("keydown", true, true);
	event.keyCode = 66;
	document.dispatchEvent(event);
	setTimeout(window.updateLeaderboard, 50);
};

window.createNewLeaderboard = () => {
	fireB();
	setTimeout(fireB, 50);
};

window.removeFakes = ()=>{
	[...document.getElementsByClassName('fake')].forEach(el => el.remove());
}

window.z = "";
globalThis.getAttrInParents=(e,a)=>{
	let at;
	if(at = e.getAttribute(a)){
		return at;
	}else return window.getAttrInParents(e.parentNode, a);
}
window.updateLeaderboard = () => {
	//window.client.areaData.check();
	document.body.onclick = () => {
		client.count = 0; //window.removeFakes();
	};
	let llb = document.querySelector(".leaderboard-title");
    if(llb && llb?.innerText == "Leaderboard")(llb.innerText = window.lbText)||(llb.innerText = window.lbText = "Leaderboard " + (socket.url.startsWith("wss://eu") ? "EU " : "NA ") + (1+ +socket.url.split("?")[1].split("&")[0].split("=")[1]));
	
	for (let names of [...document.getElementsByClassName('leaderboard-name')]) {
		names.oncontextmenu = event => {
			window.client.openUcard(getAttrInParents(event.target,"ariaLabel"), [20,event.y], window.client.userlog);
		};
		names.style.cursor = "pointer";
	}
}

window.makeDragable = (elem, elems2drag)=>{
	elem.addEventListener("mousedown", (e)=>{
		if(window.firstPos == null || window.firstPos[2] == null){
			window.firstPos = [e.screenX,e.screenY, elems2drag];
		}
	});
}
document.addEventListener("mousemove", (e)=>{
	if(window.firstPos != null && [e.screenX, e.screenY].join("") != "00"){
		if(window.firstPos[2] != null){
			if(e.stopPropagation) e.stopPropagation();
    		if(e.preventDefault) e.preventDefault();
			for(var i = 0; i < window.firstPos[2].length; i++){
				let el = window.firstPos[2][i];
				el.style.top = (parseInt(el.style.top.substring(0, el.style.top.length-2)) + e.screenY - window.firstPos[1]) + "px";
				el.style.right = (parseInt(el.style.right.substring(0, el.style.right.length-2)) + (window.firstPos[0] - e.screenX) ) + "px";
				//e.screenX,e.screenY
			}
			window.firstPos = [e.screenX,e.screenY, window.firstPos[2]];
		}
	}
});
document.addEventListener("mouseup", (e)=>{
	window.firstPos = null;
});
let settings = document.createElement('label');
settings.innerHTML = "showClasses";

window.updateName = (id, name) => {
	with (client) {
		if (!(showClasses && state)) return name;

		for (let i in state.globalEntities) {
			const element = state.globalEntities[i];
			if (element.id !== id) continue;

			let Hero = window.id2name(element.heroType);
			let DeathTime = window.secondsFormat(Math.floor(element.deathTimer/1000), false);
			return typeof name == 'string' ? `${element.deathTimer != -1 ? (DeathTime + " • ") : ""}${name} (${Hero})` : name;
		}
	}
}

window.loadGame = () => {
	window.createNewLeaderboard();
	client.load = true;
	window.client.toggleUcard(window.client.textCommandConsts.showUcard);
	let e;
	document.head.appendChild((e = document.createElement("style"),e.innerHTML = `html,body{overflow: hidden!important;}`,e))
	if(globalThis.client.showClasses){
		document.getElementById("leaderboard").ariaLabel = "fat"
	}
}

window.getTag = (name)=>{
	for(var tagKey in window.tags.oldTags){
		let tag = window.tags.oldTags[tagKey];
		if(tag.includes(name)){
			return tagKey;
		}
	}
	return "";
}

window.genPrefix = (name)=>{
	if(window.client.textCommandConsts.showTag){
		for(let tagKey in window.tagsEX){
			let tag = window.tagsEX[tagKey];
			if(tag.includes(name)){
				window.lastPrefix.name = window.tagDataEX[tagKey].presudo;
				window.lastPrefix.color = window.tagDataEX[tagKey].color;
				return;
			}
		}
		for(let tagKey in window.tags.oldTags){
			let tag = window.tags.oldTags[tagKey];
			if(tag.includes(name)){
				let tagData = window.tags.tagsData[tagKey];
				if(tagData.prefix){
					window.lastPrefix.name = tagData.prefix.text;
					window.lastPrefix.color = tagData.prefix.color;
				}else break;
				return;
			}
		}
	}
	window.lastPrefix.name="";
}
window.lastPrefix = {
	color:"red",
	name:""
}

new MutationObserver(function(mutations) {
	if (document.getElementsByTagName('script')[0]) {
		var elem = Array.from(document.querySelectorAll('script')).find(a=>a.src.match(/app\.[0-9a-f]{8}\.js/));
		if (elem) {
			let src = elem.src;
			elem.remove();
			elem = document.createElement('script');
			let newInnerHTML=`
			var akek=new XMLHttpRequest();
			akek.open("GET","${src}",false);
			akek.send();
			tmp=akek.response;`;

            for(let i = 0; i < globalThis.extraReplaces?.length; i++){
                let d = globalThis.extraReplaces[i];
                let ns;
				newInnerHTML += ns=`tmp = tmp.${d[2]===true?"replaceAll":"replace"}('${d[0].replaceAll("\'","\\'")}','${d[1].replaceAll("\'","\\'")}');\n`
            }
			newInnerHTML+=`

				// Декодер от protobuf
				tmp = tmp.replace(
					'n.Payloads.FramePayload.decode(l),',
					'n.Payloads.FramePayload.decode(l);window.protobuf||(window.protobuf=n.Payloads);'
				);

				//id: 1
				tmp = tmp.replace(
					'this.chat.style.visibility="visible",',
					'this.chat.style.visibility="visible",client.state=t,client.main=t.self.entity,'
				);

				// Собирание инфы со всех игроков
				//id: 2
				tmp = tmp.replace(
					'nter",t.lineWidth=6,t.strokeStyle=this.titleStrokeColor,t.fillStyle=this.titleColor,',
					'nter",t.lineWidth=6,t.strokeStyle=this.titleStrokeColor,t.fillStyle=this.titleColor,replaces.id2.call(this,e,t,l),'
				);
				//id: 3
				tmp = tmp.replace(
					'e.default.createElement("span",{className:"leaderboard-name"},this.props.name),',
					'e.default.createElement("span",{className:"leaderboard-name"},window.updateName(this.props.player.id,this.props.name)),window.updateLeaderboard(e),(!client.load)?window.loadGame():null,'
				);
				//id: 4
				tmp = tmp.replace(
					'ck:this.cancel.bind(this)}),',
					'ck:this.cancel.bind(this)}),replaces.id4.call(e),'
				);

				//Таймеры
				tmp = tmp.replace(
					'(e,i){if(this.ready){',
					'(e,i){this==client.main&&client.drBefore.call(this,e,i);if(this.ready){'
				);

				// Фикс панели
				//id: 8

				tmp = tmp.replace('null!==this.gameState&&null!==this.updateChat&&(!this.gameState.initial&&!(i.ctrlKey||i.altKey||i.metaKey))', 'null!==this.gameState&& !(document.activeElement.getAttributeNames().includes("c-lock"))&&null!==this.updateChat&&(!this.gameState.initial&&!(i.ctrlKey||i.altKey||i.metaKey))');

				
				tmp = tmp.replace('className:"chat-message-sender"', 'className:"chat-message-sender", ariaLabel:('+
				'globalThis.client.events.emit(globalThis.client.events.events.chatMessage, {'+
					'name:r,'+
					'content:a,'+
					'privs:l,'+
				'}),s)')
				tmp = tmp.replace('className:"chat-message"', 'className:"chat-message", ariaLabel:s')


				tmp = tmp.replace('"leaderboard-name"','"leaderboard-name",ariaLabel:this.props.player.name');

				tmp = tmp.replace('e.textAlign="center",e.fillStyle="black",e.fillText(this.name,a,r-this.radius-11)),',
				'e.font2=e.font,e.font=(window.ssss2??14)+"px Tahoma, Verdana, Segoe, sans-serif",'+
				'window.genPrefix(this.name),e.lineWidth2=e.lineWidth,e.lineWidth=(window.ssss??2.5),e.strokeStyle ="black",e.strokeText(window.lastPrefix.name,a,r-this.radius-11 - (window.consts?.tagY??14)),e.textAlign="center",e.fillStyle=window.lastPrefix.color,e.fillText(window.lastPrefix.name,a,r-this.radius-11 - (window.consts?.tagY??14)),'+
				'e.font=e.font2,e.lineWidth=e.lineWidth2,'+
				'e.textAlign="center",e.fillStyle="black",e.fillText(this.name,a,r-this.radius-11)),');

				/*//left
				tmp = tmp.replace('e.textAlign="center",e.fillStyle="black",e.fillText(this.name,a,r-this.radius-11)),',
				'window.genPrefix(this.name),e.textAlign="left",e.fillStyle=window.lastPrefix.color,e.fillText(window.lastPrefix.name,a - e.measureText(window.lastPrefix.name+this.name).width/1.8,r-this.radius-11),'+
				'e.textAlign="center",e.fillStyle="black",e.fillText(this.name,a + e.measureText(window.lastPrefix.name).width/3,r-this.radius-11)),');
				*/

				tmp = tmp.replace('(this.enteredButtons.add(u),u.mouseOver=!0,u.interactive&&(this.down&&!u.mouseDown?(e.keys.keyDown(u.key),u.onClick()):!this.down&&u.mouseDown&&e.keys.keyUp(u.key),u.mouseDown=this.down,s=!0),o=!0)',
				'((this.gameState.heroInfoCard.hidden && ((u.width == 48 && u.height == 48) || (u.width == 14 && u.height == 14) || (u.width == 82 && u.height == 40)))?false:(this.enteredButtons.add(u),u.mouseOver=!0,u.interactive&&(this.down&&!u.mouseDown?(e.keys.keyDown(u.key),u.onClick()):!this.down&&u.mouseDown&&e.keys.keyUp(u.key),u.mouseDown=this.down,s=!0),o=!0))')

				tmp = tmp.replace('message:t,', 'message: window.client.checkMsg(t) ? (window.client.checkMsgSend(t)) : void 0,');
				//tmp = tmp.replace('this.gameState.chatMessages.push(o.value)', 'window.client.checkMsg(o.value)&&this.gameState.chatMessages.push(o.value)');
				
				tmp = tmp.replace('null!==e&&(this.isKeyUp(e)||this.downKeys.splice(this.downKeys.indexOf(e),1))',
				'if((e>3||e<0)||!window.client.grb.on || (window.client.grb.on && e !== window.client.grb.grbKey)){null!==e&&(this.isKeyUp(e)||this.downKeys.splice(this.downKeys.indexOf(e),1))}')

				tmp = tmp.replace('null!==e&&(this.isKeyDown(e)||this.downKeys.push(e))',
				'if((e>3||e<0)||!window.client.grb.on || (window.client.grb.on && e === window.client.grb.grbKey)){null!==e&&(this.isKeyDown(e)||this.downKeys.push(e))}')

				tmp = tmp.replace('this.downKeys=[]',
				'if(!window.client.grb.on)this.downKeys=[]')

				tmp = tmp.replace('require("babel-polyfill")', 'window.checkGlobalError()&&require("babel-polyfill")');

				tmp = tmp.replace('null!==r&&(this.leaderboardRef.current.scrollTop=r)', 'null!==r&&(this.leaderboardRef.current.scrollTop=r, window.client.areaData.check())');
				
				tmp = tmp.replace('null!==l&&(c=e.default.createElement("span",null,e.default.createElement("span",{className:i},l," "),c)',
				'(c=eval(globalThis.tags.getChatTag(c,e,l,i,r))')

				tmp = tmp.replace(
					'return e.default.createElement("div",{className:"changelog"',
					'return e.default.createElement("div",{id:"changelogs"},'+
					'e.default.createElement("div",{id:"chlbuttons"},'+
					'e.default.createElement("button",{onClick:()=>{window.vers.swi("ev")}}, "Evades.io"),'+
					'e.default.createElement("button",{onClick:()=>{window.vers.swi("ts")}}, "TS Mod"),'+
					'e.default.createElement("button",{onClick:()=>{window.vers.swi("li")}}, "Links")'+
					'),'+
					'e.default.createElement("div",{className:"ts-changelog hidden"}),'+
					'e.default.createElement("div",{className:"ts-links hidden"}),'+
					'e.default.createElement("div",{className:"changelog"'
				)
				tmp = tmp.replace('d."))))','d.")))) )')
				
				tmp = tmp.replace('"48"}))),','"48"})),'+
				'e.default.createElement("a", {'+
					'href: "https://docs.google.com/spreadsheets/d/1iNQsgPGu0xtSNyKEBDt8jr9EQfjD4Djn4e-qL7ljrRc"'+
				'},e.default.createElement("img", {'+
					'alt: "Highscores",'+
					'src: "https://cdn.discordapp.com/attachments/783087872605028372/877227883016388708/unknown.png",'+
					'width: "48",'+
					'height: "48"'+
				'}))'+
				'),')
				
				tmp = tmp.replace('}))))','})),'+
				'e.default.createElement("a", {'+
					'href: "https://docs.google.com/spreadsheets/d/1iNQsgPGu0xtSNyKEBDt8jr9EQfjD4Djn4e-qL7ljrRc"'+
				'},e.default.createElement("img", {'+
					'alt: "Highscores",'+
					'src: "https://cdn.discordapp.com/attachments/783087872605028372/877227883016388708/unknown.png",'+
					'width: "48",'+
					'height: "48"'+
				'}))'+
				'))')


				tmp = tmp.replace('"Mute"),','"Mute"),'
				+'  a && e.default.createElement("li", {'
				+'	className: "chat-message-contextitem-selectable chat-message-moderate",'
				+'	onClick: function() {'
				+'	let chat = document.getElementById("chat-input"); chat.value = "/mute "+ t.props.message.sender + " ";'
				+'	t.hide(); chat.focus(); chat.selectionStart = chat.selectionEnd = 10000;'
				+'		return undefined;'
				+'	}'
				+'}, "Mute Copy"),'
				)
				
				
				//tmp = tmp.replace('var s=Object.values(e);','var s=Object.values(e);if(globalThis.client.extendLb)Object.values(globalThis.client.state?.entities || []).forEach((v)=>{let ii;if(v.entityType == 0 && (ii=s.findIndex(vv=>vv.name == v.name))){console.log(ii.name,ii);s[ii]={...s[ii],...v}} });')
				
				//tmp = tmp.replace('var n,a;','var n,a,kk=(globalThis.client.textCommandConsts.ssxp && e.xp)?"experience":"level";');
				//tmp = tmp.replace('n=e.level,a=t.level','n=e[kk],a=t[kk]');
				//tmp = tmp.replace('||i.victoryArea!==u.victoryArea','|| i.victoryArea !== u.victoryArea|| (i.experience!==undefined && i.experience !== u.experience)');
				//tmp = tmp.replace('n?u.level','n?u[(globalThis.client.textCommandConsts.ssxp && u.experience !== undefined)?"experience":"level"]');
				//tmp = tmp.replace('victoryArea:i.victoryArea','victoryArea:i.victoryArea,experience:(i.experience)');
				
				//tmp = tmp.replace('','')
				
				//ppp
				tmp = tmp.replace('this.state.stats;', 'this.state.stats;globalThis.profiler.setState(this.state);')
				tmp = tmp.replace(/(,e\\.default\\.createElement\\("b",null,this\\.state\\.username\\)\\),)/gm,
				',e.default.createElement("div",null,e.default.createElement("b",null,this.state.username, e.default.createElement("button",{onClick:()=>{globalThis.profiler.showGraph()}},"Graph")))),')
				
				tmp = tmp.replace('"Career VP: ",m.highest_area_achieved_counter||0)',
				'"Career VP: ",m.highest_area_achieved_counter||0),e.default.createElement("div", {className:"profile-hats-container"})')
				
				//tmp = tmp.replace('module.exports="/area-50','globalThis.profiler.hats["area-50"] = module.exports="/area-50')
				
				eval(tmp);
				console.groupEnd()
				console.log("%cScript loaded.","color: green; font-size: 20px");

			`;
			elem.innerHTML = newInnerHTML;
			document.body.appendChild(elem);
			this.disconnect();
		}
	}
}).observe(document, {childList: true, subtree: true});