Лучшие программы для управления двумя мониторами

Общая информация

Управление камерой

По умолчанию в Lineage II используется вид от третьего лица. Разумеется, во многих случаях вам может понадобиться изменить положение камеры, чтобы было удобнее бежать или же чтобы рассмотреть окружающий мир. Изменять угол обзора и прочие параметры можно следующими способами:

Вращение камеры — перемещайте мышь, зажав правую кнопку, чтобы переместить камеру в нужную позицию.

Приближение и отдаление — чтобы приближать и отдалять камеру, используйте колесико мыши. Приблизив камеру, можно при желании рассмотреть персонажа, а отдалив, осмотреться вокруг.

Посмотреть в обратном направлении — просто нажмите на колесико мыши, чтобы камера повернулась на 180 градусов и показала, что находится позади вас. Эта функция может оказаться полезной, когда вы бежите от кого-нибудь и хотите убедиться, что вас не догоняют.

Вернуть камеру в позицию по умолчанию — если вы нажмете на правую кнопку мыши, то камера вернется в свою исходную позицию.

Изменение способ обзора — если вы хотите посмотреть на мир от первого лица, то нажмите Page Up. Чтобы вернуться в режим обзора от третьего лица, нажмите Page Down.

Горячие клавиши

Клавиши Действие Клавиши Действие
Esc Отменяет текущую цель Tab/Alt+V Открывает окно инвентаря
F1~F12 Выполнить действие из окна ярлыков Alt+T Просмотр окна статуса
Alt+F1~F10 Переключение вкладок в окне ярлыков с командами Alt+K Просмотр окна умений
Page Up/Down Сменить обзор камеры Alt+C Просмотр окна команд
Ctrl Держите эту клавишу для атаки других игроков или дружественных NPC Alt+N Открыть окно клана
Alt+Y Открыть окно Lineage II Messenger Alt+U Открыть окно квестов
Alt+M Открыть карту Alt+B Открыть Community Bulletin Board
Alt+J Скрыть окно чата Alt+X Открыть системное меню
Alt+H Скрыть интерфейс Alt+R Просмотр списка макросов
Alt+O Открыть окно GM петиций Alt+P Переключение между вашими графическими настройками и минимальными
Alt+L Установить панель горячих клавиш в позицию по умолчанию Alt+P Переключение между вашими графическими настройками и минимальными
Alt+Enter Переключение между полноэкранным и оконным режимом игры

© 2008—2021, Linedia — база знаний и энциклопедия игры Lineage 2 на русском языке: квесты и описания, прохождения и статьи, вещи и монстры, классы и расы, пособия и гайды, скилы и умения.

Категория: Руководства для новичкаВсе категории > Руководства > Руководства для новичка image

Установка с двумя мониторами была секретным оружием производительности настольных компьютеров в течение многих лет. Конечно, в наши дни гораздо более элегантным решением является покупка большого сверхширокого экрана. Однако простое подключение второго монитора – это быстрый и доступный способ добавить больше рабочего пространства. Не говоря уже о том, что любой пользователь ноутбука с внешними экранами по умолчанию настроен на два монитора!

image

Эти бесплатные программы с двумя мониторами облегчают настройку и управление настройкой нескольких мониторов в Windows. Таким образом, вы тратите меньше времени на настройку монитора и больше времени на продуктивную работу.

Инструменты для двух мониторов

Программа Dual Monitor Tools не только бесплатна, но и является программой с двумя исходными кодами. На самом деле, мы должны сказать «пакеты», так как на самом деле это набор модулей, которые вы можете смешивать и сочетать. Например, Dual Wallpaper – это автономный инструмент, который позволяет вам иметь разные обои на каждом экране. Так что, если это все, что вы хотите, это все, что вам нужно скачать.

DMT позволяет или несколько довольно интересных трюков. Например, курсор DMT позволяет настроить поведение курсора мыши. Вы можете привязать курсор к одному монитору, усложнить перемещение между мониторами или разрешить свободное движение. Это очень удобно, если у вас есть сценарий использования, когда курсор случайно оказывается там, где этого не должно быть, это может быть спасителем.

DMT находится в области уведомлений, и вы можете быстро получить доступ ко всем модулям оттуда. Это не модно (или красиво), но эти инструменты невероятно полезны!

