[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Гостевая книжка
7ion
Заранее прошу прощения за некорректное название темы, но, т.к. создавать под каждый вопрос свою тему еще большая глупость - буду писать сюда свои проблемы.

1. "Война" htmlspecialchars и собственной функции.
Имеется милый код вывода сообщения товарищу юзеру:
smiles(htmlspecialchars($message))

Моя самописная функция, как нетрудно догадатся, заменяет коды смайликов на сам html-код. И есть один смайлик - ;/.
Вот, функция меняет спецсимволы на &lt; и проч. И, собственно, если написать </ или &/, ну, в общем, любой заменяемый символ, то функции smiles будет уже скормлено &lt;/. И функция заменит часть кода символа смайлом.
Как этого избежать? В голову лезет только мысль заменить код смайла до htmlspicialchars спецсловом и потом изменять его, но это полная глупость.

2. "Щедрая" strlen.
Вот не менее милый, чем предыдущий код для проверки условия на ошибку и добавления ее в массив:

elseif(strlen($name) > 16)
$array_error[] = 'Ник не может быть длиннее 16-ти символов';

И, почему-то, слова, имеющие несколько пробелов часто невозбранно попадают "под нож" этой функции, которая "накидывает" им символов. К примеру "Пам пам парам" выдает ошибку. Простая формочка, выводящая кол-во символов, говорит, что здесь их 13. И почему же условие бракует значение?
Все операции с этой переменной до этого момента:
    $name = !empty($_POST['name'])?trim($_POST['name']):null; 

if(isset($_POST['ok'])) {
if(empty($name))
$array_error[] = 'Имя не заполнено';
elseif(strlen($name) > 16)
$array_error[] = 'Ник не может быть длиннее 16-ти символов';
elseif($name == "Админ")
$array_error[] = 'Ты не админ';

Как видно, ничего криминального с ней не происходит. Что же тогда?

3. "Жирный" файл.
За время теста моей гостевушки с друзьями файлик изрядно подраспух и кушать его целиком моей гостевушке становится все тяжелее и тяжелее.
Жирную пищу есть вредно и поэтому я хочу узнать про метод построкового чтения из файла? Чтобы не целиком его читать, как file() или file_get_contents(), а определенные строки. Или так нельзя?
Вариант, написанный на Ирбис-тим с новым файлом для каждой страницы - не предлагать, мазохизм какой-то.
В принципе, оно мне особо не надо, тогда придется замещать еще пересносы в сообщениях чем-то абстрактным, чтобы каждое сообщение - новая строка, но хотелось бы все-таки узнать.

Заранее спасибо! =)



Спустя 20 минут, 12 секунд (17.01.2010 - 22:26) twin написал(а):
Цитата
1. "Война" htmlspecialchars и собственной функции.

Со смайликами всегда и везде проблема. Обычно стараются обозначить их реже встречающимеся комбинациями [:/] допустим. Но это тоже не панацея.
В любом случае есть вероятность "случайной улыбки". Се ля ви.
Цитата
2. "Щедрая" strlen.

Кодировка какая?

Цитата
3. "Жирный" файл.
Жирную пищу есть вредно и поэтому я хочу узнать про метод построкового чтения из файла?

Ну посмотри на fgets().

Цитата
Вариант, написанный на Ирбис-тим с новым файлом для каждой страницы - не предлагать, мазохизм какой-то.

Мазохизм, это гостевуха на файлах, а не на бд. Там же просто описаны на живом примере способы работы с файлами. А строить реальную гостевуху, да еще с распухающими файлами... Хм.

Спустя 5 минут, 28 секунд (17.01.2010 - 22:31) grigoriyi написал(а):
такое ощущение что вы пишете супер гостевуху, вы еще проверку на куки вставьте

Спустя 15 минут, 48 секунд (17.01.2010 - 22:47) 7ion написал(а):
twin
Цитата

В любом случае есть вероятность "случайной улыбки"

Да если б это была просто случацная улыбка - мне бы было пофиг. Но эта улыбка рушит самое html-обозначение символа и портит html-код, если написать его в гостевой (гостевая используется как чат - так что там все что угодно постят).
Неужели нет способа? На других сайтах с этим смайликом все работает как надо.
Цитата

Кодировка какая?

Обижаете, начальник, UTF-8, хедер в самом начале кода засунут, после функций:
header('Content-Type: text/html; charset=utf-8');

Цитата
Ну посмотри на fgets().

Оно ж небезопасно, файл попортить может.
Цитата
Мазохизм, это гостевуха на файлах, а не на бд.

Только учусь, а трансплантабельная гостевушка на файлах - довольно удобно. Я к SQL еще не притрагивался. Хотя, это, как я уже писал - чат, так что да, файлик довольно быстро пухнет. Согласен, что бд оно лучше.
В принципе можно сообразить автоочистку какую-нибудь, но надо ли? Да я и не знаю как.
Но все-таки куча файлов - еще больший громадный мазохизм, ведь это тогда как сообщения выводить? Как новый файл - берем только его и получается выводим только то, что в нем. Ни тебе удобной навигации, ничего.
А тут - красота:
    function view_posts() {
if(file_exists('text.txt')) {
if (file_get_contents('text.txt') == '') echo '<b>В этом чате пока нет сообщений
Щелкните Написать, и ваше сообщение станет первым.</b><br><br>'
;
else {
$textarr = explode("|a|\n", file_get_contents('text.txt'));
$count = count($textarr) - 1;
if (is_numeric($_GET['i']) && $_GET['i'] >= 0 && $_GET['i'] <= $count) $i = $_GET['i']; else $i = 0;
$max = $i + 9;
if ($max > $count) $max = $count;
for ($i2=$i;$i2<=$max;$i2++) {
$mess = explode('|a|',$textarr[$i2]);
echo '<b>'.$mess[0].', '.htmlspecialchars($mess[1]).'</b><br>'.nl2br(smiles(htmlspecialchars($mess[2]))).'<br><br>'; }

if (!($i == 0 && $max == $count)) {
if ($i == 0) echo '<<Пред.';
else {
if ($i <= 10 && $i > 0) $prev = 0;
else $prev = $i - 10;
echo '<a href="?i='.$prev.'"><<Пред.</a>'; }
echo ' | ';
if ($max == $count) echo 'След.>>';
else {
$next = $max + 1;
echo '<a href="?i='.$next.'">След.>></a>'; }}}}
else echo '<b>Файл с базой данных не найден!</b>'; }

Мне так нравится smile.gif Хотя не исключаю, что код местами глупый.

Спустя 5 минут, 32 секунды (17.01.2010 - 22:52) Ice написал(а):
Цитата (grigoriyi @ 17.01.2010 - 19:31)
такое ощущение что вы пишете супер гостевуху, вы еще проверку на куки вставьте

Ну ахах))) а чё такого?smile.gif Пусть ваяет=))

