- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
srp_base64_table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./"
def srpb64decode(s):
ints = [srp_base64_table.index(c) for c in s]
pad = len(ints) % 4
if pad != 0:
pad = 4 - pad
ints = [0 for i in range(0, pad)] + ints
notleading = False
buf = []
pos = 0
while pos < len(ints):
b = (ints[pos] << 2) | ((ints[pos+1] & 0x30) >> 4)
if notleading or b != 0:
buf.append(b)
notleading = True
b = ((ints[pos+1] & 0x0f) << 4) | ((ints[pos+2] & 0x3c) >> 2)
if notleading or b != 0:
buf.append(b)
notleading = True
b = ((ints[pos+2] & 0x03) << 6) | ints[pos+3]
if notleading or b != 0:
buf.append(b)
notleading = True
pos += 4
return bytes(buf)
def srpb64encode(b):
pos = len(b) % 3
b0 = 0
b1 = 0
b2 = 0
notleading = False
buf = ""
if pos == 1:
b2 = b[0]
elif pos == 2:
b1 = b[0]
b2 = b[1]
while True:
c = (b0 & 0xfc) >> 2
if notleading or c != 0:
buf += srp_base64_table[c]
notleading = True
c = ((b0 & 3) << 4) | ((b1 & 0xf0) >> 4)
if notleading or c != 0:
buf += srp_base64_table[c]
notleading = True
c = ((b1 & 0xf) << 2) | ((b2 & 0xc0) >> 6)
if notleading or c != 0:
buf += srp_base64_table[c]
notleading = True
c = b2 & 0x3f
if notleading or c != 0:
buf += srp_base64_table[c]
notleading = True
if pos >= len(b):
break
b0 = b[pos]
b1 = b[pos + 1]
b2 = b[pos + 2]
pos += 3
return buf
Кодирование и декодирование блобов для openssl SRP.
А я построю свой диснейленд с блекджеком и шлюхами! (c) тот, кто пилил SRP в openssl
bormand 23.04.2014 21:58 # −1
bormand 23.04.2014 22:03 # −1
guest 24.04.2014 12:13 # +47
gost 24.04.2014 14:10 # −1
guest 24.04.2014 14:12 # +47
LispGovno 24.04.2014 15:00 # −1
bormand 25.04.2014 10:00 # −1
Там в модуле srp вообще внезапное бейс64 используется - таблица символов совсем другая, и паддинг слева(!). Причем лишние ведущие нули отбрасываются. Видимо числа в таком формате компактнее хранятся...
guest 25.04.2014 12:53 # +46
bormand 25.04.2014 13:07 # −1
guest 25.04.2014 13:17 # +44
guest 25.04.2014 09:44 # +1
bormand 25.04.2014 09:52 # −1
WGH 25.04.2014 15:10 # −1
bormand 25.04.2014 15:27 # −1
WGH 25.04.2014 15:39 # 0
Вместо buf напрашивается его использовать.
bormand 25.04.2014 15:48 # −1
guest 25.04.2014 16:29 # +47
WGH 25.04.2014 16:37 # −1
bormand 25.04.2014 16:39 # −1
WGH 25.04.2014 16:41 # 0
bormand 25.04.2014 16:49 # −1
Похоже на что-то типа O(N*log(N))... Или я туплю?
WGH 25.04.2014 16:51 # −1
http://ideone.com/3bBJT9
Так что отвечаю на вопрос s-a--m: используй list в качестве unicodearray.
guest 25.04.2014 17:02 # +46
Видишь ты код с bytes += bytes2. Если у тебя это где-то начнет выдавать плохую асимптотику, заменяешь bytes на bytearray и все заебись. А теперь вопрос - почему не сделать такое же для юникода?
Плюс в тройке bytes должен вылететь сразу, когда ты попытаешься добавить туда что-нибудь другое, например, юникод, а списке - когда джойнить будешь, и по исключению хуй поймешь где это произошло.
WGH 25.04.2014 17:18 # −1
roman-kashitsyn 25.04.2014 16:44 # +2
roman-kashitsyn 25.04.2014 16:47 # +2
как оптимизирована? можно ссылку?
строки в питоне иммутабельные, как можно оптимизировать их сложение по сравнению с деструктивным буфером?
WGH 25.04.2014 16:54 # −1
Внизу, где Notes, пункт 6.
В третьем питоне такого примечания нет (чего я не знал), там прямо сказано: Concatenating immutable sequences always results in a new object.
guest 25.04.2014 17:03 # +46
WGH 25.04.2014 17:11 # −1
http://hg.python.org/cpython/file/4f79c3827adc/Python/ceval.c#l4779
guest 25.04.2014 17:14 # +43
str = 'a'
str2 = str
str += 'b'
Чтобы str2 было 'a', а str=ab. Оно проверяет количество ссылок на объект? Оригинально, как лишп, прямо.
А что оно там делает, если 2 ссылки?
WGH 25.04.2014 15:42 # −1
bormand 25.04.2014 15:47 # −1
WGH 25.04.2014 15:52 # −1
guest 25.04.2014 16:29 # +44
guest 27.04.2014 03:02 # +47
Сравните, где лучше читается алгоритм - в версии на си или моей на питоне?
bormand 27.04.2014 07:49 # −1
guest 27.04.2014 15:16 # +44
bormand 27.04.2014 16:12 # −1
Там, как оказалось, тот еще квест ;) В лучших традициях прыщеблядства, как ты его называешь.
Потом на форуме туториал отпишу в отдельной теме, может кому-то еще пригодится.
guest 27.04.2014 16:14 # +48
bormand 27.04.2014 18:40 # 0
LispGovno 27.04.2014 22:30 # −1
LispGovno 27.04.2014 22:39 # 0
Под виндой собирали? Там симлинки нормально сохранились? На фат разделе это даже не собрать?
> openssl, выполнив в msys'ной консоли
Ну как-то не модно. Нужно было все команды записать через &&. Шучу. Где make install или препаковка перед установкой в пакет?
bormand 27.04.2014 22:44 # +1
Не, под виндой tar -xf их тупо пропускает. Зато потом конфигур их пересоздает, если их нет. Так что соберется где угодно.
А жопа с 7z и winrar в том, что они эти симлинки извлекают из tar'а как файл, внутри которого написано имя объекта, на который ссылался симлинк. Конфигур видя эти файлы не заменяет их на копии нормальных. И все ломается.
> Где make install
Вопрос к авторам либы. Думаешь от хорошей жизни ручками копировали файлы от openssl? :)
> пакет?
msm что ли? Какие еще пакеты под виндой?
bormand 27.04.2014 22:49 # +1
Потестил еще раз - тупо делает копию файла. Даже на нтфс.
WGH 27.04.2014 23:04 # +1
P.S. Но вряд ли это спасёт tar.
guest 27.04.2014 23:13 # +47
ЧТОААА?
bormand 27.04.2014 23:32 # 0
WGH 27.04.2014 23:37 # +2
guest 27.04.2014 23:39 # +45
inkanus-gray 29.04.2014 11:54 # +2
Да, кстати, чем отличается /D (симлинк) от /J (джойн)?
Есть ещё вариант — сторонний софт. Виндоюзеры ищут софт для того, что должно быть из коробки.
LispGovno 27.04.2014 22:51 # −1
> ./config shared
Вроде же обычно configure и что здесь означает shared?
> cp -r include c:/test/openssl-1.0.1g-inst
А что тут происходит?
> export ZLIB_PATH=c:/test/zlib-1.2.8
А тут?
bormand 27.04.2014 22:53 # +2
То ты ебанулся. Тут и нативно то еле собирается, а ты еще кросскомпиляцию захотел...
> Вроде же обычно configure и что здесь означает shared?
Вопрос к авторам либы :) shared - то что собирать дллки, а не только статику.
> А что тут происходит?
Рекурсивное копирование, не?
> А тут?
Эм, переменную окружения замутили и экспортнули... Что не так?
LispGovno 27.04.2014 23:03 # −1
Ну это понятно. Я просто на виндовом set остановился. Меня интересует что значит экспортнули?
С остальными пунктами все ясно... То есть ты настоятельно рекомендуешь собирать под нужный таргет всегда на таргете? А как же всякие телефоны с эплом или андроидом? Не на них же самих собирать. Понятно что с моим последнем примером вопрос больше провокационный, но все же.
Abbath 27.04.2014 23:08 # −1
Сам же и ответил.
LispGovno 27.04.2014 23:10 # −1
PS: Как Борманд так быстро отвечает на комментарии? Неужели говнутифи?
guest 27.04.2014 23:14 # +47
Передали в шелл из которого этот шелл запустили.
>А как же всякие телефоны с эплом или андроидом? Не на них же самих собирать.
А в чем проблема? Там гектар оперативы и хотя бы двухядерник.
bormand 27.04.2014 23:16 # +1
Не совсем... Если написать var=val, то переменная будет доступна только текущему шеллу, если экспортнуть - то и все запускаемым из него прогам.
LispGovno 27.04.2014 23:21 # −1
bormand 27.04.2014 23:26 # +1
WGH 27.04.2014 23:33 # +1
Нет, в случае шелла в окружение это не попадает.
LispGovno 27.04.2014 23:25 # −1
> Передали в шелл из которого этот шелл запустили.
экспорт в текущем шеле приводит к наследованию потомками этой переменной окружения, а в родительском шеле это выглядит как var=val и при этом не наследуется его потомками, все верно? А что будет если я в своём приложении выполню например через stdlib.system var=val или export? Родительский шел что-нибудь узнает?
bormand 27.04.2014 23:27 # 0
Нет конечно. Передача односторонняя.
Ибо передавать переменные окружения от детей к родителям несекурно и ненадежно. Получилась бы херня на порядок опасней чем register globals в php.
P.S. А вот от передачи каких-нибудь структурированных результатов помимо stdout и exit code я бы не отказался ;)
LispGovno 27.04.2014 23:32 # −1
bormand 27.04.2014 23:40 # 0
Да как он это сделает то? :) Это же было бы страшное колдунство с IPC, да еще и работающее не всегда... Вдруг предок - другой шелл, или вообще не шелл, или тупо сдох...
guest 27.04.2014 23:38 # +45
bormand 27.04.2014 23:41 # +1
Дык баты исполняются в том же шелле...
Линупсовый аналог такого режима будет source script.sh вместо script.sh.
guest 27.04.2014 23:53 # +47
bormand 27.04.2014 23:58 # +1
Ну да. Причем тот, который указан в шабанге запускаемого скрипта.
LispGovno 28.04.2014 00:03 # −1
То есть если я в своем шкрипте напишу только строку EXPORT блабла=бла, то это будет бесполезная лажа и я зря напишал этот шкрипт, тк оно выкинется в помойку по завершению шкрипта? А как это обойти, чтобы из шкрипта вызвать шкрипт и экшпорт в шкрипте-потомке попал в шкрипт предок?
bormand 28.04.2014 00:06 # 0
Только через source child.sh. Больше никак.
bormand 27.04.2014 23:22 # 0
Если есть такая возможность - да. Ибо кросскомпиляция по определению жопа, с которой не стоит связываться без уважительной причины.
LispGovno 27.04.2014 23:30 # 0
LispGovno 27.04.2014 22:58 # −1
А что он там делает? Там же сырцы должны лежать.
> mingw32-make mingw32-ssl-zlib-srp
Это какой-то особый мингевешный мейк mingw32-make и мейк файл он берет из mingw32-ssl-zlib-srp?
А пакеты под линь приходилось собирать? Допустим хочу собрать deb. Например я к своей проге накатал руками мекфайл. Какие там ещё этапы важные? Или там это только начало и мне ещё придется накатать тонну прыщей?
bormand 27.04.2014 23:12 # 0
Ну где собрали, там и лежит :) out of directory build я на винде не рискнул пробовать, да и он может тупо не поддерживаться кривожопыми самодельными конфигуряторами.
> мейк файл он берет из mingw32-ssl-zlib-srp
Это таргет. Файл у мейков задается через -f.
> Допустим хочу собрать deb. Например я к своей проге накатал руками мекфайл. Какие там ещё этапы важные?
Не, там совсем немного - описание, правила сборки и еще немного никому не нужного мусора типа чейнджлогов.
LispGovno 27.04.2014 23:34 # −1
bormand 27.04.2014 23:37 # +1
Если для себя - то все это нинужно.
Если пропихивать - то сборка деба всяко будет для тебя самой простой из проблем :)
LispGovno 27.04.2014 23:43 # 0
Вот кстати да. Тоже интересно. Вон в бусте жесткий контроль кода, документации, тесты, ждешь кодеревьювера пару лет и тд. А у этих как? Как они там бюрократничают в андроиде или в репах убунты? В конце концов можно свой репсервер наверное завести, если будет в ихних сильно жестко.
bormand 27.04.2014 23:47 # +1
В гуглплей - платишь 20 баксов и распространяешь что хочешь ;) Пока твою учетку не выпилят за вирей отправлялки смс и детский прон.
> в репах убунты?
Вроде как довольно жестко. Но полегче чем в бусте.
LispGovno 27.04.2014 23:48 # 0
Вирусы.
guest 27.04.2014 23:52 # +44
guest 27.04.2014 23:52 # +43
bormand 27.04.2014 23:53 # +1
Дык защита от школоты и прочих долбоёбов ;) Там и так то все засрано, представь что было бы, если бы можно было бесплатно выкладывать...
Один раз в жизни заплатить 20 баксов это разве много? В виндовом маркете вроде как $40 было, тоже по сути копейки. А вот про iOS лучше забудь ;)
guest 27.04.2014 23:56 # +46
bormand 27.04.2014 23:57 # −1
Там вроде бы какой-то робот еще проверяет файлы. Ну и не все юзеры любят ставить проги с правами в духе "отправка SMS" и "чтение SMS".
roman-kashitsyn 28.04.2014 00:31 # +2
Есть ещё такая штука - PPA. можно захостить свой репозиторий на сервере бубунты и заливать туда пакеты, потом на любой машине подключать его одной командой. Я себе завёл архивчик.
LispGovno 28.04.2014 00:37 # −1
> на сервере бубунты
ЭЭэ. Апстор бубунты или убунту ван?
Abbath 28.04.2014 00:53 # +1
LispGovno 27.04.2014 23:39 # −1
А ещё мне не понятно как он пакетный менеджер деинсталить будет мои файлы. мало ли что я куда напихал...
bormand 27.04.2014 23:46 # +1
Опять же - для внутренних нужд - всем похуй. Как удобней так и раскладывай. Можешь вообще в /opt/yourprogram захуярить, если лень читать доки.
> тригеры какие-то
Ну это уже advanced магия, если просто копирования файлов недостаточно, и надо что-то подкрутить после установки/перед удалением.
> А ещё мне не понятно как он пакетный менеджер деинсталить будет мои файлы. мало ли что я куда напихал...
Так он знает куда чего ложил при установке ;)
LispGovno 27.04.2014 23:57 # −1
Он слежение что-ли включает со стороны системы за моим инсталятором и записывает обратный лог для деинсталятора? Магия какая-то...
> надо что-то подкрутить после установки/перед удалением.
Типа как в винде 1% установлено обновлений перед загрузкой или перед выключением? Типа на это действие регистрируешь свой обработчик?
В моём мейкфайле вроде что-то собирается на моей конкретной машине, но как при сборке в пакет зафигачить зависимости от библиотек тех что нужно доставить дополнительно? И вообще как линух разруливает зависимости? На каждое приложение напихивает симлинки на файлы нужных версий в зависимости от того какие префиксы передал в мейкфайл приложения?
bormand 28.04.2014 00:03 # +1
Ну вот например пост-установочный триггер пыхи рестартит апач, чтобы он подсосал новый модуль.
Зависимости пишутся как раз в тех дополнительных файликах. Собирается deb в специальном чистом окружении... Короче читай ман, если ты реально собрался пилить. А если не собрался - то нахуй тебе заморачиваться всем этим ;)
> И вообще как линух разруливает зависимости?
1) при установке тупо не дает ставить конфликтующие пакеты
2) да, у so'шек есть версии в названиях
LispGovno 28.04.2014 00:09 # −1
А... Чистое окружение.. Чеашрутишь на пустую директорию. Типа никаких библиотек не поставлено, они накатываются на чистое окружение и вот у меня уже либа нужной версии в зависимостях. Но это работает только со статическими либами, а как это организовано для динамических? неужели и запускаются в почти чистом окружении о_О
bormand 28.04.2014 00:21 # 0
А насчет версий - там хитрая херня с именованием сошек. Лень с телефона рассказывать.... загугли если интересно.
Вкратце - большинство либ обратно-совместимые, поэтому если одной проге надо 1.0.5, второй 1.0.7, а в системе стоит 1.1.5, то они обе будут ее юзать.
LispGovno 28.04.2014 00:26 # +1
Как на этом можно на говнокоде сидеть... Никак не иначе лопата... Для лесенок то...
> одной проге надо 1.0.5, второй 1.0.7, а в системе стоит 1.1.5, то они обе будут ее юзать.
Как страшно жить... Мне кажется что-то линуксоиды не продумали. Но интересно, спасибо...
bormand 28.04.2014 06:16 # +1
В общем там есть такое соглашение, что либы с одинаковой мажорной версией обратно совместимы. Соблюдать его должен автор либы, не забывая проинкрементить т.н. soname, который вшивается в so'шку. Если не соблюдает - то он пидорас и вообще редиска.
Например у libfuck.so.6.2.4 вшит soname libfuck.so.6. Если следующая версия несоместима - она должна называться к примеру libfuck.so.7.0.1 с soname = libfuck.so.7.
В зависимости бинарников вкомпиливается не полная версия, а тот самый soname. Поэтому если прогу собирали с 6.2.4, то она будет работать и с 6.7.2 и с 6.3.5 (с 6.1.0 она работать не будет, и такую ситуацию не допустит пакетный менеджер: "или крестик сними ставь более старую прогу или трусы надень обновляй либу").
А 6.2.5 и 7.3.5 могут стоять одновременно, не мешая друг другу.
P.S. Блин, плохо поди объясняю?
LispGovno 28.04.2014 08:12 # 0
Не, вообще всё понятно. Тебе нужно что-то повышающее самоуверенность. Скилл не прокачен.(
3.14159265 28.04.2014 15:15 # −1
Только что вы могли наблюдать парадокс Даннинга-Крюгера живьём. Спасибо за внимание.
Обратный пример на этом сайте полагаю тоже все видели.
guest 28.04.2014 15:18 # +43
3.14159265 28.04.2014 17:17 # −1
Я ж твой ник не упоминал. С чего это тебя так зацепило?
guest 28.04.2014 17:56 # +41
Да ты меня затраллел, лалка :)
guest 28.04.2014 20:23 # +43
3.14159265 29.04.2014 13:26 # +1
>>Я думаю, все поняли, про кого это.
Конечно поняли.
http://govnokod.ru/15791#comment228425
http://govnokod.ru/12940#comment176220
s-a--m 8 дней назад #
Но тебе же так печет пукан от слова прыщееб
anonimb84a2f6fd141 02.05.2013 21:40 #
Блядь, да зашей ты уже себе пукан, что ты им в каждом треде сверкаешь, сучечка.
http://govnokod.ru/13413#comment187715
guest 29.04.2014 16:17 # −1
3.14159265 29.04.2014 16:46 # +2
Это просто оттого что ты совершенно не обучен логике .
3.14159265 28.04.2014 15:12 # −1
Есть еще LD_PRELOAD.
LispGovno 28.04.2014 00:17 # −1
Хз. Вон у меня куча питонов и Qt стоит. Как-то все вместе живут...
> пост-установочный триггер пыхи рестартит апач
А что он из себя представляет на системном уровне? Сигнал посикс? Я кроме названия просто про него ничего не знаю.
А мне тут один линуксоид рассказывал, что линух очень крут и вообще разруливает конфликты версий библиотек через симлинки и позволяет заменять библиотеки которые сейчас используются! тоже посредством симлинков. Это тоже должен я в своем инсталяторе как-то обеспечивать, если допустим мне это понадобится?
А ввобще исчерпывающее объяснение. Спасибо. Глядишь свой пакет соберу. Но нельзя собирать не по правилам. У меня начнется синдром незавершенности. Так что только деабинизация. :)
bormand 28.04.2014 00:30 # +1
Это сила и слабость линуха... mandatory lock'ов по умолчанию нет. Поэтому и можно творить такие непотребства как удаление открытых файлов...
Триггер? Да просто набор команд, который надо выполнить в процессе установки.Вроде бы и все...
LispGovno 28.04.2014 00:35 # −1
А что в этом плохого, если приложение не падает при этом все равно и может обращаться к старому файлу?
Abbath 28.04.2014 00:56 # 0
chtulhu 28.04.2014 08:16 # −1
почему непотребство? Замечательная вещь. Особенно, если у тубя открыто что-нибудь, что не хочет освобождать файл. Винда у меня частенько ругалась из-за того, что не могла удалить директории, т.к. они были открыты в других приложениях
1024-- 28.04.2014 14:28 # −1
У меня в Windows 8 довольно часто не хочет удалять папки из-за того, что кто-то использует служебные файлы типа thumbs.db. Иногда даже только что созданные папки так "застревают". Фиг знает, баг explorerа или вирус какой установился.
guest 28.04.2014 14:35 # +45
Abbath 28.04.2014 00:55 # +1
LispGovno 28.04.2014 00:59 # −1
Abbath 28.04.2014 01:03 # 0
LispGovno 28.04.2014 08:13 # −1
LispGovno 28.04.2014 08:18 # −1
Abbath 28.04.2014 08:26 # +1
bormand 28.04.2014 08:30 # 0
Всё будет работать ;) Там есть /etc/ld.so.conf (и соотв. папка /etc/ld.so.conf.d) в которые можно дописать дополнительные папки для поиска либ. По умолчанию там /lib и /usr/lib.
bormand 28.04.2014 12:12 # 0
LispGovno 28.04.2014 08:20 # −1
> Это таргет. Файл у мейков задается через -f.
А почему это вообще приходится собирать мингевешным мейком, а не стандартным гнутым? Как это вообще определить?
bormand 28.04.2014 08:21 # +1
Х.з., в мане по сборке так написано было, я и не стал выпендриваться. А вообще - mingw32-make и make это один и тот же файл. Чем меньше выпендриваешься - тем больше вероятность успеха ;)
guest 28.04.2014 13:48 # +37
guest 27.04.2014 23:12 # +45
Блин, а зачем тогда писал?
Edit: дочитал
guest 27.04.2014 23:15 # +28
brutushafens 28.04.2014 22:48 # −3
bormand 29.04.2014 07:20 # +1
brutushafens 29.04.2014 07:48 # 0
TarasB 29.04.2014 13:50 # +3
roman-kashitsyn 29.04.2014 13:54 # +5
brutushafens 29.04.2014 16:12 # 0
guest 29.04.2014 16:16 # 0
brutushafens 29.04.2014 16:21 # +1
eth0 29.04.2014 18:15 # −2
guest 29.04.2014 18:54 # +1
1024-- 29.04.2014 16:53 # +1
Видимо, не надо было приходить с войной и топить треды.
> Тема не актуальная, никто туда не заходит
Тут сток смотрят, потому неактуальная тема, куда никто не заходит - это свежий пост на главной с 0 комментариев :)
brutushafens 29.04.2014 16:57 # +1
1024-- 29.04.2014 17:11 # −1
Желание минуснуть оппонента.
brutushafens 29.04.2014 17:14 # +1
guest 01.05.2014 02:42 # 0
Вот поток флуда, даже ручного, его может угробить на ура.
1024-- 01.05.2014 06:36 # +1
bormand 29.04.2014 17:15 # −2
Х.з., этот пост я не трогал.
> http://govnokod.ru/15852#comment230006
За пригорания от минусов.
> http://govnokod.ru/15817#comment230025
Стековерфлоу там >>>
brutushafens 29.04.2014 17:18 # −2
1024-- 29.04.2014 17:26 # +2
brutushafens 29.04.2014 17:35 # +1
inkanus-gray 29.04.2014 17:37 # +4
guest 01.05.2014 02:42 # 0
Борманд, скажи честно, ты сам там хоть раз спрашивал?
3.14159265 29.04.2014 13:57 # +2
Скажи мне кто твой друг, и я скажу кто ты.
brutushafens 29.04.2014 16:14 # 0
3.14159265 29.04.2014 16:40 # +1
Я сейчас чуть не обосрался от страха что меня будут минусовать.
brutushafens 29.04.2014 16:42 # +1
TarasB 29.04.2014 17:18 # +4
3.14159265 01.05.2014 00:33 # +2
Бугага три раза. А то я смотрю какой-то ты бесчувственный...