DisplayFusion (бесплатная версия)

DisplayFusion, пожалуй, самая известная мультимониторная программа. С уважением! Это приложение, которое объединяет все: мульти-мониторные панели задач, переменные обои, сочетания клавиш и многое другое. Платная «Pro» версия предлагает гораздо больше, но для подавляющего большинства людей DisplayFusion Free будет больше, чем нужно, чтобы получить максимальную отдачу от настройки двух мониторов.

В частности, пользователям Windows 8 понравится использование специализированных твиков, включенных в бесплатную версию. Вы можете скрыть экран блокировки, отключить «горячие» углы Windows 8 и изменить размер границ окон приложений. Все точки раздражения для многих пользователей этой операционной системы.

DisplayFusion также предлагает замечательные расширенные функции привязки окон, которые значительно упрощают управление окнами на нескольких мониторах. Что включает в себя возможность привязывать окна для контроля краев. Бешеный недосмотр в самой Windows.

Любой пользователь Windows с несколькими мониторами должен хотя бы попробовать DisplayFusion. Это действительно преобразующий инструмент. В начале вы получите пробную версию Pro, так что вы сможете попробовать функции Pro, чтобы узнать, стоят ли они какой-либо цены.

MultiMonitorTool

Не каждая программа с двумя мониторами должна быть продумана или переработана, чтобы быть полезной. MultiMonitorTool является прекрасным примером этого. Это простая и легкая утилита, которая дает вам много энергии прямо у вас под рукой.

Во-первых, он примет инструкции из командной строки, и вы сможете увидеть в реальном времени предварительный просмотр настройки нескольких мониторов, которую вы используете в данный момент. Это делает его идеальным для компьютеров с несколькими мониторами в публичном пространстве. Помимо интерфейса командной строки, вы можете выполнять общие задачи, такие как перемещение окон между мониторами с помощью сочетаний клавиш.

Этот инструмент будет работать с версиями Windows начиная с XP и вплоть до текущих версий Windows 10. Так что, если вам нужно использовать общедоступный компьютер, например, в лекционном зале, или иным образом использовать устаревшее оборудование на нескольких мониторах MultiMonitorTool – настоящий спасатель жизни.

MultiMon Taskbar 2.1 (бесплатно)

Доступна более новая версия панели задач MultiMon, имеющая номер версии «3.5». Однако это «Pro» версия, которая поставляется с ценником. Поэтому пользователи, которым нужен бесплатный инструмент, должны выбрать версию 2.1, что не обязательно является плохой вещью. Здесь есть просто отличительные особенности.

Бесплатная версия программного обеспечения для двух мониторов добавляет панели задач к расширенным мониторам в Windows. Это может сделать до трех настроек монитора. Панель задач каждого монитора показывает только приложения на этом мониторе. Это включает в себя не показ приложений на основной панели задач монитора, которые не являются этим монитором.

Этот бесплатный инструмент предназначен только для работы до Windows 7, но все еще существует множество компьютеров, работающих под управлением этой более старой операционной системы. MultiMon также является довольно стабильным программным обеспечением, поэтому, если у вас есть мультимониторная система нужного уровня, стоит попробовать.

Windows 10 (вы не видели этого!)

Microsoft уделяет внимание миру сторонних утилит для работы с несколькими мониторами. Это означает, что, если вы уже используете Windows 10, в систему встроено множество функций, для которых в прошлом вам требовалось стороннее решение.

В настоящее время существует множество вариантов настройки нескольких мониторов, встроенных в окна, с поддержкой практически любой компоновки, микширования, разрешения и ориентации. Windows 10 изначально поддерживает наличие разных обоев на каждом экране. Панели задач с несколькими мониторами? Уже сделано!

В Windows 10 также имеется привлекательная функция виртуального рабочего стола, сочетания клавиш для быстрого переключения режимов нескольких мониторов и удобные сочетания клавиш для быстрого или максимального увеличения окон.

Правда заключается в том, что для большинства пользователей лучшие функции управления двумя мониторами уже встроены в Windows 10. Сторонние разработчики выполнили много бесплатных исследований и разработок для Microsoft, которой просто пришлось скопировать функции, которые работали для их собственная операционная система.