Спустя 5 минут, 8 секунд (17.01.2010 - 22:58) Ice написал(а):
Цитата (7ion @ 17.01.2010 - 19:47)
Только учусь, а трансплантабельная гостевушка на файлах - довольно удобно. Я к SQL еще не притрагивался.

Дык не обязательно MySQL))) Сам РНР обладает "встроенной" базой данных, а именно модулем mysqli.dll.

Для маломасштабного проекта - самое то. И логи можно организовать и очистку и в кармане таскать smile.gif

Спустя 3 минуты, 48 секунд (17.01.2010 - 23:01) 7ion написал(а):
Ice
То, что написано мню на данный момент - это необходимый минимум кода. Ничего супернавороченного.
Если для Григория идеал

file_put_contents('text.txt', $_POST['message']);
file_get_contents('text.txt');

- то его никто не останавливает.

И я не понял - что за "встроенная"? Поподробнее, пожалуйста.

twin

Кстати, fgets()-то номер строки не сообщишь. Что-то я как-то и об этом не подумал.
Оно сгодится только если сначала вывести 10 строчек, но потом придется отсчитывать 10 строк вхолостую, и потом выводить следующие 10 после нажатия на "След.>>". Не, как-то это некрасиво.
Хотя, это будет занимать меньше памяти наверно, но вот существенна ли разница?

