Запускаем Ubuntu и смотрим Torrent и Torrent-TV прямиком на Samsung SmartTV

    image
    После прочтения комментария от awoland во вчерашней статье Как SmartTV забыли о главном, я сразу полез пробовать получить root-права и telnet/ssh на своем телевизоре. Оказывается, все уже готово для этого, и это проще простого!

    Достаточно установить Виджет SamyGo, и он все сделает за вас!

    Что дает нам SamyGO?

    • Root-доступ на ТВ через Telnet
    • Виртуальную флешку, монтирование NFS, Samba, FTP на нее
    • Samba, FTP-серверы
    • Apache2 с PHP
    • rtorrent
    • Уйму веселья!


    # -*- DISCLAIMER -*-
    Все, что вы делаете со своим ТВ, вы делаете на свой страх и риск. Автор этой статьи не несет никакой ответственности за ваш анал.

    Для моего ТВ (E-серия), мне необходимо было:
    1. Установить Skype на ТВ и запустить его 1 раз
    2. Скачать инсталлятор виджета SamyGo на флешку
    3. Запустить его с флешки
    4. ???
    5. PROFIT!

    Как они это сделали, демоны?

    Вот как выглядит скрипт инсталлятора:
    Скрытый текст
    var Main = {  }
    
    var widgetAPI = new Common.API.Widget();        
    var tvKey = new Common.API.TVKeyValue();
    
    var runf1=1;
    var runf2=1;
    var LabelString="Log:
    ";
    var usbPlugin;
    var FilePlugin;
    var nUSBCount;
    var commonFilePath;
    
    Main.onLoad = function() 
    {             
        alert("Main.onLoad()");
        this.enableKeys();
        widgetAPI.sendReadyEvent();             
        Func();
    };
    
    Main.onUnload = function()
    {
    
    };
    
    Main.enableKeys = function()
    {
    	document.getElementById("anchor").focus();
    };
    
    Main.keyDown = function() 
    {            
        var keyCode = event.keyCode;
    
    	switch(keyCode)
    	{
    		case tvKey.KEY_RETURN:
    		case tvKey.KEY_PANEL_RETURN:
    			widgetAPI.sendReturnEvent();
    			break;
    		case tvKey.KEY_RED:
    			if(runf2==1) 
    				{
    				 runf2=0;
    				 Log ("
    Please Wait 20-30 sec....");
    				 setTimeout("Func1(commonFilePath);",3000);
    				}
    			 else Log('Activated yet!');
    			break;
    		case tvKey.KEY_ENTER:
    		case tvKey.KEY_PANEL_ENTER:
    			if(runf1==1)
    			   {
    				runf1=0;
    				Log ("
    Please Wait  20-30 sec....");
    				setTimeout("Func1(commonFilePath);",3000);
    			   }	
    			 else Log('Activated yet!');
    			
    			break;
    		default:
    			alert("Unhandled key");
    			break;
    	} 
    };
    
    function Log(Str)
    {
    	var Label = document.getElementById("LogLabel");
    	LabelString = LabelString+Str+"
    ";
    	widgetAPI.putInnerHTML(Label,LabelString);
    };
    
    function sleep(ms) 
    {
    	ms += new Date().getTime();
    	while (new Date() < ms){}
    };
    
    function Func() 
    {
    	usbPlugin = document.getElementById("pluginStorage");
    	FilePlugin = document.getElementById("pluginObjectFile");
    	nUSBCount = eval("usbPlugin.GetUSBListSize()");
    	var Param;
    	var r1=0;
    	var r2=0;
    	var r3=0;
    
    	Log("Found <b style='font-size:30px; color:green'>" + nUSBCount + "</b> USB devices");
        for (var i = 0; i < nUSBCount; i++)
        {
            var nid1 = eval("usbPlugin.GetUSBDeviceID("+i+")");
            var nid = parseInt(nid1);
            var VN = "
    Vendor Name = <b style='color:green'>" + eval("usbPlugin.GetUSBVendorName("+nid+")") + "</b>";
            var MN = "
    Model Name = <b style='color:green'>" + eval("usbPlugin.GetUSBModelName("+nid+")") + "</b>";
            nPartition = eval("usbPlugin.GetUSBPartitionNum("+nid+")");
            for (var j = 0; j < nPartition; j++) 
            {
            	var mntPath = eval("usbPlugin.GetUSBMountPath("+nid+", "+j+")");
                commonFilePath = '/dtv/usb/' + mntPath; 
    
                Param = "FilePlugin.IsExistedPath(commonFilePath + '/InstallSamygo/data/SamyGO.zip')";
                r1 = eval(Param);
                Param = "FilePlugin.IsExistedPath(commonFilePath + '/InstallSamygo/data/AutoStart')"; 
                r2 = eval(Param);
                Param = "FilePlugin.IsExistedPath(commonFilePath + '/InstallSamygo/data/libSkype.so')"; 
                r3 = eval(Param);
                if (r1 == 1 && r2 == 1 && r3 == 1)
                	{
                		Log("The installation files found on USB: " + commonFilePath + VN + MN);
                		return;
                	}
                  else 
                	{
              			Log("Some installation files not found on USB: " + commonFilePath + VN + MN);
              			return;
                	}
            }
           Log("The installation files not found on USB: error");
        }   
    };
    
    function Func1(Path) 
    {
    
    	var r=0;
    	var Param;
    	var str =''; 
    
        Param="FilePlugin.Copy ('"+ Path +"/InstallSamygo/data/AutoStart','/mtd_rwcommon/moip/engines/Skype/AutoStart')";
        r = eval(Param);
        if (r==1) str = 'OK'; else str = 'No';
        Log("Step1: " + str)
    
        Param="FilePlugin.Copy ('"+ Path +"/InstallSamygo/data/libSkype.so','/mtd_rwcommon/moip/engines/Skype/libSkype.so')";
        r = eval(Param);
        if (r==1) str = 'OK'; else str = 'No';
        Log("Step2: " + str);
    
        if(runf2==1)
         {
          Param="FilePlugin.Unzip('"+ Path +"/InstallSamygo/data/SamyGO.zip','/mtd_rwcommon/widgets/user/SamyGO/')";
          r = eval(Param);
          if (r==1) str = 'OK'; else str = 'No';
          Log("Step3: " + str);
         } 
        Log("Now press exit and restart tv");	
    };

    Уязвимость в функции FilePlugin.Copy, вызываемой через eval, которая позволяет копировать что угодно куда угодно. Скрипт берет и копирует подмененный libSkype.so, который умеет только запускать другой скрипт, и устанавливает сам виджет SamyGo.

    Что же в виджите SamyGo?
    Скрытый текст
    var Main = {                    
    }
    
    var widgetAPI = new Common.API.Widget();        
    var tvKey = new Common.API.TVKeyValue();
    
    Main.onLoad = function() {             
        alert("Main.onLoad()");
        widgetAPI.sendReadyEvent();             
        document.getElementById("anchor").focus();   
                                                     
    
         var FilePlugin = document.getElementById("pluginObjectFile");
         var Param1="FilePlugin.Copy (\"/proc/self/cmdline\", \"$(sh /mtd_rwcommon/widgets/user/SamyGO/data/run.sh)/tmp/cmdline\")";
         eval(Param1);  	 
    }
    
    Main.keyDown = function() {            
        var keyCode = event.keyCode;
        alert("Main Key code : " + keyCode);
    
        switch (keyCode) {
            case tvKey.KEY_RETURN:
                break;
        }
    }
    

    Ну это вообще пушка! Мы можем выполнять shell-команды из все той же функции, используя $()-синтаксис.
    run.sh выполняет инсталляцию busybox и прочей мишуры, монтирует data.xfs, запускает telnetd и nc, который запускает sh при коннекте (если будут какие-то проблемы с /dev/pts и к telnet нельзя будет подключиться), запускает подобия init-скриптов.

    Что внутри?

    Внутри у нас 2-ядерный процессор с архитектурой ARMv7, с поддержкой NEON, я полагаю, семейства Cortex-A8, видео MALI 400, 512МБ оперативной памяти, ядро 2.6.35.13. В общем, довольно типичный «планшет» 2012 года.
    cat /proc/cpuinfo
    VDLinux#> cat /proc/cpuinfo
    Processor       : ARMv7 Processor rev 0 (v7l)
    processor       : 0
    BogoMIPS        : 1794.04
    
    processor       : 1
    BogoMIPS        : 1794.04
    
    Features        : swp half thumb fastmult vfp edsp neon vfpv3 
    CPU implementer : 0x41
    CPU architecture: 7
    CPU variant     : 0x3
    CPU part        : 0xc09
    CPU revision    : 0
    
    Hardware        : amber3
    Revision        : 0000
    Serial          : 0000000000000000

    Ядро поддерживает SquashFS, FAT32, XFS, RFS (Самсунговская ФС, FAT32 + журналирование), NTFS (Драйвер tntfs от Tuxera). Есть поддержка модулей, в SamyGo поставляются несколько модулей ФС, FUSE загружается, а, например, ext2/3/4 — нет, т.к. в ядре нет символов для них.

    На ТВ запущен самый обычный X-сервер с xf86-video-mali, за весь SmartTV отвечает 125-мегабайтный файл exeDSP (загружался в IDA PRO 17 минут до начала анализа), а вот со звуком интересней: alsa нет, и, похоже, exeDSP общается с /dev/system напрямую.

    Что можно делать-то?

    Да что угодно. Я лентяй, и стараюсь лишний раз не кросс-компилировать что-либо, поэтому просто взял Ubuntu Core, создал на флешке XFS-раздел, распаковал туда Ubuntu и вставил в ТВ. С armhf-версией были проблемы (всякие unknown instruction, там компилируют с thumb2?), поэтому нашел 12.04 armel.
    Остается только вставить флешку в ТВ, подключиться по telnet и сделать:
    chroot /dtv/usb/sda1 /bin/bash

    И мы получим полноценную убунту 12.04.
    mount --bind не работает, поэтому, если вам нужен proc и sys в chroot (а он вам будет нужен), используйте:
    mount -t sysfs sysfs ./sys
    mount -t proc proc ./proc


    Первым делом, я, конечно же, поставил mplayer. И знаете, работает! Медленно, конечно, и из выводов только x11 работает, но показывает! Я посмотрел вчерашний опенинг с субтитрами и без звука ;)


    Скриншотов, вот, scrot'ом поснимал:
    image
    image

    Прошу обратить внимание, разрешение скриншотов я не менял, и, на самом деле, разрешение у ТВ (по крайней мере у X-сервера) 1280×720!

    Ну а дальше я решил поставить Ace Stream Engine и AceProxy для просмотра ТВ-стримов и Torrent прямо на ТВ. Для этого нам необходим Python, т.к. именно на нем написаны эти два продукта. Т.к. Ace Stream официально не выпускается для ARM, да и вообще, его разработчики несколько дикие, то мы возьмем распакованную версию для Raspberry PI, ну а AceProxy из моего репозитория

    Собственно, нужные пакеты для Ace Stream написаны в ссылке, а для AceProxy нужен только python-gevent. Запускаем все это дело, можно даже открыть страницу статистики AceProxy во встроенном браузере ТВ:
    image

    На удивление, Ace Stream не особо грузит процессор (где-то на 15% судя по top), так что его вполне можно использовать на ТВ.
    Теперь остается только взять какой-нибудь плеер (nStreamLmod, например) и сделать плейлист для AceProxy.

    Что-то еще?

    Это все proof-of-concept. Я все это делал чисто из кратковременного интереса и, скорее всего, не буду продолжать дальше. Однако, если кто-нибудь подопнет меня, как происходит работа со звуком, то можно будет смотреть видео с FLAC и Vorbis в MKV, просто запуская их вместе.
    Будьте осторожны с SamyGo. По умолчанию, он запускает много сервисов, и доступ по telnet осуществляется без пароля.
    Успехов!
    Метки:
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 66
    • +15
      У Вас получился свой Smart-TV с блэкджеком и… torrent stream!

      • +2
        А биткоины можно на нем майнить?
        • +12
          Один не справится. Только в пуле с утюгами и холодильниками.
          • +7
            Только ситкомины
        • +38
          Я в своё время ржал над теми, кто говорил, что в будущем придумают вирусы, способные заразить телевизор. Теперь мне стыдно…
          • +9
            Да телевизор то ладно, а вот заражение утюга, например, или холодильника имеет более ощутимые последствия.
            • +5
              Телевизор тоже не плохо, учитывая что в нем есть веб-камера и в теории можно настроить трансляцию видео со спальни в интернет )
              • +1
                Недавно был в крупном гипермаркете бытовой техники — там со встроенными камерами только пара-тройка топовых моделей была. Для остальных со смартТВ — камеру нужно покупать отдельно.
                • +23
                  Лет 15 назад был в крупном гипермаркете бытовой техники — там LCD-телевизоров пара-тройка топовых моделей, с низким разрешением и весом с холодильник. Остальные — обычные кинескопы.
              • +3
                Имеет смысл снова начать накрывать телевизор на ночь салфеткой?
                • +3
                  Проще уж камеру залепить синей изолентой.
                  • 0
                    А микрофоны?
                    • 0
                      Тоже.
                      Ну можно, конечно, залезть туда с паяльником, но залепление внешних отверстий должно очень сильно ослабить сигнал.
              • +2
                Или электроодеяла.
                • +1
                  А вот если объединить заражённые утюги в ботнет…
                • +3
                  Вирусы — то ладно, а вот трояны, заложенные производителем (была на хабре недавно тема).
                • +1
                  Ради AсePlayer заморочусь наверное. Слог повествования у вас интересный.)
                  • +14
                    Странное заявление, или я такой пошлый…
                    >>Автор этой статьи не несет никакой ответственности за ваш анал.
                    • +18
                      Но ведь и правда не несет.
                      • 0
                        Модератор мне изменил «анал» на «действия». Бред какой-то.
                        • +6
                          Хм. Наоборот было бы еще более странно, нет?
                    • +3
                      Вот бы такое сделать для LG Smart TV (2012, 2013 годов выпуска)
                      • 0
                        Это не очень сложно. Я делаю так:
                        1) /usr/bin/acestreamengine --log-file /dev/null --client-console --live-buffer 30 --cache-limit 2
                        2) vlc -I telnet --clock-jitter 0 --network-caching 500 --sout-mux-caching 500 --telnet-password admin
                        3) python acehttp.py (https://github.com/ValdikSS/aceproxy)
                        4) в Mediatomb добавляю item:
                        Title: Torrent stream
                        URL: http://<ubuntu_host>:8000/pid/<torrent_stream_hash>
                        class: object.item.videoItem
                        Mimetype: video/H264
                        5) через телек захожу в mediatiomb и запускаю Torrent stream
                        • 0
                          Это понятно, но это не то что в топике описано.
                          Я про то как в LG Smart TV аналогично telnet завести и прочие радости.
                          • 0
                            Согласен, было бы просто прекрасно. Я пока нашел только как с помощью светодиода попасть в инженерное меню. Но там нет одной очень важной и необходимой мне плюшечки — ограничения максимального уровня громкости. Дедушка глуховат (наушники не переваривает) и жмет на пульте кнопку есс-но повышая громкость до 100. Решил проблему — поставил приставку с T2 и на ней установил маленькую громкость. Теперь телек постоянно на 100 )
                            • +1
                              Подскажите, пожалуйста, как попасть в инженерное меню при помощи светодиода на LG LA620V (2013 Smart TV).
                      • +6
                        хочеца XBMC
                        • +1
                          А я специально купил телевизор без смарт TV, а теперь не могу выбрать Mini PC для него. Открыл, даже, вопрос на тостере, но никто не отвечает :( Люди только подписываются на вопрос, видать тема актуальна.
                          • +26
                            Никто не отвечает, т.к. туда теперь ходят только спрашивать…
                          • +1
                            Вопрос: а для чего именно линукс, почему бы сермяжный андроид не оставить? Все-таки андроид ловчее подходит для подобных вещей, интерфейсы приложений более подходящие для «грубого» управления чем-то типа ДУ с air mouse. Как человек, у которого в спальне свисток с андроидом, а в гостиной — медиацентр с xbmcbuntu, скажу что все-таки с андроидом все же лучше.
                            Понятно, что если цель превратить ТВ в еще один компьютер, то нужен линукс.
                            • +2
                              Доверия к линуксу как-то больше и привычнее он. Я как бывший пользователь китайского планшета очень сомневаюсь в возможностях андроида воспроизводить флэш как и в скорой кончине второго.
                              Нет, если андроид лучше для этого подходит, то можно и на нём, возможно дело привычки. Чем вам xbmcbuntu не нравится?
                              • 0
                                Ну, для поднятия линукса на каком-нибудь рокчипе нужно с бубном протанцевать. Касаемо флеша, в моем случае флеш проигрывался, но с определенными неудобствами (теми же что и у «большого убунту» — нужно целиться в маленькие контролы), решилось подбором соответствующих приложений. Например, все видео я смотрю через FS Videobox (чисто наш внутриукраинский кинозал, фронтенд к fs.to, есть и плагином к xbmc, но приложение получше будет). В принципе, для России киноприложений может и поболее будет. Так что свой flash я из андроида выдрал.

                                Касаемо xbmcbuntu — всем нравится, обожаю эту штуку. Другое дело что со временем за собой заметил, что кроме xbmc я в ней ничего вообще не запускаю — потому что запуск браузера, приложений и т.д. превращается в охоту за контролами. А увеличение dpi не выход. То есть если сначала пускал браузеры, нативные приложения и т.д., то со временем линукс стал только фронтэндом для xbmc.

                                p.s. На моем андроид-свистке с удовольствием работает тот же xbmc, использует ту же базу что и «большой» xbmc (перенесена на NAS), т.е. у меня в итоге получается андроид-свисток более функционален.
                                • 0
                                  Ну, для поднятия линукса на каком-нибудь рокчипе нужно с бубном протанцевать.
                                  Ну, вроде бы, подо все сейчас есть мануалы готовые по установке Линукса в N шагов.
                                  • 0
                                    Да дело вроде не в самом факте установки, проблема с аппаратным ускорением видео, что для тв-приставки критично.

                                    Может уже эту проблему одолели, но когда в последний раз интересовался, ни на рокчипе ни на олвиннере аппаратного ускорения не было.
                          • +1
                            Поздравляю!
                            Теперь ещё бы телевизионный и спутниковый тюнер под убунтой задействовать…
                            • +1
                              >> Root-доступ на ТВ через Telnet

                              Прочитав эту фразу, я понял: будущее наступило.
                              • +2
                                Есть готовые смартТВ с Андроидом на борту. Например, SUPRA STV-LC46S990FL, там 4-й андроид и встроенный wifi.

                                Хочу на НГ купить новый SMART TV, чтоб фильмы через Инет смотреть (нафиг эти спутниковые каналы),
                                выбрал себе какой хочешь фильм или сериал и вперед. Пока не определился с моделью, предпочитаю LG, но там проприетарное ПО мне не очень по душе.
                                • +2
                                  Вы уж меня извините, но покупать не-брендовый телевизор как основной это уж совсем издевательство над собой, имхо. Вот что-что а телевизоры от всех этих SUPRA, Mystery и прочих покупать не стоит. (собственно как и low-end модели брендовых телевизоров, а то получите тот же SUPRA только с шильдиком и прошивкой от, к примеру, самсунга)
                                  • +1
                                    А меня расстраивает, что практически нельзя купить просто большой ТВ-экран без тюнера и всякой смарт-начинки. Зачем мне за нее платить, если я все равно подключу внешний медиаплейер и т.д.?
                                    • 0
                                      Вы занимаетесь продажей телевизоров. Ваши графики показывают, что вы, как потребитель с такими желаниями, ну никак не влияете на продажи. Вы не входите в целевую аудиторию. Я бы тоже хотел покупать отдельно экраны. Но сдается мне, там начинка эта от силы 5%-10% цены кушает)
                                      • 0
                                        Если судить по стоимости мониторов, то именно так и получается, больше всего в TV стоит матрица.
                                      • +3
                                        Помню раньше тема «для чего мне платить за камеру в мобильном телефоне» возникала с завидной регулярностью.

                                        Вы платите не за какой-то набор компонентов, а за один экземпляр из конкретной партии девайсов, причем чем больше партия, тем меньше себестоимость. Соответственно, менее востребованный «просто большой ТВ-экран без тюнера и всякой смарт-начинки» будет стоить дороже, т.к. спрос меньше, партии меньше, себестоимость больше.
                                    • +1
                                      Пользовался и LG, и SAMSUNG.
                                      Минус LG в том, что не воспроизводит звук в DTS (а это очень популярный кодек), половина раздач на рутрекере пролетает.
                                      А нравится в LG его 3d-технология: очки без батарейки, мерцание не заметно.
                                      • +1
                                        Я бы еще отнес к плюсам LG естественные красивые цвета, в отличие от контрастных мультяшных самсунговских имхо.
                                        • +1
                                          Если на самсунге выбрать режим «Кино», то они тоже естественные.
                                          • 0
                                            И темнота темнотой. Оставим этот разговор. Я же написал имхо. Мне не нравятся самсунговские матрицы (тем более что они в более дешевых моделях совсем уж китайские), а вот на лыжах которые смотрел все устраивает. Но на вкус и цвет фломастеры…
                                          • 0
                                            Так если телевизор по назначению испроьзовать — аниме смотреть, то мультяшные цвета — плюс :)
                                      • +3
                                        Пользуясь случаем хочу поинтересоваться, не пробовал ли автор или еще кто из хабравчан завести обычную uvc веб камеру?
                                        Хотелось бы использовать для скайпа обычную камеру, не покупая редкую и дорогостояющую «специальную» камеру от самсунга.
                                        Я лично безуспешно потратил почти все выходные на сей процесс. В поставке ядра изначально отсутствуют модули uvcvideo.ko и все что с этим связано. Собрать эти модули с первого захода как-то не получилось.
                                        К слову, делать insmod/rmmod других модулей телевизор разрешает, я вот так для разнообразия загрузил и выгрузил usbserial.ko, который собрать удалось.
                                        Еще терзают большие сомнения, что даже если нужные модули будут загружены и появится устройство /dev/video — сможет ли виджет скайпа с ним работать?
                                        Отдельный вопрос по поводу звука, самсунговская камера имеет встроенный микрофон, а использовать микрофон, встроенный в телевизор (пульт) скайп не умеет…
                                        • +1
                                          Список моделей или хотя бы серий не помешал бы! Когда последний раз смотрел он вроде бы не поддерживал модели 2012 года.
                                          • +1
                                            На Wiki очень устаревшая информация, смотрите ссылку на ixbt, которая в статье.
                                            • +1
                                              Спасибо! Действительно уже умеет E серию
                                          • +1
                                            Ребят, а как же так, почему 1280x720?! или потом напрямую видео идет через аппаратный декодер в 1080p?
                                            • +1
                                              А если еще и приложение какое-нибудь запустить, так вообще 960×540! Прям как на телефоне у меня! Скорее всего, он выводит видео напрямую в видеовывод в 1920×1080 при просмотре, ну а если нет, то это позор.
                                              • +1
                                                ТВ 2010-го года могли запускать приложения только в 960x540. 2011-го частично 960x540, частично 720p. 2012-2014 все могут запускать приложения а 720p.
                                                Из-за проблем с обновлением документации у самсунгов и необходимостью поддержки старых ТВ выходят новые приложения в 960x540, но есть и 720p.
                                                Видео рендерится в FullHD даже внутри 960x540 приложений.
                                            • +1
                                              Здорово, а есть что-нить на эту тему под LG? Я было начал ковырять, но наковырял только дублирование функционала пульта по http.
                                              • +1
                                                openlgtv.org.ru/wiki/index.php/Achievements

                                                Если вашего телевизора нет то, увы, ничего не выйдет.
                                                • +1
                                                  Был там, не нашел ничего полезного для себя. Будем ждать…
                                                  • 0
                                                    Спасибо. Нашел там свой 575. Плохо что коннект через 232. Надо искать старый бук )
                                                • 0
                                                  Добавьте что ли дикарей сюда.
                                                  • 0
                                                    Это вы про Ace Stream, или про Samsung? Если про первое, то я уже писал в Videolan.
                                                  • 0
                                                    Немного отвлечённый вопрос: а существуют ли ТВ без вот этих всех «SmartTV» тормознутых интерфейсов, но с 3D, usb, читающие все форматы и т.д. и т.п.?
                                                    • +1
                                                      Тут противоречие возникает, если «тв читает все форматы» — то в него добавить SmartTV плевое дело, тем более, что на нем вендор поднимет неплохо бабла.
                                                      • 0
                                                        Именно в этом и проблема – зачем-то пихают тупящие и тормозящие интерфейсы, которые мне не нужны.
                                                        • 0
                                                          Голосуйте рублем, я так же собираюсь сделать — к плазме докуплю андроидный SmartTV.

                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.