Лучше?

Мы по-прежнему рекомендуем использовать сверхширокий экран для повышения производительности и отсутствия лицевой панели в середине экрана, если вы начинаете с чистого листа. Но если вы обнаружите, что жизнь с двумя мониторами – это то, что вам нужно, то эти программы с двумя мониторами необходимы для того, чтобы держать под контролем всю эту недвижимость.

Не забывайте, что вы также можете легко добавить дополнительный экран через USB. Либо с помощью специального дисплея USB, либо с помощью планшета, такого как Apple iPad, и приложения, такого как DuetDisplay. Это отличный трюк, если вам не нужны постоянно мониторы с двумя мониторами или вы хотите воспользоваться этой настройкой в дороге

Существуют даже USB-мониторы с креплением-клипсой для ноутбуков, которые позволяют устанавливать два и три монитора в мобильных установках. Приведенные выше приложения для двух мониторов наверняка пригодятся в этих решениях!

Вернуться

Похожие новости

Philips выпустил 49-дюймовый изогнутый монитор SuperWide

Philips выпустил новый мощный 49-дюймовый изогнутый монитор SuperWide с диагональю 32: 9, впервые

Монитор для компьютера, что это?

Монитор для компьютера – это составляющая часть компьютерного оборудования, которая выводит

Samsung выпускает CJG5 WQHD изогнутые VA игровые мониторы

Samsung находится на Gamescom 2018 и использовал это мероприятие для запуска нового диапазона

Philips выпускает игровой монитор Momentum

Philips уведомляет о выходе мониторов нового диапазона, которые он запустил, с учетом рынка игровых

Файлы для игры Updater Lineage 2 New Era Размер: 1.8 Mb

Апдейтер, при помощи которого легко скачивать все файлы сразу или обновлять клиент после обновлений. 

Пароль на архив: newera

Клиент Lineage 2 C4 Размер: 3.1 Gb

Чистый клиент Lineage 2 C4.

Патч Lineage 2 New Era Размер: 1.04 Gb

Официальный патч нашего сервера.

No Sleep Patch Размер: 1.8 Mb

Патч не даёт уснуть неактивным окнам. Постоянные активные окна повышают нагрузку на систему, но увеличивают скорость переключения между ними.

Разноцветное оружие Размер: 2 Kb

Патч, который придает каждому уровню заточки индивидуальный цвет. По умолчанию у нас патч на классическое свечение оружия. Установить в папку system.

Стандартное отображение брони Размер: 119 Kb

Патч для классического (для С4) отображения одежды. Установить в папку system с заменой.

Отображение ника персонажа в шапке окна игры Размер: 20 Kb

Установить в папку system.

Patch Resurrection/Frenzy/Ultimate Defence/Ultimate Evasion Размер: 4 Mb

Отображает длительность умений в виде иконки над ником персонажа, подробнее.

Кастумный интерфейс Размер: 134.1 Mb

Патч, меняющий интерфейс игры. (Адаптация и модификация под С4 от игрока под ником Whyc нашими доработками).

Настройка TryMovie бота для Lineage 2 Revolution.

1. Настройка эмулятора

Скачайте и установите любой из предложенных эмуляторов. Одновременный запуск нескольких эмуляторов от разных разработчиков может привести к нестабильной работе бота.

LDPlayer (Рекомендуется)

  • Настройки Дополнительные 1280×720 (dpi 240)
  • Настройки Другие Рут права: Вкл; Отладка по ADB: Локальное подключение; Фиксация размера окна: Откл
  • Правая панель Значек клавиатуры Показать подсказки управления: Откл
  • Настройки Основные Рут: Вкл
  • Настройки Производительность Разрешение: 1280×720; DPI: 240; Режим рендеринга: OpenGL+
  • Настройки Интерфейс Фиксированный размер окна: Откл
  • Правая панель Значек клавиатуры Непрозрачность: 0%
  • Настройки Экран Разрешение: 1280×720; DPI: 240
  • Настройки Движок Графический рендеринг: OpenGL
  • Настройки Параметры Включить Android Debug Bridge (ADB): Вкл