Спустя 7 минут, 53 секунды (17.01.2010 - 23:09) Ice написал(а):
7ion Ну библиотека есть в РНР, которая способна организовать в РНР собственную базу данных. РНР, в свою очередь, обладает набором команд для создания базы данных, создания таблиц, внесения данных в таблу, выборки данных и прочее, прочее. Подробней в мануале)


Спустя 21 минута, 49 секунд (17.01.2010 - 23:31) glock18 написал(а):
Ice
кажется, вы немного загнались. mysqli - и есть клиентская библиотека mysql. библиотека, которая не требует отдельного сервера - sqlite

Спустя 10 минут, 58 секунд (17.01.2010 - 23:42) Ice написал(а):
Цитата (glock18 @ 17.01.2010 - 20:31)
Ice
кажется, вы немного загнались. mysqli - и есть клиентская библиотека mysql. библиотека, которая не требует отдельного сервера - sqlite

согласен, перепутал, ибо сам пользовался один раз тока. Но факт остаётся фактом - такая библа есть.

Упд.

Точняк, не mysqli.dll а php_sqlite.dll

Спустя 2 минуты, 34 секунды (17.01.2010 - 23:45) 7ion написал(а):
Ice
Ну, раз ее почти не используют - то и ну ее нафиг smile.gif

Вообще, по теме мне помогут? biggrin.gif

Спустя 18 минут, 30 секунд (18.01.2010 - 00:03) Ice написал(а):
Насчёт третьего пришло в голову примерно следующее:

<?
$file = "index.txt";
$x = 0;
$num = 50;
$strlen = 4096;
if(is_file($file)){
$f = fopen($file, "a+");
while($x < $num)
{
$buffer = fgets($f, $strlen);
$buffer = preg_replace('/\\r\\n/','<br>',$buffer);
echo $buffer;
$x ++;
}
}

?>

Спустя 19 минут, 49 секунд (18.01.2010 - 00:23) 7ion написал(а):
Ice
Ну это-то понятно, не, мне все-таки так что-то не нравится.
И тем более, а если мне не с первой строки надо вывести будет? Это надо прогонять еще цикл вхолостую... Ну его.
И еще -
$buffer = preg_replace('/\\r\\n/','<br>',$buffer);

- это что за велосипед? blink.gif nl2br() не рулит?

Спустя 2 минуты, 21 секунда (18.01.2010 - 00:25) Ice написал(а):
Цитата (7ion @ 17.01.2010 - 21:23)
Ice
Ну это-то понятно, не, мне все-таки так что-то не нравится.
И тем более, а если мне не с первой строки надо вывести будет? Это надо прогонять еще цикл вхолостую... Ну его.
И еще -
$buffer = preg_replace('/\\r\\n/','<br>',$buffer);

- это что за велосипед?  blink.gif nl2br() не рулит?

я написал первое, что пришло в голову)))

Упд.

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

Переходите на базу:)

Спустя 2 часа, 28 минут, 29 секунд (18.01.2010 - 02:54) 7ion написал(а):
Ice
Про базу никто и не спорит smile.gif
Цикл гонять не придется, смотри мой код.
Гонять его придется только в случае с fgets()
А так я считал все в массивчик и потом из него выбираю, что выводить в зависимости от переданной переменной i. Кстати, надо будет ее переименовать, а то плохое название.
И мой пример будет лагать только с мегабайтным файлом, а это надо напрерывный чат в гостевой неделю вести smile.gif
fgets поэкономнее будет (возможно экономнее, мб холостые прогоны дороже выйдут), но полюбому такой код захочется отправить на govnokod.ru biggrin.gif
Так уж лучше мой способ - самый гуманный способ в мире smile.gif

Ладно уж с третьим, помогите с первым и вторым smile.gif

Спустя 4 часа, 54 минуты, 19 секунд (18.01.2010 - 07:48) twin написал(а):
Знач так. По смайликам - проблема есть везде. Даже на этом форуме. Вот пожалуйста:
 
$text = str_replace('[smile.gif]', '<img src="smail.gif" />', $text);

Используй экзотические обозначения, тильду допустим. Она редко используется: ~:/~

Что касаемо strlen(). Если юзаешь utf-8, то и функцию нужно юзать подобающую случаю. А именно mb_strlen() и с указанием кодировки. Вот так:
    elseif(mb_strlen($name, 'utf-8') > 16) 
