Загрузка данных





--by scriptleaks https://discord.gg/n4DpEunxbj t.me/scriptleakslol

if ffi == nil then
	return gui.notify:add(gui.notification("WARNING!", "ENABLE \"UNSAFE LOCAL SCRIPTS\" IN LUA SETTINGS AND RELOAD THE SCRIPT!", draw.textures.icon_close))
end

print("██████╗░███╗░░██╗██████╗░")
print("██╔══██╗████╗░██║██╔══██╗")
print("██████╔╝██╔██╗██║██║░░██║")
print("██╔═══╝░██║╚████║██║░░██║")
print("██║░░░░░██║░╚███║██████╔╝")
print("╚═╝░░░░░╚═╝░░╚══╝╚═════╝░")
game.engine:ClientCmd("r_show_build_info false")

resource_path = "fatality/PND"--ws.GetResourceDir()
build = "default"

function safe_load_texture(arg_1_0)
	if not arg_1_0 then
		return nil
	end

	local var_1_0 = draw.texture(arg_1_0)

	if not var_1_0 then
		return nil
	end

	var_1_0:create()

	if not var_1_0.obj then
		return nil
	end

	local var_1_1 = var_1_0:get_size()

	if not var_1_1 or var_1_1.x == 0 or var_1_1.y == 0 then
		return nil
	end

	return var_1_0
end

function is_mouse_down()
	return gui.input:is_mouse_down(gui.mouse_button["left"])
end

function ease_in_out_cubic(arg_3_0)
	if arg_3_0 < 0.5 then
		return 4 * arg_3_0 * arg_3_0 * arg_3_0
	else
		local var_3_0 = 2 * arg_3_0 - 2

		return 0.5 * var_3_0 * var_3_0 * var_3_0 + 1
	end
end

function pad(arg_4_0)
	return arg_4_0 < 10 and "0" .. arg_4_0 or tostring(arg_4_0)
end

function lerp(arg_5_0, arg_5_1, arg_5_2)
	return (1 - arg_5_2) * arg_5_0 + arg_5_2 * arg_5_1
end

function is_zoom()
	local var_6_0 = entities.get_local_pawn()

	if var_6_0.m_bIsScoped and var_6_0.m_bIsScoped:get() then
		return true
	end

	return false
end

function is_enabled(arg_7_0, arg_7_1)
	return bit.band(arg_7_0, arg_7_1) ~= 0
end

function apply_alpha(arg_8_0, arg_8_1)
	return arg_8_0:mod_a(arg_8_1)
end

function is_grenade(arg_9_0)
	return arg_9_0 == 43 or arg_9_0 == 44 or arg_9_0 == 45 or arg_9_0 == 46 or arg_9_0 == 48
end

function is_hotkey_on(arg_10_0)
	local var_10_0 = type(arg_10_0) == "table" and arg_10_0 or {
		arg_10_0
	}
	local var_10_1 = gui and gui.ctx

	if not var_10_1 or not var_10_1.Find then
		return false
	end

	for iter_10_0, iter_10_1 in ipairs(var_10_0) do
		local var_10_2 = var_10_1:Find(iter_10_1)

		if var_10_2 and var_10_2:GetValue():get_hotkey_state() then
			return true
		end
	end

	return false
end

KEY_W, KEY_A, KEY_S, KEY_D = 87, 65, 83, 68

function deg2rad(arg_11_0)
	return arg_11_0 * math.pi / 180
end

function angle_to_forward(arg_12_0)
	local var_12_0 = deg2rad(arg_12_0.x)
	local var_12_1 = deg2rad(arg_12_0.y)
	local var_12_2 = math.cos(var_12_0)

	return {
		x = var_12_2 * math.cos(var_12_1),
		y = var_12_2 * math.sin(var_12_1),
		z = -math.sin(var_12_0)
	}
end

function vec_sub(arg_13_0, arg_13_1)
	return {
		x = arg_13_0.x - arg_13_1.x,
		y = arg_13_0.y - arg_13_1.y,
		z = arg_13_0.z - arg_13_1.z
	}
end

function vec_dot(arg_14_0, arg_14_1)
	return arg_14_0.x * arg_14_1.x + arg_14_0.y * arg_14_1.y + arg_14_0.z * arg_14_1.z
end

function vec_length(arg_15_0)
	return math.sqrt(arg_15_0.x * arg_15_0.x + arg_15_0.y * arg_15_0.y + arg_15_0.z * arg_15_0.z)
end

function vec_normalize(arg_16_0)
	local var_16_0 = vec_length(arg_16_0)

	if var_16_0 == 0 then
		return {
			x = 0,
			y = 0,
			z = 0
		}
	end

	return {
		x = arg_16_0.x / var_16_0,
		y = arg_16_0.y / var_16_0,
		z = arg_16_0.z / var_16_0
	}
end

function vec_add(arg_17_0, arg_17_1)
	return {
		x = arg_17_0.x + arg_17_1.x,
		y = arg_17_0.y + arg_17_1.y,
		z = arg_17_0.z + arg_17_1.z
	}
end

function angle_lerp(arg_18_0, arg_18_1, arg_18_2)
	return Vector(arg_18_0.x + (arg_18_1.x - arg_18_0.x) * arg_18_2, arg_18_0.y + (arg_18_1.y - arg_18_0.y) * arg_18_2, 0)
end

function normalize_angle(arg_19_0)
	while arg_19_0 > 180 do
		arg_19_0 = arg_19_0 - 360
	end

	while arg_19_0 < -180 do
		arg_19_0 = arg_19_0 + 360
	end

	return arg_19_0
end

function normalize_angles(arg_20_0)
	return Vector(normalize_angle(arg_20_0.x), normalize_angle(arg_20_0.y), 0)
end

function calc_angle(arg_21_0, arg_21_1)
	local var_21_0 = vec_sub(arg_21_1, arg_21_0)
	local var_21_1 = math.sqrt(var_21_0.x * var_21_0.x + var_21_0.y * var_21_0.y)
	local var_21_2 = -math.deg(math.atan2(var_21_0.z, var_21_1))
	local var_21_3 = math.deg(math.atan2(var_21_0.y, var_21_0.x))

	return Vector(var_21_2, var_21_3, 0)
end

function calc_fov(arg_22_0, arg_22_1)
	local var_22_0 = vec_dot(arg_22_0, vec_normalize(arg_22_1))

	return math.acos(var_22_0) * (180 / math.pi)
end

function vector_to_angles(arg_23_0, arg_23_1)
	local var_23_0 = arg_23_1 - arg_23_0
	local var_23_1 = var_23_0.x
	local var_23_2 = var_23_0.y
	local var_23_3 = var_23_0.z
	local var_23_4 = math.sqrt(var_23_1 * var_23_1 + var_23_2 * var_23_2)
	local var_23_5 = math.deg(math.atan2(-var_23_3, var_23_4))
	local var_23_6 = math.deg(math.atan2(var_23_2, var_23_1))

	return Vector(var_23_5, var_23_6, 0)
end

function distance(arg_24_0, arg_24_1)
	return (arg_24_0 - arg_24_1):Length()
end

update = {
	version = "v3.1.5",
	update_lines = {
		"+ Added Crouch in Air",
		"* Fixed Trails",
		"* Fixed Gamma",
		"* Fixed Hitmarker",
		"* Fixed Fast Ladder",
		"* Fixed Animation Break",
		"* Fixed Debounce Zoom",
		"* Fixed Transparent Arms",
		"* Fixed Fake Duck Animation",
		"* Fixed Viewmodel Hit Effect",
		"~ Reworked Logs",
		"~ Reworked Manuals",
		"~ Reworked Watermark",
		"~ Reworked Out Of Field",
		"~ Reworked Menu Effect",
		"~ Reworked Transparency",
		"~ Reworked Disable Shadows",
		"- Removed Free Cam",
		"- Removed Fake Pitch",
		"- Removed Avoid Backstab"
	}
}
members = {
	staff = {
		Edward22 = "[STAFF]",
		Arc = "[STAFF]",
		april = "[STAFF]",
		Agapornis = "[STAFF]",
		["3AGLE"] = "[STAFF]",
		["1tsuki"] = "[STAFF]",
		gnida = "[FRIENDS]",
		Garan0n = "[STAFF]",
		TALZi = "[STAFF]",
		Buttermeow = "[STAFF]",
		PyZik = "[STAFF]",
		PizDyk = "[STAFF]",
		panzerfaust = "[STAFF]",
		kayron = "[STAFF]",
		jompey = "[STAFF]",
		["Imperator hL"] = "[STAFF]",
		ay0 = "[STAFF]",
		trotek = "[STAFF]",
		RG0609 = "[STAFF]",
		philip015 = "[STAFF]",
		pf = "[STAFF]",
		Imposseburu = "[STAFF]",
		hL = "[STAFF]"
	},
	username = gui.ctx.user.username or "unknown_user"
}
config = {
	menu = {
		dpi_scale = gui.ctx:Find("misc>menu>dpi scale"),
		theme = gui.ctx:Find("misc>menu>theme")
	},
	rage = {
		aimbot = gui.ctx:Find("rage>aimbot>general>aimbot"),
		autofire = gui.ctx:Find("rage>aimbot>general>autofire"),
		doubletap = gui.ctx:Find("rage>aimbot>doubletap"),
		doubletap_manual = gui.ctx:Find("rage>aimbot>doubletap>settings>on manual shot"),
		silent = gui.ctx:Find("rage>aimbot>general>silent"),
		penetration = gui.ctx:Find("rage>aimbot>general>penetration"),
		force_bodyaim = gui.ctx:Find("rage>aimbot>general>force bodyaim"),
		force_shoot = gui.ctx:Find("rage>aimbot>general>force shoot")
	},
	anti_aim = {
		anti_aim = gui.ctx:Find("rage>anti-aim>angles>anti-aim"),
		pitch = gui.ctx:Find("rage>anti-aim>angles>pitch>settings>value"),
		hide_shot = gui.ctx:Find("rage>anti-aim>angles>hide shot"),
		yaw_base = gui.ctx:Find("rage>anti-aim>angles>yaw base"),
		left_override = gui.ctx:Find("rage>anti-aim>angles>manual override>override left"),
		right_override = gui.ctx:Find("rage>anti-aim>angles>manual override>override right"),
		back_override = gui.ctx:Find("rage>anti-aim>angles>manual override>override back"),
		forward_override = gui.ctx:Find("rage>anti-aim>angles>manual override>override forward")
	},
	legit = {
		legit_enabled = gui.ctx:Find("legit>general>enabled"),
		legit_visualize_fov = gui.ctx:Find("legit>general>visualize fov"),
		legit_aim_assist = gui.ctx:Find("legit>weapon>general>aim>aim assist"),
		legit_triggerbot = gui.ctx:Find("legit>weapon>general>trigger>triggerbot"),
		legit_recoil = gui.ctx:Find("legit>weapon>general>rcs>recoil control")
	},
	visuals = {
		viewmodel = gui.ctx:Find("visuals>misc>local>viewmodel override")
	},
	misc = {
		bhop = gui.ctx:Find("misc>movement>bhop"),
		jumpbug = gui.ctx:Find("misc>movement>jumpbug"),
		autostrafer = gui.ctx:Find("misc>movement>autostrafer"),
		turn_angle_slider = gui.ctx:Find("misc>movement>autostrafer>turn angle"),
		boost_slider = gui.ctx:Find("misc>movement>autostrafer>boost"),
		duck_peek_control = gui.ctx:Find("misc>movement>duck peek assist"),
		untrusted = gui.ctx:Find("misc>matchmaking>untrusted features")
	}
}
themes = {
	{
		glow_color = draw.Color(32, 24, 46, 120),
		color_left = draw.Color(32, 24, 46, 255),
		color_right = draw.Color(61, 35, 50, 255),
		border_color_left = draw.Color(46, 33, 53, 255),
		border_color_right = draw.Color(80, 53, 68, 255),
		stripe_color_left = draw.Color(162, 36, 78, 255),
		stripe_color_right = draw.Color(169, 110, 104, 255),
		text_color = draw.color.White(),
		text_2_color = draw.Color(232, 12, 100),
		line_color = draw.Color(255, 255, 255, 50),
		member_tag_color = draw.Color(164, 181, 210)
	},
	{
		glow_color = draw.Color(28, 28, 28, 120),
		color_left = draw.Color(20, 20, 20, 255),
		color_right = draw.Color(28, 28, 28, 255),
		border_color_left = draw.Color(20, 20, 20, 255),
		border_color_right = draw.Color(37, 37, 37, 255),
		stripe_color_left = draw.Color(185, 24, 48, 255),
		stripe_color_right = draw.Color(247, 77, 92, 255),
		text_color = draw.color.White(),
		text_2_color = draw.Color(247, 77, 92),
		line_color = draw.Color(255, 255, 255, 50),
		member_tag_color = draw.Color(103, 103, 103)
	},
	[2097152] = {
		glow_color = draw.Color(29, 21, 13, 120),
		color_left = draw.Color(19, 19, 19, 230),
		color_right = draw.Color(19, 19, 19, 230),
		border_color_left = draw.Color(20, 20, 20, 255),
		border_color_right = draw.Color(22, 22, 22, 255),
		stripe_color_left = draw.Color(140, 74, 0, 255),
		stripe_color_right = draw.Color(140, 74, 0, 255),
		text_color = draw.Color(200, 210, 195),
		text_2_color = draw.Color(255, 116, 23),
		line_color = draw.Color(32, 29, 27, 255),
		member_tag_color = draw.Color(106, 106, 106)
	},
	[4194304] = {
		glow_color = draw.Color(227, 229, 232, 120),
		color_left = draw.Color(214, 216, 219, 230),
		color_right = draw.Color(227, 229, 232, 230),
		border_color_left = draw.Color(163, 166, 169, 255),
		border_color_right = draw.Color(240, 244, 251, 255),
		stripe_color_left = draw.Color(244, 140, 169, 255),
		stripe_color_right = draw.Color(132, 212, 236, 255),
		text_color = draw.Color(48, 48, 48),
		text_2_color = draw.Color(243, 143, 171),
		line_color = draw.Color(48, 48, 48, 50),
		member_tag_color = draw.Color(110, 112, 120)
	},
	[8388608] = {
		glow_color = draw.Color(227, 229, 232, 50),
		color_left = draw.Color(150, 150, 150, 40),
		color_right = draw.Color(150, 150, 150, 70),
		border_color_left = draw.Color(255, 255, 255, 50),
		border_color_right = draw.Color(255, 255, 255, 100),
		stripe_color_left = draw.Color(94, 104, 112),
		stripe_color_right = draw.Color(94, 104, 112),
		text_color = draw.Color(19, 19, 19),
		text_2_color = draw.Color(217, 78, 78),
		line_color = draw.Color(131, 141, 151),
		member_tag_color = draw.Color(67, 67, 67)
	},
	[16777216] = {
		glow_color = draw.Color(17, 17, 17, 160),
		color_left = draw.Color(17, 17, 17, 255),
		color_right = draw.Color(26, 23, 24, 255),
		border_color_left = draw.Color(22, 22, 23, 255),
		border_color_right = draw.Color(29, 29, 30, 255),
		stripe_color_left = draw.Color(239, 9, 95, 255),
		stripe_color_right = draw.Color(239, 9, 95, 255),
		text_color = draw.color.White(),
		text_2_color = draw.Color(239, 9, 95),
		line_color = draw.Color(31, 31, 32, 255),
		member_tag_color = draw.Color(86, 83, 93)
	},
	[33554432] = {
		glow_color = draw.Color(108, 134, 195, 230),
		color_left = draw.Color(111, 133, 184, 255),
		color_right = draw.Color(108, 134, 195, 255),
		border_color_left = draw.Color(79, 105, 165, 150),
		border_color_right = draw.Color(79, 105, 165, 150),
		stripe_color_left = draw.Color(142, 166, 221, 255),
		stripe_color_right = draw.Color(142, 166, 221, 255),
		text_color = draw.Color(28, 28, 28),
		text_2_color = draw.Color(240, 192, 216),
		line_color = draw.Color(142, 166, 221, 255),
		member_tag_color = draw.Color(58, 67, 89)
	}
}
theme_value_cache = nil
theme_element_ref = config.menu.theme
theme_last_value = nil
theme_frame_counter = 0

events.presentQueue:Add(function()
	theme_frame_counter = theme_frame_counter + 1

	if theme_frame_counter % 120 ~= 0 then
		return
	end

	if not theme_element_ref then
		theme_element_ref = config.menu.theme

		return
	end

	local var_25_0 = theme_element_ref:GetValue():Get():GetRaw()

	if var_25_0 ~= theme_last_value then
		theme_last_value = var_25_0
		theme_value_cache = var_25_0
	end
end)

function get_current_theme()
	return themes[theme_value_cache] or themes[1]
end

log_menu = {
	log_menu_duration = 3,
	show_update_log_menu = false,
	show_log_menu = true,
	fade_duration = 0.5,
	update_log_menu_duration = 3,
	update_log_menu_start_time = 0,
	log_menu_start_time = game.globalVars.m_flRealTime
}

events.presentQueue:Add(function()
	if not log_menu.show_log_menu and not log_menu.show_update_log_menu then
		return
	end

	slot_27_0_0 = game.globalVars.m_flRealTime

	if log_menu.show_log_menu and slot_27_0_0 - log_menu.log_menu_start_time >= log_menu.log_menu_duration then
		log_menu.show_log_menu = false
		log_menu.show_update_log_menu = true
		log_menu.update_log_menu_start_time = slot_27_0_0

		if not log_menu.show_update_log_menu then
			return
		end
	end

	if log_menu.show_update_log_menu and slot_27_0_0 - log_menu.update_log_menu_start_time >= log_menu.update_log_menu_duration then
		log_menu.show_update_log_menu = false

		return
	end

	if not log_menu.show_log_menu and not log_menu.show_update_log_menu then
		return
	end

	slot_27_1_0 = draw.surface

	slot_27_1_0.g:SetTexture(nil)

	slot_27_1_0.font = draw.fonts.gui_main
	slot_27_1_0.g.antiAlias = true
	slot_27_2_0 = draw.GetScale()
	slot_27_3_0, slot_27_4_0 = game.engine:GetScreenSize()

	function slot_27_5_0(arg_28_0, arg_28_1)
		local var_28_0 = slot_27_0_0 - arg_28_0

		if var_28_0 < log_menu.fade_duration then
			local var_28_1 = var_28_0 / log_menu.fade_duration

			return ease_in_out_cubic(var_28_1)
		elseif var_28_0 > arg_28_1 - log_menu.fade_duration then
			local var_28_2 = (arg_28_1 - var_28_0) / log_menu.fade_duration

			return ease_in_out_cubic(var_28_2)
		else
			return 1
		end
	end

	if log_menu.show_log_menu then
		slot_27_6_1 = slot_27_5_0(log_menu.log_menu_start_time, log_menu.log_menu_duration)
		slot_27_7_1 = get_current_theme()
		slot_27_8_1 = "PND"
		slot_27_9_1 = ".lua"
		slot_27_10_1 = ""
		slot_27_11_1 = slot_27_1_0.font
		slot_27_12_1 = slot_27_11_1:GetTextSize(slot_27_8_1)
		slot_27_13_1 = slot_27_11_1:GetTextSize(slot_27_9_1)
		slot_27_14_1 = slot_27_11_1:GetTextSize(slot_27_10_1)
		slot_27_15_1 = (slot_27_12_1.x + slot_27_13_1.x + slot_27_14_1.x) * slot_27_2_0
		slot_27_16_1 = slot_27_12_1.y * slot_27_2_0
		slot_27_17_1 = 20 * slot_27_2_0
		slot_27_18_1 = 8 * slot_27_2_0
		slot_27_19_1 = 5 * slot_27_2_0
		slot_27_20_1 = 8 * slot_27_2_0
		slot_27_21_1 = 1 * slot_27_2_0
		slot_27_22_1 = slot_27_15_1 + slot_27_17_1 * 2
		slot_27_23_2 = slot_27_16_1 + slot_27_18_1 * 2
		slot_27_24_2 = (slot_27_3_0 - slot_27_22_1) / 2
		slot_27_25_2 = slot_27_4_0 * 0.3333333333333333 - slot_27_23_2 / 2
		slot_27_26_1 = slot_27_24_2 + slot_27_22_1
		slot_27_27_1 = slot_27_25_2 + slot_27_23_2

		slot_27_1_0:AddGlow(draw.Rect(slot_27_24_2 + slot_27_21_1, slot_27_25_2 + slot_27_21_1, slot_27_26_1 - slot_27_21_1, slot_27_27_1 - slot_27_21_1), slot_27_20_1, apply_alpha(slot_27_7_1.glow_color, slot_27_6_1))
		slot_27_1_0:AddRectFilledRoundedMulticolor(draw.Rect(slot_27_24_2 - slot_27_21_1, slot_27_25_2 - slot_27_21_1, slot_27_26_1 + slot_27_21_1, slot_27_27_1 + slot_27_21_1), {
			apply_alpha(slot_27_7_1.border_color_left, slot_27_6_1),
			apply_alpha(slot_27_7_1.border_color_right, slot_27_6_1),
			apply_alpha(slot_27_7_1.border_color_right, slot_27_6_1),
			apply_alpha(slot_27_7_1.border_color_left, slot_27_6_1)
		}, slot_27_19_1 + 1, draw.Rounding.ALL)
		slot_27_1_0:AddRectFilledRoundedMulticolor(draw.Rect(slot_27_24_2, slot_27_25_2, slot_27_26_1, slot_27_27_1), {
			apply_alpha(slot_27_7_1.color_left, slot_27_6_1),
			apply_alpha(slot_27_7_1.color_right, slot_27_6_1),
			apply_alpha(slot_27_7_1.color_right, slot_27_6_1),
			apply_alpha(slot_27_7_1.color_left, slot_27_6_1)
		}, slot_27_19_1, draw.Rounding.ALL)
		slot_27_1_0:AddRectFilledMulticolor(draw.Rect(slot_27_24_2 + 4 * slot_27_2_0, slot_27_27_1, slot_27_26_1 - 4 * slot_27_2_0, slot_27_27_1 + 1 * slot_27_2_0), {
			apply_alpha(slot_27_7_1.stripe_color_left, slot_27_6_1),
			apply_alpha(slot_27_7_1.stripe_color_right, slot_27_6_1),
			apply_alpha(slot_27_7_1.stripe_color_right, slot_27_6_1),
			apply_alpha(slot_27_7_1.stripe_color_left, slot_27_6_1)
		})

		slot_27_28_1 = slot_27_25_2 + (slot_27_23_2 - slot_27_16_1) / 2
		slot_27_29_1 = (slot_27_3_0 - slot_27_15_1) / 2

		slot_27_1_0:AddText(draw.Vec2(slot_27_29_1, slot_27_28_1), slot_27_8_1, apply_alpha(slot_27_7_1.text_color, slot_27_6_1))
		slot_27_1_0:AddText(draw.Vec2(slot_27_29_1 + slot_27_12_1.x * slot_27_2_0, slot_27_28_1), slot_27_9_1, apply_alpha(slot_27_7_1.text_2_color, slot_27_6_1))
		slot_27_1_0:AddText(draw.Vec2(slot_27_29_1 + (slot_27_12_1.x + slot_27_13_1.x) * slot_27_2_0, slot_27_28_1), slot_27_10_1, apply_alpha(slot_27_7_1.text_color, slot_27_6_1))
	end

	if log_menu.show_update_log_menu then
		slot_27_6_0 = slot_27_5_0(log_menu.update_log_menu_start_time, log_menu.update_log_menu_duration)
		slot_27_7_0 = slot_27_1_0.font
		slot_27_8_0 = {
			Removed = 5,
			Moved = 4,
			Reworked = 3,
			Fixed = 2,
			Added = 1
		}

		function slot_27_9_0(arg_29_0)
			for iter_29_0, iter_29_1 in pairs(slot_27_8_0) do
				if arg_29_0:find(iter_29_0) then
					return iter_29_1
				end
			end

			return 100
		end

		table.sort(update.update_lines, function(arg_30_0, arg_30_1)
			local var_30_0 = slot_27_9_0(arg_30_0)
			local var_30_1 = slot_27_9_0(arg_30_1)

			if var_30_0 == var_30_1 then
				local var_30_2 = slot_27_7_0:GetTextSize(arg_30_0).x
				local var_30_3 = slot_27_7_0:GetTextSize(arg_30_1).x

				if var_30_2 == var_30_3 then
					return arg_30_0 < arg_30_1
				else
					return var_30_2 < var_30_3
				end
			else
				return var_30_0 < var_30_1
			end
		end)

		slot_27_10_0 = 14 * slot_27_2_0
		slot_27_11_0 = 20 * slot_27_2_0
		slot_27_12_0 = 12 * slot_27_2_0
		slot_27_13_0 = math.max(1, math.floor(1 * slot_27_2_0))
		slot_27_14_0 = 1 * slot_27_2_0
		slot_27_15_0 = 8 * slot_27_2_0
		slot_27_16_0 = get_current_theme()
		slot_27_17_0 = slot_27_7_0:GetTextSize(update.version)
		slot_27_18_0 = 0
		slot_27_19_0 = 0

		for iter_27_0, iter_27_1 in ipairs(update.update_lines) do
			slot_27_25_1 = slot_27_7_0:GetTextSize(iter_27_1)

			if slot_27_18_0 < slot_27_25_1.x then
				slot_27_18_0 = slot_27_25_1.x
			end

			slot_27_19_0 = slot_27_25_1.y
		end

		slot_27_20_0 = math.max(slot_27_18_0, slot_27_17_0.x)
		slot_27_21_0 = slot_27_10_0
		slot_27_22_0 = slot_27_12_0
		slot_27_23_0 = slot_27_19_0 * slot_27_2_0
		slot_27_24_0 = slot_27_17_0.y * slot_27_2_0
		slot_27_25_0 = slot_27_24_0 + slot_27_21_0 + #update.update_lines * slot_27_23_0 + (#update.update_lines - 1) * slot_27_21_0
		slot_27_26_0 = slot_27_20_0 * slot_27_2_0 + slot_27_11_0 * 2
		slot_27_27_0 = slot_27_25_0 + slot_27_22_0 * 2
		slot_27_28_0 = slot_27_4_0 * 0.3333333333333333 - slot_27_27_0 / 2
		slot_27_29_0 = 5 * slot_27_2_0
		slot_27_30_0 = math.max(slot_27_28_0, slot_27_29_0)

		if slot_27_4_0 < slot_27_30_0 + slot_27_27_0 then
			slot_27_30_0 = slot_27_4_0 - slot_27_27_0

			if slot_27_30_0 < slot_27_29_0 then
				slot_27_30_0 = slot_27_29_0
			end
		end

		slot_27_31_0 = (slot_27_3_0 - slot_27_26_0) / 2
		slot_27_32_0 = slot_27_31_0 + slot_27_26_0
		slot_27_33_0 = slot_27_30_0 + slot_27_27_0
		slot_27_34_0 = 5 * slot_27_2_0

		slot_27_1_0:AddGlow(draw.Rect(slot_27_31_0 + slot_27_14_0, slot_27_30_0 + slot_27_14_0, slot_27_32_0 - slot_27_14_0, slot_27_33_0 - slot_27_14_0), slot_27_15_0, apply_alpha(slot_27_16_0.glow_color, slot_27_6_0))
		slot_27_1_0:AddRectFilledRoundedMulticolor(draw.Rect(slot_27_31_0 - slot_27_14_0, slot_27_30_0 - slot_27_14_0, slot_27_32_0 + slot_27_14_0, slot_27_33_0 + slot_27_14_0), {
			apply_alpha(slot_27_16_0.border_color_left, slot_27_6_0),
			apply_alpha(slot_27_16_0.border_color_right, slot_27_6_0),
			apply_alpha(slot_27_16_0.border_color_right, slot_27_6_0),
			apply_alpha(slot_27_16_0.border_color_left, slot_27_6_0)
		}, slot_27_34_0 + 1, draw.Rounding.ALL)
		slot_27_1_0:AddRectFilledRoundedMulticolor(draw.Rect(slot_27_31_0, slot_27_30_0, slot_27_32_0, slot_27_33_0), {
			apply_alpha(slot_27_16_0.color_left, slot_27_6_0),
			apply_alpha(slot_27_16_0.color_right, slot_27_6_0),
			apply_alpha(slot_27_16_0.color_right, slot_27_6_0),
			apply_alpha(slot_27_16_0.color_left, slot_27_6_0)
		}, slot_27_34_0, draw.Rounding.ALL)
		slot_27_1_0:AddRectFilledMulticolor(draw.Rect(slot_27_31_0 + 4 * slot_27_2_0, slot_27_33_0, slot_27_32_0 - 4 * slot_27_2_0, slot_27_33_0 + 1), {
			apply_alpha(slot_27_16_0.stripe_color_left, slot_27_6_0),
			apply_alpha(slot_27_16_0.stripe_color_right, slot_27_6_0),
			apply_alpha(slot_27_16_0.stripe_color_right, slot_27_6_0),
			apply_alpha(slot_27_16_0.stripe_color_left, slot_27_6_0)
		})

		slot_27_35_1 = slot_27_30_0 + slot_27_22_0
		slot_27_36_0 = (slot_27_3_0 - slot_27_17_0.x * slot_27_2_0) / 2

		slot_27_1_0:AddText(draw.Vec2(slot_27_36_0, slot_27_35_1), update.version, apply_alpha(slot_27_16_0.text_2_color, slot_27_6_0))

		slot_27_35_0 = slot_27_35_1 + slot_27_24_0 + slot_27_21_0

		for iter_27_2, iter_27_3 in ipairs(update.update_lines) do
			slot_27_43_0 = (slot_27_3_0 - slot_27_7_0:GetTextSize(iter_27_3).x * slot_27_2_0) / 2

			slot_27_1_0:AddText(draw.Vec2(slot_27_43_0, slot_27_35_0), iter_27_3, apply_alpha(slot_27_16_0.text_color, slot_27_6_0))

			slot_27_35_0 = slot_27_35_0 + slot_27_23_0

			if iter_27_2 < #update.update_lines then
				slot_27_35_0 = slot_27_35_0 + slot_27_21_0 / 2

				slot_27_1_0:AddRectFilled(draw.Rect(slot_27_31_0 + slot_27_11_0, slot_27_35_0 - slot_27_13_0 / 2, slot_27_32_0 - slot_27_11_0, slot_27_35_0 + slot_27_13_0 / 2), apply_alpha(slot_27_16_0.line_color, slot_27_6_0))

				slot_27_35_0 = slot_27_35_0 + slot_27_21_0 / 2
			end
		end
	end
end)

slot_0_0_0 = nil
slot_0_1_0 = {
	x = 19,
	y = 19
}
slot_0_2_0 = resource_path .. "/icons/heartS.png"
slot_0_3_0 = draw.texture(slot_0_2_0)

if slot_0_3_0 then
	slot_0_3_0:Create()

	slot_0_4_1 = slot_0_3_0:get_size()

	if slot_0_4_1.x > 0 and slot_0_4_1.y > 0 then
		slot_0_0_0 = slot_0_3_0
		draw.textures.PND_icon = slot_0_3_0
	else
		slot_0_0_0 = draw.textures.gui_icon_bug
		draw.textures.PND_icon = draw.textures.gui_icon_bug
	end
else
	slot_0_0_0 = draw.textures.gui_icon_bug
end

wnd = gui.GetMainWindow()
tab = wnd:AddTab("pnd_lua", draw.textures.PND_icon, "PND.lua", gui.TabLayoutMode.SUBTABS)
subtab_rage = tab:AddTab("pnd_rage", "Rage", gui.TabLayoutMode.DEFAULT, true)
subtab_misc = tab:AddTab("pnd_misc", "Misc", gui.TabLayoutMode.DEFAULT, false)
subtab_visuals = tab:AddTab("pnd_visuals", "Visuals", gui.TabLayoutMode.DEFAULT, false)
subtab_configs = tab:AddTab("pnd_configs", "Configs", gui.TabLayoutMode.DEFAULT, false)
jumpscout_group = gui.Group("rage_group1", "Jump Scout", 196, gui.GroupWidthMode.REDUCED)

subtab_rage:Add(jumpscout_group)

aimbot_group = gui.Group("rage_group2", "Aimbot", 140, gui.GroupWidthMode.REDUCED)
extrarage_group = gui.Group("rage_group3", "Extra", 84, gui.GroupWidthMode.REDUCED)
stack2_rage = gui.MakeStackedGroups("stack2_rage", draw.Vec2(226, 300), {
	aimbot_group,
	extrarage_group
})

subtab_rage:Add(stack2_rage)

antiaim_group = gui.Group("rage_group4", "Anti-aim", 112, gui.GroupWidthMode.REDUCED)

subtab_rage:Add(antiaim_group)
subtab_rage:Reset()
subtab_misc:Reset()
subtab_visuals:Reset()
subtab_configs:Reset()

cb_jump_scout = gui.Checkbox("cb_jump_scout")
row_jump_scout = gui.MakeControl("Jump Scout", cb_jump_scout)

jumpscout_group:Add(row_jump_scout)

sl_jump_hitchance = gui.Slider("sl_jump_hitchance", -1, 100, {
	"%.0f"
})
row_jump_hitchance = gui.MakeControl("Hitchance", sl_jump_hitchance)

jumpscout_group:Add(row_jump_hitchance)

sl_jump_pointscale = gui.Slider("sl_jump_pointscale", 0, 100, {
	"%.0f"
})
row_jump_pointscale = gui.MakeControl("Pointscale", sl_jump_pointscale)

jumpscout_group:Add(row_jump_pointscale)

cbx_jump_scout_autostop = gui.ComboBox("cbx_jump_scout_autostop")

cbx_jump_scout_autostop:Add(gui.Selectable("none_cbx_jump_scout_autostop", "None"))
cbx_jump_scout_autostop:Add(gui.Selectable("normal_cbx_jump_scout_autostop", "Normal"))
cbx_jump_scout_autostop:Add(gui.Selectable("high_cbx_jump_scout_autostop", "High"))

row_jump_scout_autostop = gui.MakeControl("Autostop", cbx_jump_scout_autostop)

jumpscout_group:Add(row_jump_scout_autostop)

cb_jump_better_autostop = gui.Checkbox("cb_jump_better_autostop")
row_jump_better_autostop = gui.MakeControl("Boost Autostop", cb_jump_better_autostop)
cb_jump_autostop_highest = gui.Checkbox("cb_jump_autostop_highest")
row_jump_autostop_highest = gui.MakeControl("Autostop at the Highest Point", cb_jump_autostop_highest)
cb_jump_stop_on_land = gui.Checkbox("cb_jump_stop_on_land")
row_jump_stop_on_land = gui.MakeControl("Stop on land", cb_jump_stop_on_land)
settings = gui.Settings("jump_scout_settings")

settings:Add(row_jump_better_autostop)
settings:Add(row_jump_autostop_highest)
settings:Add(row_jump_stop_on_land)
row_jump_scout_autostop:Add(settings)

cb_jump_only_head = gui.Checkbox("cb_jump_only_head")
row_jump_only_head = gui.MakeControl("Only Head", cb_jump_only_head)

jumpscout_group:Add(row_jump_only_head)

cb_jump_force_shoot = gui.Checkbox("cb_jump_force_shoot")
row_jump_force_shoot = gui.MakeControl("Force Shoot in Air", cb_jump_force_shoot)

jumpscout_group:Add(row_jump_force_shoot)

cb_animfix = gui.Checkbox("cb_animfix")
row_animfix = gui.MakeControl("Head Hitbox Correction", cb_animfix)

aimbot_group:Add(row_animfix)

cb_anti_aimpunch = gui.Checkbox("cb_anti_aimpunch")
row_anti_aimpunch = gui.MakeControl("Remove Aimpunch", cb_anti_aimpunch)

aimbot_group:Add(row_anti_aimpunch)

cb_accuracy_boost = gui.Checkbox("cb_accuracy_boost")
row_accuracy_boost = gui.MakeControl("Accuracy Boost", cb_accuracy_boost)

aimbot_group:Add(row_accuracy_boost)

cb_auto_force_shot = gui.Checkbox("cb_auto_force_shot")
row_auto_force_shot = gui.MakeControl("Auto Force shoot", cb_auto_force_shot)

aimbot_group:Add(row_auto_force_shot)

cb_dt_on_knife = gui.Checkbox("cb_dt_on_knife")
row_dt_on_knife = gui.MakeControl("DT on Knife", cb_dt_on_knife)

extrarage_group:Add(row_dt_on_knife)

cb_disable_m2_on_r8 = gui.Checkbox("cb_disable_m2_on_r8")
row_disable_m2_on_r8 = gui.MakeControl("Disable M2 on R8", cb_disable_m2_on_r8)

extrarage_group:Add(row_disable_m2_on_r8)

cb_freestands = gui.Checkbox("cb_freestands")
row_freestands = gui.MakeControl("Freestand", cb_freestands)

antiaim_group:Add(row_freestands)

cb_freestands_off_in_air = gui.Checkbox("cb_freestands_off_in_air")
row_freestands_off_in_air = gui.MakeControl("Turn off in Air", cb_freestands_off_in_air)
settings_freestands = gui.Settings("settings_freestands")

settings_freestands:Add(row_freestands_off_in_air)
row_freestands:Add(settings_freestands)

cb_fast_angles = gui.Checkbox("cb_fast_angles")
row_fast_angles = gui.MakeControl("Fast Angles", cb_fast_angles)

antiaim_group:Add(row_fast_angles)

cb_fast_ladder = gui.Checkbox("cb_fast_ladder")
row_fast_ladder = gui.MakeControl("Fast Ladder", cb_fast_ladder)

antiaim_group:Add(row_fast_ladder)

movement_group = gui.Group("misc_group1", "Movenent", 224, gui.GroupWidthMode.REDUCED)
network_group = gui.Group("misc_group2", "Network Performance Tweaks", 55, gui.GroupWidthMode.REDUCED)
grenades_group = gui.Group("misc_group3", "Grenades", 85, gui.GroupWidthMode.REDUCED)
stack1_misc = gui.MakeStackedGroups("stack1_misc", draw.Vec2(226, 600), {
	movement_group,
	network_group,
	grenades_group
})

subtab_misc:Add(stack1_misc)

hiteffects_group = gui.Group("misc_group4", "Hit Effects", 85, gui.GroupWidthMode.REDUCED)
extramisc_group = gui.Group("misc_group6", "Extra", 224, gui.GroupWidthMode.REDUCED)
stack2_misc = gui.MakeStackedGroups("stack2_misc", draw.Vec2(226, 600), {
	hiteffects_group,
	extramisc_group
})

subtab_misc:Add(stack2_misc)

spammers_group = gui.Group("misc_group8", "Spammers", 85, gui.GroupWidthMode.REDUCED)
grabbers_group = gui.Group("misc_group9", "Grabbers", 85, gui.GroupWidthMode.REDUCED)
player_group = gui.Group("misc_group10", "Player", 140, gui.GroupWidthMode.REDUCED)
stack3_misc = gui.MakeStackedGroups("stack3_misc", draw.Vec2(226, 600), {
	spammers_group,
	grabbers_group,
	player_group
})

subtab_misc:Add(stack3_misc)

cb_autostrafer = gui.Checkbox("cb_autostrafer")
row_autostrafer = gui.MakeControl("AutoStrafer++", cb_autostrafer)

movement_group:Add(row_autostrafer)

cb_smart_jump_bug = gui.Checkbox("cb_smart_jump_bug")
row_smart_jump_bug = gui.MakeControl("Smart Jumpbug", cb_smart_jump_bug)

movement_group:Add(row_smart_jump_bug)

cb_no_fall = gui.Checkbox("cb_no_fall")
row_no_fall = gui.MakeControl("NoFall", cb_no_fall)

movement_group:Add(row_no_fall)

cb_height_advantage = gui.Checkbox("cb_height_advantage")
row_height_advantage = gui.MakeControl("Height Advantage", cb_height_advantage)

movement_group:Add(row_height_advantage)

cb_fast_stop_in_air = gui.Checkbox("cb_fast_stop_in_air")
row_fast_stop_in_air = gui.MakeControl("Fast Stop in Air", cb_fast_stop_in_air)

movement_group:Add(row_fast_stop_in_air)

cb_avoid_collisions = gui.Checkbox("cb_avoid_collisions")
row_avoid_collisions = gui.MakeControl("Avoid Collisions", cb_avoid_collisions)

movement_group:Add(row_avoid_collisions)

settings = gui.Settings("avoid_collisions_settings")
sl_avoid_collisions_air = gui.Slider("sl_avoid_collisions_air", 10, 60, {
	"%.0f"
})
row_avoid_collisions_air = gui.MakeControl("Radius Air", sl_avoid_collisions_air)

sl_avoid_collisions_air:GetValue():Set(36)

sl_avoid_collisions_ground = gui.Slider("sl_avoid_collisions_ground", 10, 60, {
	"%.0f"
})
row_avoid_collisions_ground = gui.MakeControl("Radius Ground", sl_avoid_collisions_ground)

sl_avoid_collisions_ground:GetValue():Set(24)
row_avoid_collisions:Add(settings)
settings:Add(row_avoid_collisions_air)
settings:Add(row_avoid_collisions_ground)

cb_crouch_in_air = gui.Checkbox("cb_crouch_in_air")
row_crouch_in_air = gui.MakeControl("Crouch in Air", cb_crouch_in_air)
settings_crouch_in_air = gui.Settings("settings_crouch_in_air")
cb_only_when_jump = gui.Checkbox("cb_only_when_jump")
row_only_when_jump = gui.MakeControl("Only when pressing jump", cb_only_when_jump)

settings_crouch_in_air:Add(row_only_when_jump)
row_crouch_in_air:Add(settings_crouch_in_air)
movement_group:Add(row_crouch_in_air)

cbx_network_mode = gui.ComboBox("cbx_network_mode")

cbx_network_mode:Add(gui.Selectable("off_cbx_network_mode", "Off"))
cbx_network_mode:Add(gui.Selectable("auto_cbx_network_mode", "Auto"))
cbx_network_mode:Add(gui.Selectable("fastest_cbx_network_mode", "Fastest"))
cbx_network_mode:Add(gui.Selectable("fast_cbx_network_mode", "Fast"))
cbx_network_mode:Add(gui.Selectable("balanced_cbx_network_mode", "Balanced"))
cbx_network_mode:Add(gui.Selectable("stable_cbx_network_mode", "Stable"))
cbx_network_mode:Add(gui.Selectable("very_stable_cbx_network_mode", "Very Stable"))
cbx_network_mode:Add(gui.Selectable("maximum_cbx_network_mode", "Maximum"))

row_network_mode = gui.MakeControl("Network Mode", cbx_network_mode)

network_group:Add(row_network_mode)

cb_fast_grenade = gui.Checkbox("cb_fast_grenade")
row_fast_grenade = gui.MakeControl("Fast Grenade", cb_fast_grenade)

grenades_group:Add(row_fast_grenade)

cbx_grenade_fix = gui.ComboBox("cbx_grenade_fix")

cbx_grenade_fix:Add(gui.Selectable("none_cbx_grenade_fix", "None"))
cbx_grenade_fix:Add(gui.Selectable("fast_cbx_grenade_fix", "Fast"))
cbx_grenade_fix:Add(gui.Selectable("medium_cbx_grenade_fix", "Medium"))
cbx_grenade_fix:Add(gui.Selectable("slow_cbx_grenade_fix", "Slow"))

row_grenade_fix = gui.MakeControl("Grenade Fix", cbx_grenade_fix)

grenades_group:Add(row_grenade_fix)

cbx_hitsounds = gui.ComboBox("cbx_hitsounds")

cbx_hitsounds:Add(gui.Selectable("1_cbx_hitsounds", "None"))
cbx_hitsounds:Add(gui.Selectable("2_cbx_hitsounds", "Agpa1"))
cbx_hitsounds:Add(gui.Selectable("3_cbx_hitsounds", "Beep"))
cbx_hitsounds:Add(gui.Selectable("4_cbx_hitsounds", "Bubble"))
cbx_hitsounds:Add(gui.Selectable("5_cbx_hitsounds", "Chime"))
cbx_hitsounds:Add(gui.Selectable("6_cbx_hitsounds", "Cookie"))
cbx_hitsounds:Add(gui.Selectable("7_cbx_hitsounds", "Copperbell"))
cbx_hitsounds:Add(gui.Selectable("8_cbx_hitsounds", "Cute"))
cbx_hitsounds:Add(gui.Selectable("9_cbx_hitsounds", "DSR-1"))
cbx_hitsounds:Add(gui.Selectable("10_cbx_hitsounds", "Light"))
cbx_hitsounds:Add(gui.Selectable("11_cbx_hitsounds", "Mcbow"))
cbx_hitsounds:Add(gui.Selectable("12_cbx_hitsounds", "Minecraft"))
cbx_hitsounds:Add(gui.Selectable("13_cbx_hitsounds", "Neverlose"))
cbx_hitsounds:Add(gui.Selectable("14_cbx_hitsounds", "Primordial"))
cbx_hitsounds:Add(gui.Selectable("15_cbx_hitsounds", "Rust Headshot"))
cbx_hitsounds:Add(gui.Selectable("16_cbx_hitsounds", "Stomp"))

row_hitsounds = gui.MakeControl("Hitsound", cbx_hitsounds)
settings_hitsound = gui.Settings("settings_hitsound")
sl_volume_hit = gui.Slider("sl_volume_hit", 1, 200, {
	"%.0f%%"
})
row_volume_hit = gui.MakeControl("Volume", sl_volume_hit)

sl_volume_hit:GetValue():Set(50)
settings_hitsound:Add(row_volume_hit)
row_hitsounds:Add(settings_hitsound)
hiteffects_group:Add(row_hitsounds)

cbx_killsounds = gui.ComboBox("cbx_killsounds")

cbx_killsounds:Add(gui.Selectable("1_cbx_killsounds", "None"))
cbx_killsounds:Add(gui.Selectable("2_cbx_killsounds", "Agpa1"))
cbx_killsounds:Add(gui.Selectable("3_cbx_killsounds", "Beep"))
cbx_killsounds:Add(gui.Selectable("4_cbx_killsounds", "Bubble"))
cbx_killsounds:Add(gui.Selectable("5_cbx_killsounds", "Chime"))
cbx_killsounds:Add(gui.Selectable("6_cbx_killsounds", "Cookie"))
cbx_killsounds:Add(gui.Selectable("7_cbx_killsounds", "Copperbell"))
cbx_killsounds:Add(gui.Selectable("8_cbx_killsounds", "Cute"))
cbx_killsounds:Add(gui.Selectable("9_cbx_killsounds", "DSR-1"))
cbx_killsounds:Add(gui.Selectable("10_cbx_killsounds", "Light"))
cbx_killsounds:Add(gui.Selectable("11_cbx_killsounds", "Mcbow"))
cbx_killsounds:Add(gui.Selectable("12_cbx_killsounds", "Minecraft"))
cbx_killsounds:Add(gui.Selectable("13_cbx_killsounds", "Neverlose"))
cbx_killsounds:Add(gui.Selectable("14_cbx_killsounds", "Primordial"))
cbx_killsounds:Add(gui.Selectable("15_cbx_killsounds", "Rust Headshot"))
cbx_killsounds:Add(gui.Selectable("16_cbx_killsounds", "Stomp"))

row_killsounds = gui.MakeControl("Killsound", cbx_killsounds)
settings_killsound = gui.Settings("settings_killsound")
sl_volume_kill = gui.Slider("sl_volume_kill", 1, 200, {
	"%.0f%%"
})
row_volume_kill = gui.MakeControl("Volume", sl_volume_kill)

sl_volume_kill:GetValue():Set(50)
settings_killsound:Add(row_volume_kill)
row_killsounds:Add(settings_killsound)
hiteffects_group:Add(row_killsounds)

cb_blockbot = gui.Checkbox("cb_blockbot")
row_blockbot = gui.MakeControl("Block Bot Over Head", cb_blockbot)

extramisc_group:Add(row_blockbot)

blockbot_settings = gui.Settings("blockbot_settings")
cb_blockbot_crouch = gui.Checkbox("cb_blockbot_crouch")
row_blockbot_crouch = gui.MakeControl("Crouch in Jump", cb_blockbot_crouch)

blockbot_settings:Add(row_blockbot_crouch)
row_blockbot:Add(blockbot_settings)

cb_auto_disconnect = gui.Checkbox("cb_auto_disconnect")
row_auto_disconnect = gui.MakeControl("Auto Disconnect", cb_auto_disconnect)

extramisc_group:Add(row_auto_disconnect)

cb_auto_drop_items = gui.Checkbox("cb_auto_drop_items")
row_auto_drop_items = gui.MakeControl("Drop After Match", cb_auto_drop_items)

extramisc_group:Add(row_auto_drop_items)

cb_clean_console = gui.Checkbox("cb_clean_console")
row_clean_console = gui.MakeControl("Console Filter", cb_clean_console)

extramisc_group:Add(row_clean_console)

cb_focus_cs2 = gui.Checkbox("cb_focus_cs2")
row_focus_cs2 = gui.MakeControl("Focus CS2", cb_focus_cs2)

extramisc_group:Add(row_focus_cs2)

cb_anti_afk = gui.Checkbox("cb_anti_afk")
row_anti_afk = gui.MakeControl("Anti-Afk", cb_anti_afk)

extramisc_group:Add(row_anti_afk)

cb_quick_plant = gui.Checkbox("cb_quick_plant")
row_quick_plant = gui.MakeControl("Equip Bomb At Plent", cb_quick_plant)

extramisc_group:Add(row_quick_plant)

cbx_trash_talk = gui.ComboBox("cbx_trash_talk")

cbx_trash_talk:Add(gui.Selectable("1_cbx_trash_talk", "None"))
cbx_trash_talk:Add(gui.Selectable("2_cbx_trash_talk", "SEX TALK EBANI"))
cbx_trash_talk:Add(gui.Selectable("3_cbx_trash_talk", "1"))
cbx_trash_talk:Add(gui.Selectable("4_cbx_trash_talk", "#skeet"))
cbx_trash_talk:Add(gui.Selectable("5_cbx_trash_talk", "neverlose"))
cbx_trash_talk:Add(gui.Selectable("6_cbx_trash_talk", "nixware"))
cbx_trash_talk:Add(gui.Selectable("7_cbx_trash_talk", "hvh"))
cbx_trash_talk:Add(gui.Selectable("8_cbx_trash_talk", "fa7ality"))
cbx_trash_talk:Add(gui.Selectable("9_cbx_trash_talk", "Nyashka"))
cbx_trash_talk:Add(gui.Selectable("10_cbx_trash_talk", "Dindra"))
cbx_trash_talk:Add(gui.Selectable("11_cbx_trash_talk", "1000-7"))
cbx_trash_talk:Add(gui.Selectable("12_cbx_trash_talk", "ha4"))

row_trash_talk = gui.MakeControl("TrashTalk", cbx_trash_talk)

spammers_group:Add(row_trash_talk)

btn_message_pnd = gui.Button("btn_message_pnd", "Send Messages")
row_message_pnd = gui.MakeControl("Message PND", btn_message_pnd)

spammers_group:Add(row_message_pnd)

btn_ip_grabber = gui.Button("btn_ip_grabber", "Get Net Address")
row_ip_grabber = gui.MakeControl("IP Grabber", btn_ip_grabber)

grabbers_group:Add(row_ip_grabber)

cb_awp_grabber = gui.Checkbox("cb_awp_grabber")
row_awp_grabber = gui.MakeControl("AWP Grabber", cb_awp_grabber)

grabbers_group:Add(row_awp_grabber)

cbx_clantags = gui.ComboBox("cbx_clantags")

cbx_clantags:Add(gui.Selectable("1_cbx_clantags", "None"))
cbx_clantags:Add(gui.Selectable("2_cbx_clantags", "PND"))
cbx_clantags:Add(gui.Selectable("3_cbx_clantags", "lunox"))
cbx_clantags:Add(gui.Selectable("4_cbx_clantags", "Dream"))
cbx_clantags:Add(gui.Selectable("5_cbx_clantags", "morigyaru"))
cbx_clantags:Add(gui.Selectable("6_cbx_clantags", "gamesense"))
cbx_clantags:Add(gui.Selectable("7_cbx_clantags", "memesense"))
cbx_clantags:Add(gui.Selectable("8_cbx_clantags", "monolith"))
cbx_clantags:Add(gui.Selectable("9_cbx_clantags", "1000-7"))
cbx_clantags:Add(gui.Selectable("10_cbx_clantags", "xantarespeek"))

settings_clantags = gui.Settings("settings_clantags")
txt_clantags = gui.TextInput("txt_clantags")
txt_clantags.placeholder = "Monolith UID"
row_uid = gui.MakeControl("UID", txt_clantags)

settings_clantags:Add(row_uid)

row_clantags = gui.MakeControl("Clantags", cbx_clantags)

row_clantags:Add(settings_clantags)
player_group:Add(row_clantags)

cbx_auto_team = gui.ComboBox("cbx_auto_team")

cbx_auto_team:Add(gui.Selectable("1_cbx_auto_team", "None"))
cbx_auto_team:Add(gui.Selectable("2_cbx_auto_team", "Counter-Terrorist"))
cbx_auto_team:Add(gui.Selectable("3_cbx_auto_team", "Terrorist"))

row_clantags = gui.MakeControl("Auto Team", cbx_auto_team)

player_group:Add(row_clantags)

btn_kill_yourself = gui.Button("btn_kill_yourself", "Kill Yourself")
row_kill_yourself = gui.MakeControl("Player Death", btn_kill_yourself)

player_group:Add(row_kill_yourself)

cb_auto_kick = gui.Checkbox("cb_auto_kick")
row_auto_kick = gui.MakeControl("Auto Kick", cb_auto_kick)

player_group:Add(row_auto_kick)

if build == "alpha" then
	cb_ghost = gui.Checkbox("cb_ghost")
	row_ghost = gui.MakeControl("Ghost Exploit", cb_ghost)

	player_group:Add(row_ghost)
end

local_group = gui.Group("visuals_group1", "Local", 196, gui.GroupWidthMode.REDUCED)

subtab_visuals:Add(local_group)

world_group = gui.Group("visuals_group2", "World", 140, gui.GroupWidthMode.REDUCED)

subtab_visuals:Add(world_group)

screen_group = gui.Group("visuals_group3", "Screen", 192, gui.GroupWidthMode.REDUCED)

subtab_visuals:Add(screen_group)

cb_transparent_arms = gui.Checkbox("cb_transparent_arms")
row_transparent_arms = gui.MakeControl("Transparent Arms", cb_transparent_arms)

local_group:Add(row_transparent_arms)

cb_viewmodel_hit_effect = gui.Checkbox("cb_viewmodel_hit_effect")
row_viewmodel_hit_effect = gui.MakeControl("Viewmodel Hit Effect", cb_viewmodel_hit_effect)

local_group:Add(row_viewmodel_hit_effect)

cb_smooth_return = gui.Checkbox("cb_smooth_return")
row_smooth_return = gui.MakeControl("Smooth Viewmodel Return", cb_smooth_return)
settings_viewmodel = gui.Settings("settings_viewmodel")

settings_viewmodel:Add(row_smooth_return)
row_viewmodel_hit_effect:Add(settings_viewmodel)

cb_fd_animation = gui.Checkbox("cb_fd_animation")
row_fd_animation = gui.MakeControl("Fake Duck Animation", cb_fd_animation)

local_group:Add(row_fd_animation)

cb_transparency = gui.Checkbox("cb_transparency")
row_transparency = gui.MakeControl("Transparency", cb_transparency)

local_group:Add(row_transparency)

cbx_transparency_mode = gui.ComboBox("cbx_transparency_mode")

cbx_transparency_mode:Add(gui.Selectable("1_cbx_transparency_mode", "Flat"))
cbx_transparency_mode:Add(gui.Selectable("2_cbx_transparency_mode", "Shaded"))
cbx_transparency_mode:Add(gui.Selectable("3_cbx_transparency_mode", "Glow"))
cbx_transparency_mode:Add(gui.Selectable("4_cbx_transparency_mode", "Metallic"))
cbx_transparency_mode:Add(gui.Selectable("5_cbx_transparency_mode", "Latex"))

row_transparency_mode = gui.MakeControl("Mode", cbx_transparency_mode)
cbx_transparency_enable = gui.ComboBox("cbx_transparency_enable")
cbx_transparency_enable.allowMultiple = true

cbx_transparency_enable:Add(gui.Selectable("1_cbx_transparency_enable", "Scope"))
cbx_transparency_enable:Add(gui.Selectable("2_cbx_transparency_enable", "Grenade"))

row_transparency_enable = gui.MakeControl("Enable", cbx_transparency_enable)
clr_with_scope_color = gui.ColorPicker("clr_with_scope_color")
row_with_scope_color = gui.MakeControl("With Scope", clr_with_scope_color)
clr_with_grenade_color = gui.ColorPicker("clr_with_grenade_color")
row_with_grenade_color = gui.MakeControl("With Grenades", clr_with_grenade_color)
settings_transparency = gui.Settings("settings_transparency")

settings_transparency:Add(row_transparency_mode)
settings_transparency:Add(row_transparency_enable)
settings_transparency:Add(row_with_scope_color)
settings_transparency:Add(row_with_grenade_color)
row_transparency:Add(settings_transparency)

cb_debounce_zoom = gui.Checkbox("cb_debounce_zoom")
row_debounce_zoom = gui.MakeControl("Debounce Zoom", cb_debounce_zoom)

local_group:Add(row_debounce_zoom)

cb_animation_break = gui.Checkbox("cb_animation_break")
row_animation_break = gui.MakeControl("Animation Break", cb_animation_break)

local_group:Add(row_animation_break)

cb_animation_spin = gui.Checkbox("cb_animation_spin")
row_animation_spin = gui.MakeControl("Spin", cb_animation_spin)
sl_animation_x = gui.Slider("sl_animation_x", -180, 180, {
	"%.0f"
})
row_animation_x = gui.MakeControl("X", sl_animation_x)
sl_animation_y = gui.Slider("sl_animation_y", -180, 180, {
	"%.0f"
})
row_animation_y = gui.MakeControl("Y", sl_animation_y)
sl_animation_z = gui.Slider("sl_animation_z", -180, 180, {
	"%.0f"
})
row_animation_z = gui.MakeControl("Z", sl_animation_z)
settings_animation = gui.Settings("settings_animation")

settings_animation:Add(row_animation_spin)
settings_animation:Add(row_animation_x)
settings_animation:Add(row_animation_y)
settings_animation:Add(row_animation_z)
row_animation_break:Add(settings_animation)

cb_trails = gui.Checkbox("cb_trails")
row_trails = gui.MakeControl("Trails", cb_trails)

world_group:Add(row_trails)

settings_trails = gui.Settings("settings_trails")
cbx_trails_type = gui.ComboBox("cbx_trails_type")

cbx_trails_type:Add(gui.Selectable("1_cbx_trails", "Circle"))
cbx_trails_type:Add(gui.Selectable("2_cbx_trails", "Line"))
cbx_trails_type:Add(gui.Selectable("3_cbx_trails", "Fog"))

row_type = gui.MakeControl("Type", cbx_trails_type)

settings_trails:Add(row_type)

sl_lifetime = gui.Slider("sl_lifetime", 1, 10, {
	"%.0f"
})
row_lifetime = gui.MakeControl("Lifetime", sl_lifetime)

settings_trails:Add(row_lifetime)

sl_radius = gui.Slider("sl_radius", 1, 50, {
	"%.0f"
})
row_radius = gui.MakeControl("Radius", sl_radius)

settings_trails:Add(row_radius)

sl_interval = gui.Slider("sl_interval", 1, 10000, {
	"%.0f"
})
row_interval = gui.MakeControl("Interval", sl_interval)

settings_trails:Add(row_interval)

clr_circle_color = gui.ColorPicker("clr_circle_color")
row_circle_color = gui.MakeControl("Color", clr_circle_color)

settings_trails:Add(row_circle_color)

cb_rainbow_effect = gui.Checkbox("cb_rainbow_effect")
row_rainbow_effect = gui.MakeControl("Rainbow Effect", cb_rainbow_effect)

settings_trails:Add(row_rainbow_effect)
row_trails:Add(settings_trails)
sl_lifetime:GetValue():Set(1)
sl_radius:GetValue():Set(4)
clr_circle_color:GetValue():Set(draw.Color(255, 255, 255, 255))

sl_gamma = gui.Slider("sl_gamma", 10, 40, {
	"%.0f"
})
row_gamma = gui.MakeControl("Gamma", sl_gamma)

world_group:Add(row_gamma)
sl_gamma:GetValue():Set(24)

cb_turn_off_shadow = gui.Checkbox("cb_turn_off_shadow")
row_turn_off_shadow = gui.MakeControl("Disable Shadows", cb_turn_off_shadow)

world_group:Add(row_turn_off_shadow)

cbx_hitmarkers = gui.ComboBox("cbx_hitmarkers")
cbx_hitmarkers.allowMultiple = true

cbx_hitmarkers:Add(gui.Selectable("1_cbx_hitmarkers", "Star (Hit)"))
cbx_hitmarkers:Add(gui.Selectable("2_cbx_hitmarkers", "Neverlose (Hit)"))
cbx_hitmarkers:Add(gui.Selectable("3_cbx_hitmarkers", "Neverlose (Damage)"))
cbx_hitmarkers:Add(gui.Selectable("4_cbx_hitmarkers", "Particles (Hit)"))

row_hitmarkers = gui.MakeControl("Hitmarker", cbx_hitmarkers)

world_group:Add(row_hitmarkers)

settings_hitmarkers = gui.Settings("settings_hitmarkers")
sl_hitmarkers_lifetime = gui.Slider("sl_hitmarkers_lifetime", 1, 100, {
	"%.0f"
})
row_hitmarkers_lifetime = gui.MakeControl("Lifetime", sl_hitmarkers_lifetime)

settings_hitmarkers:Add(row_hitmarkers_lifetime)

clr_hitmarkers_color = gui.ColorPicker("clr_hitmarkers_color")
row_hitmarkers_color = gui.MakeControl("Color", clr_hitmarkers_color)

settings_hitmarkers:Add(row_hitmarkers_color)
row_hitmarkers:Add(settings_hitmarkers)
sl_hitmarkers_lifetime:GetValue():Set(30)
clr_hitmarkers_color:GetValue():Set(draw.Color(255, 255, 255, 255))

cb_effect_on_menu = gui.Checkbox("cb_effect_on_menu")
row_effect_on_menu = gui.MakeControl("Menu Effect", cb_effect_on_menu)
settings_effect_menu = gui.Settings("settings_effect_menu")
cbx_effect_on_menu_type = gui.ComboBox("cbx_effect_on_menu_type")

cbx_effect_on_menu_type:Add(gui.Selectable("1_cbx_effect_on_menu", "Blur"))
cbx_effect_on_menu_type:Add(gui.Selectable("2_cbx_effect_on_menu", "Pixelation"))
cbx_effect_on_menu_type:Add(gui.Selectable("3_cbx_effect_on_menu", "Starfield"))

row_type = gui.MakeControl("Type", cbx_effect_on_menu_type)

settings_effect_menu:Add(row_type)

cb_always_effect_on_menu = gui.Checkbox("cb_always_effect_on_menu")
row_always_effect_on_menu = gui.MakeControl("Always", cb_always_effect_on_menu)

settings_effect_menu:Add(row_always_effect_on_menu)
row_effect_on_menu:Add(settings_effect_menu)
screen_group:Add(row_effect_on_menu)

cb_screen_logs = gui.Checkbox("cb_screen_logs")
row_screen_logs = gui.MakeControl("Logs", cb_screen_logs)

screen_group:Add(row_screen_logs)

cbx_screen_logs_type = gui.ComboBox("cbx_screen_logs_type")

cbx_screen_logs_type:Add(gui.Selectable("1_cbx_screen_logs", "skeet"))
cbx_screen_logs_type:Add(gui.Selectable("2_cbx_screen_logs", "neverlose"))
cbx_screen_logs_type:Add(gui.Selectable("3_cbx_screen_logs", "fatality"))

row_screen_logs_type = gui.MakeControl("Type", cbx_screen_logs_type)
sl_screen_logs_lifetime = gui.Slider("sl_screen_logs_lifetime", 1, 100, {
	"%.0f"
})
row_screen_logs_lifetime = gui.MakeControl("Lifetime", sl_screen_logs_lifetime)
clr_screen_logs_color = gui.ColorPicker("clr_screen_logs_color")
row_screen_logs_color = gui.MakeControl("Color Hit", clr_screen_logs_color)
clr_screen_logs_color_hurt = gui.ColorPicker("clr_screen_logs_color_hurt")
row_screen_logs_color_hurt = gui.MakeControl("Color Hurt", clr_screen_logs_color_hurt)
settings_screen_logs = gui.Settings("settings_screen_logs")

settings_screen_logs:Add(row_screen_logs_type)
settings_screen_logs:Add(row_screen_logs_lifetime)
settings_screen_logs:Add(row_screen_logs_color)
settings_screen_logs:Add(row_screen_logs_color_hurt)
row_screen_logs:Add(settings_screen_logs)
sl_screen_logs_lifetime:GetValue():Set(30)
clr_screen_logs_color:GetValue():Set(draw.Color(124, 195, 13, 255))
clr_screen_logs_color_hurt:GetValue():Set(draw.Color(215, 54, 93, 255))

cb_watermark = gui.Checkbox("cb_watermark")
row_watermark = gui.MakeControl("Watermark", cb_watermark)

screen_group:Add(row_watermark)

settings_watermark = gui.Settings("settings_watermark")
cb_watermark_icon = gui.Checkbox("cb_watermark_icon")
row_watermark_icon = gui.MakeControl("Icon", cb_watermark_icon)
cbx_watermark_show = gui.ComboBox("cbx_watermark_show")
cbx_watermark_show.allowMultiple = true

cbx_watermark_show:Add(gui.Selectable("1_cbx_watermark_show", "Username"))
cbx_watermark_show:Add(gui.Selectable("2_cbx_watermark_show", "FPS"))
cbx_watermark_show:Add(gui.Selectable("3_cbx_watermark_show", "Ping"))
cbx_watermark_show:Add(gui.Selectable("4_cbx_watermark_show", "Time"))
cbx_watermark_show:Add(gui.Selectable("5_cbx_watermark_show", "Map"))
cbx_watermark_show:Add(gui.Selectable("6_cbx_watermark_show", "Elapsed Time"))
cbx_watermark_show:Add(gui.Selectable("7_cbx_watermark_show", "Server IP"))

row_watermark_show = gui.MakeControl("Shows", cbx_watermark_show)
cb_watermark_tag = gui.Checkbox("cb_watermark_tag")
row_watermark_tag = gui.MakeControl("Username Tag", cb_watermark_tag)
cb_watermark_low_fps = gui.Checkbox("cb_watermark_low_fps")
row_watermark_low_fps = gui.MakeControl("0.1% Low FPS", cb_watermark_low_fps)

settings_watermark:Add(row_watermark_icon)
settings_watermark:Add(row_watermark_show)
settings_watermark:Add(row_watermark_tag)
settings_watermark:Add(row_watermark_low_fps)
row_watermark:Add(settings_watermark)

cb_arrows = gui.Checkbox("cb_arrows")
row_arrows = gui.MakeControl("Out Of Field", cb_arrows)

screen_group:Add(row_arrows)

settings_arrows = gui.Settings("settings_arrows")
cbx_arrows_type = gui.ComboBox("cbx_arrows_type")

cbx_arrows_type:Add(gui.Selectable("1_cbx_arrows", "Arrow"))
cbx_arrows_type:Add(gui.Selectable("2_cbx_arrows", "Neverlose"))

row_arrows_type = gui.MakeControl("Type", cbx_arrows_type)
sl_arrow_size = gui.Slider("sl_arrow_size", 4, 20, {
	"%.0f"
})
row_arrow_size = gui.MakeControl("Size", sl_arrow_size)

sl_arrow_size:GetValue():Set(10)

sl_arrows_radius = gui.Slider("sl_arrows_radius", 20, 500, {
	"%.0f"
})
row_arrows_radius = gui.MakeControl("Radius", sl_arrows_radius)

sl_arrows_radius:GetValue():Set(200)

cb_arrow_pulse = gui.Checkbox("cb_arrow_pulse")
row_arrow_pulse = gui.MakeControl("Pulse", cb_arrow_pulse)
clr_arrows_color = gui.ColorPicker("clr_arrows_color")
row_arrows_color = gui.MakeControl("Color", clr_arrows_color)

clr_arrows_color:GetValue():Set(draw.Color(255, 255, 255, 130))
settings_arrows:Add(row_arrows_type)
settings_arrows:Add(row_arrow_size)
settings_arrows:Add(row_arrows_radius)
settings_arrows:Add(row_arrow_pulse)
settings_arrows:Add(row_arrows_color)
row_arrows:Add(settings_arrows)

cb_manuals = gui.Checkbox("cb_manuals")
row_manuals = gui.MakeControl("Manuals", cb_manuals)

screen_group:Add(row_manuals)

settings_manuals = gui.Settings("settings_manuals")
cbx_manuals_type = gui.ComboBox("cbx_manuals_type")

cbx_manuals_type:Add(gui.Selectable("1_cbx_manuals", "Triangle"))
cbx_manuals_type:Add(gui.Selectable("2_cbx_manuals", "Arrow"))
cbx_manuals_type:Add(gui.Selectable("3_cbx_manuals", "Circle"))
cbx_manuals_type:Add(gui.Selectable("4_cbx_manuals", "Neverlose"))
cbx_manuals_type:Add(gui.Selectable("5_cbx_manuals", "Gamesense"))

row_manuals_type = gui.MakeControl("Type", cbx_manuals_type)
sl_manuals_size = gui.Slider("sl_manuals_size", 4, 20, {
	"%.0f"
})
row_manuals_size = gui.MakeControl("Size", sl_manuals_size)

sl_manuals_size:GetValue():Set(10)

sl_manuals_radius = gui.Slider("sl_manuals_radius", 10, 500, {
	"%.0f"
})
row_manuals_radius = gui.MakeControl("Radius", sl_manuals_radius)

sl_manuals_radius:GetValue():Set(80)

clr_manuals_color = gui.ColorPicker("clr_manuals_color")
row_manuals_color = gui.MakeControl("Color", clr_manuals_color)

clr_manuals_color:GetValue():Set(draw.Color(255, 255, 255, 255))
settings_manuals:Add(row_manuals_type)
settings_manuals:Add(row_manuals_size)
settings_manuals:Add(row_manuals_radius)
settings_manuals:Add(row_manuals_color)
row_manuals:Add(settings_manuals)

cb_synchronization = gui.Checkbox("cb_synchronization")
row_synchronization = gui.MakeControl("Synchronization", cb_synchronization)

screen_group:Add(row_synchronization)
cb_synchronization:SetValue(true)

configs_folder = "fatality/PND/configs"

utils.FileCreateDirectories(configs_folder)
ffi.cdef("typedef void* HANDLE;\ntypedef void* HWND;\ntypedef const char* LPCSTR;\ntypedef unsigned long DWORD;\ntypedef int BOOL;\ntypedef void* LPVOID;\ntypedef const void* LPCVOID;\ntypedef void* LPSECURITY_ATTRIBUTES;\ntypedef int INT;\n\ntypedef struct {\n    DWORD dwLowDateTime;\n    DWORD dwHighDateTime;\n} FILETIME;\n\ntypedef struct {\n    DWORD dwFileAttributes;\n    FILETIME ftCreationTime;\n    FILETIME ftLastAccessTime;    FILETIME ftLastWriteTime;\n    DWORD nFileSizeHigh;\n    DWORD nFileSizeLow;\n    DWORD dwReserved0;\n    DWORD dwReserved1;\n    char cFileName[260];\n    char cAlternateFileName[14];\n} WIN32_FIND_DATAA;\n\nHANDLE __stdcall FindFirstFileA(const char* lpFileName, WIN32_FIND_DATAA* lpFindFileData);\nint __stdcall FindNextFileA(HANDLE hFindFile, WIN32_FIND_DATAA* lpFindFileData);\nint __stdcall FindClose(HANDLE hFindFile);\n\nDWORD __stdcall GetCurrentDirectoryA(\n    DWORD nBufferLength,\n    char* lpBuffer\n);\n\nINT __stdcall ShellExecuteA(\n    HWND hwnd,\n    LPCSTR lpOperation,\n    LPCSTR lpFile,\n    LPCSTR lpParameters,\n    LPCSTR lpDirectory,\n    INT nShowCmd\n);\n\nBOOL __stdcall CreateDirectoryA(\n    const char* lpPathName,\n    LPSECURITY_ATTRIBUTES lpSecurityAttributes\n);\n")

GetCurrentDirectoryA = ffi.cast("DWORD(__stdcall*)(DWORD, char*)", utils.FindExport("kernel32.dll", "GetCurrentDirectoryA"))
FindFirstFileA = ffi.cast("HANDLE(__stdcall*)(const char*, WIN32_FIND_DATAA*)", utils.FindExport("kernel32.dll", "FindFirstFileA"))
FindNextFileA = ffi.cast("int(__stdcall*)(HANDLE, WIN32_FIND_DATAA*)", utils.FindExport("kernel32.dll", "FindNextFileA"))
FindClose = ffi.cast("int(__stdcall*)(HANDLE)", utils.FindExport("kernel32.dll", "FindClose"))
CreateDirectoryA = ffi.cast("BOOL(__stdcall*)(const char*, void*)", utils.FindExport("kernel32.dll", "CreateDirectoryA"))
ShellExecuteA = ffi.cast("INT(__stdcall*)(HWND, LPCSTR, LPCSTR, LPCSTR, LPCSTR, INT)", utils.FindExport("shell32.dll", "ShellExecuteA"))
INVALID_HANDLE = ffi.cast("HANDLE", -1)
SW_SHOW = 5
MAX_PATH = 260

function get_full_path(arg_31_0)
	local var_31_0 = ffi.new("char[?]", MAX_PATH)
	local var_31_1 = GetCurrentDirectoryA(MAX_PATH, var_31_0)

	if var_31_1 > 0 and var_31_1 <= MAX_PATH then
		local var_31_2 = ffi.string(var_31_0, var_31_1)
		local var_31_3 = {}

		for iter_31_0 in string.gmatch(var_31_2, "[^\\]+") do
			table.insert(var_31_3, iter_31_0)
		end

		table.remove(var_31_3)
		table.remove(var_31_3)

		local var_31_4 = table.concat(var_31_3, "\\")
		local var_31_5 = string.gsub(arg_31_0, "/", "\\")

		return var_31_4 .. "\\csgo\\" .. var_31_5
	else
		return arg_31_0
	end
end

function get_pnd_files(arg_32_0)
	local var_32_0 = {}
	local var_32_1 = ("..\\..\\csgo\\" .. string.gsub(arg_32_0, "/", "\\")) .. "\\*.pnd"
	local var_32_2 = ffi.new("WIN32_FIND_DATAA")
	local var_32_3 = FindFirstFileA(var_32_1, var_32_2)

	if var_32_3 ~= INVALID_HANDLE then
		repeat
			local var_32_4 = ffi.string(var_32_2.cFileName)

			if var_32_4 ~= "." and var_32_4 ~= ".." then
				table.insert(var_32_0, var_32_4)
			end
		until FindNextFileA(var_32_3, var_32_2) == 0

		FindClose(var_32_3)
	end

	return var_32_0
end

last_file_count = 0
last_update_time = 0
current_items = {}
group1_configs = gui.Group("configs_group1", "Display", 194, gui.GroupWidthMode.REDUCED)

subtab_configs:Add(group1_configs)

group2_configs = gui.Group("configs_group2", "Buttons", 126, gui.GroupWidthMode.REDUCED)

subtab_configs:Add(group2_configs)

group3_configs = gui.Group("configs_group3", "Info", 134, gui.GroupWidthMode.REDUCED)

subtab_configs:Add(group3_configs)

function get_dpi_settings(arg_33_0)
	local var_33_0 = {
		[0.5] = {
			offset2 = -4,
			offset1 = 1,
			offset4 = 1,
			offset3 = -4
		},
		[0.75] = {
			offset2 = -9,
			offset1 = -10,
			offset4 = 10,
			offset3 = -7
		},
		{
			offset2 = 0,
			offset1 = 0,
			offset4 = 0,
			offset3 = 0
		},
		[1.25] = {
			offset2 = -7,
			offset1 = -7,
			offset4 = 7,
			offset3 = -5
		},
		[1.5] = {
			offset2 = -5,
			offset1 = -6,
			offset4 = 6,
			offset3 = -5
		},
		{
			offset2 = -3,
			offset1 = -3,
			offset4 = 3,
			offset3 = -4
		}
	}

	return var_33_0[arg_33_0] or var_33_0[1]
end

player_count = "None"
last_player_count = player_count
last_theme_value = theme_value_cache
last_dpi = draw.GetScale()
vertical_layout1 = nil
vertical_layout2 = nil
line_layout = nil

function create_vertical_layout1()
	local var_34_0 = get_dpi_settings(draw.GetScale())
	local var_34_1 = gui.Layout("vertical_info_layout1", draw.Vec2(), draw.Vec2(89 + var_34_0.offset1, 31), gui.StackDirection.VERTICAL)

	var_34_1.sizeToParentW = true
	var_34_1.stackOffset = draw.Vec2(0, 2)

	local var_34_2 = gui.Layout("first_line_layout1", draw.Vec2(), draw.Vec2(100, 24), gui.StackDirection.INLINE)

	var_34_2.sizeToParentW = true
	var_34_2.margin = draw.Rect(0, 0, 0, -12)

	local var_34_3 = gui.Label("label_slashes1", "//", gui.GetThemeColors().accent2, false)
	local var_34_4 = gui.Label("label_text1", " developed by", gui.GetThemeColors().textMid, false)

	var_34_2:Add(var_34_3)
	var_34_2:Add(var_34_4)
	var_34_1:Add(var_34_2)

	local var_34_5 = gui.Label("player_name1", "lunox.PND", nil, true)

	var_34_1:Add(var_34_5)

	return var_34_1
end

function create_vertical_layout2()
	local var_35_0 = get_dpi_settings(draw.GetScale())
	local var_35_1 = gui.Layout("vertical_info_layout2", draw.Vec2(), draw.Vec2(92 + var_35_0.offset2, 47), gui.StackDirection.VERTICAL)

	var_35_1.sizeToParentW = true
	var_35_1.stackOffset = draw.Vec2(0, 2)

	local var_35_2 = gui.Layout("first_line_layout2", draw.Vec2(), draw.Vec2(100, 24), gui.StackDirection.INLINE)

	var_35_2.sizeToParentW = true
	var_35_2.margin = draw.Rect(0, 0, 0, -11)

	local var_35_3 = gui.Label("label_slashes2", "//", gui.GetThemeColors().accent2, false)
	local var_35_4 = gui.Label("label_text2", " special thanks", gui.GetThemeColors().textMid, false)

	var_35_2:Add(var_35_3)
	var_35_2:Add(var_35_4)
	var_35_1:Add(var_35_2)

	local var_35_5 = gui.Label("player_name2", "TALZi, Buttermeow", nil, true)

	var_35_1:Add(var_35_5)

	return var_35_1
end

function create_line_layout(arg_36_0)
	local var_36_0 = get_dpi_settings(draw.GetScale())
	local var_36_1 = gui.Layout("line_layout", draw.Vec2(), draw.Vec2(200, 24), gui.StackDirection.INLINE)

	var_36_1.sizeToParentW = true

	local var_36_2 = gui.Layout("left_layout", draw.Vec2(), draw.Vec2(88 + var_36_0.offset3, 24), gui.StackDirection.INLINE)

	var_36_2.sizeToParentW = false

	local var_36_3 = gui.Label("label_slashes", "//", gui.GetThemeColors().accent2, false)
	local var_36_4 = gui.Label("label_synchronized", " synchronized", gui.GetThemeColors().textMid, false)

	var_36_2:Add(var_36_3)
	var_36_2:Add(var_36_4)
	var_36_1:Add(var_36_2)

	local var_36_5 = gui.Label("label_player_count", arg_36_0 or "None", gui.GetThemeColors().accent2, true)

	var_36_5.margin = draw.Rect(0, 0, 72 + var_36_0.offset4, 0)

	var_36_1:Add(var_36_5)

	return var_36_1
end

function recreate_layouts()
	if vertical_layout1 and vertical_layout1.parent then
		group3_configs:Remove(vertical_layout1)
	end

	if vertical_layout2 and vertical_layout2.parent then
		group3_configs:Remove(vertical_layout2)
	end

	if line_layout and line_layout.parent then
		group3_configs:Remove(line_layout)
	end

	vertical_layout1 = create_vertical_layout1()
	vertical_layout2 = create_vertical_layout2()
	line_layout = create_line_layout(player_count)

	group3_configs:Add(vertical_layout1)
	group3_configs:Add(vertical_layout2)
	group3_configs:Add(line_layout)
end

recreate_layouts()
events.presentQueue:Add(function()
	if gui.IsVisible() then
		return
	end

	local var_38_0 = draw.GetScale()

	if theme_value_cache ~= last_theme_value or player_count ~= last_player_count or var_38_0 ~= last_dpi then
		recreate_layouts()

		last_theme_value = theme_value_cache
		last_player_count = player_count
		last_dpi = var_38_0
	end
end)

my_list = gui.List("configs_list", draw.Vec2(120, 163))
my_list.sizeToParentW = true
my_list.allowMultiple = false

group1_configs:Add(my_list)

function update_configs_list()
	local var_39_0 = get_pnd_files(configs_folder)
	local var_39_1 = #var_39_0

	if var_39_1 == last_file_count then
		return
	end

	local var_39_2 = gui.List("configs_list_new", draw.Vec2(120, 163))

	var_39_2.sizeToParentW = true
	var_39_2.allowMultiple = false

	if var_39_1 > 0 then
		for iter_39_0, iter_39_1 in ipairs(var_39_0) do
			local var_39_3 = gui.Selectable("config_item_" .. iter_39_0, iter_39_1)

			var_39_3.tooltip = configs_folder .. "/" .. iter_39_1

			var_39_3:AddCallback(function()
				local var_40_0 = var_39_2:GetValue():Get():GetRaw()
			end)
			var_39_2:Add(var_39_3)
		end
	end

	group1_configs:Remove(my_list)
	group1_configs:Add(var_39_2)

	my_list = var_39_2
	last_file_count = var_39_1
end

events.presentQueue:Add(function()
	if not gui.IsVisible() then
		return
	end

	local var_41_0 = game.globalVars.m_flRealTime

	if var_41_0 - last_update_time > 5 then
		update_configs_list()

		last_update_time = var_41_0
	end

	if my_list then
		local var_41_1 = my_list:GetValue():Get():GetRaw()

		if var_41_1 > 0 then
			local var_41_2 = get_pnd_files(configs_folder)

			if var_41_1 <= #var_41_2 then
				local var_41_3 = var_41_2[var_41_1]
			end
		end
	end
end)

function create_new_config(arg_42_0)
	if not arg_42_0 or arg_42_0 == "" then
		gui.notify:add(gui.notification("Error", "Please enter a filename", draw.textures.icon_close))

		return false
	end

	if not string.match(arg_42_0, "%.pnd$") then
		arg_42_0 = arg_42_0 .. ".pnd"
	end

	local var_42_0 = configs_folder .. "/" .. arg_42_0

	if utils.FileExists(var_42_0) then
		gui.notify:add(gui.notification("Error", "File already exists: " .. arg_42_0, draw.textures.icon_close))

		return false
	end

	utils.FileCreateDirectories(configs_folder)
	utils.FileWrite(var_42_0, {})

	if utils.FileExists(var_42_0) then
		gui.notify:add(gui.notification("Success", "Config created: " .. arg_42_0, draw.textures.icon_check))
		update_configs_list()
		text_input:SetValue("")

		return true
	else
		gui.notify:add(gui.notification("Error", "Failed to create file: " .. arg_42_0, draw.textures.icon_close))

		return false
	end
end

layout_top = gui.Layout("top_layout", draw.Vec2(), draw.Vec2(120, 40), gui.StackDirection.INLINE)
layout_top.sizeToParentW = true
layout_top.margin = draw.Rect(0, 0, 0, -10)
text_input = gui.TextInput("text_input")

text_input:SetDimensions(draw.Vec2(), draw.Vec2(126, 24))

text_input.placeholder = "Start typing..."
btn_create = gui.Button("btn_create", "Create")

btn_create:SetDimensions(draw.Vec2(), draw.Vec2(56, 24))
layout_top:Add(text_input)
layout_top:Add(btn_create)
group2_configs:Add(layout_top)
btn_create:AddCallback(function()
	Delay(0.1, function()
		local var_44_0 = text_input.value

		create_new_config(var_44_0)
	end)
end)

layout1 = gui.Layout("button_layout1", draw.Vec2(), draw.Vec2(120, 40), gui.StackDirection.INLINE)
layout1.sizeToParentW = true
layout1.margin = draw.Rect(0, 0, 0, -10)
btn_save = gui.Button("btn_save", "Save")

btn_save:SetDimensions(draw.Vec2(), draw.Vec2(91, 24))

btn_load = gui.Button("btn_load", "Load")

btn_load:SetDimensions(draw.Vec2(), draw.Vec2(91, 24))
layout1:Add(btn_save)
layout1:Add(btn_load)
group2_configs:Add(layout1)

layout2 = gui.Layout("button_layout2", draw.Vec2(), draw.Vec2(120, 40), gui.StackDirection.INLINE)
layout2.sizeToParentW = true
layout2.margin = draw.Rect(0, 2, 0, -10)
btn_open = gui.Button("btn_open", "Open Folder")

btn_open:SetDimensions(draw.Vec2(), draw.Vec2(91, 24))

btn_delete = gui.Button("btn_delete", "Delete")

btn_delete:SetDimensions(draw.Vec2(), draw.Vec2(91, 24))
layout2:Add(btn_open)
layout2:Add(btn_delete)
group2_configs:Add(layout2)
btn_open:AddCallback(function()
	Delay(0.1, function()
		local var_46_0 = get_full_path(configs_folder)
		local var_46_1 = ShellExecuteA(nil, "open", var_46_0, nil, nil, SW_SHOW)
		local var_46_2 = tonumber(ffi.cast("int", var_46_1))

		if var_46_2 > 32 then
			-- block empty
		else
			gui.notify:add(gui.notification("Failed to Open Folder", "Create the \"" .. configs_folder .. "\" folders. Error code: " .. var_46_2, draw.textures.icon_close))

			local var_46_3 = string.gsub("fatality\\PND\\configs", "/", "\\")
			local var_46_4 = ShellExecuteA(nil, "open", var_46_3, nil, nil, SW_SHOW)
			local var_46_5 = tonumber(ffi.cast("int", var_46_4))
		end
	end)
end)
btn_delete:AddCallback(function()
	Delay(0.1, function()
		if not my_list then
			gui.notify:add(gui.notification("Error", "Config list not found", draw.textures.icon_close))

			return
		end

		local var_48_0 = my_list:GetValue():Get()

		if not var_48_0 or var_48_0:None() then
			gui.notify:add(gui.notification("Error", "No file selected", draw.textures.icon_close))

			return
		end

		local var_48_1 = get_pnd_files(configs_folder)
		local var_48_2
		local var_48_3

		for iter_48_0 = 1, #var_48_1 do
			if var_48_0:Get(iter_48_0 - 1) then
				var_48_2 = iter_48_0
				var_48_3 = var_48_1[iter_48_0]

				break
			end
		end

		if not var_48_2 or not var_48_3 then
			gui.notify:add(gui.notification("Error", "Selected file does not exist", draw.textures.icon_close))

			return
		end

		if var_48_2 > #var_48_1 then
			gui.notify:add(gui.notification("Error", "Selected file does not exist", draw.textures.icon_close))

			return
		end

		local var_48_4 = configs_folder .. "/" .. var_48_3

		if not utils.FileExists(var_48_4) then
			gui.notify:add(gui.notification("Error", "File does not exist", draw.textures.icon_close))

			return
		end

		utils.FileRemove(var_48_4)
		gui.notify:add(gui.notification("Success", "File deleted: " .. var_48_3, draw.textures.icon_check))
		update_configs_list()

		if my_list then
			local var_48_5 = my_list:GetValue():Get()

			if var_48_5 then
				var_48_5:Reset()
			end
		end
	end)
end)

function bool_to_str(arg_49_0)
	return arg_49_0 and "true" or "false"
end

function str_to_bool(arg_50_0)
	return arg_50_0 == "true"
end

function color_to_str(arg_51_0)
	return string.format("%d,%d,%d,%d", arg_51_0.r, arg_51_0.g, arg_51_0.b, arg_51_0.a)
end

function str_to_color(arg_52_0)
	local var_52_0, var_52_1, var_52_2, var_52_3 = arg_52_0:match("(%d+),(%d+),(%d+),(%d+)")

	if var_52_0 and var_52_1 and var_52_2 and var_52_3 then
		return draw.Color(tonumber(var_52_0), tonumber(var_52_1), tonumber(var_52_2), tonumber(var_52_3))
	end

	return draw.Color(255, 255, 255, 255)
end

function strip_base64_padding(arg_53_0)
	return arg_53_0:gsub("=+$", "")
end

function get_secret_key()
	local var_54_0 = "PND-pnd-klaay"

	return tostring(utils.murmur2("salt:" .. var_54_0))
end

function xor_encrypt(arg_55_0, arg_55_1)
	local var_55_0 = {}

	for iter_55_0 = 1, #arg_55_0 do
		local var_55_1 = arg_55_1:byte((iter_55_0 - 1) % #arg_55_1 + 1)
		local var_55_2 = arg_55_0:byte(iter_55_0)

		table.insert(var_55_0, string.char(bit.bxor(var_55_2, var_55_1)))
	end

	return table.concat(var_55_0)
end

function xor_decrypt(arg_56_0, arg_56_1)
	return xor_encrypt(arg_56_0, arg_56_1)
end

all_elements = {
	checkboxes = {
		cb_synchronization = cb_synchronization,
		cb_jump_scout = cb_jump_scout,
		cb_jump_better_autostop = cb_jump_better_autostop,
		cb_jump_autostop_highest = cb_jump_autostop_highest,
		cb_jump_stop_on_land = cb_jump_stop_on_land,
		cb_jump_only_head = cb_jump_only_head,
		cb_jump_force_shoot = cb_jump_force_shoot,
		cb_animfix = cb_animfix,
		cb_anti_aimpunch = cb_anti_aimpunch,
		cb_accuracy_boost = cb_accuracy_boost,
		cb_auto_force_shot = cb_auto_force_shot,
		cb_dt_on_knife = cb_dt_on_knife,
		cb_disable_m2_on_r8 = cb_disable_m2_on_r8,
		cb_freestands = cb_freestands,
		cb_freestands_off_in_air = cb_freestands_off_in_air,
		cb_fast_angles = cb_fast_angles,
		cb_fast_ladder = cb_fast_ladder,
		cb_fast_ladder_down = cb_fast_ladder_down,
		cb_autostrafer = cb_autostrafer,
		cb_smart_jump_bug = cb_smart_jump_bug,
		cb_fix_duckjump = cb_fix_duckjump,
		cb_no_fall = cb_no_fall,
		cb_height_advantage = cb_height_advantage,
		cb_fast_stop_in_air = cb_fast_stop_in_air,
		cb_avoid_collisions = cb_avoid_collisions,
		cb_crouch_in_air = cb_crouch_in_air,
		cb_only_when_jump = cb_only_when_jump,
		cb_fast_grenade = cb_fast_grenade,
		cb_blockbot = cb_blockbot,
		cb_blockbot_crouch = cb_blockbot_crouch,
		cb_auto_disconnect = cb_auto_disconnect,
		cb_auto_drop_items = cb_auto_drop_items,
		cb_clean_console = cb_clean_console,
		cb_focus_cs2 = cb_focus_cs2,
		cb_anti_afk = cb_anti_afk,
		cb_quick_plant = cb_quick_plant,
		cb_awp_grabber = cb_awp_grabber,
		cb_auto_kick = cb_auto_kick,
		cb_transparent_arms = cb_transparent_arms,
		cb_viewmodel_hit_effect = cb_viewmodel_hit_effect,
		cb_smooth_return = cb_smooth_return,
		cb_fd_animation = cb_fd_animation,
		cb_transparency = cb_transparency,
		cb_debounce_zoom = cb_debounce_zoom,
		cb_animation_break = cb_animation_break,
		cb_animation_spin = cb_animation_spin,
		cb_trails = cb_trails,
		cb_rainbow_effect = cb_rainbow_effect,
		cb_turn_off_shadow = cb_turn_off_shadow,
		cb_effect_on_menu = cb_effect_on_menu,
		cb_always_effect_on_menu = cb_always_effect_on_menu,
		cb_screen_logs = cb_screen_logs,
		cb_watermark = cb_watermark,
		cb_watermark_icon = cb_watermark_icon,
		cb_watermark_tag = cb_watermark_tag,
		cb_watermark_low_fps = cb_watermark_low_fps,
		cb_arrows = cb_arrows,
		cb_arrow_pulse = cb_arrow_pulse,
		cb_manuals = cb_manuals
	},
	sliders = {
		sl_jump_hitchance = sl_jump_hitchance,
		sl_jump_pointscale = sl_jump_pointscale,
		sl_avoid_collisions_air = sl_avoid_collisions_air,
		sl_avoid_collisions_ground = sl_avoid_collisions_ground,
		sl_volume_hit = sl_volume_hit,
		sl_volume_kill = sl_volume_kill,
		sl_animation_x = sl_animation_x,
		sl_animation_y = sl_animation_y,
		sl_animation_z = sl_animation_z,
		sl_lifetime = sl_lifetime,
		sl_radius = sl_radius,
		sl_interval = sl_interval,
		sl_gamma = sl_gamma,
		sl_hitmarkers_lifetime = sl_hitmarkers_lifetime,
		sl_screen_logs_lifetime = sl_screen_logs_lifetime,
		sl_arrow_size = sl_arrow_size,
		sl_arrows_radius = sl_arrows_radius,
		sl_manuals_size = sl_manuals_size,
		sl_manuals_radius = sl_manuals_radius
	},
	comboboxes = {
		cbx_jump_scout_autostop = cbx_jump_scout_autostop,
		cbx_network_mode = cbx_network_mode,
		cbx_grenade_fix = cbx_grenade_fix,
		cbx_hitsounds = cbx_hitsounds,
		cbx_killsounds = cbx_killsounds,
		cbx_trash_talk = cbx_trash_talk,
		cbx_clantags = cbx_clantags,
		cbx_auto_team = cbx_auto_team,
		cbx_transparency_mode = cbx_transparency_mode,
		cbx_transparency_enable = cbx_transparency_enable,
		cbx_trails_type = cbx_trails_type,
		cbx_hitmarkers = cbx_hitmarkers,
		cbx_effect_on_menu_type = cbx_effect_on_menu_type,
		cbx_screen_logs_type = cbx_screen_logs_type,
		cbx_watermark_show = cbx_watermark_show,
		cbx_arrows_type = cbx_arrows_type,
		cbx_manuals_type = cbx_manuals_type
	},
	colors = {
		clr_with_scope_color = clr_with_scope_color,
		clr_with_grenade_color = clr_with_grenade_color,
		clr_circle_color = clr_circle_color,
		clr_hitmarkers_color = clr_hitmarkers_color,
		clr_screen_logs_color = clr_screen_logs_color,
		clr_screen_logs_color_hurt = clr_screen_logs_color_hurt,
		clr_arrows_color = clr_arrows_color,
		clr_manuals_color = clr_manuals_color
	}
}

btn_save:AddCallback(function()
	Delay(0.1, function()
		if not my_list then
			gui.notify:add(gui.notification("Error", "Config list not found", draw.textures.icon_close))

			return false
		end

		slot_58_0_0 = my_list:GetValue():Get()

		if not slot_58_0_0 or slot_58_0_0:None() then
			gui.notify:add(gui.notification("Error", "No config selected to save to", draw.textures.icon_close))

			return false
		end

		slot_58_1_0 = "fatality/PND/configs"
		slot_58_2_0 = get_pnd_files(slot_58_1_0)
		slot_58_3_0 = nil
		slot_58_4_0 = nil

		for iter_58_0 = 1, #slot_58_2_0 do
			if slot_58_0_0:Get(iter_58_0 - 1) then
				slot_58_3_0 = iter_58_0
				slot_58_4_0 = slot_58_2_0[iter_58_0]

				break
			end
		end

		if not slot_58_3_0 or not slot_58_4_0 then
			gui.notify:add(gui.notification("Error", "Selected file does not exist", draw.textures.icon_close))

			return false
		end

		if slot_58_3_0 > #slot_58_2_0 then
			gui.notify:add(gui.notification("Error", "Selected file does not exist", draw.textures.icon_close))

			return false
		end

		slot_58_5_0 = slot_58_1_0 .. "/" .. slot_58_4_0
		slot_58_6_0 = {}

		table.insert(slot_58_6_0, "config_name=" .. slot_58_4_0:gsub("%.pnd$", ""))
		table.insert(slot_58_6_0, "version=" .. tostring(update.version))
		table.insert(slot_58_6_0, "username=" .. tostring(members.username))

		for iter_58_1, iter_58_2 in pairs(all_elements.checkboxes) do
			if iter_58_2 then
				slot_58_12_4 = iter_58_1:gsub("^cb_", "")
				slot_58_13_3 = false

				if iter_58_2.GetValue then
					slot_58_14_3 = iter_58_2:GetValue()

					if slot_58_14_3 and slot_58_14_3.Get then
						slot_58_13_3 = slot_58_14_3:Get()
					end
				end

				table.insert(slot_58_6_0, slot_58_12_4 .. "=" .. bool_to_str(slot_58_13_3))
			end
		end

		for iter_58_3, iter_58_4 in pairs(all_elements.sliders) do
			if iter_58_4 then
				slot_58_12_3 = iter_58_3:gsub("^sl_", "")
				slot_58_13_2 = 0

				if iter_58_4.GetValue then
					slot_58_13_2 = iter_58_4:GetValue()
				end

				table.insert(slot_58_6_0, slot_58_12_3 .. "=" .. tostring(slot_58_13_2))
			end
		end

		for iter_58_5, iter_58_6 in pairs(all_elements.comboboxes) do
			if iter_58_6 then
				slot_58_12_2 = iter_58_5:gsub("^cbx_", "")
				slot_58_13_1 = 0

				if iter_58_6.GetValue then
					slot_58_14_2 = iter_58_6:GetValue()

					if type(slot_58_14_2) == "number" then
						slot_58_13_1 = slot_58_14_2
					elseif type(slot_58_14_2) == "userdata" and slot_58_14_2.Get then
						slot_58_15_2 = slot_58_14_2:Get()

						if type(slot_58_15_2) == "number" then
							slot_58_13_1 = slot_58_15_2
						elseif type(slot_58_15_2) == "userdata" and slot_58_15_2.GetRaw then
							slot_58_13_1 = slot_58_15_2:GetRaw()
						end
					end
				end

				table.insert(slot_58_6_0, slot_58_12_2 .. "=" .. tostring(slot_58_13_1))
			end
		end

		for iter_58_7, iter_58_8 in pairs(all_elements.colors) do
			if iter_58_8 then
				slot_58_12_1 = iter_58_7:gsub("^clr_", "")
				slot_58_13_0 = 255
				slot_58_14_1 = 255
				slot_58_15_1 = 255
				slot_58_16_0 = 255

				if iter_58_8.GetValue then
					slot_58_17_0 = iter_58_8:GetValue():Get()

					if slot_58_17_0 then
						slot_58_13_0 = slot_58_17_0:GetR()
						slot_58_14_1 = slot_58_17_0:GetG()
						slot_58_15_1 = slot_58_17_0:GetB()
						slot_58_16_0 = slot_58_17_0:GetA()
					end
				end

				table.insert(slot_58_6_0, slot_58_12_1 .. "=" .. string.format("%d,%d,%d,%d", slot_58_13_0, slot_58_14_1, slot_58_15_1, slot_58_16_0))
			end
		end

		if watermark_element_order and #watermark_element_order > 0 then
			slot_58_7_1 = table.concat(watermark_element_order, ",")

			table.insert(slot_58_6_0, "watermark_order=" .. slot_58_7_1)
		end

		slot_58_7_0 = table.concat(slot_58_6_0, "\n"):gsub("\n", ";")
		slot_58_8_0 = get_secret_key()
		slot_58_9_0 = xor_encrypt(slot_58_7_0, slot_58_8_0)
		slot_58_10_1 = utils.Base64Encode(slot_58_9_0)
		slot_58_10_0 = strip_base64_padding(slot_58_10_1)
		slot_58_11_0 = "PND-pnd=" .. slot_58_10_0

		utils.FileCreateDirectories(slot_58_1_0)

		slot_58_12_0 = utils.StringToArray(slot_58_11_0)

		utils.FileWrite(slot_58_5_0, slot_58_12_0)

		if utils.FileExists(slot_58_5_0) then
			slot_58_14_0 = slot_58_4_0:gsub("%.pnd$", "")

			gui.notify:add(gui.notification("Success", "Config saved to \"" .. slot_58_14_0 .. "\"", draw.textures.icon_check))

			if my_list then
				slot_58_15_0 = my_list:GetValue():Get()

				if slot_58_15_0 then
					slot_58_15_0:Reset()
				end
			end

			return true
		else
			gui.notify:add(gui.notification("Error", "Failed to save config", draw.textures.icon_close))
		end

		return false
	end)
end)
btn_load:AddCallback(function()
	Delay(0.1, function()
		if not my_list then
			gui.notify:add(gui.notification("Error", "Config list not found", draw.textures.icon_close))

			return false
		end

		slot_60_0_0 = my_list:GetValue():Get()

		if not slot_60_0_0 or slot_60_0_0:None() then
			gui.notify:add(gui.notification("Error", "No config selected to load", draw.textures.icon_close))

			return false
		end

		slot_60_1_0 = "fatality/PND/configs"
		slot_60_2_0 = get_pnd_files(slot_60_1_0)
		slot_60_3_0 = nil
		slot_60_4_0 = nil

		for iter_60_0 = 1, #slot_60_2_0 do
			if slot_60_0_0:Get(iter_60_0 - 1) then
				slot_60_3_0 = iter_60_0
				slot_60_4_0 = slot_60_2_0[iter_60_0]

				break
			end
		end

		if not slot_60_3_0 or not slot_60_4_0 then
			gui.notify:add(gui.notification("Error", "Selected file does not exist", draw.textures.icon_close))

			return false
		end

		if slot_60_3_0 > #slot_60_2_0 then
			gui.notify:add(gui.notification("Error", "Selected file does not exist", draw.textures.icon_close))

			return false
		end

		slot_60_5_0 = slot_60_1_0 .. "/" .. slot_60_4_0

		if not utils.FileExists(slot_60_5_0) then
			gui.notify:add(gui.notification("Error", "File does not exist", draw.textures.icon_close))

			return false
		end

		slot_60_6_0 = utils.FileRead(slot_60_5_0)

		if not slot_60_6_0 or #slot_60_6_0 == 0 then
			gui.notify:add(gui.notification("Error", "Failed to read config file", draw.textures.icon_close))

			return false
		end

		slot_60_7_0 = utils.ArrayToString(slot_60_6_0)
		slot_60_8_0 = "PND-pnd="

		if slot_60_7_0:sub(1, #slot_60_8_0) ~= slot_60_8_0 then
			gui.notify:add(gui.notification("Error", "Invalid config file format", draw.textures.icon_close))

			return false
		end

		slot_60_9_0 = slot_60_7_0:sub(#slot_60_8_0 + 1)
		slot_60_10_0 = 4 - #slot_60_9_0 % 4

		if slot_60_10_0 < 4 then
			slot_60_9_0 = slot_60_9_0 .. string.rep("=", slot_60_10_0)
		end

		slot_60_11_0 = utils.Base64Decode(slot_60_9_0)

		if not slot_60_11_0 then
			gui.notify:add(gui.notification("Error", "Failed to decode config", draw.textures.icon_close))

			return false
		end

		slot_60_12_0 = get_secret_key()
		slot_60_13_0 = xor_decrypt(slot_60_11_0, slot_60_12_0)
		slot_60_14_0 = {}

		for iter_60_1 in string.gmatch(slot_60_13_0, "([^;]+)") do
			slot_60_19_5, slot_60_20_0 = iter_60_1:match("([^=]+)=(.+)")

			if slot_60_19_5 and slot_60_20_0 then
				slot_60_14_0[slot_60_19_5] = slot_60_20_0:gsub("\\;", ";")
			end
		end

		for iter_60_2, iter_60_3 in pairs(all_elements.checkboxes) do
			if iter_60_3 then
				slot_60_21_3 = slot_60_14_0[iter_60_2:gsub("^cb_", "")]

				if slot_60_21_3 ~= nil then
					iter_60_3:SetValue(str_to_bool(slot_60_21_3))
				end
			end
		end

		for iter_60_4, iter_60_5 in pairs(all_elements.sliders) do
			if iter_60_5 then
				slot_60_21_2 = slot_60_14_0[iter_60_4:gsub("^sl_", "")]

				if slot_60_21_2 ~= nil then
					iter_60_5:GetValue():Set(tonumber(slot_60_21_2))
				end
			end
		end

		for iter_60_6, iter_60_7 in pairs(all_elements.comboboxes) do
			if iter_60_7 then
				slot_60_21_1 = slot_60_14_0[iter_60_6:gsub("^cbx_", "")]

				if slot_60_21_1 ~= nil then
					slot_60_22_0 = tonumber(slot_60_21_1)

					if slot_60_22_0 then
						slot_60_23_0 = iter_60_7:GetValue()

						if slot_60_23_0 then
							slot_60_24_0 = slot_60_23_0:Get()

							if slot_60_24_0 then
								if slot_60_24_0.SetRaw then
									slot_60_24_0:SetRaw(slot_60_22_0)
								end

								slot_60_23_0:Set(slot_60_24_0)
								iter_60_7:Reset()
							end
						end
					end
				end
			end
		end

		for iter_60_8, iter_60_9 in pairs(all_elements.colors) do
			if iter_60_9 then
				slot_60_21_0 = slot_60_14_0[iter_60_8:gsub("^clr_", "")]

				if slot_60_21_0 ~= nil then
					iter_60_9:GetValue():Set(str_to_color(slot_60_21_0))
				end
			end
		end

		slot_60_15_0 = slot_60_14_0.watermark_order

		if slot_60_15_0 and slot_60_15_0 ~= "" then
			watermark_element_order = {}

			for iter_60_10 in string.gmatch(slot_60_15_0, "[^,]+") do
				table.insert(watermark_element_order, iter_60_10)
			end
		end

		slot_60_16_0 = slot_60_4_0:gsub("%.pnd$", "")

		gui.notify:add(gui.notification("Success", "Config loaded from \"" .. slot_60_16_0 .. "\"", draw.textures.icon_check))

		if my_list then
			slot_60_17_0 = my_list:GetValue():Get()

			if slot_60_17_0 then
				slot_60_17_0:Reset()
			end
		end

		subtab_rage:Reset()
		subtab_misc:Reset()
		subtab_visuals:Reset()

		return true
	end)
end)

detected = {}
purchases = {}
weapon_grenade_map = {
	weapon_hegrenade = "he",
	weapon_incgrenade = "molotov",
	weapon_smokegrenade = "smoke",
	weapon_molotov = "molotov"
}
non_weapon_items = {
	weapon_hegrenade = true,
	weapon_incgrenade = true,
	weapon_smokegrenade = true,
	weapon_molotov = true
}
expected_grenades = {
	"he",
	"molotov",
	"smoke"
}

mods.events:add_listener("item_purchase")
events.event:add(function(arg_61_0)
	if not game.engine:InGame() then
		return
	end

	local var_61_0 = arg_61_0:get_name()

	if var_61_0 == "round_start" then
		purchases = {}

		return
	end

	if var_61_0 ~= "item_purchase" then
		return
	end

	local var_61_1 = arg_61_0:get_controller("userid")

	if not var_61_1 then
		return
	end

	local var_61_2 = var_61_1:get_name()

	if detected[var_61_2] then
		return
	end

	local var_61_3 = arg_61_0:get_string("weapon")
	local var_61_4 = game.global_vars.real_time or 0
	local var_61_5 = purchases[var_61_2]

	if not var_61_5 then
		var_61_5 = {
			weapon_bought = false,
			weapon = false,
			grenades = {},
			round_time = var_61_4
		}
		purchases[var_61_2] = var_61_5
	end

	var_61_5.round_time = var_61_5.round_time or var_61_4

	local var_61_6 = var_61_4 - var_61_5.round_time

	if not var_61_5.weapon_bought and not non_weapon_items[var_61_3] then
		var_61_5.weapon_bought = true
		var_61_5.weapon_time = var_61_6
	end

	if #var_61_5.grenades < 3 then
		local var_61_7 = weapon_grenade_map[var_61_3]

		if var_61_7 then
			if not var_61_5.grenade_time then
				var_61_5.grenade_time = var_61_6
				var_61_5.grenades = {
					var_61_7
				}
			elseif var_61_6 == var_61_5.grenade_time and var_61_7 == expected_grenades[#var_61_5.grenades + 1] then
				var_61_5.grenades[#var_61_5.grenades + 1] = var_61_7

				if #var_61_5.grenades == 3 then
					var_61_5.grenade_complete = var_61_6
				end
			else
				var_61_5.grenades = {}
				var_61_5.grenade_time = nil
			end
		end
	end

	if var_61_5.weapon_bought and var_61_5.grenade_complete and var_61_5.grenade_complete - var_61_5.weapon_time >= 0.06 then
		detected[var_61_2] = true
		GAMESENSE_NAMES = {}

		for iter_61_0 in pairs(detected) do
			GAMESENSE_NAMES[#GAMESENSE_NAMES + 1] = iter_61_0
		end

		update_gamesense_list()
	end
end)

PND_NAMES = {}
GAMESENSE_NAMES = {}
scoreboard_monitor = nil
monitor_initialized = false
shutdown_counter = 0

function initialize_monitor()
	if monitor_initialized then
		return
	end

	scoreboard_monitor = panorama.Eval("    (function () {\n        var shutdown_current = 0;\n        var shutdown_last = 1;\n        var repeats = 0;\n        var mainLoopHandle = null;\n        var pndNames = [];\n        var gamesenseNames = [];\n\n        function escapeRegExp(string) {\n            return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n        }\n\n        function containsPNDName(name) {\n            if (!name) return false;\n\n            var originalName = name;\n            name = name.toLowerCase();\n            name = name.replace(/^\\[.*?\\]\\s*/, \"\").trim();\n\n            if (name.length < 1) {\n                return false;\n            }\n\n            for (var j = 0; j < pndNames.length; j++) {\n                if (!pndNames[j]) continue;\n\n                var pnd = pndNames[j].toLowerCase();\n                pnd = pnd.replace(/^\\[.*?\\]\\s*/, \"\").trim();\n\n                if (pnd.length < 1) continue;\n\n                var regex = new RegExp(\"(^|\\\\s)\" + escapeRegExp(pnd) + \"(\\\\s|$)\", \"i\");\n                if (regex.test(originalName)) {\n                    return true;\n                }\n            }\n\n            return false;\n        }\n        \n        function containsGameSenseName(name) {\n            if (!name) return false;\n\n            var originalName = name;\n            name = name.toLowerCase();\n            name = name.replace(/^\\[.*?\\]\\s*/, \"\").trim();\n\n            if (name.length < 1) {\n                return false;\n            }\n\n            for (var j = 0; j < gamesenseNames.length; j++) {\n                if (!gamesenseNames[j]) continue;\n\n                var gs = gamesenseNames[j].toLowerCase();\n                gs = gs.replace(/^\\[.*?\\]\\s*/, \"\").trim();\n\n                if (gs.length < 1) continue;\n\n                var regex = new RegExp(\"(^|\\\\s)\" + escapeRegExp(gs) + \"(\\\\s|$)\", \"i\");\n                if (regex.test(originalName)) {\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        function removeOldIcons(panel) {\n            if (!panel) return;\n            var children = panel.Children();\n            for (var i = 0; i < children.length; i++) {\n                var child = children[i];\n                if (child.id === \"pnd_image\" || (child.BHasClass && child.BHasClass(\"pnd_image\")) ||\n                    child.id === \"gamesense_image\" || (child.BHasClass && child.BHasClass(\"gamesense_image\"))) {\n                    child.DeleteAsync(0);\n                } else {\n                    removeOldIcons(child);\n                }\n            }\n        }\n        \n        function removeAllIconsImmediately() {\n            var root = $.GetContextPanel();\n            if (!root) return;\n            \n            var pndIcons = root.FindChildrenWithClassTraverse(\"pnd_image\");\n            for (var i = 0; i < pndIcons.length; i++) {\n                pndIcons[i].DeleteAsync(0);\n            }\n            \n            var gsIcons = root.FindChildrenWithClassTraverse(\"gamesense_image\");\n            for (var i = 0; i < gsIcons.length; i++) {\n                gsIcons[i].DeleteAsync(0);\n            }\n        }\n\n        function addPNDIconToStatusCell(statusCell) {\n            var allChildren = statusCell.Children();\n\n            for (var i = 0; i < allChildren.length; i++) {\n                var child = allChildren[i];\n\n                if (child.id !== \"pnd_image\" && child.id !== \"gamesense_image\" && \n                    !(child.BHasClass && (child.BHasClass(\"pnd_image\") || child.BHasClass(\"gamesense_image\")))) {\n                    child.DeleteAsync(0);\n                }\n            }\n\n            var existingIcon = statusCell.FindChildTraverse(\"pnd_image\");\n            if (existingIcon) return;\n\n            var icon = $.CreatePanel(\"Image\", statusCell, \"pnd_image\");\n            icon.SetImage(\"https://raw.githubusercontent.com/ravaelsea/icon/main/pnd_icons/heartS.png\");\n            icon.AddClass(\"pnd_image\");\n\n            icon.style.width = \"24px\";\n            icon.style.height = \"24px\";\n        }\n        \n        function addGameSenseIconToStatusCell(statusCell) {\n            var allChildren = statusCell.Children();\n\n            for (var i = 0; i < allChildren.length; i++) {\n                var child = allChildren[i];\n\n                if (child.id !== \"pnd_image\" && child.id !== \"gamesense_image\" && \n                    !(child.BHasClass && (child.BHasClass(\"pnd_image\") || child.BHasClass(\"gamesense_image\")))) {\n                    child.DeleteAsync(0);\n                }\n            }\n\n            var existingPNDIcon = statusCell.FindChildTraverse(\"pnd_image\");\n            if (existingPNDIcon) return;\n            \n            var existingIcon = statusCell.FindChildTraverse(\"gamesense_image\");\n            if (existingIcon) return;\n\n            var icon = $.CreatePanel(\"Image\", statusCell, \"gamesense_image\");\n            icon.SetImage(\"https://raw.githubusercontent.com/ravaelsea/icon/main/pnd_icons/heartG.png\");\n            icon.AddClass(\"gamesense_image\");\n\n            icon.style.width = \"24px\";\n            icon.style.height = \"24px\";\n        }\n\n        function processScoreboard() {\n            var root = $.GetContextPanel();\n            if (!root) return;\n\n            var playerTables = root.FindChildrenWithClassTraverse(\"sb-players-table\");\n            if (!playerTables || playerTables.length === 0) return;\n\n            for (var i = 0; i < playerTables.length; i++) {\n                var playerTable = playerTables[i];\n                var playerRows = playerTable.Children();\n\n                for (var j = 0; j < playerRows.length; j++) {\n                    var playerRow = playerRows[j];\n                    var playerNameLabel = playerRow.FindChildTraverse(\"name\");\n                    if (!playerNameLabel) continue;\n\n                    var playerName = playerNameLabel.text;\n                    var hasPND = containsPNDName(playerName);\n                    var hasGameSense = containsGameSenseName(playerName);\n                    \n                    var statusCells = playerRow.FindChildrenWithClassTraverse(\"sb-row__cell--status\");\n                    \n                    for (var k = 0; k < statusCells.length; k++) {\n                        if (hasPND) {\n                            addPNDIconToStatusCell(statusCells[k]);\n                        } else if (hasGameSense) {\n                            addGameSenseIconToStatusCell(statusCells[k]);\n                        } else {\n                            var existingPNDIcon = statusCells[k].FindChildTraverse(\"pnd_image\");\n                            if (existingPNDIcon) {\n                                existingPNDIcon.DeleteAsync(0);\n                            }\n                            var existingGameSenseIcon = statusCells[k].FindChildTraverse(\"gamesense_image\");\n                            if (existingGameSenseIcon) {\n                                existingGameSenseIcon.DeleteAsync(0);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        function mainLoop() {\n            if (shutdown_last === shutdown_current) {\n                repeats++;\n                if (repeats > 2) {\n                    var root = $.GetContextPanel();\n                    if (root) removeOldIcons(root);\n                    return;\n                }\n            } else {\n                repeats = 0;\n            }\n\n            shutdown_last = shutdown_current;\n            processScoreboard();\n            mainLoopHandle = $.Schedule(0.4, mainLoop);\n        }\n\n        function start() {\n            if (mainLoopHandle) {\n                $.CancelScheduled(mainLoopHandle);\n                mainLoopHandle = null;\n            }\n            mainLoopHandle = $.Schedule(0.6, mainLoop);\n        }\n\n        function stop() {\n            if (mainLoopHandle) {\n                $.CancelScheduled(mainLoopHandle);\n                mainLoopHandle = null;\n            }\n            var root = $.GetContextPanel();\n            if (root) removeOldIcons(root);\n        }\n\n        return {\n            set_shutdown_current: function (v) {\n                shutdown_current = v;\n            },\n            set_pnd_names: function (names) {\n                pndNames = names || [];\n            },\n            set_gamesense_names: function (names) {\n                gamesenseNames = names || [];\n            },\n            remove_all_icons: function () {\n                removeAllIconsImmediately();\n            },\n            start: start,\n            stop: stop\n        };\n    })()\n    ")
	monitor_initialized = true
end

function clear_gamesense_list()
	GAMESENSE_NAMES = {}
	detected = {}

	if scoreboard_monitor and scoreboard_monitor.set_gamesense_names then
		scoreboard_monitor.set_gamesense_names(GAMESENSE_NAMES)
	end

	if scoreboard_monitor and scoreboard_monitor.remove_all_icons then
		scoreboard_monitor.remove_all_icons()
	end
end

function update_gamesense_list()
	if scoreboard_monitor and scoreboard_monitor.set_gamesense_names then
		scoreboard_monitor.set_gamesense_names(GAMESENSE_NAMES)
	end
end

function deinitialize_monitor()
	if not monitor_initialized or not scoreboard_monitor then
		return
	end

	if scoreboard_monitor.stop then
		scoreboard_monitor.stop()
	end

	scoreboard_monitor = nil
	monitor_initialized = false
	PND_NAMES = {}
	GAMESENSE_NAMES = {}
	detected = {}
end

function check_player_state()
	if not (game.engine:InGame() and game.engine:IsConnected()) then
		if monitor_initialized then
			deinitialize_monitor()
		end

		return
	end

	local var_66_0 = entities.GetLocalPawn()

	if var_66_0 and var_66_0:IsAlive() and not monitor_initialized then
		initialize_monitor()

		if scoreboard_monitor and scoreboard_monitor.start then
			scoreboard_monitor.start()
		end
	end
end

events.presentQueue:Add(function()
	shutdown_counter = shutdown_counter + 1

	check_player_state()

	if scoreboard_monitor and scoreboard_monitor.set_shutdown_current then
		scoreboard_monitor.set_shutdown_current(shutdown_counter)
	end
end)

realName = nil
enabled_cl = false

function initializeRealName()
	local var_68_0 = entities.GetLocalController()
	local var_68_1 = entities.GetLocalPawn()

	realName = getNameFromEntity(var_68_0) or getNameFromEntity(var_68_1)
	enabled_cl = realName and realName ~= ""

	return enabled_cl
end

state = {
	sync_interval = 8,
	pnd_players_cache = {},
	all_found_pnd_players = {},
	manual_pnd_players = {}
}

function url_encode(arg_69_0)
	if not arg_69_0 then
		return ""
	end

	return string.gsub(arg_69_0, "([^%w%-_%.~])", function(arg_70_0)
		return string.format("%%%02X", string.byte(arg_70_0))
	end):gsub(" ", "+")
end

events.presentQueue:Add(function()
	if not enabled_cl then
		initializeRealName()

		return
	end

	if not (cb_synchronization and cb_synchronization:GetValue() and cb_synchronization:GetValue():Get()) then
		if scoreboard_monitor then
			PND_NAMES = {}

			scoreboard_monitor.set_pnd_names(PND_NAMES)
			clear_gamesense_list()
		end

		player_count = "None"

		return
	end

	local var_71_0 = utils.GetUnixTime()

	if var_71_0 - (state.last_sync_time or 0) < state.sync_interval then
		return
	end

	state.last_sync_time = var_71_0

	if not entities.GetLocalController() then
		return
	end

	local var_71_1 = "local"
	local var_71_2 = game.engine:GetNetChan()

	if var_71_2 and not var_71_2:IsNull() then
		var_71_1 = var_71_2:GetAddress() or "local"
	end

	local var_71_3 = math.floor(var_71_0 / 60) * 60
	local var_71_4 = "mAnj3AOdhjV4jkASBdj23nm" .. tostring(var_71_3)
	local var_71_5 = tostring(utils.Fnv1a(var_71_4))
	local var_71_6 = {
		local_player = {
			name = realName,
			server_ip = var_71_1
		},
		username = members.username,
		version = update.version
	}
	local var_71_7 = url_encode(utils.JsonEncode(var_71_6))
	local var_71_8 = utils.Base64Decode("aHR0cDovLzE0NC4zMS4xNjUuODk6NjI5MzAvdXBkYXRlP2tleT0=") .. var_71_5 .. "&data=" .. var_71_7

	http.Get(var_71_8, {
		absolute_timeout = 15,
		network_timeout = 10
	}, function(arg_72_0, arg_72_1)
		if arg_72_0 == 200 and arg_72_1 then
			local var_72_0 = utils.JsonDecode(arg_72_1)

			if type(var_72_0) == "table" then
				PND_NAMES = {}

				for iter_72_0, iter_72_1 in ipairs(var_72_0) do
					if iter_72_1.name and iter_72_1.name ~= "" then
						PND_NAMES[#PND_NAMES + 1] = iter_72_1.name
					end
				end

				if scoreboard_monitor then
					scoreboard_monitor.set_pnd_names(PND_NAMES)
				end

				player_count = #var_72_0
			end
		end
	end)
end)

function state.send_initial_ping()
	local var_73_0 = members.username
	local var_73_1 = update.version
	local var_73_2 = utils.GetUnixTime()
	local var_73_3 = math.floor(var_73_2 / 60) * 60
	local var_73_4 = "jJn12JK8cx9hjb1337zxc" .. tostring(var_73_3)
	local var_73_5 = tostring(utils.Fnv1a(var_73_4))
	local var_73_6 = "aHR0cDovLzE0NC4zMS4xNjUuODk6NjI5NDcvcGluZz9rZXk9"
	local var_73_7 = utils.Base64Decode(var_73_6) .. url_encode(var_73_5) .. "&username=" .. url_encode(var_73_0) .. "&version=" .. url_encode(var_73_1)

	http.Get(var_73_7, {
		absolute_timeout = 5,
		network_timeout = 3
	}, function(arg_74_0, arg_74_1)
		return
	end)
end

state.send_initial_ping()

autostop_manager = {
	owner = nil,
	saved_bits = nil
}

function set_autostop_for(arg_75_0, arg_75_1, arg_75_2)
	if not arg_75_1 then
		return
	end

	if autostop_manager.owner ~= arg_75_0 then
		local var_75_0 = arg_75_1:GetValue()

		if var_75_0 then
			local var_75_1 = var_75_0:Get()

			if var_75_1 then
				autostop_manager.saved_bits = var_75_1:GetRaw()
				autostop_manager.owner = arg_75_0
			end
		end
	end

	set_autostop_bits(arg_75_1, arg_75_2)
end

function restore_autostop_for(arg_76_0, arg_76_1)
	if autostop_manager.owner == arg_76_0 and arg_76_1 and autostop_manager.saved_bits then
		set_autostop_bits(arg_76_1, autostop_manager.saved_bits)

		autostop_manager.owner = nil
		autostop_manager.saved_bits = nil
	end
end

jump_backup = {
	force_shoot_active = false,
	active = false,
	was_jumping = false
}
boost_backup = {
	active = false,
	static_saved = false,
	prev_mode = false
}
target_speed = 600
min_boost = 50
max_boost = 100

function set_autostop_bits(arg_77_0, arg_77_1)
	if not arg_77_0 then
		return
	end

	local var_77_0 = arg_77_0:GetValue()

	if not var_77_0 then
		return
	end

	local var_77_1 = var_77_0:Get()

	if not var_77_1 then
		return
	end

	var_77_1:SetRaw(arg_77_1)
	var_77_0:Set(var_77_1)
	arg_77_0:Reset()
end

function get_autostop_bits(arg_78_0)
	if not arg_78_0 then
		return nil
	end

	local var_78_0 = arg_78_0:GetValue()

	if not var_78_0 then
		return nil
	end

	local var_78_1 = var_78_0:Get()

	if not var_78_1 then
		return nil
	end

	return var_78_1:GetRaw()
end

function find_controls()
	return {
		hitchance = gui.ctx:Find("rage>weapon>SSG-08>weapon>hitchance") or gui.ctx:Find("rage>weapon>general>weapon>hitchance"),
		pointscale = gui.ctx:Find("rage>weapon>SSG-08>weapon>pointscale") or gui.ctx:Find("rage>weapon>general>weapon>pointscale"),
		autostop = gui.ctx:Find("rage>weapon>SSG-08>extra>autostop>settings>mode") or gui.ctx:Find("rage>weapon>general>extra>autostop>settings>mode"),
		autostop_enable = gui.ctx:Find("rage>weapon>SSG-08>extra>autostop") or gui.ctx:Find("rage>weapon>general>extra>autostop"),
		force_shoot = gui.ctx:Find("rage>aimbot>general>force shoot"),
		head_only = gui.ctx:Find("rage>aimbot>general>headshot only")
	}
end

function restore_jump_backup(arg_80_0)
	if not jump_backup.active then
		return
	end

	if arg_80_0.hitchance and jump_backup.hitchance ~= nil then
		arg_80_0.hitchance:GetValue():Set(jump_backup.hitchance)
	end

	if arg_80_0.pointscale and jump_backup.pointscale ~= nil then
		arg_80_0.pointscale:GetValue():Set(jump_backup.pointscale)
	end

	if arg_80_0.head_only and jump_backup.headonly ~= nil then
		arg_80_0.head_only:SetValue(jump_backup.headonly)
	end

	if jump_backup.force_shoot_active and arg_80_0.force_shoot then
		arg_80_0.force_shoot:SetValue(false)
	end

	if arg_80_0.autostop then
		restore_autostop_for("jump", arg_80_0.autostop)
	end

	if arg_80_0.autostop_enable and jump_backup.autostop_enabled ~= nil then
		arg_80_0.autostop_enable:SetValue(jump_backup.autostop_enabled)
	end

	jump_backup = {
		force_shoot_active = false,
		active = false,
		was_jumping = false
	}
end

function apply_jump_backup(arg_81_0)
	if jump_backup.was_jumping then
		return
	end

	jump_backup.hitchance = arg_81_0.hitchance:GetValue():Get()

	arg_81_0.hitchance:GetValue():Set(sl_jump_hitchance:GetValue():Get())

	jump_backup.pointscale = arg_81_0.pointscale:GetValue():Get()

	arg_81_0.pointscale:GetValue():Set(sl_jump_pointscale:GetValue():Get())

	if cb_jump_only_head:GetValue():Get() then
		jump_backup.headonly = arg_81_0.head_only:GetValue():Get()

		arg_81_0.head_only:SetValue(true)
	end

	jump_backup.autostop_bits = get_autostop_bits(arg_81_0.autostop)
	jump_backup.autostop_enabled = arg_81_0.autostop_enable:GetValue():Get()
	jump_backup.was_jumping = true
	jump_backup.active = true
end

function handle_boost(arg_82_0)
	local var_82_0 = cb_jump_better_autostop:GetValue():Get()

	if boost_backup.prev_mode ~= var_82_0 then
		boost_backup.prev_mode = var_82_0
		boost_backup.static_saved = false
	end

	if not var_82_0 then
		if boost_backup.value then
			config.misc.boost_slider:GetValue():Set(boost_backup.value)
		end

		boost_backup.active = false
		boost_backup.value = nil
		boost_backup.static_saved = false

		return
	end

	if var_82_0 and not boost_backup.active then
		boost_backup.value = config.misc.boost_slider:GetValue():Get()
		boost_backup.active = true
	end

	if not arg_82_0 or not arg_82_0:IsAlive() then
		return
	end

	local var_82_1 = arg_82_0:GetAbsVelocity()
	local var_82_2 = math.sqrt(var_82_1.x^2 + var_82_1.y^2 + var_82_1.z^2)
	local var_82_3 = config.misc.boost_slider:GetValue():Get()
	local var_82_4 = var_82_2 - target_speed

	if var_82_2 > target_speed then
		local var_82_5 = math.max(min_boost, var_82_3 - math.min(10, math.max(1, math.abs(var_82_4) / 10)))

		config.misc.boost_slider:GetValue():Set(var_82_5)
	elseif var_82_2 < target_speed - 50 then
		local var_82_6 = var_82_2 < target_speed - 100 and 5 or var_82_2 < target_speed - 30 and 2 or 0
		local var_82_7 = math.min(max_boost, var_82_3 + var_82_6)

		if var_82_6 > 0 then
			config.misc.boost_slider:GetValue():Set(var_82_7)
		end
	end
end

function restore_jump_settings()
	local var_83_0 = find_controls()

	restore_jump_backup(var_83_0)
end

function restore_boost_settings()
	if boost_backup.active and boost_backup.value then
		config.misc.boost_slider:GetValue():Set(boost_backup.value)

		boost_backup.active = false
		boost_backup.value = nil
		boost_backup.static_saved = false
	end
end

events.presentQueue:Add(function()
	local var_85_0 = entities.GetLocalPawn()
	local var_85_1

	var_85_1 = var_85_0 and var_85_0:IsAlive()

	local var_85_2 = cb_jump_scout:GetValue():Get()
	local var_85_3 = find_controls()

	if not var_85_2 then
		restore_jump_backup(var_85_3)
		restore_boost_settings()

		return
	end

	if not var_85_0 then
		return
	end

	local var_85_4 = var_85_0:GetAbsVelocity()
	local var_85_5 = math.abs(var_85_4.z) > 1

	if not accuracy_boost_active and var_85_5 then
		local var_85_6 = not cb_jump_autostop_highest:GetValue():Get() or math.abs(var_85_4.z) > 40

		if not jump_backup.was_jumping then
			apply_jump_backup(var_85_3)
		end

		if var_85_6 then
			local var_85_7 = cbx_jump_scout_autostop:GetValue():Get():GetRaw()

			if var_85_7 == 2 then
				set_autostop_for("jump", var_85_3.autostop, 4)
				var_85_3.autostop_enable:SetValue(true)
			elseif var_85_7 == 4 then
				set_autostop_for("jump", var_85_3.autostop, 31)
				var_85_3.autostop_enable:SetValue(true)
			end
		else
			restore_autostop_for("jump", var_85_3.autostop)
			var_85_3.autostop_enable:SetValue(jump_backup.autostop_enabled)
		end

		if cb_jump_force_shoot:GetValue():Get() and not jump_backup.force_shoot_active then
			var_85_3.force_shoot:SetValue(true)

			jump_backup.force_shoot_active = true
		end
	elseif jump_backup.was_jumping then
		restore_jump_backup(var_85_3)
	end

	handle_boost(var_85_0)
end)

function check_enemy_eye_visible()
	if not cb_jump_scout:GetValue():Get() or not cb_jump_stop_on_land:GetValue():Get() then
		return
	end

	local var_86_0 = entities.GetLocalPawn()

	if not var_86_0 or not var_86_0:IsAlive() then
		return false
	end

	local var_86_1 = var_86_0:GetActiveWeapon()

	if not var_86_1 then
		return
	end

	if var_86_1:GetClassName() ~= "C_WeaponSSG08" then
		return
	end

	local var_86_2 = var_86_0:GetEyePos()

	if not var_86_2 or not game.physicsQueryInterface or not game.physicsQueryInterface.TraceRay then
		return false
	end

	local var_86_3 = ray_t()

	if entities.players then
		local var_86_4 = false

		entities.players:ForEach(function(arg_87_0)
			local var_87_0 = arg_87_0.entity

			if var_87_0 and var_87_0:IsAlive() and var_87_0:IsEnemy() then
				local var_87_1 = var_87_0:GetEyePos()

				if var_87_1 then
					local var_87_2 = game.physicsQueryInterface:TraceRay(var_86_3, var_86_2, var_87_1)

					if var_87_2 and var_87_2.m_flFraction > 0.88 then
						var_86_4 = true

						return true
					end
				end
			end
		end)

		return var_86_4
	end

	return false
end

events.createMove:Add(function(arg_88_0)
	if check_enemy_eye_visible() then
		arg_88_0:RemoveButton(InputBitMask_t.IN_JUMP)
	end
end)

reset_applied = false

function transform_point(arg_89_0, arg_89_1, arg_89_2)
	local var_89_0 = math.rad(arg_89_1.y)
	local var_89_1 = math.cos(var_89_0)
	local var_89_2 = math.sin(var_89_0)

	return Vector(arg_89_0.x + arg_89_2.x * var_89_1 - arg_89_2.y * var_89_2, arg_89_0.y + arg_89_2.x * var_89_2 + arg_89_2.y * var_89_1, arg_89_0.z + arg_89_2.z)
end

function calculate_pitch(arg_90_0, arg_90_1, arg_90_2)
	if arg_90_2 then
		return -1
	end

	local var_90_0 = arg_90_1:GetAbsOrigin()
	local var_90_1 = arg_90_1:GetEyePos()
	local var_90_2 = arg_90_1.m_iHealth:Get()

	if not arg_90_0 or not var_90_0 or not var_90_1 then
		return var_90_2 > 55 and -1 or 0
	end

	local var_90_3 = arg_90_1:GetAbsAngles()
	local var_90_4 = transform_point(var_90_1, var_90_3, Vector(35, 0, 0))
	local var_90_5 = transform_point(var_90_1, var_90_3, Vector(-35, 0, 0))
	local var_90_6 = transform_point(var_90_1, var_90_3, Vector(0, -50, 0))
	local var_90_7 = transform_point(var_90_1, var_90_3, Vector(0, 50, 0))
	local var_90_8 = (arg_90_0 - var_90_4):Length()
	local var_90_9 = (arg_90_0 - var_90_5):Length()
	local var_90_10 = (arg_90_0 - var_90_6):Length()
	local var_90_11 = (arg_90_0 - var_90_7):Length()

	return math.min(var_90_8, var_90_9) < math.min(var_90_10, var_90_11) and -1 or 0
end

events.frameStageNotify:Add(function()
	local var_91_0 = cb_animfix:GetValue():Get()
	local var_91_1 = entities.GetLocalPawn()

	if not var_91_1 or not var_91_1:IsAlive() then
		return
	end

	local var_91_2 = gui.ctx:Find("rage>aimbot>general>headshot only")
	local var_91_3 = var_91_2 and var_91_2:GetValue():Get() or false

	if reset_applied and not var_91_0 then
		return
	end

	if var_91_0 then
		reset_applied = false
	end

	local var_91_4 = var_91_1:GetAbsOrigin()

	entities.players:ForEach(function(arg_92_0)
		local var_92_0 = arg_92_0.entity

		if var_92_0 == var_91_1 or not var_92_0:IsEnemy() then
			return
		end

		local var_92_1 = var_92_0:GetAbsAngles()

		if var_91_0 then
			local var_92_2 = calculate_pitch(var_91_4, var_92_0, var_91_3)

			var_92_0:SetAbsAngles(Vector(var_92_2, var_92_1.y, var_92_1.z))
		elseif not reset_applied then
			var_92_0:SetAbsAngles(Vector(0, var_92_1.y, var_92_1.z))

			reset_applied = true
		end
	end)
end)

flinck_cache = {
	previous_new = 1,
	last_update_time = 0,
	was_less_than_one = false,
	previous = 0,
	disable_until = 0
}
autofire_disabled = false
disable_time = 0

events.event:Add(function(arg_93_0)
	if not game.engine:InGame() or not game.engine:IsConnected() then
		return
	end

	if not cb_anti_aimpunch:GetValue():Get() then
		return
	end

	if arg_93_0:get_name() ~= "player_hurt" then
		return
	end

	local var_93_0 = entities.GetLocalController()

	if not var_93_0 then
		return
	end

	if arg_93_0:GetController("userid") == var_93_0 then
		config.rage.autofire:SetValue(false)

		autofire_disabled = true
		disable_time = game.globalVars.m_flRealTime

		return
	end
end)
events.frameStageNotify:Add(function()
	if not game.engine:InGame() or not game.engine:IsConnected() then
		return
	end

	if not cb_anti_aimpunch:GetValue():Get() then
		return
	end

	local var_94_0 = entities.GetLocalPawn()

	if not var_94_0 or not var_94_0:IsAlive() then
		flinck_cache.previous_new = 1
		flinck_cache.disable_until = 0
		flinck_cache.last_update_time = 0
		flinck_cache.previous = 0
		flinck_cache.was_less_than_one = false

		config.rage.autofire:SetValue(true)

		return
	end

	if autofire_disabled and game.globalVars.m_flRealTime >= disable_time + 0.13 then
		config.rage.autofire:SetValue(true)

		autofire_disabled = false
	end

	local var_94_1 = game.globalVars.m_flRealTime
	local var_94_2 = var_94_0.m_flFlinchStack:Get()

	if var_94_1 - flinck_cache.last_update_time > 0.001 then
		if flinck_cache.previous_new - var_94_2 > 0.1 and flinck_cache.previous_new > 0.1 then
			flinck_cache.disable_until = var_94_1 + 0.13
		elseif var_94_2 - flinck_cache.previous_new > 0.2 then
			flinck_cache.disable_until = 0
		end

		flinck_cache.previous_new = var_94_2
		flinck_cache.last_update_time = var_94_1
	end

	if var_94_1 < flinck_cache.disable_until then
		config.rage.autofire:SetValue(false)
	else
		config.rage.autofire:SetValue(true)
	end
end)

last_toggle_time = 0
toggle_state = false
accuracy_boost_active = false

function restore_accuracy_autostop()
	restore_autostop_for("accuracy", gui.ctx:Find("rage>weapon>SSG-08>extra>autostop>settings>mode"))

	toggle_state = false
	accuracy_boost_active = false
end

events.presentQueue:Add(function()
	if not cb_accuracy_boost:GetValue():Get() then
		restore_accuracy_autostop()

		return
	end

	local var_96_0 = entities.GetLocalPawn()

	if not var_96_0 or not var_96_0:IsAlive() or gui.IsVisible() then
		restore_accuracy_autostop()

		return
	end

	local var_96_1 = gui.ctx:Find("misc>movement>peek assist")

	if var_96_1 and var_96_1:GetValue():Get() then
		restore_accuracy_autostop()

		return
	end

	local var_96_2 = var_96_0:GetAbsVelocity()
	local var_96_3 = math.abs(var_96_2.z) > 0.1

	if jump_backup.was_jumping or var_96_3 then
		restore_accuracy_autostop()

		return
	end

	local var_96_4 = gui.ctx:Find("rage>weapon>SSG-08>extra>autostop>settings>mode")

	if not var_96_4 then
		return
	end

	local var_96_5 = game.globalVars.m_flRealTime

	if var_96_5 - last_toggle_time < 0.1 then
		return
	end

	if not toggle_state then
		set_autostop_for("accuracy", var_96_4, 16)

		accuracy_boost_active = true
	else
		restore_autostop_for("accuracy", var_96_4)

		accuracy_boost_active = false
	end

	toggle_state = not toggle_state
	last_toggle_time = var_96_5
end)

function transform_point(arg_97_0, arg_97_1, arg_97_2)
	local var_97_0 = math.rad(arg_97_1.y)
	local var_97_1 = math.cos(var_97_0)
	local var_97_2 = math.sin(var_97_0)
	local var_97_3 = arg_97_2.x * var_97_1 - arg_97_2.y * var_97_2
	local var_97_4 = arg_97_2.x * var_97_2 + arg_97_2.y * var_97_1

	return Vector(arg_97_0.x + var_97_3, arg_97_0.y + var_97_4, arg_97_0.z + arg_97_2.z)
end

function check_trace(arg_98_0, arg_98_1)
	if not arg_98_0 or not arg_98_1 then
		return false, false, 0
	end

	local var_98_0 = Ray_t()
	local var_98_1 = game.physicsQueryInterface:TraceRay(var_98_0, arg_98_0, arg_98_1, false)

	if not var_98_1 then
		return false, false, 0
	end

	local var_98_2 = var_98_1:DidHitWorld()
	local var_98_3 = var_98_1.m_flFraction or 0
	local var_98_4 = false

	if not var_98_1:DidHit() then
		var_98_4 = true
	else
		local var_98_5 = var_98_1.m_EntHandle and var_98_1.m_EntHandle:get()

		if var_98_5 and var_98_5:IsEnemy() then
			var_98_4 = true
		end
	end

	return var_98_4, var_98_2, var_98_3, var_98_1
end

function get_crosshair_distance(arg_99_0, arg_99_1)
	local var_99_0 = arg_99_0:GetEyePos()

	if not var_99_0 then
		return math.huge
	end

	local var_99_1 = math.WorldToScreen(var_99_0)

	if not var_99_1 then
		return math.huge
	end

	local var_99_2 = var_99_1.x - arg_99_1.x
	local var_99_3 = var_99_1.y - arg_99_1.y

	return math.sqrt(var_99_2 * var_99_2 + var_99_3 * var_99_3)
end

CHECK_POINTS = {
	{
		size = 8,
		x = 10,
		y = 0,
		z = -2,
		color = {
			255,
			0,
			0,
			220
		}
	},
	{
		size = 6,
		x = -12,
		y = -8,
		z = -46,
		color = {
			255,
			165,
			0,
			220
		}
	},
	{
		size = 6,
		x = 16,
		y = 10,
		z = -46,
		color = {
			255,
			165,
			0,
			220
		}
	}
}
auto_force_shot_frame_counter = 0
last_force_shot_result = nil
last_force_shot_time = 0

function perform_force_shot_calculation()
	local var_100_0 = entities.GetLocalPawn()

	if not var_100_0 or not var_100_0:IsAlive() then
		return nil
	end

	local var_100_1 = var_100_0:GetEyePos()

	if not var_100_1 then
		return nil
	end

	local var_100_2, var_100_3 = game.engine:GetScreenSize()
	local var_100_4 = math.Vec2(var_100_2 / 2, var_100_3 / 2)
	local var_100_5 = var_100_1
	local var_100_6 = {}

	entities.players:ForEach(function(arg_101_0)
		local var_101_0 = arg_101_0.entity

		if var_101_0 and var_101_0:IsAlive() and var_101_0:IsEnemy() then
			table.insert(var_100_6, {
				entity = var_101_0,
				distance = get_crosshair_distance(var_101_0, var_100_4)
			})
		end
	end)
	table.sort(var_100_6, function(arg_102_0, arg_102_1)
		return arg_102_0.distance < arg_102_1.distance
	end)

	local var_100_7 = var_100_6[1]
	local var_100_8 = false

	if var_100_7 then
		local var_100_9 = var_100_7.entity
		local var_100_10 = var_100_9:GetEyePos()
		local var_100_11 = var_100_9:GetAbsAngles()

		if var_100_10 and var_100_11 then
			for iter_100_0, iter_100_1 in ipairs(CHECK_POINTS) do
				local var_100_12

				if iter_100_1.x == 0 and iter_100_1.y == 0 and iter_100_1.z == 0 then
					var_100_12 = var_100_10
				else
					var_100_12 = transform_point(var_100_10, var_100_11, Vector(iter_100_1.x, iter_100_1.y, iter_100_1.z))
				end

				if var_100_12 then
					local var_100_13, var_100_14 = check_trace(var_100_5, var_100_12)

					if not var_100_14 then
						var_100_8 = true

						break
					end
				end
			end
		end
	end

	return var_100_8
end

events.createMove:Add(function()
	if not game.engine:InGame() or not game.engine:IsConnected() then
		return
	end

	if not cb_auto_force_shot:GetValue():Get() then
		return
	end

	local var_103_0 = entities.GetLocalPawn()

	if not var_103_0 or not var_103_0:IsAlive() then
		auto_force_shot_frame_counter = 0

		return
	end

	auto_force_shot_frame_counter = auto_force_shot_frame_counter + 1

	local var_103_1

	if auto_force_shot_frame_counter >= 5 then
		auto_force_shot_frame_counter = 0
		var_103_1 = perform_force_shot_calculation()

		if var_103_1 ~= nil then
			last_force_shot_result = var_103_1
			last_force_shot_time = game.globalVars.m_flRealTime
		end
	else
		var_103_1 = last_force_shot_result
	end

	if var_103_1 == nil then
		var_103_1 = false
	end

	local var_103_2 = gui.ctx:Find("rage>aimbot>general>force shoot")

	if var_103_2 then
		var_103_2:SetValue(not var_103_1)
	end
end)

last_knife_state = false
last_dt_on_knife_value = nil
initialized_dt_knife = false

events.presentQueue:Add(function()
	local var_104_0 = cb_dt_on_knife:GetValue():Get()

	if not initialized_dt_knife then
		last_dt_on_knife_value = var_104_0
		initialized_dt_knife = true

		return
	end

	local var_104_1 = config.rage.doubletap
	local var_104_2 = config.rage.doubletap_manual

	if not var_104_0 then
		if last_dt_on_knife_value then
			var_104_1:SetValue(false)
			var_104_2:SetValue(false)

			last_knife_state = false
		end

		last_dt_on_knife_value = false

		return
	end

	local var_104_3 = entities.GetLocalPawn()

	if not var_104_3 or not var_104_3:IsAlive() then
		return
	end

	local var_104_4 = var_104_3:GetActiveWeapon()

	if not var_104_4 then
		return
	end

	local var_104_5 = var_104_4:GetClassName() == "C_Knife"

	if var_104_5 ~= last_knife_state then
		var_104_1:SetValue(var_104_5)
		var_104_2:SetValue(var_104_5)

		last_knife_state = var_104_5
	end

	if var_104_5 and var_104_0 ~= last_dt_on_knife_value then
		var_104_1:SetValue(true)
		var_104_2:SetValue(true)

		last_dt_on_knife_value = var_104_0
	end
end)
events.createMove:Add(function(arg_105_0)
	if not cb_disable_m2_on_r8:GetValue():Get() then
		return
	end

	local var_105_0 = entities.GetLocalPawn()

	if not var_105_0 then
		return
	end

	local var_105_1 = var_105_0:GetActiveWeapon()

	if not var_105_1 then
		return
	end

	if var_105_1:GetDefIndex() == 64 then
		arg_105_0:RemoveButton(InputBitMask_t.IN_ATTACK2)
	end
end)

center_hit_time = 0
in_duck_freestand = false
frame_counter_freestand = 0
last_hit_counts = {
	right = 0,
	center = 0,
	left = 0
}
last_calculated_time = 0

function trace_dir(arg_106_0, arg_106_1, arg_106_2, arg_106_3)
	if not arg_106_0 or not arg_106_1 or not arg_106_2 then
		return arg_106_1, 0
	end

	local var_106_0 = math.sqrt(arg_106_2.x^2 + arg_106_2.y^2 + arg_106_2.z^2)
	local var_106_1 = arg_106_2

	if var_106_0 > 0 then
		var_106_1 = Vector(arg_106_2.x / var_106_0 * arg_106_3, arg_106_2.y / var_106_0 * arg_106_3, arg_106_2.z / var_106_0 * arg_106_3)
	end

	local var_106_2 = Vector(arg_106_1.x + var_106_1.x, arg_106_1.y + var_106_1.y, arg_106_1.z + var_106_1.z)

	if not game.physicsQueryInterface or not game.physicsQueryInterface.TraceRay then
		return var_106_2, arg_106_3
	end

	local var_106_3 = game.physicsQueryInterface:TraceRay(arg_106_0, arg_106_1, var_106_2)

	if var_106_3 and var_106_3:DidHitWorld() then
		local var_106_4 = math.sqrt((var_106_3.m_vEndPos.x - arg_106_1.x)^2 + (var_106_3.m_vEndPos.y - arg_106_1.y)^2 + (var_106_3.m_vEndPos.z - arg_106_1.z)^2)
		local var_106_5 = Vector(var_106_1.x / arg_106_3 * (var_106_4 - 5), var_106_1.y / arg_106_3 * (var_106_4 - 5), var_106_1.z / arg_106_3 * (var_106_4 - 5))

		return Vector(arg_106_1.x + var_106_5.x, arg_106_1.y + var_106_5.y, arg_106_1.z + var_106_5.z), var_106_4
	end

	return var_106_2, arg_106_3
end

function is_point_visible(arg_107_0, arg_107_1, arg_107_2)
	if not arg_107_0 or not arg_107_1 or not arg_107_2 then
		return false
	end

	if not game.physicsQueryInterface or not game.physicsQueryInterface.TraceRay then
		return false
	end

	local var_107_0 = game.physicsQueryInterface:TraceRay(arg_107_0, arg_107_1, arg_107_2)

	if not var_107_0 then
		return false
	end

	local var_107_1 = var_107_0.m_EntHandle and var_107_0.m_EntHandle:get()

	return not var_107_0:DidHitWorld() or var_107_1 and var_107_1:IsEnemy()
end

function get_enemy_points(arg_108_0, arg_108_1)
	local var_108_0 = {}

	if not arg_108_1 or not arg_108_1:ShouldDraw() then
		return var_108_0
	end

	local var_108_1 = arg_108_1:GetEyePos() or arg_108_1:GetAbsOrigin() + Vector(0, 0, 64)

	table.insert(var_108_0, {
		weight = 3,
		pos = var_108_1
	})

	local var_108_2 = {
		{
			70,
			0,
			-10
		},
		{
			-70,
			0,
			-10
		},
		{
			0,
			70,
			-10
		},
		{
			0,
			-70,
			-10
		},
		{
			42,
			42,
			-40
		},
		{
			-42,
			42,
			-40
		},
		{
			42,
			-42,
			-40
		},
		{
			-42,
			-42,
			-40
		}
	}

	for iter_108_0, iter_108_1 in ipairs(var_108_2) do
		local var_108_3 = Vector(iter_108_1[1], iter_108_1[2], iter_108_1[3])
		local var_108_4 = math.sqrt(var_108_3.x^2 + var_108_3.y^2 + var_108_3.z^2)

		if var_108_4 > 0 then
			var_108_3 = Vector(var_108_3.x / var_108_4, var_108_3.y / var_108_4, var_108_3.z / var_108_4)
		end

		local var_108_5 = Vector(var_108_1.x + var_108_3.x * 100, var_108_1.y + var_108_3.y * 100, var_108_1.z + var_108_3.z * 100)
		local var_108_6 = var_108_5

		if game.physicsQueryInterface and game.physicsQueryInterface.TraceRay then
			local var_108_7 = game.physicsQueryInterface:TraceRay(arg_108_0, var_108_1, var_108_5)

			if var_108_7 and var_108_7:DidHitWorld() then
				local var_108_8 = math.sqrt((var_108_7.m_vEndPos.x - var_108_1.x)^2 + (var_108_7.m_vEndPos.y - var_108_1.y)^2 + (var_108_7.m_vEndPos.z - var_108_1.z)^2)

				var_108_6 = Vector(var_108_1.x + var_108_3.x * (var_108_8 - 5), var_108_1.y + var_108_3.y * (var_108_8 - 5), var_108_1.z + var_108_3.z * (var_108_8 - 5))
			end
		end

		table.insert(var_108_0, {
			weight = 2,
			pos = var_108_6
		})
	end

	return var_108_0
end

function check_hits(arg_109_0, arg_109_1, arg_109_2, arg_109_3)
	if not arg_109_3 then
		return
	end

	if not entities.players then
		return
	end

	entities.players:ForEach(function(arg_110_0)
		local var_110_0 = arg_110_0.entity

		if var_110_0 and var_110_0:IsAlive() and var_110_0:IsEnemy() then
			for iter_110_0, iter_110_1 in ipairs(get_enemy_points(arg_109_0, var_110_0)) do
				if is_point_visible(arg_109_0, arg_109_1, iter_110_1.pos) then
					arg_109_3[arg_109_2] = arg_109_3[arg_109_2] + (iter_110_1.weight or 1)
				end
			end
		end
	end)
end

function get_directions(arg_111_0, arg_111_1)
	return {
		left = Vector(math.cos(arg_111_0 - math.rad(90)), math.sin(arg_111_0 - math.rad(90)), 0),
		right = Vector(math.cos(arg_111_0 + math.rad(90)), math.sin(arg_111_0 + math.rad(90)), 0),
		center = Vector(math.cos(arg_111_0) * math.cos(arg_111_1), math.sin(arg_111_0) * math.cos(arg_111_1), math.sin(arg_111_1))
	}
end

function perform_heavy_calculations()
	local var_112_0 = entities.GetLocalPawn()

	if not var_112_0 or not var_112_0:IsAlive() then
		return nil
	end

	local var_112_1 = game.input:GetViewAngles()

	if not var_112_1 then
		return nil
	end

	local var_112_2 = math.rad(var_112_1.y)
	local var_112_3 = math.rad(var_112_1.x)
	local var_112_4 = get_directions(var_112_2, var_112_3)
	local var_112_5 = var_112_0:GetEyePos()

	if not var_112_5 then
		return nil
	end

	local var_112_6 = 50
	local var_112_7 = 0
	local var_112_8 = ray_t()
	local var_112_9 = {
		right = 0,
		center = 0,
		left = 0
	}
	local var_112_10, var_112_11 = trace_dir(var_112_8, var_112_5, var_112_4.left, var_112_6)
	local var_112_12, var_112_13 = trace_dir(var_112_8, var_112_5, var_112_4.right, var_112_6)
	local var_112_14, var_112_15 = trace_dir(var_112_8, var_112_5, var_112_4.center, var_112_7)

	check_hits(var_112_8, var_112_14, "center", var_112_9)
	check_hits(var_112_8, var_112_10, "left", var_112_9)
	check_hits(var_112_8, var_112_12, "right", var_112_9)

	return var_112_9
end

events.createMove:Add(function(arg_113_0)
	if not cb_freestands:GetValue():Get() then
		return
	end

	in_duck_freestand = arg_113_0:GetButton(InputBitMask_t.IN_DUCK)
end)
events.presentQueue:Add(function()
	if not game.engine:InGame() or not game.engine:IsConnected() then
		return
	end

	local var_114_0 = config.anti_aim.right_override
	local var_114_1 = config.anti_aim.left_override

	if not cb_freestands:GetValue():Get() then
		if var_114_0 and var_114_1 then
			var_114_0:SetValue(false)
			var_114_1:SetValue(false)
		end

		center_hit_time = 0
		frame_counter_freestand = 0

		return
	end

	local var_114_2 = entities.GetLocalPawn()

	if not var_114_2 or not var_114_2:IsAlive() then
		frame_counter_freestand = 0

		return
	end

	local var_114_3 = in_duck_freestand or config.misc.duck_peek_control:GetValue():Get()
	local var_114_4 = is_hotkey_on("rage>anti-aim>angles>manual override>override left") or is_hotkey_on("rage>anti-aim>angles>manual override>override right") or is_hotkey_on("rage>anti-aim>angles>manual override>override back") or is_hotkey_on("rage>anti-aim>angles>manual override>override forward")
	local var_114_5 = var_114_2:GetAbsVelocity()
	local var_114_6 = math.abs(var_114_5.z) > 0.1
	local var_114_7 = cb_freestands_off_in_air:GetValue():Get()

	if var_114_3 or var_114_4 or var_114_7 and var_114_6 then
		if var_114_0 and var_114_1 then
			var_114_0:SetValue(false)
			var_114_1:SetValue(false)
		end

		center_hit_time = 0
		frame_counter_freestand = 0

		return
	end

	frame_counter_freestand = frame_counter_freestand + 1

	local var_114_8

	if frame_counter_freestand >= 5 then
		frame_counter_freestand = 0
		var_114_8 = perform_heavy_calculations()

		if var_114_8 then
			last_hit_counts = var_114_8
			last_calculated_time = game.globalVars.m_flRealTime
		end
	else
		var_114_8 = last_hit_counts
	end

	if not var_114_8 then
		return
	end

	if var_114_0 and var_114_1 then
		local var_114_9 = game.globalVars.m_flRealTime

		if var_114_8.center >= 10 then
			var_114_0:SetValue(false)
			var_114_1:SetValue(false)

			center_hit_time = 0
		elseif var_114_8.center > 3 then
			if center_hit_time == 0 then
				center_hit_time = var_114_9
			end

			if var_114_9 - center_hit_time >= 0.3 then
				var_114_0:SetValue(false)
				var_114_1:SetValue(false)

				center_hit_time = 0
			end
		else
			center_hit_time = 0

			local var_114_10 = var_114_8.left
			local var_114_11 = var_114_8.right

			var_114_0:SetValue(var_114_10 < var_114_11)
			var_114_1:SetValue(var_114_11 < var_114_10)
		end
	end
end)

stored_aa_state = nil
is_on_ladder = false

function normalize_angle(arg_115_0)
	arg_115_0 = arg_115_0 % 360

	if arg_115_0 > 180 then
		arg_115_0 = arg_115_0 - 360
	end

	return arg_115_0
end

is_fast_ladder_active = false
activation_time = 0

events.createMove:Add(function(arg_116_0)
	if not cb_fast_ladder:GetValue():Get() then
		return
	end

	local var_116_0 = entities.GetLocalPawn()

	if not var_116_0 or not var_116_0:IsAlive() then
		return
	end

	local var_116_1 = gui.input

	if arg_116_0:GetButton(InputBitMask_t.IN_JUMP) or arg_116_0:GetButton(InputBitMask_t.IN_SPEED) then
		is_fast_ladder_active = false

		return
	end

	if not var_116_1:IsKeyDown(87) and not var_116_1:IsKeyDown(83) then
		is_fast_ladder_active = false

		return
	end

	local var_116_2 = var_116_0:GetAbsVelocity()

	is_on_ladder = math.abs(var_116_2.z) > 1 and var_116_2:Length2d() < 50

	if not is_on_ladder then
		is_fast_ladder_active = false

		return
	end

	if not is_fast_ladder_active then
		activation_time = game.globalVars.m_flRealTime
		is_fast_ladder_active = true
	end

	if game.globalVars.m_flRealTime - activation_time < 0.01 then
		return
	end

	local var_116_3 = arg_116_0:GetViewangles()
	local var_116_4 = -90

	arg_116_0:SetViewangles(Vector(89, normalize_angle(var_116_3.y + var_116_4), 0))

	if arg_116_0:GetButton(InputBitMask_t.IN_FORWARD) then
		arg_116_0:SetLeftMove(1)
		arg_116_0:SetForwardMove(-1)
	elseif arg_116_0:GetButton(InputBitMask_t.IN_BACK) then
		arg_116_0:SetLeftMove(-1)
		arg_116_0:SetForwardMove(1)
	end
end)

fast_angles_yaw = nil
fast_angles_active = false
fast_time = 1e-05

function is_override_enabled(arg_117_0)
	local var_117_0 = config.anti_aim[arg_117_0 .. "_override"]

	return var_117_0 and var_117_0:GetValue():Get()
end

function apply_angles(arg_118_0, arg_118_1)
	local var_118_0 = arg_118_0:GetForwardMove()
	local var_118_1 = arg_118_0:GetLeftMove()
	local var_118_2 = game.input:GetViewAngles()

	fast_angles_yaw = arg_118_1.y

	arg_118_0:SetViewangles(var_118_2)
	arg_118_0:SetForwardMove(var_118_0)
	arg_118_0:SetLeftMove(var_118_1)

	if var_118_0 ~= 0 or var_118_1 ~= 0 then
		arg_118_0:RotateMovement(var_118_2.y)
	end

	arg_118_0:SetViewangles(arg_118_1)
	arg_118_0:LockAngles()
	game.input:SetViewAngles(var_118_2)

	if var_118_0 ~= 0 or var_118_1 ~= 0 then
		arg_118_0:RotateMovement(var_118_2.y)
	end
end

function handle_direction_override(arg_119_0, arg_119_1)
	local var_119_0 = game.globalVars.m_flRealTime
	local var_119_1 = game.input:GetViewAngles()
	local var_119_2 = 0

	if override_in_progress and override_direction ~= arg_119_1 and not override_transitioning then
		override_transitioning = true
		override_transition_end_time = var_119_0 + fast_time
		previous_override_direction = override_direction
		override_direction = nil
	end

	if override_transitioning then
		if var_119_0 >= override_transition_end_time then
			override_transitioning = false
			override_in_progress = true
			override_direction = arg_119_1
			override_delay_time = var_119_0 + fast_time
			var_119_2 = arg_119_1 == "left" and 90 or 90
		end
	elseif not override_in_progress or override_direction ~= arg_119_1 then
		override_in_progress = true
		override_direction = arg_119_1
		override_delay_time = var_119_0 + fast_time
		var_119_2 = arg_119_1 == "left" and -40 or 78
	else
		var_119_2 = arg_119_1 == "left" and 20 or 20
	end

	local var_119_3 = Vector(var_119_1.x, normalize_angle(var_119_1.y + var_119_2), 0)

	apply_angles(arg_119_0, var_119_3)
end

yaw_base_original = nil
yaw_base_saved = false

function set_yaw_base(arg_120_0)
	local var_120_0 = gui.ctx:Find("rage>anti-aim>angles>yaw base")

	if not var_120_0 then
		return
	end

	local var_120_1 = var_120_0:GetValue()

	if not var_120_1 then
		return
	end

	local var_120_2 = var_120_1:Get()

	var_120_2:SetRaw(arg_120_0)
	var_120_1:Set(var_120_2)
	var_120_0:Reset()
end

closest_enemy_object = nil
split_angles_active = false
split_stage = nil
split_start_time = 0
split_target_angles = {}
split_current_index = 1
split_duration = 0.001
right_offset = 20

events.createMove:Add(function(arg_121_0)
	slot_121_1_0 = cb_fast_angles:GetValue():Get()

	if cb_blockbot:GetValue():Get() then
		return
	end

	if slot_121_1_0 then
		if not yaw_base_saved then
			slot_121_2_1 = gui.ctx:Find("rage>anti-aim>angles>yaw base")

			if slot_121_2_1 then
				slot_121_3_1 = slot_121_2_1:GetValue()

				if slot_121_3_1 then
					yaw_base_original = slot_121_3_1:Get():GetRaw()
					yaw_base_saved = true
				end
			end
		end

		set_yaw_base(1)
	elseif yaw_base_saved and yaw_base_original then
		set_yaw_base(yaw_base_original)

		yaw_base_saved = false
		yaw_base_original = nil
	end

	if not slot_121_1_0 then
		fast_angles_active = false

		return
	end

	if is_on_ladder or is_mouse_down() or not config.anti_aim.anti_aim:GetValue():Get() or arg_121_0:GetButton(InputBitMask_t.IN_USE) then
		return
	end

	slot_121_2_0 = entities.GetLocalPawn()

	if not slot_121_2_0 then
		return
	end

	slot_121_3_0 = slot_121_2_0:GetActiveWeapon()

	if not slot_121_3_0 or is_grenade(slot_121_3_0:GetDefIndex()) then
		fast_angles_active = false

		return
	end

	function slot_121_4_0(arg_122_0)
		handle_direction_override(arg_121_0, arg_122_0)

		previous_override_direction = arg_122_0
	end

	if is_override_enabled("left") then
		slot_121_4_0("left")

		return
	elseif is_override_enabled("right") then
		slot_121_4_0("right")

		return
	elseif previous_override_direction then
		slot_121_5_1 = config.anti_aim.back_override

		if slot_121_5_1 then
			slot_121_5_1:SetValue(true)

			slot_121_6_1 = previous_override_direction == "left" and 80 or -40

			if override_transitioning and game.globalVars.m_flRealTime >= override_transition_end_time then
				override_transitioning = false
				override_in_progress = true
				override_direction = "back"
				override_delay_time = game.globalVars.m_flRealTime + fast_time
			end

			slot_121_7_1 = Vector(game.input:GetViewAngles().x, normalize_angle(game.input:GetViewAngles().y + slot_121_6_1), 0)

			apply_angles(arg_121_0, slot_121_7_1)
			slot_121_5_1:SetValue(false)

			previous_override_direction = nil

			return
		end
	end

	override_in_progress = false
	override_direction = nil
	slot_121_5_0 = slot_121_2_0:GetAbsOrigin()
	slot_121_6_0 = game.input:GetViewAngles()
	slot_121_7_0, slot_121_8_0 = game.engine:GetScreenSize()
	slot_121_9_0 = slot_121_7_0 / 2
	slot_121_10_0 = slot_121_8_0 / 2
	slot_121_11_0 = closest_enemy_object
	slot_121_12_0 = nil
	slot_121_13_0 = math.huge
	slot_121_14_0 = {}

	entities.players:for_each(function(arg_123_0)
		local var_123_0 = arg_123_0.entity:ToPlayerPawn()

		if var_123_0 and var_123_0:IsAlive() and var_123_0:IsEnemy() then
			table.insert(slot_121_14_0, var_123_0)
		end
	end)

	for iter_121_0, iter_121_1 in ipairs(slot_121_14_0) do
		slot_121_21_2 = (vector_to_angles(slot_121_5_0, iter_121_1:GetAbsOrigin()).y - slot_121_6_0.y + 180) % 360 - 180
		slot_121_22_3 = math.abs(slot_121_21_2)

		if slot_121_22_3 < slot_121_13_0 then
			slot_121_13_0 = slot_121_22_3
			slot_121_12_0 = iter_121_1
		end
	end

	if slot_121_12_0 and slot_121_11_0 ~= slot_121_12_0 then
		slot_121_15_2 = {}

		for iter_121_2, iter_121_3 in ipairs(slot_121_14_0) do
			if iter_121_3 ~= slot_121_12_0 then
				table.insert(slot_121_15_2, iter_121_3)
			end
		end

		if #slot_121_15_2 > 0 then
			slot_121_16_2 = vector_to_angles(slot_121_5_0, slot_121_12_0:GetAbsOrigin())
			slot_121_17_2 = math.huge
			slot_121_18_1 = nil

			for iter_121_4, iter_121_5 in ipairs(slot_121_15_2) do
				slot_121_24_1 = vector_to_angles(slot_121_5_0, iter_121_5:GetAbsOrigin())
				slot_121_25_0 = (slot_121_16_2.y - slot_121_24_1.y + 180) % 360 - 180
				slot_121_26_1 = math.abs(slot_121_25_0)

				if slot_121_26_1 < slot_121_17_2 then
					slot_121_17_2 = slot_121_26_1
					slot_121_18_1 = iter_121_5
				end
			end

			if slot_121_18_1 then
				slot_121_19_0 = vector_to_angles(slot_121_5_0, slot_121_18_1:GetAbsOrigin())
				slot_121_20_1 = (slot_121_16_2.y - slot_121_19_0.y + 180) % 360 - 180
				slot_121_21_1 = math.abs(slot_121_20_1)
				slot_121_22_1 = 60
				slot_121_23_2 = math.floor(slot_121_21_1 / slot_121_22_1)

				if slot_121_23_2 < 1 then
					slot_121_23_2 = 1
				end

				if slot_121_23_2 > 10 then
					slot_121_23_2 = 10
				end

				if slot_121_22_1 < slot_121_21_1 then
					split_target_angles = {}
					slot_121_24_0 = slot_121_19_0.y
					slot_121_26_0 = (slot_121_16_2.y - slot_121_24_0 + 180) % 360 - 180

					for iter_121_6 = 1, slot_121_23_2 do
						slot_121_31_0 = iter_121_6 / slot_121_23_2
						slot_121_32_0 = normalize_angle(slot_121_24_0 + slot_121_26_0 * slot_121_31_0)

						table.insert(split_target_angles, slot_121_32_0)
					end

					if not split_angles_active then
						split_angles_active = true
						split_current_index = 1
						split_start_time = game.globalVars.m_flRealTime
					end
				end
			end
		end

		closest_enemy_object = slot_121_12_0
	end

	if split_angles_active and #split_target_angles > 0 then
		slot_121_15_1 = game.globalVars.m_flRealTime
		slot_121_16_1 = slot_121_15_1 - split_start_time

		if split_current_index <= #split_target_angles then
			if slot_121_16_1 < split_duration then
				slot_121_17_1 = split_target_angles[split_current_index]
				slot_121_18_0 = Vector(0, slot_121_17_1, 0)

				apply_angles(arg_121_0, slot_121_18_0)

				fast_angles_active = true

				return
			else
				split_current_index = split_current_index + 1
				split_start_time = slot_121_15_1
			end
		else
			split_angles_active = false
			split_target_angles = {}
			split_current_index = 1
		end
	end

	if slot_121_12_0 then
		fast_angles_active = true
		slot_121_15_0 = game.globalVars.m_flRealTime

		if delayed_enemy ~= slot_121_12_0 then
			delayed_enemy = slot_121_12_0
			angle_delay_time = slot_121_15_0 + fast_time
			is_delaying = true
		end

		slot_121_16_0 = vector_to_angles(slot_121_5_0, slot_121_12_0:GetAbsOrigin())
		slot_121_16_0.y = normalize_angle(slot_121_16_0.y + right_offset)
		slot_121_17_0 = (slot_121_16_0.y - game.input:GetViewAngles().y + 180) % 360 - 180

		if is_delaying and slot_121_15_0 < angle_delay_time then
			slot_121_20_0 = (slot_121_16_0.y - game.input:GetViewAngles().y + 180) % 360 - 180
			slot_121_21_0 = math.abs(slot_121_20_0)
			slot_121_22_0 = 61

			if slot_121_21_0 > 90 then
				slot_121_23_1 = slot_121_17_0 > 0 and -slot_121_22_0 or slot_121_22_0
				slot_121_16_0.y = normalize_angle(slot_121_16_0.y + slot_121_23_1)
			else
				slot_121_23_0 = slot_121_17_0 > 0 and slot_121_22_0 or -slot_121_22_0
				slot_121_16_0.y = normalize_angle(slot_121_16_0.y + slot_121_23_0)
			end
		else
			is_delaying = false
		end

		apply_angles(arg_121_0, slot_121_16_0)
	else
		delayed_enemy = nil
		is_delaying = false
		fast_angles_active = false
		closest_enemy_object = nil
		split_angles_active = false
		split_target_angles = {}
		split_current_index = 1
	end
end)

was_using_in_zone = false
switched = false

events.createMove:Add(function(arg_124_0)
	if not cb_quick_plant:GetValue():Get() then
		return
	end

	local var_124_0 = entities.GetLocalPawn()

	if not var_124_0 then
		return
	end

	local var_124_1 = var_124_0.m_nWhichBombZone:Get() ~= 0
	local var_124_2 = arg_124_0:GetButton(InputBitMask_t.IN_USE)

	if var_124_1 and var_124_2 then
		was_using_in_zone = true
		switched = false

		game.engine:ClientCmd("slot5")
	elseif was_using_in_zone and not var_124_2 then
		if not switched then
			game.engine:ClientCmd("slot2;slot1")

			switched = true
		end

		was_using_in_zone = false
	elseif not var_124_1 then
		was_using_in_zone = false
		switched = false
	end
end)

duck_peek_enabled = false
was_ducking = false

events.createMove:Add(function(arg_125_0)
	if not cb_smart_jump_bug:GetValue():Get() then
		return
	end

	local var_125_0 = entities.GetLocalPawn()

	if not var_125_0 or not var_125_0:IsAlive() then
		return
	end

	if cb_height_advantage:GetValue():Get() then
		config.misc.jumpbug:SetValue(true)

		return
	end

	if not (gui.input:IsKeyDown(KEY_W) or gui.input:IsKeyDown(KEY_A) or gui.input:IsKeyDown(KEY_S) or gui.input:IsKeyDown(KEY_D)) then
		config.misc.jumpbug:SetValue(false)

		duck_peek_enabled = false

		return
	end

	local var_125_1 = arg_125_0:GetButton(InputBitMask_t.IN_DUCK)

	if var_125_1 ~= was_ducking then
		was_ducking = var_125_1
		duck_peek_enabled = false

		config.misc.jumpbug:SetValue(false)

		return
	end

	if not duck_peek_enabled and not var_125_1 then
		config.misc.jumpbug:SetValue(true)

		duck_peek_enabled = true
	end
end)

prev_no_fall = nil

events.presentQueue:Add(function()
	local var_126_0 = cb_no_fall:GetValue():Get()

	if prev_no_fall == nil then
		prev_no_fall = var_126_0

		return
	end

	if prev_no_fall ~= var_126_0 then
		gui.ctx:Find("misc>movement>no land inaccuracy"):SetValue(var_126_0)

		prev_no_fall = var_126_0
	end
end)

last_activation_time = -1
jump_started = false
saved_autostrafer = nil
saved_jumpbug = nil
saved_aimbot = nil
auto_changed = false
jumpbug_changed = false
aimbot_changed = false

function set_autostrafer(arg_127_0)
	local var_127_0 = config.misc.autostrafer

	if not var_127_0 then
		return
	end

	local var_127_1 = var_127_0:GetValue():Get()

	if not var_127_1 then
		return
	end

	var_127_1:SetRaw(arg_127_0)
	var_127_0:GetValue():Set(var_127_1)
end

events.createMove:Add(function(arg_128_0)
	if cb_height_advantage:GetValue():Get() then
		local var_128_0 = game.globalVars.m_flRealTime

		config.misc.duck_peek_control:SetValue(true)

		if config.rage.aimbot and not aimbot_changed then
			saved_aimbot = config.rage.aimbot:GetValue():Get()

			config.rage.aimbot:SetValue(true)

			aimbot_changed = true
		end

		if config.misc.jumpbug and not jumpbug_changed then
			saved_jumpbug = config.misc.jumpbug:GetValue():Get()

			config.misc.jumpbug:SetValue(true)

			jumpbug_changed = true
		end

		if config.misc.autostrafer and not auto_changed then
			saved_autostrafer = config.misc.autostrafer:GetValue():Get():GetRaw()

			set_autostrafer(110)

			auto_changed = true
		end

		if last_activation_time < 0 then
			last_activation_time = var_128_0
		elseif var_128_0 - last_activation_time >= 0.2 then
			if not jump_started then
				arg_128_0:SetButton(InputBitMask_t.IN_JUMP)

				jump_started = true
			else
				jump_started = false
			end
		end
	else
		last_activation_time = -1
		jump_started = false

		config.misc.duck_peek_control:SetValue(false)

		if jumpbug_changed and saved_jumpbug then
			config.misc.jumpbug:SetValue(saved_jumpbug)

			jumpbug_changed = false
			saved_jumpbug = nil
		end

		if auto_changed and saved_autostrafer then
			set_autostrafer(saved_autostrafer)

			auto_changed = false
			saved_autostrafer = nil
		end

		if aimbot_changed and saved_aimbot then
			config.rage.aimbot:SetValue(saved_aimbot)

			aimbot_changed = false
			saved_aimbot = nil
		end
	end
end)

slot_0_4_0 = nil
last_auto_apply_time = 0
value_map = {
	-1,
	nil,
	nil,
	0,
	nil,
	nil,
	nil,
	1,
	[128] = 5,
	[16] = 2,
	[32] = 3,
	[64] = 4
}

function get_ping_net()
	local var_129_0 = game.engine:GetNetChan()

	if not var_129_0 or not var_129_0.GetLatency then
		return 0
	end

	local var_129_1 = var_129_0:GetLatency()

	return var_129_1 and math.floor(var_129_1 * 1000 + 0.5) or 0
end

function auto_values(arg_130_0)
	local var_130_0 = arg_130_0 < 30 and 0 or arg_130_0 < 50 and 1 or arg_130_0 < 70 and 2 or arg_130_0 < 90 and 3 or arg_130_0 < 110 and 4 or 5
	local var_130_1 = arg_130_0 < 30 and 1 or arg_130_0 < 70 and 2 or arg_130_0 < 90 and 3 or arg_130_0 < 110 and 4 or 5

	return var_130_0, var_130_1
end

events.presentQueue:Add(function()
	local var_131_0 = game.globalVars.m_flRealTime
	local var_131_1 = cbx_network_mode:GetValue():Get():GetRaw()

	if var_131_1 == 1 then
		if slot_0_4_0 ~= 1 then
			game.engine:ClientCmd("cl_net_buffer_ticks_use_interp false")

			slot_0_4_0 = 1
		end

		return
	end

	local var_131_2 = var_131_0 - last_auto_apply_time >= 10
	local var_131_3 = get_ping_net()
	local var_131_4
	local var_131_5
	local var_131_6

	if var_131_1 == 2 and var_131_2 then
		var_131_4, var_131_6 = auto_values(var_131_3)
		var_131_5 = var_131_4
		last_auto_apply_time = var_131_0
	else
		var_131_4 = value_map[var_131_1]
		var_131_5 = var_131_4
		var_131_6 = var_131_4
	end

	game.engine:ClientCmd("cl_net_buffer_ticks_use_interp true")

	if var_131_1 ~= slot_0_4_0 or var_131_1 == 2 and var_131_2 then
		slot_0_4_0 = var_131_1

		if var_131_4 then
			game.engine:ClientCmd("cl_net_buffer_ticks " .. var_131_4)
		end

		if var_131_5 then
			game.engine:ClientCmd("cl_tickpacket_desired_queuelength " .. var_131_5)
		end

		if var_131_6 then
			game.engine:ClientCmd("cl_interp_ratio " .. var_131_6)
		end
	end
end)

grenade_throw_time = nil
grenade_draw_time = -1
last_weapon_id = nil
pending_left = false
pending_right = false
pending_release_left = false
pending_release_right = false
auto_state = nil
auto_tick = 0
GRENADE_BLOCK_TIME = 1
mouse = {
	right = false,
	left = false
}

function reset()
	grenade_draw_time = -1
	pending_left = false
	pending_right = false
	pending_release_left = false
	pending_release_right = false
	auto_state = nil
	auto_tick = 0
end

events.input:Add(function(arg_133_0)
	if not cb_fast_grenade:GetValue():Get() then
		return
	end

	if arg_133_0 == 513 then
		mouse.left = true
	elseif arg_133_0 == 514 then
		mouse.left = false

		if grenade_draw_time ~= -1 then
			pending_release_left = true
		end
	elseif arg_133_0 == 516 then
		mouse.right = true
	elseif arg_133_0 == 517 then
		mouse.right = false

		if grenade_draw_time ~= -1 then
			pending_release_right = true
		end
	end
end)
events.createMove:Add(function(arg_134_0)
	if not game.engine:InGame() or not game.engine:IsConnected() then
		return
	end

	if not cb_fast_grenade:GetValue():Get() then
		return
	end

	local var_134_0 = entities.GetLocalPawn()

	if not var_134_0 then
		return
	end

	local var_134_1 = var_134_0:GetActiveWeapon()

	if not var_134_1 then
		return
	end

	local var_134_2 = var_134_1:GetDefIndex()
	local var_134_3 = game.globalVars.m_flRealTime

	if var_134_2 ~= last_weapon_id then
		reset()

		last_weapon_id = var_134_2
	end

	if not is_grenade(var_134_2) then
		reset()

		return
	end

	if grenade_draw_time == -1 then
		grenade_draw_time = var_134_3
	end

	if var_134_3 - grenade_draw_time < GRENADE_BLOCK_TIME then
		arg_134_0:RemoveButton(InputBitMask_t.IN_ATTACK)
		arg_134_0:RemoveButton(InputBitMask_t.IN_ATTACK2)

		if mouse.left then
			pending_left = true
		end

		if mouse.right then
			pending_right = true
		end

		return
	end

	if auto_state == nil then
		if pending_release_left then
			auto_state = "throw_left"
			auto_tick = 0
			pending_release_left = false
		elseif pending_release_right then
			auto_state = "throw_right"
			auto_tick = 0
			pending_release_right = false
		elseif pending_left then
			auto_state = "throw_left"
			auto_tick = 0
			pending_left = false
		elseif pending_right then
			auto_state = "throw_right"
			auto_tick = 0
			pending_right = false
		end
	end

	if auto_state == "throw_left" then
		arg_134_0:SetButton(InputBitMask_t.IN_ATTACK)

		if auto_tick == 0 then
			grenade_throw_time = game.globalVars.m_flRealTime
		end

		auto_tick = auto_tick + 1

		if auto_tick > 2 then
			auto_state = "swap"
			auto_tick = 0
		end
	elseif auto_state == "throw_right" then
		arg_134_0:SetButton(InputBitMask_t.IN_ATTACK2)

		if auto_tick == 0 then
			grenade_throw_time = game.globalVars.m_flRealTime
		end

		auto_tick = auto_tick + 1

		if auto_tick > 2 then
			auto_state = "swap"
			auto_tick = 0
		end
	elseif auto_state == "swap" then
		arg_134_0:RemoveButton(InputBitMask_t.IN_ATTACK)
		arg_134_0:RemoveButton(InputBitMask_t.IN_ATTACK2)

		auto_tick = auto_tick + 1

		if auto_tick > 1 then
			game.engine:ClientCmd("slot2;slot1")
			reset()
		end
	end
end)

keys = {
	"w",
	"a",
	"s",
	"d"
}
key_codes = {
	w = KEY_W,
	a = KEY_A,
	s = KEY_S,
	d = KEY_D
}
last_direction = {
	w = false,
	s = false,
	a = false,
	d = false
}
last_key_release_time = {
	w = 0,
	s = 0,
	a = 0,
	d = 0
}
saved_slowwalk_speed = nil
active_slowwalk_controller = nil
slowwalk_start_time = nil
last_opposite_press_time = 0
last_ground_time = 0
just_entered_air = false
was_in_air = false
slowwalk_setting = gui.ctx:Find("misc>movement>slowwalk")
slowwalk_speed_node = gui.ctx:Find("misc>movement>slowwalk speed")

function copy_direction_state(arg_135_0)
	local var_135_0 = {}

	for iter_135_0, iter_135_1 in ipairs(keys) do
		var_135_0[iter_135_1] = arg_135_0[iter_135_1]
	end

	return var_135_0
end

function is_key_active_with_delay(arg_136_0, arg_136_1, arg_136_2)
	return arg_136_0 or arg_136_1 - last_key_release_time[arg_136_2] <= 0.2
end

function is_opposite_key_combo_with_delay(arg_137_0, arg_137_1, arg_137_2, arg_137_3, arg_137_4)
	local var_137_0 = is_key_active_with_delay(arg_137_0[arg_137_3], arg_137_2, arg_137_3)
	local var_137_1 = is_key_active_with_delay(arg_137_0[arg_137_4], arg_137_2, arg_137_4)
	local var_137_2 = is_key_active_with_delay(arg_137_1[arg_137_3], arg_137_2, arg_137_3)
	local var_137_3 = is_key_active_with_delay(arg_137_1[arg_137_4], arg_137_2, arg_137_4)

	return var_137_0 and not var_137_1 and var_137_2 and var_137_3 or not var_137_0 and var_137_1 and var_137_2 and var_137_3
end

function count_active_keys(arg_138_0, arg_138_1)
	local var_138_0 = 0

	for iter_138_0, iter_138_1 in ipairs(keys) do
		if is_key_active_with_delay(arg_138_0[iter_138_1], arg_138_1, iter_138_1) then
			var_138_0 = var_138_0 + 1
		end
	end

	return var_138_0
end

function is_single_key_event(arg_139_0, arg_139_1, arg_139_2, arg_139_3)
	if arg_139_3 == "press" then
		return not arg_139_0[arg_139_2] and arg_139_1[arg_139_2]
	end

	if arg_139_3 == "release" then
		return arg_139_0[arg_139_2] and not arg_139_1[arg_139_2]
	end

	return false
end

function no_keys_pressed_except(arg_140_0, arg_140_1)
	for iter_140_0, iter_140_1 in ipairs(keys) do
		if iter_140_1 ~= arg_140_1 and arg_140_0[iter_140_1] then
			return false
		end
	end

	return true
end

function save_slowwalk_speed()
	if not saved_slowwalk_speed then
		saved_slowwalk_speed = slowwalk_speed_node:Get()
	end
end

function restore_slowwalk_speed()
	if saved_slowwalk_speed then
		slowwalk_speed_node:GetValue():Set(saved_slowwalk_speed)

		saved_slowwalk_speed = nil
	end
end

function update_slowwalk()
	if active_slowwalk_controller then
		slowwalk_setting:SetValue(true)
	else
		slowwalk_setting:SetValue(false)
		restore_slowwalk_speed()
	end
end

function is_moving()
	local var_144_0 = gui.input

	for iter_144_0, iter_144_1 in ipairs(keys) do
		if var_144_0:IsKeyDown(key_codes[iter_144_1]) then
			return true
		end
	end

	return false
end

function is_only_w_pressed()
	local var_145_0 = gui.input

	return var_145_0:IsKeyDown(KEY_W) and not var_145_0:IsKeyDown(KEY_A) and not var_145_0:IsKeyDown(KEY_S) and not var_145_0:IsKeyDown(KEY_D)
end

function is_holding_grenade()
	local var_146_0 = entities.GetLocalPawn()

	if not var_146_0 or not var_146_0:IsAlive() then
		return false
	end

	local var_146_1 = var_146_0:GetActiveWeapon()

	return var_146_1 and var_146_1:GetType() == CSWeaponType.GRENADE
end

function get_grenade_delay(arg_147_0)
	if arg_147_0 == 2 then
		return 0.1
	end

	if arg_147_0 == 4 then
		return 0.15
	end

	return 0.2
end

events.presentQueue:Add(function()
	if not slowwalk_setting or not slowwalk_speed_node then
		return
	end

	slot_148_0_0 = entities.GetLocalPawn()
	slot_148_1_0 = game.global_vars.real_time

	if not slot_148_0_0 or not slot_148_0_0:IsAlive() then
		active_slowwalk_controller = nil

		restore_slowwalk_speed()
		update_slowwalk()

		return
	end

	slot_148_2_0 = cb_autostrafer:GetValue():Get()
	slot_148_3_0 = cb_fast_stop_in_air:GetValue():Get()
	slot_148_4_0 = cbx_grenade_fix:GetValue():Get():GetRaw() ~= 1

	if not slot_148_2_0 and not slot_148_3_0 and not slot_148_4_0 then
		active_slowwalk_controller = nil

		restore_slowwalk_speed()
		update_slowwalk()

		return
	end

	slot_148_5_0 = gui.input
	slot_148_6_0 = {}

	for iter_148_0, iter_148_1 in ipairs(keys) do
		slot_148_6_0[iter_148_1] = slot_148_5_0:IsKeyDown(key_codes[iter_148_1])

		if last_direction[iter_148_1] and not slot_148_6_0[iter_148_1] then
			last_key_release_time[iter_148_1] = slot_148_1_0
		end
	end

	slot_148_7_0 = slot_148_0_0:GetAbsVelocity()
	slot_148_8_0 = math.abs(slot_148_7_0.z) > 0.1

	if slot_148_8_0 and not was_in_air then
		just_entered_air = true
	end

	if just_entered_air and slot_148_8_0 then
		just_entered_air = false
	end

	was_in_air = slot_148_8_0
	slot_148_9_0 = false

	if slot_148_2_0 and not just_entered_air and slot_148_1_0 - last_ground_time > 0.1 then
		if (is_opposite_key_combo_with_delay(last_direction, slot_148_6_0, slot_148_1_0, "w", "s") or is_opposite_key_combo_with_delay(last_direction, slot_148_6_0, slot_148_1_0, "a", "d")) and count_active_keys(slot_148_6_0, slot_148_1_0) == 2 and slot_148_1_0 - last_opposite_press_time >= 0.3 then
			slot_148_9_0 = true
			last_opposite_press_time = slot_148_1_0
		else
			slot_148_11_0 = is_single_key_event(last_direction, slot_148_6_0, "s", "release")
			slot_148_12_0 = is_single_key_event(last_direction, slot_148_6_0, "s", "press")
			slot_148_13_0 = no_keys_pressed_except(slot_148_6_0, nil)
			slot_148_14_0 = no_keys_pressed_except(last_direction, nil)

			if (slot_148_11_0 and not is_key_active_with_delay(slot_148_6_0.w, slot_148_1_0, "w") and slot_148_13_0 or slot_148_12_0 and slot_148_14_0 and no_keys_pressed_except(slot_148_6_0, "s")) and slot_148_1_0 - last_opposite_press_time >= 0.3 then
				slot_148_9_0 = true
				last_opposite_press_time = slot_148_1_0
			end
		end
	end

	if slot_148_9_0 then
		save_slowwalk_speed()
		slowwalk_speed_node:GetValue():Set(1)

		active_slowwalk_controller = "autostrafer"
		slowwalk_start_time = slot_148_1_0 + 0.04
	end

	if active_slowwalk_controller == "autostrafer" and slowwalk_start_time and slot_148_1_0 >= slowwalk_start_time then
		active_slowwalk_controller = nil
		slowwalk_start_time = nil

		restore_slowwalk_speed()
	end

	if slot_148_3_0 then
		slot_148_10_1 = is_moving()

		if slot_148_8_0 and not slot_148_10_1 then
			if active_slowwalk_controller ~= "autostrafer" then
				save_slowwalk_speed()
				slowwalk_speed_node:GetValue():Set(1)

				active_slowwalk_controller = "air"
			end
		elseif active_slowwalk_controller == "air" then
			active_slowwalk_controller = nil

			restore_slowwalk_speed()
		end
	elseif active_slowwalk_controller == "air" then
		active_slowwalk_controller = nil

		restore_slowwalk_speed()
	end

	if slot_148_4_0 and game.engine:InGame() and game.engine:IsConnected() then
		slot_148_10_0 = game.globalVars.m_flRealTime

		if grenade_throw_time and slot_148_10_0 - grenade_throw_time < 0.01 and is_holding_grenade() and not is_only_w_pressed() and active_slowwalk_controller ~= "autostrafer" then
			save_slowwalk_speed()
			slowwalk_speed_node:GetValue():Set(1)

			active_slowwalk_controller = "grenade"
			slowwalk_start_time = slot_148_10_0
		end

		if slowwalk_start_time and slot_148_10_0 - slowwalk_start_time >= get_grenade_delay(cbx_grenade_fix:GetValue():Get():GetRaw()) and active_slowwalk_controller == "grenade" then
			active_slowwalk_controller = nil
			slowwalk_start_time = nil

			restore_slowwalk_speed()
		end
	elseif active_slowwalk_controller == "grenade" then
		active_slowwalk_controller = nil

		restore_slowwalk_speed()
	end

	if not slot_148_8_0 then
		last_ground_time = slot_148_1_0
	end

	update_slowwalk()

	last_direction = copy_direction_state(slot_148_6_0)
end)

sounds_list = {
	"agpa1",
	"beep1",
	"bubble",
	"chime",
	"cookie",
	"copperbell",
	"cute",
	"dsr-1",
	"light_hit",
	"mcbow",
	"minecrafthit_placeholder",
	"neverlose",
	"primordial",
	"rust_headshot",
	"smw_stomp"
}
sound_path_cache = {}
last_preview = {
	hit = nil,
	kill = nil
}

function bit_to_index(arg_149_0)
	if arg_149_0 < 2 then
		return 1
	end

	local var_149_0 = 0

	while arg_149_0 > 1 do
		arg_149_0 = math.floor(arg_149_0 / 2)
		var_149_0 = var_149_0 + 1
	end

	return var_149_0
end

function get_minecraft_hit_sound()
	return "minecrafthit" .. math.random(1, 3) .. "_hit"
end

function get_hit_volume()
	return sl_volume_hit:GetValue():Get() / 500
end

function get_kill_volume()
	return sl_volume_kill:GetValue():Get() / 500
end

function get_sound_data(arg_153_0)
	if arg_153_0 == 1 then
		return nil
	end

	local var_153_0 = bit_to_index(arg_153_0)

	if var_153_0 < 1 or var_153_0 > #sounds_list then
		var_153_0 = 1
	end

	local var_153_1 = sounds_list[var_153_0]

	if var_153_1 == "minecrafthit_placeholder" then
		var_153_1 = get_minecraft_hit_sound()
	end

	if not sound_path_cache[var_153_1] then
		sound_path_cache[var_153_1] = resource_path .. "/sounds/" .. var_153_1 .. ".vsnd_c"
	end

	return sound_path_cache[var_153_1]
end

function play_sound(arg_154_0, arg_154_1)
	local var_154_0 = get_sound_data(arg_154_0)

	if var_154_0 then
		local var_154_1 = arg_154_1 and get_kill_volume() or get_hit_volume()

		game.PlaySound(var_154_0, var_154_1)
	end
end

events.event:Add(function(arg_155_0)
	if not game.engine:InGame() or not game.engine:IsConnected() then
		return
	end

	if arg_155_0:get_name() ~= "player_hurt" then
		return
	end

	local var_155_0 = entities.GetLocalController()

	if not var_155_0 then
		return
	end

	if arg_155_0:GetController("attacker") ~= var_155_0 then
		return
	end

	local var_155_1 = arg_155_0:GetController("userid")

	if not var_155_1 or not var_155_1:IsEnemy() then
		return
	end

	local var_155_2 = arg_155_0:GetInt("health")

	if var_155_2 and var_155_2 <= 0 then
		local var_155_3 = cbx_killsounds:GetValue():Get():GetRaw()

		if var_155_3 ~= 1 then
			play_sound(var_155_3, true)
		end
	elseif hit_flag ~= 1 then
		local var_155_4 = cbx_hitsounds:GetValue():Get():GetRaw()

		play_sound(var_155_4, false)
	end
end)
events.presentQueue:Add(function()
	local var_156_0 = cbx_killsounds:GetValue():Get():GetRaw()

	if var_156_0 ~= 1 and var_156_0 ~= last_preview.kill then
		last_preview.kill = var_156_0

		play_sound(var_156_0, true)
	end

	local var_156_1 = cbx_hitsounds:GetValue():Get():GetRaw()

	if var_156_1 ~= 1 and var_156_1 ~= last_preview.hit then
		last_preview.hit = var_156_1

		play_sound(var_156_1, false)
	end
end)

function vec(arg_157_0, arg_157_1, arg_157_2)
	return {
		x = arg_157_0,
		y = arg_157_1,
		z = arg_157_2
	}
end

function vec_add(arg_158_0, arg_158_1)
	return {
		x = arg_158_0.x + arg_158_1.x,
		y = arg_158_0.y + arg_158_1.y,
		z = arg_158_0.z + arg_158_1.z
	}
end

function vec_sub(arg_159_0, arg_159_1)
	return {
		x = arg_159_0.x - arg_159_1.x,
		y = arg_159_0.y - arg_159_1.y,
		z = arg_159_0.z - arg_159_1.z
	}
end

function vec_mul_scalar(arg_160_0, arg_160_1)
	return {
		x = arg_160_0.x * arg_160_1,
		y = arg_160_0.y * arg_160_1,
		z = arg_160_0.z * arg_160_1
	}
end

function vec_length(arg_161_0)
	return math.sqrt(arg_161_0.x * arg_161_0.x + arg_161_0.y * arg_161_0.y + arg_161_0.z * arg_161_0.z)
end

function vec_dot(arg_162_0, arg_162_1)
	return arg_162_0.x * arg_162_1.x + arg_162_0.y * arg_162_1.y + arg_162_0.z * arg_162_1.z
end

function vec_dist(arg_163_0, arg_163_1)
	return vec_length(vec_sub(arg_163_0, arg_163_1))
end

nearest_teammate_screen_pos = nil
local_player_screen_pos = nil

events.createMove:Add(function(arg_164_0)
	if not cb_blockbot:GetValue():Get() then
		nearest_teammate_screen_pos, local_player_screen_pos = nil

		return
	end

	local var_164_0 = entities.GetLocalPawn()

	if not var_164_0 or not var_164_0:IsAlive() then
		nearest_teammate_screen_pos, local_player_screen_pos = nil

		return
	end

	local var_164_1 = var_164_0:GetEyePos()
	local var_164_2 = game.input:GetViewAngles()
	local var_164_3 = arg_164_0:GetForwardMove()
	local var_164_4 = arg_164_0:GetLeftMove()
	local var_164_5
	local var_164_6 = math.huge

	entities.players:ForEach(function(arg_165_0)
		local var_165_0 = arg_165_0.entity:ToPlayerPawn()

		if var_165_0 and var_165_0:IsAlive() and var_165_0 ~= var_164_0 and not var_165_0:IsEnemy() then
			local var_165_1 = vec_dist(var_164_1, var_165_0:GetEyePos())

			if var_165_1 < var_164_6 then
				var_164_6, var_164_5 = var_165_1, var_165_0
			end
		end
	end)

	if not var_164_5 then
		nearest_teammate_screen_pos, local_player_screen_pos = nil

		return
	end

	local var_164_7 = var_164_5:GetEyePos()

	local_player_screen_pos = math.WorldToScreen(var_164_1)
	nearest_teammate_screen_pos = math.WorldToScreen(var_164_7)

	local var_164_8 = var_164_1.z - var_164_7.z

	if var_164_8 >= 18 and var_164_8 <= 54 then
		arg_164_0:SetButton(InputBitMask_t.IN_JUMP)

		if cb_blockbot_crouch:GetValue():Get() then
			arg_164_0:SetButton(InputBitMask_t.IN_DUCK)
		end
	end

	local var_164_9 = vec_sub(var_164_7, var_164_1)

	arg_164_0:SetViewangles(var_164_2)
	arg_164_0:SetForwardMove(var_164_3)
	arg_164_0:SetLeftMove(var_164_4)

	if var_164_3 ~= 0 or var_164_4 ~= 0 then
		arg_164_0:RotateMovement(var_164_2.y)
	end

	arg_164_0:SetForwardMove(0.5)
	arg_164_0:SetLeftMove(0)
	arg_164_0:RotateMovement(math.deg(math.atan2(var_164_9.y, var_164_9.x)))
	game.input:SetViewAngles(var_164_2)
end)
events.presentQueue:Add(function()
	if not game.engine:InGame() and game.engine:IsConnected() then
		return
	end

	if not cb_blockbot:GetValue():Get() or not nearest_teammate_screen_pos or not local_player_screen_pos then
		return
	end

	local var_166_0 = entities.GetLocalPawn()

	if not var_166_0 or not var_166_0:IsAlive() then
		return
	end

	local var_166_1 = draw.surface

	var_166_1.g:SetTexture(nil)

	local var_166_2 = draw.Vec2(local_player_screen_pos.x, local_player_screen_pos.y)
	local var_166_3 = draw.Vec2(nearest_teammate_screen_pos.x, nearest_teammate_screen_pos.y)
	local var_166_4 = draw.Vec2((var_166_2.x + var_166_3.x) * 0.5, (var_166_2.y + var_166_3.y) * 0.5)
	local var_166_5 = draw.Color(255, 255, 255, 150)
	local var_166_6 = draw.Color(255, 255, 255, 0)

	var_166_1:AddLineMulticolor(var_166_2, var_166_4, var_166_5, var_166_6, 1)
	var_166_1:AddLineMulticolor(var_166_4, var_166_3, var_166_6, var_166_5, 1)
end)

function vec_normalize(arg_167_0)
	local var_167_0 = vec_length(arg_167_0)

	if var_167_0 > 0 then
		return {
			x = arg_167_0.x / var_167_0,
			y = arg_167_0.y / var_167_0,
			z = arg_167_0.z / var_167_0
		}
	end

	return {
		x = 0,
		y = 0,
		z = 0
	}
end

push_direction = nil
is_pushing = false

events.createMove:Add(function(arg_168_0)
	if not cb_avoid_collisions:GetValue():Get() then
		return
	end

	if cb_blockbot:GetValue():Get() then
		return
	end

	if is_on_ladder or is_mouse_down() or not config.anti_aim.anti_aim:GetValue():Get() or arg_168_0:GetButton(InputBitMask_t.IN_USE) then
		return
	end

	slot_168_1_0 = entities.GetLocalPawn()

	if not slot_168_1_0 or not slot_168_1_0:IsAlive() then
		push_direction = nil
		is_pushing = false

		return
	end

	slot_168_2_0 = slot_168_1_0:GetAbsOrigin()

	if not slot_168_2_0 or type(slot_168_2_0) ~= "userdata" then
		return
	end

	slot_168_3_0 = slot_168_1_0:GetAbsVelocity()
	slot_168_4_0 = math.abs(slot_168_3_0.z) > 0.1
	slot_168_5_0 = sl_avoid_collisions_air:GetValue():Get()

	if not slot_168_4_0 then
		slot_168_5_0 = sl_avoid_collisions_ground:GetValue():Get()
	end

	slot_168_6_0 = 30
	slot_168_7_0 = game.input:GetViewAngles()
	slot_168_8_0 = arg_168_0:GetForwardMove()
	slot_168_9_0 = arg_168_0:GetLeftMove()

	if fast_angles_yaw and fast_angles_active then
		slot_168_7_0 = Vector(slot_168_7_0.x, fast_angles_yaw, slot_168_7_0.z)
	end

	slot_168_10_0 = Vector(math.cos(math.rad(slot_168_7_0.y)), math.sin(math.rad(slot_168_7_0.y)), 0)
	slot_168_11_0 = {
		x = 0,
		y = 0,
		z = 0
	}

	if slot_168_8_0 ~= 0 or slot_168_9_0 ~= 0 then
		slot_168_12_1 = math.rad(slot_168_7_0.y)
		slot_168_13_1 = {
			x = math.cos(slot_168_12_1),
			y = math.sin(slot_168_12_1)
		}
		slot_168_14_1 = {
			x = math.cos(slot_168_12_1 + math.pi / 2),
			y = math.sin(slot_168_12_1 + math.pi / 2)
		}
		slot_168_11_0.x = slot_168_13_1.x * slot_168_8_0 + slot_168_14_1.x * slot_168_9_0
		slot_168_11_0.y = slot_168_13_1.y * slot_168_8_0 + slot_168_14_1.y * slot_168_9_0
		slot_168_15_1 = math.sqrt(slot_168_11_0.x * slot_168_11_0.x + slot_168_11_0.y * slot_168_11_0.y)

		if slot_168_15_1 > 0 then
			slot_168_11_0.x = slot_168_11_0.x / slot_168_15_1
			slot_168_11_0.y = slot_168_11_0.y / slot_168_15_1
		end
	end

	slot_168_12_0 = {
		x = 0,
		y = 0,
		z = 0
	}
	slot_168_13_0 = 0
	slot_168_14_0 = 1

	for iter_168_0 = 1, 7 do
		slot_168_19_1 = iter_168_0 * 45
		slot_168_20_1 = math.rad(slot_168_19_1)
		slot_168_21_0 = Vector(slot_168_10_0.x * math.cos(slot_168_20_1) - slot_168_10_0.y * math.sin(slot_168_20_1), slot_168_10_0.x * math.sin(slot_168_20_1) + slot_168_10_0.y * math.cos(slot_168_20_1), 0)
		slot_168_22_0 = math.sqrt(slot_168_21_0.x * slot_168_21_0.x + slot_168_21_0.y * slot_168_21_0.y)

		if slot_168_22_0 > 0 then
			slot_168_21_0.x = slot_168_21_0.x / slot_168_22_0
			slot_168_21_0.y = slot_168_21_0.y / slot_168_22_0
		end

		slot_168_23_0 = Vector(slot_168_2_0.x + slot_168_21_0.x * slot_168_5_0, slot_168_2_0.y + slot_168_21_0.y * slot_168_5_0, slot_168_2_0.z + slot_168_6_0)
		slot_168_24_0 = Vector(slot_168_2_0.x, slot_168_2_0.y, slot_168_2_0.z + slot_168_6_0)
		slot_168_25_0 = Ray_t()
		slot_168_26_0 = game.physicsQueryInterface:TraceRay(slot_168_25_0, slot_168_24_0, slot_168_23_0, false)

		if slot_168_26_0 and slot_168_26_0.m_flFraction < 1 and slot_168_26_0:DidHitWorld() then
			slot_168_13_0 = slot_168_13_0 + 1
			slot_168_14_0 = math.min(slot_168_14_0, slot_168_26_0.m_flFraction)
			slot_168_27_0 = {
				z = 0,
				x = -slot_168_21_0.x,
				y = -slot_168_21_0.y
			}
			slot_168_28_0 = (1 - slot_168_26_0.m_flFraction) * 2
			slot_168_12_0.x = slot_168_12_0.x + slot_168_27_0.x * slot_168_28_0
			slot_168_12_0.y = slot_168_12_0.y + slot_168_27_0.y * slot_168_28_0
		end
	end

	if slot_168_13_0 > 0 then
		if vec_length(slot_168_12_0) > 0 then
			slot_168_12_0 = vec_normalize(slot_168_12_0)
		end

		is_pushing = true
		push_direction = slot_168_12_0

		if vec_length(slot_168_11_0) > 0 then
			slot_168_15_0 = slot_168_14_0 * 0.8
			slot_168_16_1 = 1 - slot_168_15_0
			slot_168_17_2 = {
				z = 0,
				x = slot_168_11_0.x * slot_168_15_0 + slot_168_12_0.x * slot_168_16_1,
				y = slot_168_11_0.y * slot_168_15_0 + slot_168_12_0.y * slot_168_16_1
			}
			slot_168_17_1 = vec_normalize(slot_168_17_2)
			slot_168_19_0 = math.atan2(slot_168_17_1.y, slot_168_17_1.x) - math.rad(slot_168_7_0.y)

			while slot_168_19_0 > math.pi do
				slot_168_19_0 = slot_168_19_0 - 2 * math.pi
			end

			while slot_168_19_0 < -math.pi do
				slot_168_19_0 = slot_168_19_0 + 2 * math.pi
			end

			slot_168_20_0 = slot_168_14_0 * 0.8 + 0.2

			arg_168_0:SetForwardMove(math.cos(slot_168_19_0) * slot_168_20_0)
			arg_168_0:SetLeftMove(math.sin(slot_168_19_0) * slot_168_20_0)
		else
			slot_168_16_0 = math.atan2(slot_168_12_0.y, slot_168_12_0.x) - math.rad(slot_168_7_0.y)

			while slot_168_16_0 > math.pi do
				slot_168_16_0 = slot_168_16_0 - 2 * math.pi
			end

			while slot_168_16_0 < -math.pi do
				slot_168_16_0 = slot_168_16_0 + 2 * math.pi
			end

			slot_168_17_0 = slot_168_14_0 * 0.5 + 0.5

			arg_168_0:SetForwardMove(math.cos(slot_168_16_0) * slot_168_17_0)
			arg_168_0:SetLeftMove(math.sin(slot_168_16_0) * slot_168_17_0)
		end
	else
		arg_168_0:SetForwardMove(slot_168_8_0)
		arg_168_0:SetLeftMove(slot_168_9_0)

		is_pushing = false
		push_direction = nil
	end

	if slot_168_8_0 ~= 0 or slot_168_9_0 ~= 0 or is_pushing then
		arg_168_0:RotateMovement(slot_168_7_0.y)
	end
end)
events.createMove:Add(function(arg_169_0)
	if not cb_crouch_in_air:GetValue():Get() then
		return
	end

	if cb_only_when_jump:GetValue():Get() then
		if not arg_169_0:GetButton(InputBitMask_t.IN_JUMP) then
			return
		end
	else
		local var_169_0 = entities.GetLocalPawn():GetAbsVelocity().z

		if math.abs(var_169_0) <= 0.1 then
			return
		end
	end

	arg_169_0:SetButton(InputBitMask_t.IN_DUCK)
end)

should_drop_items = false
drop_start_time = 0
DROP_DURATION = 5
SLOTS = {
	1,
	2,
	3,
	4,
	5
}
DROP_COMMANDS = {}

for iter_0_0 = 1, #SLOTS do
	DROP_COMMANDS[iter_0_0] = "slot" .. SLOTS[iter_0_0] .. ";drop"
end

mods.events:AddListener("cs_intermission")
mods.events:AddListener("round_end")
events.event:Add(function(arg_170_0)
	local var_170_0 = arg_170_0:GetName()

	if var_170_0 == "cs_intermission" and cb_auto_disconnect:GetValue():Get() then
		game.engine:ClientCmd("disconnect")
	end

	if var_170_0 == "cs_intermission" and cb_auto_drop_items:GetValue():Get() then
		should_drop_items = true
		drop_start_time = game.globalVars.m_flRealTime
	end
end)
events.presentQueue:Add(function()
	if not should_drop_items then
		return
	end

	if game.globalVars.m_flRealTime - drop_start_time >= DROP_DURATION then
		should_drop_items = false

		return
	end

	local var_171_0 = {}

	for iter_171_0 = 1, #DROP_COMMANDS do
		var_171_0[iter_171_0] = DROP_COMMANDS[iter_171_0]
	end

	game.engine:ClientCmd(table.concat(var_171_0, ";"))
end)

console_flags = {
	"VProf",
	"LOADING",
	"Assert",
	"Console",
	"Developer",
	"DeveloperConsole",
	"DeveloperVerbose",
	"Symbols",
	"ToolsStallMonitor",
	"Stack unwinding",
	"Entity System",
	"Entity Load Unserialize",
	"Pulse",
	"VScript",
	"VScriptDbg",
	"Demo",
	"InstantReplay",
	"RCon",
	"Steam",
	"Shooting",
	"Server",
	"SpawnGroup",
	"SignonState",
	"Movie",
	"ServerLog",
	"stringtables",
	"HLTV Broadcast",
	"HLTV Server",
	"VR",
	"InputService",
	"NetworkClientService",
	"NetworkP2PService",
	"NetworkServerService",
	"NetworkService",
	"RenderService",
	"ScreenShot",
	"SplitScreen",
	"BitBuf Error",
	"DemoFile",
	"Client",
	"CommandLine",
	"EngineServiceManager",
	"GameEventSystem",
	"HostStateManager",
	"CL CommandQueue",
	"Filesystem",
	"InputSystem",
	"IME",
	"Localization System",
	"System",
	"Vfx",
	"D3D",
	"RenderSystem",
	"ResourceSystem",
	"SchemaSystem",
	"TypeManager",
	"MaterialSystem",
	"PostProcessing",
	"modellib",
	"Physics",
	"MeshSystem",
	"WorldRenderer",
	"Networking",
	"Networking Reliable",
	"NetStreamConn",
	"SteamNetSockets",
	"AnimationGraph",
	"Animation 2",
	"BoneSetup",
	"AnimationSystem: IK",
	"ParticlesLib",
	"AnimationSystem",
	"AnimResource",
	"Interpolation",
	"DualHull",
	"SoundSystemLowLevel",
	"VNotify",
	"SoundOperatorSystem",
	"SoundSystem",
	"SndOperators",
	"SteamAudio",
	"LIGHTBINNER",
	"RenderGraph",
	"SceneSystem",
	"SparceShadowTree",
	"SparseShadowTree",
	"CharacterDecalSystem",
	"ToneMapping",
	"VolumetricFog",
	"Wind",
	"Particles",
	"Panorama",
	"PanoramaVideoPlayer",
	"PanoramaContent",
	"PanoramaScript",
	"UIMemory",
	"V8System",
	"cs_script",
	"Workshop",
	"Breakables",
	"BodyGameSystem",
	"Host",
	"NetSteamConn",
	"Prediction",
	"BuildSparseShadowTree",
	"Decals",
	"SoundOpGameSystem",
	"VScriptScripts",
	"SaveRestore",
	"Inventory",
	"Destructible Parts",
	"SaveRestoreSyncIO",
	"Elapsed",
	"SaveRestoreIO",
	"SaveRestoreIOFiltered",
	"ClientMessages",
	"GlobalState",
	"WebApi",
	"Hltv Director",
	"SV CommandQueue",
	"Command Queue Events",
	"Command Queue SAMPLES",
	"ScenePrint",
	"EmitSound",
	"SndEmitterSystem",
	"Missions",
	"Wearable",
	"SteamUnifiedMessages",
	"GCClient",
	"SOCache",
	"NavMesh",
	"RESPONSE_RULES",
	"BuildCubemaps",
	"Entity Dump",
	"UserMessages",
	"Subtitles and Captions",
	"P2P Voice",
	"ConfigImport",
	"CsIconGenerator",
	"CsPortraitWorld",
	"UI Map Previews",
	"CSGO game instructor",
	"Matchmaking",
	"RenderPipelineCsgo",
	"RenderPipelineCsgoPostHud",
	"RESPONSEDOC_LIB",
	"SceneFileCache",
	"p.missions",
	"p.armory",
	"p.mainmenu",
	"CSGO_MainMenu"
}
prev_clean_console_state = nil

events.presentQueue:Add(function()
	local var_172_0 = cb_clean_console:GetValue():Get()

	if prev_clean_console_state == nil then
		prev_clean_console_state = var_172_0

		return
	end

	if var_172_0 ~= prev_clean_console_state then
		local var_172_1 = var_172_0 and "+DoNotEcho" or "-DoNotEcho"
		local var_172_2 = {}

		for iter_172_0, iter_172_1 in ipairs(console_flags) do
			table.insert(var_172_2, "log_flags " .. iter_172_1 .. " " .. var_172_1)
		end

		game.engine:ClientCmd(table.concat(var_172_2, ";"))
		game.engine:ClientCmd(string.format("toggleconsole;clear;echoln Clean Console %s;toggleconsole", var_172_0 and "ON" or "OFF"))

		prev_clean_console_state = var_172_0
	end
end)
ffi.cdef("    typedef void* HWND;\n    typedef int (__stdcall* ShowWindowFn)(HWND hWnd, int nCmdShow);\n    typedef bool (__stdcall* SetForegroundWindowFn)(HWND hWnd);\n    typedef HWND (__stdcall* FindWindowAFn)(const char* lpClassName, const char* lpWindowName);\n")

user32 = "user32.dll"
FindWindowA = ffi.cast("FindWindowAFn", utils.FindExport(user32, "FindWindowA"))
ShowWindow = ffi.cast("ShowWindowFn", utils.FindExport(user32, "ShowWindow"))
SetForegroundWindow = ffi.cast("SetForegroundWindowFn", utils.FindExport(user32, "SetForegroundWindow"))
SW_RESTORE = 9
window_name = "Counter-Strike 2"

events.event:Add(function(arg_173_0)
	if arg_173_0:GetName() == "round_start" and gui.input:IsMouseReleased(gui.MouseButton.LEFT) then
		if not cb_focus_cs2:GetValue():Get() then
			return
		end

		local var_173_0 = FindWindowA(nil, window_name)

		if tonumber(ffi.cast("intptr_t", var_173_0)) ~= 0 and var_173_0 ~= nil then
			ShowWindow(var_173_0, 6)
			ShowWindow(var_173_0, 9)

			local var_173_1 = SetForegroundWindow(var_173_0)
		end
	end
end)

afk_state = {
	direction = 1,
	current_yaw = 0,
	last_shoot = 0,
	last_update = 0,
	was_enabled = false,
	in_game = false,
	timer = 0,
	movement = {
		last_time = 0,
		stationary_since = 0,
		is_stationary = false
	},
	angles = {
		target = nil,
		initial = nil
	},
	state = {
		start_time = 0,
		name = "idle"
	}
}
CONST = {
	STATIONARY_CHECK_INTERVAL = 0.1,
	YAW_SPEED = 10,
	MOVE_AMOUNT = 1,
	MOVE_INTERVAL = 0.1,
	PITCH_LIMIT = 20,
	SHOOT_INTERVAL = 10,
	STATIONARY_THRESHOLD = 5,
	SHOOT_DURATION = 0.2,
	ROTATION_DURATION = 3
}

function generate_random_angles()
	return math.vec3(math.random(-CONST.PITCH_LIMIT, CONST.PITCH_LIMIT), math.random(0, 360), 0)
end

function angle_diff(arg_175_0, arg_175_1)
	local var_175_0 = (arg_175_1 - arg_175_0) % 360

	return var_175_0 > 180 and var_175_0 - 360 or var_175_0
end

function lerp_angle(arg_176_0, arg_176_1, arg_176_2)
	return math.vec3(math.min(CONST.PITCH_LIMIT, math.max(-CONST.PITCH_LIMIT, arg_176_0.x + angle_diff(arg_176_0.x, arg_176_1.x) * arg_176_2)), (arg_176_0.y + angle_diff(arg_176_0.y, arg_176_1.y) * arg_176_2) % 360, 0)
end

function is_player_stationary(arg_177_0)
	local var_177_0 = game.globalVars.m_flRealTime

	if var_177_0 - afk_state.movement.last_time < CONST.STATIONARY_CHECK_INTERVAL then
		return afk_state.movement.is_stationary
	end

	afk_state.movement.last_time = var_177_0

	local var_177_1 = arg_177_0:GetAbsVelocity()

	if var_177_1.x * var_177_1.x + var_177_1.y * var_177_1.y + var_177_1.z * var_177_1.z < 9 then
		if afk_state.movement.stationary_since == 0 then
			afk_state.movement.stationary_since = var_177_0
		end

		afk_state.movement.is_stationary = var_177_0 - afk_state.movement.stationary_since >= CONST.STATIONARY_THRESHOLD or afk_state.in_game
	else
		afk_state.movement.stationary_since = 0
		afk_state.movement.is_stationary = false
	end

	return afk_state.movement.is_stationary
end

function reset_afk_state()
	if afk_state.was_enabled then
		game.engine:ClientCmd("-attack")
	end

	afk_state.state.name = "idle"
	afk_state.angles.initial = nil
	afk_state.angles.target = nil
	afk_state.movement.last_time = 0
	afk_state.movement.is_stationary = false
	afk_state.movement.stationary_since = 0
	afk_state.was_enabled = false
end

events.createMove:Add(function(arg_179_0)
	slot_179_1_0 = cb_anti_afk:GetValue():Get()
	slot_179_2_0 = entities.GetLocalPawn()
	slot_179_3_0 = slot_179_2_0 and slot_179_2_0:IsAlive()

	if not slot_179_1_0 or not slot_179_3_0 then
		if afk_state.was_enabled then
			reset_afk_state()
		end

		return
	end

	afk_state.in_game = gui.input:IsMouseReleased(gui.MouseButton.LEFT)

	if not is_player_stationary(slot_179_2_0) and not afk_state.in_game then
		if afk_state.was_enabled then
			reset_afk_state()
		end

		return
	end

	if not afk_state.in_game and afk_state.movement.stationary_since + CONST.STATIONARY_THRESHOLD + 0.2 < game.globalVars.m_flRealTime then
		reset_afk_state()

		return
	end

	slot_179_5_0 = game.globalVars.m_flRealTime

	if slot_179_5_0 <= afk_state.movement.stationary_since + CONST.STATIONARY_THRESHOLD + 0.2 or afk_state.in_game then
		if slot_179_5_0 - afk_state.timer >= CONST.MOVE_INTERVAL then
			afk_state.direction = -afk_state.direction
			afk_state.timer = slot_179_5_0
		end

		arg_179_0:SetForwardMove(CONST.MOVE_AMOUNT * afk_state.direction)
		arg_179_0:SetLeftMove(CONST.MOVE_AMOUNT * afk_state.direction)
	else
		afk_state.movement.stationary_since = 0
		afk_state.movement.is_stationary = false
	end

	slot_179_7_0 = math.min(slot_179_5_0 - (afk_state.last_update or slot_179_5_0), 0.033)

	if not afk_state.was_enabled then
		afk_state.state.name = "idle"
		afk_state.state.start_time = slot_179_5_0
		afk_state.angles.initial = nil
		afk_state.angles.target = nil
		afk_state.last_shoot = slot_179_5_0
		afk_state.current_yaw = game.input:GetViewAngles().y
	end

	if slot_179_7_0 > 0 then
		afk_state.current_yaw = (afk_state.current_yaw + CONST.YAW_SPEED * slot_179_7_0) % 360
	end

	afk_state.last_update = slot_179_5_0
	slot_179_8_0 = slot_179_5_0 - afk_state.state.start_time

	if afk_state.state.name == "idle" then
		afk_state.angles.initial = game.input:GetViewAngles()
		afk_state.angles.target = generate_random_angles()
		afk_state.state.name = "rotating"
		afk_state.state.start_time = slot_179_5_0
	elseif afk_state.state.name == "rotating" then
		slot_179_9_1 = math.min(slot_179_8_0 / CONST.ROTATION_DURATION, 1)

		if afk_state.angles.initial and afk_state.angles.target then
			slot_179_10_1 = lerp_angle(afk_state.angles.initial, afk_state.angles.target, slot_179_9_1)

			game.input:SetViewAngles(math.vec3(slot_179_10_1.x, afk_state.current_yaw, 0))
		else
			slot_179_10_0 = game.input:get_view_angles()

			game.input:SetViewAngles(math.vec3(math.min(CONST.PITCH_LIMIT, math.max(-CONST.PITCH_LIMIT, slot_179_10_0.x)), afk_state.current_yaw, 0))
		end

		if slot_179_5_0 - afk_state.last_shoot >= CONST.SHOOT_INTERVAL then
			game.engine:ClientCmd("+attack")

			afk_state.last_shoot = slot_179_5_0
			afk_state.state.name = "shooting"
			afk_state.state.start_time = slot_179_5_0
		end

		if slot_179_8_0 >= CONST.ROTATION_DURATION then
			afk_state.angles.initial = game.input:GetViewAngles()
			afk_state.angles.target = generate_random_angles()
			afk_state.state.start_time = slot_179_5_0
		end
	elseif afk_state.state.name == "shooting" then
		slot_179_9_0 = game.input:GetViewAngles()

		game.input:SetViewAngles(math.vec3(math.min(CONST.PITCH_LIMIT, math.max(-CONST.PITCH_LIMIT, slot_179_9_0.x)), afk_state.current_yaw, 0))

		if slot_179_8_0 >= CONST.SHOOT_DURATION then
			game.engine:ClientCmd("-attack")

			afk_state.state.name = "rotating"
		end
	end

	afk_state.was_enabled = true
end)

text_hs = {
	"держи зонтик ☂, тебя обоссали",
	"Держи ✈ и лети нахуй !",
	"слишком сочный для Djamic.technologies",
	"сьебался нахуй таракан усатый",
	"мать твою ебал",
	"нахуй ты упал иди вставай и на завод",
	"не по сезону шуршишь фраер",
	"ИЗИ ЧМО ЕБАНОЕ",
	"ливай блять не позорься",
	"AХАХ ПИДОР УПАЛ С ВАНВЕЯ ХАХАХА ОНЛИ БАИМ В БОДИ ПОТЕЕТ НА ФД АХА",
	"АХАХА УЛЕТЕЛ ЧМОШНИК",
	"1 МАТЬ ЖАЛЬ",
	"тебе права голоса не давали thirdworlder ебаный",
	"на завод иди",
	"не не он опять упал на конлени",
	"вставай заебал , завтра в школу",
	"гет гуд гет иди нахуй",
	"by SANCHEZj hvh boss",
	"ну нет почему он ложится когда я прохожу",
	"у тебя ник нейм адео?",
	"парень тебе ник придумать?",
	"такой тупой :(",
	"хватит получать хс ,лучше возьми свою руку и иди дрочи",
	"нет нет этот крякер такой смешной",
	"1 сын шлюхи",
	"1 мать твою ебал",
	"преобрети мой кфг клоун",
	"об кафель голову разбил?",
	"мать твою ебал",
	"хуесос дальше адайся ко мне",
	"ещё раз позови к себе на бекап",
	"не противник",
	"ник нейм дориан(",
	"iq ?",
	"упал = минус мать",
	"не пиши мне",
	"жаль конечно что против тебя играю, но куда деваться",
	"адиничкой упал",
	"сынок зачем тебе это ?",
	"давно в рот берёшь?",
	"мне можно",
	"ты меня так заебал , ливни уже",
	"ничему жизнь не учит (",
	"я не понял, ты такой жирный потомучто дошики каждый день жрешь?",
	"братка го я тебе бекап позову",
	"толстяк даже пройти спокойно не может"
}
text_body = {
	"а у вас походу умирать это семейное)",
	"нахуя пидораса убил?",
	"чао персик дозревай",
	"уважаемый в тюрьме вы будете водолазом",
	"говори буду плохо говорить буду сосать, буду плохо сосать буду пересасывать",
	"долбаеб иди башмачки в сундучок школьный собирай",
	"ботинок ебаный чо слетел",
	"братик маме привет передай",
	"не противник",
	"а ты че клоун???",
	"я обоссал тебя (",
	"ты че там отлетел то?",
	"упал хуета ебаная , но в боди забрал да похуй все равно упал",
	"*DEAD* ливай с хвх (",
	"до связи башмак",
	"нищета глупейшая играть учись",
	"опущен сын твари",
	"нищий улетел",
	"*DEAD* пофикси нищ",
	"сразу видно кфг иссуе мб конфиг у меня прикупишь ?",
	"животное аддон скачай а то падаешь",
	"оттарабанен армянская королева",
	"сука не позорься и ливни",
	"улетел тапочек ебаный",
	"единицей свалился фуфлыжник",
	"зачем ты играешь тут безмозглый",
	"иди кумыса попей очередняра",
	"откисай сочняра",
	"АХАХА ЕБАТЬ У ТЕБЯ ЧЕРЕПНАЯ КОРОБКА ПРЯМ КАК [XML-RPC] No-Spread 24/7 | aim_ag_texture_2 ONLY!",
	"на мыло и веревку то деньги есть????",
	"ИЩИ СЕБЯ НА pornoeb.cc/sochniki",
	"свежий кабанчик",
	"до связи на подскоке кабанчик",
	"скажи маме сухарики купить долбаеб",
	"ебать ты красиво на бутылку присел , тебе дать альт ?",
	"прости что без смазки)",
	"алло это скорая? тут такая ситуация пареню который упал нужна скорая)",
	"ало ты мапу лузаешь дура очнись",
	"тяжело с кряком????",
	"ЕБУЧЕСТЬ ВТОРОГО РАЗРЯДА ВЫДВИЖЕНЕЦ ОТКИС",
	"але а противники то где???",
	"ты по легиту играешь ?",
	"ХУЕПРЫГАЛО ТУСОВОЧНОЕ КУДА ПОЛЕТЕЛО",
	"ты куда жертва козьего аборта",
	"iq?",
	"·٠●•۩۞۩ОтКиСаЙ (ٿ) НуБяРа۩۞۩•●٠·",
	"ты то куда лезешь сын фантомного стационарного спец изолированого металлформовочного механизма",
	"╭∩╮( ⚆ ʖ ⚆)╭∩╮ ДоПрыГался(ت)ДрУжоЧеК"
}
pizdos_skeet = {
	"miss shot due to чит хуевый",
	"#skeettop1",
	"#skeet",
	"skeet=donk#дорогумолодым",
	"skeet=donk",
	"не бойся смерти бойся встречи с gamesense.матьебал",
	"лучше ру пасты",
	"пододвинтесь скит ползет",
	"SKEET TOP 5 BEST MOMENTO",
	"ты скит решил пикнуть??",
	"освободить проезд skeet.cc едет",
	"да у нас апи лучше",
	"missed shot due to neverlose better",
	"missed shot due to fatality better",
	"missed shot due to midnight",
	"missed shot due to ?=skeet",
	"лучший бектрек?",
	"тапаю",
	"honorable mention",
	"gamesense 500$",
	"скит не миссает он берет в рот",
	"скит зол",
	"отомстим за кряк",
	"ты на чит за 40к полез??",
	"это скит детка",
	"что такое попасть с gamesense?",
	"что такое попасть в gamesense?",
	"#ЛУЧШЕ РУПАСТЫ",
	"СКЫТ ТОП ЧЫТ",
	"kpяka нet",
	"СКЫТ НЕ ТОП ЧЫТ",
	"скит пмнишь?",
	"СКИТ = РАТНИК",
	"ЧО НАХУЙ",
	"You are banned from this forum.",
	"меня забанили в gamesense",
	"ЭТОТ СЫН ЕБАНОЙ ШЛЮХИ НАКОНЕЦ-ТО КРЯКНУЛ СКИТ!!!",
	"Я не могу зайти в gamesense ((",
	"Я не могу зайти в gamesense",
	"gamesax",
	"gamesense.pub sex with onetap...",
	"нищий не звони",
	"ловушка виша",
	"sir, please show me your UID",
	"а вот это понашему по скитерски",
	"ты допизделся, спускаю ягодника",
	"хахаха нн слит нищий",
	"мне похуй у меня скит",
	"нахуй ты на вв встал, уйди оттуда пидорас",
	"ты кто такой нн без ппхуб премиум го кв дибил",
	"123 слит",
	"а что звучит скитово",
	"хвх дурка",
	"я играю на хвх дм",
	"no skeet no talk",
	"Gamesense для хуесосов",
	"ку ннчик)",
	"заскамили на инв",
	"виш уёбывай из в контакте",
	"молчать, нн",
	"рот ньюкамер с 20",
	"РОТ НЬЮКАМЕР С 20",
	"Чел",
	"gamesense.su уид или слит",
	"а куда звонить? что куда, кв или слит",
	"кв или слит",
	"кв или слит.",
	"здарова ннчик, кв идешь?",
	"ало не пиши на ноже",
	"виш нейдит",
	"купил кряк",
	"Resolver лохи Occlusion дуры мы фанаты missed shot due to spread культуры",
	"день вантапа",
	"missed due to spread",
	"бегом на вв",
	"1 уебище",
	"а ты докажи что ты виш",
	"виша нет",
	"я убил виша",
	"виша не существует",
	"эээээ не перди виш едет.....",
	"нищий пук скит будет пм",
	"прости если тапнул"
}
pizdos_neverlose = {
	"бездарь ебаный",
	"надеюсь понятно обьяснил для твоих 2 выебаних извилин",
	"ебало сколлапсируй тихонечко и не выпёздывай ничего в чат",
	"когда Заботлони от крокодила откачают?",
	"не смешно",
	"не смеемся",
	"не смешно, не смеемся",
	"это даже не уровень ппхуда",
	"ебало ньюкамчика на фулл ебале импанджинировали",
	"waiting for nl update",
	"идёт 3 день без neverlose, я сломал все пальцы на руках",
	"на третий день без неверлуза, я на столько познал всю тяжесть жизни",
	"прошло 72 часа без neverlose. Я снова сломал себе руку",
	"кфг настрой нл лучше скита",
	"нл лучше скита",
	"спрей от пастоюзеров",
	"понял, мать шлюха",
	"Missed shot due to resolver",
	"Вы не понимаете это другое",
	"ПИДАРАС НА КОДЕРЕ",
	"Здравствуйте, благодарим за фидбек!",
	"фейспалм чел ты в муте",
	"кфг от кислоты",
	"гениально, просто гениально, иди нахуй",
	"купи подписку неверлуса!",
	"не верю, что такой крутой чит может существовать в 2026",
	"ЭТО ШЕДЕВР! ФАНТАСТИКА!!",
	"купи аксидтеч",
	"как же скиту плохо без апдейтов, а нл все еще хитает",
	"СКИТ НЕ НУЖЕН!",
	"у меня все хитает",
	"#neverlosev3 so good tappin rn OwO",
	"А ОТКУДА ПАСТИТЬ!??!",
	"Neverloose will be the best cheat, we cracked skeet",
	"No updates in nl.. pls",
	"unban me... uwu..",
	"nevuvlus not hittin",
	"u still hate me?? why???((",
	"i don't play hvh but pls unban me..",
	"Your account is suspended due to Staff disrespect",
	"кто там на неверлуз пиздел?",
	"КТО ТАМ НА НЕВЕРЛУЗ ПИЗДЕЛ?",
	"ну мне честно неверлуз не платит",
	"соуфив так сказал",
	"пидорас бан",
	"min dmg +3 =1+3",
	"Аче? Авсмысле?",
	"ДА ДА да да",
	"Я занят диваном",
	"100% Hitchance missed shot due Soufiw",
	"да так и должно быть НАВЕРНОЕ",
	"в некст апдейте пофикшу",
	"Хак больше не мисает по резольверу",
	"В бете все пофикшено",
	"Известный баг",
	"ладно похуй потом пофикшу",
	"фиксед ин соуфив билд",
	"дарт потестил вроде воркает",
	"Soufiw +6500₽",
	"Soufiw -6500₽",
	"Какой Skeet? Новый проект Абдулова?",
	"ЭЗОТЕРИК СУКА! ПРИВЕТ ОТ ДЕТЕЙ НЕВЕРЛУЗА",
	"ЪУЪ",
	"guys i have bad news. Hello when the skin changer will be added to cs2",
	"НЛ ты не обновишься и т.д.",
	"поинты видит, но стрелять только после отсоса соуфиву"
}
pizdos_nixware = {
	"алвен хакер",
	"дайти ключ альтернатив",
	"owned by pastaware tap",
	"flisk script",
	"поч",
	"фанаты фанатеют",
	"ничстд",
	"unter",
	"uid 1 pm",
	"каисень",
	"ИДИ ИГРАЙ В РОБЛАК",
	"НУ ТУПА Я",
	"фулфокус",
	"config isue",
	"исправлено \"server error\"",
	"ПИДОРАС Я ЛЮТИ",
	"ОТКАЗАННО",
	"юид никсвара высри, дог с 20",
	"пачом никсвар",
	"прошло 5 секунд... а никсвар всёравно - помойка",
	"вот тебе 100р на nixware",
	"юид никсвара высри",
	"у меня 2к юид в никсваре не пиши мне мусор",
	"скиньте пж 20 рублей на никсвар пжжж",
	"никсвар альфа будет пмнишь"
}
pizdos_hvh = {
	"брейн пмни нн",
	"ору",
	"привет, пацаны, не найдётся у вас минутки ? что такое юид?",
	"я тебя не узнаю",
	"че упал на ктрл уебище",
	"Ору че высрал",
	"кто на хвх дм",
	"вся коллекция хот вилс будет пмнишь",
	"Kyda miss, hyeglot ebaniy",
	"нн не более.",
	"уебище на вв уселось баим включило",
	"ору нищ на вв сел ну животное триплтап в кряке будет пм",
	"Ало чел ты мне кв лузнул рот",
	"Вы че хотите пиздюрей?",
	"стак пукни нищита",
	"еблан на вв",
	"словила единичку хуета",
	"STUPID VIRGIN DOG WHY U PLAYING HVH?",
	"Парни зачем нужны статик мульти поинты?",
	"5х5 рн хуесос",
	"ты кто мусор пмни 2 юид в вантапе нн",
	"ты хуевый",
	"хуйня сервер не хитрегает сука",
	"никсвар альфа будет пмнишь",
	"Я хочу писять",
	"Привет, uid - это Идентификатор пользователя",
	"изи мапа мусор",
	"ИЗИ МАПА МУСОР",
	"ору бич не пиши нн без karasik (hook)",
	"Животное пмай 865 юид в эвольве",
	"Ору нн бич скит будет пм и не пукай",
	"нищ потеет",
	"Я philip015 молчи глупое животное без фт",
	"Отмена",
	"я ничево не понял",
	"Ппхуд гетнишь, пмай",
	"Фанат альфы",
	"Не пиши мне фанат",
	"Нищий упал",
	"я крякоюзер",
	"guys i have bad news. Hello when the skin changer will be added to cs2",
	"бля ебать ты долбаеб, купить такой софт за 3к это умом умом",
	"Пидорас, что такое LBY V XUY MNE?",
	"Пидорас, что такое DESYNC V XUY MNE?",
	"Пидорас, что такое LOW DELTA V XUY MNE?",
	"Пидорас, что такое питч он зиро V XUY MNE?",
	"Пидорас, почему ебасосина в верх поднимается при прыжке V XUY MNE?",
	"Пидорас , когда релиз фатала на кс 2 V XUY MNE?",
	"Пидорас, что такое fakeflick V XUY MNE?",
	"Пидорас, что такое roll aa V XUY MNE?",
	"Пидорас, что такое autowall V XUY MNE?"
}
pizdos_fatality = {
	"Ну ты и гад.",
	"1 бот ебаный",
	"bass.dll ft ratnik",
	"VIOLATION",
	"танковый дурак",
	"оставь роспись у меня",
	"uid issue",
	"Плс фиксаните краши заебали",
	"Печеньки покупать будете?",
	"банан буш ?",
	"Хуюзик блять",
	"Resolver лохи Occlusion дуры мы фанаты missed shot due to spread культуры",
	"фатал уид назови сука",
	"missed due to spread",
	"бегом на вв",
	"press F",
	"молчи глупое животное без фт"
}
pizdos_nyashka = {
	"иногда няшечки тоже грустят",
	"я больше не хочу ходить в школу",
	"боже дед инсайды умрите пж",
	"я выебала курседа шваброй",
	"прасти я слишком хороша для тебя",
	"как называется болезнь когда у тебя стоит чб аватарка из манги",
	"да ты лох тупой офф ротик",
	"пиздец завтра в школу",
	"емае меня унизили в интернете",
	"яна солях",
	"курю воду",
	"пож.. пожалуйста.. завали свое ебало",
	"мне можна вас игнорить, а вам меня нит^^",
	"да да мы попали в магадан",
	"дыши если считаешь что я самая милая няшка",
	"иди няхуй",
	"всех с 1 сентября!",
	"ебать какая же я пиздатая няшка",
	"обиделся? похуй",
	"ОБИДЕЛСЯ? ПОХУЙ",
	"пошла нахуй гнида ебучая",
	"ПОШЛАЯ НАХУЙ ГНИДА ЕБУЧАЯ",
	"выкинь пк нахуй и прыгни с крыши бездарь ебаный",
	"выкинь телефон нахуй и прыгни с крыши бездарь ебаный",
	"я в рот ебал ваше мнение, анонимно пж",
	"сука как уебу нахуй",
	"а дед инсайд... это типаа пенсионер какой-то??",
	"не грусти а то писька не будет расти",
	"сделай одолжение сходи нахуй",
	"сделай одолжение, сходи нахуй",
	"я устала когда уже каникулы",
	"БЛЯЯЯЯЯЯЯЯЯЯЯЯЯ как же все ахуеют от моей аватарки",
	"открой ротик летит бомба",
	"идите нахуй, желаю чтобы ваше очко сгорело и чтоб вас негры выебали",
	"админ еблан",
	"устал? умри",
	"я на хуе вертела твою мамашу сын ебаной шлюхи",
	"я не магу какать",
	"я тян пруфiв не будет",
	"ты в муте урод",
	"каждый день перед сном я думаю о чокобое...",
	"я.... п.. прошу... закрой свой рот очкошник",
	"я.... п.. прошу... закрой свой рот чмошник",
	"скинь денежку пожалуйста <3",
	"ваша няшка умерла",
	"не твоя вот и бесишься",
	"иди нахуй сын мияги",
	"гаси ебало доброй ночи!",
	"завтра в школу",
	"пон",
	"да я не кринж блять нахуй",
	"ночью приду и убью тебя",
	"АХАХАХАХАХАХАХАХАХАХАХ",
	"ХАХАХАХАХАХАХАХАХАХАХА",
	"на моей странице запрещено поддерживать дотеров",
	"тут написано что ты самая ахуенная женщина на свете",
	"вот бы.. вот бы она сдохла",
	"спасибо за то что я не родилась дотером а стала милой сучкой",
	"не служил не мужик",
	"бывает что я путаю туалетную бумагу и лицо дединсайдика",
	"ME AND Y.. YOUR MOM",
	"прости если трахнула",
	"ну знаешь... иди нахуй",
	"генш для геев, дота пизже",
	"АААААААААААААААААААААААААА",
	"ААААААААААААААА",
	"ня пощади, я последняя няшка на земле",
	"вот би била игэ по пиздец какая же я ахуенная няшка",
	"меня тошнит от слова дотер",
	"идите нафик я няшка!",
	"дединсайды валите из доты. Теперь это игра для няшек",
	"фу, какой же ты задрот и быдло",
	"как же сильно я хочу тебя убить прямо сейчас",
	"чтобы ты сдохла тварь ебучая",
	"я няшко :3 так что... завали ебало",
	"дружище, сделай одолжение нажми alt+f4",
	"няшкам привет а дед инсайдам с ноги вьебало",
	"НИЩИЕ ПРИДУРКИ",
	"нищие придурки",
	"снова со своей шалавой",
	"я ненавижу себя так сильно но скрываю это и делаю вид что я лучше всех остальных",
	"в душе я... пидорас ебучий",
	"у меня хуй встал...",
	"я тру няша сосите дед инсайды ебучие",
	"отъебитесь я лавки свою заю",
	"увидела мужика день испорчен",
	"желаем тебе сдохнуть шваль ебучая",
	"привет милый хотела бы сломать тебе спину",
	"зачем мальчики когда есть котики",
	"зачем резать себя есть можно дед инсайдов",
	"солями",
	"меня трахал zxcursed",
	"устал? умри",
	"вот бы вот бы она сдохла",
	"сосни мой хуй дегенерат ебаный",
	"зря ты сказал что слово ня для тебя ничего не значит",
	"МРАЗОТА МАМУ своб так обижай",
	"как называется болезнь когда ты дожираешь за другими",
	"ку челики! кд? чд?",
	"я бы обняла тепя, но боюсь переобниму и изнасилую",
	"в душе я... пидорас ебучий",
	"БЛЯЯЯЯЯЯЯЯЯЯЯЯЯ КАК ЖЕ ВСЕ АХУЕЮТ ОТ МОЕЙ АВАТАРКИ",
	"обещай быть со мной и целовать меня по утрам",
	"бляяя вот бы щя ебануть 0.5 пива",
	"вот бы сейчас утопиться нахуй",
	"умри в канаве чмо",
	"я не как все. я хуже",
	"i hate my life. i wanna die",
	"ПРОШУ сделай из меня отбивную",
	"ТРХН МЕНЧ ПЖЛСТ",
	"трхн менч пжлст",
	"ЧТО",
	"что",
	"у меня нет личной жизни",
	"огромное спасибо маме что родила меня не мужиком",
	"дединсайды которые просят помурчать в дс уёбищнее остальных в два раза",
	"все кто меня когда то обижал каково вам на дне сидеть лошки",
	"мне лень мыть голову каждый день",
	"альтушк момент",
	"пож... пожалуйста.. завали свое ебало",
	"пож... пожалуйста.. ЗАВАЛИ СВОЕ ЕБАЛО",
	"В БАН ТЕБЯ НАВЕЧНО УЕБИЩЕ БЕЗМАМНОЕ",
	"ротик offни",
	"я больше никогда не пойду в школу",
	"в этой группе все няшки",
	"я тру няша, сосите дединсайды ебучие",
	"я твою мамку на хую вертела",
	"у мея проаблемы..",
	"захуярить бы кого-то битой",
	"со мной никто не сможет сравниться я лучше чем вся планета",
	"страница грустной беброчки которую никто не нюхает",
	"в душе я.... женщина кощка...",
	"как же хочется мне иногда вытащить себе глаза когда дотеры пишут что то в коммы",
	"пришло время признаться.. я ем дотеров",
	"тяжело быть хорошей девочкой когда внутри тебя живет маньяк",
	"тссс няшка спит",
	"добрее будьте а то как долбаёбы",
	"я больше не хочу просыпаться по утрам я вообще не вижу смысла в жизни",
	"кончи мне на лицо",
	"аниме говно? умри жалкий холоп",
	"сука заткнись. просто завали свой ебальник гнилой",
	"СУКА ЗАТКНИСЬ. ПРОСТО ЗАВАЛИ СВОЙ ЕБАЛЬНИК ГНИЛОЙ",
	"у меня нет мечты, я просто сбегу с уроков и умру в 20",
	"запомни это навсегда друг, лучше меня няшки в твоей жизни никогда не будет",
	"я всекда думаю о типе..",
	"да ты лох тупой офф ротик",
	"екарный бабай чо за хуйня",
	"ну за то я няшка",
	"ставь лайк если ты нефор",
	"вот бы это были мы..",
	"пиздец ты.. пизд5ц ты няшка",
	"засунь свой пон себе в жопу",
	"парни которые еще не прогнулись под бабу, вы долбаебы?",
	"если вам что-то не нравится вы всегда можете пойти нахуй",
	"извини меня пожалуйста за мою большую и сочную жопу",
	"когда похуй и спится легче",
	"тихо я сегодня нервная!!!!",
	"ТИХО Я СЕГОДНЯ НЕРВНАЯ!!!!",
	"от меня не уходят, от меня идут нахуй",
	"кто ушел однажны идите нахуй дважды",
	"я не ревную",
	"Я НЕ РЕВНУЮ",
	"ебало оффни выблядок мамкин",
	"не надо повторять второй раз мне и с первого похуй",
	"всем доброе утро. к сожалению я проснулась...",
	"отвали пж от меня ты слишком душный",
	"привет, админ был выебан теперь паблик наш",
	"снова в доту? мне тебя жалко",
	"МУЧИТЕЛЬНАЯ СМЕРТЬ >^<",
	">^< МУЧИТЕЛЬНАЯ СМЕРТЬ"
}
pizdos_dindra = {
	"ИДИ НАХУЙ",
	"ебаться в жопу",
	"KEEP SEARCHING WE NEED TO FIND THE PERSON WHO ASKED",
	"бляяяя",
	"shut the fuck up",
	"пиздец",
	"чекай мать еблан сука я её ебал чекай мать ебалн",
	"хороший",
	"эпл вотч",
	"задумывались ли вы когда-нибудь о том,",
	"здравствуйте овощи",
	"нахуй съебал",
	"НАХУЙ СЪЕБАЛ",
	"вот это я уже с твоей мамашей сука, иди поплачь школьная долбаёбина",
	"ты еблан",
	"слышь муфлон хуекрылый я твою мамашку как карусель на своём хуе вертел",
	"я трахал суку в мерсе",
	"блядь че за хуйня я не буду это комментировать",
	"я твою мать еб*л!",
	"о нет твоей мамане пробили голову кирпичом? тогда кто теперь будет мне лизать мои волосатые яйки?",
	"когда увидил сэкс",
	"до связи",
	"Бот просто слитый. Я в ахуе просто сосать",
	"слыш стерва хавай хуй",
	"иногда бывает такое что эээ ну короче похуй",
	"просто ебейший",
	"харош харош харош харош",
	"ебало стянул сын помойки нищей",
	"он такой долбаеб",
	"салют с вами перфоратор",
	"hate your life? try static desync",
	"Я НЕ ПОНИМАЮ ГДЕ ТВОЯ МАТЬ?! ПОЧЕМУ ОНА МНЕ ЕЩЁ НЕ СОСЁТ ХУЙ С ПРИЧМОКАМИ И ЗАГЛОТОМ?",
	"пошел в пизду",
	"ствол вздрочен просьба не выебываться",
	"Вас хочет выебать глент",
	"Ты можешь выёбываться",
	"Ты не можешь выёбываться",
	"ЕБАЛ ВАШ РОТ ПОШЛИ НАХУЙ",
	"ебал ваш рот пошли нахуй",
	"твою мать шлюху на хуе вертел бля",
	"естественно я... эээ ну крч идите нахуй",
	"трахнуть",
	"Ты умный ты очень умный!",
	"БЛЯ БЛЯ СУКА БЛЯ СУКА БЛЯ БЛЯ СУКА БЛЯ",
	"бро так не тролят",
	"пожалуйста ебани меня с ружья",
	"пачему ты не осёл бля",
	"ты не в свой район зашел пацанчик",
	"БЛЯЯЯЯЯЯЯЯЯ ЗА ЧТО БОЖЕ НАХУЙ",
	"распили меня болгаркой",
	"изящно насрал изумительно надристал",
	"ХУИ ПИЗДА ЕБАТЬ АНАЛ ЗАЛУПА БУЛЬДОЗЕР ЕБЛАН",
	"Скоко сосеш хуи. Тока по чесноку",
	"скажи пылесос, твой батя хуесос",
	"АГЪЭБЬЭЫЪАЭЮЪГБЭЪГЙ",
	"че ты высрал",
	"обед уютненько утро очки усы обед обед",
	"ты чё тут делаешь? эта группа для крутых",
	"ЕБАНЫЙ В РОТ",
	"ЕБЕЙШИЙ",
	"не кречи в меня",
	"ГОНДОН ПИДОР ЧМО ЕБАЛЬНИК СИСЬКИ СРАТЬ КОРЗИНКА",
	"сколько пидрил",
	"я вашу мать ебал друзья",
	"зачем ты родился еблан",
	"где все",
	"меня одного уже все это заебало",
	"я тя выебу чел",
	"ВЫ ВСЕ ЗАЕБАЛИ ИДИТЕ НАХУЙ",
	"ДА БЛЯТЬ ИДИТЕ НАХУЙ",
	"подрочи мне через шортики хех",
	"додрочился сука через шортики хех",
	"ПОДРОЧИ МНЕ ЧЕРЕЗ ШОРТИКИ ХЕХ",
	"ДОДРОЧИЛСЯ СУКА ЧЕРЕЗ ШОРТИКИ ХЕХ",
	"я больших шортиков дрочитель"
}
pizdos_ha4 = {
	"1 хач",
	"пидорас ебаный",
	"1 хач ебаный",
	"1",
	"мать твою ебал",
	"1 мать ебал",
	"умри нищий",
	"в ноги пидорас",
	"в ноги",
	"уебище че умер",
	"я не проебу мапу",
	"вколот пидорас",
	"дернись пидорас"
}
delayed_say_queue = {}
is_processing_queue = false
queue_processing_timer = 0
current_count = 1000
last_phrases = {
	[2] = {},
	[4] = {},
	[8] = {},
	[16] = {},
	[32] = {},
	[64] = {},
	[128] = {},
	[256] = {},
	[512] = {},
	[2048] = {}
}
phrases_by_type = {
	[8] = pizdos_skeet,
	[16] = pizdos_neverlose,
	[32] = pizdos_nixware,
	[64] = pizdos_hvh,
	[128] = pizdos_fatality,
	[256] = pizdos_nyashka,
	[512] = pizdos_dindra,
	[2048] = pizdos_ha4
}
phrase_lengths = {}

for iter_0_1, iter_0_2 in pairs(phrases_by_type) do
	phrase_lengths[iter_0_1] = #iter_0_2
end

function get_random_unique_phrase(arg_180_0, arg_180_1, arg_180_2)
	if arg_180_2 == 0 then
		return nil
	end

	local var_180_0 = last_phrases[arg_180_1]
	local var_180_1 = 0

	for iter_180_0 in pairs(var_180_0) do
		var_180_1 = var_180_1 + 1
	end

	if arg_180_2 <= var_180_1 then
		last_phrases[arg_180_1] = {}
		var_180_0 = last_phrases[arg_180_1]
	end

	local var_180_2 = 3

	for iter_180_1 = 1, var_180_2 do
		local var_180_3 = arg_180_0[math.random(1, arg_180_2)]

		if not var_180_0[var_180_3] then
			var_180_0[var_180_3] = true

			return var_180_3
		end
	end

	last_phrases[arg_180_1] = {}
	last_phrases[arg_180_1][arg_180_0[1]] = true

	return arg_180_0[1]
end

function delayed_say(arg_181_0)
	local var_181_0 = #delayed_say_queue

	delayed_say_queue[var_181_0 + 1] = {
		text = arg_181_0,
		delay = math.random(6, 12) * 0.1
	}

	if not is_processing_queue then
		is_processing_queue = true
		queue_processing_timer = game.globalVars.m_flRealTime + delayed_say_queue[1].delay
	end
end

events.presentQueue:Add(function()
	local var_182_0 = #delayed_say_queue

	if var_182_0 == 0 then
		is_processing_queue = false

		return
	end

	local var_182_1 = game.globalVars.m_flRealTime
	local var_182_2 = delayed_say_queue[1]

	if var_182_1 >= queue_processing_timer then
		local var_182_3 = entities.GetLocalPawn()

		if var_182_3 and var_182_3:IsAlive() then
			game.engine:ClientCmd("say " .. var_182_2.text)
		end

		for iter_182_0 = 2, var_182_0 do
			delayed_say_queue[iter_182_0 - 1] = delayed_say_queue[iter_182_0]
		end

		delayed_say_queue[var_182_0] = nil

		if #delayed_say_queue > 0 then
			queue_processing_timer = var_182_1 + delayed_say_queue[1].delay
		else
			is_processing_queue = false
		end
	end
end)
mods.events:add_listener("player_death")
events.event:Add(function(arg_183_0)
	local var_183_0 = cbx_trash_talk:GetValue():Get():GetRaw()

	if not var_183_0 then
		return
	end

	if arg_183_0:GetName() ~= "player_death" then
		return
	end

	if arg_183_0:GetPawnFromId("attacker") ~= entities.GetLocalPawn() then
		return
	end

	if var_183_0 ~= 1024 then
		local var_183_1 = entities.GetLocalPawn()

		if not var_183_1 or not var_183_1:IsAlive() then
			return
		end
	end

	if var_183_0 == 2 then
		local var_183_2 = arg_183_0:GetBool("headshot") and text_hs or text_body
		local var_183_3 = get_random_unique_phrase(var_183_2, 2, #var_183_2)

		if var_183_3 then
			delayed_say(var_183_3)
		end
	elseif var_183_0 == 4 then
		delayed_say("1")
	elseif var_183_0 == 1024 then
		if current_count > -1 then
			local var_183_4 = current_count

			current_count = current_count - 7

			delayed_say(current_count < -1 and "zxc" or var_183_4 .. " - 7 = " .. current_count)
		else
			delayed_say("zxc")
		end
	else
		local var_183_5 = phrases_by_type[var_183_0]

		if var_183_5 then
			local var_183_6 = get_random_unique_phrase(var_183_5, var_183_0, phrase_lengths[var_183_0])

			if var_183_6 then
				delayed_say(var_183_6)
			end
		end
	end
end)

MESSAGES = {
	"PPPPP",
	"P.........P",
	"PPPPP",
	"P",
	"P",
	"N..........N",
	"NN........N",
	"N....N....N",
	"N........NN",
	"N..........N",
	"DDDD",
	"D.........D",
	"D.........D",
	"D.........D",
	"DDDD",
	"PND.lua"
}
is_sending = false
message_index = 1
last_sent_time = 0

btn_message_pnd:AddCallback(function()
	Delay(0.1, function()
		if not is_sending then
			is_sending = true
			message_index = 1
			last_sent_time = 0
		end
	end)
end)
events.presentQueue:Add(function()
	if not is_sending then
		return
	end

	if message_index > #MESSAGES then
		is_sending = false

		return
	end

	local var_186_0 = game.globalVars.m_flRealTime

	if var_186_0 - last_sent_time >= 0.3 then
		game.engine:ClientCmd("say " .. MESSAGES[message_index])

		message_index = message_index + 1
		last_sent_time = var_186_0
	end
end)
btn_ip_grabber:AddCallback(function()
	Delay(0.1, function()
		local var_188_0 = game.engine:GetNetChan()

		if var_188_0 and not var_188_0:IsNull() then
			local var_188_1 = var_188_0:GetAddress()

			print("Net Address:", var_188_1)
			utils.ClipboardSet(var_188_1)
			gui.notify:Add(gui.Notification("Success", "Address: " .. var_188_1))
		else
			gui.notify:Add(gui.Notification("Error", "Failed to get net address", draw.textures.icon_info))
		end
	end)
end)

should_buy_awp = false
saved_primary_bitmask = nil
saved_autobuy_enabled = nil
disable_timer = 0
restored_once = false
primary_selector = gui.ctx:Find("misc>autobuy>primary")
autobuy_enabled_ctrl = gui.ctx:Find("misc>autobuy>enabled")

mods.events:add_listener("round_start")
events.event:Add(function(arg_189_0)
	if cb_awp_grabber:GetValue():Get() then
		return
	end

	if arg_189_0:GetName() == "round_start" then
		should_buy_awp = true
		disable_timer = game.globalVars.m_flRealTime + 0.01
	end
end)
events.frameStageNotify:Add(function()
	local var_190_0 = cb_awp_grabber:GetValue():Get()

	if not var_190_0 and not restored_once then
		local var_190_1 = primary_selector:GetValue()

		if var_190_1 then
			local var_190_2 = var_190_1:Get()
			local var_190_3 = autobuy_enabled_ctrl:GetValue()

			if saved_primary_bitmask ~= nil then
				var_190_2:SetRaw(saved_primary_bitmask)
				var_190_1:Set(var_190_2)
				primary_selector:Reset()

				saved_primary_bitmask = nil
			end

			if saved_autobuy_enabled ~= nil then
				autobuy_enabled_ctrl:SetValue(saved_autobuy_enabled)

				saved_autobuy_enabled = nil
			end

			restored_once = true
		end

		return
	end

	if not var_190_0 then
		return
	end

	if var_190_0 then
		restored_once = false
	end

	if disable_timer > 0 and game.globalVars.m_flRealTime >= disable_timer then
		should_buy_awp = false
		disable_timer = 0
	end

	if should_buy_awp and var_190_0 then
		game.engine:ClientCmd("buy awp")
	end

	local var_190_4 = primary_selector:GetValue()

	if not var_190_4 then
		return
	end

	local var_190_5 = var_190_4:Get()
	local var_190_6 = autobuy_enabled_ctrl:GetValue()

	if var_190_0 then
		if saved_primary_bitmask == nil then
			saved_primary_bitmask = var_190_5:GetRaw()
		end

		if saved_autobuy_enabled == nil then
			saved_autobuy_enabled = var_190_6:Get()
		end

		var_190_5:SetRaw(4)
		var_190_4:Set(var_190_5)
		primary_selector:Reset()
		autobuy_enabled_ctrl:SetValue(true)
	end
end)
ffi.cdef("    typedef void* (__cdecl *InstantiateInterfaceFn_t)();\n \n    typedef struct CInterfaceRegister {\n        InstantiateInterfaceFn_t fnCreate;\n        const char* szName;\n        struct CInterfaceRegister* pNext;\n    } CInterfaceRegister;\n \n    typedef struct {\n        const char* szName;\n        void* m_pNext;\n        char pad1[0x10];\n        const char* szDescription;\n        uint32_t nType;\n        uint32_t nRegistered;\n        uint32_t nFlags;\n        char pad2[0x15];\n        union {\n            bool i1;\n            short i16;\n            uint16_t u16;\n            int i32;\n            uint32_t u32;\n            int64_t i64;\n            uint64_t u64;\n            float fl;\n            double db;\n            const char* sz;\n        } value;\n    } CConVar;\n \n    typedef struct {\n        CConVar* element;\n        unsigned short prev;\n        unsigned short next;\n    } UtlLinkedListElement_t;\n \n    typedef struct {\n        int size;\n        UtlLinkedListElement_t* data;\n    } CUtlLeanVector;\n \n    typedef struct \n    {\n        CUtlLeanVector memory;\n        unsigned short iHead;\n        unsigned short iTail;\n        unsigned short iFirstFree;\n        unsigned short nElementCount;\n        unsigned short nAllocated;\n        UtlLinkedListElement_t* pElements;\n    } CUtlLinkedList;\n \n    typedef struct {\n        char pad[0x40];\n        CUtlLinkedList listConvars;\n    } IEngineCVar;\n")

function utils.ToRelativeAddress(arg_191_0, arg_191_1, arg_191_2)
	local var_191_0 = ffi.cast("int32_t*", arg_191_0 + arg_191_1)[0]
	local var_191_1 = ffi.cast("uintptr_t", arg_191_0) + arg_191_2

	return ffi.cast("uint8_t*", var_191_1 + var_191_0)
end

function utils.GetRegisterList(arg_192_0)
	local var_192_0 = utils.FindExport(arg_192_0, "CreateInterface")

	if var_192_0 == 0 then
		return
	end

	return ffi.cast("CInterfaceRegister**", utils.ToRelativeAddress(var_192_0, 3, 7))[0]
end

function utils.GetInterfaceFromRegister(arg_193_0, arg_193_1)
	local var_193_0 = arg_193_0

	while var_193_0 do
		if ffi.string(var_193_0.szName):find(arg_193_1, 1, true) then
			return var_193_0.fnCreate()
		end

		var_193_0 = var_193_0.pNext
	end
end

slot_0_5_0 = utils.GetRegisterList("tier0.dll")

if not slot_0_5_0 then
	error("#1")
end

slot_0_6_0 = ffi.cast("IEngineCVar*", utils.GetInterfaceFromRegister(slot_0_5_0, "VEngineCvar00"))

if not slot_0_6_0 then
	error("#2")
end

function utils.GetConvar(arg_194_0)
	for iter_194_0 = slot_0_6_0.listConvars.iHead, slot_0_6_0.listConvars.iTail do
		local var_194_0 = slot_0_6_0.listConvars.memory.data[iter_194_0].element

		if not var_194_0 or not var_194_0.szName then
			-- block empty
		elseif ffi.string(var_194_0.szName) == arg_194_0 then
			return var_194_0
		end
	end
end

cvar_name = utils.GetConvar("name")
cvar_name.nFlags = 33408

function getNameFromEntity(arg_195_0)
	return arg_195_0 and arg_195_0:GetName() or nil
end

nicknames = {
	[2] = {
		{
			interval = 0.26,
			name = "PND ㅤ"
		},
		{
			interval = 0.25,
			name = "PNDㅤ"
		},
		{
			interval = 0.3,
			name = "PND. ㅤ"
		},
		{
			interval = 0.32,
			name = "PND.lㅤ"
		},
		{
			interval = 0.33,
			name = "PND.lu ㅤ"
		},
		{
			interval = 0.35,
			name = "PND.luaㅤ"
		},
		{
			interval = 0.36,
			name = "PND.lua ㅤ"
		},
		{
			interval = 0.35,
			name = "PND.luaㅤ"
		},
		{
			interval = 0.36,
			name = "PND.lua ㅤ"
		},
		{
			interval = 0.35,
			name = "PND.luaㅤ"
		},
		{
			interval = 0.36,
			name = "PND.lua ㅤ"
		},
		{
			interval = 0.35,
			name = "PND.luaㅤ"
		},
		{
			interval = 0.33,
			name = "PND.lu ㅤ"
		},
		{
			interval = 0.32,
			name = "PND.lㅤ"
		},
		{
			interval = 0.3,
			name = "PND. ㅤ"
		},
		{
			interval = 0.26,
			name = "PNDㅤ"
		},
		{
			interval = 0.25,
			name = "PND ㅤ"
		},
		{
			interval = 0.26,
			name = "PNDㅤ"
		},
		{
			interval = 0.26,
			name = "PND ㅤ"
		},
		{
			interval = 0.25,
			name = "PNDㅤ"
		}
	},
	[4] = {
		{
			interval = 0.2,
			name = "nolux."
		},
		{
			interval = 0.21,
			name = "nolxu.7"
		},
		{
			interval = 0.22,
			name = "noxlu.7e"
		},
		{
			interval = 0.23,
			name = "nxolu.7e4"
		},
		{
			interval = 0.24,
			name = "xnolu.7e"
		},
		{
			interval = 0.25,
			name = "nxolu.7"
		},
		{
			interval = 0.26,
			name = "noxlu."
		},
		{
			interval = 0.27,
			name = "nolxu.7"
		},
		{
			interval = 0.28,
			name = "nolux.7e"
		},
		{
			interval = 0.29,
			name = "nloux.7e4"
		},
		{
			interval = 0.2,
			name = "lnoux.7e"
		},
		{
			interval = 0.21,
			name = "lonux.7"
		},
		{
			interval = 0.22,
			name = "lounx."
		},
		{
			interval = 0.23,
			name = "luonx.7"
		},
		{
			interval = 0.24,
			name = "lunox.7e"
		},
		{
			interval = 1.45,
			name = "lunox.7e4"
		},
		{
			interval = 0.29,
			name = "iunox.7e"
		},
		{
			interval = 0.2,
			name = "lunox.7"
		},
		{
			interval = 0.21,
			name = "lnuox.7e"
		},
		{
			interval = 0.22,
			name = "nluox.7e4"
		},
		{
			interval = 0.23,
			name = "nulox.7e"
		},
		{
			interval = 0.24,
			name = "nuolx.7e"
		},
		{
			interval = 0.25,
			name = "noulx.7"
		}
	},
	[8] = {
		{
			interval = 2.2,
			name = "Dream"
		},
		{
			interval = 0.29,
			name = "Drea✧"
		},
		{
			interval = 0.2,
			name = "Drea*"
		},
		{
			interval = 0.21,
			name = "Drea・"
		},
		{
			interval = 0.22,
			name = "Drea"
		},
		{
			interval = 0.23,
			name = "Dre✧"
		},
		{
			interval = 0.24,
			name = "Dre*"
		},
		{
			interval = 0.25,
			name = "Dre・"
		},
		{
			interval = 0.26,
			name = "Dre"
		},
		{
			interval = 0.27,
			name = "Dr✧"
		},
		{
			interval = 0.28,
			name = "Dr*"
		},
		{
			interval = 0.29,
			name = "Dr・"
		},
		{
			interval = 0.2,
			name = "Dr"
		},
		{
			interval = 0.21,
			name = "D✧"
		},
		{
			interval = 0.22,
			name = "D*"
		},
		{
			interval = 0.23,
			name = "D・"
		},
		{
			interval = 0.24,
			name = "D"
		},
		{
			interval = 0.22,
			name = "✧"
		},
		{
			interval = 0.18,
			name = "*"
		},
		{
			interval = 0.16,
			name = "・"
		},
		{
			interval = 0.14,
			name = "∗"
		},
		{
			interval = 0.12,
			name = "✩"
		},
		{
			interval = 0.1,
			name = "⋆"
		},
		{
			interval = 0.1,
			name = "✧・"
		},
		{
			interval = 0.1,
			name = "✧・゚"
		},
		{
			interval = 0.1,
			name = "✧・゚:"
		},
		{
			interval = 0.1,
			name = "✧・゚:・"
		},
		{
			interval = 0.1,
			name = "✧・゚:・゚"
		},
		{
			interval = 0.1,
			name = "✧・゚:・゚✧"
		},
		{
			interval = 0.1,
			name = "D゚:✧"
		},
		{
			interval = 0.28,
			name = "Dr゚:✧"
		},
		{
			interval = 0.29,
			name = "Dr・:✧"
		},
		{
			interval = 0.2,
			name = "Dr・゚:✧"
		},
		{
			interval = 0.21,
			name = "Dr・゚:✧m"
		},
		{
			interval = 0.22,
			name = "Dr・゚:am"
		},
		{
			interval = 0.23,
			name = "Dr・:am"
		}
	},
	[16] = {
		{
			interval = 1.2,
			name = "morigyaru"
		},
		{
			interval = 0.21,
			name = "morigyar"
		},
		{
			interval = 0.22,
			name = "morigya"
		},
		{
			interval = 0.23,
			name = "morigy"
		},
		{
			interval = 0.24,
			name = "morig"
		},
		{
			interval = 0.25,
			name = "mori"
		},
		{
			interval = 0.26,
			name = "mor"
		},
		{
			interval = 0.27,
			name = "mo"
		},
		{
			interval = 0.28,
			name = "m"
		},
		{
			interval = 0.29,
			name = "mo"
		},
		{
			interval = 0.2,
			name = "mor"
		},
		{
			interval = 0.21,
			name = "mori"
		},
		{
			interval = 0.22,
			name = "morig"
		},
		{
			interval = 0.23,
			name = "morigy"
		},
		{
			interval = 0.24,
			name = "morigya"
		},
		{
			interval = 0.25,
			name = "morigyar"
		},
		{
			interval = 1.2,
			name = "morigyaru"
		},
		{
			interval = 0.27,
			name = "origyaru"
		},
		{
			interval = 0.28,
			name = "rigyaru"
		},
		{
			interval = 0.29,
			name = "igyaru"
		},
		{
			interval = 0.2,
			name = "gyaru"
		},
		{
			interval = 0.21,
			name = "yaru"
		},
		{
			interval = 0.22,
			name = "aru"
		},
		{
			interval = 0.23,
			name = "ru"
		},
		{
			interval = 0.24,
			name = "u"
		},
		{
			interval = 0.25,
			name = "ur"
		},
		{
			interval = 0.26,
			name = "ura"
		},
		{
			interval = 0.27,
			name = "uray"
		},
		{
			interval = 0.28,
			name = "urayg"
		},
		{
			interval = 0.29,
			name = "uraygi"
		},
		{
			interval = 0.2,
			name = "uraygir"
		},
		{
			interval = 0.21,
			name = "uraygiro"
		},
		{
			interval = 0.22,
			name = "uraygirom"
		},
		{
			interval = 0.23,
			name = "uraygirmo"
		},
		{
			interval = 0.24,
			name = "uraygimor"
		},
		{
			interval = 0.25,
			name = "uraygmori"
		},
		{
			interval = 0.26,
			name = "uraymorig"
		},
		{
			interval = 0.27,
			name = "uramorigy"
		},
		{
			interval = 0.28,
			name = "urmorigya"
		},
		{
			interval = 0.29,
			name = "umorigyar"
		}
	},
	[32] = {
		{
			interval = 0.41,
			name = "             ga"
		},
		{
			interval = 0.27,
			name = "            gam"
		},
		{
			interval = 0.28,
			name = "           game"
		},
		{
			interval = 0.28,
			name = "          games"
		},
		{
			interval = 0.28,
			name = "         gamese"
		},
		{
			interval = 0.28,
			name = "        gamesen"
		},
		{
			interval = 0.38,
			name = "       gamesens"
		},
		{
			interval = 0.28,
			name = "      gamesense"
		},
		{
			interval = 0.28,
			name = "     gamesense "
		},
		{
			interval = 0.28,
			name = "    gamesense  "
		},
		{
			interval = 0.28,
			name = "   gamesense   "
		},
		{
			interval = 2.44,
			name = "  gamesense    "
		},
		{
			interval = 0.28,
			name = " gamesense     "
		},
		{
			interval = 0.28,
			name = "gamesense      "
		},
		{
			interval = 0.28,
			name = "amesense       "
		},
		{
			interval = 0.28,
			name = "mesense        "
		},
		{
			interval = 0.28,
			name = "esense         "
		},
		{
			interval = 0.28,
			name = "sense          "
		},
		{
			interval = 0.38,
			name = "ense           "
		},
		{
			interval = 0.28,
			name = "nse            "
		},
		{
			interval = 0.28,
			name = "se             "
		},
		{
			interval = 0.52,
			name = "e              "
		},
		{
			interval = 0.03,
			name = "               "
		}
	},
	[64] = {
		{
			interval = 0.41,
			name = "             me"
		},
		{
			interval = 0.27,
			name = "            mem"
		},
		{
			interval = 0.28,
			name = "           meme"
		},
		{
			interval = 0.28,
			name = "          memes"
		},
		{
			interval = 0.28,
			name = "         memese"
		},
		{
			interval = 0.28,
			name = "        memesen"
		},
		{
			interval = 0.38,
			name = "       memesens"
		},
		{
			interval = 0.28,
			name = "      memesense"
		},
		{
			interval = 0.28,
			name = "     memesense "
		},
		{
			interval = 0.28,
			name = "    memesense  "
		},
		{
			interval = 0.28,
			name = "   memesense   "
		},
		{
			interval = 2.44,
			name = "  memesense    "
		},
		{
			interval = 0.28,
			name = " memesense     "
		},
		{
			interval = 0.28,
			name = "memesense      "
		},
		{
			interval = 0.28,
			name = "emesense       "
		},
		{
			interval = 0.28,
			name = "mesense        "
		},
		{
			interval = 0.28,
			name = "esense         "
		},
		{
			interval = 0.28,
			name = "sense          "
		},
		{
			interval = 0.38,
			name = "ense           "
		},
		{
			interval = 0.28,
			name = "nse            "
		},
		{
			interval = 0.28,
			name = "se             "
		},
		{
			interval = 0.52,
			name = "e              "
		},
		{
			interval = 0.03,
			name = "               "
		}
	},
	[128] = {},
	[512] = {
    {interval = 0.2, name = "s"},
    {interval = 0.2, name = "sk"},
    {interval = 0.2, name = "ske"},
    {interval = 0.2, name = "skee"},
    {interval = 0.2, name = "skeet"},
    {interval = 0.2, name = "skeet "},
    {interval = 0.2, name = "skeet s"},
    {interval = 0.2, name = "skeet sk"},
    {interval = 0.2, name = "skeet ske"},
    {interval = 0.2, name = "skeet skee"},
    {interval = 0.2, name = "skeet skeet"},
    {interval = 0.2, name = "skeet skeet "},
    {interval = 0.2, name = "skeet skeet n"},
    {interval = 0.2, name = "skeet skeet nu"},
    {interval = 0.2, name = "skeet skeet num"},
    {interval = 0.2, name = "skeet skeet numb"},
    {interval = 0.2, name = "skeet skeet numbe"},
    {interval = 0.2, name = "skeet skeet number"},
    {interval = 0.2, name = "skeet skeet number "},
    {interval = 0.2, name = "skeet skeet number o"},
    {interval = 0.2, name = "skeet skeet number on"},
    {interval = 0.2, name = "skeet skeet number one"},
    {interval = 0.2, name = "skeet skeet number one "},
    {interval = 0.2, name = "skeet skeet number one c"},
    {interval = 0.2, name = "skeet skeet number one ch"},
    {interval = 0.2, name = "skeet skeet number one che"},
    {interval = 0.2, name = "skeet skeet number one chea"},
    {interval = 0.2, name = "skeet skeet number one cheat"},
    {interval = 0.5, name = "skeet skeet number one cheat"},
    {interval = 0.2, name = "skeet skeet number one chea"},
    {interval = 0.2, name = "skeet skeet number one che"},
    {interval = 0.2, name = "skeet skeet number one ch"},
    {interval = 0.2, name = "skeet skeet number one c"},
    {interval = 0.2, name = "skeet skeet number one "},
    {interval = 0.2, name = "skeet skeet number one"},
    {interval = 0.2, name = "skeet skeet number on"},
    {interval = 0.2, name = "skeet skeet number o"},
    {interval = 0.2, name = "skeet skeet number "},
    {interval = 0.2, name = "skeet skeet number"},
    {interval = 0.2, name = "skeet skeet numbe"},
    {interval = 0.2, name = "skeet skeet numb"},
    {interval = 0.2, name = "skeet skeet num"},
    {interval = 0.2, name = "skeet skeet nu"},
    {interval = 0.2, name = "skeet skeet n"},
    {interval = 0.2, name = "skeet skeet "},
    {interval = 0.2, name = "skeet skeet"},
    {interval = 0.2, name = "skeet skee"},
    {interval = 0.2, name = "skeet ske"},
    {interval = 0.2, name = "skeet sk"},
    {interval = 0.2, name = "skeet s"},
    {interval = 0.2, name = "skeet "},
    {interval = 0.2, name = "skeet"},
    {interval = 0.2, name = "skee"},
    {interval = 0.2, name = "ske"},
    {interval = 0.2, name = "sk"},
    {interval = 0.2, name = "s"},
    {interval = 0.2, name = ""}
}
}
function generateDynamicNicknameSet(arg_196_0)
	local var_196_0 = {}

	if #arg_196_0 > 14 then
		arg_196_0 = string.sub(arg_196_0, 1, 14)
	end

	local var_196_1 = #arg_196_0

	if var_196_1 == 0 then
		return var_196_0
	end

	local var_196_2 = {
		{
			interval = 8,
			name = "[Monolith]"
		},
		{
			interval = 0.5,
			name = "[Monolit]"
		},
		{
			interval = 0.5,
			name = "[Monoli]"
		},
		{
			interval = 0.5,
			name = "[Monol]"
		},
		{
			interval = 0.5,
			name = "[Mono]"
		},
		{
			interval = 0.5,
			name = "[Mon]"
		},
		{
			interval = 0.5,
			name = "[Mo]"
		},
		{
			interval = 0.5,
			name = "[M]"
		}
	}

	for iter_196_0, iter_196_1 in ipairs(var_196_2) do
		table.insert(var_196_0, {
			name = iter_196_1.name,
			interval = iter_196_1.interval
		})
	end

	for iter_196_2 = 1, var_196_1 do
		local var_196_3 = string.sub(arg_196_0, 1, iter_196_2)
		local var_196_4 = 0.5

		if iter_196_2 == var_196_1 then
			local var_196_5 = 7.5
			local var_196_6 = (var_196_1 - 1) * 0.5

			var_196_4 = math.max(var_196_5 - var_196_6, 0.5)
		end

		table.insert(var_196_0, {
			name = "[" .. var_196_3 .. "]",
			interval = var_196_4
		})
	end

	local var_196_7 = {
		{
			interval = 0.5,
			name = "[M]"
		},
		{
			interval = 0.5,
			name = "[Mo]"
		},
		{
			interval = 0.5,
			name = "[Mon]"
		},
		{
			interval = 0.5,
			name = "[Mono]"
		},
		{
			interval = 0.5,
			name = "[Monol]"
		},
		{
			interval = 0.5,
			name = "[Monoli]"
		},
		{
			interval = 0.5,
			name = "[Monolit]"
		}
	}

	for iter_196_3, iter_196_4 in ipairs(var_196_7) do
		table.insert(var_196_0, {
			name = iter_196_4.name,
			interval = iter_196_4.interval
		})
	end

	return var_196_0
end

function updateDynamicNicknameSet()
	local var_197_0 = ""

	if txt_clantags and txt_clantags.value then
		var_197_0 = txt_clantags.value
	end

	if #var_197_0 > 14 then
		var_197_0 = string.sub(var_197_0, 1, 14)
	end

	if var_197_0 == "" then
		nicknames[128] = {
			{
				interval = 8,
				name = "[Monolith]"
			},
			{
				interval = 0.5,
				name = "[Monolit]"
			},
			{
				interval = 0.5,
				name = "[Monoli]"
			},
			{
				interval = 0.5,
				name = "[Monol]"
			},
			{
				interval = 0.5,
				name = "[Mono]"
			},
			{
				interval = 0.5,
				name = "[Mon]"
			},
			{
				interval = 0.5,
				name = "[Mo]"
			},
			{
				interval = 0.5,
				name = "[M]"
			},
			{
				interval = 0.5,
				name = "[1]"
			},
			{
				interval = 0.5,
				name = "[13]"
			},
			{
				interval = 0.5,
				name = "[133]"
			},
			{
				interval = 6,
				name = "[1337]"
			},
			{
				interval = 0.5,
				name = "[M]"
			},
			{
				interval = 0.5,
				name = "[Mo]"
			},
			{
				interval = 0.5,
				name = "[Mon]"
			},
			{
				interval = 0.5,
				name = "[Mono]"
			},
			{
				interval = 0.5,
				name = "[Monol]"
			},
			{
				interval = 0.5,
				name = "[Monoli]"
			},
			{
				interval = 0.5,
				name = "[Monolit]"
			}
		}
	else
		nicknames[128] = generateDynamicNicknameSet(var_197_0)
	end
end

function calculateBaseCumulativeTimes(arg_198_0)
	local var_198_0 = {}
	local var_198_1 = 0

	for iter_198_0, iter_198_1 in ipairs(arg_198_0) do
		var_198_1 = var_198_1 + iter_198_1.interval
		var_198_0[iter_198_0] = var_198_1
	end

	return var_198_0, var_198_1
end

function findIndexAtTime(arg_199_0, arg_199_1)
	for iter_199_0, iter_199_1 in ipairs(arg_199_0) do
		if arg_199_1 < iter_199_1 then
			return iter_199_0
		end
	end

	return #arg_199_0
end

clanTagOff = true
lastSetName = nil
startOffset = 0
lastCountValue = nil
lastCountUpdateTime = nil
last128Progress = nil
lastTextCheck = nil

function updateName(arg_200_0)
	if arg_200_0 and arg_200_0 ~= lastSetName then
		game.engine:ClientCmd("setinfo name \"" .. arg_200_0 .. "\"")

		lastSetName = arg_200_0
	end
end

function getCountingName()
	local var_201_0 = game.globalVars.m_flCurTime
	local var_201_1 = 0.27

	if not lastCountUpdateTime then
		lastCountUpdateTime = var_201_0
		lastCountValue = 1000

		return tostring(lastCountValue) .. "-7 " .. realName
	end

	if var_201_1 <= var_201_0 - lastCountUpdateTime then
		lastCountUpdateTime = var_201_0
		lastCountValue = lastCountValue - 7

		if lastCountValue < -7 then
			lastCountValue = 1000
		end

		return tostring(lastCountValue) .. "-7 " .. realName
	end

	return tostring(lastCountValue) .. "-7 " .. realName
end

events.presentQueue:Add(function()
	if not clanTagOff then
		return
	end

	if not game.engine:InGame() or not game.engine:IsConnected() then
		return
	end

	local var_202_0 = cbx_clantags:GetValue():Get():GetRaw()
	local var_202_1 = game.globalVars.m_flCurTime

	if not enabled_cl then
		return initializeRealName()
	end

	if var_202_0 == 256 then
		local var_202_2 = getCountingName()
		updateName(var_202_2)
		return true
	end

	if var_202_0 == 1 then
		updateName(realName)
		return true
	end

	if var_202_0 == 512 then
		startOffset = 5.6
		lastSelectedMode = 512
	elseif var_202_0 == 128 then
		if lastSelectedMode ~= 128 then
			startOffset = -4
			last128Progress = nil

			updateDynamicNicknameSet()

			lastTextCheck = txt_clantags and txt_clantags.value or ""

			if #lastTextCheck > 14 then
				lastTextCheck = string.sub(lastTextCheck, 1, 14)
			end
		end

		local var_202_3 = ""

		if txt_clantags and txt_clantags.value then
			var_202_3 = txt_clantags.value

			if #var_202_3 > 14 then
				var_202_3 = string.sub(var_202_3, 1, 14)
			end
		end

		if var_202_3 ~= lastTextCheck then
			if nicknames[128] and #nicknames[128] > 0 and last128Progress then
				local var_202_4 = nicknames[128]
				local var_202_5, var_202_6 = calculateBaseCumulativeTimes(var_202_4)
				local var_202_7 = (var_202_1 - startOffset) % var_202_6
				local var_202_8 = findIndexAtTime(var_202_5, var_202_7)
				local var_202_9 = var_202_7

				if var_202_8 > 1 then
					var_202_9 = var_202_7 - var_202_5[var_202_8 - 1]
				end

				local var_202_10 = var_202_9 / var_202_4[var_202_8].interval

				last128Progress = {
					index = var_202_8,
					progress = var_202_10
				}
			end

			updateDynamicNicknameSet()

			lastTextCheck = var_202_3

			if last128Progress and nicknames[128] and #nicknames[128] > 0 then
				local var_202_11 = nicknames[128]
				local var_202_12, var_202_13 = calculateBaseCumulativeTimes(var_202_11)
				local var_202_14 = last128Progress.index

				if var_202_14 > #var_202_11 then
					var_202_14 = #var_202_11
				end

				local var_202_15 = 0

				if var_202_14 > 1 then
					var_202_15 = var_202_12[var_202_14 - 1]
				end

				local var_202_16 = var_202_15 + var_202_11[var_202_14].interval * last128Progress.progress - (var_202_1 - startOffset) % var_202_13

				startOffset = startOffset - var_202_16
				last128Progress = nil
			end
		end

		lastSelectedMode = 128
	else
		startOffset = 5.6
		lastSelectedMode = var_202_0
	end

	local var_202_17 = nicknames[var_202_0] or nicknames[32]

	if not var_202_17 or #var_202_17 == 0 then
		updateName(realName)
		return true
	end

	local var_202_18, var_202_19 = calculateBaseCumulativeTimes(var_202_17)
	local var_202_20 = math.floor((var_202_1 - startOffset) / var_202_19)
	local var_202_21 = var_202_1 - startOffset - var_202_20 * var_202_19

	if var_202_21 < 0 then
		var_202_21 = var_202_21 + var_202_19
	end

	local var_202_22 = var_202_17[findIndexAtTime(var_202_18, var_202_21)].name .. " " .. realName

	updateName(var_202_22)
end)
events.presentQueue:Add(function()
	if not game.engine:InGame() or not game.engine:IsConnected() then
		return
	end

	local var_203_0 = cbx_auto_team:GetValue():Get():GetRaw()

	if var_203_0 == 1 then
		return
	end

	local var_203_1 = entities.GetLocalPawn().m_iTeamNum:Get()

	auto_team_state = auto_team_state or {
		last_switch = 0
	}

	local var_203_2 = var_203_0 == 2 and 3 or 2
	local var_203_3 = game.globalVars.m_flRealTime

	if var_203_1 ~= var_203_2 and var_203_3 - (auto_team_state.last_switch or 0) >= 0.1 then
		panorama.Eval("GameInterfaceAPI.ConsoleCommand('jointeam " .. var_203_2 .. " 1')", "CSGOTeamSelectMenu")

		auto_team_state.last_switch = var_203_3
	end
end)
btn_kill_yourself:AddCallback(function()
	Delay(0.1, function()
		if not game.engine:InGame() or not game.engine:IsConnected() then
			return
		end

		local var_205_0 = entities.GetLocalPawn()

		if not var_205_0 or not var_205_0:IsAlive() then
			return
		end

		game.engine:ClientCmd("jointeam")
	end)
end)

local_userid = nil

mods.events:AddListener("player_death")
events.event:Add(function(arg_206_0)
	if not cb_auto_kick:GetValue():Get() then
		return
	end

	if arg_206_0:GetName() ~= "player_death" then
		return
	end

	local var_206_0 = arg_206_0:GetInt("userid")

	if var_206_0 == -1 then
		return
	end

	local var_206_1 = arg_206_0:GetController("userid")

	if not var_206_1 then
		return
	end

	if var_206_1 == entities.GetLocalController() then
		local_userid = var_206_0
	end
end)
events.presentQueue:Add(function()
	if not cb_auto_kick:GetValue():Get() then
		return
	end

	if not game.engine:InGame() or not game.engine:IsConnected() then
		local_userid = nil

		return
	end

	if not local_userid then
		return
	end

	game.engine:ClientCmd("callvote kick " .. tostring(local_userid))
end)

slot_0_7_0 = nil
slot_0_8_0 = nil
slot_0_9_0 = nil
slot_0_10_0 = "    cbuffer cb : register(b0) {\n        float4x4 mvp;\n        float2 tex;\n        float time;\n        float alpha;\n    };\n\n    struct PS_INPUT {\n        float4 pos : SV_POSITION;\n        float4 col : COLOR0;\n        float2 uv : TEXCOORD0;\n    };\n\n    sampler sampler0;\n    Texture2D texture0;\n\n    float4 main(PS_INPUT inp) : SV_Target {\n        float radius = 5.0;\n        float2 inv_size = 1.0 / tex.xy;\n        float weight = 0.0;\n        float4 color = 0.0;\n\n        for (float x = -radius; x <= radius; x += 1.0) {\n            for (float y = -radius; y <= radius; y += 1.0) {\n                float2 coord = inp.uv + float2(x, y) * inv_size;\n                float w = exp(-((x * x + y * y) / (2.0 * radius * radius)));\n                color += texture0.Sample(sampler0, coord) * w;\n                weight += w;\n            }\n        }\n\n        color /= weight;\n        color.a *= inp.col.a;\n        return color;\n    }\n"
slot_0_11_0 = "    cbuffer cb : register(b0) {\n        float4x4 mvp;\n        float2 tex;\n        float time;\n        float alpha;\n    };\n\n    struct PS_INPUT {\n        float4 pos : SV_POSITION;\n        float4 col : COLOR0;\n        float2 uv : TEXCOORD0;\n    };\n\n    sampler sampler0;\n    Texture2D texture0;\n\n    float4 main(PS_INPUT inp) : SV_Target {\n        float pixel_size = 1.0 / 100.0;\n        inp.uv = floor(inp.uv / pixel_size) * pixel_size;\n        float4 color = texture0.Sample(sampler0, inp.uv);\n        return color;\n    }\n"
slot_0_12_0 = "    cbuffer cb : register(b0) {\n        float4x4 mvp;\n        float2 tex;\n        float time;\n        float alpha;\n    };\n\n    struct PS_INPUT {\n        float4 pos : SV_POSITION;\n        float4 col : COLOR0;\n        float2 uv  : TEXCOORD0;\n    };\n\n    float hash(float2 p) {\n        return frac(sin(dot(p, float2(127.1, 311.7))) * 43758.5453);\n    }\n\n    float2 rand2(float2 p) {\n        return frac(sin(float2(dot(p, float2(127.1, 311.7)),\n                               dot(p, float2(269.5, 183.3)))) * 43758.5453);\n    }\n\n    sampler sampler0;\n    Texture2D texture0;\n\n    float4 main(PS_INPUT inp) : SV_Target {\n        float2 uv = inp.uv * 2.0 - 1.0;\n        float brightness = 0.0;\n        const int STAR_COUNT = 100;\n\n        for (int i = 0; i < STAR_COUNT; i++) {\n            float fi = float(i);\n            float2 starSeed = float2(fi, fi * 3.1);\n            float2 starPos = rand2(starSeed) * 2.0 - 1.0;\n            float depth = frac(time * (0.1 + 0.01 * fi) + fi * 0.01);\n            float fade = smoothstep(0.0, 0.05, depth) * smoothstep(1.0, 0.95, depth);\n            float2 pos = starPos / (0.2 + depth * 1.2);\n            float d = length(uv - pos);\n            float size = 0.015 / (0.2 + depth * 1.2);\n            brightness += fade * size / (d + 0.01);\n        }\n\n        brightness = saturate(brightness * 0.3);\n        return float4(brightness, brightness, brightness, brightness);\n    }\n"

function effect_menu()
	local var_208_0 = cbx_effect_on_menu_type:GetValue():Get():GetRaw()

	if not gui.IsVisible() and not cb_always_effect_on_menu:GetValue():Get() then
		slot_0_7_0 = nil
		slot_0_8_0 = nil
		slot_0_9_0 = nil

		return
	end

	local var_208_1 = draw.surface
	local var_208_2 = var_208_1.g
	local var_208_3, var_208_4 = game.engine:GetScreenSize()

	var_208_2:SetTexture(nil)

	if var_208_0 == 1 then
		if not slot_0_7_0 then
			slot_0_7_0 = draw.Shader(slot_0_10_0)

			slot_0_7_0:Create()
		end

		var_208_2.texture = draw.adapter:GetBackBufferDownsampled()

		var_208_2:SetShader(slot_0_7_0)
		var_208_1:AddRectFilled(draw.Rect(0, 0, var_208_3, var_208_4), draw.Color(255, 255, 255, 255))
	elseif var_208_0 == 2 then
		if not slot_0_8_0 then
			slot_0_8_0 = draw.Shader(slot_0_11_0)

			slot_0_8_0:Create()
		end

		var_208_2:SetShader(slot_0_8_0)

		var_208_2.texture = draw.adapter:GetBackBuffer()

		var_208_1:AddRectFilled(draw.Rect(0, 0, var_208_3, var_208_4), draw.Color(255, 255, 255, 255))
	elseif var_208_0 == 4 then
		if not slot_0_9_0 then
			slot_0_9_0 = draw.Shader(slot_0_12_0)

			slot_0_9_0:Create()
		end

		var_208_2:SetShader(slot_0_9_0)

		var_208_2.texture = draw.adapter:GetBackBuffer()

		var_208_1:AddRectFilled(draw.Rect(0, 0, var_208_3, var_208_4), draw.Color(255, 255, 255, 255))
	end

	if var_208_0 == 1 or var_208_0 == 2 or var_208_0 == 4 then
		var_208_2:SetShader(nil)
		var_208_2:SetTexture(nil)
	end
end

cb_effect_on_menu:AddCallback(function()
	Delay(0.1, function()
		if not cb_effect_on_menu:GetValue():Get() then
			events.presentQueue:Remove(effect_menu)
		else
			events.presentQueue:Add(effect_menu)
		end
	end)
end)

arms_bits_path = "visuals>local>viewmodel>chams>arms"
arms_color_path = arms_bits_path .. ">color"
transparent_color = draw.Color(0, 0, 0, 0)
arms_state = {
	saved_color = nil,
	is_toggled = false
}

function get_arms_ctrl()
	return gui.ctx:Find(arms_bits_path), gui.ctx:Find(arms_color_path)
end

function restore_arms()
	local var_212_0, var_212_1 = get_arms_ctrl()

	if not var_212_0 or not var_212_1 then
		return
	end

	local var_212_2 = var_212_0:GetValue()
	local var_212_3 = var_212_2:Get()

	var_212_3:SetRaw(arms_state.saved_bits or 2)
	var_212_2:Set(var_212_3)
	var_212_0:Reset()

	if arms_state.saved_color then
		var_212_1:GetValue():Set(arms_state.saved_color)
		var_212_1:Reset()
	end

	arms_state.saved_bits = nil
	arms_state.saved_color = nil
	arms_state.is_toggled = false
end

function set_transparent_arms()
	local var_213_0, var_213_1 = get_arms_ctrl()

	if not var_213_0 or not var_213_1 then
		return
	end

	if not arms_state.saved_bits then
		local var_213_2 = var_213_0:GetValue()
		local var_213_3 = var_213_1:GetValue()
		local var_213_4 = var_213_2:Get()

		arms_state.saved_bits = var_213_4:GetRaw()
		arms_state.saved_color = var_213_3:Get()
	end

	local var_213_5 = var_213_0:GetValue()
	local var_213_6 = var_213_1:GetValue()
	local var_213_7 = var_213_5:Get()

	var_213_7:SetRaw(arms_state.saved_bits == 2 and 4 or 2)
	var_213_5:Set(var_213_7)
	var_213_0:Reset()
	var_213_6:Set(transparent_color)
	var_213_1:Reset()

	arms_state.is_toggled = true
end

cb_transparent_arms:AddCallback(function()
	Delay(0.1, function()
		if not cb_transparent_arms:GetValue():Get() then
			if arms_state.is_toggled then
				restore_arms()
			end
		else
			set_transparent_arms()
		end
	end)
end)

angle = 0
last_hit_time = 0
hit_cooldown = 1
hit_effect_duration = 1
lerp_duration = 0.2
vm_override_path = "visuals>misc>local>viewmodel override"
vm_settings_path = vm_override_path .. ">settings"
vm_keys = {
	"viewmodel fov",
	"offset x",
	"offset y",
	"offset z",
	"pitch",
	"yaw",
	"roll"
}

function set_vm_value(arg_216_0, arg_216_1)
	gui.ctx:find(vm_settings_path .. ">" .. arg_216_0):get_value():set(arg_216_1)
end

function get_vm_value(arg_217_0)
	return gui.ctx:find(vm_settings_path .. ">" .. arg_217_0):get_value():get()
end

function save_vm(arg_218_0)
	if arg_218_0.saved then
		return
	end

	arg_218_0.enabled = gui.ctx:find(vm_override_path):get_value():get()

	for iter_218_0, iter_218_1 in ipairs(vm_keys) do
		arg_218_0[iter_218_1] = get_vm_value(iter_218_1)
	end

	arg_218_0.saved = true
end

function restore_vm(arg_219_0)
	if not arg_219_0.saved then
		return
	end

	gui.ctx:find(vm_override_path):get_value():set(arg_219_0.enabled)

	for iter_219_0, iter_219_1 in ipairs(vm_keys) do
		set_vm_value(iter_219_1, arg_219_0[iter_219_1])
	end

	arg_219_0.saved = false
end

function restore_vm_smooth(arg_220_0, arg_220_1, arg_220_2)
	if not arg_220_0.saved then
		return
	end

	gui.ctx:find(vm_override_path):get_value():set(true)

	for iter_220_0, iter_220_1 in ipairs(vm_keys) do
		set_vm_value(iter_220_1, lerp(arg_220_1[iter_220_1], arg_220_0[iter_220_1], arg_220_2))
	end
end

saved_vm_hit = {
	saved = false
}
saved_vm_fd = {
	saved = false
}

function hit_effect_event(arg_221_0)
	if arg_221_0:GetName() ~= "player_hurt" then
		return
	end

	local var_221_0 = arg_221_0:get_pawn_from_id("attacker")
	local var_221_1 = arg_221_0:get_pawn_from_id("userid")

	if var_221_0 == entities.get_local_pawn() and var_221_1 then
		kill_pos = var_221_1:get_abs_origin()
		kill_time = game.global_vars.real_time
		last_hit_time = kill_time
	end
end

kill_pos = nil
kill_time = 0
viewmodel_hit_active = false
lerp_from_hit = {
	started = false
}

function hit_effect(arg_222_0)
	local var_222_0 = entities.GetLocalPawn()

	if fd_animation_active then
		return
	end

	config.visuals.viewmodel:SetValue(true)

	local var_222_1 = game.globalVars.m_flRealTime
	local var_222_2 = var_222_0:IsLeftHanded()
	local var_222_3 = kill_pos and var_222_1 - kill_time < hit_effect_duration
	local var_222_4 = var_222_1 - (kill_time + hit_effect_duration)
	local var_222_5 = saved_vm_hit.saved and cb_smooth_return:GetValue():Get()

	if var_222_3 then
		viewmodel_hit_active = true

		save_vm(saved_vm_hit)

		local var_222_6 = var_222_0:GetEyePos()
		local var_222_7 = arg_222_0:GetViewangles()
		local var_222_8 = math.CalcAngle(var_222_6, kill_pos)
		local var_222_9 = math.Clamp(var_222_2 and var_222_8.x + var_222_7.x - 10 or var_222_8.x - var_222_7.x, -89, 89)
		local var_222_10 = math.Clamp(var_222_8.y - var_222_7.y, -180, 180)

		if var_222_2 then
			var_222_10 = -var_222_10
		end

		gui.ctx:Find(vm_override_path):GetValue():Set(true)

		for iter_222_0, iter_222_1 in ipairs(vm_keys) do
			set_vm_value(iter_222_1, 0)
		end

		set_vm_value("viewmodel fov", 90)
		set_vm_value("pitch", var_222_9)
		set_vm_value("yaw", var_222_10)

		lerp_from_hit.started = false
	elseif var_222_5 and var_222_4 >= 0 and var_222_4 < lerp_duration then
		viewmodel_hit_active = true

		if not lerp_from_hit.started then
			for iter_222_2, iter_222_3 in ipairs(vm_keys) do
				lerp_from_hit[iter_222_3] = get_vm_value(iter_222_3)
			end

			lerp_from_hit.started = true
		end

		restore_vm_smooth(saved_vm_hit, lerp_from_hit, var_222_4 / lerp_duration)
	else
		restore_vm(saved_vm_hit)

		kill_pos = nil
		viewmodel_hit_active = false
	end
end

cb_viewmodel_hit_effect:AddCallback(function()
	Delay(0.1, function()
		if not cb_viewmodel_hit_effect:GetValue():Get() then
			events.event:Remove(hit_effect_event)
			events.createMove:Remove(hit_effect)
			restore_vm(saved_vm_hit)

			viewmodel_hit_active = false
		else
			events.event:Add(hit_effect_event)
			events.createMove:Add(hit_effect)
		end
	end)
end)

fd_animation_active = false
fd_animation_time = 0
fd_animation_direction = 1
fd_animation_min = -20
fd_animation_duration = 0.15
fd_initial_offset = nil

function fd_animation(arg_225_0)
	if not config.misc.duck_peek_control:GetValue():Get() or not config.rage.aimbot:GetValue():Get() then
		fd_animation_active = false

		restore_vm(saved_vm_fd)

		return
	end

	if game.globalVars.m_flRealTime - last_hit_time < hit_cooldown then
		fd_animation_active = false

		restore_vm(saved_vm_fd)

		return
	end

	local var_225_0 = game.globalVars.m_flRealTime

	if not fd_animation_active then
		fd_animation_active = true
		fd_animation_time = var_225_0
		fd_animation_direction = 1

		save_vm(saved_vm_fd)

		fd_initial_offset = saved_vm_fd["offset z"]
	end

	local var_225_1 = var_225_0 - fd_animation_time

	if var_225_1 >= fd_animation_duration then
		fd_animation_direction = -fd_animation_direction
		fd_animation_time = var_225_0
		var_225_1 = 0
	end

	local var_225_2 = var_225_1 / fd_animation_duration
	local var_225_3 = fd_animation_direction == 1 and lerp(fd_initial_offset, fd_animation_min, var_225_2) or lerp(fd_animation_min, fd_initial_offset, var_225_2)

	gui.ctx:Find(vm_override_path):GetValue():Set(true)
	set_vm_value("offset z", var_225_3)
end

cb_fd_animation:AddCallback(function()
	Delay(0.1, function()
		if not cb_fd_animation:GetValue():Get() then
			events.createMove:Remove(fd_animation)

			fd_animation_active = false

			restore_vm(saved_vm_fd)
		else
			events.createMove:Add(fd_animation)
		end
	end)
end)

visible_chams_path = "visuals>local>model>chams>visible"
visible_chams_color_path = visible_chams_path .. ">color"
attachments_chams_path = "visuals>local>model>chams>attachments"
attachments_chams_color_path = attachments_chams_path .. ">color"
original_values = {
	visible = {
		color = nil,
		bits = nil
	},
	attachments = {
		color = nil,
		bits = nil
	}
}
is_chams_overridden = false
last_override_reason = nil
grenade_classes = {
	C_HEGrenade = true,
	C_SmokeGrenade = true,
	C_Flashbang = true,
	C_BaseCSGrenade = true,
	C_DecoyGrenade = true,
	C_IncendiaryGrenade = true,
	C_MolotovGrenade = true
}
mode_mapping = {
	16,
	2,
	nil,
	32,
	nil,
	nil,
	nil,
	4,
	nil,
	nil,
	nil,
	nil,
	nil,
	nil,
	nil,
	8
}

function get_chams_ctrl(arg_228_0, arg_228_1)
	return gui.ctx:Find(arg_228_0), gui.ctx:Find(arg_228_1)
end

function update_chams(arg_229_0, arg_229_1, arg_229_2, arg_229_3)
	local var_229_0, var_229_1 = get_chams_ctrl(arg_229_0, arg_229_1)

	if not var_229_0 or not var_229_1 then
		return
	end

	local var_229_2 = arg_229_0:match("attachments") and "attachments" or "visible"
	local var_229_3 = var_229_0:GetValue()
	local var_229_4 = var_229_3:Get()
	local var_229_5 = var_229_4:GetRaw()

	if arg_229_2 then
		if not original_values[var_229_2].bits then
			original_values[var_229_2].bits = var_229_5
			original_values[var_229_2].color = var_229_1:GetValue():Get()
		end

		local var_229_6 = cbx_transparency_mode:GetValue():Get():GetRaw()
		local var_229_7 = mode_mapping[var_229_6] or var_229_6

		var_229_4:SetRaw(var_229_7)
		var_229_3:Set(var_229_4)
		var_229_0:Reset()

		if arg_229_3 then
			var_229_1:GetValue():Set(arg_229_3)
			var_229_1:Reset()
		end
	elseif original_values[var_229_2].bits then
		var_229_4:SetRaw(original_values[var_229_2].bits)
		var_229_3:Set(var_229_4)
		var_229_0:Reset()

		if original_values[var_229_2].color then
			var_229_1:GetValue():Set(original_values[var_229_2].color)
			var_229_1:Reset()
		end

		original_values[var_229_2].bits = nil
		original_values[var_229_2].color = nil
	end
end

function update_all_chams(arg_230_0, arg_230_1)
	update_chams(visible_chams_path, visible_chams_color_path, arg_230_0, arg_230_1)
	update_chams(attachments_chams_path, attachments_chams_color_path, arg_230_0, arg_230_1)
end

function transparency()
	local var_231_0 = entities.GetLocalPawn():GetActiveWeapon()

	if not var_231_0 then
		if is_chams_overridden then
			is_chams_overridden = false
			last_override_reason = nil

			update_all_chams(false)
		end

		return
	end

	local var_231_1 = var_231_0:GetClassName()

	if not var_231_1 then
		return
	end

	local var_231_2
	local var_231_3
	local var_231_4 = cbx_transparency_enable:GetValue():Get():GetRaw()

	if grenade_classes[var_231_1] and is_enabled(var_231_4, 2) then
		var_231_2 = "grenade"
		var_231_3 = clr_with_grenade_color:GetValue():Get()
	elseif is_zoom() and is_enabled(var_231_4, 1) then
		var_231_2 = "scope"
		var_231_3 = clr_with_scope_color:GetValue():Get()
	end

	if var_231_2 then
		if not is_chams_overridden then
			is_chams_overridden = true
		end

		last_override_reason = var_231_2

		update_all_chams(true, var_231_3)
	elseif is_chams_overridden then
		is_chams_overridden = false
		last_override_reason = nil

		update_all_chams(false)
	end
end

cb_transparency:AddCallback(function()
	Delay(0.1, function()
		if not cb_transparency:GetValue():Get() then
			events.createMove:Remove(transparency)

			if is_chams_overridden then
				is_chams_overridden = false
				last_override_reason = nil

				update_all_chams(false)
			end
		else
			events.createMove:Add(transparency)
		end
	end)
end)
cb_debounce_zoom:AddCallback(function()
	Delay(0.1, function()
		game.engine:ClientCmd(string.format("cl_debounce_zoom %d", cb_debounce_zoom:GetValue():Get() and 0 or 1))
	end)
end)

function animation_break()
	local var_236_0 = entities.GetLocalPawn()

	if not var_236_0 or not var_236_0:IsAlive() then
		return
	end

	local var_236_1 = sl_animation_x:GetValue():Get()
	local var_236_2 = sl_animation_z:GetValue():Get()
	local var_236_3 = cb_animation_spin:GetValue():Get() and (game.globalVars.m_flRealTime * 600 % 360 - 360) % 360 - 180 or sl_animation_y:GetValue():Get()

	var_236_0:SetAbsAngles(vector(var_236_1, var_236_3, var_236_2))
end

cb_animation_break:AddCallback(function()
	Delay(0.1, function()
		if not cb_animation_break:GetValue():Get() then
			events.overrideView:Remove(animation_break)
		else
			events.overrideView:Add(animation_break)
		end
	end)
end)

circle_params = {
	rainbow_effect = false,
	radius = 1,
	life_time = 1,
	interval = 1,
	draw_trails = false,
	color = draw.Color(255, 255, 255)
}
circles = {}
TRAIL_MODES = {
	FILLED = 1,
	PILL = 4,
	LINE = 2
}

function get_rainbow_color(arg_239_0)
	local var_239_0 = arg_239_0 * 0.5

	return draw.Color(math.sin(var_239_0) * 127 + 128, math.sin(var_239_0 + 2) * 127 + 128, math.sin(var_239_0 + 4) * 127 + 128)
end

function is_on_screen(arg_240_0, arg_240_1)
	if not arg_240_0 then
		return false
	end

	arg_240_1 = arg_240_1 or 0

	local var_240_0, var_240_1 = game.engine:GetScreenSize()

	if not var_240_0 or not var_240_1 then
		return false
	end

	return arg_240_0.x >= -arg_240_1 and arg_240_0.x <= var_240_0 + arg_240_1 and arg_240_0.y >= -arg_240_1 and arg_240_0.y <= var_240_1 + arg_240_1
end

draw_handlers = {
	[TRAIL_MODES.FILLED] = function(arg_241_0, arg_241_1, arg_241_2, arg_241_3)
		arg_241_0:AddCircleFilled(draw.Vec2(arg_241_1.x, arg_241_1.y), arg_241_2, arg_241_3, 36, 1)
	end,
	[TRAIL_MODES.LINE] = function(arg_242_0, arg_242_1, arg_242_2, arg_242_3, arg_242_4)
		if not arg_242_4 then
			return
		end

		local var_242_0 = math.WorldToScreen(arg_242_4.position)

		if var_242_0 and is_on_screen(var_242_0, 100) then
			arg_242_0:AddLine(draw.Vec2(arg_242_1.x, arg_242_1.y), draw.Vec2(var_242_0.x, var_242_0.y), arg_242_3, arg_242_2)
		end
	end,
	[TRAIL_MODES.PILL] = function(arg_243_0, arg_243_1, arg_243_2, arg_243_3, arg_243_4)
		if not arg_243_4 then
			return
		end

		local var_243_0 = math.WorldToScreen(arg_243_4.position)

		if var_243_0 and is_on_screen(var_243_0, 100) then
			arg_243_0:AddPillMulticolor(draw.Vec2(arg_243_1.x, arg_243_1.y), draw.Vec2(var_243_0.x, var_243_0.y), arg_243_2 * 1.2, arg_243_2 * 1.2, {
				arg_243_3,
				draw.Color(arg_243_3:GetR(), arg_243_3:GetG(), arg_243_3:GetB(), 0)
			}, 24)
		end
	end
}

function trails()
	local var_244_0 = entities.GetLocalPawn()

	if not game.engine:InGame() or not game.engine:IsConnected() or not var_244_0 or not var_244_0:IsAlive() then
		circles = {}

		return
	end

	local var_244_1 = cbx_trails_type:GetValue():Get():GetRaw()
	local var_244_2 = sl_lifetime:GetValue():Get() * 0.5
	local var_244_3 = sl_radius:GetValue():Get()
	local var_244_4 = sl_interval:GetValue():Get() * 1e-05
	local var_244_5 = clr_circle_color:GetValue():Get()
	local var_244_6 = cb_rainbow_effect:GetValue():Get()

	circle_params.life_time = var_244_2
	circle_params.radius = var_244_3
	circle_params.interval = var_244_4

	local var_244_7 = game.engine:GetLastTimestamp()
	local var_244_8 = var_244_0:GetAbsOrigin()
	local var_244_9 = var_244_0:GetAbsVelocity()

	if var_244_9.x * var_244_9.x + var_244_9.y * var_244_9.y + var_244_9.z * var_244_9.z > 4 and (not circles.last_draw_time or var_244_4 <= var_244_7 - circles.last_draw_time) then
		circles[#circles + 1] = {
			time_created = var_244_7,
			position = var_244_8,
			initial_radius = var_244_3,
			color = var_244_6 and get_rainbow_color(var_244_7) or var_244_5
		}
		circles.last_draw_time = var_244_7
	end

	if #circles == 0 then
		return
	end

	local var_244_10 = draw.surface

	var_244_10.font = draw.fonts.gui_main

	var_244_10.g:SetTexture(nil)

	local var_244_11 = draw_handlers[var_244_1]

	if not var_244_11 then
		return
	end

	local var_244_12 = 1 / var_244_2

	for iter_244_0 = #circles, 1, -1 do
		local var_244_13 = circles[iter_244_0]

		if not var_244_13 then
			-- block empty
		else
			local var_244_14 = var_244_7 - var_244_13.time_created

			if var_244_2 < var_244_14 then
				table.remove(circles, iter_244_0)
			else
				local var_244_15 = math.WorldToScreen(var_244_13.position)

				if var_244_15 and is_on_screen(var_244_15, 100) then
					local var_244_16 = 1 - var_244_14 * var_244_12
					local var_244_17 = var_244_13.color:ModA(var_244_16)
					local var_244_18 = var_244_13.initial_radius * var_244_16

					if var_244_1 == TRAIL_MODES.FILLED then
						var_244_11(var_244_10, var_244_15, var_244_18, var_244_17)
					else
						var_244_11(var_244_10, var_244_15, var_244_18, var_244_17, circles[iter_244_0 - 1])
					end
				end
			end
		end
	end
end

cb_trails:AddCallback(function()
	Delay(0.1, function()
		if not cb_trails:GetValue():Get() then
			events.presentQueue:Remove(trails)
		else
			events.presentQueue:Add(trails)
		end
	end)
end)
sl_gamma:AddCallback(function()
	Delay(0.1, function()
		game.engine:ClientCmd("r_fullscreen_gamma " .. sl_gamma:GetValue():Get() / 10)
	end)
end)

original_bits_shadows = nil
was_enabled_shadows = false
removals_ctrl = gui.ctx:Find("visuals>world>environment>removals")

cb_turn_off_shadow:AddCallback(function()
	Delay(0.1, function()
		if not cb_turn_off_shadow:GetValue():Get() and was_enabled_shadows and removals_ctrl and original_bits_shadows then
			local var_250_0 = removals_ctrl:GetValue()
			local var_250_1 = var_250_0:Get()

			var_250_1:SetRaw(original_bits_shadows)
			var_250_0:Set(var_250_1)
			removals_ctrl:Reset()

			original_bits_shadows = nil
		end

		if cb_turn_off_shadow:GetValue():Get() and not was_enabled_shadows and removals_ctrl then
			local var_250_2 = removals_ctrl:GetValue()
			local var_250_3 = var_250_2:Get()
			local var_250_4 = var_250_3:GetRaw()

			original_bits_shadows = var_250_4

			local var_250_5 = var_250_4 + 8

			var_250_3:SetRaw(var_250_5)
			var_250_2:Set(var_250_3)
			removals_ctrl:Reset()
		end

		was_enabled_shadows = cb_turn_off_shadow:GetValue():Get()
	end)
end)

recent_bullet_impacts = {}
hit_markers = {}
max_bullet_history = 30

mods.events:AddListener("bullet_impact")
mods.events:AddListener("player_hurt")
events.event:add(function(arg_251_0)
	if arg_251_0:GetName() == "bullet_impact" and cbx_hitmarkers:GetValue():Get():GetRaw() ~= 0 then
		local var_251_0 = arg_251_0:GetPawnFromId("userid")

		if var_251_0 and var_251_0 == entities.GetLocalPawn() then
			table.insert(recent_bullet_impacts, 1, {
				x = arg_251_0:GetFloat("x"),
				y = arg_251_0:GetFloat("y"),
				z = arg_251_0:GetFloat("z"),
				time = game.globalVars.m_flRealTime
			})

			if #recent_bullet_impacts > max_bullet_history then
				table.remove(recent_bullet_impacts, max_bullet_history + 1)
			end
		end
	end

	if arg_251_0:GetName() == "player_hurt" and cbx_hitmarkers:GetValue():Get():GetRaw() ~= 0 then
		local var_251_1 = arg_251_0:GetController("attacker")
		local var_251_2 = entities.GetLocalController()

		if var_251_1 and var_251_2 and var_251_1 == var_251_2 then
			local var_251_3 = arg_251_0:GetController("userid")

			if var_251_3 then
				local var_251_4 = var_251_3:GetPawn()

				if var_251_4 and #recent_bullet_impacts > 0 then
					local var_251_5 = var_251_4:GetAbsOrigin()
					local var_251_6
					local var_251_7 = math.huge

					for iter_251_0, iter_251_1 in ipairs(recent_bullet_impacts) do
						local var_251_8 = var_251_5:Dist(Vector(iter_251_1.x, iter_251_1.y, iter_251_1.z))

						if var_251_8 < var_251_7 then
							var_251_7 = var_251_8
							var_251_6 = iter_251_1
						end
					end

					if var_251_6 then
						table.insert(hit_markers, {
							x = var_251_6.x,
							y = var_251_6.y,
							z = var_251_6.z,
							time = game.globalVars.m_flRealTime,
							damage = arg_251_0:GetInt("dmg_health")
						})
					end
				end
			end
		end
	end
end)

function cleanup_old_data()
	local var_252_0 = game.globalVars.m_flRealTime
	local var_252_1 = sl_hitmarkers_lifetime:GetValue():Get() / 10

	for iter_252_0 = #recent_bullet_impacts, 1, -1 do
		if var_252_0 - recent_bullet_impacts[iter_252_0].time > 0.01 then
			table.remove(recent_bullet_impacts, iter_252_0)
		end
	end

	for iter_252_1 = #hit_markers, 1, -1 do
		if var_252_1 < var_252_0 - hit_markers[iter_252_1].time then
			table.remove(hit_markers, iter_252_1)
		end
	end
end

function calculate_alpha(arg_253_0, arg_253_1)
	if arg_253_0 < arg_253_1 then
		return 255
	else
		local var_253_0 = 1 - (arg_253_0 - arg_253_1) / (1 - arg_253_1)

		return 255 * math.max(0, var_253_0)
	end
end

function calculate_fade_alpha(arg_254_0, arg_254_1)
	if arg_254_0 < arg_254_1 then
		return 255 * (1 - arg_254_0 * 2)
	else
		return 255 * (1 - (arg_254_0 - arg_254_1) * 2)
	end
end

function draw_type1(arg_255_0, arg_255_1, arg_255_2, arg_255_3)
	local var_255_0 = calculate_fade_alpha(arg_255_1, 0.5)
	local var_255_1 = arg_255_2:ModA(var_255_0 / 255)
	local var_255_2 = arg_255_1 > 0.5
	local var_255_3 = (var_255_2 and 10 or 20) * arg_255_3
	local var_255_4 = (var_255_2 and 4 or 8) * arg_255_3
	local var_255_5 = (var_255_2 and 1 or 2) * arg_255_3
	local var_255_6 = var_255_3 / 2
	local var_255_7 = arg_255_0.x
	local var_255_8 = arg_255_0.y
	local var_255_9 = draw.surface

	var_255_9:AddLine(draw.Vec2(var_255_7, var_255_8 - var_255_6), draw.Vec2(var_255_7, var_255_8 - var_255_6 + var_255_4), var_255_1, var_255_5)
	var_255_9:AddLine(draw.Vec2(var_255_7, var_255_8 + var_255_6), draw.Vec2(var_255_7, var_255_8 + var_255_6 - var_255_4), var_255_1, var_255_5)
	var_255_9:AddLine(draw.Vec2(var_255_7 - var_255_6, var_255_8), draw.Vec2(var_255_7 - var_255_6 + var_255_4, var_255_8), var_255_1, var_255_5)
	var_255_9:AddLine(draw.Vec2(var_255_7 + var_255_6, var_255_8), draw.Vec2(var_255_7 + var_255_6 - var_255_4, var_255_8), var_255_1, var_255_5)
end

function draw_type2(arg_256_0, arg_256_1, arg_256_2, arg_256_3)
	local var_256_0 = 1

	if arg_256_1 > 0.8 then
		var_256_0 = 1 - (arg_256_1 - 0.8) / 0.3
	end

	local var_256_1 = 255 * var_256_0
	local var_256_2 = 40 * var_256_0
	local var_256_3 = arg_256_2:ModA(var_256_1 / 255)
	local var_256_4 = arg_256_2:ModA(var_256_2 / 255)
	local var_256_5 = 8 * arg_256_3
	local var_256_6 = 10 * arg_256_3 / 2
	local var_256_7 = arg_256_0.x
	local var_256_8 = arg_256_0.y
	local var_256_9 = draw.surface

	var_256_9:AddLineMulticolor(draw.Vec2(var_256_7 - var_256_5, var_256_8 - var_256_5), draw.Vec2(var_256_7 - var_256_5 + var_256_6, var_256_8 - var_256_5 + var_256_6), var_256_4, var_256_3, arg_256_3)
	var_256_9:AddLineMulticolor(draw.Vec2(var_256_7 + var_256_5, var_256_8 - var_256_5), draw.Vec2(var_256_7 + var_256_5 - var_256_6, var_256_8 - var_256_5 + var_256_6), var_256_4, var_256_3, arg_256_3)
	var_256_9:AddLineMulticolor(draw.Vec2(var_256_7 - var_256_5, var_256_8 + var_256_5), draw.Vec2(var_256_7 - var_256_5 + var_256_6, var_256_8 + var_256_5 - var_256_6), var_256_4, var_256_3, arg_256_3)
	var_256_9:AddLineMulticolor(draw.Vec2(var_256_7 + var_256_5, var_256_8 + var_256_5), draw.Vec2(var_256_7 + var_256_5 - var_256_6, var_256_8 + var_256_5 - var_256_6), var_256_4, var_256_3, arg_256_3)
end

function draw_type3(arg_257_0, arg_257_1, arg_257_2, arg_257_3, arg_257_4)
	local var_257_0 = calculate_alpha(arg_257_1, 0.6)

	if var_257_0 <= 0 then
		return
	end

	if not arg_257_4.text_offset_x then
		arg_257_4.text_offset_x = (math.random() * 30 - 15) * arg_257_3
	end

	local var_257_1 = -arg_257_1 * 20 * arg_257_3
	local var_257_2 = tostring(arg_257_4.damage)
	local var_257_3 = arg_257_2:ModA(var_257_0 / 255)
	local var_257_4 = draw.surface

	var_257_4.font = draw.fonts.gui_main_shadow

	local var_257_5 = var_257_4.font:GetTextSize(var_257_2)
	local var_257_6 = draw.Vec2(arg_257_0.x + arg_257_4.text_offset_x - var_257_5.x * arg_257_3 / 2, arg_257_0.y + var_257_1 - var_257_5.y * arg_257_3 / 2)

	var_257_4:AddText(var_257_6, var_257_2, var_257_3)
end

function init_particles(arg_258_0, arg_258_1, arg_258_2)
	if arg_258_0.particles then
		return
	end

	arg_258_0.particles = {}

	local var_258_0 = math.random(7, 12)

	for iter_258_0 = 1, var_258_0 do
		arg_258_0.particles[iter_258_0] = {
			radius = 1,
			angle = math.random() * math.pi * 2,
			horizontal_speed = math.random(20, 40) * arg_258_1,
			vertical_speed_up = math.random(30, 60) * arg_258_1,
			gravity = math.random(120, 170) * arg_258_1,
			lifetime = arg_258_2 * 0.6,
			delay = math.random() * 0.1 * arg_258_2,
			color_mult = math.random(8, 12) / 10,
			created_time = arg_258_0.time
		}
	end
end

function draw_type4(arg_259_0, arg_259_1, arg_259_2, arg_259_3, arg_259_4, arg_259_5, arg_259_6)
	init_particles(arg_259_5, arg_259_4, arg_259_6)

	local var_259_0 = 2 * arg_259_4
	local var_259_1 = var_259_0 - (var_259_0 - var_259_0 * 0.3) * arg_259_2
	local var_259_2 = math.floor(arg_259_3:GetA() * (1 - arg_259_2))
	local var_259_3 = arg_259_0.x
	local var_259_4 = arg_259_0.y
	local var_259_5 = draw.surface
	local var_259_6 = var_259_1 + 2 * arg_259_4 * (1 - arg_259_2 * 0.5)
	local var_259_7 = math.floor(var_259_2 * (1 - arg_259_2))

	var_259_5:AddCircleFilledMulticolor(draw.Vec2(var_259_3, var_259_4), var_259_6, {
		draw.Color(arg_259_3:GetR(), arg_259_3:GetG(), arg_259_3:GetB(), var_259_7),
		draw.Color(arg_259_3:GetR(), arg_259_3:GetG(), arg_259_3:GetB(), 0)
	})

	for iter_259_0, iter_259_1 in ipairs(arg_259_5.particles) do
		local var_259_8 = arg_259_1 - iter_259_1.delay

		if var_259_8 < 0 then
			-- block empty
		else
			local var_259_9 = math.min(1, var_259_8 / iter_259_1.lifetime)
			local var_259_10 = iter_259_1.horizontal_speed * var_259_8
			local var_259_11 = math.cos(iter_259_1.angle) * var_259_10
			local var_259_12 = iter_259_1.vertical_speed_up * var_259_8 - 0.5 * iter_259_1.gravity * var_259_8 * var_259_8
			local var_259_13 = var_259_3 + var_259_11
			local var_259_14 = var_259_4 - var_259_12
			local var_259_15 = arg_259_3:GetA() * math.max(0, 1 - var_259_9)

			if var_259_15 <= 0 then
				-- block empty
			else
				local var_259_16 = math.min(arg_259_3:GetR() * iter_259_1.color_mult, 255)
				local var_259_17 = math.min(arg_259_3:GetG() * iter_259_1.color_mult, 255)
				local var_259_18 = math.min(arg_259_3:GetB() * iter_259_1.color_mult, 255)

				var_259_5:AddCircleFilled(draw.Vec2(var_259_13, var_259_14), math.max(0.75, iter_259_1.radius * (1 - var_259_9 * 0.3)), draw.Color(var_259_16, var_259_17, var_259_18, var_259_15))
			end
		end
	end
end

function hitmarkers()
	if not game.engine:InGame() or not game.engine:IsConnected() then
		return
	end

	local var_260_0 = cbx_hitmarkers:GetValue():Get():GetRaw()

	cleanup_old_data()

	local var_260_1 = sl_hitmarkers_lifetime:GetValue():Get() / 10
	local var_260_2 = game.globalVars.m_flRealTime
	local var_260_3 = draw.GetScale()

	draw.surface.g.antiAlias = true

	local var_260_4 = clr_hitmarkers_color:GetValue():Get()
	local var_260_5 = is_enabled(var_260_0, 1)
	local var_260_6 = is_enabled(var_260_0, 2)
	local var_260_7 = is_enabled(var_260_0, 4)
	local var_260_8 = is_enabled(var_260_0, 8)

	for iter_260_0 = #hit_markers, 1, -1 do
		local var_260_9 = hit_markers[iter_260_0]
		local var_260_10 = var_260_2 - var_260_9.time

		if var_260_1 < var_260_10 then
			table.remove(hit_markers, iter_260_0)
		else
			local var_260_11 = math.WorldToScreen(Vector(var_260_9.x, var_260_9.y, var_260_9.z), false)

			if not var_260_11 then
				-- block empty
			else
				local var_260_12 = var_260_10 / var_260_1
				local var_260_13 = {
					x = var_260_11.x,
					y = var_260_11.y
				}

				if var_260_5 then
					draw_type1(var_260_13, var_260_12, var_260_4, var_260_3)
				end

				if var_260_6 then
					draw_type2(var_260_13, var_260_12, var_260_4, var_260_3)
				end

				if var_260_7 then
					draw_type3(var_260_13, var_260_12, var_260_4, var_260_3, var_260_9)
				end

				if var_260_8 then
					draw_type4(var_260_13, var_260_10, var_260_12, var_260_4, var_260_3, var_260_9, var_260_1)
				end
			end
		end
	end
end

cbx_hitmarkers:AddCallback(function()
	Delay(0.1, function()
		if cbx_hitmarkers:GetValue():Get():GetRaw() == 0 then
			events.presentQueue:Remove(hitmarkers)
		else
			events.presentQueue:Add(hitmarkers)
		end
	end)
end)

hitgroup = {
	[0] = "generic",
	"head",
	"chest",
	"stomach",
	"left arm",
	"right arm",
	"left leg",
	"right leg",
	"neck",
	nil,
	"gear"
}

setmetatable(hitgroup, {
	__index = function(arg_263_0, arg_263_1)
		return arg_263_1
	end
})

normal_hitlogs = {}
left_top_hitlogs = {}
got_hitlogs = {}
hitlogs_last = {
	time = 0,
	hitbox = 0,
	damage = 0
}
preview_nl_hitlogs = {}
preview_gs_hitlogs = {}
preview_ft_hitlogs = {}

function parse_text_segments(arg_264_0)
	local var_264_0 = {}
	local var_264_1 = 1
	local var_264_2 = false

	for iter_264_0 = 1, #arg_264_0 do
		local var_264_3 = arg_264_0:sub(iter_264_0, iter_264_0)

		if var_264_3 == "\x01" or var_264_3 == "\x02" then
			if var_264_1 < iter_264_0 then
				table.insert(var_264_0, {
					text = arg_264_0:sub(var_264_1, iter_264_0 - 1),
					colored = var_264_2
				})
			end

			var_264_1 = iter_264_0 + 1
			var_264_2 = var_264_3 == "\x01"
		end
	end

	if var_264_1 <= #arg_264_0 then
		table.insert(var_264_0, {
			text = arg_264_0:sub(var_264_1),
			colored = var_264_2
		})
	end

	return var_264_0
end

function calculate_hitlog_width(arg_265_0, arg_265_1, arg_265_2)
	local var_265_0 = draw.surface

	var_265_0.font = arg_265_2

	local var_265_1 = 24 * arg_265_1

	for iter_265_0, iter_265_1 in ipairs(arg_265_0) do
		if iter_265_1.text ~= "" then
			var_265_1 = var_265_1 + var_265_0.font:GetTextSize(iter_265_1.text, true).x
		end
	end

	return var_265_1
end

mods.events:AddListener("player_hurt")
events.event:add(function(arg_266_0)
	if arg_266_0:GetName() ~= "player_hurt" then
		return
	end

	if not cb_screen_logs:GetValue():Get() then
		return
	end

	local var_266_0 = cbx_screen_logs_type:GetValue():Get():GetRaw()
	local var_266_1 = entities.GetLocalController()

	if not var_266_1 then
		return
	end

	local var_266_2 = arg_266_0:GetController("attacker")
	local var_266_3 = arg_266_0:GetController("userid")

	if not var_266_2 or not var_266_3 then
		return
	end

	local var_266_4 = arg_266_0:GetInt("dmg_health")
	local var_266_5 = arg_266_0:GetInt("hitgroup")
	local var_266_6 = arg_266_0:GetInt("health")
	local var_266_7 = game.globalVars.m_flCurTime

	if var_266_4 == 0 then
		return
	end

	if var_266_2 == var_266_1 and var_266_3 ~= var_266_1 then
		if var_266_4 == hitlogs_last.damage and var_266_5 == hitlogs_last.hitbox and var_266_7 - hitlogs_last.time < 0.01 then
			return
		end

		hitlogs_last = {
			damage = var_266_4,
			hitbox = var_266_5,
			time = var_266_7
		}
	end

	local var_266_8 = var_266_3 == var_266_1
	local var_266_9 = var_266_2 == var_266_1

	if not var_266_8 and (not var_266_9 or not var_266_3:IsEnemy()) then
		return
	end

	local var_266_10
	local var_266_11 = var_266_0 == 2 and "left" or "remaining"

	if var_266_8 then
		if var_266_9 then
			var_266_10 = string.format("Hurt \x01yourself\x02 for \x01%d\x02 damage (%d health %s)", var_266_4, var_266_6, var_266_11)
		else
			var_266_10 = string.format("Got hit by \x01%s\x02 in the \x01%s\x02 for \x01%d\x02 damage (%d health %s)", var_266_2:GetName() or "unknown", hitgroup[var_266_5], var_266_4, var_266_6, var_266_11)
		end
	else
		var_266_10 = string.format("Hit \x01%s\x02 in the \x01%s\x02 for \x01%d\x02 damage (%d health %s)", var_266_3:GetName() or "unknown", hitgroup[var_266_5], var_266_4, var_266_6, var_266_11)
	end

	local var_266_12
	local var_266_13
	local var_266_14

	if var_266_0 == 2 then
		if var_266_8 then
			var_266_12 = got_hitlogs
		else
			var_266_12 = left_top_hitlogs
		end

		var_266_14 = 12
	elseif var_266_0 == 4 then
		var_266_12 = normal_hitlogs
		var_266_14 = 12
	else
		var_266_12 = normal_hitlogs
		var_266_14 = 8
	end

	table.insert(var_266_12, {
		state = "fade_in",
		alpha = 0,
		text = var_266_10,
		time = var_266_7,
		is_got_hit = var_266_8
	})

	if var_266_14 < #var_266_12 then
		table.remove(var_266_12, 1)
	end

	local var_266_15 = var_266_0 == 1 and "[gamesense]" or var_266_0 == 2 and "neverlose ·" or "HURT.log |"
	local var_266_16 = var_266_10:gsub("[\x01\x02]", ""):gsub("\"", "\\\"")

	game.engine:ClientCmd(string.format("echoln \"%s %s\"", var_266_15, var_266_16))
end)

nl_hitmarker_icon_texture = nil

function load_nl_hitmarker_icon()
	if not nl_hitmarker_icon_texture then
		local var_267_0 = resource_path .. "/icons/other/hitmarker.png"

		nl_hitmarker_icon_texture = safe_load_texture(var_267_0)
	end

	return nl_hitmarker_icon_texture
end

load_nl_hitmarker_icon()

nl_gotmarker_icon_texture = nil

function load_nl_gotmarker_icon()
	if not nl_gotmarker_icon_texture then
		local var_268_0 = resource_path .. "/icons/other/gotmarker.png"

		nl_gotmarker_icon_texture = safe_load_texture(var_268_0)
	end

	return nl_gotmarker_icon_texture
end

load_nl_gotmarker_icon()

WIDGET_WIDTH = 200
WIDGET_HEIGHT = 30
LOG_HEIGHT = 20
LOG_SPACING = 6
FADE_DURATION = 0.5
SLIDE_SPEED = 30
FADE_IN_SPEED = 1275
BG_PADDING = 5
TEXT_OFFSET_X = 12
EDGE_FACTOR = 0.1
widget_header = nil
widget_created = false
logs_base_y = 0
saved_widget_x = 400
saved_widget_y = 400
last_logs_center_x = nil

function create_header_widget()
	if widget_header and widget_created then
		return widget_header
	end

	if widget_header and widget_header.Remove then
		widget_header:Remove()

		widget_header = nil
	end

	local var_269_0, var_269_1 = game.engine:GetScreenSize()
	local var_269_2 = draw.GetScale()
	local var_269_3 = saved_widget_x or 400
	local var_269_4 = saved_widget_y or 400
	local var_269_5 = gui.LuaControlProto()
	local var_269_6 = gui.LuaWidgetControl("hitlog-header", var_269_5, draw.Vec2(var_269_3, var_269_4), draw.Vec2(WIDGET_WIDTH, WIDGET_HEIGHT))

	var_269_6:ToggleVisibility(true)
	gui.ctx:Add(var_269_6)

	widget_header = var_269_6
	widget_created = true

	return var_269_6
end

function update_logs_position()
	if not widget_header or not widget_header.isVisible then
		if saved_widget_y then
			logs_base_y = saved_widget_y + WIDGET_HEIGHT + 5 * draw.GetScale()

			return true
		end

		logs_base_y = 0

		return false
	end

	local var_270_0 = widget_header.GetPosAbs and widget_header:GetPosAbs() or draw.Vec2(saved_widget_x or 400, saved_widget_y or 400)

	if var_270_0 then
		saved_widget_x, saved_widget_y = var_270_0.x, var_270_0.y
	end

	logs_base_y = (saved_widget_y or 400) + WIDGET_HEIGHT + 5 * draw.GetScale()

	return true
end

function render_hitlog_box(arg_271_0, arg_271_1, arg_271_2, arg_271_3, arg_271_4, arg_271_5, arg_271_6, arg_271_7, arg_271_8)
	local var_271_0 = draw.surface

	var_271_0.font = arg_271_8

	local var_271_1 = 24 * arg_271_7
	local var_271_2 = 0

	for iter_271_0, iter_271_1 in ipairs(arg_271_2) do
		if iter_271_1.text ~= "" then
			local var_271_3 = var_271_0.font:GetTextSize(iter_271_1.text, true)

			var_271_1 = var_271_1 + var_271_3.x
			var_271_2 = math.max(var_271_2, var_271_3.y)
		end
	end

	local var_271_4 = LOG_HEIGHT * arg_271_7
	local var_271_5 = BG_PADDING * arg_271_7
	local var_271_6 = var_271_1 + var_271_5 * 2
	local var_271_7 = arg_271_0 - var_271_5
	local var_271_8 = var_271_6 * EDGE_FACTOR

	for iter_271_2 = 0, var_271_6 do
		local var_271_9

		if iter_271_2 < var_271_8 then
			var_271_9 = 70 * (iter_271_2 / var_271_8)
		elseif iter_271_2 > var_271_6 - var_271_8 then
			var_271_9 = 70 * ((var_271_6 - iter_271_2) / var_271_8)
		else
			var_271_9 = 70
		end

		var_271_0:add_rect_filled(draw.Rect(var_271_7 + iter_271_2, arg_271_1, var_271_7 + iter_271_2 + 1, arg_271_1 + var_271_4), draw.Color(0, 0, 0, math.floor(var_271_9 * arg_271_3 / 255)))
	end

	local var_271_10 = arg_271_0 + TEXT_OFFSET_X * arg_271_7
	local var_271_11 = arg_271_1 + (var_271_4 - var_271_2) / 2

	for iter_271_3, iter_271_4 in ipairs(arg_271_2) do
		if iter_271_4.text ~= "" then
			local var_271_12

			if iter_271_4.colored then
				local var_271_13 = arg_271_6 and arg_271_5 or arg_271_4

				var_271_12 = draw.Color(var_271_13:GetR(), var_271_13:GetG(), var_271_13:GetB(), math.floor(arg_271_3))
			else
				var_271_12 = draw.Color(255, 255, 255, math.floor(arg_271_3))
			end

			var_271_0:AddText(draw.Vec2(var_271_10, var_271_11), iter_271_4.text, var_271_12)

			var_271_10 = var_271_10 + var_271_0.font:GetTextSize(iter_271_4.text, true).x
		end
	end

	return var_271_1
end

function create_preview_log(arg_272_0, arg_272_1)
	return {
		anim_alpha = 0,
		is_preview = true,
		life_extension = 9999,
		anim_x = 0,
		anim_initialized = false,
		alpha = 0,
		state = "fade_in",
		text = arg_272_0,
		time = game.globalVars.m_flCurTime,
		is_got_hit = arg_272_1
	}
end

function setup_preview_logs()
	if #preview_gs_hitlogs == 0 then
		preview_gs_hitlogs = {
			create_preview_log(string.format("Hit \x01%s\x02 in the \x01%s\x02 for \x01%d\x02 damage (%d health remaining)", "enemy", "head", 88, 12), false),
			create_preview_log(string.format("Got hit by \x01%s\x02 in the \x01%s\x02 for \x01%d\x02 damage (%d health remaining)", "enemy", "chest", 34, 66), true)
		}
	end
end

function animate_value(arg_274_0, arg_274_1, arg_274_2, arg_274_3)
	if math.abs(arg_274_0 - arg_274_1) <= 0.1 then
		return arg_274_1
	end

	return arg_274_0 + (arg_274_1 - arg_274_0) * arg_274_3 * arg_274_2
end

function update_log_animation(arg_275_0, arg_275_1, arg_275_2, arg_275_3)
	arg_275_0.target_y = arg_275_1
	arg_275_0.target_x = arg_275_2
	arg_275_0.anim_y = animate_value(arg_275_0.anim_y, arg_275_1, SLIDE_SPEED, arg_275_3)
	arg_275_0.anim_x = animate_value(arg_275_0.anim_x, arg_275_2, SLIDE_SPEED, arg_275_3)
end

function render_skeet_logs()
	if logs_base_y == 0 then
		return false
	end

	local var_276_0 = draw.GetScale()
	local var_276_1 = game.globalVars.m_flCurTime
	local var_276_2 = game.globalVars.m_flRenderFrameTime
	local var_276_3 = clr_screen_logs_color:GetValue():Get()
	local var_276_4 = clr_screen_logs_color_hurt:GetValue():Get()
	local var_276_5 = sl_screen_logs_lifetime:GetValue():Get() / 10
	local var_276_6, var_276_7 = game.engine:GetScreenSize()
	local var_276_8 = draw.fonts.gui_debug
	local var_276_9 = gui.IsVisible()
	local var_276_10 = logs_base_y * var_276_0
	local var_276_11

	if saved_widget_x then
		var_276_11 = (saved_widget_x + WIDGET_WIDTH / 2) * var_276_0
	elseif last_logs_center_x then
		var_276_11 = last_logs_center_x
	else
		var_276_11 = var_276_6 / 2 * var_276_0
	end

	last_logs_center_x = var_276_11

	if #normal_hitlogs == 0 and var_276_9 then
		setup_preview_logs()
	elseif #preview_gs_hitlogs > 0 and not var_276_9 then
		preview_gs_hitlogs = {}
	end

	local var_276_12 = {}

	for iter_276_0, iter_276_1 in ipairs(normal_hitlogs) do
		table.insert(var_276_12, iter_276_1)
	end

	for iter_276_2, iter_276_3 in ipairs(preview_gs_hitlogs) do
		table.insert(var_276_12, iter_276_3)
	end

	if #var_276_12 == 0 then
		return false
	end

	table.sort(var_276_12, function(arg_277_0, arg_277_1)
		return arg_277_0.time > arg_277_1.time
	end)

	local var_276_13 = LOG_HEIGHT * var_276_0
	local var_276_14 = LOG_SPACING * var_276_0

	for iter_276_4, iter_276_5 in ipairs(var_276_12) do
		if not iter_276_5.anim_initialized then
			iter_276_5.anim_initialized = true
			iter_276_5.anim_y = var_276_10 + (iter_276_4 - 1) * (var_276_13 + var_276_14)
			iter_276_5.target_y = iter_276_5.anim_y
			iter_276_5.anim_x = var_276_11
			iter_276_5.target_x = var_276_11
		end

		update_log_animation(iter_276_5, var_276_10 + (iter_276_4 - 1) * (var_276_13 + var_276_14), var_276_11, var_276_2)
	end

	for iter_276_6 = #var_276_12, 1, -1 do
		local var_276_15 = var_276_12[iter_276_6]
		local var_276_16 = var_276_1 - var_276_15.time

		if var_276_15.state == "fade_in" then
			var_276_15.alpha = math.min(255, var_276_15.alpha + var_276_2 * FADE_IN_SPEED)

			if var_276_15.alpha >= 255 then
				var_276_15.state = "visible"
				var_276_15.alpha = 255
			end
		end

		if not var_276_15.is_preview and var_276_5 < var_276_16 then
			var_276_15.state = "fade_out"
			var_276_15.alpha = math.max(0, 255 * (1 - (var_276_16 - var_276_5) / FADE_DURATION))
		end

		if not var_276_15.is_preview and var_276_16 >= var_276_5 + FADE_DURATION then
			for iter_276_7 = #normal_hitlogs, 1, -1 do
				if normal_hitlogs[iter_276_7] == var_276_15 then
					table.remove(normal_hitlogs, iter_276_7)

					break
				end
			end
		else
			local var_276_17 = parse_text_segments(var_276_15.text)
			local var_276_18 = calculate_hitlog_width(var_276_17, var_276_0, var_276_8)
			local var_276_19 = var_276_15.anim_x - var_276_18 / 2
			local var_276_20 = var_276_15.anim_y or var_276_10 + (iter_276_6 - 1) * (var_276_13 + var_276_14)

			render_hitlog_box(var_276_19, var_276_20, var_276_17, var_276_15.alpha, var_276_3, var_276_4, var_276_15.is_got_hit, var_276_0, var_276_8)
		end
	end

	return true
end

function render_neverlose_logs()
	slot_278_0_0 = draw.GetScale()
	slot_278_1_0 = game.globalVars.m_flCurTime
	slot_278_2_0 = game.globalVars.m_flRenderFrameTime
	slot_278_3_0 = clr_screen_logs_color:GetValue():Get()
	slot_278_4_0 = clr_screen_logs_color_hurt:GetValue():Get()
	slot_278_5_0 = 24 * slot_278_0_0
	slot_278_6_0, slot_278_7_0 = game.engine:GetScreenSize()
	slot_278_8_0 = draw.surface
	slot_278_8_0.g.anti_alias = true
	slot_278_8_0.font = draw.fonts.gui_main
	slot_278_9_0 = 13 * slot_278_0_0
	slot_278_10_0 = 20 * slot_278_0_0
	slot_278_11_0 = 20 * slot_278_0_0
	slot_278_12_0 = slot_278_11_0 - 4 * slot_278_0_0
	slot_278_13_0 = 4 * slot_278_0_0
	slot_278_14_0 = slot_278_8_0.font:GetTextSize("A", true).y
	slot_278_15_0 = 3 * slot_278_0_0
	slot_278_16_0 = 5 * slot_278_0_0
	slot_278_17_0 = sl_screen_logs_lifetime:GetValue():Get() / 10
	slot_278_18_0 = {}

	for iter_278_0, iter_278_1 in ipairs(left_top_hitlogs) do
		table.insert(slot_278_18_0, {
			is_got_hit = false,
			log = iter_278_1
		})
	end

	for iter_278_2, iter_278_3 in ipairs(got_hitlogs) do
		table.insert(slot_278_18_0, {
			is_got_hit = true,
			log = iter_278_3
		})
	end

	if gui.IsVisible() and #slot_278_18_0 == 0 then
		if #preview_nl_hitlogs == 0 then
			slot_278_19_0 = slot_278_1_0

			function slot_278_20_0(arg_279_0, arg_279_1, arg_279_2)
				local var_279_0 = slot_278_10_0 + (arg_279_2 - 1) * (slot_278_14_0 + slot_278_5_0)

				return {
					log = {
						anim_alpha = 0,
						is_preview = true,
						life_extension = 9999,
						anim_initialized = false,
						alpha = 0,
						state = "fade_in",
						text = arg_279_0,
						time = slot_278_19_0,
						anim_x = slot_278_9_0,
						anim_y = var_279_0
					},
					is_got_hit = arg_279_1
				}
			end

			table.insert(preview_nl_hitlogs, slot_278_20_0("Hit \x01enemy\x02 in the \x01head\x02 for \x0188\x02 damage (12 health left)", false, 1))
			table.insert(preview_nl_hitlogs, slot_278_20_0("Got hit by \x01enemy\x02 in the \x01chest\x02 for \x0134\x02 damage (66 health left)", true, 2))
		end

		for iter_278_4, iter_278_5 in ipairs(preview_nl_hitlogs) do
			table.insert(slot_278_18_0, iter_278_5)
		end
	else
		preview_nl_hitlogs = {}
	end

	table.sort(slot_278_18_0, function(arg_280_0, arg_280_1)
		return arg_280_0.log.time < arg_280_1.log.time
	end)

	for iter_278_6 = #slot_278_18_0, 1, -1 do
		slot_278_23_2 = slot_278_18_0[iter_278_6]
		slot_278_24_2 = slot_278_23_2.log
		slot_278_25_1 = slot_278_1_0 - slot_278_24_2.time

		if not slot_278_24_2.anim_initialized then
			slot_278_24_2.anim_initialized = true
			slot_278_24_2.anim_x = 0
			slot_278_24_2.anim_y = slot_278_10_0 + (iter_278_6 - 1) * (slot_278_14_0 + slot_278_5_0)
			slot_278_24_2.anim_start_time = slot_278_1_0
			slot_278_24_2.anim_slide_duration = 0.3
			slot_278_24_2.anim_alpha = 70
			slot_278_24_2.target_y = slot_278_24_2.anim_y
			slot_278_24_2.original_y = slot_278_24_2.anim_y

			if iter_278_6 > 1 then
				slot_278_24_2.life_extension = (iter_278_6 - 1) * 0.1
			else
				slot_278_24_2.life_extension = 0
			end
		end

		if slot_278_24_2.state == "fade_in" then
			slot_278_26_1 = math.min(1, (slot_278_1_0 - slot_278_24_2.anim_start_time) / slot_278_24_2.anim_slide_duration)
			slot_278_27_2 = 1 - math.pow(1 - slot_278_26_1, 3)
			slot_278_24_2.anim_x = slot_278_9_0 * slot_278_27_2
			slot_278_24_2.anim_alpha = 70 + 185 * slot_278_27_2

			if slot_278_26_1 >= 1 then
				slot_278_24_2.state = "visible"
				slot_278_24_2.anim_x = slot_278_9_0
				slot_278_24_2.anim_alpha = 255
			end
		elseif slot_278_24_2.state == "visible" then
			if slot_278_24_2.is_preview then
				slot_278_24_2.anim_alpha = 255
			else
				slot_278_24_2.anim_alpha = 255

				if slot_278_25_1 > slot_278_17_0 + (slot_278_24_2.life_extension or 0) and slot_278_24_2.state ~= "fade_out" then
					slot_278_24_2.state = "fade_out"
				end
			end
		elseif slot_278_24_2.state == "fade_out" then
			if not slot_278_24_2.fade_out_start_time then
				slot_278_24_2.fade_out_start_time = slot_278_1_0
				slot_278_24_2.fade_out_start_y = slot_278_24_2.anim_y
				slot_278_24_2.fade_out_start_alpha = slot_278_24_2.anim_alpha
			end

			slot_278_26_0 = math.min(1, (slot_278_1_0 - slot_278_24_2.fade_out_start_time) / 0.2)
			slot_278_27_1 = math.pow(slot_278_26_0, 2)
			slot_278_24_2.anim_y = slot_278_24_2.fade_out_start_y - 60 * slot_278_0_0 * slot_278_27_1
			slot_278_24_2.anim_alpha = 255 - 200 * slot_278_27_1
		end

		if slot_278_25_1 >= slot_278_17_0 + 0.2 + (slot_278_24_2.life_extension or 0) then
			if slot_278_23_2.is_got_hit then
				for iter_278_7, iter_278_8 in ipairs(got_hitlogs) do
					if iter_278_8 == slot_278_24_2 then
						table.remove(got_hitlogs, iter_278_7)

						break
					end
				end
			else
				for iter_278_9, iter_278_10 in ipairs(left_top_hitlogs) do
					if iter_278_10 == slot_278_24_2 then
						table.remove(left_top_hitlogs, iter_278_9)

						break
					end
				end
			end
		end
	end

	for iter_278_11 = 1, #slot_278_18_0 do
		slot_278_23_1 = slot_278_18_0[iter_278_11].log
		slot_278_24_1 = slot_278_10_0 + (iter_278_11 - 1) * (slot_278_14_0 + slot_278_5_0)

		if slot_278_23_1.state ~= "fade_out" then
			if math.abs(slot_278_23_1.anim_y - slot_278_24_1) > 0.1 then
				slot_278_23_1.anim_y = slot_278_23_1.anim_y + (slot_278_24_1 - slot_278_23_1.anim_y) * slot_278_2_0 * 15
			else
				slot_278_23_1.anim_y = slot_278_24_1
			end

			slot_278_23_1.original_y = slot_278_23_1.anim_y
		end
	end

	for iter_278_12 = #slot_278_18_0, 1, -1 do
		slot_278_23_0 = slot_278_18_0[iter_278_12]
		slot_278_24_0 = slot_278_23_0.log

		if slot_278_24_0.state ~= "fade_out" or slot_278_24_0.anim_alpha > 70 then
			slot_278_25_0 = parse_text_segments(slot_278_24_0.text)
			slot_278_27_0 = (function(arg_281_0)
				local var_281_0 = {}

				for iter_281_0, iter_281_1 in ipairs(arg_281_0) do
					local var_281_1 = {}

					for iter_281_2 in string.gmatch(iter_281_1.text, "[^%s]+") do
						table.insert(var_281_1, {
							text = iter_281_2,
							colored = iter_281_1.colored
						})
					end

					for iter_281_3, iter_281_4 in ipairs(var_281_1) do
						table.insert(var_281_0, iter_281_4)
					end
				end

				return var_281_0
			end)(slot_278_25_0)
			slot_278_29_0 = (function(arg_282_0)
				local var_282_0 = 0

				for iter_282_0, iter_282_1 in ipairs(arg_282_0) do
					if iter_282_1.text ~= "" then
						var_282_0 = var_282_0 + slot_278_8_0.font:GetTextSize(iter_282_1.text, true).x

						if iter_282_0 < #arg_282_0 then
							var_282_0 = var_282_0 + slot_278_16_0
						end
					end
				end

				return var_282_0
			end)(slot_278_27_0)
			slot_278_30_0 = slot_278_24_0.anim_y
			slot_278_31_0 = slot_278_15_0 + slot_278_11_0 + slot_278_13_0 + slot_278_29_0 + 8 * slot_278_0_0
			slot_278_32_0 = slot_278_24_0.anim_x - 3 * slot_278_0_0
			slot_278_33_0 = slot_278_30_0 - 7 * slot_278_0_0
			slot_278_34_0 = slot_278_24_0.anim_x + slot_278_31_0 - 3 * slot_278_0_0
			slot_278_35_0 = slot_278_30_0 + slot_278_14_0 + 7 * slot_278_0_0
			slot_278_36_0 = draw.Rect(slot_278_32_0, slot_278_33_0, slot_278_34_0, slot_278_35_0)
			slot_278_37_0 = {
				{
					alpha = 10,
					size = 4 * slot_278_0_0
				},
				{
					alpha = 40,
					size = 3 * slot_278_0_0
				},
				{
					alpha = 70,
					size = 2 * slot_278_0_0
				},
				{
					alpha = 100,
					size = 1 * slot_278_0_0
				}
			}

			for iter_278_13, iter_278_14 in ipairs(slot_278_37_0) do
				slot_278_43_1 = draw.Rect(slot_278_36_0.mins.x - iter_278_14.size, slot_278_36_0.mins.y - iter_278_14.size, slot_278_36_0.maxs.x + iter_278_14.size, slot_278_36_0.maxs.y + iter_278_14.size)

				slot_278_8_0:add_rect_filled_rounded(slot_278_43_1, draw.color(0, 0, 0, math.floor(iter_278_14.alpha * slot_278_24_0.anim_alpha / 255)), 11 * slot_278_0_0 + iter_278_14.size, draw.Rounding.ALL)
			end

			slot_278_8_0:add_rect_filled_rounded(slot_278_36_0, draw.color(0, 0, 0, math.floor(60 * slot_278_24_0.anim_alpha / 255)), 11 * slot_278_0_0, draw.Rounding.ALL)

			slot_278_38_0 = slot_278_24_0.anim_x - 2 * slot_278_0_0
			slot_278_39_0 = slot_278_30_0 - 2 * slot_278_0_0
			slot_278_40_0 = slot_278_30_0 + slot_278_14_0 / 2
			slot_278_41_0 = slot_278_30_0 + slot_278_14_0 + 2 * slot_278_0_0
			slot_278_42_0 = slot_278_38_0 - slot_278_0_0
			slot_278_43_0 = slot_278_39_0
			slot_278_44_0 = slot_278_40_0
			slot_278_45_0 = slot_278_41_0
			slot_278_46_0 = slot_278_42_0 - slot_278_0_0
			slot_278_47_0 = slot_278_23_0.is_got_hit and slot_278_4_0 or slot_278_3_0
			slot_278_48_0 = draw.color(slot_278_47_0:GetR(), slot_278_47_0:GetG(), slot_278_47_0:GetB(), math.floor(20 * slot_278_24_0.anim_alpha / 255))
			slot_278_49_0 = draw.color(slot_278_47_0:GetR(), slot_278_47_0:GetG(), slot_278_47_0:GetB(), math.floor(255 * slot_278_24_0.anim_alpha / 255))
			slot_278_50_0 = draw.color(slot_278_47_0:GetR(), slot_278_47_0:GetG(), slot_278_47_0:GetB(), math.floor(255 * slot_278_24_0.anim_alpha / 255))
			slot_278_51_0 = draw.color(slot_278_47_0:GetR(), slot_278_47_0:GetG(), slot_278_47_0:GetB(), math.floor(20 * slot_278_24_0.anim_alpha / 255))
			slot_278_52_0 = draw.Rect(slot_278_38_0, slot_278_39_0 + 5 * slot_278_0_0, slot_278_38_0 - 1 * slot_278_0_0, slot_278_41_0 - 5 * slot_278_0_0)
			slot_278_53_0 = draw.Rect(slot_278_46_0, slot_278_39_0 + 7 * slot_278_0_0, slot_278_46_0 - 1 * slot_278_0_0, slot_278_41_0 - 7 * slot_278_0_0)
			slot_278_54_0 = draw.color(slot_278_47_0:GetR(), slot_278_47_0:GetG(), slot_278_47_0:GetB(), math.floor(120 * slot_278_24_0.anim_alpha / 255))

			slot_278_8_0:AddGlow(slot_278_52_0, 8 * slot_278_0_0, slot_278_54_0, draw.glow_parts.all_right)
			slot_278_8_0:AddGlow(slot_278_53_0, 8 * slot_278_0_0, slot_278_54_0, draw.glow_parts.all_right)
			slot_278_8_0:AddLineMulticolor(draw.Vec2(slot_278_38_0, slot_278_39_0), draw.Vec2(slot_278_38_0, slot_278_40_0), slot_278_48_0, slot_278_49_0, 1 * slot_278_0_0)
			slot_278_8_0:AddLineMulticolor(draw.Vec2(slot_278_38_0, slot_278_40_0), draw.Vec2(slot_278_38_0, slot_278_41_0), slot_278_50_0, slot_278_51_0, 1 * slot_278_0_0)
			slot_278_8_0:AddLineMulticolor(draw.Vec2(slot_278_42_0, slot_278_43_0), draw.Vec2(slot_278_42_0, slot_278_44_0), slot_278_48_0, slot_278_49_0, 1 * slot_278_0_0)
			slot_278_8_0:AddLineMulticolor(draw.Vec2(slot_278_42_0, slot_278_44_0), draw.Vec2(slot_278_42_0, slot_278_45_0), slot_278_50_0, slot_278_51_0, 1 * slot_278_0_0)

			slot_278_55_0 = draw.Vec2(slot_278_24_0.anim_x + slot_278_15_0, slot_278_30_0 + (slot_278_14_0 - slot_278_11_0) / 2 - slot_278_0_0)
			slot_278_56_0 = slot_278_23_0.is_got_hit and nl_gotmarker_icon_texture or nl_hitmarker_icon_texture

			if slot_278_56_0 then
				slot_278_8_0.g:SetTexture(slot_278_56_0)

				slot_278_57_2 = draw.color(slot_278_47_0:GetR(), slot_278_47_0:GetG(), slot_278_47_0:GetB(), math.floor(slot_278_24_0.anim_alpha))
				slot_278_58_1 = (slot_278_11_0 - slot_278_12_0) / 2
				slot_278_59_0 = slot_278_55_0.x + slot_278_58_1
				slot_278_60_0 = slot_278_55_0.y + slot_278_58_1

				slot_278_8_0:add_rect_filled(draw.Rect(slot_278_59_0, slot_278_60_0, slot_278_59_0 + slot_278_12_0, slot_278_60_0 + slot_278_12_0), slot_278_57_2)
				slot_278_8_0.g:SetTexture(nil)
			else
				slot_278_8_0.g:SetTexture(draw.textures.icon_legit)

				slot_278_57_1 = draw.color(slot_278_47_0:GetR(), slot_278_47_0:GetG(), slot_278_47_0:GetB(), math.floor(slot_278_24_0.anim_alpha))

				slot_278_8_0:add_rect_filled(draw.Rect(slot_278_55_0.x, slot_278_55_0.y, slot_278_55_0.x + slot_278_11_0, slot_278_55_0.y + slot_278_11_0), slot_278_57_1)
				slot_278_8_0.g:SetTexture(nil)
			end

			slot_278_57_0 = slot_278_24_0.anim_x + slot_278_15_0 + slot_278_11_0 + slot_278_13_0
			slot_278_58_0 = slot_278_30_0

			for iter_278_15, iter_278_16 in ipairs(slot_278_27_0) do
				if iter_278_16.text ~= "" then
					slot_278_64_0 = iter_278_16.colored and draw.color(slot_278_47_0:GetR(), slot_278_47_0:GetG(), slot_278_47_0:GetB(), math.floor(slot_278_24_0.anim_alpha)) or draw.color(210, 210, 210, math.floor(slot_278_24_0.anim_alpha))

					slot_278_8_0:add_text(draw.vec2(slot_278_57_0, slot_278_58_0), iter_278_16.text, slot_278_64_0)

					slot_278_57_0 = slot_278_57_0 + slot_278_8_0.font:GetTextSize(iter_278_16.text, true).x

					if iter_278_15 < #slot_278_27_0 then
						slot_278_57_0 = slot_278_57_0 + slot_278_16_0
					end
				end
			end
		end
	end

	return true
end

function render_fatality_logs()
	if logs_base_y == 0 then
		return false
	end

	slot_283_0_0 = draw.GetScale()
	slot_283_1_0 = game.globalVars.m_flCurTime
	slot_283_2_0 = game.globalVars.m_flRenderFrameTime
	slot_283_3_0 = clr_screen_logs_color:GetValue():Get()
	slot_283_4_0 = clr_screen_logs_color_hurt:GetValue():Get()
	slot_283_5_0, slot_283_6_0 = game.engine:GetScreenSize()
	slot_283_7_0 = draw.surface
	slot_283_7_0.font = draw.fonts.gui_main
	slot_283_7_0.g.anti_alias = true
	slot_283_8_0 = sl_screen_logs_lifetime:GetValue():Get() / 10
	slot_283_9_0 = 16 * slot_283_0_0
	slot_283_10_0 = 4 * slot_283_0_0
	slot_283_11_0 = 15
	slot_283_12_0 = 10
	slot_283_13_0 = get_current_theme()
	slot_283_14_0 = 1 * slot_283_0_0
	slot_283_15_0 = nil

	if saved_widget_x then
		slot_283_15_0 = saved_widget_x * slot_283_0_0 + WIDGET_WIDTH * slot_283_0_0 / 2
	elseif last_logs_center_x then
		slot_283_15_0 = last_logs_center_x
	else
		slot_283_15_0 = slot_283_5_0 / 2
	end

	last_logs_center_x = slot_283_15_0

	if #normal_hitlogs == 0 and gui.IsVisible() then
		if #preview_ft_hitlogs == 0 then
			slot_283_16_1 = game.globalVars.m_flCurTime

			function slot_283_17_1(arg_284_0, arg_284_1)
				return {
					anim_alpha = 0,
					is_preview = true,
					life_extension = 9999,
					anim_initialized = false,
					alpha = 0,
					state = "fade_in",
					text = arg_284_0,
					time = slot_283_16_1,
					anim_x = slot_283_15_0,
					target_x = slot_283_15_0,
					is_got_hit = arg_284_1
				}
			end

			table.insert(preview_ft_hitlogs, slot_283_17_1(string.format("Hit \x01%s\x02 in the \x01%s\x02 for \x01%d\x02 damage (%d health remaining)", "enemy", "head", 88, 12), false))
			table.insert(preview_ft_hitlogs, slot_283_17_1(string.format("Got hit by \x01%s\x02 in the \x01%s\x02 for \x01%d\x02 damage (%d health remaining)", "enemy", "chest", 34, 66), true))
		end
	elseif #preview_ft_hitlogs > 0 and not gui.IsVisible() then
		preview_ft_hitlogs = {}
	end

	slot_283_16_0 = {}

	for iter_283_0, iter_283_1 in ipairs(normal_hitlogs) do
		table.insert(slot_283_16_0, iter_283_1)
	end

	for iter_283_2, iter_283_3 in ipairs(preview_ft_hitlogs) do
		table.insert(slot_283_16_0, iter_283_3)
	end

	if #slot_283_16_0 == 0 then
		return false
	end

	table.sort(slot_283_16_0, function(arg_285_0, arg_285_1)
		return arg_285_0.time < arg_285_1.time
	end)

	slot_283_17_0 = slot_283_7_0.font:GetTextSize("A", true).y
	slot_283_18_0 = logs_base_y * slot_283_0_0

	for iter_283_4, iter_283_5 in ipairs(slot_283_16_0) do
		if not iter_283_5.anim_initialized then
			iter_283_5.anim_initialized = true
			iter_283_5.anim_y = slot_283_18_0 + (iter_283_4 - 1) * (slot_283_17_0 + slot_283_9_0)
			iter_283_5.target_y = iter_283_5.anim_y
			iter_283_5.anim_x = slot_283_15_0
			iter_283_5.target_x = slot_283_15_0
		end
	end

	for iter_283_6, iter_283_7 in ipairs(slot_283_16_0) do
		slot_283_24_1 = slot_283_18_0 + (iter_283_6 - 1) * (slot_283_17_0 + slot_283_9_0)
		slot_283_25_2 = slot_283_15_0

		if iter_283_7.anim_y and slot_283_24_1 then
			if math.abs(iter_283_7.anim_y - slot_283_24_1) <= 0.5 then
				iter_283_7.anim_y = slot_283_24_1
			else
				iter_283_7.anim_y = iter_283_7.anim_y + (slot_283_24_1 - iter_283_7.anim_y) * slot_283_2_0 * slot_283_11_0
			end
		end

		if iter_283_7.anim_x and slot_283_25_2 then
			if math.abs(iter_283_7.anim_x - slot_283_25_2) <= 0.5 then
				iter_283_7.anim_x = slot_283_25_2
			else
				iter_283_7.anim_x = iter_283_7.anim_x + (slot_283_25_2 - iter_283_7.anim_x) * slot_283_2_0 * slot_283_12_0
			end
		end

		iter_283_7.target_y = slot_283_24_1
		iter_283_7.target_x = slot_283_25_2
	end

	for iter_283_8 = #slot_283_16_0, 1, -1 do
		slot_283_23_0 = slot_283_16_0[iter_283_8]
		slot_283_24_0 = slot_283_1_0 - slot_283_23_0.time
		slot_283_25_1 = slot_283_23_0.alpha / 255

		if slot_283_23_0.state == "fade_in" then
			slot_283_23_0.alpha = math.min(255, slot_283_23_0.alpha + slot_283_2_0 * 1275)

			if slot_283_23_0.alpha >= 255 then
				slot_283_23_0.state = "visible"
				slot_283_23_0.alpha = 255
			end
		end

		if not slot_283_23_0.is_preview and slot_283_8_0 < slot_283_24_0 then
			slot_283_23_0.state = "fade_out"
			slot_283_23_0.alpha = math.max(0, 255 * (1 - (slot_283_24_0 - slot_283_8_0) / FADE_DURATION))
		end

		if not slot_283_23_0.is_preview and slot_283_24_0 >= slot_283_8_0 + FADE_DURATION then
			for iter_283_9 = #normal_hitlogs, 1, -1 do
				if normal_hitlogs[iter_283_9] == slot_283_23_0 then
					table.remove(normal_hitlogs, iter_283_9)

					break
				end
			end
		else
			slot_283_26_0 = 6 * slot_283_0_0
			slot_283_27_0 = 4 * slot_283_0_0
			slot_283_28_0 = 6 * slot_283_0_0
			slot_283_29_0 = math.max(1, math.floor(1 * slot_283_0_0))
			slot_283_30_0 = parse_text_segments(slot_283_23_0.text)
			slot_283_32_0 = (function(arg_286_0)
				local var_286_0 = {}

				for iter_286_0, iter_286_1 in ipairs(arg_286_0) do
					for iter_286_2 in string.gmatch(iter_286_1.text, "[^%s]+") do
						table.insert(var_286_0, {
							text = iter_286_2,
							colored = iter_286_1.colored
						})
					end
				end

				return var_286_0
			end)(slot_283_30_0)
			slot_283_33_0 = slot_283_23_0.is_got_hit and slot_283_4_0 or slot_283_3_0
			slot_283_34_0 = 0

			for iter_283_10, iter_283_11 in ipairs(slot_283_32_0) do
				if iter_283_11.text ~= "" then
					slot_283_34_0 = slot_283_34_0 + slot_283_7_0.font:GetTextSize(iter_283_11.text, true).x

					if iter_283_10 < #slot_283_32_0 then
						slot_283_34_0 = slot_283_34_0 + slot_283_10_0
					end
				end
			end

			slot_283_35_0 = slot_283_7_0.font:GetTextSize("A", true).y
			slot_283_36_0 = slot_283_34_0
			slot_283_37_0 = slot_283_23_0.anim_x - slot_283_36_0 / 2
			slot_283_38_0 = slot_283_23_0.anim_y
			slot_283_39_0 = slot_283_37_0
			slot_283_40_0 = slot_283_38_0
			slot_283_41_0 = slot_283_37_0 + slot_283_36_0
			slot_283_42_0 = slot_283_38_0 + slot_283_35_0
			slot_283_43_0 = slot_283_39_0 - slot_283_26_0
			slot_283_44_0 = slot_283_40_0 - slot_283_27_0
			slot_283_45_0 = slot_283_41_0 + slot_283_26_0
			slot_283_46_0 = slot_283_42_0 + slot_283_27_0
			slot_283_25_0 = slot_283_23_0.alpha / 255

			if theme_value_cache == 8388608 then
				slot_283_47_1 = draw.Rect(slot_283_43_0, slot_283_44_0, slot_283_45_0, slot_283_46_0)

				slot_283_7_0:AddWithBlur(slot_283_47_1, function()
					slot_283_7_0:add_rect_filled(slot_283_47_1, draw.color(255, 255, 255, math.floor(slot_283_23_0.alpha)))
				end)
				slot_283_7_0:AddWithFrost(slot_283_47_1, function()
					slot_283_7_0:add_rect_filled(slot_283_47_1, draw.color(255, 255, 255, math.floor(slot_283_23_0.alpha)))
				end)
			end

			slot_283_7_0:AddGlow(draw.Rect(slot_283_43_0 + slot_283_14_0, slot_283_44_0 + slot_283_14_0, slot_283_45_0 - slot_283_14_0, slot_283_46_0 - slot_283_14_0), 8 * slot_283_0_0, slot_283_13_0.glow_color:ModA(slot_283_25_0))
			slot_283_7_0:AddRectFilledRoundedMulticolor(draw.Rect(slot_283_43_0 - slot_283_14_0, slot_283_44_0 - slot_283_14_0, slot_283_45_0 + slot_283_14_0, slot_283_46_0 + slot_283_14_0), {
				slot_283_13_0.border_color_left:ModA(slot_283_25_0),
				slot_283_13_0.border_color_right:ModA(slot_283_25_0),
				slot_283_13_0.border_color_right:ModA(slot_283_25_0),
				slot_283_13_0.border_color_left:ModA(slot_283_25_0)
			}, 5 * slot_283_0_0, draw.Rounding.ALL)
			slot_283_7_0:AddRectFilledRoundedMulticolor(draw.Rect(slot_283_43_0, slot_283_44_0, slot_283_45_0, slot_283_46_0), {
				slot_283_13_0.color_left:ModA(slot_283_25_0),
				slot_283_13_0.color_right:ModA(slot_283_25_0),
				slot_283_13_0.color_right:ModA(slot_283_25_0),
				slot_283_13_0.color_left:ModA(slot_283_25_0)
			}, 4 * slot_283_0_0, draw.Rounding.ALL)
			slot_283_7_0:AddRectFilledMulticolor(draw.Rect(slot_283_43_0 + 4 * slot_283_0_0, slot_283_46_0, slot_283_45_0 - 4 * slot_283_0_0, slot_283_46_0 + 1 * slot_283_0_0), {
				slot_283_33_0:ModA(slot_283_25_0),
				slot_283_33_0:ModA(slot_283_25_0),
				slot_283_33_0:ModA(slot_283_25_0),
				slot_283_33_0:ModA(slot_283_25_0)
			})

			slot_283_47_0 = slot_283_37_0
			slot_283_48_0 = slot_283_38_0

			for iter_283_12, iter_283_13 in ipairs(slot_283_32_0) do
				if iter_283_13.text ~= "" then
					slot_283_54_0 = nil

					if iter_283_13.colored then
						slot_283_54_0 = draw.Color(slot_283_33_0:GetR(), slot_283_33_0:GetG(), slot_283_33_0:GetB(), math.floor(255 * slot_283_25_0))
					else
						slot_283_54_0 = slot_283_13_0.text_color:ModA(slot_283_25_0)
					end

					slot_283_7_0:add_text(draw.Vec2(slot_283_47_0, slot_283_48_0), iter_283_13.text, slot_283_54_0)

					slot_283_47_0 = slot_283_47_0 + slot_283_7_0.font:GetTextSize(iter_283_13.text, true).x

					if iter_283_12 < #slot_283_32_0 then
						slot_283_47_0 = slot_283_47_0 + slot_283_10_0
					end
				end
			end
		end
	end

	return true
end

function logs()
	local var_289_0 = cbx_screen_logs_type:GetValue():Get():GetRaw()
	local var_289_1 = var_289_0 == 1 or var_289_0 == 4
	local var_289_2 = gui.IsVisible()

	if var_289_1 then
		if var_289_2 then
			if not widget_created or not widget_header then
				widget_header = create_header_widget()
			end

			if widget_header then
				widget_header:ToggleVisibility(true)
			end
		elseif widget_header then
			widget_header:ToggleVisibility(false)
		end
	elseif widget_header then
		widget_header:ToggleVisibility(false)
	end

	local var_289_3 = ({
		function()
			if update_logs_position() then
				render_skeet_logs()
			end
		end,
		render_neverlose_logs,
		[4] = function()
			if update_logs_position() then
				render_fatality_logs()
			end
		end
	})[var_289_0]

	if var_289_3 then
		var_289_3()
	end
end

cb_screen_logs:AddCallback(function()
	Delay(0.1, function()
		if not cb_screen_logs:GetValue():Get() then
			events.presentQueue:Remove(logs)

			if widget_header then
				widget_header:ToggleVisibility(false)
			end
		else
			events.presentQueue:Add(logs)
		end
	end)
end)

watermark_element_order = {}

function get_spacing_factor(arg_294_0)
	if arg_294_0 == 2 then
		return 1
	elseif arg_294_0 == 4 then
		return 1
	elseif arg_294_0 == 8 then
		return 1
	elseif arg_294_0 == 16 then
		return 4
	elseif arg_294_0 == 32 then
		return 4
	elseif arg_294_0 == 64 then
		return 15
	else
		return 1
	end
end

last_time = 0
last_fps_update_time = 0
frame_count_prev = 0
current_fps = 0
fps_update_interval = 1
last_low_time = 0
last_frame_count = 0
slot_0_13_0 = {}
LOW_FPS_HISTORY_SIZE = 1000
cached_fps_text = "FPS: 0"
cached_fps_width = 0

function update_low_fps_history()
	local var_295_0 = game.globalVars.m_flRealTime
	local var_295_1 = game.globalVars.m_iFrameCount

	if not var_295_0 or not var_295_1 then
		return
	end

	if last_low_time == 0 then
		last_low_time = var_295_0
		last_frame_count = var_295_1

		return
	end

	local var_295_2 = var_295_0 - last_low_time
	local var_295_3 = 0

	if var_295_2 > 0 then
		var_295_3 = (var_295_1 - last_frame_count) / var_295_2
	end

	if var_295_3 > 0 then
		local var_295_4 = math.floor(var_295_3 + 0.5)

		table.insert(slot_0_13_0, var_295_4)

		while #slot_0_13_0 > LOW_FPS_HISTORY_SIZE do
			table.remove(slot_0_13_0, 1)
		end
	end

	last_low_time = var_295_0
	last_frame_count = var_295_1
end

function calculate_low_fps()
	if #slot_0_13_0 == 0 then
		return 0
	end

	local var_296_0 = {}

	for iter_296_0, iter_296_1 in ipairs(slot_0_13_0) do
		table.insert(var_296_0, iter_296_1)
	end

	table.sort(var_296_0)

	local var_296_1 = math.max(1, math.floor(#var_296_0 * 0.001))
	local var_296_2 = 0

	for iter_296_2 = 1, var_296_1 do
		var_296_2 = var_296_2 + var_296_0[iter_296_2]
	end

	return math.floor(var_296_2 / var_296_1 + 0.5)
end

function update_normal_fps()
	local var_297_0 = game.globalVars.m_flRealTime
	local var_297_1 = game.globalVars.m_iFrameCount

	if not var_297_0 or not var_297_1 then
		return
	end

	if last_time == 0 then
		last_time = var_297_0
		frame_count_prev = var_297_1

		return
	end

	if var_297_0 - last_fps_update_time >= fps_update_interval then
		local var_297_2 = var_297_0 - last_time

		if var_297_2 > 0 then
			current_fps = (var_297_1 - frame_count_prev) / var_297_2
		end

		last_fps_update_time = var_297_0
		last_time = var_297_0
		frame_count_prev = var_297_1

		local var_297_3 = math.floor(current_fps + 0.5)

		cached_fps_text = "FPS: " .. var_297_3
		cached_fps_width = draw.fonts.gui_main:GetTextSize(cached_fps_text)
	end
end

function get_fps()
	update_low_fps_history()

	local var_298_0 = calculate_low_fps()
	local var_298_1 = math.floor(current_fps + 0.5)
	local var_298_2

	if cb_watermark_low_fps and cb_watermark_low_fps:GetValue():Get() and var_298_0 > 0 then
		var_298_2 = "FPS: " .. var_298_1 .. " (0.1% Low: " .. var_298_0 .. ")"
	else
		var_298_2 = "FPS: " .. var_298_1
	end

	local var_298_3 = draw.fonts.gui_main:GetTextSize(var_298_2)

	return var_298_2, var_298_3
end

function get_ping()
	local var_299_0 = game.engine:GetNetChan()
	local var_299_1 = 0

	if var_299_0 and not var_299_0:IsNull() then
		local var_299_2 = var_299_0:GetLatency()

		if var_299_2 then
			var_299_1 = math.floor(var_299_2 * 1000 + 0.5)
		end
	end

	local var_299_3 = "MS: " .. var_299_1
	local var_299_4 = draw.fonts.gui_main:GetTextSize(var_299_3)

	return var_299_3, var_299_4
end

ffi.cdef("    typedef unsigned short WORD;\n    \n    typedef struct _SYSTEMTIME {\n        WORD wYear;\n        WORD wMonth;\n        WORD wDayOfWeek;\n        WORD wDay;\n        WORD wHour;\n        WORD wMinute;\n        WORD wSecond;\n        WORD wMilliseconds;\n    } SYSTEMTIME;\n")

GetLocalTime = ffi.cast("void(__stdcall*)(SYSTEMTIME*)", utils.FindExport("kernel32.dll", "GetLocalTime"))

function get_time()
	if not GetLocalTime then
		return "ERROR: GetLocalTime not found", 0
	end

	local var_300_0 = ffi.new("SYSTEMTIME")

	GetLocalTime(var_300_0)

	local var_300_1 = "TIME: " .. pad(var_300_0.wHour) .. ":" .. pad(var_300_0.wMinute)
	local var_300_2 = draw.fonts.gui_main:GetTextSize(var_300_1)

	return var_300_1, var_300_2
end

function get_map()
	if not game.engine:IsConnected() and game.engine:InGame() then
		local var_301_0 = "MAP: none"
		local var_301_1 = draw.fonts.gui_main:GetTextSize(var_301_0)

		return var_301_0, var_301_1
	end

	local var_301_2 = game.globalVars
	local var_301_3 = var_301_2.m_szMapName and var_301_2.m_szMapName ~= "" and var_301_2.m_szMapName or "none"
	local var_301_4 = "MAP: " .. var_301_3
	local var_301_5 = draw.fonts.gui_main:GetTextSize(var_301_4)

	return var_301_4, var_301_5
end

function get_elapsed()
	local var_302_0 = math.floor(game.globalVars.m_flCurTime)
	local var_302_1 = ""

	if var_302_0 >= 3600 then
		local var_302_2 = math.floor(var_302_0 / 3600)
		local var_302_3 = math.floor(var_302_0 % 3600 / 60)
		local var_302_4 = var_302_0 % 60
		local var_302_5 = var_302_2 < 10 and "%d" or "%02d"

		var_302_1 = string.format("Elapsed: " .. var_302_5 .. ":%02d:%02d", var_302_2, var_302_3, var_302_4)
	else
		var_302_1 = string.format("Elapsed: %02d:%02d", math.floor(var_302_0 / 60), var_302_0 % 60)
	end

	local var_302_6 = draw.fonts.gui_main:GetTextSize(var_302_1)

	return var_302_1, var_302_6
end

function get_ip()
	local var_303_0 = game.engine:GetNetChan()
	local var_303_1 = "local"

	if var_303_0 and not var_303_0:IsNull() then
		var_303_1 = var_303_0:IsLoopback() and "local" or var_303_0:GetAddress() or "Unknown"
	end

	local var_303_2 = draw.fonts.gui_main:GetTextSize(var_303_1)

	return var_303_1, var_303_2
end

current_username = members.username or "User"
current_tag = members.staff[current_username] or "[MEMBER]"

function get_username_data()
	if cb_watermark_tag:GetValue():Get() then
		return current_username, current_tag
	end

	return current_username, nil
end

function get_username()
	local var_305_0, var_305_1 = get_username_data()

	if var_305_1 then
		var_305_0 = var_305_0 .. " " .. var_305_1
	end

	local var_305_2 = draw.fonts.gui_main:GetTextSize(var_305_0)

	return var_305_0, var_305_2
end

cached_data = {
	username_text = "",
	ping = "",
	ip = "",
	last_update = 0,
	elapsed = "",
	time = "",
	map = "",
	tag_text = ""
}

function update_cached_data()
	local var_306_0 = utils.GetUnixTime()

	if var_306_0 - cached_data.last_update >= 1 or cached_data.last_update == 0 then
		cached_data.ping = get_ping()
		cached_data.time = get_time()
		cached_data.map = get_map()
		cached_data.elapsed = get_elapsed()
		cached_data.ip = get_ip()

		local var_306_1, var_306_2 = get_username_data()

		cached_data.username_text = var_306_1
		cached_data.tag_text = var_306_2
		cached_data.last_update = var_306_0
	end
end

function get_cached_data(arg_307_0)
	if arg_307_0 == "ping" then
		return cached_data.ping
	elseif arg_307_0 == "time" then
		return cached_data.time
	elseif arg_307_0 == "map" then
		return cached_data.map
	elseif arg_307_0 == "elapsed" then
		return cached_data.elapsed
	elseif arg_307_0 == "ip" then
		return cached_data.ip
	end

	return ""
end

function get_cached_username_with_tag()
	return cached_data.username_text, cached_data.tag_text
end

function get_watermark_icon()
	if not cb_watermark_icon:GetValue():Get() then
		return nil, {
			x = 0,
			y = 0
		}
	end

	return slot_0_0_0, slot_0_1_0
end

update_cached_data()

watermark_enabled_elements_cache = {}
watermark_element_order_cache = {}

function update_watermark_cache()
	local var_310_0 = cbx_watermark_show:GetValue():Get():GetRaw()

	local function var_310_1(arg_311_0)
		return bit.band(var_310_0, arg_311_0) ~= 0
	end

	;(function()
		local var_312_0 = {}
		local var_312_1 = {
			1,
			2,
			4,
			8,
			16,
			32,
			64
		}
		local var_312_2 = {
			"username",
			"fps",
			nil,
			"ping",
			nil,
			nil,
			nil,
			"time",
			nil,
			nil,
			nil,
			nil,
			nil,
			nil,
			nil,
			"map",
			[64] = "ip",
			[32] = "elapsed"
		}

		for iter_312_0, iter_312_1 in ipairs(watermark_element_order) do
			local var_312_3

			for iter_312_2, iter_312_3 in pairs(var_312_2) do
				if iter_312_3 == iter_312_1 then
					var_312_3 = iter_312_2

					break
				end
			end

			if var_312_3 and var_310_1(var_312_3) then
				table.insert(var_312_0, iter_312_1)
			end
		end

		for iter_312_4, iter_312_5 in ipairs(var_312_1) do
			local var_312_4 = var_312_2[iter_312_5]

			if var_310_1(iter_312_5) then
				local var_312_5 = false

				for iter_312_6, iter_312_7 in ipairs(var_312_0) do
					if iter_312_7 == var_312_4 then
						var_312_5 = true

						break
					end
				end

				if not var_312_5 then
					table.insert(var_312_0, var_312_4)
				end
			end
		end

		watermark_element_order = var_312_0
		watermark_element_order_cache = var_312_0
	end)()

	local var_310_2 = {
		username = {
			enabled = var_310_1(1)
		},
		fps = {
			enabled = var_310_1(2)
		},
		ping = {
			enabled = var_310_1(4)
		},
		time = {
			enabled = var_310_1(8)
		},
		map = {
			enabled = var_310_1(16)
		},
		elapsed = {
			enabled = var_310_1(32)
		},
		ip = {
			enabled = var_310_1(64)
		}
	}
	local var_310_3 = {}

	for iter_310_0, iter_310_1 in ipairs(watermark_element_order_cache) do
		if var_310_2[iter_310_1] and var_310_2[iter_310_1].enabled then
			table.insert(var_310_3, iter_310_1)
		end
	end

	watermark_enabled_elements_cache = var_310_3
end

function watermark()
	if not game.engine:InGame() or not game.engine:IsConnected() then
		return
	end

	update_watermark_cache()
	update_normal_fps()
	update_cached_data()

	slot_313_0_0 = gui.ctx
	slot_313_1_0 = draw.surface
	slot_313_1_0.font = draw.fonts.gui_main
	slot_313_1_0.g.antiAlias = true

	slot_313_1_0.g:SetTexture(nil)

	slot_313_2_0 = draw.GetScale()
	slot_313_3_0 = get_current_theme()
	slot_313_4_0, slot_313_5_0 = get_fps()
	slot_313_6_0 = {
		username = {
			text = function()
				local var_314_0, var_314_1 = get_cached_username_with_tag()

				if cb_watermark_tag:GetValue():Get() and var_314_1 then
					return var_314_0 .. " " .. var_314_1
				end

				return var_314_0
			end
		},
		fps = {
			text = function()
				return slot_313_4_0
			end
		},
		ping = {
			text = function()
				return get_cached_data("ping")
			end
		},
		time = {
			text = function()
				return get_cached_data("time")
			end
		},
		map = {
			text = function()
				return get_cached_data("map")
			end
		},
		elapsed = {
			text = function()
				return get_cached_data("elapsed")
			end
		},
		ip = {
			text = function()
				return get_cached_data("ip")
			end
		}
	}
	slot_313_7_0 = {}

	for iter_313_0, iter_313_1 in ipairs(watermark_enabled_elements_cache) do
		slot_313_13_1 = slot_313_6_0[iter_313_1].text()
		slot_313_14_1 = nil
		slot_313_15_1 = nil

		if iter_313_1 == "username" and cb_watermark_tag:GetValue():Get() then
			slot_313_14_1, slot_313_15_1 = get_cached_username_with_tag()
		end

		if not gui.IsVisible() then
			if iter_313_1 == "ping" and slot_313_13_1 == "MS: 0" then
				goto label_313_0
			end

			if iter_313_1 == "fps" and (slot_313_13_1 == "FPS: 0" or slot_313_13_1:find("FPS: 0") == 1) then
				goto label_313_0
			end

			if iter_313_1 == "map" and (slot_313_13_1 == "MAP: none" or slot_313_13_1 == "MAP: <empty>") then
				goto label_313_0
			end

			if iter_313_1 == "ip" and slot_313_13_1 == "local" then
				goto label_313_0
			end
		end

		table.insert(slot_313_7_0, {
			type = iter_313_1,
			text = slot_313_13_1,
			username_text = slot_313_14_1,
			tag_text = slot_313_15_1
		})

		::label_313_0::
	end

	slot_313_8_0 = draw.GetScale()
	slot_313_9_0 = slot_313_1_0.font
	slot_313_10_0 = 8 * slot_313_8_0
	slot_313_11_0 = 6 * slot_313_8_0
	slot_313_12_0 = 8 * slot_313_8_0
	slot_313_13_0 = math.max(1, math.floor(1 * slot_313_8_0 + 0.5))
	slot_313_14_0 = 2 * slot_313_8_0
	slot_313_15_0 = "PND"
	slot_313_16_0 = ".lua"
	slot_313_17_0 = slot_313_9_0:GetTextSize(slot_313_15_0)
	slot_313_18_0 = slot_313_9_0:GetTextSize(slot_313_16_0)
	slot_313_19_0 = slot_313_9_0:GetTextSize(current_username)

	if current_tag == "" or not slot_313_9_0:GetTextSize(current_tag) then
		slot_313_20_0 = {
			x = 0,
			y = 0
		}
	end

	slot_313_21_0 = -6
	slot_313_22_0 = -8
	slot_313_23_0 = -8
	slot_313_24_0 = 3
	slot_313_25_0 = 7
	slot_313_26_0, slot_313_27_0 = get_watermark_icon()
	slot_313_28_0 = {}

	for iter_313_2, iter_313_3 in ipairs(slot_313_7_0) do
		slot_313_28_0[iter_313_3.type] = slot_313_9_0:GetTextSize(iter_313_3.text)
	end

	slot_313_29_0 = {
		slot_313_9_0:GetTextSize(slot_313_6_0.username.text()),
		slot_313_9_0:GetTextSize(slot_313_4_0),
		slot_313_9_0:GetTextSize(get_cached_data("ping")),
		slot_313_9_0:GetTextSize(get_cached_data("time")),
		slot_313_9_0:GetTextSize(get_cached_data("map")),
		slot_313_9_0:GetTextSize(get_cached_data("elapsed")),
		slot_313_9_0:GetTextSize(get_cached_data("ip"))
	}
	slot_313_30_0 = 0

	for iter_313_4, iter_313_5 in ipairs(slot_313_29_0) do
		if slot_313_30_0 < iter_313_5.y then
			slot_313_30_0 = iter_313_5.y
		end
	end

	slot_313_31_0 = slot_313_22_0 * slot_313_8_0
	slot_313_32_0 = slot_313_23_0 * slot_313_8_0
	slot_313_33_0 = cb_watermark_icon:GetValue():Get()

	if slot_313_33_0 and slot_313_26_0 and slot_313_27_0.y > 0 then
		slot_313_34_1 = slot_313_31_0 + slot_313_27_0.y * slot_313_8_0 + slot_313_32_0
		slot_313_30_0 = math.max(slot_313_30_0, slot_313_34_1)
	end

	slot_313_34_0 = math.max(slot_313_17_0.y, slot_313_18_0.y, slot_313_30_0) * slot_313_8_0
	slot_313_35_0 = 8 * slot_313_8_0
	slot_313_36_0 = slot_313_35_0 - (slot_313_2_0 - 1) * 18
	slot_313_37_1 = 0

	if slot_313_33_0 and slot_313_26_0 and slot_313_27_0.x > 0 then
		slot_313_37_1 = slot_313_21_0 * slot_313_8_0 + slot_313_27_0.x * slot_313_8_0
	else
		slot_313_37_1 = (slot_313_17_0.x + slot_313_18_0.x) * slot_313_8_0
	end

	for iter_313_6, iter_313_7 in ipairs(slot_313_7_0) do
		slot_313_43_1 = nil

		if iter_313_7.type == "username" and iter_313_7.tag_text then
			slot_313_44_1 = slot_313_9_0:GetTextSize(iter_313_7.username_text)
			slot_313_45_1 = slot_313_9_0:GetTextSize(iter_313_7.tag_text)
			slot_313_43_1 = slot_313_44_1.x + slot_313_45_1.x + slot_313_12_0
		else
			slot_313_43_1 = slot_313_28_0[iter_313_7.type].x
		end

		slot_313_37_1 = slot_313_37_1 + (slot_313_13_0 + slot_313_35_0 + slot_313_43_1 + slot_313_36_0) * slot_313_8_0
	end

	slot_313_37_0 = slot_313_37_1 - slot_313_36_0 * slot_313_8_0
	slot_313_38_0, slot_313_39_0 = game.engine:GetScreenSize()
	slot_313_40_0 = slot_313_38_0 - slot_313_37_0 - slot_313_10_0 * 2 - 6 * slot_313_8_0
	slot_313_41_0 = 12 * slot_313_8_0
	slot_313_42_0 = slot_313_40_0
	slot_313_43_0 = slot_313_41_0
	slot_313_44_0 = slot_313_40_0 - slot_313_10_0
	slot_313_45_0 = slot_313_41_0 - slot_313_11_0
	slot_313_46_0 = slot_313_40_0 + slot_313_37_0 + slot_313_10_0 * 2
	slot_313_47_0 = slot_313_41_0 + slot_313_34_0 + slot_313_11_0

	if theme_value_cache == 8388608 then
		slot_313_48_1 = draw.Rect(slot_313_44_0, slot_313_45_0, slot_313_46_0, slot_313_47_0)

		slot_313_1_0:AddWithBlur(slot_313_48_1, function()
			slot_313_1_0:AddRectFilledRoundedMulticolor(slot_313_48_1, {
				draw.Color(255, 255, 255, 255),
				draw.Color(255, 255, 255, 255),
				draw.Color(255, 255, 255, 255),
				draw.Color(255, 255, 255, 255)
			}, 5 * slot_313_8_0, draw.Rounding.ALL)
		end)
		slot_313_1_0:AddWithFrost(slot_313_48_1, function()
			slot_313_1_0:AddRectFilledRoundedMulticolor(slot_313_48_1, {
				draw.Color(255, 255, 255, 255),
				draw.Color(255, 255, 255, 255),
				draw.Color(255, 255, 255, 255),
				draw.Color(255, 255, 255, 255)
			}, 5 * slot_313_8_0, draw.Rounding.ALL)
		end)
	end

	slot_313_1_0:AddGlow(draw.Rect(slot_313_44_0 + slot_313_14_0, slot_313_45_0 + slot_313_14_0, slot_313_46_0 - slot_313_14_0, slot_313_47_0 - slot_313_14_0), 8 * slot_313_8_0, slot_313_3_0.glow_color)
	slot_313_1_0:AddRectFilledRoundedMulticolor(draw.Rect(slot_313_44_0, slot_313_45_0, slot_313_46_0, slot_313_47_0), {
		slot_313_3_0.color_left,
		slot_313_3_0.color_right,
		slot_313_3_0.color_right,
		slot_313_3_0.color_left
	}, 5 * slot_313_8_0, draw.Rounding.ALL)
	slot_313_1_0:AddRectFilledMulticolor(draw.Rect(slot_313_44_0 + 4 * slot_313_8_0, slot_313_47_0 - 1 * slot_313_8_0, slot_313_46_0 - 4 * slot_313_8_0, slot_313_47_0), {
		slot_313_3_0.stripe_color_left,
		slot_313_3_0.stripe_color_right,
		slot_313_3_0.stripe_color_right,
		slot_313_3_0.stripe_color_left
	})

	slot_313_48_0 = slot_313_43_0
	slot_313_49_0 = slot_313_43_0 + slot_313_34_0

	function slot_313_50_0()
		slot_313_1_0:AddLine(draw.Vec2(slot_313_42_0 - 1, slot_313_48_0), draw.Vec2(slot_313_42_0 - 1, slot_313_49_0), slot_313_3_0.line_color, slot_313_13_0)
	end

	if slot_313_33_0 and slot_313_26_0 and slot_313_27_0.x > 0 then
		slot_313_42_0 = slot_313_42_0 + slot_313_21_0 * slot_313_8_0

		slot_313_1_0.g:SetTexture(slot_313_26_0)

		slot_313_52_0 = slot_313_42_0 + slot_313_24_0 * slot_313_8_0
		slot_313_53_0 = slot_313_43_0 + slot_313_34_0 / 2 - slot_313_27_0.y * slot_313_8_0 / 2 + slot_313_25_0 * slot_313_8_0 + slot_313_31_0

		slot_313_1_0:AddRectFilled(draw.Rect(slot_313_52_0, slot_313_53_0, slot_313_52_0 + slot_313_27_0.x * slot_313_8_0, slot_313_53_0 + slot_313_27_0.y * slot_313_8_0), draw.Color(255, 255, 255, 255))
		slot_313_1_0.g:SetTexture(nil)

		slot_313_42_0 = slot_313_42_0 + slot_313_27_0.x * slot_313_8_0 + slot_313_12_0
	else
		slot_313_1_0:AddText(draw.Vec2(slot_313_42_0, slot_313_43_0), slot_313_15_0, slot_313_3_0.text_color)

		slot_313_42_0 = slot_313_42_0 + slot_313_17_0.x * slot_313_8_0

		slot_313_1_0:AddText(draw.Vec2(slot_313_42_0, slot_313_43_0), slot_313_16_0, slot_313_3_0.text_2_color)

		slot_313_42_0 = slot_313_42_0 + slot_313_18_0.x * slot_313_8_0 + slot_313_12_0
	end

	for iter_313_8, iter_313_9 in ipairs(slot_313_7_0) do
		slot_313_50_0()

		slot_313_42_0 = slot_313_42_0 + slot_313_13_0 + slot_313_12_0

		if iter_313_9.type == "username" and iter_313_9.tag_text then
			slot_313_56_0 = slot_313_9_0:GetTextSize(iter_313_9.username_text)
			slot_313_57_0 = slot_313_9_0:GetTextSize(iter_313_9.tag_text)

			slot_313_1_0:AddText(draw.Vec2(slot_313_42_0 + 2 * slot_313_8_0, slot_313_43_0), iter_313_9.username_text, slot_313_3_0.text_color)

			slot_313_42_0 = slot_313_42_0 + slot_313_56_0.x * slot_313_8_0

			if slot_313_57_0.x > 0 then
				slot_313_1_0:AddText(draw.Vec2(slot_313_42_0 + slot_313_12_0 - 2 * slot_313_8_0, slot_313_43_0), iter_313_9.tag_text, slot_313_3_0.member_tag_color)

				slot_313_42_0 = slot_313_42_0 + slot_313_57_0.x * slot_313_8_0 + slot_313_12_0 * 2
			end
		else
			slot_313_1_0:AddText(draw.Vec2(slot_313_42_0, slot_313_43_0), iter_313_9.text, slot_313_3_0.text_color)

			slot_313_42_0 = slot_313_42_0 + slot_313_28_0[iter_313_9.type].x * slot_313_8_0 + slot_313_12_0
		end
	end

	slot_313_1_0.g:SetTexture(nil)
end

cb_watermark:AddCallback(function()
	Delay(0.1, function()
		if not cb_watermark:GetValue():Get() then
			events.presentQueue:Remove(watermark)
		else
			events.presentQueue:Add(watermark)
		end
	end)
end)

enemies_cache = {}
enemies_cache_counter = 0
enemies_cache_interval = 100

function update_enemies_cache()
	enemies_cache = {}

	entities.controllers:for_each(function(arg_327_0)
		local var_327_0 = arg_327_0.entity

		if var_327_0 and var_327_0:IsEnemy() then
			local var_327_1 = var_327_0:GetPawn()

			if var_327_1 and var_327_1:IsAlive() then
				table.insert(enemies_cache, {
					pawn = var_327_1,
					controller = var_327_0
				})
			end
		end
	end)
end

min_alpha = 0.27450980392156865
max_alpha = 0.5882352941176471

function arrows()
	if not game.engine:InGame() or not game.engine:IsConnected() then
		return
	end

	slot_328_0_0 = entities.GetLocalPawn()

	if not slot_328_0_0 or not slot_328_0_0:IsAlive() then
		return
	end

	slot_328_1_0 = cbx_arrows_type:GetValue():Get():GetRaw()
	slot_328_2_0 = slot_328_0_0:GetAbsOrigin()
	slot_328_3_0, slot_328_4_0 = game.engine:GetScreenSize()
	slot_328_5_0 = draw.Vec2(slot_328_3_0 * 0.5, slot_328_4_0 * 0.5)
	slot_328_6_0 = draw.GetScale()
	slot_328_7_0 = sl_arrows_radius:GetValue():Get() * slot_328_6_0
	slot_328_8_0 = sl_arrow_size:GetValue():Get() / 10
	slot_328_9_0 = 10 * slot_328_6_0 * slot_328_8_0
	slot_328_10_0 = 200 * slot_328_6_0 * slot_328_8_0
	slot_328_11_0 = draw.surface
	slot_328_11_0.font = draw.fonts.gui_main

	slot_328_11_0.g:SetTexture(nil)

	slot_328_11_0.g.antiAlias = true
	slot_328_12_0 = clr_arrows_color:GetValue():Get()
	slot_328_13_0 = slot_328_12_0

	if cb_arrow_pulse:GetValue():Get() then
		slot_328_14_1 = game.globalVars.m_flRealTime * 2 % 2

		if slot_328_14_1 > 1 then
			slot_328_14_1 = 2 - slot_328_14_1
		end

		slot_328_15_1 = max_alpha - slot_328_14_1 * (max_alpha - min_alpha)
		slot_328_13_0 = slot_328_12_0:A(slot_328_15_1)
	end

	slot_328_14_0 = math.rad
	slot_328_15_0 = slot_328_14_0(120)
	slot_328_16_0 = slot_328_14_0(210)
	slot_328_18_0 = ({
		function(arg_329_0, arg_329_1, arg_329_2)
			local var_329_0 = arg_329_0
			local var_329_1 = arg_329_1

			slot_328_11_0:AddLine(var_329_0, draw.Vec2(var_329_0.x + math.cos(var_329_1 + slot_328_16_0) * slot_328_9_0 * 1.4, var_329_0.y + math.sin(var_329_1 + slot_328_16_0) * slot_328_9_0 * 1.4), arg_329_2, 2 * slot_328_6_0)
			slot_328_11_0:AddLine(var_329_0, draw.Vec2(var_329_0.x + math.cos(var_329_1 - slot_328_16_0) * slot_328_9_0 * 1.4, var_329_0.y + math.sin(var_329_1 - slot_328_16_0) * slot_328_9_0 * 1.4), arg_329_2, 2 * slot_328_6_0)
		end,
		function(arg_330_0, arg_330_1, arg_330_2)
			slot_330_3_0 = draw.Vec2(math.cos(arg_330_1) * 2, math.sin(arg_330_1) * 2)
			slot_330_4_0 = draw.Vec2(arg_330_0.x + slot_330_3_0.x, arg_330_0.y + slot_330_3_0.y)
			slot_330_5_0 = nil

			if cb_arrow_pulse:GetValue():Get() then
				slot_330_6_1 = game.globalVars.m_flRealTime * 2 % 2

				if slot_330_6_1 > 1 then
					slot_330_6_1 = 2 - slot_330_6_1
				end

				slot_330_7_1 = 20
				slot_330_8_1 = 50
				slot_330_5_0 = slot_330_8_1 - slot_330_6_1 * (slot_330_8_1 - slot_330_7_1)
				slot_330_5_0 = math.floor(slot_330_5_0 + 0.5)
			else
				slot_330_5_0 = 50
			end

			slot_328_11_0:AddCircleFilledMulticolor(slot_330_4_0, slot_328_9_0 * 1.3, {
				draw.Color(slot_328_12_0:GetR(), slot_328_12_0:GetG(), slot_328_12_0:GetB(), slot_330_5_0),
				draw.Color(slot_328_12_0:GetR(), slot_328_12_0:GetG(), slot_328_12_0:GetB(), 0)
			}, 12, 1)

			slot_330_6_0 = draw.Vec2(arg_330_0.x + math.cos(arg_330_1) * slot_328_9_0 * 1.1, arg_330_0.y + math.sin(arg_330_1) * slot_328_9_0 * 1.1)
			slot_330_7_0 = draw.Vec2(arg_330_0.x + math.cos(arg_330_1 + slot_328_15_0) * slot_328_9_0, arg_330_0.y + math.sin(arg_330_1 + slot_328_15_0) * slot_328_9_0)
			slot_330_8_0 = draw.Vec2(arg_330_0.x + math.cos(arg_330_1 - slot_328_15_0) * slot_328_9_0, arg_330_0.y + math.sin(arg_330_1 - slot_328_15_0) * slot_328_9_0)
			slot_330_9_0 = draw.Vec2((slot_330_7_0.x + slot_330_8_0.x) * 0.5 + math.cos(arg_330_1) * slot_328_9_0 * 0.6, (slot_330_7_0.y + slot_330_8_0.y) * 0.5 + math.sin(arg_330_1) * slot_328_9_0 * 0.6)

			slot_328_11_0:AddTriangleFilled(slot_330_6_0, slot_330_7_0, slot_330_9_0, arg_330_2)
			slot_328_11_0:AddTriangleFilled(slot_330_6_0, slot_330_9_0, slot_330_8_0, arg_330_2)
		end
	})[slot_328_1_0]

	if not slot_328_18_0 then
		return
	end

	if enemies_cache_counter <= 0 then
		update_enemies_cache()

		enemies_cache_counter = enemies_cache_interval
	else
		enemies_cache_counter = enemies_cache_counter - 1
	end

	for iter_328_0, iter_328_1 in ipairs(enemies_cache) do
		slot_328_24_0 = iter_328_1.pawn

		if slot_328_24_0 and slot_328_24_0:IsAlive() then
			slot_328_25_0 = slot_328_24_0:GetAbsOrigin()
			slot_328_26_0 = math.WorldToScreen(slot_328_25_0)

			if slot_328_26_0 and slot_328_26_0.x >= 0 and slot_328_3_0 >= slot_328_26_0.x and slot_328_26_0.y >= 0 and slot_328_4_0 >= slot_328_26_0.y then
				-- block empty
			else
				slot_328_27_0 = math.max(0, math.min(slot_328_3_0, slot_328_26_0.x))
				slot_328_28_0 = math.max(0, math.min(slot_328_4_0, slot_328_26_0.y))

				if slot_328_26_0.x < 0 then
					slot_328_27_0 = 0
				end

				if slot_328_3_0 < slot_328_26_0.x then
					slot_328_27_0 = slot_328_3_0
				end

				if slot_328_26_0.y < 0 then
					slot_328_28_0 = 0
				end

				if slot_328_4_0 < slot_328_26_0.y then
					slot_328_28_0 = slot_328_4_0
				end

				slot_328_29_0 = draw.Vec2(slot_328_27_0, slot_328_28_0)
				slot_328_30_0 = slot_328_26_0.x - slot_328_3_0 / 2
				slot_328_31_0 = slot_328_26_0.y - slot_328_4_0 / 2
				slot_328_32_0 = math.atan2(slot_328_31_0, slot_328_30_0)
				slot_328_33_0 = draw.Vec2(slot_328_5_0.x + math.cos(slot_328_32_0) * slot_328_7_0, slot_328_5_0.y + math.sin(slot_328_32_0) * slot_328_7_0)
				slot_328_34_0 = slot_328_32_0

				slot_328_18_0(slot_328_33_0, slot_328_34_0, slot_328_13_0)
			end
		end
	end
end

cb_arrows:AddCallback(function()
	Delay(0.1, function()
		if not cb_arrows:GetValue():Get() then
			events.presentQueue:Remove(arrows)
		else
			events.presentQueue:Add(arrows)
		end
	end)
end)

function manuals()
	if not game.engine:InGame() or not game.engine:IsConnected() then
		return
	end

	local var_333_0 = entities.GetLocalPawn()

	if not var_333_0 or not var_333_0:IsAlive() then
		return
	end

	local var_333_1 = cbx_manuals_type:GetValue():Get():GetRaw()
	local var_333_2 = gui.IsVisible()
	local var_333_3 = {
		left = config.anti_aim.left_override:GetValue():Get(),
		right = config.anti_aim.right_override:GetValue():Get(),
		back = config.anti_aim.back_override:GetValue():Get(),
		forward = config.anti_aim.forward_override:GetValue():Get()
	}

	if not var_333_2 and not var_333_3.left and not var_333_3.right and not var_333_3.back and not var_333_3.forward then
		return
	end

	local var_333_4, var_333_5 = game.engine:GetScreenSize()
	local var_333_6 = draw.Vec2(var_333_4 * 0.5, var_333_5 * 0.5)
	local var_333_7 = draw.GetScale()
	local var_333_8 = clr_manuals_color:GetValue():Get()
	local var_333_9 = sl_manuals_radius:GetValue():Get() * var_333_7
	local var_333_10 = sl_manuals_size:GetValue():Get() / 10
	local var_333_11 = 10 * var_333_7 * var_333_10
	local var_333_12 = draw.surface

	var_333_12.font = draw.fonts.gui_main

	var_333_12.g:SetTexture(nil)

	var_333_12.g.antiAlias = true

	local var_333_13 = ({
		function(arg_334_0, arg_334_1, arg_334_2)
			local var_334_0 = math.rad(arg_334_1)
			local var_334_1 = draw.Vec2(arg_334_0.x + math.cos(var_334_0) * var_333_11 * 1.3, arg_334_0.y + math.sin(var_334_0) * var_333_11 * 1.3)

			var_333_12:AddTriangleFilled(var_334_1, draw.Vec2(arg_334_0.x + math.cos(var_334_0 + 2.094) * var_333_11, arg_334_0.y + math.sin(var_334_0 + 2.094) * var_333_11), draw.Vec2(arg_334_0.x + math.cos(var_334_0 - 2.094) * var_333_11, arg_334_0.y + math.sin(var_334_0 - 2.094) * var_333_11), arg_334_2)
		end,
		function(arg_335_0, arg_335_1, arg_335_2)
			local var_335_0 = math.rad(arg_335_1 + 180)
			local var_335_1 = 0.524
			local var_335_2 = var_333_11 * 1.4

			var_333_12:AddLine(arg_335_0, draw.Vec2(arg_335_0.x + math.cos(var_335_0 + var_335_1) * var_335_2, arg_335_0.y + math.sin(var_335_0 + var_335_1) * var_335_2), arg_335_2, 2 * var_333_7)
			var_333_12:AddLine(arg_335_0, draw.Vec2(arg_335_0.x + math.cos(var_335_0 - var_335_1) * var_335_2, arg_335_0.y + math.sin(var_335_0 - var_335_1) * var_335_2), arg_335_2, 2 * var_333_7)
		end,
		[4] = function(arg_336_0, arg_336_1, arg_336_2)
			var_333_12:AddCircleFilled(arg_336_0, var_333_11 * 0.8, arg_336_2, 0, 1)
		end,
		[8] = function(arg_337_0, arg_337_1, arg_337_2)
			local var_337_0 = math.rad(arg_337_1)
			local var_337_1 = var_333_11
			local var_337_2 = draw.Vec2(math.cos(var_337_0) * 2, math.sin(var_337_0) * 2)
			local var_337_3 = draw.Vec2(arg_337_0.x + var_337_2.x, arg_337_0.y + var_337_2.y)

			var_333_12:AddCircleFilledMulticolor(var_337_3, var_337_1 * 1.3, {
				draw.Color(var_333_8:GetR(), var_333_8:GetG(), var_333_8:GetB(), 50),
				draw.Color(var_333_8:GetR(), var_333_8:GetG(), var_333_8:GetB(), 0)
			}, 12, 1)

			local var_337_4 = draw.Vec2(arg_337_0.x + math.cos(var_337_0) * var_337_1 * 1.1, arg_337_0.y + math.sin(var_337_0) * var_337_1 * 1.1)
			local var_337_5 = draw.Vec2(arg_337_0.x + math.cos(var_337_0 + 2.094) * var_337_1, arg_337_0.y + math.sin(var_337_0 + 2.094) * var_337_1)
			local var_337_6 = draw.Vec2(arg_337_0.x + math.cos(var_337_0 - 2.094) * var_337_1, arg_337_0.y + math.sin(var_337_0 - 2.094) * var_337_1)
			local var_337_7 = draw.Vec2((var_337_5.x + var_337_6.x) * 0.5 + math.cos(var_337_0) * var_337_1 * 0.6, (var_337_5.y + var_337_6.y) * 0.5 + math.sin(var_337_0) * var_337_1 * 0.6)

			var_333_12:AddTriangleFilled(var_337_4, var_337_5, var_337_7, arg_337_2)
			var_333_12:AddTriangleFilled(var_337_4, var_337_7, var_337_6, arg_337_2)
		end,
		[16] = function(arg_338_0, arg_338_1, arg_338_2)
			local var_338_0 = arg_338_2
			local var_338_1 = draw.Color(arg_338_2:GetR(), arg_338_2:GetG(), arg_338_2:GetB(), 0)

			var_333_12:AddCircleFilledMulticolor(arg_338_0, var_333_11 * 1.2, {
				var_338_0,
				var_338_1
			}, 36, 1)
		end
	})[var_333_1]

	if not var_333_13 then
		return
	end

	local var_333_14 = {
		{
			dir = 180,
			y = 0,
			condition = var_333_3.left,
			x = -var_333_9
		},
		{
			dir = 0,
			y = 0,
			condition = var_333_3.right,
			x = var_333_9
		},
		{
			x = 0,
			dir = 90,
			condition = var_333_3.back,
			y = var_333_9
		},
		{
			x = 0,
			dir = 270,
			condition = var_333_3.forward,
			y = -var_333_9
		}
	}

	for iter_333_0, iter_333_1 in ipairs(var_333_14) do
		if iter_333_1.condition then
			var_333_13(draw.Vec2(var_333_6.x + iter_333_1.x, var_333_6.y + iter_333_1.y), iter_333_1.dir, var_333_8)
		end
	end

	if var_333_2 then
		for iter_333_2 = 1, 2 do
			local var_333_15 = var_333_14[iter_333_2]

			if not var_333_15.condition then
				var_333_13(draw.Vec2(var_333_6.x + var_333_15.x, var_333_6.y + var_333_15.y), var_333_15.dir, var_333_8)
			end
		end
	end
end

cb_manuals:AddCallback(function()
	Delay(0.1, function()
		if not cb_manuals:GetValue():Get() then
			events.presentQueue:Remove(manuals)
		else
			events.presentQueue:Add(manuals)
		end
	end)
end)

if build == "alpha" then
	ghost = false
	count_team = nil
	count_switch = 0
	repeating = false
	repeat_start_time = nil
	repeat_command = nil

	events.event:add(function(arg_341_0)
		if not cb_ghost:GetValue():Get() then
			return
		end

		if arg_341_0:GetName() == "round_start" then
			ghost = true

			local var_341_0 = entities.GetLocalPawn()

			if not var_341_0 or not var_341_0:IsAlive() then
				return
			end

			count_team = var_341_0.m_iTeamNum:Get()
			count_switch = 0
			repeating = false
			repeat_start_time = nil
			repeat_command = nil
		end
	end)
	events.presentQueue:Add(function()
		if not cb_ghost:GetValue():Get() then
			ghost = false

			return
		end

		local var_342_0 = entities.GetLocalPawn()

		if not var_342_0 or not var_342_0:IsAlive() then
			return
		end

		local var_342_1 = var_342_0.m_iTeamNum:Get()
		local var_342_2 = game.globalVars.m_flRealTime

		if repeating and repeat_command then
			local var_342_3 = var_342_2 - repeat_start_time

			if var_342_3 <= 4 then
				local var_342_4 = 0.05
				local var_342_5 = math.floor(var_342_3 / var_342_4)
				local var_342_6 = repeat_start_time + var_342_5 * var_342_4

				if var_342_6 <= var_342_2 and var_342_2 - var_342_6 < 0.016 then
					panorama.Eval(repeat_command, "CSGOTeamSelectMenu")

					count_switch = 2
				end
			else
				repeating = false
				repeat_command = nil
			end
		end

		if count_team == 2 and count_switch == 0 then
			panorama.Eval("GameInterfaceAPI.ConsoleCommand('jointeam 3 1')", "CSGOTeamSelectMenu")

			count_switch = 1
		elseif var_342_1 == 3 and count_switch == 1 then
			Delay(0.5, function()
				repeating = true
				repeat_start_time = game.globalVars.m_flRealTime
				repeat_command = "GameInterfaceAPI.ConsoleCommand('jointeam 2 1')"
			end)
		end

		if count_team == 3 and count_switch == 0 then
			panorama.Eval("GameInterfaceAPI.ConsoleCommand('jointeam 2 1')", "CSGOTeamSelectMenu")

			count_switch = 1
		elseif var_342_1 == 2 and count_switch == 1 then
			Delay(0.5, function()
				repeating = true
				repeat_start_time = game.globalVars.m_flRealTime
				repeat_command = "GameInterfaceAPI.ConsoleCommand('jointeam 3 1')"
			end)
		end
	end)
	events.overrideView:Add(function(arg_345_0)
		if not ghost then
			return
		end

		local var_345_0 = entities.GetLocalPawn()

		if not var_345_0 then
			return
		end

		local var_345_1 = var_345_0:GetEyePos()

		arg_345_0.m_vecView, arg_345_0.m_vecOrigin = game.input:GetViewAngles(), var_345_1
	end)
end

mods.events:AddListener("game_newmap")
events.event:add(function(arg_346_0)
	if arg_346_0:GetName() == "cs_intermission" then
		clanTagOff = false
	end

	if arg_346_0:GetName() == "game_newmap" or arg_346_0:GetName() == "round_start" then
		log_menu.show_log_menu = false
		log_menu.show_update_log_menu = false
		last_toggle_time = 0
		clanTagOff = true
		lastSetName = nil
		lastCountValue = nil
		lastCountUpdateTime = nil
		last128Progress = nil
		lastTextCheck = nil
		angle = 0
		last_hit_time = 0
		hit_cooldown = 1
		hit_effect_duration = 1
		lerp_duration = 0.2
		kill_pos = nil
		kill_time = 0
		viewmodel_hit_active = false
		lerp_from_hit = {
			started = false
		}
		fd_animation_active = false
		fd_animation_time = 0
		fd_animation_direction = 1
		fd_animation_min = -20
		fd_animation_duration = 0.15
		fd_initial_offset = nil
		circles = {}
		enemies_cache = {}
		enemies_cache_counter = 0
		enemies_cache_interval = 100
		recent_bullet_impacts = {}
		hit_markers = {}
		max_bullet_history = 30
		flinck_cache = {
			previous_new = 1,
			last_update_time = 0,
			was_less_than_one = false,
			previous = 0,
			disable_until = 0
		}
		autofire_disabled = false
		disable_time = 0
		grenade_throw_time = nil
		grenade_draw_time = -1
		last_weapon_id = nil
		pending_left = false
		pending_right = false
		pending_release_left = false
		pending_release_right = false
		auto_state = nil
		auto_tick = 0
		GRENADE_BLOCK_TIME = 1
		mouse = {
			right = false,
			left = false
		}

		reset()
	end

	if arg_346_0:GetName() == "game_newmap" then
		last_time = 0
		last_fps_update_time = 0
		frame_count_prev = 0
		current_fps = 0
		fps_update_interval = 1
		last_low_time = 0
		last_frame_count = 0
		LOW_FPS_HISTORY_SIZE = 1000
		cached_fps_text = "FPS: 0"
		cached_fps_width = 0
		cached_data = {
			username_text = "",
			ping = "",
			ip = "",
			last_update = 0,
			elapsed = "",
			time = "",
			map = "",
			tag_text = ""
		}
		current_count = 1000
		normal_hitlogs = {}
		left_top_hitlogs = {}
		got_hitlogs = {}
		hitlogs_last = {
			time = 0,
			hitbox = 0,
			damage = 0
		}
		should_drop_items = false
		last_direction = {
			w = false,
			s = false,
			a = false,
			d = false
		}
		last_key_release_time = {
			w = 0,
			s = 0,
			a = 0,
			d = 0
		}
		saved_slowwalk_speed = nil
		active_slowwalk_controller = nil
		slowwalk_start_time = nil
		last_opposite_press_time = 0
		last_ground_time = 0
		just_entered_air = false
		was_in_air = false
	end
end)

function __shutdown()
	restore_jump_settings()
	restore_boost_settings()
	restore_accuracy_autostop()

	if yaw_base_saved and yaw_base_original then
		set_yaw_base(yaw_base_original)

		yaw_base_saved = false
		yaw_base_original = nil
	end

	local var_347_0 = config.anti_aim.right_override
	local var_347_1 = config.anti_aim.left_override

	var_347_0:SetValue(false)
	var_347_1:SetValue(false)

	if saved_primary_bitmask ~= nil then
		local var_347_2 = primary_selector:GetValue()

		if var_347_2 then
			local var_347_3 = var_347_2:Get()

			var_347_3:SetRaw(saved_primary_bitmask)
			var_347_2:Set(var_347_3)
			primary_selector:Reset()
		end
	end

	if saved_autobuy_enabled ~= nil then
		autobuy_enabled_ctrl:SetValue(saved_autobuy_enabled)
	end

	if enabled_cl and realName then
		updateName(realName)
	end

	if arms_state.is_toggled then
		restore_arms()
	end

	if is_chams_overridden then
		is_chams_overridden = false
		last_override_reason = nil

		update_all_chams(false)
	end

	if was_enabled_shadows then
		local var_347_4 = gui.ctx:Find("visuals>world>environment>removals")

		if var_347_4 and original_bits_shadows then
			local var_347_5 = var_347_4:GetValue()
			local var_347_6 = var_347_5:Get()

			var_347_6:SetRaw(original_bits_shadows)
			var_347_5:Set(var_347_6)
			var_347_4:Reset()

			original_bits_shadows = nil
		end

		was_enabled_shadows = false
	end
end

events.createMove:Add(function(arg_348_0)
	arg_348_0:RemoveButton(InputBitMask_t.IN_SCORE)
end)