2. Внутриигровые настройки

  • Язык – English
  • Качество разрешения – High
  • Пропуск катсцен – On
  • Режим энергосбережения – None
  • Все уведомления – Каждое OFF

3. Настройка Windows

  • Пуск > Параметры > Система > Дисплей “Масштаб и разметка” должен быть установлен как 100%

4. Настройка антивируса

Действия любых ботов расцениваются некоторыми антивирусами как подозрительное ПО и могут блокироваться. Никакого вреда компьютеру или данным бот причинить не может.

  • В разделе Параметры защиты от вирусов и угроз выберите Управление настройками, а затем в разделе Исключения выберите Добавление или удаление исключений.
  • Выберите Добавить исключение > Папка, а затем выберите папку с программой (например C:Program Files (x86)TryMovieL2R_Bot).

5. Настройка бота

  • 5.1. Профили

  • 5.2. Настройка действий

    В разделе бота “Настройка действий” пройдитесь по вкладкам и настройте нужные функции. Не забудьте установить карту и координаты для фарма поля и элитного подземелья.

    Желательно не использовать без присмотра функции: Сюжетные квесты, Подземелье добычи.

  • 5.3. Системные настройки

    В системных настройках бота по умолчанию установлен режим захвата WINAPI.

    Если бот работает в режиме WINAPI, Вы можете сворачивать окно Nox, перекрывать другими окнами, использовать более одного окна Nox.

Готово

Запускать бота (ярлык на рабочем столе “TryMovie L2R Bot”) нужно от имени администратора. Начинать работу бота (зеленая кнопка “Начать”) можно когда:

  • Эмулятор не запущен;
  • Эмулятор запущен и не запущена игра;
  • Эмулятор запущен и запущена игра и персонаж находится в поле.

После настроек игры запустите бота в момент когда персонаж стоит в поле. Если бот не сможет обнаружить главный экран, то перейдите во вкладку бота “Системные настройки” и переключите режим захвата на “Screencapture”. В режиме Screencapture фоновая работа недоступна.

Напишите в саппорт, если у Вас что-то не получилось.

image

Предисловие

Как можно развлечься в новогодние праздники? Поиграть в компьютерные игры? Нет! Лучше написать бота, который это будет делать за тебя, а самому пойти лепить снеговика и пить глинтвейн.

Когда-то в школьные годы был увлечен одной из популярных MMORPG — Lineage 2. В игре можно объединяться в кланы, группы, заводить друзей и сражаться с соперниками, но в общем игра наполнена однообразными действиями: выполнением квестов и фармом (сбор ресурсов, получение опыта).

Вообще, создание бота для L2 дело не новое и их готовых есть довольно много. Делятся они на 2 основные группы: те, которые внедряются в работу клиента и кликеры.

Первые — это жёсткий чит, в плане игры пользоваться ими слишком уж неспортивно. Второй вариант интереснее, учитывая, что его можно будет с некоторыми доработками применить к любой другой игре, да и реализация будет интереснее. Те кликеры, которых я находил, по разным причинам не работали, либо работали нестабильно.

Внимание: вся информация здесь изложена только в познавательных целях. Особенно для разработчиков игр, чтобы помочь им лучше бороться с ботами.

Итак, к делу.

Работа с окном

Код методов получения положения окна

def get_window_info():     # set window info     window_info = {}     win32gui.EnumWindows(set_window_coordinates, window_info)     return window_info  # EnumWindows handler # sets L2 window coordinates def set_window_coordinates(hwnd, window_info):     if win32gui.IsWindowVisible(hwnd):         if WINDOW_SUBSTRING in win32gui.GetWindowText(hwnd):             rect = win32gui.GetWindowRect(hwnd)             x = rect[0]             y = rect[1]             w = rect[2] - x             h = rect[3] - y             window_info['x'] = x             window_info['y'] = y             window_info['width'] = w             window_info['height'] = h             window_info['name'] = win32gui.GetWindowText(hwnd)             win32gui.SetForegroundWindow(hwnd)

Получаем картинку нужного окна с помощью ImageGrab:

def get_screen(x1, y1, x2, y2):     box = (x1 + 8, y1 + 30, x2 - 8, y2)     screen = ImageGrab.grab(box)     img = array(screen.getdata(), dtype=uint8).reshape((screen.size[1], screen.size[0], 3))     return img