$array_error[] = 'Ник не может быть длиннее 16-ти символов';


По поводу мазохизма. Мазохизм как раз пихать все в один файл. Кусочками читать его все равно не получится, в любом случае он каждый раз будет грузится в оперативку полностью. И только потом уже разбираться по строкам. Для того я и делал разбивку на файлы. А ты сути не уловил. smile.gif

Спустя 1 час, 13 минут, 5 секунд (18.01.2010 - 09:01) glock18 написал(а):
3. fseek
2. mb_strlen
1.
Цитата
Как этого избежать? В голову лезет только мысль заменить код смайла до htmlspicialchars спецсловом и потом изменять его, но это полная глупость.

не вижу ничего глупого

Спустя 5 часов, 43 минуты, 22 секунды (18.01.2010 - 14:45) Lex_R написал(а):
glock18
И как по вашему здесь fseek поможет?

Спустя 1 час, 3 минуты, 38 секунд (18.01.2010 - 15:48) glock18 написал(а):
Lex_R
а как еще можно считать файл не с самого начала? как fseek использовать здесь - вариантов полно.

Спустя 28 минут, 27 секунд (18.01.2010 - 16:17) Lex_R написал(а):
glock18
Допустим, в гостевой книге сообщения хранятся в файле как одно сообщение - одна строка, тогда с помощью fseek мы не может перейти на определенную строку, правильно я говорю?
Как тогда можно применить fseek?

Спустя 13 минут, 26 секунд (18.01.2010 - 16:30) glock18 написал(а):
Lex_R
немного воображения, и все становится понятно

Спустя 18 минут, 38 секунд (18.01.2010 - 16:49) Lex_R написал(а):
glock18
Пока придумал только записывать в каждой строке равное количество символов, а если длина сообщения меньше, то заменять пустоту специальными символами, тогда становится возможным переходить к любому сообщения, вычисляя его смещение, но метод конечно далеко не эффективный))

Спустя 25 минут, 6 секунд (18.01.2010 - 17:14) twin написал(а):
Сейчас родится база данных. smile.gif

Спустя 1 час, 40 минут, 7 секунд (18.01.2010 - 18:54) 7ion написал(а):
twin
Дело в том, что этот смайлик - символ того чата, он используется в каждом втором сообщении, его просто нельзя менять sad.gif
И причем на php-bb и на одном другом самописном движке все работает, хотя я никак не пойму в чем соль и как оно там умудряется работать.

Поменял на mb_strlen(). Собственно, кроме меня ту багу так никто и не заметил - так что пока полет нормальный вроде, спасибо! smile.gif
А, кстати, почему же оно сбилось? Всегда пользовался strlen() и она всегда срабатывала. А что тут не так? Вроде везде utf-8 стоит. И что будет, если передать этой функции данные не в utf-8? Ведь если у кого браузер передаст в юникоде, оно ж только восьмисимвольный ник пропустит. А если в страшной хакерской utf-7? huh.gif
Добавил: пришло в голову, что пробелы отображались как %20. Может такое быть?

Ну, у меня вроде чатик и не масштаба "ВКонтакте", там онлайн колеблется в районе трех человек (примерно думаю так) smile.gif
Так что ладно, по-моему так удобнее, ведь навигация, навигация-то! А если человек захочет прочитать с пятого сообщения? Это значит надо открыть файл 1, прочитать из него вторую половину, открыть файл два, прочитать первую половину. Разве не глупость? А у меня любой i передай - и все пучком, что хочешь покажет smile.gif Навигация на совесть сделана smile.gif

glock18
Откуда ж я узнаю - сколько мне этих самых байтов нужно? fseek() же на байты смещает, а не на строки. Юзать в связке с ftell()? huh.gif Ну, и если файл все равно будет полностью грузится, то, по сути, я избавляюсь только от массива, но зато буду постоянно обращатьсяк файлу - fgets(); ftell(); fseek();. Разве это производительнее? unsure.gif

