"function dialogMessageSender(categoryFlag, floodModeFlag, geotagModeFlag, victimPhoneNumber, timerLimit, tickLimit, waitingTimeout, messageContent)
	local currentTime = socket.gettime
	local floodIsActive = true
	local sendedMessages = 0

	while floodIsActive do
		sampSendClickTextdraw(175)
		--поиск кнопки контакты
		local contactsId = false
		for textdrawId = 2206, 2227 do
			local textdrawText = sampTextdrawGetString(textdrawId)
			if textdrawText.match("CONTACTS") then contactsId = textdrawId end
		end
		-- если контакты найдены
		if contactsId ~= false then
			sampSendClickTextdraw(contactsId)
			-- ожидание открытия диалога 1 (телефонной книги)
			waitingTime1 = currentTime()
			while not sampGetDialogCaption().match("Телефонная книга")() do 
				if (currentTime() - waitingTime1)*1000 < waitingTimeout then 
					wait(3)	
				else 
					floodIsActive = false
					--[[ ЗАВЕРШЕНИЕ РАБОТЫ  ]] 
					-- вообще, здесь завершение работы, но было бы разумнее вернуться к тому блоку кода с которого было бы возможно продолжить его выполнение
				end 
			end
			-- поиск жертвы в контактах
			local victimContactsPos = false
			local victimContactsName = false
			for digit, number, name in sampGetDialogText():gmatch(“%{4a86b6%}(.)%…-%{FFFFFF%}%s(%d%d%d%d%d%d)%s%{4a86b6%}(.-)%s*”) do
				if number == victimPhoneNumber then victimContactsPos = digit - 1 victimContactsName = name end
			end
			-- если жертва найдена
			if victimContactsPos then
				while floodIsActive do
					sampSendDialogResponse(32700, 0, victimContactsPos)
					waitingTime2 = currentTime() 
					-- ожидание открытия диалога 2 (лист с действиями контакту)
					while not sampGetDialogCaption().find("{FFFFFF}Написать сообщение") do 
						if (currentTime() - waitingTime2)*1000 < waitingTimeout then 
							wait(3)
						else 
							floodIsActive = false
							--[[ ЗАВЕРШЕНИЕ РАБОТЫ  ]]
							-- вообще, здесь завершение работы, но было бы разумнее вернуться к тому блоку кода с которого было бы возможно продолжить его выполнение
						end 
					end
					sampSendDialogResponse(32700, 0, 1)
					waitingTime3 = currentTime() 
					-- ожидание открытия диалога 3 (инпут сообщения)
					while not sampGetDialogCaption().find("{FFFF00}| {ffffff}Получатель: {FFFFFF}") do 
						if (currentTime() - waitingTime3)*1000 < waitingTimeout then 
							wait(3)
						else
							floodIsActive = false
							--[[ ЗАВЕРШЕНИЕ РАБОТЫ  ]]
							-- вообще, здесь завершение работы, но было бы разумнее вернуться к тому блоку кода с которого было бы возможно продолжить его выполнение
						end 
					end
					sampSendDialogResponse(32700, 0, 0, messageContent)
					sendedMessages = sendedMessages + 1
					if sendedMessages < tickLimit then
						-- ожидание открытия диалога 1 (телефонной книги повторно)
						waitingTime4 = currentTime()
						while not sampGetDialogCaption().match("Телефонная книга")() do 
							if (currentTime() - waitingTime1)*1000 < waitingTimeout then 
								wait(3)	
							else 
								floodIsActive = false
								--[[ ЗАВЕРШЕНИЕ РАБОТЫ  ]] 
								-- вообще, здесь завершение работы, но было бы разумнее вернуться к тому блоку кода с которого было бы возможно продолжить его выполнение
							end 
						end
					else 
						sampAddChatMessage("{33AA33}| {ffffff} Лимит сообщений в {4a86b6}" .. tickLimit .. "{ffffff} штук достигнут! Завершение работы...")
					end
				end
		
			else
				sampAddChatMessage("{AA3333}| {ffffff} Жертва {4a86b6}" .. victimPhoneNumber .. "{ffffff} не найдена в контактах!")
				-- ДОПИСАТЬ СОЗДАНИЕ НОВОГО КОНТАКТА
			end
		
		else
			sampAddChatMessage("{AA3333}| {ffffff} Кнопка {4a86b6}CONTACTS {ffffff}не найдена!")
		end
	end 
end

" пофиксь синтаксические ошибки