Теперь будем работать с содержимым.

Поиск монстра

Самое интересное. Те реализации, которые я находил, мне не подошли. Например, в одном из популярных и даже платном это сделано через игровой макрос. И “игрок” должен для каждого типа монстра прописывать в макросе типа “/target Monster Name Bla Bla”.

В нашем случае мы последуем такой логике: в первую очередь найдём все тексты белого цвета на экране. Белый текст может быть не только названием монстра, но и именем самого персонажа, именем NPC или других игроков. Поэтому надо навести курсор на объект и если появится подсветка с нужным нам паттерном, то можно атаковать цель.

Вот исходная картинка, с который будем работать:

image

Закрасим черным своё имя, чтобы не мешало и переведем картинку в ч/б. Исходная картинка в RGB — каждый пиксель это массив из трёх значений от 0 до 255, когда ч/б — это одно значение. Так мы значительно уменьшим объем данных:

img[210:230, 350:440] = (0, 0, 0) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

image

Найдем все объекты белого цвета (это белый текст с названиями монстров)

ret, threshold1 = cv2.threshold(gray, 252, 255, cv2.THRESH_BINARY)

image

Морфологические преобразования:

  1. Фильтровать будем по прямоугольнику размером 50×5. Такой прямоугольник подошел лучше всех.
  2. Убираем шум внутри прямоугольников с текстом (по сути закрашиваем всё между букв белым)
  3. Еще раз убираем шум, размывая и растягивая с применением фильтра
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (50, 5)) closed = cv2.morphologyEx(threshold1, cv2.MORPH_CLOSE, kernel) closed = cv2.erode(closed, kernel, iterations=1) closed = cv2.dilate(closed, kernel, iterations=1)

image

Находим середины получившихся пятен

(_, centers, hierarchy) = cv2.findContours(closed, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

Работает, но можно сделать прикольнее (например, для монстров, имена которых не видны, т.к. находятся далеко) — с помощью TensorFlow Object Detection, как тут, но когда-нибудь в следующей жизни.

Теперь наводим курсор на найденного монстра и смотрим, появилась ли подсветка с помощью метода cv2.matchTemplate. Осталось нажать ЛКМ и кнопку атаки.

Клик

С поиском монстра разобрались, бот уже может найти цели на экране и навести на них мышь. Чтобы атаковать цель, нужно кликнуть левой кнопкой мыши и нажать «атаковать» (на кнопку «1» можно забиндить атаку). Клик правой кнопкой мыши нужен для того, чтобы вращать камеру.

На сервере, где я тестировал бота, я вызвал клик через AutoIt, но он почему-то не сработал.

Как оказалось, игры защищаются от автокликеров разными способами:

  • поиск процессов, которые эмулируют клики
  • запись кликов и определение, какого цвета объект, на который кликает бот
  • определение паттернов кликов
  • определение бота по периодичности кликов

А некоторые приложения, как клиент этого сервера, могут определять источник клика на уровне ОС. (будет здорово, если кто-нибудь подскажет как именно).

Были перепробованы некоторые фреймворки, которые могут кликать (в т.ч. pyautogui, robot framework и что-то еще), но ни один из вариантов не сработал. Проскользнула мысль соорудить устройство, которое будет нажимать кнопку (кто-то даже так делал). Похоже, что нужен клик максимально хардварный. В итоге стал смотреть в сторону написания своего драйвера.

На просторах интернета был найден способ решения проблемы: usb-устройство, которое можно запрограммировать на подачу нужного сигнала — Digispark.image

Ждать несколько недель с Алиэкспресса не хочется, поэтому поиски продолжились.

В итоге была найдена замечательная библиотека на C Нашлась для неё и обёртка на Python

Библиотека у меня не завелась на питоне 3.6 — вываливалась ошибка Access violation что-то там. Поэтому пришлось соскочить на питон 2.7, там всё заработало like a charm.

Движение курсора

Библиотека может посылать любые команды, в том числе, куда переместить мышь. Но выглядит это как телепортация курсора. Нужно сделать движение курсора плавным, чтобы нас не забанили.

По сути задача сводится к тому, чтобы перемещать курсор из точки A в точку B с помощью обертки AutoHotPy. Неужели придется вспоминать математику?

Немного поразмыслив, всё-таки решил погуглить. Оказалось, что ничего придумывать не надо — задачу решает алгоритм Брезенхэма, один из старейших алгоритмов в компьютерной графике:

Прямо с Википедии можно взять и реализацию

Логика работы

Все инструменты есть, осталось самое простое — написать сценарий.

  1. Если монстр жив, продолжаем атаковать
  2. Если нет цели, найти цель и начать атаковать
  3. Если не удалось найти цель, немного повернемся
  4. Если 5 раз никого не удалось найти — идём в сторону и начинаем заново

Из более-менее интересного опишу, как я получал статус здоровья жертвы. В общих чертах: находим по паттерну с помощью OpenCV элемент управления, показывающий статус здоровья цели, берём полоску высотой в один пиксель и считаем в процентах, сколько закрашено красным.

Код метода получения уровня здоровья жертвы

def get_targeted_hp(self):         """         return victim's hp         or -1 if there is no target         """          hp_color = [214, 24, 65]         target_widget_coordinates = {}         filled_red_pixels = 1          img = get_screen(             self.window_info["x"],             self.window_info["y"],             self.window_info["x"] + self.window_info["width"],             self.window_info["y"] + self.window_info["height"] - 190         )          img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)          template = cv2.imread('img/target_bar.png', 0)         # w, h = template.shape[::-1]          res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)         threshold = 0.8         loc = np.where(res >= threshold)         if count_nonzero(loc) == 2:             for pt in zip(*loc[::-1]):                 target_widget_coordinates = {"x": pt[0], "y": pt[1]}                 # cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (255, 255, 255), 2)          if not target_widget_coordinates:             return -1          pil_image_hp = get_screen(             self.window_info["x"] + target_widget_coordinates['x'] + 15,             self.window_info["y"] + target_widget_coordinates['y'] + 31,             self.window_info["x"] + target_widget_coordinates['x'] + 164,             self.window_info["y"] + target_widget_coordinates['y'] + 62         )          pixels = pil_image_hp[0].tolist()         for pixel in pixels:             if pixel == hp_color:                 filled_red_pixels += 1          percent = 100 * filled_red_pixels / 150         return percent