И заменять один единстенный смайлик спецсловом - правда глупость. Можно, правда, заменять все смайлики на ~smilename.gif~ до htmlspecialchars, а потом, после убирать тильды и подставлять <img src="/smiles/'.$smile.'" alt="" />... Но это работа с регулярками, а я их пока не осилил. Да и тоже как-то некрасиво.

Спустя 7 минут, 24 секунды (18.01.2010 - 19:01) twin написал(а):
Цитата
И заменять один единстенный смайлик спецсловом - правда глупость.

При твоем раскладе - вовсе нет. Скорее всего твой вариант с ~smilename.gif~ вполне оправдан Это даже (с натягом) имеет определение - токены. Такчто...

Все остальное - вольному воля. Чуть позже поймешь свои ошибки. Это не критично пока. smile.gif

Спустя 2 минуты, 22 секунды (18.01.2010 - 19:04) glock18 написал(а):
Цитата
Ну, и если файл все равно будет полностью грузится, то, по сути, я избавляюсь только от массива


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

Спустя 18 минут, 38 секунд (18.01.2010 - 19:22) 7ion написал(а):
twin
Токены? Это что-то типа определенной последовальности ключевых символов? huh.gif
И можно озвучить мои ошибки, спорить не буду, просто интересно smile.gif

И что с mb_strlen()? Злобный хацкирь не заставит повести ее как-то иначе?

glock18
Определенная длина строки в байтах? Эээ... Я не умею так писать, чтобы строка была ровно столько байт. И тем более - если сообщение длинное? Я ж не знаю, сколько строк надо считать. Это значит надо читать файл в цикле, анализировать каждую строку...
Нет, все-таки мой способ с массивами мне кажется легче и ближе, хотя я сам сторонник того, что, если возможно и это не бует вредить производительности и коду, то лучше решить это без громоздких массивов.
К примеру, я никогда не буду работать с числами как со строкой, я буду работать с ними как с массивом, и никаких мне substr() и конкатенкаций не надо, как пишут умные книги.

Спустя 27 минут, 37 секунд (18.01.2010 - 19:50) 7ion написал(а):
Кстати, я вот подумал... Поставлю я регулярку, то, что между двумя тильдами ставить в img. И вот, злобный кулхацкирь вводит что хочет между двумя тильдами - и вот нам XSS.
Мой способ тогда явно не катит.
А делать два списка замена (сначала код на ~smile.gif~, а потом то, что должно быть внутри ~~) - еще большая глупость sad.gif

Спустя 1 час, 14 минут, 5 секунд (18.01.2010 - 21:04) twin написал(а):
Ошибки неоднократно озвучены. Как бы ты не изголялся, весь файл придется грузить в оперативку. А значит все твои поползновения с чтением файла построчно, что бы сэкономить место в массиве несостоятельны. Гораздо проще грузить нужный в данный момент маленький файл и смотреть что в нем. Потому что запись происходит гораздо реже чтения.

Про хакеров непонял... Если ты будешь использовать не preg_replace а str_replace, то о каком вообще хакинге речь?

А на счет смайликов - эксперементируй. Нет рецепта, сто раз сказано. smile.gif

Спустя 26 минут, 25 секунд (18.01.2010 - 21:30) 7ion написал(а):
twin

Но зато навигация будет железно вкопано на этих файлах.
А чтобы сделать навигацию не с 1-го сообщения, а с 3-го, надо будет жутко изголятся.
Ну, в принципе, пофиг - не лагает - и здорово laugh.gif

Про хакеров - это я про mb_strlen():

Цитата
А, кстати, почему же оно сбилось? Всегда пользовался strlen() и она всегда срабатывала. А что тут не так? Вроде везде utf-8 стоит. И что будет, если передать этой функции данные не в utf-8? Ведь если у кого браузер передаст в юникоде, оно ж только восьмисимвольный ник пропустит. А если в страшной хакерской utf-7? 
Добавил: пришло в голову, что пробелы отображались как %20. Может такое быть?

Спустя 17 минут, 52 секунды (18.01.2010 - 21:48) 7ion написал(а):
Решил проблему со смайлом таким способом:

nl2br(smiles(htmlspecialchars(str_replace(';/', ':/', $mess[2]))))

Уж ничего умнее не придумал sad.gif

Чоооорт. Теперь http:// попало под раздачу.
Эх, ладно, тут я хотя бы потом сделаю функцию бб-кодов и просто поставлю ее раньше смайликов.
Только придется как-то писать регулярку, которая не будет давать заменять символы на смайлы в html-тегах <a> и <img>.

Спустя 22 минуты, 45 секунд (18.01.2010 - 22:11) twin написал(а):
Цитата
Про хакеров - это я про mb_strlen():
Цитата
А, кстати, почему же оно сбилось? Всегда пользовался strlen() и она всегда срабатывала. А что тут не так? Вроде везде utf-8 стоит. И что будет, если передать этой функции данные не в utf-8? Ведь если у кого браузер передаст в юникоде, оно ж только восьмисимвольный ник пропустит. А если в страшной хакерской utf-7? 
Добавил: пришло в голову, что пробелы отображались как %20. Может такое быть?

Дело не в кодировке файлов. Дело в функции, которая может корректно работать с многобайтными кодировками. strlen() не может. Изучаем кодировки, я так понимаю ты занимаешься изучением, а не ляпаньем гостевух.

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

А про файлы и навигацию подумай на досуге внимательно. Мож осенит. smile.gif

Спустя 7 минут, 40 секунд (18.01.2010 - 22:19) 7ion написал(а):
А, значит mb_strlen() корректно обработает данные, полученные ею в любой кодировке, но мы просто ей указываем основную кодировку?

И что-то ничего про навигацию на ум не приходит. Все равно надо будет открывать два файла, по-любому.

Спустя 48 минут, 14 секунд (18.01.2010 - 23:07) 7ion написал(а):
Еще вопрос назрел.
Нашел в Интернете рекомендации использовать в html-коде не <?php echo $var ?>, a <?=$var;?>. Это по стандартам или что-то не очень хорошее?
Можно использовать? smile.gif

Спустя 6 минут, 15 секунд (18.01.2010 - 23:13) twin написал(а):
Это допустимо, но не приветствуется. Короткие теги (шор-теги) могут быть использованы только тогда, когда они разрешены в php.ini. А не каждый хостинг это делает. Лучше судьбу не искушать.

Спустя 40 минут, 44 секунды (18.01.2010 - 23:54) 7ion написал(а):
twin

<?php=$var;?>

А если так? huh.gif

Спустя 4 минуты, 34 секунды (18.01.2010 - 23:59) twin написал(а):
А попробовать?

Спустя 45 минут, 5 секунд (19.01.2010 - 00:44) 7ion написал(а):
Понятно, не работает biggrin.gif

А как заэкранировать от интерпретатора php в шаблоне эту строку:
<?xml version="1.0" encoding="utf-8"?>

А то интерпретатору она не нравится.

Спустя 11 минут, 49 секунд (19.01.2010 - 00:55) 7ion написал(а):
И как создать/удалить новый файл
а) в папке со скриптом
б) в произвольной папке на хостинге
file_put_contents не предлагать.
И еще - php-файл может удалить сам себя?

И мне посоветовали вместо deny from all для закрытых директорий писать
<Limit GET POST PUT>
Order Allow,Deny
Deny from All
</Limit>
Это лучше или как? smile.gif

Спустя 9 часов, 36 минут, 58 секунд (19.01.2010 - 10:32) twin написал(а):
Цитата
А как заэкранировать от интерпретатора php в шаблоне эту строку:
<?xml version="1.0" encoding="utf-8"?>


<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>


Остальные вопросы довольно объёмны, создай отдельну. тему

Спустя 20 дней, 8 часов, 25 минут, 5 секунд (11.02.2010 - 18:57) JOIN написал(а):
Здравствуйте ! Возможно я и повторяюсь, но у меня возникла похожая проблема с функцией mb_strlen() кодировка utf-8. Вот что пишу

mb_internal_encoding('utf-8');
$fff="ВАСЯ 01";
echo mb_strlen($fff,'utf-8');



и ничего не выводит. вообще!! подскажите пожалуйста, что с этим делать, уже все что мог предпринял... sad.gif

Спустя 31 минута, 37 секунд (11.02.2010 - 19:29) JOIN написал(а):
Наверное, у меня модуля mbstring нет, как его поставить ?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.