Теперь бот понимает, сколько HP у жертвы и жива ли она еще.

Основная логика готова, вот как теперь он выглядит в действии: Для занятых я ускорил на 1.30

Остановка работы

Вся работа с курсором и клавиатурой ведется через объект autohotpy, работу которого в любой момент можно остановить нажатием кнопки ESC.

Проблема в том, что всё время бот занят выполнением цикла, отвечающим за логику действий персонажа и обработчики событий объекта и autohotpy не начинают слушать события, пока цикл не закончится. Работу программы не остановить и с помощью мыши, т.к. бот управляет ей и уводит курсор куда ему нужно.

Нам это не подходит, поэтому пришлось разделить бота на 2 потока: слушание событий и выполнение логики действий персонажа.

Создадим 2 потока

        # init bot stop event         self.bot_thread_stop_event = threading.Event()          # init threads         self.auto_py_thread = threading.Thread(target=self.start_auto_py, args=(auto_py,))         self.bot_thread = threading.Thread(target=self.start_bot, args=(auto_py, self.bot_thread_stop_event, character_class))          # start threads         self.auto_py_thread.start()         self.bot_thread.start()

и теперь вешаем обработчик на ESC:

auto_py.registerExit(auto_py.ESC, self.stop_bot_event_handler)

при нажатии ESC устанавливаем событие

self.bot_thread_stop_event.set()

и в цикле логики персонажа проверяем, установлено ли событие:

while not stop_event.is_set():

Теперь спокойно останавливаем бота по кнопке ESC.

Заключение

Казалось бы, зачем тратить время на продукт, который не приносит никакой практической пользы?

На самом деле компьютерная игра с точки зрения компьютерного зрения — почти то же самое, что и снятая на камеру реальность, а там возможности для применения огромны. Отличный пример описан в статье про подводных роботов, которые лазером стреляют по лососям. Также статья может помочь разработчикам игр в борьбе с ботоводами.

P.S. Ссылка на репозиторий

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий