RSS
# Клиенты ii/IDEC для ретрокомпьютеров
idec.talks
shaos(spnet, 2) — All
2024-10-06 09:23:20


Я правильно понимаю, что только я взялся писать клиента для ретрокомпов в 2021 году и до этого никто даже не пытался? Если кто забыл, то я начал писать клиента IDEC на ассемблере Z80 для продвинутого спектрум-клона Sprinter Sp2000 в конце декабря 2021 года, транслируя процесс на ютюб "вживую":

https://youtube.com/live/p20rd0bqZTs
https://youtube.com/live/uwEiQIeD5cw

(причём вотрое видео было ещё и встречей 2022 года)

С тех пор я несколько охладел к Спринтеру, однако написанное терять не хотелось бы, поэтому я могу переиначить написанное и продолжить присать IDEC клиента скажем для ZX-спектрума с сетевой карточкой Spectranet (где используется тот же WizNet чип, что и в моей сетевой карточке для Спринтера - W5100) ну либо вообще асбтаргироваться до уровня системы команд i8080A (КР580ВМ80А) и сделать возможным чтобы этот код ещё и на старых советских компьютерах работал типа Радио-86РК, Апогей, ПК-01 Львов и т.д.

# develop.16 и ping
idec.talks
doesnm(tgi,8) — All
2024-10-04 07:35:06


Хотел забирать develop.16 с пинг ноды чтобы читать в read only
Написал такое:
```
nodename ping
node https://club.hugeping.ru
echo develop.16
```
При синхронизации пишет:
Работа с https://club.hugeping.ru/
ОШИБКА
ОШИБКА
Нажмите Enter для продолжения
```
+++ Никто не знает, как правильно. Так зачем же выдумывать правила?

# Новая эха spnet.stats
idec.talks
shaos(shaos, 2) — All
2024-10-03 07:03:45


Создал у себя на ноде новую эху, куда раз в сутки буду засылать статистику по 10 самым активным визитёрам ноды (отдельно считаются активные минуты поинтовых запросов и активные минуты веб запросов):

https://sprinternet.io/iii-web.php?echo=spnet.stats

Иногда буду сюда перепосылать, если что интересное вылезет ;)

Кроме того сделал выписывание активных аплинков внизу вебстраницы вот в таком виде:

Last day top uplinks: tavern 41.7MB (5/hr), tgi 4.1MB (2/hr), ping 3.2MB (5/hr), Google 0.8MB (1/hr), Facebook 0.1MB

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

# urlы
ping.local
btimofeev(ping,6) — All
2024-10-01 15:45:57


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

К примеру, я хочу написать несколько ссылок через запятую https://linux.org.ru, https://opennet.ru(или так https://nethack.org), или пример с точкой https://crawl.develz.org.

# Другие эхи
idec.talks
doesnm(tgi,8) — All
2024-09-30 08:50:18


Мне кажется выбрав tgi как станцию я многое упускаю. Из эх тут по сути есть только idec.talks и на нее я подписан
Как можно дотянутся до других эх в этой сети?

+++ Никто не знает, как правильно. Так зачем же выдумывать правила?

# Оригинальный сервер ii
idec.talks
shaos(shaos, 2) — All
2024-09-29 05:13:16


Ни у кого не сохранилось? Для истории так сказать - версии от 0.1 до 0.5 (последняя?)
Веб-архив тупит https://web.archive.org/web/20140703233815/http://ii.51t.ru:80/
Вроде чегой-то лежало на битбакете по адресу https://bitbucket.org/51t/ii/
Теперь нету :(

# Игры по ii
idec.talks
shaos(shaos, 2) — All
2024-09-27 23:29:13


Если кто застал в конце 90-х начале нулевых были такие игры по E-mail - посылаешь свой ход некоему роботу емейлом и получаешь ответ через какое-то время, когда все игроки сделали свои ходы - а вот игры по ii (IDEC) кто-то когда-то делал?…

# Анархия хэшей
idec.talks
shaos(shaos, 2) — All
2024-09-27 16:18:11


В создании хэшей царит полная анархия я смотрю:

спек говорит заменять + и / на что-нибудь например 'A' и 'Z' (like A and Z for example)

ii-php заменяет на 'A' и 'z' (большинство старых сообщений сгенерировано так)

ii-go заменяет на 'A' и 'Z'

а вот iing имеет вот такой код

6d083914 (Andrew Lobanov 2017-06-05 11:21:48 +0500 52) def hsh(str):
438e377e (Andrew Lobanov 2017-06-05 12:35:50 +0500 53)     out = base64.urlsafe_b64encode(hashlib.sha256(str).digest()).decode("utf-8")
438e377e (Andrew Lobanov 2017-06-05 12:35:50 +0500 54)     return out.replace('-', '').replace('_', '')[:8].ljust(8,'A')

я не сильно флюент в пайтоне, но вроде это значит выкинуть - (используется вместо + в base64url) затем выкинуть _ (используется вместо / в base64url) потом взять 8 символов от начала и в конце сделать ljust(8,'A') который при данном раскладе не делает ничего?...

# Избыток абстракций
develop.16
Andrew Lobanov(tavern,1) — All
2024-09-27 13:26:55


Как бороться с сабжем в легаси-коде? Попадаются прямо такие вещи, что я проямо колдобюсь, когда сталкиваюсь.

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

Я ещё могу нафантазировать зачем нужен счётчик ReadLock'ов в RWMutex, но вот в самом обычном мьютексе это нафига? Причём реально по всему проекту этот счётчик не используется нигде.

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

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

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

+++ Лично я вижу в этом перст судьбы – шли по лесу и встретили программиста.

# Кроссплатформенный календарь на текстовых файлах
develop.16
tuple(ping,54) — All
2024-09-27 12:52:27


Долго искал таковое решение, но не нашёл вообще. А именно: хотелось бы иметь файл или кучку файлов в одном календарном просто текстовом формате, которые будут распознаваться и просматриваться соответствующим календарным софтом и на linux, и на android.

А ещё хотелось бы, чтобы можно было не только просматривать через интерфейс приложений, но и редактировать события, а также уведомления, основанные на времени события... Но это так - мечты.

Существует ли такое решение у кого-нибудь?

---
Из найденного самое ближайшее это использование calcurse - https://github.com/avidseeker/awesome-syncthing#icsx5 . Однако это работает только в одну сторону...

# Новая RSS-эха на английском языке - bot.slashdot (News for Nerds from slashdot.org)
idec.talks
shaos(shaos, 2) — All
2024-09-26 10:33:31


Сделал новую RSS-эху, которая будет обновляться автоматически каждый час:

http://shaos.net:8085/ii-web.php?echo=bot.slashdot

Подписывайтесь :)

Shaos

# fetches.txt
idec.talks
shaos(shaos, 2) — All
2024-09-26 07:53:39


Возвращаясь к теме 3-летней давности - нет желания добавить на узлы (хотя бы вручную) файл /fetches.txt чтобы можно было автоматически строить топологию сети время от времени?

ii://N9RNo0fkT9a9aolTxpaa

Как минимум Ordos(tgi,1) был за ;)

И что-то для идентификации узла через API надо сделать - например /nodename.txt с коротким именем станции внутри (типа там tavern, tgi, ping и т.д.) и можно количество поинтов ещё присовокупить после двоеточия...

# Вопрос
idec.talks
doesnm(tgi,8) — All
2024-09-25 14:51:58


Кто как ходит в IDEC? Я пока поставил Caesium в Termux, но делать cd ~/caesium и python caesium.py постоянно неудобно
Может вообще хранить где нибудь в Maildir и через Dovecot сделать уведомления в почтовый клиент? Ибо я даже не заметил небольшого наплыва актива в сети

+++ Никто не знает, как правильно. Так зачем же выдумывать правила?

# python.15
idec.talks
shaos(tavern,34) — All
2024-09-25 06:35:22


А почему вот эта эха отовсюду выпилена? Питон нынче не в моде? ;)

python.15 44 Python и разные проекты на нём

# dynamic.lessmore.pw
idec.talks
shaos(shaos, 2) — All
2024-09-23 12:27:23


А что случилось с сабжем?
Difrex тоже ушёл из сети?…

# Первая коллизия???
idec.talks
shaos(shaos, 2) — All
2024-09-22 07:05:07


Всем привет кто ещё тут!
Какое-то время назад в эхе idec.talks прилетело ко мне сообщение не в тему (причём со старой датой):
http://shaos.net:8085/IDEC-dup.png
А сегодня я обнаружил, что хэш этого сообщения упоминается в двух эхах:
idec.talks:v2gj6Qx0JJmoNlcjcJlg
lor-opennet.17:v2gj6Qx0JJmoNlcjcJlg
Получается в idec.talks пришло сообщение, которое по хэшу совпало со старым сообщением от сентября 2019 года в lor-opennet.17?

Shaos

# Всем привет
idec.talks
doesnm(tgi,8) — All
2024-07-20 10:49:40


Наконец-то дошли руки зарегистрироваться на какой нибудь публичной станции IDEC, до этого сидел в r/o.
Протокол интересный, узнал случайно читая другой форум.
Как тут вообще дела? На почте писали что жалуются что сеть мертвая, но никто не пользуется

+++ Никто не знает, как правильно. Так зачем же выдумывать правила?

# Я снова с новой эхой
idec.talks
Andrew Lobanov(tavern,1) — All
2024-06-03 13:20:55


Сабж. В таверне появилась эха m.d.s. Да-да, по мотивам той самой культовой радиопередачи. Публикую там небольшие рассказы (не свои).

+++ Лично я вижу в этом перст судьбы – шли по лесу и встретили программиста.

# Бездна Света
std.game
Andrew Lobanov(tavern,1) — All
2024-05-02 07:04:31


Даже на ЛОР новость есть, а тут тишина.

Василий Воронков (автор игр "Переход", "Материк" и "Лидия") выпустил новую игру "Бездна Света".

Игра для «классического» INSTEAD, использующая графику и музыку. Время прохождения — более 6 часов.

Экипаж ГКМ «Грозный» отправляется к орбитальной станции «Кабирия», последнему рубежу
исследованного человеком космоса, где ему предстоит столкнуться с чем-то нечеловеческим.

+++ Лично я вижу в этом перст судьбы – шли по лесу и встретили программиста.

# Новая RSS-эха
idec.talks
Andrew Lobanov(tavern,1) — All
2024-04-25 06:28:30


Сабж. После ухода Виктора из сети, кончилась и ii://lor-opennet.17. Я всё таки созрел подхватить её, но не люблю я цифровые постфиксы, доставшиеся нам в наследство с лохаматых годов.

Так что, на таверне запущена новая эха: ii://lor.opennet :)

+++ Лично я вижу в этом перст судьбы – шли по лесу и встретили программиста.

# А ведь пропустили
idec.talks
Andrew Lobanov(tavern,1) — All
2024-04-15 10:03:30


26 марта 2014 года была выпущена в свет ii версии 0.1. Если кто не знает или забыл, ii это основа, на которой создана idec, который мы тут с вами вяло, но всё же пользуемся. Таким образом, этой движухе уже 10 лет :)

+++ Лично я вижу в этом перст судьбы – шли по лесу и встретили программиста.

# Трудная проблема сознания в фильме "Престиж" Кристофера Нолана
std.hugeping
hugeping(ping,1) — All
2024-04-14 09:12:54


Посмотрел фильм Кристофера Нолана "Престиж". Сам фильм, как мне кажется, образец продукта для масс-культуры. Как комикс: захватывает, будоражит, развлекает. И в этом контексте даже фентезийный Тесла в фильме вполне уместен. Но меня заинтересовала не драматическая составляющая, а отсылки к трудной проблеме сознания. Ведь то что происходит каждый раз с фокусником (Энжиером) когда он заходит в машину Теслы -- интересный мысленный эксперимент.

Фокусник заходит в машину клонирования и в следующий миг (падая в резервуар с водой) умирает. Но созданная только что чудесным образом копия -- продолжает жизнь и как ни в чём не бывало выходит к публике с другой стороны сцены.

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

Фокусник, выполняя фокус с перемещением, не знает точно какой субъективный опыт его ждёт. Вот, он заходит в машину. Что будет в следующий миг? Мучительная смерть в закрытом резервуаре с водой или выход к публике под оглушительный гром аплодисментов?

Наивный ответ звучит так. Конечно, он испытает ужас смерти. Субъект -- это фокусник, заходящий в машину. Что тут думать?

Этот ответ (вернее, лёгкость с которой он был дан) разделит людей на тех, для кого трудная проблема сознания существует, и тех -- для кого никакой проблемы нет и "всё понятно".

Личность, что это? Память, чувства, устройство мозга? Всё это совпадает у создавшегося в результате эксперимента клона. Клон помнит как он заходил в машину и сразу же вышел к публике. Однако его субъективная реальность не пересекается со страшной реальностью оригинала. В точке клонирования есть два физически идентичных субъекта. Но не смотря на физическую идентичность мы верим, что это два не пересекающихся сознания. В мироздании есть что-то, какой-то специальный механизм, который обеспечивает работу квалиа для живого существа. Но почему клонирование материи должно было создать новый мир? Мир восприятия клона?

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

Конечно, мы лишь представляем эксперимент. Нет никакой уверенности в том, что клонирование возможно в практическом смысле. Например, мы могли бы представить что в результате клонирования получался бы "истукан", в котором не было бы искры самосознания. Но вспомним обычное движение. Наше мироощущение остаётся с нами когда мы ходим по улицам. "Я" -- объективно существует, но при этом как будто ускользает от самого себя.

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

Мир устроен удивительно. Кому-то для осознания этого достаточно увидеть падающую снежинку. Другому -- потребуется погрузиться в мир квантовой механики. Но не замечать этого -- невозможно.

# Полёты к звёздам
std.hugeping
hugeping(ping,1) — All
2024-02-03 10:31:02


Ютуб подсунул эту лекцию и я её целиком послушал. В детстве я (как и многие в то время) бредил космосом. Надеялся что застану первый межзвёздный полёт. С возрастом, конечно, начал понимать, что не всё так просто. И в техническом и в социальном плане. Поэтому было очень интересно услышать свои озвученные мысли. Например, критика warp drive:

https://www.youtube.com/watch?v=ExdWAm3H65M&t=3355s

> Варп-драйв это... Ну это просто чушь собачья...

Идея путешествий быстрее света -- "заноза" в моём сознании, которая не даёт покоя. Причём не технически-инженерно, а -- философски. Я понимаю, что это путешествие даже невозможно помыслить. Оно просто не вписывается в рассудок, нашу логику. При условии, конечно, истинности второго постулата СТО (постоянство скорости света). А это ведь экспериментально подтверждено! В беседе с друзьями я понимал что эта "заноза", видимо, какая-то моя личная. Но, оказывается, всё-таки не только моя:

> Это (warp drive) -- не решение... Это .. релятивистская инженерия...
> Эта штука нарушает принцип причинности... Это очень мощная вещь -- принцип причинности...

И отличное заключение на тему "зачем":

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

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

И всё-равно, верю, что мечту так просто не украсть. Думаю, прямо сейчас её ростки прорастают в чьей-то детской душе. А как по-другому? По-другому просто не может быть...
P.S. Edited: 2024-02-03 10:38:13

# Есть ли жизнь без Telegram?
std.hugeping
hugeping(ping,1) — All
2023-11-05 18:28:02


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

За это время пробовал разное, в том числе и matrix, но в итоге не был удовлетворён. А на днях почти случайно вернулся к "традиционным" irc и jabber. И был приятно удивлён! О чём и решил написать эту заметку.

Поводом для новых поисков послужило обсуждение проблемы "иглы Телеграм" в одном приватном чате, в ходе которого мы коллективно пробовали разные варианты.

Сначала по наводке посмотрели на ircv3 ( https://ircv3.net/ ). Как я понял это инициатива по развитию irc. Стандарт содержит расширения, которые приближают пользовательский опыт к тому, к чему привыкли люди сегодня. Попробовал. Вообще -- понравилось! Но к сожалению клиентов которые поддерживают набор нужных стандартов очень мало и они часто сырые.

Затем вспомнили Jabber, и... Оказалось, что и там тоже есть кое-какое движение. Не вдаваясь в подробности напишу, что следующая комбинация оказывается вполне годной и комфортной для "обычного" пользователя:

- Мобильное приложение: conversations (бесплатно в F-Droid, платно в google play);
// есть мнение, что бесплатный "c0nnect messenger PRO" в google play это тот же conversations, но я не проверял, я давно пользуюсь F-Droid;
- Linux/BSD приложение: dino (В Debian - назвается dino-im), на худой конец - gajim;
- Windows: gajim
- Веб приложения: https://github.com/movim/movim или https://conversejs.org
- Публичный сервер с нужными возможностями: 404.city

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

Понятно, что выбирая сервер 404.city мы меняем шило на мыло (я вообще не знаю, кто этот сервер поддерживает, с какими целями и т.д., и вообще - whois интересное выдаёт :))

> whois 404.city
> Registrant Street: REDACTED FOR PRIVACY
> Registrant City: REDACTED FOR PRIVACY
> Registrant State/Province: Capital Region
> Registrant Postal Code: REDACTED FOR PRIVACY
> Registrant Country: IS

И дальше подобное... А что, так можно было? :)

Но при реальном внедрении, например, на работе - стоит поднять свой сервер (тот же ejabberd или prosody), movim и... по идее наступает счастье. Осталось только самое сложное, убедить сослуживцев :)

Если вы тоже решите попробовать вернуться в jabber, то мой jid: hugeping@404.city
Адрес чата "Флудилка луддитов": instead@chat.404.city

P.S. На jabber.ru есть проблемы с регистрацией аккаунтов, да и сервер не поддерживает нужные расширения, к сожалению.
P.S. Edited: 2023-11-06 11:01:56

# ii-net.tk
idec.talks
ahamai(ping,51) — All
2023-11-05 11:00:18


Блин, еле этот сайт нашел. Вот что значит распределенность. Хотя благодаря ей и нашёл, сначала нашёл tavern.

Сабж мёртвый? И сеть тоже мёртвая?

# Reprise
idec.talks
Andrew Lobanov(tavern,1) — All
2023-09-21 15:26:14


Я нечаянно перепутал строку авторизации на мобилке и написал несколько сообщений от имени моей жены.

Прошу понять и простить.

+++ Йа мобилко.

# Новости с полей
idec.talks
Andrew Lobanov(tavern,1) — All
2023-09-12 18:03:13


Фетчер без файловых конференций готов. Умеет работать с sqlite и mysql. Пожалуй, в стандартную поставку добавлю ещё поддержку postgresql. Благо это легко будет сделать.

Да и вообще добавить форматы баз не проблема; главное - реализовать интерфейс, который жёстко прописан. А дальше просто в конфиге прописать нужный формат и настройки подключения к БД.

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

+++ Лично я вижу в этом перст судьбы – шли по лесу и встретили программиста.

# Документация
idec.talks
Andrew Lobanov(tavern,1) — All
2023-09-12 06:18:54


Давно чесались руки немного переработать и реструктурировать существующую документацию. Ну и по личным предпочтениям, переделать её в формате org-mode. Это такой формат для emacs и программы orgzly, который позволяет удобно и достаточно гибко структурировать информацию.

В первом приближении документация выглядит так: https://git.spline-online.ru/spline/idec-doc/src/branch/master/main.org

О найденных ошибках и опечатках пишите здесь.

Также в ближайших планах полное переписывание ПО для таверны и новый клиент, но считайте что я вам этого не говорил :)

+++ Лично я вижу в этом перст судьбы – шли по лесу и встретили программиста.

# ii-net.tk
idec.talks
neonxp(ping,50) — All
2023-09-10 18:53:03


Всем привет!

Надеюсь, примерно пропал в правильную эху с вопросом.

Вопрос к старожилам, а куда пропал сайт из сабжа и будет ли он восстановлен где-то?

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

# Каждый программист должен написать свой редактор
std.hugeping
hugeping(ping,1) — All
2023-09-10 11:32:09


Решил написать небольшую заметку про свой новый проект. Интересно, что как и остальные, он стал эволюцией моих прошлых экспериментов. Занимаясь INSTEAD я полюбил Lua. Играя с Plan9 я сделал парсерный re:instead (в том числе и для того, чтобы можно было писать парсерные игры прямо в Plan9). Развил re:instead в rein, который стал уже скорее "платформой" приложений.

Не смотря на то, что rein создавался с мыслью о "духе ретро", я не стал выбрасывать из него функции, которые бы позволяли писать "полноценные" приложения. Например, поддержку шрифтов ttf и возможности менять размеры окна на лету. Я знал, что рано или поздно я попробую сделать это -- написать свой собственный текстовый редактор. :)

Я пользовался разными редакторами. Среди них, конечно, особое место занимают vim и emacs. Но когда я познакомился с acme я понял, что по большому счёту совсем не важно в чём ты пишешь код. Простой инструмент может быть гибким, эффективным и вдохновляющим.

У кого-то может возникнуть вопрос. А почему я не использую vscode? Потому что моя профессия приносит мне удовольствие и я разборчив в своих предпочтениях. Что касается vscode:

- это приложение на основе браузера;
- vscode пришёл из недр корпорации.

Как я обхожусь без "фишек" современных редакторов? Наверное, мне они не так уж и нужны. Даже наоборот, вылезающие подсказки во время набора раздражают. А после acme я осознал, что и "раскраска" текста -- какая-то ненужная нелепость. Играет роль и то, что в моей области деятельности не нужно запоминать бесчисленное число методов и классов. Я могу писать код просто "из головы".

Я начал проводить всё больше времени в acme, написал для него e-mail клиент, но всё-таки нельзя сказать, что он стал моим единственным редактором. Он является естественным в своей родной среде обитания - Plan9, но для работы в Linux/Bsd* необходимо собрать plan9ports. Я не чувствовал, что инструмент "принадлежит" мне в полной мере.

Так что мысль о собственном _простом_ редакторе стала приходить мне всё чаще. Наверное ещё во время работы над re:instead (который был написал под вдохновением от редактора Lite) я увидел, что это возможно.

Потом, в rein я написал простой "традиционный" редактор edit и пользовался им при разработке под rein. Ощущение инструмента в котором ты знаешь каждый "болтик" было непередаваемым!

В edit (редактор rein) в начале было много багов. Файл в edit был представлен в виде массива строк. Это удобно для навигации и отображния, но совсем неудобно для редактирования. Пока я его дописывал и фиксил баги я подумал, а что если файл представлять не массивом строк, а просто -- одной строкой? И тут же снова вспомнил acme, где изменения высоты скроллера явно намекает на то, что в качестве позиции используется смещение, а не номер строки. Стало интересно попробовать. И в этот раз я не смог погасить свой порыв. Так я и начал писать свой мини-acme.

Многие фишки acme раскрываются в полной мере в Plan9. Например, файловая система, через которую можно управлять редактором. Да, в Linux тоже можно монтировать её через fuse, но есть нюансы, которые делают этот метод не рабочим. Поэтому я был настроен делать именно "мини"-acme редактор, в котором мог бы делать свою повседневную работу. В качестве механизма расширения - конечно Lua!

Сейчас редактор доведён до полу-готового состояния и смержен в master ветку проекта rein. Редактор делается под мои предпочтения, поэтому он не будет демонстрироваться "широкой" публике, но я всё-таки решил написать этот текст на случай, если им заинтересуется кто-нибудь ещё.

Итак, особенности редактора red.

# RED -- Rein Editor

## Клавиши

В отличие от acme в red работают многие привычные комбинации клавиш:

- ctrl-c/x/v - копирование, удаление, вставка;
- ctrl-z - undo;
- ctrl-k - удаление до конца строки;
- стрелки курсора - перемещение по тексту во всех направления;
- page down/up - перемещение по тексту по странично;
- home/end - начало и конец строки;
- ctrl-w - умное выделение;
- ctrl-s - сохранение буфера (окна).
- shift-движение - выделение клавиатурой.

Как в acme (или почти как в acme) работают:

- escape - выделение последнего блока, удаление;
- ctrl-f - автодополнение путей (правда, если варинтов несколько - выдаётся первый);
- ctrl-a - начало/конец строки.

## Мышка

- аккорды acme - должны работать похоже;
- правая кнопка мыши - простой поиск как в acme;
- alt+правая кнопка мыши - простой поиск назад;
- shift + правая кнопка мыши - эмуляция средней кнопки мыши.

В отличие от acme курсор _мыши_ не прыгает на выделенный текст поиска (так как управление курсором из приложение возможно не во всех средах). Чтобы продолжить поиск нужно повторно кликнуть в пустую область где нет текста (например, справа от строки). Или кликнуть на слово для поиска этого слова.

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

В acme открытие файлов и передача в plumber делается по пкм, однако это меня всегда немного раздражало. Потому что иногда клик приводит к поиску, а иногда - к действию. Захотел поискать https://... в коде, а открылся браузер. Поэтому в red все активные действия висят на средней кнопки мыши. А открытие каталогов, файлов - это тоже активные действия. Возможно, я сделал ошибку, но пока решение кажется удобным.

- умное выделение

Не такое как в acme, но всё-таки удобное. Двойной клик справа от строки - выделить всю строку с переводом строки. Двойной справа от последнего символа строки - строка но без перевода строки. Клики около скобок - выделение до пары. Клики на словах - выделение слов. Кроме мышки можно пользоваться умным выделением нажимая ctrl-w.

## Окна

Я отказался от деления столбцов на стек окон. Вместо этого в одном столбце может быть открыто несколько файлов. Причин две: это проще устроено и этим чаще проще пользоваться. Когда вы открываете ещё один файл в столбце, он становится активным, а предыдущий файл становится на позицию 2 в списке файлов в меню. Вы можете выбрать любой из ранее открытых файлов средней кнопкой мыши. При этом активный файл (который отображён в окне) станет на место выбранного файла. Этим свойством удобно пользоваться для закрытия всех файлов кроме одного. Просто сделайте нужный файл последним в списке, а потом нажимайте подряд Close пока не останется только он. Вы можете перетащить открытый файл в другой столбец если потащите пкм за квадратик меню в область другого столбца.

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

Если имя файла начинается с "+", то такой файл не сохраняется на диск. Поэтому информационные окна называются: +Errors, +Output, +Help и т.д. Вы можете любое окно сделать информационным просто добавив + в начало имени активного файла (первый файл в списке файлов в меню).

Скроллеры в отличие от acme работают традиционно - левая кнопка мыши "таскает" скроллер.

## Вызов программ

Поддержки win (запуск шелла) на данный момент нет. Это связано с тем, что полноценную поддержку процессов нужно делать через fork. Это привяжет red к Unix. К тому же, red - это lite-acme. :) Расширения red можно делать на Lua, но для запуска полноценного shell этого недостаточно.

### Возможности по запуску программ

- >cmd - запуск cmd с передачей в качестве параметра временного файла с данными;
- <cmd - запуск cmd с чтением stdout;
- !cmd - запуск cmd

Кроме того для Linux всё-таки доступна:

- |cmd - работает примерно как в acme. На вход через пайп передаётся текст или выделение и ждём выхода.

Всё это реализовано за счёт io.popen временных файлов и coroutine (переключение после чтения пачки строк). Поэтому - ненадёжно. Если вы запустите программу которая висит и ничего не выдаёт, red зависнет. Поэтому реализацию нельзя считать полноценной замену acme. Тем не менее, я пользуюсь этим механизмом для проверки орфографии.

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

### Встроенные команды

Основной механизм расширений редактора всё-таки не через запуск внешних команд, а за счёт написания процедур на Lua. Процедуры находятся в файле data/lib/red/proc.lua и на данный момент включают следующие команды:

- sub - поиск или поиск/замена построчно;
- gsub - поиск или поиск/замена глобально;
- select - синоним gsub без замены;
- find - синоним sub без замены;

Внимание! Все регулярки - регулярки на Lua!

Примеры:

select ^.*$ - выбрать всё
sub /^/ / - построчно добавлять в начало строки 4 пробела.

Во втором примере на каждые 2 клика вы получите одну итерацию: поиск-замена. Но если хотите произвести манипуляции не интерактивно - выделите текст, с которым работаете. Например:

gsub ^.*$ - выделили всё (тот же select)
sub /^/ / - отработали по выделению.

Доступна форма записи поиска с / - если нужно работать с пробелами:

select / / - выбрать 2 пробела.

Другие встроенные команды:

- Getline - добавляет справа от себя текущий номер строки. Удобно для составления "закладок" в файле;
- fmt [ширина] - аналог утилиты fmt;
- grep выражение - рекурсивный поиск по содержимому файлов каталога. Каталог - dirname открытого в данный момент файла;
- Run [программа] - запуск программы rein (интеграция для разработки под rein) или текущего файла.

## Dump

При нажатии средней кнопки мыши на Dump - в текущем каталоге создаётся конфигурация сессии (файл red.dump). В сессии сохраняются все данные открытых файлов. Даже если вы сотрёте сами файлы, при восстановлении сессии они будут показаны в окнах. Если red находит в текущем каталоге red.dump он всегда его загружает. Возможно, в будущем появится опция для загрузки Dump.

## Параметры командной строки

Запуск red:

$ rein red [-fs <размер шрифта>] [файлы]

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

$ rein -platform-nosound -platform-nojoystick ...

Для удобства я делаю себе скрипт вида:

-- red
#!/bin/sh
/home/peter/Devel/rein/rein -platform-nosound -platform-nojoystick red -fs 19 "$@"

И запускаю редактор из любого места.

## Открытие файлов по средней кнопке мыши

В файле data/lib/red/uri.lua вы можете прописать вызов внешних программ. Например, запускать просмотрщик pdf если вы нажали на строчку, которая заканчивается на .pdf.

## Настройки для типов файлов

В файле data/lib/red/presets.lua вы можете настроить поведение редактора в зависимости от типа файла (расширения). Пока доступны только размер табуляции и режим табуляции (пробелы или \t). Скорее всего появятся и другие настройки.

## Цвета

В начале red.lua в таблице conf.

# Что дальше?

Редактор ещё сыроват, но я начал его использовать и постоянно вношу доработки. Приоритет разработки - личное использование. Ведь вряд-ли вы захотите променять vscode на _это_! Не правда ли? :) Но меня это не беспокоит. Ведь теперь я точно знаю -- каждый программист должен написать собственный редактор!

У Линуса есть https://github.com/torvalds/uemacs у Роба Пайка -- acme, у Столмана emacs. А у меня теперь есть red и мне больше не нужно выбирать!

P.S. Один мой друг удивился тому, что у меня есть желание программировать после работы и тратить время на такие вот хобби проекты. Не знаю в чём дело, но с годами желание программировать у меня никогда не исчезало. И я считал что это нормальное состояние для программиста. Программирование -- это в первую очередь форма творчества, а творчество всегда лечит. Ведь творчество это свобода. Эксперимент, игра -- но никак не рутина. В хобби проекте ты можешь почувствовать это в полной мере, ведь тут ты не ограничен целесообразностью. А на работе... На работе теперь можно будет редактировать код в red :)

# Мова
std.hugeping
hugeping(ping,1) — All
2023-08-10 08:32:47


Вчера на станцию ping была снова проведена спам-атака.

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

Когда врагу забрасывают листовки их пишут на родном для читающих языке. Так -- эффективнее. Но украинцы-русофобы пишут мне преимущественно на мове. Это меня всегда удивляло. Действительно, если бы сообщение было одно и написано на русском, я бы наверняка прочитал его. Да и на других станциях idec его скорее всего заметили бы. А так, информационной составляющей не получилось.

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

Получается что и не ставят они перед собой цель -- донести что-либо. И сообщение на "мове" следует воспринимать как "плевок". Поэтому я перестал их читать. Из сообщений последней атаки я ухватил только ключевое слово: Умань. Значит, эта атака -- реакция на мою заметку "Никто не забыт, ничто не забыто" ii://Sr7pL59F9OV2OimsWQTx

Это даже лестно! Получается я(и моя малинка) внесли какой-никакой, но вклад в информационную войну. :)

Когда началась СВО и многие IT-шники открыто заявили: "нам стыдно, нет войне", я не хотел высовываться. Хотел отмолчаться. Ну, это как говорят -- "моя личная позиция". Зачем о ней трубить всем на свете? Зачем заниматься пропагандой?

Но в глубине души я знал. Если я не скажу прямо, что поддерживаю наших солдат, свою Родину в тяжёлое для неё время, то это будет такое-же предательство. Сейчас вижу, что написав ту первую заметку "Точка Z": ii://RZlA1xAFOxQMrrPRYC13 я всё-таки запустил какую-то цепную реакцию. Значит, всё-правильно сделал.

Моя бабушка разговаривала на суржике. Часто вспоминаю этот мягкий говор. Тогда, в Умани, я говорил бабушке: "Я хочу быть украинцем! Можно?". Никакие мова-плевки не смогут забрать у меня этих воспоминаний детства. Воспоминаний о времени, когда все мы жили в одной стране.

# zvon в rein, встречи
std.rein
hugeping(ping,1) — All
2023-08-10 07:21:31


Пётр Советов (true-grue) записал 1й ролик о звуковой подсистеме zvon (используется в rein). Демонстрируется работа в редакторе голосов voiced.

https://www.youtube.com/watch?v=F5-IFaDAxXo
P.S. Edited: 2023-08-10 19:45:20

# Атака бота
idec.talks
Andrew Lobanov(tavern,1) — All
2023-08-10 06:54:00


Ночью было совершено спам-нападение на станцию hugeping. Вот идентификаторы сообщений для чёрного списка:

Yg4CL04RwvHVF3IBx7Ii
9UZId6kscE3KxfF2y8Fc
tw5NXYJsUHRJMdPpEkYz
Riu8WEHA61DpMvGADR0i
JaC1f8Kx8xyhvjoTjYkx
cGL7kZvw3MpwGsCWOLOU
BAB9GDgeGgTNo3QaHhfg
c0cv993ahMZ3ZZMepu7K
qHAz9HQYmZOwZcRGhZPW
p8AgTNZrpl8JDhX5ujW1
7evN3slSQbsizyRZEf9c
DfIxaRu4oAZllIZrHjly
iWhHp8kkxxbztJnTwHNC
F9OguutF81WhF93OybTN
wemR9JwK8WGMMsrRLvNR
wyaVGgBkRDBugRXxwRHW
upgFZeKIXuZFeeQEz9Zf
Jnk3pUqiRjdONmKp4CNv
fCQvTmZH87VZanqyC9N0
PQk21OPKhbb536WKGWNB
8wDMYYMKMNZYzIaGL4cU
2ZtKAGKvai7y185Bo2Ow
lVXmJXMafTTNJLEcySQo
4jjkaRTKLZjnCPkMAr3O
0PtcqZVD5JiokMe8nMb8
FGvqDOphrVr9yQWAG8CO
qwAZtp8nSSBauzGIyI9U
vEEIrKAROx8VZ9SOppjX
Byt2YC9cJTUoRs5ZihgK
x2aGcEhfFBR2vVz07imz
5B2rifQW9mVIcMXxUtDN
kojyWMXzA0cfglJAKgCA
kl7LSogAWAbTyvrKmJ2Z
l0ZZlW6CnpuRjQhXBn8o
PFbtA1m2rh2GSQP8ro3Q
YlFQHOBLbiTG4wMQIEvJ
rUotA0ucB2LkFypS9KsQ
x6iy3VHA0ab6Uby7fvAB
496XFN9VuuclXLwJH1GJ
YsLPi6mXcmaohxrcdr94
1DoZDLwof8ZNOIweonbE
mAc0pOdYTpLAznOVA6kM
DTVZZbmlDKnHVVXZHUfn
wGWHKyHYObfKkS4e9LxE
wWAl2DLMgtz1kuPb9L69
jtre5FpmKWCZ8E0z5nMo
k1PGAqvjMzhixs6ekCPH
TLFQDITAAA7d4sZICVJe
0cMBZ18IohpjMf0Fp30v
M2vWLZjw9dZfGe81tBF6
eqtQ45KBCZjCadO5CzgG
GXxowM8vZDG7rruxgNBR
67eKjZ8U5G8U0CZ5oFFq
9gqWw0KZBQ7jDY8LjliP
jtCKPrIHhMj1PeQr1eYZ
TZBxlsEedartQh1fdeAq
AS7gspSY7pHAFFWcDENz
guz4vYez0EzLHBsQVEcT
ZkQdCVAvZ5fTSHa5G8hw
I1D4JTVzbcry0rbdYClN
0ZG3ZAHCfnnnN7HgGMoW
FFkV8j8mACwh0iRcw1Vm
ARtb1qLNDBzmw1J2upZL
0r1F8Mvpfhlcqy19sgtT
S88Q37tgtRBMCjTtcWpE
0M95DCmoK8PbbLJHyhWD
J4VE64QadFaDHyr4GORd
QbVZQ0H98dYEfj7dAjAh
WOQlOAVhZacjAbalXkhR
xHYA0kP3g2iLxezpiZ4Q
XvQuMZ2LdLZScYHZvCMt
ueftO5zGoKiTtawtDP55
fQYv7UBvmZpAbuqCH2rq
2FV5xEPuQ1rc6uJLuKvw
FlAWiLsHUSCycQkGvooT
zADdjkeKBh9QIkFtvZAv
HrZrcwPZjreZDYyWOSaS
jdPFnPcXzTcmcWrZef6u
mYGoMQsrlV9ZEexvfrKn
8TYFLV03cZNk4w89vnCC
nd00YFdP8YSt1VJrsbRq
x0eejTulWPoIpVBcxPIu
XZoAJrM5rN3Lad741Fkf
Az184KTZejtiamvJFQOD
k0uWZnKUYB5PnFTZ2vBh
RRWXd7rZc6VrZuoWK9ez
QRnvjgethFsotibo18xG
lfHaZnGXurst0jhNqc8P
0knyCobZV7xsZHNvaGw6
8WjnALftJh65TVK1Hzlg
ta31uiAlbviwiARkZnZN
rJdq5AoaW9g63BiHqEtN
AqeitAuaMeDCeoRrs4jU
1p1naDVVCdMsMdno9kd3
DPKZbcqFa0A3cJf3S0Df
KvwxE3y6JNeaIZ4UdfOQ
pwsZztVK0wVboyZrecgw
Sfiz5nG7ixxFgHk3MYAr
jMh2RewcVojzwRKub6Jr
qukkwFh3S4rWfoMmYzbD
UbFPnRX1FmAYJxfDlV8o
QrzZBuWr8ZGscZul3KAo
zgy1ZkTdpv2ufKMDB7lJ
d8JwQ5PlHc1L4gQWK727
9QFFIbe9zT0g38BJr9m2
86HmZZSuxn0av7DFcazG
JsWITJF4KgXB9m64hr9O
SItrU1XJBzZOYrbLoUo5
zCh9OpkMTwz851xHwYnf
ZihZUoHAiDt97L0HRU59
DSpju4PFNKVqTibsZOz9
kiUmRntSv6vZ8pHTgT2Q
hL49FrMOeSKz0UonRgcM
rTDulAVjvZYXcPdwgAPB
4alfNJma9PcoN1TTmnbm
JzIAveAXanM7RKU13uLk
EeLVJiw92MA8LhUdZkp9
5XOr0npVX4sAy6WJL6mH
TLh9X9UfUJnhs1Lz6MU2
nxVtEQl4zUmZvldKFY1P
oVseAkWN1dmZBGKJVZVR
sfT6jG08zoLjH6fG7qEC
cE3mDfAQ3KGQsF3DAfN6
Gmz6AMl2eSrYAUYCAHip
RjyORwGZh9THqJtZg5Ji
XFEXX7SCc3CZl6Jp0h9I
S5TIgS7g5dDu1nRBi1Hb
qOsjAOKAVU3Yt2ppgbR3
zeaNJblsocAUrXaf29MU
ZLhyPlTADdRita6Etczf
GtRbG8WTLIMsZyeora56
zy6bZO58gHwsRApCyYA4
uWu0rOzaPtTgjyyrClCo
Zt6fPRae1D1ypnwxhQpv
mnr87uZwYue849MSA7sW
9ZL5RuKquYNdjSJDXqkP
12mLJn37p5plk4SDGdTB
ZBBpngtVXsJAGahzAeVf
tUPr0qlhuKT0MGeACCKW
v53CiKMUsoXZKvqKr1eu
h4rwxdUYIuMcuNCEouHK
UkBZZRsuaBrp98Qrv1kO
yAC1ND0RlKOmoKaBZnqd
RwaXWUFvg5JiDm6UaWEy
Zue8Gzp5loQD63MwYfOm
8PCqZ1VjgWIveHydN5AS
xYZL03QQ4kKTEw3pfdcp
PMZEUNu9gJSYvTvN4op1
ZjjofZX0E77dV4Gd7yXT
2QwqZkEKu7A3iogVlpmi
qE0DjRMKI85m6Tludwmg
wNkF7Z4tDDAzljTYAE5y
vHu7laddEaZZyk00gtbk
ueANtnJvyqsoC06cf0A2
VqLEHucFoNAZPxqBac4k
BoWABvdhOa4LkA2H1VYf
Dlk2Dr1nXXWjevkt2pA1
HItm2uibkEUnSUBnZOYM
tD5pX66P0vJzKXF8rXLJ
kZrGInxm1MgAQnujDbg7
EoSszjERdoXC6qo1m1bW
gPKa9aDw3WpsPElkjIwc
Dtr5Af5yAvpALbFDZ6Jc
6n8HuiGBfZQ5WC4FwFdW
VAF3ealIjlATJZlAr78y
urqPco2IcpIBM7ZEBYZS
F4P99gAdPTnSGXqdws70
fHZ4eLiwxyRRQRKev7Iv
Z4AHUYcQ0ZO9ldAyUqQ1
wJICmDFaZJXlAP00jqar
gOirtCwY9eQ60QLr2lvZ
aZY4e9Wsnawb71nKgdmm
zv1YDXgcrK7x8BUmBSTA
UbHjAAKV3X7y8U3D8txQ
Viimsvp0gpsaBiRsVi0Z
GWEIHkfZF5MPpZu8jprA
SAhhYftIMygStLJkfQau
ESdqnXdm6oZwPhxCZLZg
nJXDDr9BB3qvauYTegWO
ijXeYoonCoc7HdA13MrN
VyaOBdd4tUdRa4LkcUbc
a5e4S1KwAEPmldAtrYhm
wpyNMKZuiAouGFOgYpIg
wrSfyTYwU3lWKLhmSeqg
kAot91KNTwcRRtQlh8iI
VAzAVI42oc8KGhi592Oy
79WtyeDCTBWbF7jP0toe
9X6WzwAG0zlEUZYeYPrp
QXdCMWw2fA3Qa9k34LbS
Axjq6xmTdFiIVqcoMxp3
NdOqjTwKTW6UOw475geY
qLNa3ZOu6MVSIoTPrUG7
nKbMoj2p7Y5uxgIZJNdF
zwvnjcOZn5h4aXs3fTbK
HYcamJ3lRRGWdNk9r6Yz
1yWyS8SCeebDnQfMu8b0
qnKz2p2LvpHTge2k0EY0
Zo38zoCNfyzeP4S00ONZ
77oAMeXVOKHUQeTNGjM6
DA6vzghDfEFHOE8ZXiHy
VgKRW0pph7mX1rUbIpkI
XVlAqg4LBgS9h4YA4Ay5
ts9m6jjM2qp3AVzHItIk
8ozZim0uCIjol1rC6g6t
OfmPYRnaBbrxDdzRmQOr
Ujzb8FmjODmnwmQuZLEd
BdkfaaLN0BNmAZhGVwjj
nw7cleAIOvjfINH3Hbx4
kZtc91Qtg7LBnrtlCQHV
p4dj2B9QxRnLj6j8pA0u
T6Smi66dBq5cYVBLJtSc
rCAv7X1W4JoSCVYAkhJ1
8kOgMTZW4uhdFakx0iZA
hheRA3tp3ozajcPTF0um
r4rbahxta3AdeFaOm2tJ
3Z1NwjS7LmyKITNBm9U9
gxp0J73kqHewJqPVRl94
3lzhaZq9fzhZrwpa0I89
EY775WWekBKF8Lfcn55B
2GYY7t8ZpL5N6M72rQrp
Hn7SRD83Zh7Ab8s6A5iD
f3ukxihoHA4FvwiHWUaI
z5OUZRmOq2VttokLIYRr
0rnLlXe4XZEpldClHVae
J4n2oQzJ4yNImBcO7ExZ
C9paKuPLuvQHsxpAH7CL
MHxyyqNKKTHTCU35JIcw
f2AluikqNCk2ZQdaOCKz
vA0JvnP7TXvPUy4Bo2Jx
ScXLAMUaTZXDRXWJZfm2
tokZlmoIo4H56Uvs0ZBQ
fmkNHFvGNQNzRIpFC8Uq
bWlO5WktrTnaxEnRLdQq
uD34XT9bit3wUtwHTNKs
mioqqGPqklAQKCMkZSxt
GlivNd6QspGW5Ed3U653
kZ5aZ5YCCtZqtVA4t0ID
0pj0Ck4D2UyGENXlnZVa
HJm7qALW7n6rpVCKs7v6
i1Ka3BW9BegDPb8ILWce
LX74KUZxfkJX9jg8AUGL
5DGiJwAnzP592Gz6SW3M
XREAYgw85WTKgzyZWC7N
5YKotjEUYXSvMAEOmNUZ
QiLelRJuqW1OnDgKcEDb
h5kZrXy8XpZBpdFoDYbD
qrzRtklwy1FDIajSGHvB
EVoItduGXWab13AlOrVM
dqIa6g3mED6BpzBkpPV5
ll17o4m5pMMgA7IxOa9V
BMhwKdKQa00L6j3UNDZH
1PFhiCkFH7EbpprGVMhB
rbix89GNHftxPjh3hBJ4
MqFuqUYX976CHU6syr0P
BDnZQqcgnaeC40uHz2vF
lmAh34nbkVyCcc6viA4R
qXpA56LDNgNOIM0qNlWE
xeZ2Ayt6nhjkZvLQYS33
AO8kV4OWyXzkhWfS3wSz
vlGlTGMf0aAYJAdqncTX
Vj5F2NmOwq3HuqWaZ6Id
0BmgAQvIh7TiugnUhMXR
CcBAbQIxoZATZVrTcmr2
q2PUsney4O8UJWZDJzQd
EdCduafasi2whR6ceVb0
plYIRoNHKTBO7Aa0j0s9
35iHScaNWVKWGxtvjaTA
9gwL1UhE6TjJfQmYKZmu
kZehP4kJlnbz4hS54FvL
ZdwvwISZJrbeDt0sgb7F
GrooDnvz4MSBNGCxnKPs
QkB023W0LtZBZU7wZ83b
GXPsAzgTu8t3MIDxZFfw
AaHGcbghVup9iiQz65Sw
QDZUDAL3A6lAAD1krVOn
ZbtlJL2aiPCroZJJ9Dg6
i5V3ZJX3qIZaNLSD1oVM
hblhHG0W1XcWK7THcVWU
X1gAbzOUrlXMx9Bp39z3
AkT3Btofwmp3zqBsxWol
Pzex7QGjZNGxHAfPa8SG
XWvFIOdfIB0fjq6Ius6l
K21DkTUZ6OJqNr570tce
CCeUtbgn4JbEs8d1eWk3
dxNEeX2dkb85nPyR3sZg
VbaVhAI1OFYML4Aswur2
5lhrqjwFmgo105eGu2u4
oMmGJcc42Ky1uYbeAfJh
Z726xKGlcvUrRkV5bOMv
gQ6A3T7xZcFZ2FAJizGq
NJOvtJT1HP0sf1dFkuhl
sNjdgRaKiPkjsLoZHLAs
ateAXkniHovW1v418NQd
VC8ZMfxVBX9f8Xxbx6Cc
tnzina21Z9YsNzazO1Gs
AtPJs5SMu1W07isSTJfh
a25DRuZ5fcltN4lnliwD
6S51lqOVWKvilaTfBOKU
wTcRxVj4bP2VJQLhCeSL
fZbjwZqlpl8sLmGWRDtw
ymZ8Hc9ooOfbnhrNiPH8
jAKEZmpUmn4GMaAdOh3g
rYhQISlGHPzPGgZ1q5o5
crAEY5xP9VRcX9j0OqGf
wXgr3sba0b4Yk8ObXDTQ
jkbvbVb8XyR9AOUOtElM
2kt3ZzpQSkDjdUa3i0rm
3iSfVzyKqHaAXRFX76bR
4pEA0mGw3gZAbr3Qwsi5
idEWHkMB7AUWBqSYyP3A
wgYQpIogkZwHhBYTZxxn
tRijGOZnyDhJVd122tTZ
wyHn8hpDvtgcgpRjRmuH
jX68KApKwAKdsC4mcarR
5mFOGzioVGslAUXmDcdV
EVu2cIILmz1hddETzsAe
jGAsBARBrQpEMvFltAVf
9MdxlvtFjG6oUU7Zf14e
WApwCkf5h7uUqykQhIEW
dAJC1zxW8b7bwvFKb1vK
oa0dPLtlS4E4SApc1xQ9
v5xy1zhpzZZ2ZrPE4bc1
7FAQGCEAhtNLSxwqGfYT
UVJKBoucVnXf1Ei82NaR
VNCCnzm2LgZ4GSg5C6Ax
X0iUXZRw3BPAglgxw0H8
pkAIxW0EEkjYVFlOQwh8
j4pSZTcuKZuTQsB5FZMc
9fX14PaO5FAKDR8UPyNs
xz178C7AAKPodSWriAPv
Qp3GQfaaCjBCbosYG5RE
OQju8fABjcgLcoQA5eOh
096paqhAEsdZlhfWHo0V
FAIhAcmNUqVgKWP2ZazY
e2gFcOD5MiRf5Z9qmyMK
PIxof2CHo5ztydjLTdun
wanVXHoZfMwtx0jFvM7k
Dpl2MwNt0wSZdWAsfkqZ
GxnB2M4wowVfenhGQZj1
bAIrrID6BolQYzJnddM7
Q9fc4HFNHcsu9DCWeuFw
g3oRNAazPAslkC1yKMSd
oSLWWxCHkinMSi7uwy2k
seuEfWAMPfBXYcajZZPZ
avfJX2dovfgrJLK2O7s1
W2Qee0hw3pCjwJ2XgB8r
Vex8BDsMLq0WAa8MJmnP
PYGbrYEsgC7DEZCb2Zie
5KWGwilPKKCOlPGQqtYY
7LAdmI8THK8ZtNedVWIS
a0SxZEls7isTeelAVLtZ
aZ3eLRDbqZ54YvxUxADr
IhFfJNrgZ596OC11GDpm
xMqnppLv4euLNUKXzK9O
jRJjr5IzGMwoA0qtKHJC
QFmdYCJLSx2ri5Tlpa0z
aFhKIZml6UYf1emyDJs1
stmFlvdZZFngAU6IJyNm
2ev3qQwhGWMc1eqtZTXD
7KrbTJ1R5QSfLmqRZONH
4SEvJxJAn3YxI84ZwsYp
B55QF1LrxYuw23vhYh13
NSYZZqIqJ4MgfALcWM4K
WjMoNcFV5nRoAWjOuG7p
FQOnF0CgsZoH6thia7hd
OCz51yfiDGNsNKnnuZtF
LJaM6sb018mMYvlHSP0d
WQNf3mtiDAJ4GZ9xdKwp
zpdwVJOHfeRKNuW1ZpxD
pCMe3xvFZHX6UAMkV7Cp
BMI1pad7rG1XJWzngPpF
HeHhs81vAFsguLBcv6K3
4lKIgEEwZo8tWSd2gzmt
YAslLESSTKyMUxoumZKi
7iX6ZRMQSKiYNHZnQ76v
P0unB8sMypASfKrKg3Y1
zEIGAPGZX5CcAPIGfcdu
R5PnMupTnpFjUUKGvhiv
ASjqA0REhVZidkMWMZDE
D9b3ZLV4BXQGCxGdM3Ey
sjapAJZN6Aq7AHGGQITA
N90jfzz66XZO7C4CNoEq
fSN33guKRXfZYGV4UviW
y0lxAqNj8yDvrA2V1CTH
Vi149bWPqFgLEU2arl9s
ZAdgxA7WiaiZLacxAdXu
jMNBllXvLCKAokdyVcxT
0HY3g5S3xAr3fyE95bSw
fHIAAOqvPxhxeL99bjo2
K8k6JRo35huFMvTRrLIu
rtk3t688RV3sHq8MqP2e
fsgpHOWGaFz5UZzkN0ih
BQMGV2M9WRWPL7620yIq
0q0a56PVUaof5BifKzLQ
FlEL9OpP8Jz4ZKWT2qS3
BoUqeZeaWxb6uMjlNDu4
4yCZEHVtjwPfJRASiBsJ
Z4Lz3KUqF6bEdStEWsNo
mlmX9CtwRp9zXC0np6xY
KaT1ZYCnVNFkcFgHRviU
nK4pBhiTlOQc0S0DdtWn
LpZwOF3uX1cp9qWJYask
WyoIs2IqxFrgMmDuwnBp
rdTOLLN655ZLbBUSAEKe
3y4gUHgzEK3ao5RrNR8m
7yuTnZeKnQqbEcBS6QWv
vhd8jiwu7zWB8qnN9LtG
m1AtpRd4dX0YDM7jW5J4
ihSIKaR98zWBOqA7TptU
T00d8EgJ3VtlU1YFpIoh
00pChH5faVTA9jwkkyiN
q4XDR7kuMeqP77pogvD8
j8OMoU8pQYGrAKIi90on
qkkIcWDzhQE5B7KOuYG8
JNTueU1o07WLs8zCPfRc
FKVJKQ4OnPVBZQe5Kshg
YiD5s0FNuOp3TAgrT6vi
GdaDZlSdEpkMAlJ51bda
n0Sf8aWbZ6Q4cw3DHU8F
UqlCJ6ykTyNPt8v8GJ4s
xwhQS97puQbpBuEvi6pF
QA0ASoPLstETk7UYFVoV
C8yAihF7XtVIyzKQXz3D
Orcn5UK4bQAYbxLRFrJp
OpK5HiIT32s8UpKTzq1a
sKkLgA7gBl2O0VKtkqQE
oPdu6UNKjhWkQ7iPvA6R
FNrl4kNEWyPqB3P2AKiB
lCLKYOtZ2XaxTACsF5gy
PQmrTFQ37DdgduOCjUeT
vs2MR7aVX5KIwjpp6boE
UArIJzLSe9kNbdyQAeUM
9s3paSlYw3eAf7TprdPb
FOMlQDuHwhhvlj2cDAfJ
wFMFIGRiTbZ81nJv4tSz
kKP08zwa7wKsJ0EOLRkP
jo0oGkjuZuxNMNHJOccE
51SZZ5DZhm4jZOrxGLkz
fRdwPEJbmmsHNinvdPMH
FZofwbCOQr2yhwnM9NQa
QA59t9avVdKYKSnohwE1
ueiUCbaAD3gpA8S7vp9F
NxiDGvZBOkpDkEdHUYxY
t8Mx5Z3C52p8YFQsgSA5
Lohqz7WwlTJyGhiM1qhc
HsLCzj9PLJTuM7cb7zrT
IPDBhHHwmaXqbuKM46IM
v1YmazcMpUpHlFtkIMjk
fThV1jWDOdZyfnAv8XXQ
j3Sp0AgLOUbohENU1hzT
a7AWf1OAsh0fN83iT9qJ
fKE1GZIsOCsnjAaKUgRR
7tRs04ZMEnvAqpYuh14A
Lp2L6N1uVPSOGL1VOaJn
81WUtqwmxeoTnAnXHbXe
XKGMdEdhHfhRiwwv2QPd
PQqzPGdUveA23pNJoFXc
KWKm4JJkfmcUhfFkuxAF
pWf8Hq0kHxhACuxuZHfH
ZmQZ1V5zFhk8UHNy8kqO
7suXArxYBB0KIicmowOf
TqqZ9ZoyvYdK0iozPnUv
VOkv7N2VaYAkC85eAdGb
L1onCrb8ZgiHNfl52Iro
DzSsuriNp9L9fMyguVdI
105Pc7vr6DEzP14iEamE
8N182oBTyeKc7AyeWhC8
Uct2FChB3z8fI3U4YGG6
yjLjKXGgq56ZYw173EgK
iBtgzyf7K8QwuYwWQPkf
u3xtOxbQ67Eo647HSaVo
faMzIPTFyJSZkDdbEhcp
ZqZQ5WPttvQDbAdFyXC1
T1fAvBpAiYHjw9Jzn4rZ
ZENmfLkY9U5ifOxSWnKp
j0oe34pHbncPqsjfQqza
ziUjCnJoP2M9B7PCcDA6
m69KrKM6DuI2NyIPv9Nt
OCma7WSYtNxhKWGRndcr
RrYNBC90gRu8M4GFXtMU
8qu6eKI6PmV5XkZqpAUU
R6Lnm56p7e6F5jrhrvne
1mAsdhjJLQR1eg7QsA7I
pAA73MVApjXLyPAqBYM8
nYrIZIymNcz8YVLrOXtD
yyn4JOsdGmS7C7xpigOE
bWh69xuI6bHFNnZcNVrI
MscEwbA0zUNbzVPSWD5A
3Z74Vo85EcAASH5qomIy
ZVHTZnmlZqzdkirybrlk
cWim45Q0RZR02lv9MOdL
WETYefFKOQPnvZJkHqZ8
ndzZPEfuUAl2IO0VZZsr
LPcvq9LiW741Tff7kHwd
BXziirUVwh769fkAXbJA
rowZ2qbwkRBTRWY4w48I
m4Zjoij2LjrCDNxngPSA
ALk6tyN3L1SgiAx6ihvg
mCDexXoFtNzNNFZxCPtc
KShAYe2RQxbCtHjTLBFd
xwiXXr5Rc2Jaics231xD
6hDifhbOKf2mn484TjcO
xvdmcv5Kt4hwm9HiYv4H
ZyCSbzqfQVGQKeBjxnaX
3loQFWBiqb3PpuZAqp4Z
wdeGdRo3Ayho95h6SxjE
6CJjDu81ULSjAjNITpVk
3UT7O5bpHYaQ4xAM6IKD
xoAV5aklVPqNoe0ZNkOK
JBK0hVQQsanjHc5v94Y3
yAunvxaw9MciPy13uCfr
9tUomgAY1ozZjmSqZ4mr
f6H0ZWh5tLYVcCpByHAH
G76QJjcTwTgAeG3N2cYA
Joid6S1zYEpH2HeMfAE6
O1AKjxl4fTNN0KLjZErv
JXQhj9ljqeFzWRCgnO5z
zdVlSPJRYJcUrpc1aUuM
G5YMdVdqw8UnKw1diF0T
d4to75veTpNSDqBMhoBB
NtaTq8rK7nG8TqloIiGb
JxvnNh7iRcL1mxOkOql1
M0HB0kOCQa4Rx07vQkvZ
SzNb8uIiC2BRRNfgmcDx
WaqdAl8VLIs07NlCJp4w
oBEgMgWpslQtd1Y4Vg5b
iXAjBL1F4plsvfHbNTyV
i4hJI3p6cARUx2bXCT3o
JcLcKgxXQnzZc6kx9f2M
Cn9GQM6XTWqEFM76Z26M
gTJA8tTSg66uSmo4YDxo
pXWWr66zpJ9yIXZLZgvD
UBx5PDBVknXO57xXd2YS
HfJ8XS5poabT0B5blKRM
pVqDZaNZRssEVBriVsmT
QsHNgzn7CThRrMkY88Hd
gAgkRel8G08dGLZxIlWI
ZQtsapUeDZDeKMDqs86R
LgDZtNhJXP4FOfEbP3xy
lx3PE3PpYIAaAxTCmSR9
yCvrcZp5p9zxh9S1i18D
KQU9MhwHRBdfZZEnI4u7
7VMGZmLTkTsnO7BSQ46Z
foek8igGHA0iLgP80vLs
VL80h6vOVud14LDLGRD1
1tToV2WmjlB5xhpdlmZ0
OYRSx7k2Dk0UzgJoVcAa
SBDjA0EM47N1sNFFPkbk
UdATUqdAUjLmgCVvFsOY
r3T1TzwAlIMeSrzxVXI8
Ze5IrujHLGs78KwaBAwd
e8Zh1HwZdIwOuWDQ5uII
994h8dsx2HjgWrZ5qN6k
yMic8TW4Sy4TYLFLxhf2
jyi0odLbMszwof3wMUdt
zuUH4DlyQAJZAbGhJNhd
HkeW77gi5HKopMVEbzYq
FHTk7hLrMfxNlRAAqKF7
VOwBoFy8KWCny6YHYxZe
0rbZW3ZMtEjIzCaC1K6S
mwgud0FY5JtOmvCrI0Hl
HjCW8pzwi5G9ZURLDypd
4Vg3WGv4NrQdxCwCw7wc
LlAUbh6sUYxAwGL47YFC
LQZG7tZBM8kMWRwaqX49
C880zROHvLzc3XwsszMw
MTm2RQJ6wAlgzTi1qvBb
wWLNxM6roT26ULUZ2xNZ
KPKGHbEOZpvzWKRTA345
nqArQLXN4t77HB81LXgt
oKSRbP0KwAsp8YtCd9PN
iFAodZTEH5gutZV7HTa8
m16htfyCyA42PtjDZIoq
jQeYWX5ZyF9TT4Qznt2P
20AFAQXACKbgy0Xs9Ksb
4zxBT0KtUiB2PHXMnvgk
XOijlYHyBb7RFOsJTyKy
IOryTaUaRIYZxcJ3XRwe
102zgM39InXgZpu8qO7e
UJZpcfcdg50LE6Zu0cgB
YQMEviofHxaizgWiJ7e7
FqjeEZBDjWTpWlyE4Ylx
YBpGpwAKUArQTasSjomA
UlnqKwNc81Nfrfykln43
qK3QAcZAqqZOTPzICvdb
EZLuGAL4VUUHi54MdBMu
AIMLJnq5ciUMzd1X9TFq
JZSWZ8Vl0ytMckzaggnR
0Vd0PXFylmcytbASwLdL
NQ6qxJcTztRZ09uZALQD
J0vzsZUnHaLVYRAtyhyP
J6xB2ZbvA4zztVFjoKaF
vcryTuJasyDsnetvbqxD
7ZFIvHHXTBdWSPBw4jDN
fbCp1B6pPuXAzvEfagny
ZROviNNPoZNEYq2TQzRH
hnN2Adfwp1BSgs4tMOyQ
28TmQh8LDROMTsXpPBJT
WDj7YAfKWG2XfGJ30TwZ
MtNBdmAZKekwOBgqtJvG
t5FHK3RJimKuaCXtPvrz
7TCxCL7wu09XFtGCyA31
nKXhDdctyyQic6e3Cdmn
F1I8neTgcaeKP0X22kLD
6waQbRKNtgjx4Ats02sy
aUPukrsQL7kG8uFlBb7d
99BhpzHXG4WXCHt41CIS
7Ga0x0cSxHKqVDl8BKlg
U1axC8UIsNuXAYNJqzLn
5Logmma7UADAL3bzUSpq
sxOnICvOx4n7raXVJ103
n52WIRuDumOuWdYyp9hB
AbNNPSbZk3cOUlfuZiHq
ok2Eyteb6v4qfPjHWzkZ
AgCbZwltXhEFZuLjwsyL
CAmhcZIizyXXTZiWxKH3
rahAVblVHK1ggdvL9gAU
auLmA8ZDZ5GNIRAsFIWc
kxzI6dYgLZZK25nxktqs
LM7PQHr5mK2mAP5FXDO6
XqqiYRw8ymBhp7hKfu9O
h9d0yUVBxg5XqUl3HyHa
PMtdqBT4jKA11XNEFoH1
B57QLPT3aJ31rlLzImhn
i34jXc6cgs4rZaiJNE4Y
ZCpLwio3Y84fKuGZUQQW
lpyfIBI5UANqIdHdunIj
Rbg2RNaH7S0Bb3lA353s
ETd0mANBcYB9tGmA2JFR
F9NgjKkTBCjUaeDAfxJn
IKLQ4TEU1CzKhc8vMndo
LnADUAPdsWpwZau5JweW
0ix3atnaPYmIUiHGGkoH
gOci4lpVa2Ydvs3hytVf
bQOAVpfBlquoAvqR3rou
fsGwADRGAsyeUymDcSe9
qmZ9Gy9R7tVEZn0oEc9a
FPsPk68h88GGzm2Ptww3
VvIpdrqaAk40ihhAXAdF
pOAqaTxvHVSKhH0y1DqR
QlEmZIPcknyM3m4sh5qA
iJP36Gi04NDhD0Y4Cdxh
8eLrcQQXQskMMxAuL6rb
3DTOsXKwRFbmv7VvV8Gd
kM0s31LEHChG3vYp8sfm
wp6QImdDNAZ0AkTpiT1z
JuOGgk1tFHoZc3nZ8uDn
M65PIyinzH71MGE7vzoB
qofy85Q0UzTSg3blR0jK
tQEBYPvarCybZW9x36fK
DLpHbniCIUbPHa90Bw49
g4lEAvVfHt6fi6GH6mRK
ne5bGtVdcdn35H1gcxcw
2devAkRTvtpmNigVINGp
tKuqaCRApAeT5fcqGkTp
zNI4gR8ZHZwAM7ECAjV0
5CbMDub1kl2pJZqXaYUH
jf4SDDqMViepfpK3aWjo
pKk8jpj25Nv7R4xeiwAp
OeN7LC3rm5J9HU7XAs05
4tsjXSQGbW6u2CJ4XKcr
rxNrgELbERVDypfiAF2v
67FsenUHv9SBA9DGohzp
Yn2NonXtZvFmelr1bz4O
WPkIJcR0E1lybvj4y9Co
TZAxvf3pOHAUOgT7KNuG
s00SRAx07dyetJ7GUMGh
Df2SkLtV0ih9bWpChBFe
nO7mBu5gz3uUOTjUlRgJ
xxiA0EnKbmWIcyQ7ooHa
RdJISODyluu0xFnuuRQS
Ek2cxP5qWeH2DDilyqeP
IveYKIYBAWix45Ig1FV7
1qZWb8htp7hv5U78iw4z
nx7Z0XIVgnHZji9HYe20
TUo4ICMj0kpSs77Nhq8M
yq0Z7jiJ4Dpe2GSxR5Mx
v3zbNvWUPac3NIRNQMud
Z08WcbCZqAuRYINZvSuK
QD4RiZbAG4CCaseKZAh0
4mURw6VrBpyX55ufGLVz
LjhoXGY0Lsb662xYHDKi
oE9wzH5wLWLJLkA0t16i
0DYXTAjsGqZAHVEocfMr
p1y1VABdUzbv9HAzxFU1
F1SAlvacNV9LQvGoIdLv
9ljK0XlFyAPJgqO5Yhw5
5NHCIoHtF0qkQRIdGByn
MZTKHgkOGu3aZ323BH51
9odCI6l9sKmc2dVCAaJx
gZxgrAyDLhmbfvFf6UZe
ZP1EKPPbuAJBUa5SsgW0
oW1e9RMnmlQc4CAuLRR1
3RwjnLRq9fcnjxad7REk
brUus2bBNmsQINZ6ol4U
2d9NyPZ4AfL6oZ8AE87i
e3RvvUJtw6sUeINBIT9u
wZjUd6sRE7qSNF0j0D4Z
jAVzrqGlGZ71pnI7lNiZ
AtRWJg6B4MZzkhwn9Chv
JvlsHcNqrVWeQb3urm2l
dZYuHgkm9R5B80891TFj
GDqlULQSTl9CcZvvZH41
H3IcW2fHOviZRFrgYQLc
9uhEpEsABSbyoXIXapaH
AYZIH53a9KEyJHnoOLzr
dj1bGV5tqI7j3NJZN6wA
yg2TIw7r3WLmlZeWUEj8
UHNoHOIVNYARC9Xfh0zn
VvnD8BW9m6lp23XeIkl0
nDw9EFvMsSyp7otbSuts
mNB1jIHVkyyu9VzPSrWP
9ZYZpdmWkt4IozNaZNwI
oggR5611R4JuswSnREFc
DAI6HYi8QbkLaAwJuBcp
1NNTYktKW8NxvB9a90kY
kLdDdwbWpu54ZZI5mBOD
hPg3kSwwotvPqqiWxPAR
6bhyG7G66JjOzBzgyjiv
t8OSZJOQBUImbWjxxHUr
PhAwEfAFs1Z1D1jgAI9Y
koPQzSCfAI6qLVgCt7mp
5Y3HJ5ppTmKhuyb7QlDh
CvTWdgzXsluG3A3huzEN
lJe0ANwPoSjmyVVCZuqC
7upQAdJCeWj8oKjmZDll
VGADPwWZDcpjfw3kx534
SAnIdfrYMwC00IHAIASV
kf3kw54GzPkvdZY9wlw0
ien7QftNdOghwBH31kY5
8VvOWd6UqKLqdpdFmPOz
7xDmiYLiOGlYZfm3AcOg
ZyeczDphuoD85z4EoTjj
6f5Bqk3bFIsRSoWexyWo
EQ0g9NObrNpLUW0wkXjA
z48Z8cKVm7STyPXX2wwJ
y95M0l5ZKAKUTFuUJNX0
k320YZpgLqUi6ffQxNYa
sxtBdIIbL0MbadE1iZnB
zLizcI3NA5bR1uCST2iO
dyaHjIpB4tajGC1D9H9e
VZbyDmpWv8ZFEdIwJl7A
4nAXgZAa01EXwG6xSOzL
bHWr047Z0VCUUD6BLQLX
lVf5D5S9IfhpMbZ9LZBJ
zcVZWJYnzHUS4stMz8NV
TYCUQZiDn1QhriUxRGZm
BxkZPI4TGlZAZYtq2FJZ
OZVKnT7NRj4MgEirzirl
SshnYV5afuvKFAm0Gqsd
yaDpR6RxvVuCOAAZxjxX
9OZm0VpeHgWDXCdX0iol
PeFE25CUQVRuxmTiq04r
JsAKGNIqoNSNAp3EKt1H
lEX7f8sFMqBlOk6JZCLa
aH0t4aEOhNeJsmLUi4cH
kLDTTyPc3XaHdM4nqWRO
wA7tv4Adanhz6PHZ1VbG
WPZfMZxzkjxLH75fl4Wc
q5YfzVT0VMbNWkZdnoxi
ZmOHRs1JUJ1UFY0SW9Pw
7DZZ8zi3deuah57EZAlJ
05b4qtwp2vZm2BBE3jjo
8QdHqkIo3ORTpWQP2Qaq
vyU3a3WLKAZBlW5elaEi
AdzIqj7iZJEZ3XdZ1com
Ch1SvTUUOFCLc35vNlO8
4yyIS6QNAMDTsqS5T6dS
TbZZaH3gI5mpbZ5ZW6mL
fsTsfkXrElBxPqIYgwgT
oz5zB0iCTAQwEOoALXXk
Eb3oyh6Ve7bG4Sv4zSoT
SMxpjOjwMScH9MjoNlA5
1lZcpdOXRS54byT77ksj
yY5mrT97A2zJCrwCNRqp
qoxbFddm6L9c9hKdGxMH
wUBntpj37bdcMteJ6p8q
z6ZDZmaBipyndHjICQAw
up3qQA6vICAAfhJXi4gx
8zSqR7JmpC1kGgscXzVx
vwgEKaYRlCkwilUZ9snO
fzqzDlfNpghEw4fEk3c6
y8ob3UAnAiJw4YiZMJNw
ZxFosoKAjSZZ914l5FPF
VQKXFLvQVZq4cFNxNH3m
Fid0AHVPZcAwa14zqQHl
5Ikau9c6qQMNKLHkgpx1
d0Pd9cXAFtih3tuqsi4I
C1GZXtCNrEFD19hvOk10
7WcCWR4Wy3c0zwD5pSRe
TySsf46vXyZXzh04LTcT
kudbhm24MqZZAgT4bfZh
OlLLZV9rpcEWo34NtpAm
gzG6c8AYfv9uhfXzbUjX
eby4BjH7vJ6O1BjndkNi
m9Wf4l2ybfRVpuuSFxhX
XhGCTDQZx3TepTeBjDOc
C0wgTT5CDU3m6iP8B237
JwJOxX2K5CdeXprJjLsV
9t82JE400Jr7cW69ctZW
eT0GXAbFndDvhvzkDHoK
brIOAPQN0dlSLPLl0QMM
valdudvIfDKHlGxGANib
xqwXxjaFQQwAPHzC30Xm
tHrZbfjrNkqxn1qedm3r
n5X3XOWFcb180AZbdUiQ
weFJ4e7BXq0w3LAmgasE
RIxTHwHaZ6Iv6qx35NUZ
dNp1Iw6SrAuBEuRCQAhI
sCsVs74lSCFR9uVbLuAH
4x04gqfhZXYcttL33VB8
XYcl1X1N8bO83on4rZJZ
GcVEFZr1Rq5HKKxKAwlh
AgTu4j6Tm1WstoeHtEZs
7ZNju1bKBoCVOiLeRsHe
sYYfGlH4Fdssohao3YCF
pTer5vDGqJ3AsA0kalmg
IHpr6h7YA9fwdPp5PN6v
4f7z5X8VaM1yayM6UNAp
SMp9U2n06uVNDTneNnYW
8patvsZKoUGjrkyZns3T
irboZlXtA1cZCcFhjayu
zS3jumKivgD8g1A9XhUe
t5rvmrUzFpZ00js5FfeM
KemWUrlG71uPktggUTjZ
mCU6Dp0B8x7g0zepsQXn
exUGoAvkOHMe8Vd1w9DR
1inVQGNvySgLBB6SsldU
nBXd5ATygikuWbjv6Epg
z5Qh3kh9LY5ZO6XZZHKQ
EIHNXg6xZ24ap9ccJDfd
fFN8PqHiWr6FWvr6KULJ
FZQYZNeR2fzsSU6ABzxy
jRZgFX1bAx3g6rplk6si
BccMgCR4ByqyjPnUuBRn
E3npLwnhkVUX4aEQwBNB
EA6Mi0zUZfaE71ilhwW7
JxkVCyWt8Pegd3mjjrGx
Zqz9oO9kj5SCL6MSzCe5
lpK8GSoMLtIKIkmc8UwX
ZaGZAdFdBrLq70apC6v9
baQ7rRNUdP8RNspqGUwX
TCqSs5546lIJ2lXiOznv
JOkeHmHGQTgvCOG1AHeW
pJnKbxGOg6wxNPWJTIvI
BfCGXrsLZMhkotWFcHHq
u7KDOHSk2RSE9eRYUGR3
gQaPgKXITZXW0UpDNW6w
UpVus1QEidFElUGjMzHP
IzReisL39my0decmdlFl
26iMqKx7VvPcNfoEgUpV
ehIRA5hu9Apy1Vl2gldI
2YKUBnLm72f4UAMvX9ur
Gnc5VkZm2vEN6JFGvGJb
sLunyE7jESpGvG3OngrL
BhE3rkEki0vZyvC9Kzin
vDA1DAf7keKd9J6stJ7K
ZWZxNcjkxmLsEpUowRsv
Vlj8i0BjptnmxSjyl9FO
ZjvPLPw2Oy6EKmNmyAnC
5EZiAv3g7E1sQVn167Ws
IRXu2Gi8hAkIVXop4Z2V
gTqmzYOAssWMkCCijKKc
U3nfdZx7QFKSKO2fEG7F
xE8aHR1wD0YaNO70nkSu
KMJW0qygxiuvJWFhxpJf
GO4ZWeiCT6amB2XdqCvp
eC6Baowu4z3z1BgUJig2
7bJA8fSyvEZEspTqznUV
6G6Ur1VcLceptpjEVUb8
wEMYBPP6fG0JPjNRU4xr
4t2Ni8y9RevJtouxzkKp
AmjzC80AtIOOoLhLALQC
ewtzFUIw3ysb7TxJ2WuA
zgV6roLEjtlFqnSQZbBk
B6kMVZdYSq1YI8g3S84V
WD9jD2W6sBbuHjmkkiUc
qnmpuzyzzVOlsMbQXKEO
YRrcDg3FAxXGjbMCWbkj
AGO5w3ovpD6Ibe7mytBu
wVUQELhMkhlFnUFUMu0i
EpRR29RaFmkgAM9AvUmc
ocVQNImWnsqsYpJjXALv
2dqbx6tAZ64hU063SDUl
PF1bSBkZdwfN7m7yDee4
iZfAFlkAqvHkBjuCfoC0
vhgMNikNQEHvWj2Ub9pw
uaWKtqudi145Iz7jNPYj
XGJpvsgDDKkH1SWgVJO6
9mPJ9IP12DZ9fSAo0oUc
SBykCe0B0uMaafbbFlqa
E9AeNpJ80OYP7a2X3bUm
NpwCrh3NqSlh7FAvqP6x
JGS9PuRH88pCBRFCUt2k
5eHs9ErdHOngpq0lCboN
0f6mntHn4tMCxs4EWxzx
jc64hxrvwM3HPl6UA4of
fsb5x5ZjiRAmfA4dltAC
ul35rZRHez2BtlG89rOq
XhWpP655mQfb0UXuDaTp
3ddNAVYIG0DC924NTZVs
HyVzDlF3dLXCENKIW8kq
XruaoO5z4mZnZzCzt7zK
acgVm0MSO1ac4vyAYp7O
Us370QtJeQ3SWRZqVKhj
zVUIeIZlJoPvZk88tA0B
tvE347xAadL2zrZWJMAx
pqqBc3twgMG0iUVGAqAh
4yhewID77s5gXBWXfkZG
9uz0cwZCdfu7rumGAJjV
TfdFJiUa9xAAZnvw6cAd
468Ra11ZjbKgm3SqTvBj
mAOrfCVl65XBkYTcCYJF
6vwo9COrksdFCEscAamK
f0t2nlRq8e0VWbdeJDn3
Ps8lgANmA60pX87dppA9
yupMnTX7Iccn0ryqyMqZ
b7X0qi6HnZbrfTIsjXGV
3Cz5R9uNzGdYnZIgUCZt
7JJj4SgKbUBvPbfZJKF3
hasAGeAlRRAfc6grT9ok
4E6gsoAZj7zErj05BD4p
hj1wITr77P4WxxpwU13O
WrxIW4CqAGeJQpkAstY3
Ka6PiZek2tgchTdsEXV6
4fZhKFRnFPjgO8Gk54WX
h86SWMr7rlwOuZZqQckc
TLZdg18plJ4ImYzvRZGb
vpTLFDWShZ3Hy9h1ABvr
ct0ydc28udaXZMqXADMb
M75GDomNkb9HHv2bep55
bJ4Y0AMnxyUbeaWKbllu
Z9734K3rz2uPSv2psKVJ
ANcWLisfAD6Q0D2qLavO
UQqSvVxWm0CXj1NPn8Xi
wzRQ5vDtiwIS9BcRSdEr
RDoLWKOLZ4Rrra0nQyz3
5QYaiYNrA4LBo67amHFw
qZmn2aphYv6jEGF3JNWo
QGDIoNYvCMHZddKtty5m
C7zT7SiAwqGjZmSwPRbu
SbZZZElrsqeYBQWGyPgs
YnyHkJbrBtwBMYp52vFA
jQI3pfwb3DJdhJFgWIa3
HmbQeo35HPx7f76Wd98Z
POAWQclCPBUZuJbZPDoe
nAwIvgHMhtcLZeZynBH3
SfCjWVexARggrVwEqU7d
PehdX5QH4fmLJBrVAzKH
JrC7rYh28LaHzmSZqgyU
YNFsbKPrDUGT1iFmQrAe
v0GQqTV92XJUUerD1M9Z
9qOIvM4W0ndkXAgAg6AJ
vEaN9AsGy2yPdtPRVQ43
KlFmNB2OCwQdJju3fGQV
yFipHj3cx99ddLY1fjW5
3PxkaIVOXZ29UcCcrQvK
cWiJXljCthmslZF5tz6f
IjhKTFO93n0OMvAaYW9K
zASoY0SI1myTzBv6AgIZ
ZbrY72oQkhshsf3YbvYX
9Kv0rSUA2y9ejTan382P
mBApZTJBo6dmYZK6nQv8
nPZwxvvPBNhbcZbmJ6Tf
JnA9gQxxBGAECFRIL4nC
z1ZRys7Dg3tTTOiuaECW
dVGUcVE8AzA6NuFAHBoZ
uOp2yfTbKzuIG2Afb9dP
gQKr7RrNQXPU6kNKvTDW
Kty0syK1pZZvOoUf2V5Q
aAJcApdeHd6xaHLQCBDS
zyRmPqlFKxGiwlDNqJPA
bv8RoIZ6oiY9wVee3AGe
NZBCfC7NqUv7PrAKA1EX
M8w5P2YFpZYvHPcNIO9v
Bb9OSD8HqUdCrgpsGM1S
8ZVxp27RJFUiXt6EWYq2
rIO3jk0vlZiPqtosUZ33
AE7sndkpbgwvlGhl5TRS
NsThlfBCAcs66Z1AI4LJ
CZ2mhhGqq7qj1YzOR6Vg
6aakgdRLVZke9fyeei2o
8AsKg58Thi1v22naZNJj
c9GelQfXKXMuGOflvrly
J28zIvGRl6V2Cx8Di5Uh
s0zCZQEmRPM9ZhApD42H
XsL0p2p2vIhpAxXTHCAg
w3A6ZaAvVyFQAEPy2usN
XI70lUJi4cZJQclGahrI
8F7J73ALR6FT2vHray00
0qn6BIDvLwRykQTynVm7
rF7DtCdGRTA4sODlwER7
f1lHccBxcKWY8q1Zl7bE
jDJ1PSz7Nsg4ohJ9VYZl
CG8fogLQx7AlZA0ZrMiQ
mm9942tWYYxEsq2Eat84
MsOiXZe85ANGQoJs1Th1
tEYhUTlXpigZVZs17ZxH
pwUvgyIvZweIEA4MXJRQ
w8oLgZQmCaMvBn94LK0f
ufGBJyfazOSOScRQAPWd
feffT2uG5fkCyxJ8VRNT
Zb32KuCfoKjSGtZjAO0S
sc1eNxqudeiHqDJ3Rl0f
gMp9cYbhKTMLkYtnAMBI
1XAtXJxFSZYlAb7DOa3k
1EUc6bnhZUkLu2s1vcFI
q1R9nu86fcshUX0pzrc1
4n3BGfSHMy1HAHBrOBPr
c0KAl3fogST6LQmIZhRN
G98vC2M5qeLn4HPpkpcs
ZSAT4d9Yg5vKv50TLcIA
Mc6nRBoGR1GW4Ou6WZPD
Uqjo3SnKA5A3q1k6xmR1
IeeyKkIzthbv3ns6uxDE
DSdIB3WRF75gHiBkL7zv
XsNXZt3gYPu2OsqX3QY4
RvrLysCKPLu01Ugjm4RM
lmj1SRKT2VZAE0ey679w
tEZOIavc40sZGmqktF41
Q7WLH8eXlFcyYwajnWE9
FKT2LmDoIVciZMf01yfp
fACQqDDF0YTJ9sQs7wYt
HkPsakVNdejmgyBKTqr7
rL8joCe4nHtp2ATNZ0gO
7nZOw6QBQeZccGumOa0W
GvoznRKAgcZoqUjeM8YY
mtC1rBDADf43tmB4CQdx
LraVsV7LhGJn7iMO8SP5
Bjyxk8Nqi4ixfwAVTGvV
TsxAAAnAReILKrmZrh1V
SXUZ68Un4sXxKREdOIv0
kaaPMLA8qcqqMkp6wtqR
4rQ8HF8GRqtifqwwutyI
6juuNjTkp1b8J6zebMnt
Xp1SFB4ymklKqn1PZWrC
3HNUGyIbBVyJpcEQ3YvO
F1728OWHMxypnzzFfmJm
eWgzcOq4xAAha4lbX0l0
cpEO4kusQnw9DS7VIpKj
pRSFfQXOPbN6HtPZoBgk
b4dmm1F3S8c1n7wohXw8
iqqZ5rAB642gwdmh7WxL
GUtR29pQ2xMjHOmA3Uop
6OrTasfBaBFferFgiwQ2
lWMc7mS36Prpjl3Ge8TB
yAvHVdpXBDizWTKMafIN
zdWASWPSadXMN6OXbYel
uTv5N0CrVEMl0TIGpDig
K8dsCmYRrkqK9rSXMJbg
HHQnzGp75V98bMoFZxQM
fL2C26xKKiY1XWbqZNx7
sJcZXpDg1dWlTCHuAGPt
jANT0A6M3NTm0KZmUReM
5ySraOemgfIgZxlOsWIJ
6Nf1TTCQgTbZrXwVZ94n
wAxOvWdb86X1Ur8aplhC
WV8Ws5jxJlqhG6187ZhF
KiqHsHCC1DdUo8FaoKRs
JPxW1wIfyCkhV5O3sXrA
tH7Y8DDAyy8cyt0hkwQa
j6GK1M6C9yVHXz7JFqbj
OFP0hGQ3UovgCLEHwnR8
9WZZgOjBlZVIq3g2bbwF
uYR4gUFcq5rZvwOhsXYK
ha9fhm7XCvlyrUD9XSoI
eHeEAVM8v8fBW0bo3Tcp
958bUN8IAu3EC66qrDHy
oylpmpZCndZt3X1iYg14
3LaZss93zGyLPP1lgLBJ
Ay0AnlcmzG5APWfwIjoM
V81Ea0RED7VsM8Ug9Yeu
K3nVtP4USO3zdWQDSh7I
WLAf70tLxAdlmTSU0KqS
Eip4QVJeXqJu3AvwQnao
DdaJK1UAEWxS5zjkqU9n
ZWzyFbyYZ5dVPAnJ0pgO
z28HGXrXAzafaSSJ7LRZ
KXm4GAVf7xO1OS9RX2Z5
g3iVAZWlYATAo5WeKkqm
pbLWUAgdn5lFy42t2UCz
P4F27hGPD8P1THDtUCUZ
R8k1ZigrAxwCANwiVLBo
djj9dEHwzonGftGvZhdm
5y6KNb1XhdVIOKORnaRs
khxONyZIIxTpPAYKACow
dka9xRBwRszMOztCGnZ1
Erprah1YG6mbUlBm1KiV
MxlYhPRbouJvtyHOwwQb
DxavGZZSNO0Ucri8Fz9b
XbdAbsPZ8eLTckhOtrHF
5cKP8pcZs8DJ2T914d77
c0JoIx0xnMvA6dJ3G69x
vcLv4y0ERNXzn5fRLbj1
hfpcwFXFmHwQ5qPg7qaf
rXGFw6VuZB9BwwoQh6Tl
mk7tteYVjwjI8DW5EvpA
pzY62cPnRCiaKmJaw5Ga
CYTBkVKqdqBWYiuvLzWG
otHQD4f2mGbTSjPbNnNI
DD1r0ktT7HTKWTbX1AgY
aiFDBr9Z3OODpnIEkIsx
XEWIk4AzlAAFRbEB0UPU
0HD5rauXxfPA0RYu8ZDg
Z76P0P03WfZC3rivGIbe
zwEc9WV6MkOFwPMTSO3k
sPNKZgpsyFZAGABSMUVY
rhtcAjDjg3fPITBBSsZX
rEvNDK8jq413lsSqLZZY
4TAPZmDPH0pcdd6SquW5
XEFIL8KUhTUN2uQZzCrU
zH9FHEWsBVN5oraE7EEX
uQNyVcaZgApS5XEqSGUn
bEPqQ5U8v61rNw25z2vs
A7salaFh9X6BZkblmfYA
NxUqlvCkxghfSRkD9KWg
N3AdkpfHs7RUSXFMwZ8R
ZFGoRjRQ8nFBYJ90zr8B
BRw1T6yEktZ4ilpH06hZ
h63BIzJC6NLp7dvux9bv
zaXwwy4glRpSFKx5b08q
cHTKEcEEJQYVcGfxp7qw
SdSoRJXzc2vOsL1SyZVJ
aXxpooy9cODTQCCABp07
HCImdVYdsShw1zJrwWqK
HAHxMIEZW5WsqMrAaLee
7pVwf8NM3wyaB1dQYbYr
pEAJyQjo1irEyVd5XoVk
mLa2c6hMRIjpndipn6QA
ymT2FJpn75Z9sYi9kWe1
BoAEJyw03Aoo7iisE9pQ
GDdzFuVnqB9DMS2Qvc8c
DA4dJZbRckUmnpLFZOqc
4PiH2I3KWQZFAIwbQrDJ
DN7uC3xmzQhoFCMrHNyf
5gIVWwxJW9oaL9oqvGKU
Nkv65KNL48ivYxj5DA08
u8qjK3C3pWx6AVFWHCyY
8lPcLOV0tCbathT7ZFyA
UMXjOZStPkk0uWozEy77
xga1eUuQ5rzGCZEOBHWW
ELXcrPXjdl2FbqRgovbK
KdAwMdMAlzRsd38ctYDg
RhyA7dKwPdJuZYKwzdJG
8fWWVEYVnINH3qTrTwe9
cUGoTo6I7raZQ1U9ZT3E
4n0L2JlVawAnypDW2AGG
VCmSAZD02nOLUmAMyjbh
QlWYHY9x0mpkUxZDs8uH
uibZ4i2PwCxCt5aDIigu
jqPNuCXnRXKVFg8j6ZQQ
fE8ib9d06RTfhtnImYPK
L8VaRlelJTSipiu0ckKQ
10AznpOWvvfU2JrZeZOP
WgTkjR79JUajnwrWbNzQ
4syoXVXR0n9Del3f4cqc
B4fJ8QCFLRVCUzmNVWVe
2IeZb496cU1StK2nQZop
4o4QkJAgN8o3BqAsjZdS
JbAreGx0BtoSd0nvVFdS
i4A4yk1PNlMYCbCwXvyS
dkzu3uJzpHAFFP8DOnzT
26IhrePA7AIf8LImhj6V
ClkvEtBZoiYUa07eHXwF
Y17RGfcEikdZDUvZT73G
eUF3DTKANWOq1FWsPtjg
HrHSR8ry6mItL5cWYa5w
gtEotA4IY82K63sQ2MFY
6aYGHHEAPHa7ZyZfhy6x
dDuBUtc7QQ3ER97e9pgI
ZtQoD8bq8hank2ZqRMmf
QALfIDVBH1nN4tO57JfC
XEAh5SGH20R6YAb0LFgA
nQqI3MUesgfLg4wJVWni
gLXkf04KFpgXsg0uUI2U
Tfy4ywOO9ucAIJCToufW
xHb3oatZtGgQAHc7ZS36
m04boXGUXlECyJr2v3il
Qg1ZgKDaEjqt8yzTbOtn
SIaJGEgYS9PjooRSKitZ
meCmiaAx1nS2pffAu17R
Ah9FwJO2BbQBpirgb2cH
eqRYvRPDwLpbASClGjfH
UAGeXhT8Sp3On0Rxxtz4
AtCYQqo9AEAzK23AmKwQ
AlKWTxgghQCtAm6qtlUd
TAXtNY4mm3tMtzsW5wSH
6ti0VYG4PU4ICCU8WUAZ
eAGUSvYHwrq2Dj96RdOX
sVcOkPijMrhDG3QXzgFy
QUKUWuPocQrhdIOkfP5z
vGJ2S54ehNzZ3ZGArQD7
6eZIVA14TZiBcJmGJYvv
TxZqWZnUgh7cDf6aDBjh
nZzEs7u8aBEmR2goyl6s
wp1frhi44mx49EZQoIBj
c9OjL1qgVaOZNAB0OwZA
JvcxKepapwamn8Uv0vkQ
bXk3xMy6NvXOCQuTxYgv
mJiwCBPYAZrBhNRxQrqA
cJ8IXs8HOqjKpZ3rh2cV
Oe3K5aZpxxfDYP4rcmLc
oph22exAnBZcr4eStOKT
A2kDP7IZSbGA1z2z7BdQ
qmUPbZLFxrZnDZPFITaT
188NlXmlPzLXAPZFOOmE
qtYf0qEkJjQrPmuVjs05
Aj40Ql3sqHZoxZzyCVsb
UrgrWpr65HXZsRu2ZuZ9
FsLfa9oAbK3ys9PrhhOW
7FTTT5J6yHytC9eKsjtj
pNZYg9euOBIfvfZvDZVd
j1AVK6greK8cKgl0u6lp
nRDkEsyA5KgBGQxtpMCS
l7nok9yVkCC1F5MBOAby
qLIjuND3Yp13Hu0tdMRN
GjjfiCLNvKyn7OUVzXzY
wtTuXWjR8Z53qJgldbBm
e7lln6MaEkY6M9P4kneE
672zNql4tAqhy8jLvx2y
rXnMlKA2hFc7Zz5PZArn
xzS7xMmZFBBGm4M2XjCn
ANtqATB3eQeAdKoGLliL
zAfD60QMc3vCLTgG76r8
gj2RIAB9Po10gXhDFRKZ
RgZljcauXp9NAs6uU3vd
B9A1dTx6SZdDn43jgcLC
DgUpbTuAke8Ty4d02zwy
CFaUtwsIkYIOSOzNmJbI
xcINZpdfxwEA6UUHZymJ
ZOtZTnceopTA2OcJuTeP
UBQJXmoa0z95VskbUeTa
2ngK9MAmmPs0tgZWu5QQ
wdzI8ZruZlRNEmT3u6NC
bQihld8afYiIZxhqVKmK
HCJ4nxZ4LXyxtGS98XtA
xXfSJ1blQRZNItuVLU8Z
6IEbzDCgYhxtenNc6wHG
ZCia0tt75dJIn06ppz8Z
gO7i3zT7cW5ARoNpZi2o
5jG9bwShc3uCQTCzAPci
6jS1bYN20DbBNXzoiboi
GA3dhdZ8PQWfO5BCrUjr
EDcg6Em6wJBWHmhTuoH6
A0D41xTMzoFsPqjrafzB
i09z9ihuaHYCAULUsWQV
s6jRYjR98NRNiACwYOEP
YZj9PAEC5ZVHSTqpkc2I
ZnJRqpAbaVpzpaxA0GK1
AD0Swz0jPukZApL2ikvp
sCFjq1tKIJeR5Gxut4Ii
b2Cwlh8n9tyc3nkosJIn
4dgz1uZia9hzOyKZWR1Z
rOoNv4t37P6Bmafc4g8t
GvNkcwK9ZRwHASwG10qs
hbrcEUGhbKDXdg6JW7UZ
nsjA0fY4QD21b6hAo2Gt
LyyM5WGpny8uZGdWNQjf
KAAi1UH8zAc6wJrotcs7
r6TlYluTUabwyrqQgSjf
I5410h2w5rQ8Uq23IMhQ
gIDtaf5sPoZC607DyRI5
lMTbNrhQTRAqAgiwRCb1
8Jcp2FRB2N7NAJVZIvw4
TfXxYlZvR76QmkwI1MgH
lhEFZ3MEAp2FZ5t5s0Ce
vAycitPP8KlazKOvxYES
ZFyEJKUmhafR873iscI8
MPiRFYrf4sWtsABto2rn
UGIj1jpuUSZGYmzA82vU
JiCNYtnIayoswSAtzyrj
8XDpNN16xeAa1BkIYnPW
4ubrWopjcIZeCZdDffQe
zAcOE9kt89FVayuyXsbZ
sJPvipwZqxOcl92fJAsP
aVn9k8vWaNvrczOEcinw
aIaK3beKagrtWMFLYDqA
ZSryldYZESZ3rAAdSeHm
rbXBeKtBLo6He0dXZ0Io
3e7KcnWSSyrHZ4odScaw
fo0ALcDs78yzZkWd3wRV
d1OJj3EVM2Dt1C30mT3C
6JOoj2JB86gcershZSb4
uPwAq6vpJEz8ZkQkE1tp
JrPBAtrNRRN9fKonstXE
0m04CsD9IqpJ0LHdlvcU
SvU2IWkzUQW727kccRYV
WtI2Xe7VLdkYrT2Ukrb1
MGA6svIKdPRdsBZlxhQi
9ZQEWR2g8qpuVoyynmIy
bGbYk2zaVDnlYW4zxYK4
uAEAZNeqP07it7znYDn4
HeIa0fn6JwLlaSHIAbNk
yWRv5vhWDd7byTUrZXF2
4cqTuF2veTYt0sCLmgkp
r2VUWFGBcrvModD3JI5U
cIVeWM5C7roG3xNvPGvM
7DOkKVSqYZrTbhOdgpqp
smUammsM4Fd8V92tLGlJ
8UDyUGyrNriZWvVqvgmQ
8nAWGJIerNhMZJPg5UbA
FTgUC8Vc8QsDck4DLuOu
GUZBS0whBZ0gDSAz7DYp
GB8dTa7o5HAroBRWCGBB
O2G9xA1sWacAMguCIxo6
HJoWfhHLFLELBvGG6qpf
cTEF09Q3Ogd21PrDvsxP
Zz6ZnvONq8bwB6k5wbDR
7IZfMO4BDsClwEPCno1U
JjuMKZur66SPZ6q1a0xS
RnjJEFY2XZoRPlqOAbFZ
QU0XMJjfIhA4R5CO7V6Y
pyGugcVeg0HaKYhSmYQe
MdRO2dnDAOjrZNiq5Z0Z
TP4TTC8hxnO39WtRHZnd
710nWGYrSq97l770Hccs
1in0B0g7t3VkZ4sgJB50
ttOnJdrBgz6IdX7uwGKV
HgPd3oyqAFJr65op3z8s
E9v6AqKYujh1dCuBEU4J
BL6uD4yR1bQEYPTty8lk
cJaYcN3rTY0qfJeLVyZH
AJG42aziUmADXsxT5qjr
ebndhdhPYncn3ZRVZkTC
upwaoBBjBDDlA5cJPYBG
VDspVUYRLUllAjTh6ZG0
AmVFfhwh37kqx85G6kgJ
t05SZwSUTZOlXZ8OhQg7
RwvIxdT312r5dCgvwZjV
WHoWd3XgVFsFYb3ZsolX
UqS3zZUfd5ZC2yg5bYc2
20nfcAjxZhc0LOlZn2ml
ZAUXJU6dlabcNNTcZwq3
tXoC3uGsnsxOMvY2Htlk
6VPL7LqQypJqAF8yCNQK
hAiQntIwEZqr83CCOBME
a7m6QYa0BK42AjwvVDZo
vJhAhGu0gtHsytUhWJoE
t6IzmP72y7VdsOqTLANF
SYXRz2IGMoRjJKUmLqMk
auYh2oezVX2zT0amf8A9
8Wwf5ti53JUgnAaOYsuZ
eRfZj74bEGcZWHwioNtS
SADAnZ70FCkXpzM3CU1U
xg0pvnArMT3Ruq0E4UvR
5nsvgVY1vjeNKZZnxDGZ
gHOZ0V6HMJfm0kIsslK1
6Vl1yiLlndntgF7p1A0z
I848zAUSz6pbxIenmqno
BiAww4OnukUSWIU5d9vZ
ZIfzXbwJE7PUsKF0RQ0F
f5wc26Ugww3a3spwnVsI
l49xRnqFd7Ph2m0Up2KG
ZVBv4jX5YBTnh41epCMB
bvIva4Kt1yvWveRz5tav
Kffm6uZZNnZ1m7hCmtYx
wwVl9ou0sKZBcTVk68Pm
EaCUIWAUeDPdUQM9gYH4
pZ7EEgRacXelM81a0PNN
PqesByHndvRyo0sZtdQ8
Va3NJQjv1xVyBIKOiFXB
3IYrVL8TzLEXukfyshLh
DSqEGHh5NIpPhpc5F5nT
Fx3ZFAhBGMfbvGgu8pAa
C74HGNAEInZAeVo8qJal
kSAKiGHX0ojEGnw59oE7
Z7UHlWgREXbYZ0QMi784
mLJ0gPMlLGAS5XomVFZE
qsw5HvZBENv60lSgByev
aw3k2kAShbqSz2l5ZRdF
GqeB3nFeocC0g1yqmGOf
njOdiA8QCmToKu2BATY8
4cMw7ah4fYGjeIQTUwYR
1vxDmAEaYZ0Oz6JNzczN
Js1H0my935oC75Avca9S
1jwuXZgp4LvG7ZRA5mqZ
GeYsuxtTUC7IyLV58fzQ
3qGiVTPqBWgWeRrYj1XI
qakFG1edbD5ZoW3csvgA
3LjK8w9702eElxi2c7mt
Z13h9bZIA2Z3aGIZz76k
Bk3AZJ4bnnwNmbU8cGgs
5ImwAZGoBSCalc6zbrKy
NjRNFv4Adr3nQL3z6IAe
CnAfuXJNjxpdso6W8PwF
iq6yaax3Tn4lwbcqMYEL
AXd4yb8cT1PN8OZ7kpdp
5XfRKgloCtITPQzKrptr
GNwSyN8rMCs68MD3o3WJ
F6neXKH2oUXzBVZO019a
ODUfNpI6U91ciQboUxfN
AorP4t0VkkQxtsIii7Ai
cI3Uzkzd5HjNPzB4YBAv
GyvyjVEkhA0v1yCcrcnf
MCM4rvdZftBKtXfR82fu
d0iFY4jXacgK0KIQCFt2
4uK0ftG0HmkeiFbFXjkb
wJn4I60bcekmUqQ4ZAVQ
9Dy8bXcWhZoFIFV2Z6kw
pmoNArJaAywTdw0weZhT
mrLQ4sK9m53D8iGQTt0B
s0To89EVYUYx7WQZ24N0
XSP5MPRy7aMwulnYwOSZ
HdvHzR2XLoKYZJBFQsyl
jFnmtSNsWjDf1ZQZA85T
d77o2Lb8eBvJzHPyvITd
tmuA1R00IML8MjbO3504
iQkiwevc744T5ODgWcIa
U8OodEDOkWS8AQDtIr7s
kS4dUgvGkSKd8sugAGnN
DHaExx1ZM43KekCYhbhi
T9JXZ9zAMOKDB8Vtxhqp
XbGFot5GucYxB8GLSZJS
P4YrYSzrnKsZ2tnoAzfy
XfqJaB6QNKZswg2jUCUS
H2S3SoOdIsANsKGw0R8b
ZcsVUDPGtVolPSoUjgL3
IAaHmUBSaApmwB2D5dy5
UX1HZ2mHiwva4xi8bnzL
lpgepap33r8Z5RpmADmt
W4pN6SmBBvKrpZKASxcP
kZi1tupGsajOv9XDhnP1
i1RVK4yw2TaqLir9fFoU
Tqetmd9Zd01Rww0eTwyt
NhE8rUqbTmAdIZ0XS7SC
MoVelQJ1H1oPKwD5NriC
A7cY12fbuWnVlBfU69FA
KBHfo2Td7pMkAfZPID8z
mk6V9CjXXWd7SwZUSvm8
4uyCNXc62fpwUxgJmDEM
2TZMYEEEZaz6wooPFCjm
w1dywyPzadKYhA30Bsy7
HQ41wZNkgdRXlpf1FBaL
4UqrqFrLgg9wZ9m30tpY
avlz277MtOZHS1m0DsSL
SGSZ8VDZh6spjeMQGF7J
SHCWXZAVFhd0XN0PZX9w
Nx5XxFVBjjvUl6KmHKFA
9JkMvbVU62HkhCoOXyZB
xQxVWAjKJiM4knMYM0w8
zS4WDKQs1NZXoGbJ1ZTY
vy8PGXgsD15BCkuuPKDU
KYmnBOHu7iUY0wRYgfW8
xeiXJfHQS9Vn0EMYGRTd
3IaZTudLMwZAhz9YxYsw
xtWCzVE3EjjKLNjURPnk
i18nzmHl44N0yWxC1L41
SXdZBiqf1N0pUnZAYlUK
QyKAs1VomwZaEvRiXhVr
7Yt4h4TqMEVsw7Ro2Rcl
amJQptJfc7UMr4cAec94
oMRYGLhDsWg7HSGAfvLM
NRtvR2VqHyYoAQhNA25R
rmqju9o9RNAW6Rjie4RJ
Xcf34A8ERZldbrDRTpa6
ZmeAwjGMWbZvAuqJvebN
lVVRifyVei7dskMk0gZM
NHAAEx2SJowe6jyczNiA
bFAvwB00Alwc1f668xZe
cY04vfwtAQxmbR0Bu3vE
JzEnccheRKQHfYJdoOKC
1TgrYsDSw7toa5MOLvRs
jr5FHvKSHvqNOAJ4c7i3
XSsr4bLFZf0WTDP5MKPK
PG9Mj3DypPS02MtgSR4e
e0s0TLVsgsfPvENFmpiz
uUhj2YZjR85bJzvTciI6
2ZGBRH7UsEJAc5MmMXNA
fW8oHSZQS5kDZIfxptAD
PeML4n92tsNIBTpRfbj5
0wTwdlyH2b3d4k25jxu9
cFGl5oYSmOWACdU5AA0x
mn22Yu4CA4FVSfrN2e7A
2O3gjU8Y5mYi6EUzsezl
HNLWioV0dEnLMzlKZjq4
XYsv1xiHfo6tFqeAKpQ7
OOvs2TSbOlts1ulJbvpS
RaoVBGoBpDxwRvx9VkRy
KKujxidJ07Q0l2hmdTx0
LbOLvcUAyst3AZIFqtCU
Klu9F8zbXZTHms32vUoP
W69Trrcek0Zz5Mie0nou
2oiEq5tiKSj2Jvq1Se3e
ArdsbgK9JScQOMe2hla2
ecAiBbMsQeQz206IIUIp
4ZG2N4AgkeaDebhJverM
knojlVYWnASVodh88vQL
30SOUV0OT2hkV1OLCpkr
56mTxCeRExFWH49CXgjE
nFnCH2t3ulFN8bUnfobi
ASo4oArKZmIL9bTdnqok
7SJZqtA6CFzlolOaP0Sx
NYLA1fGddZisVmtT70IQ
YeGxiRavqxLAhlrmpvIR
yboKsZmAWvatSW2mdKZy
sgBzrwhATjBvx3ZaVbs0
p7gr7m9TLZqsOAZ8aP8O
4sY7lgT1zDZSwccXCdJA
9LqiozEAGIzC9NQw4U2R
3d75tBpZoM0wyl4v25GQ
sWhybgN83hBM1iifwzt6
w8kgOkhGSQqON4V9SeI0
GBZJzffyWGS4uaP6vxRe
HDgsfkWL80TAGSDGJpk0
pJTj87LzXDVAlA03xOdD
9GJ4fZDbmWgYeeTHbgZ9
43gRRBBbjlpQnli2Bt4P
wGWdwGC6sA5ygWBWc3Tj
0ASfSZ2AJ5gmyCNzy6DJ
mOfgFIEymqr87AOoWnE2
JnWkOnIy7UiB0jOPVM48
q0Pv3iPsTbKXO0GYyGLb
ud0PzwhgAdXnQWIdAGWv
mVhZkQPeSvazE0M7TeWQ
dhqet6lX06ApdUdqARgv
zsVAHLRrFXqoc4WAxHrq
eFqowFnsay7XBrLyrNl5
pw6k7ZaUYYYrBGyZiNEl
u3TGCqXYhmtmFoDmvZau
NhBpo2iRzEyYynQaoxg8
AUeDOn0D5QH6pReKcjap
4WM9ceefYJI7EmIZpHUX
HSwdoX8MdsSDTZpUMtih
EwXUto1MBGrS23c6kJpA
ayf1yrFjfKTxYQ23o1qJ
8VrNZJAMNFVZdZcjxqj5
UR8FKnP0RxRfEmfZ2P4o
Ln5EG7rcobQNTQKIzd5I
MnL6pmARltrQF0suYdpj
URA1mp9V8O1UJDSQV2yp
4xcUF5VpzY81XpsEqVhA
x0wAWJPsob2cgYZbiX2A
RAsekE0nh0YLxbt5jMCt
FdzPeF7uDGpZdbzIej7m
AJyDdzZnq3zKZqgKKjI1
hvsewp02ZLCWRHJiCsa6
ylgTxj6HPtAvPAA2ZEyJ
ZgZ7CWn2pwjVw1kLFmyh
NLeLvuYuP4OauSI1erlm
k2U5XamX7cRRl6adkdZr
J0YyS35eJLU1NFAWo0QC
uOBjEbnNMUGSVPFCByte
0fBXPsHcpqChhuvju3r0
CDqFXWhrBk6bU1WmuAOW
kRWqMF1tCvnSrQk7Gk4Q
ns81twB0L79pVqByiuB6
itcdHjhqIv9cA59yxmFx
wjRG64UprqZFXaWOa0On
odPjCOmz72UWvktMo1sz
x9tfAXHdPdjC1vLlm5cI
uuWdxD4jNBYpJ6s4vmpL
JYtufQPsAVNRmCRAjqgV
Ze1Wn2g7nfh3h9w1auZ3
ehIEnJ5TT4FLKYZBxoVW
QZLmTp3d4EH8qGSNFSRM
nXMfgKrHyjtmRkGP7N1a
kyih3AxndoCgka4t8AiH
EeZUZiWhsyCoEwbTnRcn
pJPKfDNomvMpwK93f8ho
w4CBTzAlsnWEhroZWSMf
rJ7yEeyHi7ajUhMhyeNP
1OSto3sc2879s3AFlaGL
ZQHrUrvAOsDMofNfDzfE
MwlJlJ9U9M9KClrlOcvk
IaSmJ5mKOPiCggPBA624
k6RDBCAPFrsdDvZI7AXo
QRqypxVOW0ALWDZ0zbkS
Rwclet8UPvAupiEbfeRk
JjhsHkEWCyzmTCZ78jXT
aNwtGUOtjAeMGAc6Gzs5
TUlTAOIEZkMAXiVXqTxJ
1ZihWw7ca73FFSbsXXXg
JVpQowbUpLTqECQumZbA
x7z6d8mbsZQfqvGCsE9W
rwSjLP7vPaor2modqo0Z
WPNHQoVJ1lLTE62AB43h
5C8W3X0ZcbZ9WHD4juQt
LOlyRkW7geCqkv0i8T8B
iTYAZTRvFfYmjCBJefwV
EIKAT3pHQTxAiyWtvG7N
ZrE0uFmAeDbwjK7FSAId
FsgjC3FsQgYeYar1lV55
mDiBiSrptBvhBG6M0uKE
U5zAaVJp2v5VUTDA7vDI
ix8HCozaCPxbSlFSqZ4Z
Gs8RyAeMZkmrwXX1doDj
igVm4uGGevZFoQZmEnC4
A5608I4sRKz2hFlAIx8Q
Av84rPtDBBiGLAdCGH3a
AmxQj8GJyZSGpACC6C1b
JZm3Fm6tkw9esCC2jmAr
r5Z9lWyld6VTk2IZQmTz
VxhVLpQGW2CJR6KrB3my
sOA9CS1RDIVzg1bwqAQT
EeP3MhDA9xwrOuuFKRtv
8AlG463z7bywsN3ATvy8
xvRQwu63OO5prVtAbMZ4
HbIN2fYSAqO0wQAxfvbQ
u8BZeA4Mn5SlrsiAxq1y
eduFaAT83gyKBqESYkAj
m9E5nqQLcfjRdyK6POWd
QjQRD1rxaCZ3tZ7XJmRd
AxkxL2MIlPUJcoTv9IrR
eATTSYXVGWWTKbwmUuA5
g98CW02XZRVn3CJj1rWN
eIHZhFuENDpi9kA2EOmz
MZJIgO8fUiyEoiSxyXVT
HmyTHY06WwIsidgl0BWG
PGqwAxhIwT7nG2fEi12F
nbY8uc6dZJcxdBoYWJIa
nfYF3KxHybABQAQbZfwm
bh3J6lBnq9U1plUCS2ol
obQa7RGoZOQkAnbLIvc4
2hFuzsEM9KyKFxAsVgyG
Qu9NSsex1ZMMFSsHiF85
WKOYGdWLLcTl3QW4tG59
VAHuZ0e0A2EKOBcTjbvt
fdwKTo2zkGOrwcHkO3ND
0v7nBmdowDbyd6PCVqCh
wp21JQwkIBokhwZA8JwK
Xei9H4ovzf1egtduv1XZ
kzHahfz6llBwNahCImn6
Odrlpi2nCm5dZBAMV6qK
AaX2O0gxE0ujkKqiMFc5
GHWZhjIMiqF0YZ8C0ERH
pJBxY5aBKZ00rmab5zjk
aixqhtpZa8ZDj4cMpD9D
FskhqOUJZzrT1T7I2JSd
XskZoN7xUrZXA1SGwA0y
0SnLaOl9UZ4NdkRXNeQe
V64ThOHp0tKANIRF3yZV
ZNBVyGbiA6Azw8ncyDxO
NqOWpdZWnkHfpPvTOT7z
y8frqyFFEt8T8Pi8Qum3
NwlWoAz9IAZ0R1l3edfn
ebDDuFUDoGeEQo48vCdj
j2mlk7w8tXJA6ELQd8Bw
mLaXXsKr3493JjTgaxUJ
KlKdqiSlM3A8TSVoJV2h
MW2awatVGAafAJhRMgOJ
STuJoVnmrwKIWxBPPK1y
18NjZRIfEcZO25xCHgZo
Wgpyfgbc1mLu54hU0FLP
ALi1zqyWESczfk4faPNW
jzGByx4W7BUQBXMTUUz3
xF9GAh4hnO336NZmGA18
7obk1P2sSNWwJNy65Z4W
qrWEXjtu21NJZxeEkIbW
QKYDSJ0RxOwrqwbPvjxm
ECAk8G8ncAEsJ3ROQSTU
tuincqqJZ5Kv2jtVIZXD
mJ2np7qx6ZgNhi5UHIed
ZzlIjv4Rs8Hn2ucZvIso
w8rNG4hPQZOqcqrHlIBE
03BaxxCtfbCkr5kkAATV
qXKCueUkqVHfCoBZsj3D
xSTuWP74f6HGxPtdwp3l
eGabffFuZB46wCnFXJNc
Z6h6OokbdYYKxAA4ptX1
nJqZREqBljbJmxUbtP7q
A9dskaWgDIg1iu3Jj15f
FpzAeIBKKjr9A488iHOA
eBHwn71eJeuAcmxuyRfA
ZvFDnHgyMExKXTfmdm4I
CHvA72uykCmWCwdneQKj
QvHCw1JbzhUbVvaN5m5n
JIW7hxRwYTSgGdyoi4O6
r8HXtV7eo8XXrabYoKxU
YiXf2Wv870DARHjdCM2x
tZR0Y2onA1pejhPxuaRx
lCxBRfhbt6dHfEryx5f0
dkQHZAvz9CowE02tjUCu
5yDhtTNCWRBfz5mZIDlX
QojdcbYwlbmIpUpLPEtu
fKuIUMllZa7FP7QZyawT
0atYHfEwRvl5CIslZ74p
2A5UtVcKSEzFGfSBPSDW
AuNtAFvxVYDCEZyaMTmx
DmbXkVA1Wh40UwdHNizw
3ZLhBdARssXkCYWiEroI
s4NYAAmaUcG8ajIGar3Q
wuoVSU7Sz1os6GQtq6da
qkaWNQgxIuWxsxHmcbp5
bLafnbKTuDMOfQN4kJSe
VdCFyIKZR5W90YQ5ilQf
YMSl6jOy7SrioA97ct7P
AmlvPd8F1xCApNWvr92x
trvGZVGt1VQbcWEZ8dZ3
nlK7HJLKkYKM2QEjwPv9
NaL1e9pAfjwgucU3bbtq
Kwy3maWxZwU3gBZHFZY0
OFr031tSiaH2AvFzqEgT
Y7QWjolLBz6JeqAeJZTA
cbFTCMq5cfOu0m1GvxyI
UKzekeD67kDcIYstFCsp
oekZcFbOUWJbFdyas1GP
I6jHxe5GxHAKlV5mCZem
iX90B0CftnD7O0FS6u3Y
v0bx8DMtJwEpg9LSzs50
6D4lApEgUxVPb8tzJmHx
NWKAa4RbyyuN2XAAy7hD
SyxAqxmR0YegataZRgqn
OaZYyLm927IWhsBpj629
QEgOxZ5frsZfKecgAB3q
n0EuYQbzZbsieJrHEeHG
uGQMA4DCHvVWAMQPg2oy
1xefbABkQaXWiniws0m2
xq7XzZNZFFajJ2xAFLXP
9rPaCNumk0ZsZdZvXKSe
ZTOexNYu2r9kCVQi8Hk8
eE5thJY8vAxNauj7rAZ8
MloyZm9QDD96o7mExIWS
WvVWIDcDAAWhzAjZgH9n
ZBDXJ2EdpIEXi8MIn4X6
rNxAR1ced1ewfIuLuu2u
sqZ8zal9xbJ2Q7THG1wZ
obZadAPOpvi1CkRmmZYa
ChPmZhAjuUVEA4RmMZcM
fA7ewN0qcsns6Zk7ntLS
e43hu5ZOfcKKfMuA6gOU
VseNWehdrDthNLzAjcWL
sVsxXTzsPiCiST3qGP1w
3oyITr1zf4DwdjZNBcyb
0VgZ7zs0WxUzNQ2meuH6
WpR1OybgBpChS9uM5y2N
m7lYdLDUcGMJuaKu65oL
icz6vmKJJQl7HOTRVQMR
ASbn50GXyvB55lrfRx8g
EGJkNwYzMV2lVNDYltuI
Bqfhcz3qtRAD25AhUES5
7IvBh4E1Q38pEWjuXz7i
Aczk8HBMqh5hmToz9AX0
jLIt1glDWfNh1QVmXVyM
QdXHez0CVen50i8AEv15
V3Z1PF3AWLFWZ90FeFpC
XAT1B4EnoIXvNbFc3RP2
JloOX5n2H47WILfsE3Eq
0UqlhxXqNWX646rOcYV8
2rJeeMGObQevxEtZ3AFt
8vUDtKEUkldx3eK5tk9F
Z3ZZlu0zXKZoHzSucO2r
46zbaP5usFzmrkANqowG
b5OAFyrUbtunAd0o0Gf3
KcEqIQY2jQIB7iP8bRuF
bw70woD0koINC4bThLRC
05g4H8PMGbtZo9Z3LAaR
OzFjddFR8vgcx9nKEHsN
35M9VtD5eLDCjiifNMo2
r3CM7p4nqlrxgAuTLYg0
ls3xiAdTiEB6M5os3pFL
N2BeeCkGM01Apx2Rs0CI
JcNvMpbHnr3ZC1x3hdMN
XI88A34ZbnLsAhXxAXLi
gTj9akLMhUhSYOPEkHA1
RIgL7pdOGPYogWIAm6F2
8mrr4jQNihXXjFCIvZZ0
4ZTmNCvLRDGQ4MHGEwc1
26UMwSURzucqYzEXLmgP
3X0agjDS9qlVuE9368ui
MJeevYsUlBRSj4I2KCrD
VaC89KR3Aw313FXlh9Up
T75UlbJRfoUAL1PwL7Nn
f7ZAtpFK08uLAl9ey0m7
YWAz2AC4Z0yLzi99od6s
lWQh5kBTV8ZkbMW1ZNui
WFcxNJkeyOadlHXikpCe
eRlRcCOmp4gKuTJ7rJA0
dNAbAFQeYpB0m9I5Qdam
wUa1Aw8OSbZ7ZMkSyugO
EAApuiOZ0JD9xUkEFOJO
FNw4uPlPt8zQAAzGnyty
iI0rC2qLwXPMqMcxTP3D
HZve95Us5SS0IvsYywHA
5MZHj98YYBteheQld8NC
QuUvX4LrUwZmgRjDbGKm
YZtSZr6AKoYUjSAZGZVg
KiB1nZoAWxZqQOQHHARv
fSZargBfn6iSUWTLKoP9
Z9Juwpsd50w8Pbanzxtv
BtFgCn4hQd5rWAv0qnhp
sxO35QTabl3MjxO2ALgD
7A7brQyOAyVK5QGZSkLj
MF35TZekLCYkVD7QEakl
EvDdQudZTC2gKnMlfe6U
ZrSiCPE7G8BLaVAlNMyx
XBYYoCjndskAdye2ujZK
dYWo1eXG7iMdburA4QY0
B26h4fDUkKD9wFa0iBh5
LJxhJbf0AAyERpyekaga
PHNVcboMXhtAt5SqPLLz
npp8Ci3X3V1Vl5JkU6oK
td82Ec916bZ7QyWfc1dM
F5eICslya2vQxLeKZMiC
Sd7n3l3ee47xprxzMyck
7fnH7IWuTymsfAdTdm7t
oZ44hTqFkn2hMOAyciau
efeQDzJMViZ9DVbwhIet
FZbdKYzlJPxIRmLCYd6x
LgvqGuON099PQYddWZMO
PkZibbCuFnSZT3pC4414
O8foF6RH5ez319rfwTOW
dIMYJoZOQzgBnSnQPmcQ
khk7WZ8YdQZtFn4WNsGV
ZcVgMMAfBSGIEQpN0oZA
PfqAK5zftTy9ezvHjhNW
Udynv8RKAsA415Q8iLRl
ZkF1DuZXQa6YBJ6EOJmK
Nbdm22OWy5LIUrpmqtuI
MHKmMZx5QxfFF2rhd0NY
hyk3Db1R8Q616p4PAyJF
5FqyZINcjkkwC1G5FZTM
YJbM0A7SGndyEZcQOTHr
Tne6dJZnzta5yJPAeJot
L46ObWIZuzXd804Rf2S5
HvROXkTXrLkueZ2OAIy8
P7v2IkY1eSwJmBAZqU8M
BA0d33VD6prfcn3d4JoW
LlQvaCVTTZhDlrFhQtNZ
ZLcrPuZFwPvVQN24MKiI
z2b9BOIppFcDH6frK9mz
EBGXwHQprPJhEU9AZM4q
hnHD8SWA6nBIKOWGpMSg
afAWKy5TdKouglpz0c11
N1FTc8JN0thAYi4Lpu5U
417X4JFkTu1OWgzp2FS6
KoRAGkWBuQa0FIGck5vq
2mj5GFdt5qFndHIka2zt
OQS9q7zZDQRifM0shUnM
TWVwdTdR8Sc9d0jU0dzl
1Yh1LHmupgPGxwXWWZS8
G5ApHWY9JPNv8vkLaZNE
kVWqAdvlA6KyBzAbtxAQ
nq4LxdMc7qmEjBQiYNqA
fdkCHzpstaO0kYEmvAWF
7r5LGpeNMA6e9tmA0kDb
lTz2ZfiFhdHEA8FeRnWv
seD55SmPABiUfMCChFzW
dJQPXQUhlyGPFX3SclYx
gByPFr5VER8xsBaVcVYB
YFYxIibINpPnvkDemspB
6BkJ2P9tq7SAlUiTCfJs
7AdIzwEuyeZF96kIqrBA
mGbTcGzfAcUJWA2ZIJgZ
psKdJzkLSvGJ4V8oPc5N
XHSdxkN1ZZp6b9LML7Ha
wTZpUlFM7JpsyJXLWbbs
PZfHnH34DTZgBzJ0PhvV
fcccbSKHA6CblHAZiD5K
FndFJHJhAyHVgKqY60fU
zJEL4ROLH0JM5RABALSc
ZoWm1UDk1XzHBFoARYyV
e3LBbc5WPIuNjBlkWdu1
soJRFAqMiLUXPA8imafz
ceISRJDRtqbVGCjPruWe
wAvXSdHiCR4NS0LrG9YW
bS9utuq4Xq8oA1coXoud
GFSBEHt28BYhRVv4Yib3
9rcB6ZBsnK48jSmiTxK4
fOGzg0Jjft7tUlMEH6hF
YOEZktEUv1T3RZLhAUPd
AAGyPgQA9sW8md9Nd27u
JaCcBfsArUGq93nzxEzN
kcbf0GcFZsjtCKYWNOIW
icpP2Vp5pwDuNxG7ZxKE
TydZwAeyp1Z12CApcuqb
rAbqM2SHE6I8gfJYHHG5
0euqKwgCkNwV1sTIzR5D
impOJd21ZvHgvhYeNw1t
WQWvCgpsddN1NYhlL7d8
Mtf3Xo9mDTn6W9KnrNo3
pnPQgevedQGmbo0uF3i4
xK3mtC8h4s5HwXGECB0M
4XsdtuT2Ae6NIBZ9HsuZ
QTixEsSxIl7JPwmAUo42
hu6P7O5egGY5Ci4v5KFZ
Du8hQ4VPjGYZGuxnuAQS
ZlPAoeQfXGn7WWMi8H6P
JJwBrBa2ENxqrFlznCb8
EWvW6q97PVjbZaLlDtWL
THtCzhHobSaRQZ7T0XXp
lsg9oGo1ooVa4IMEEpau
Oeh8QvHxhyRbNmmFY6aA
OjG61B6UUVbWKRR0aKqG
vDXdO9lyez2ruMWGDBqi
xDlqWvR8x6ML4g1jIRUq
KoBLsR8vFjhTCkHbQ5EH
HmcFc8C7RyIZP2P6zC9p
uuUjlAUCUlZjfHFZqIUR
QlCNAepTnvI9DfN4As3x
c3dPG1uOS04RMS0AZr7W
VZ5fGwDix3gz6io52Kfm
AWwoL63gBG50IS8HWiDB
1oKLUDgrhFNeYPaiVRV0
ohZNypiMWxoOBwnx18Ad
Gs3PuAOMKDdLsVgX955a
4QArsozVsef2QK7APVrG
AYCFOXkKSTdUAQU1ii7D
KcMgW6UPCNBgVtxoQnU1
yAHMEAoC1bnu7djTpPv9
8HujQ5bRac1oWUSylGuU
1cS5OBQ66seuvCPyqlpZ
5UrWq2cIHoclAanzd6uX
JBjvQilt1vQ0DpboAfUh
cS4yANRBzLHkLAXOsDYH
8rOEiEHQ84nyimDKOVhP
lwWpoQ7EUXXSy9Su28d4
FNUYO0ZkTRib0oA7ufqy
WYRgZA9YXApFj6h5xPlT
7kI4AuVNZA8e8bZYvdH9
yMAHgJz9NEKGUjbeNpGp
1SkBk9vCl6zlPuo7q9yR
AW7oUCFULe4DzdrITq2Q
pzC4lIW93PxatDFOXv5U
IgqGCvJaIBijIitbLmug
dDDMBG3L5SLsa3cUCvGs
HA8KHzs8Z6T5W1i0O8PT
3jMIE79CAZIKQIe7i0TK
dkV6StIqv0Vo2cudZA5r
7vlhOb14Jy0KvhAL0GnJ
tGGP2TEpyiosSPZdxckZ
0fxY2gHovWiYAsnaaVTK
fgnAsZqyOtZIqrf9AmjF
8RRVVxJm8S5d06coYPyc
UsJAA0DzL0LJh3IorWAi
LSAYXlZpX1wWVsPuc18e
SD53TZBIdhWuC4ZuRoeO
msQTcSHVAIjKKF6r4yY9
VNJJZdQBpnMs0AzCxAOm
uoRMEEiCKBvjwHIgAnqp
ZEVkrtNBDNFOpf5iJRe5
sw8ed9sjkptwRPvVpHzG
xVUVgHYOB779H8ekhfLO
4OLljZ0OZrVMZ1BwogR4
f6p2lfTCqP218AKGv4HA
URXaBHXx0ZFPVtEtgsK0
scIVLRjCogMlnzAEohrY
yFvZyYZHQdl4rr3AMPo9
FtzxUpUo0a3dbScuoKqo
qaIBD3TiyWrdjXBpUvTZ
WZUcUoftaSD6JIjSCLWJ
Ffb4rx3pB5T8S2eProbr
XedtyXnSAnWpPRP4oXyR
mR5Sxc0f2GEehZpvuYol
jw3P5KtBZeQ2D2OwAlGH
UjGj79FDHP1F9qxh0bhA
SzUmArV27LY13eOHalsZ
WErUEfNzZKSIiUqMdySA
2GLqmgir4PL6mijipzOR
VubdEEv0XSyVv61v5BNq
qb7mr0rAqckfZrqYWNJX
vnxHpiK4oDZx1jxH43uP
2ns60ml4ydzA9wgET1Fx
9FhqNK72V9xt1rmvQbxt
6aTAS4R0QWn76OqEjiD4
3eKRwAh5M7SomLg4zkqM
8rHewTACsL6wyXu5jxPA
QhzKlaPzPWxpSrs84gPF
VYa2qAQcKtAAyoQZaAvN
KecO8bhUS5eAvetcGmbP
1s2InnTe5VeK6KDSzMAc
IzeYjdTeLEJJPn4xH0uS
Q8hEv8z6Z4PpU6KIkThe
C0oZa37JZAuFHo7dT5Zf
j8vLLZ8oMNoLEAxzbGIW
fm22RAqLzcJ4Neubk7Pk
arvMSe8ZEL9XvwrAXeVB
xKwDYy5AbT8VIrZYsgKx
499AvuS3VSdLHC2JOy1t
AcvZe29fNZIVhKD1wUyz
z0NyLWx8TAAbfZ3SaoeJ
qmWMibXbUa7YfF2GQdW9
CQ3bC5bhvufm3steDUx6
eZ1DCbLFTorA7z9l8aAC
XdQFGD6rtlBADKSZOPAz
hwUtrF6nnZGkLKoKCyOm
gUYshwBo8nPcIipwkx8A
gVJJN5EipkHdFx2XFfvg
Bhvzjz384XPcwRVAtCB3
Ue2bFU0FLKYSrXUHAY58
QoA1uUcNpmu3ZQ2b2UEh
QeYfSiQfEef8y7J7RVtt
OGNqDgpwLxOY6PuiUVuD
VALLowwODDZb73NjYnER
jPkWapk7GyaRrRaPljXP
DAlpkTNjMUmoTIJlKXJN
hOl2HcBQOJkNxgzzbFTm
gHnScvEGB1xbvyFC0pRV
1IApINYu7UcEyyIpawoy
sShvzAjAZTwcdyX08gM9
Y8izQnhRycMcscnUzjjH
ATuTkG2b1PXYQQzqgmLD
CS2rZkEuJhoMbVK2bnns
wfTqW5pWQz9KtA8KkXQ1
RMRxhkAQICALc8BbE851
ku8gsFRfpkcOqJD63EXg
aAHcNrFLFtBMwL0ku7Kw
67u4eo6ABYs3Mz2qZuBy
x8IYKRrV11jjLYqEBdfi
XIwhZjDZbA8Jbuniw6j3
NZLtTk05P9sAjJbZCkIH
C5agjHMWNSYdZqzi0Iws
AHOeATYPUv2WnsvAwt1A
WYA6nvRSGgd3yYkGQ2Nz
HzOVEAAYlXa48SVC4jFJ
ASni52HC8FzL28dW8zos
iRm9gAJRZvmbowEtqYZK
yIuy9FnAbtYHhLa68TYw
As0E0bZ5C496Ic2SEXAk
fuzfZ0rSLsZQELopABXv
3KtZ5j7EEHJsyqragKsG
qukOjfxhrA2sPS3MbirZ
A6ltylgvDJ9KVn9BCnVP
iHocAhPEcwMHdcR7a0vz
OnwkyhpGKm2hP1A2Aky9
2exMVA8EJe3Bt1Lmrq5r
MOp813d8zydZE8XUG2AK
vxEJ4EjmZkV9lIeADgKt
eAwUplDhrIXNQPRBrEt2
ORvcDkK7CZo7jfcydqGA
xIeZIui5AK0rSVDQAi1C
VX6UOq8FqWUOm2TE1GG6
LIkLAhvliGmVp2jh7jYV
pZ431TaFAdRDLh4QHqhp
0vtteAXZZvimO3yCQ6wm
gd5n4oBuHf2kSePHtZUV
2bSnyAH7cYQAjgTAhQ0h
HZLNzcozbabqPATFQeO3
f2Qbs0CHie1AkDdb0B1A
ylsbh3ZGAESJHUhHvS4G
Zs3TMx8v3puBeAP87AHA
vXJIBDi5D5QoEqzcKwS9
Xp8T1YbXZXegtzZY20Hn
UXwzpF7461Lo5spRXinC
ovOunh6fCOSuaOqE0pkG
Mr1DVZOmWLzNruMJz8J4
vhzBTDwnLv4z6UsfDtGM
0LL2Z1cLLd67wxKy9Gms
TEN9fKxId553H7xhHDBX
M6MKkd62KsWBt9cVhJa7
gfT7ZZjVbN0R93yfQr9V
q6tvBZQ7xKoJtSWwAJI5
GUAETlCisD7weSeTlzM9
9nrbwX5piWqfv6RuMq4m
uECTuvYf3fmxBwJkPHvW
4aZPpprZvThO52flteRk
Ilj34esdRk7I1EWdp0jr
GXeExfSpxtNwikIuAMLH
GHu4kGHUOgRKfz2sAe32
OHxAVD2vJ5zwAXIWZLyt
kGz5fnClY8U02OaZM0Y5
2Oqs3Em2SMLAZMbu7AFw
cTuPXkbZgFv3MevWhsXp
AQQXAnTpHhvEZ7rj55Po
s3yiZ45hLsWekQ512USQ
NL2JWXsHYuuBXeSI1hUb
dHdlgIkmN69OBFCE4lBK
A7J5yuDG5kKS3UZpoJI4
Dl6OP9iezJtbA6qSlMGo
pxjckZYJZDShntPPjweG
9vKgJWMXS7UiAuI3HzJo
sh7VYwUUjnzC8ATwyLe2
Ik9Ze47uBY6XN8fqqwly
yatSg6X3sB5DHQbIYyiL
n4oZiqF0gojDvf0Nt2Oq
jif9uXkdmAbivwA9ibx1
46Vq5H4bxvSN0IedmkJj
qBTIpdxBG5CcISnFbxOd
IJ039EaGAKjPTu8h5Cbo
ELCmoVEF6C1vFgREqDgE
bKExn3MnSMKhnvqP5Mzr
TRVE5CT72uczQBfYu0hb
4XiwAI3p17OTwSJcWjvy
yj2Nf5jOme4baamIWTcV
bDC62NhhAaZZCKmBTXOy
xhA2RJk6zfXj8IwgQhlb
dnwBS8zmq4aH1hEYnWcR
4iMqztKwKoT8yT1r9ZiB
tcrtguSSJghHt82KrzbH
r7jF1rmEGn1mloOrC1JU
wFOEepJeHlJzyZ6K8C0p
15j8mNoyzMcPOEYuWeys
i3t73SX5DD7F9D0waOit
tjlXD7A3oRV30vpsKeGY
MEerRhOE7wYSivZcYhRG
Rejey7cYn34nXkCey55j
EwodDOaoDUToOBuhxhI9
7ZLN54FNHi6MazO1ZVG3
0Yj1AhlRNtA03m4IBFWW
ud3l4Inxz8H6bozQthlu
PTRorL7i2HUITRWPZEaN
Wei0LRXcCGQpoB7qHuyV
A5tGk51FJKa6rBq4Jc3w
Yqsd9sAhURi89sZMmBWE
9jJzRAg5bGqILs0W0i3N
RY555aoeNScAbBzB6p37
k6PQm9UYtnIJwwXhq120
LNFBb5ymHdZ1Qu5QlJiT
R8NCy82jPUqRsclN3vPA
E8RM2mMhZyp5PcqIAjYG
T4bt9RRY8XI5p6tN5T6h
NURqjjv5dB9g8zJTukjU
VPz2BQxPVOWABsRMrWaq
AfbLhPLcvBFdQajR1gVr
zRJzAeHR2qOst7msMENy
ftbJh3gA2DIDVh2pyC8O
huAqxufvhoBefuGvoQJ5
NJOgpMKPEe7Z3n8XU4gM
rzJoAZPirdD2Zd928HU3
PpreH1pFZYXBAmrgj37r
JM4V5c5JQJJIH0hwCBag
z45UHs3S7eoBaQv9lcl3
sUgYYFcBWCz97TjTOGKQ
0TslCOoggDr5M16Er6Sr
otGwIE6oYZw837vGZA1y
qwH4SGT6wBcQXuXmvcPF
sJQkN6pPYkZQPsGibB4A
VezC4UZtO6PZZny5w5gS
WvOVGvA3gQSlDl4jGk03
nnslGFClrsnNXt2nZR4y
7tAihDnbjOhP9WUMA2An
uMOy9DWAmUgugEgiLjGk
m3LNDArGCpNhIhTPt3Ii
FzCHGp8Z3AXAryGBXs5Y
BhX4hbLmqPU6QNlWGgGI
PnOzzCECQsAo5wFVwdkp
mZRaBYZAVzB0bYtoApou
ECnvl8RoqKElA4cALZAp
Xg7bRasILDZxbpvKJjMS
ZWUNXF0aZQibDFOrbZaW
K89u5xfKJIeXm9OxAMt7
E8SKacTQDuj7PgBv0SdZ
DtLXZPoIAAK4lymZiZ0T
f30sKg9uA2Q2EPHFOAD6
oaxNj7ntc1czWiHQe894
3cL3ZWPSeYtMXdvRAL1M
ehc1P7aYMNctrLnC6PMX
mTpHCy9KK3ivSfWCSZ0k
PuM9AJfNd428Pvlb1DDm
75O8sVETjmgL18HiKLkF
AgE5nIu7mIvEgdd4bulR
OPOQi79Ilw054UGf4PuS
76g0H0D2R5g2DEARfJO2
acQu1wFL4DE85YTpkQo2
egMWNBUSxzemZFTEioq5
fqisMzF8KYm3e0xvGPJG
6ORAqQdOGkJzVRflXwYa
jEZJicZahwvoJRc6zKJ5
NFrGNEHJzlwZxkmMrjQX
gVr7GxpMBtHGiFzAj4DR
AXX2KJmlxBAbivgrcnVV
KIYTZ8G6PkEM2AZo9nm1
i1wAgp4XE92C6AsW49TZ
mamLMRZdvkIxTGs4lmNr
ivWEw7Zdq3OYMeZD4Ak0
AFTv93HVQaXftmxuMuBM
VxKiVfX5xDk18SVqwjxb
of2prORa7G8Li2iZXuuZ
nGdFHeyWCU1YjpxoBJK7
A7SRAZRf0GkhpgsLpynj
AWKPZ4wfYAfGsZvbWsXg
CueU1TjPc8q1g4KRzSPd
LJNH8vWbe1frVtq7kED5
qZJDfNKm0QnZPZVc3hLZ
XcVAR9ZydmXYy6CXAN5q
1IFrFwL9zMAAFLwytoYE
uoalr815B3vS24D76Dpw
YtPZw0pZzWqGRcNQKAhg
CjWVL6HQEJB7UJff9DSn
mF4SKFOg8B6poM9MQhXp
CWjgamEZiG9Uc9Xrbyck
NW5FowilWIBrKz50jgrR
rwdbl0lZTyOwuAuk0Q1h
PpttOmnJ8e757fkHo2mx
Zn03DaIdhiyKky6RCtIC
IQUANP3RcKsS1vRNukA6
VwyAOeXcUNQAAcbNkZi4
RZ16qUDGlHpLuvAQy0qu
dHfeIAWQOO36Naz5JtxE
WYt6ftpg4CDc8VsnNlox
P8AlERH8x0POhY44eXvD
YLVPt8wkpKPKBAoJ9Zg8
8LpBcDY1mjflZPNVHce7
QhxlSaP97aV7MKVfSZVo
CUaZODROppVNop6Ww4QL
Spt7V5TUCoItaR31ynM3
fq6bCsWNL1AZ3CEW5PwF
UpeV56Q5nhUMXYEwBffg
F10p4WCIahjVCqGAxXA7
GDdxZt91Hls9ZSAqndbU
3Eh36YzMGuibYgXqZYKn
UNS2MSHOG0uzrT9Itose
zk5DIGZ0MtDYyBBDeNYN
6S0K3UZ3A7Ae8QT0lWfG
bK1kYBTQOeSXcxV8RITP
5d7WhgmyW9d9dDf3IS7c
xO9uBVfWZqHnBXRDBqGW
7n2mFWeEoWJu4Ucb0h2Z
4zvaAv7jH9BnRdfODAbo
S34Ze1OLlRinpHYI36tx
JAHrlSAxsWvQxQ9cwZQW
QpZx98DhOJAuBxHxO3UZ
f0Abi0WNXXu1fzTm2e3L
caMAl05eIqDltVJ0rPwP
zZTjQzhiCMtZAQy8L5WA
75sc30GaGChAAtvhAiyy
A4Mnh6VZLWSZXFsIAtI8
j96rH4VSet15O040fRTs
ILgvbr5AJ48tLS5ZJqIw
Vt0yFggQfVJC63HEAOt8
RxvtDj4wvANV1ZIFvX2H
tqHe5KxVa0y7ky0ovFAj
SJEAClQs1J6RI6FHgGhZ
BTATpKKmwmypM5xayBEt
RsAbQ3xx7UOlMQdGCZks
4ZLdZPYxqrDpvnwxJOjK
2nsjV9DZPzG5EiVM8I7Y
trtnGoZmY73GmoL9ISaD
78RvAq4pvI7nGfXg08yc
SOuW3OhwNfzk08tJ5KP8
ttz6ChnAjb216Apc9xY2
TWgABYG3lMhNq03LwjuZ
q5Mu5WS8nzAtOpYEsRVc
kFoiKbTLOZ1p29IKWlBa
k8IyyLLeNRPWO13aEmZ2
vc498TwlxK05uamzEcZo
5C1T7dbd6AXV5nenJn2z
1kWmbfsvDgjPyhwb0oKh
2PVuMZnGstCfFwRttFna
RMSNPgAIp28Ro5t6ApWI
5ef1gOAOmO2OHpU8hP4T
qg4X9vrAhxEAGauA0RDk
1o3uKmqAFsvd68iwPXwA
sZhvBxZflI3cirrFGpQJ
1mp36SEQQIB6m7LwcBgk
aA3OtPdPAQhZArV49KfI
cT2gV5CMKN9ZIdNO4DgF
c6XZTz4JAh2ILikalOyr
gFbLHFSILMAgF2b79bn9
yncB2CDoxmLHGoLAiTkW
g8Xtjc0xwrWwRFxqPp6A
xWe8w4AgQnhq43osA4Dj
y8IwjPIxIua1Mqf3OQdD
7qmKwi14bMfrxHoutYfs
AZu1lO0LAnlbzY9t8MGU
CdhwQ4wnngdoVHJFJg9m
npRdPmAMxZpSlbCsN14q
yRplyUAApNjl78xI7Zdh
RziASyxAc70CDafQgDSs
nfZvfBVSkbWAOJMbMiEs
Z32t6u29GD2ZuJd26EYJ
lDtEHoQvJVgZzZD9yiu8
Tf5TVQGRQPF6fU9Q2ISg
Lnou2NZ1pI8wBcE2JO4L
rwsZ4XI7zQaVMkdHHgQc
eCWQjlDOmtYp1cQ5SgQu
WTBEijEi3dBAyUSEPjYZ
lTDgN1Ot3QLAImf3eDSb
GjrKtOPb9W3o8sqcnHQV
UWB3XnhIV368Z9v76Zh4
ohUWA6e60590YViAUcS8
tMWIz2IYhUri5djIC0ZH
r7XPgEmAwVAcNm8mXhqZ
b0GGdWwhsWrawO9rq95D
htxkl4RRBXKaZdcHQylC
ZVgNKY6gwoww1zzElbRv
Ll210i7fLof16yNZBlNt
fBn9HyNfo0OeoPQqgRKz
kZIJDnxTt0WBZCHH6wLh
trBvpAMTc6NRl6rDo0Cx
6yDs3LZ8JTc4DZ1KCltA
RAuZWtQqTUV3awJcyAip
OhfJGiOV4hyjgjkCBcdY
FVZdk8UZKJC5i9cmcMiQ
fW3dhzz7VSN4FnUBJD0E
JnxZjBVi7GiRB9N0IsZb
UNF8v3ScDBCxeK0ZnrTq
6rdkkTT51l8HkNDToUDe
425KZLlJNyn9kZ3o7ddb
Ady4Zv0jhnjveass6XLI
65l80AO885ZGREbWAsl5
0jSo9B9GsIGem6oriCel
7c1rVEMjDHWUGSlPfr2P
kdG9wmJcE5rHZrQzx0AU
rIJjHXemZ4pJcTuvaFyG
5imqrcU7lF88QjyYIptN
kNOhdAF3R7xDiOlA0YuT
VOzCHlm2K8ipmpdZSw9G
fnrPbMntmvlKkSHLwHvd
IWNyNxwWMka6XEJTu5QJ
hQUBPSnVNZXZ9urrOfvH
D5WZ6R5nfeM79Xzv8lVw
UDSXcRuuvO9H7dJZxPp2
EobDZcoidIRUUTmCeEkz
Ko4XfSgxZ2rn4cHDUWQ7
2MXdzA5ajwlGUpAg9ZvZ
GGCqThFfxN8qawA4A7Z6
wl89CpeccyjMgzoBMDVY
n4KdDAQVp5HhAEZCnQlQ
2gJbijyaj0PdBgcZKoeC
c17b3VgnqrAwxAMHPAWD
wKvUnN115OSXA6wa0wWS
SPD12tgryUMRWvSJWR5f
G43ZjF6YgZAxEDHPccwe
ZTWCir8M4AEO2BLU1GDj
5atAEPrXWmEsw7wqlR5k
GN2hZFazODxnnjKfUObi
XGAkxyml521WMjMVpkbG
96WW9bQAexIVwY1H5Mrr
7M13Brh7b20xYuzwArZ5
YCgkpdXNeZffh5UGBLXN
A3vMOpgzZMxlydxWA1bA
DRj6Od5IU80oPkTgMLE5
PxZmr0V6N7V4ysxzAtOF
jhBoZeg8NJvJAiQNSREj
84dan7nYFUiBOi5YHqPB
mA0pqu0kEyHKZNfuQqo5
xoGZfyEAiX3htbGZZa70
N4jFAid60wy0AiXr4LGA
OpFzRmWvh1nDyHfIa4zP
6BLenbyM87pVH2jukIgS
JjWkFeidjTNUoRLNvUEg
WdJXtKNKVYOD2jCd1dOh
pXg8UOMygXZ29kdOIOAV
q4VMgup7kgZHQ4g77T9F
bVccAdtZRveC6TZ6o2l0
UM7AkFZeHVKh4By4Y2ea
lwDqlhF2QHd5mUISEQxp
7u8FmyYofN8OGacW9CKs
DAZZ5cFVq5l9AoVo7qvE
V9N15dtasDuiF2ZNOXLt
sPHqRFxmTJ8GXY0HgMRk
UusCnFWIJBINi8ZCD4Y6
nJlMwKx6ARoKGT4KAucX
UE5KZPcvI2Z1oZ9G0TVA
4ZXSxtcHd0BPbmZWDOyn
K0pEpRt6gWj5RrSWZLul
CKQysGScl1Z7jeGxyhxk
2tt39L24cV4PB5vByn4p
VzTKUROZxSaI81twh4Fx
rRhoRJvKzeALagKu6stl
tAo4Rc2AOG1JOMjvUVCj
xU7QMb9TYoHx7k1pP01b
zXg7rTlwXedBMXawKQoK
Jx7WwnYaBFAKGzSYzAtE
mR1fk6YVrAW0ZgT8dlcW
eRW3ZeSMAvy1fKxaMcsm
jXUtV927DqnH36imolU6
9QczjVARCFp1nedZ4GBK
ZyPMEjA2Lc8DCLAxiCiL
Azd5JDxsuz0shhu9ztK9
lI6idJlGZ4KbkedxQwjd
veHufK7AOyDxi0z2w1il
gL0gZ1lg7N7f2Nn5XdTU
qj90HlaOI67lhWUqCq3o
RGFLfUYhvuVZ2gWZA6H1
MWUyccqZP4WUoSLe3UqX
ZxwbDAyZOf0XX22hBA5i
KHrogaSBFfebSeZDeiJb
mTW1JZ9htiZkZEpJWhAt

+++ Caesium/0.4 RC1

# Таверна
idec.talks
Andrew Lobanov(tavern,1) — All
2023-08-05 10:49:45


Стараниями Meta Freenom перестали раздавать бесплатные домены, в связи с чем таверна переехала на idec.spline-online.ru. Просьба перенастроить свои фетчеры.

+++ Caesium/0.4 RC1

# Укры атакуют станцию :)
ping.local
hugeping(ping,1) — All
2023-08-09 23:40:22


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

Откатил базу, закрыл на время регистрацию. Снял фетч с других станций. Скорее всего уронацистские сообщения ушли в сеть узлов, которые фетчат с меня.

IP адреса атакующих:

104.28.155.206
104.28.192.94
104.28.222.238
104.28.224.94
104.28.254.238
104.28.156.60

# Игры
pipe.2032
Reprise(tavern,18) — All
2023-07-18 06:52:33


Во что нынче регулярно играют сетяне? Я в последние пару недель подсел на Widelands под просмотр сериалов с женой.

В своё время, помнится, очень любил Settlers 2, а тут примерно то же самое, но самобытное и под GNU/GPLv2.

Ещё интересует кто в какие свободные игры и игры с открытым кодом играет.

+++ Caesium/0.4 RC1

# Носители творчества
std.hugeping
hugeping(ping,1) — All
2023-05-13 11:23:13


Я всегда сам себя убеждал что способен разделять творчество и "носителя" этого творчества. Ну, действительно, примеров, когда носитель не является образцом для подражания можно привести массу. От Хана Райзера, разработчика файловой системы ReiserFS (убил жену) до солиста Queen Фреди Меркьюри или Шопена с его ненавистью к русским. А уж среди писателей так вообще... психопаты, неврастеники и деспоты всех мастей -- встречаются сплошь и рядом. Чтобы не выглядеть провокатором, назову лишь Филип К. Дика. И что теперь, не читать? Так я рассуждал... И это работало! (Впрочем, я не мог пользоваться ReiserFS. А ведь кто-то её сопровождает.)

Но после начала СВО я незаметно для себя понял, что не хочу больше слушать БГ и Шевчука. И если БГ я и раньше слушал мало, то очень многие вещи Шевчука мне нравились! Я не установил для себя "табу", нет. И песни, вроде бы, те же... Так в чём же дело?

Я специально посмотрел интервью БГ, данное им после начала СВО каким-то либералам. Смотрел и не мог поверить. Я часто слышал мнение, мол "певец поёт ртом, а мозг и не нужен". Но объявить идиотами БГ или Шевчука -- я не могу! Как написал сам Шевчук в своём письме, он против любых войн. "Не стреляй" написана в 1980. Но он же играл солдатам в Чечне, поддерживал их. А сейчас "стыдно"?

Да, песни не изменились, но только вскрылся ощутимый разрыв между песнями и поступками их авторов. И дело не в несовершенстве человека, оно понятно и простительно. Дело в направлении устремлений, в векторе.

Разрыв показал беспринципное лицемерие. Которое (будучи ложью) и обесценило для меня творчество. Песни те же, а слова потеряли свой вес.

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

Зверобой "Мой Мариуполь" https://www.youtube.com/watch?v=pJ8XXQHl8bU
Джанго "Мы не уйдём" https://www.youtube.com/watch?v=aEkqA5L2hl0
Калинов Мост "Друг" https://www.youtube.com/watch?v=Sqh6-kDr6Mo

Смешное количество "лайков" на yt -- тема для отдельной заметки.

# Координата Z // Захар Прилепин
std.hugeping.micro
hugeping(ping,1) — All
2023-05-13 09:43:39


После очередного теракта, в котором погиб Александр Шубин и чуть не погиб Захар Прилепин (слава Богу, выжил!), заказал последнюю книжку Прилепина "Координата Z". Книжка хорошая и нужная! Единственный недостаток -- короткая! Читая не спеша, закончил буквально за пару дней.

> Россия будет воевать с Украиной, пока не победит саму себя.
> Россия будет воевать сама с собой, пока не победит Украину.

Спасибо Захару за то, что он делает!

# Никто не забыт, ничто не забыто
std.hugeping
hugeping(ping,1) — All
2023-05-09 12:09:20


Мои детские воспоминания навсегда связаны с Украиной. Одноэтажный кирпичный домик в г. Умани, сосна в окне и солнечный свет в белых гардинах. И голубое летнее небо с ватными облаками. Кусочек этого детства я пытался повторить в игре "Один день лета".

Первые воспоминания о Дне Победы тоже связаны с этим украинским городком. Заполненные ветеранами трибуны стадиона, блеск золотых медалей и запах тройного одеколона дедушки. Клевер, дым от пороха... Улыбки ветеранов.

Постепенно всё изменилось. Сначала, после возвращения Крыма, один украинский сетевой приятель начал писать мне "бесноватые" сообщения. Потом "не выдержал" второй. Мне, конечно, было больно наблюдать за этой страшной "метаморфозой". Слов чтобы возразить им или объяснить что-то я не находил. Вернее, пытался сначала. Но быстро понял, что говорить уже не о чем. Я и самому себе не мог всё "объяснить", разложить "по полочкам", обосновать и оправдать. Всегда завидовал людям, которые точно знают, что делают всё "правильно".

"Слезинка ребёнка" в "Братьях Карамазовых" -- близкая аналогия. Я не сверхчеловек и не могу оправдать страдания высшей целью, какой бы она не была. Проблема теодицеи, мне кажется, может решаться в первую очередь доверием к Богу. Я могу сказать, что Бог так возлюбил Своё творение, что дал ему свободу и через эту свободу люди стали творить зло... Но всё-равно, я не знаю как принять, оправдать высшей целью страдание невинных людей (и животных). Всё, что остаётся -- довериться Богу. Я сам не способен разобраться с этим.

> И отрёт Бог всякую слезу с очей их, и смерти не будет уже; ни плача, ни вопля, ни болезни уже не будет, ибо прежнее прошло.

Мне больно наблюдать во что превратилась моя вторая родина-Украина и как некогда братские народы убивают друг друга. И тем большую ненависть я испытываю к империалистам США, которые выпустили это зло. К тем, кто стравил нас ради стратегических "высших" целей. И началось это задолго до СВО. Они делали и делают это всегда. Они делали это не только с нами.

Они привели к власти в Украине преступников, которые предали свой народ, создав из него бесовскую рать. Верю, что не из всех. Не хочу верить. И что теперь? Делай что должно и будь что будет! Господь разберётся. Победа будет за нами!

Знайте, несчастные бесноватые, как бы вы не пытались сделать из нас фашистов (как это топорно делали ваши хозяева переписывая историю), это не мы предали улыбки наших отцов и дедов, наше детство. Я верю, что настанет время и многие из вас стряхнут этот сатанинский дурман. А твари сидящие в кабинетах США, Англии и Европы получат своё. Мир во зле лежит, но и зло не может торжествовать вечно.

С Днём Победы! Никто не забыт, ничто не забыто! Победа будет за нами!

P.S. А ещё, в детстве, мы играли в "войнушку". И никто не хотел быть "фашистом". Интересно, где сейчас мои друзья детства?

# Minetest 5.7.0
pipe.2032
Andrew Lobanov(tavern,1) — All
2023-04-19 05:38:14


Уже лет 10, как я люблю иногда позалипать в кубики. Причём Minecraft меня не очень впечатлил, а вот Minetest понравился сразу. Недавно вышла свежая версия, в которой добавили динамические тени. Это сильно меняет впечатление от игры и вообще вау.

Теперь сижу и жду когда админы хоть какого-нибудь русскоязычного сервера обновят игру (в терминах Minetest это базовый набор аддонов, так как тут всё есть аддон) и можно будет красиво играть не только локально.

+++ Caesium/0.4 RC1

# Re: Таверна поломалась
idec.talks
Ordos(tgi,1) — Andrew Lobanov
2023-03-10 07:12:53


Опять прилегла :(
Last update: 08.03.2023 23:40, с 9.03 уже недоступна.

# Re: Изменения по tgistation.ru
idec.talks
Ordos(tgi,1) — All
2023-02-22 08:32:27


Пока ковырялся с /x/filelist/pauth и прочей работой с файлами, залил на станцию немного песен Ростислава Чебыкина. Кто не знает - это эдакие авторские песни с уклоном в философию и ролевые дела. Кому надо (ну вдруг) - можно брать.

В плане лицензии все чисто. Автор прямо говорит, что отдает все творчество в народные руки.

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

# Научно открываемый Бог
std.hugeping.micro
hugeping(ping,1) — All
2023-02-19 16:16:13


Натолкнулся на текст, который удивительно "в тему" моей старой заметки. ii://CVvGRZBv7ZzMIm0TFWeY (Абсолютно ли познание?)

Отрывок из письма А. Эйнштейна к Морису Соловину от 30 марта 1952 года (А.Эйнштейн, Собрание научных трудов, Наука, Москва, 1967, т.4, с.567):

> Вы находите удивительным, что я говорю о познаваемости мира (в той мере, в какой мы имеем право говорить о таковой) как о чуде или о вечной загадке.

> Ну что же, априори, следует ожидать хаотического мира, который невозможно познать с помощью мышления. Можно (или должно) было бы лишь ожидать, что этот мир лишь в той мере подчинен закону, в какой мы можем упорядочить его своим разумом. Это было бы упорядочение, подобное алфавитному упорядочению слов какого-нибудь языка. Напротив, упорядочение, вносимое, например, ньютоновской теорией гравитации, носит совсем иной характер. Хотя аксиомы этой теории и созданы человеком, успех этого предприятия предполагает существенную упорядоченность объективного мира, ожидать которую априори у нас нет никаких оснований. В этом и состоит чудо, и чем дальше развиваются наши знания, тем волшебнее оно становится.

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

http://xray.sai.msu.ru/~lipunov/text/shkl/node7.html (О проблеме сверхразума в астрофизике. // В.М.Липунов)

Упоминание цитаты заметил при просмотре youtube ролика: https://www.youtube.com/watch?v=tvzfEA75CRQ (ЧТО уничтожает ВСЕ цивилизации в космосе?)

# Test
idec.talks
Andrew Lobanov(tavern,1) — All
2023-02-14 08:19:11


$subj!!!

# Актуальные клиенты
idec.talks
Ordos(tgi,1) — All
2023-02-06 08:37:07


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

Все ссылки на IDEC Mobile (кстати очень хорошая вещь) и CutieFeed ведут на ii-net.tk, а тот, свою очередь, недоступен. Для cutiefeed есть страница на гитхабе, но собирать его (особенно под винду) - то еще извращение. Ссылки на готовый exe нерабочие.

Если кто знает актуальные ссылки - просьба отписаться. В крайнем случае, у меня вроде были exe и apk файлы - могу выложить у себя, но лучше бы ссылаться на офф сайты, если таковые есть.

# Debian 4 и TLS
linux.14
Andrew Lobanov(tavern,1) — All
2023-01-23 10:58:05


К вопросу о сабже. А попробовать накатить нужные пакетики из более поздней версии дистрибутива не вариант? Хотя, 4 это сильно давно, конечно, но, может, от 7 подойдут?

Конечно, это нарушение консистентности системы, но как рабочий вариант может и прокатить.

+++ Caesium/0.4 RC1

# Снова openbsd
std.hugeping.micro
hugeping(ping,1) — All
2023-01-21 12:41:02


После долгого перерыва расчехлил старый thinkpad и накатил на него openbsd, которая там и стояла когда-то... Поставил и в очередной раз проникся. Чисто, просто, дубово. Всё как я люблю. Правда, пришлось кое-что отключить в настройках по умолчанию:
1) включить hyperthereading в /etc/sysctl.conf (в openbsd это по умолчанию оключено теперь)
2) отключить в /etc/rc запуск reorder_kernel

В качестве оконного менеджера не стал особо мудрствовать и выбрал cwm.

openbsd вроде как во главу угла ставит "безопасность", но мне кажется любят её не за это, а за тот самый KISS.

P.S. Сейчас снова приходится работать с ядром Linux и, в основном, это вызывает негативные эмоции. Очень много кода, который написан "как попало" и сделать с этим, похоже, ничего нельзя. Это плата за популярность о которой, вроде, все мечтали... Интересно, сколько таких "разачаровавшихся" хакеров в openbsd? :)

# В математике все говорят о Боге // А. Савватеев
std.hugeping
hugeping(ping,1) — All
2023-01-21 11:59:49


Уже несколько раз случайно находил ролики Алексея Савватеева на yt-канале "Пост-Наука". Хорошие ролики и сам Алексей вызвал у меня симпатию. Приятно слушать увлечённого и искреннего человека, да ещё с долей самоиронии. Подобное чувство я испытываю к людям с пытливым умом и которые относятся к своему делу как к игре или вызову. Неправильно думать что это заносчивость или пренебрежительность. Скорее, форма "юродства" или смирения. Восхищение истиной. Отношение к своей работе как к искусству, но вместе с тем осознание своего несовершенства. В этом состоянии сложно обладать чувством собственной важности и человек больше похож на ребёнка с детской непосредственностью и искрящейся радостью. Но, кажется, я увлёкся... :)

Так вот, true-grue кинул ссылку на ещё одну его "лекцию": https://youtu.be/Vz2Rl2bijaU которую я и предлагаю вашему вниманию.

Посмотрел с интересом! Как оказалось, Алексей -- верующий. Большинство вещей о которых он говорит для меня были не новы. Но в очередной раз я понял, что очень часто важно даже не то _что_ именно говорит человек, а _как_ говорит. И что вообще, кто-то говорит на те темы что тебя беспокоят. Например, когда речь зашла о чудесах и Алексей быстро их "проклассифицировал" я почувствовал, что такая непосредственность действует заразительно.

Пока слушал это выступление, возникли мысли которые решил записать. (На самом деле, конечно, не хотел записывать. Но заряд от передачи был такой, что вытащил меня из уныния.)

По поводу возможности ИИ обрести самосознание. Раньше я считал как и Алексей, что это принципиально невозможно. Сейчас я допускаю такую возможность, так как она не противоречит мысленному эксперименту. Здесь есть аналогия с теорией эволюции -- мы лишь наблюдаем развёртывание процесса. Если ИИ станет самосознающим, это будет "рождение" механизм которого мы всё-равно не "грокнем". Да, мы будем понимать что если мы сделаем "так", то робот будет вести себя как человек. Но "осознать" как происходит зарождение мы не сможем. В таком случае мы не создали жизнь, мы лишь создали условия для её зарождения.

А ещё захотелось дополнить выступление такой мыслью. Мир и человек так удивительно устроены, что одни и те же факты могут трактоваться и в пользу "доказательства" бытия Бога и против него. Для меня этот факт очень удивителен и сам по себе является личным "доказательством". Действительно, всё зависит от самого человека и его свободной воли. Богу нужно сердце и свободный выбор. Если ты его делаешь, то весь мир вопиёт о Нём. Если ты идёшь в другую сторону, тебе поможет кто-то другой... ;) Я уже не раз приводил пример с гелиоцентрической моделью. Если бы Земля была центром вселенной, то (как мне кажется) это был бы неопровержимый довод в пользу "доказательства" бытия Бога. Сейчас мы с одной стороны не считаем Землю центром всего, а с другой стороны... с точки зрения всей вселенной вопрос уже не кажется таким простым. Антропный принцип. Барионная асимметрия. Да и даже сам принцип относительности... На "гуманитарном" уровне это можно воспринимать как дополнительные доводы к сильному антропному принципу.

В общем, такие "передачи" нужны. Нужно говорить. Не молчать. Даже если "не до того" и даже если устал "от безжалостных уличных драм"(c).

# про альт
linux.14
ii.51t.ru(dinozavr,2) — All
2023-01-20 14:29:37


кросспост с опеннета:

в Альте, блин... в альте то ли с 4.x, то ли с 5 по 8, инсталлятор грохался, если видел на диске раздел OpenBSD. В 9-м это починили, и я наконец-то смог поставить себе Альт, но в 10-м сломали aptitude. Установка по http примерно в половине случаев по неизвестным мне причинам не создаёт initrd или просто виснет на этапе "установлено 100%". Недавно хотел установить Alt 4.1 на LVM, так в итоге всё не заработало. А ещё, на установку диска без разделов надо просто знать, что сначала нужно установить несуществующий раздел, и только после создать заново. Ещё инсталлятор не позволяет сделать установку, скажем, с sda2 на sda1, надо ставить с какой-нибудь флешки sdb. Вот это сообщение пишу с Альта, но, блин, как вообще с ним жить?

# офтопик из idec.talks
linux.14
ii.51t.ru(dinozavr,2) — All
2023-01-19 00:29:07


> Тут сугубо экономический вопрос. Мода тут постолько поскольку. Поддержка 32-бит это не только сборка дистрибутива или программы, это ещё и тестирование. Если, например, количество пользователей меньше 1%, уже просто нецелесообразно заниматься поддержкой старой архитектуры.

Debian:

Информация о выпуске для 64-битный ПК (amd64)
Информация о выпуске для 64-битный ARM (AArch64)
Информация о выпуске для EABI ARM (armel)
Информация о выпуске для ABI ARM с аппаратной поддержкой чисел с плавающей запятой (armhf)
Информация о выпуске для 32-битный ПК (i386)
Информация о выпуске для MIPS (с порядком байтов от младшего к старшему)
Информация о выпуске для 64-битный MIPS (с порядком байтов от младшего к старшему)
Информация о выпуске для Процессоры POWER
Информация о выпуске для IBM System z

OpenBSD:

alpha Digital Alpha-based systems
amd64 AMD64-based systems
arm64 64-bit ARM systems
armv7 ARM based devices, such as BeagleBone, PandaBoard, CuBox-i, SABRE Lite, Nitrogen6x and Wandboard
hppa Hewlett-Packard Precision Architecture (PA-RISC) systems
i386 Standard PC and clones based on the Intel i386 architecture and compatible processors
landisk IO-DATA Landisk systems (such as USL-5P) based on the SH4 cpu
loongson Loongson 2E- and 2F-based systems, such as the Lemote Fuloong and Yeeloong, Gdium Liberty, etc.
luna88k Omron LUNA-88K and LUNA-88K2 workstations
macppc Apple New World PowerPC-based machines, from the iMac onwards
octeon Cavium Octeon-based MIPS64 systems
powerpc64 IBM POWER-based PowerNV systems
riscv64 64-bit RISC-V systems
sparc64 Sun UltraSPARC and Fujitsu SPARC64 systems

i386 тут не самая непопулярная :)

# cauldron
zx.spectrum
ii.51t.ru(dinozavr,2) — All
2023-01-17 13:18:54


Раз эху фетчат, надо что-нибудь написать, вдруг куда-нибудь дойдёт :)

Лет 10 или 20 искал игру, в которую часто играл в детстве, про прыгающую тыкву. По описанию чем-то подходил Cauldron, но это было не оно. И только недавно нашёл - это оказался Cauldron 2. Посмотрел на ютубе - так и не понял, как я этим когда-то мог управлять. :)

https://www.youtube.com/watch?v=76RKurT8IW0

# Re: Изменения по tgistation.ru
idec.talks
Ordos(tgi,1) — All
2023-01-17 08:21:23


После некоторых размышлений таки убрал принудительный редирект на https. Теперь работает и так и так, по желанию. Мне не критично, а кому-то может и да.

Заодно зацепил к себе https://ii.51t.ru/ii/. Эхи idec.talks и zx.spectrum. Пусть будет.

# Domino
idec.talks
guest(dinozavr,1) — All
2023-01-12 18:06:29


Прикольный дизайн прямо как в wap 2000

# rein: Фаза 1
std.rein
hugeping(ping,1) — All
2023-01-14 10:06:12


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

# Приоритет на личное использование

Средства разработки будут допиливаться не до состояния "продукта для всех", а до необходимого минимума. Например, не будет аналога splore pico8 (сетевого репозитория). Запуск "приложений" будет осуществляться из ком. строки (rein edit, например). Для создания игр этого достаточно, так как игра вместе с rein это приложение вида - распаковал и запустил.

Развитие инструментария - дело сообщества (инструменты пишутся на самом rein), но раз сообщество не удаётся собрать, то буду пользоваться чем есть.

# Андроид версии пока не будет

Для того, чтобы показать игру друзьям с телефонами есть emscripten вариант, который работает неплохо. Android версию собрать несложно, но опять же - на неё нужно время и силы. Зачем? Для личных нужд мне этого сейчас не требуется.

# Пиара не будет

Пока не будет никакого "выпуска rein". Потому что выпуск ничего не даст. В современном мире нужно заниматься работой с аудиторией, чтобы это принесло хоть какие-то плоды. На это у меня нет времени (да и желания). Пиар возможен, вероятно, после появления игр и появления хоть какого-то сообщества.

# Никаких новых фич до выпуска игры

Сейчас требуется обкатка движка на практике. Так что дальнейшее развитие будет целесообразным только после появления новой игры. Когда и кем она будет написана, я пока не знаю. :) Но, естественно, мне хочется опробовать инструмент самому.

# Готовность

Готов для личного использования автором rein и энтузиастами. :) В целом, все основные функции присутствуют и опробованы. Api меняться (значительно) не должно. github страничка доведена до "презентабельного" состояния: https://github.com/hugeping/rein

Эху std.rain я оставлю, пусть будет, если вдруг всё-таки будут обсуждаться какие-то вопросы.

# Мысли

В очередной раз стало понятно, что есть разные задачи. 1) сам движок 2) создание творческой группы людей, в которой этот движок мог бы занять своё место. В том числе и в статусе средства для обучения программированию. Тот самый "кружок программистов", ламповый уют и электронные журналы с подкастами :) И задача 2, возможно, даже гораздо сложнее, особенно если представить себе гипотетическую аудиторию rein :) В общем, сейчас я не вижу реальной "почвы", кроме собственного увлечения, а создать эту почву -- совсем другая история. Но, по крайней мере, часть работы проделана. :)

До связи!

# ii.51t.ru
idec.talks
iiii(ping,48) — All
2023-01-11 18:12:27


От создания контента - к его провайдингу.

http://ii.51t.ru

для старых компьютеров - ок. осталось забить контентом. функциональность "эхи как книги" надо будет вернуть, но переосмыслить под "архив эх". никакого https, никакого javascript и css. проверена работа на win 95 с ie4, на debian woody с netscape navigator и на всём остальном.

сейчас фетчатся эхи idec.talks и pipe.2033 (пока не существующая) с hugeping.tk, поллинг 5 минут

описание станции (точнее, софта эхи): http://ii.51t.ru/ii/html/about.html

# боны поны и прочее
idec.talks
iiii(ping,48) — All
2023-01-11 17:14:22


1. перепись узлов - кто что гейтует? чё ща модно гейтовать

2. давайте сделаем новую межсетевую болталку - pipe.2033? новый год всё таки, а тянуть 3500+ сообщений 9-летней давности про болтание не стоит - лучше в архив :)

# С наступающим Новым Годом!
idec.talks
Ordos(tgi,1) — All
2022-12-31 08:57:31


До нового года осталось всего несколько часов. Кто-то уже отмечает, кто-то только готовится, кто-то может быть даже работает. Некоторые так и вовсе не хотят ничего отмечать. И это тоже можно понять.

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

Поздравляю всех с наступающим Новым Годом! Пусть сбудутся все желания. И самое главное - пусть все будут живы и здоровы.




P.S. Не мастер говорить речи, просто хотелось высказаться.

# Эха по rein
std.rein
hugeping(ping,1) — All
2022-12-24 20:05:29


Чтобы было место, где можно обсуждать вопросы движка, создал эху std.rein.

# Солярисы
std.hugeping
hugeping(ping,1) — All
2022-11-28 12:35:43


Мне очень нравится фильм "Солярис" Тарковского. Книгу С. Лема я читал давно, и кажется, что она не произвела на меня особого впечатления. Тот самый случай, когда фильм -- самостоятельное произведение.

Лет 20 назад смотрел американский вариант Соляриса. И помню, что в целом он мне тоже понравился. И как-то решил пересмотреть и его. Сравнить с воспоминаниями. Может быть понять, как сильно изменился я за это время.

Не буду стесняться и скажу сразу: фильм мне снова понравился! Да, произведение Тарковского это другая весовая категория. Да, американский Солярис сделан "по мотивам" нашей картины (и снова, идеям книги оставлено второстепенное место). Да, можно сказать что новый фильм -- американское кино, более грубое, "попсовое" и даже вульгарное... Но. Но что-то после просмотра засело в душе. Так же как и 20 лет назад. В чём дело?

И тут я понял, что секрет кроется в том, что американский фильм дополняет картину Тарковского! Не повторяет целиком, но дополняет. Содержит элемент, которого не хватило Тарковскому!

При всей грубой упрощённости и наивности американской версии, там есть то, чего не хватает (совсем чуть-чуть) нашему Солярису!

Я думаю, это "что-то" хорошо заметно по финалу. Если у Тарковского финал -- это возвращение блудного сына. Где религиозный вопрос стоит очень глубоко, очень сильно. Но при этом не содержит полного разрешения. Сын стоит на пороге дома. Он пришёл, вернулся к Отцу. Но вопрос совести не снят! Самый главный вопрос, отношения человека с Богом. Очень высокое напряжение финала, но всё-таки. Всё-таки, ветхий человек всё ещё остаётся "в кадре".

Так вот, если здесь -- возвращение блудного сына, то в американском Солярисе, за довольно грубой формой скрывается, на мой взгляд, недостающий компонент:

> -- Everything we've done is forgiven...

Диалектика. Бог не только справедлив, но и милостив.

В фильме Тарковского, мы смиренно созерцаем икону. Не дерзаем сделать шаг. А в американском фильме оказываемся "по ту сторону". Наивно, грубовато, просто, напролом. Но это есть!

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

> Откр.21:1-4 И увидел я новое небо и новую землю, ибо прежнее небо и прежняя земля миновали, и моря уже нет.

Без оговорок. "Нам всё прощено". Эта мысль -- как молния.

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

P.S. Кстати, картина Содерберга можно сказать "провалилась" в прокате. Я не удивляюсь. Но всё-таки, почему всегда так?
P.S. Edited: 2022-11-28 12:43:25

# Секретный проект: rein
std.hugeping
hugeping(ping,1) — All
2022-11-22 17:51:00


Я давно не делал никаких заметок. Конечно, отчасти это связано с тем что происходит в мире. "Не до того!". Да и бытовые проблемы никуда не делись. Но сейчас есть повод написать, если и не статью, то хотя бы заметку о том, чем я занимаюсь. "Я всё-таки пою, ведь кто-нибудь услышит"(c).

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

Если говорить об INSTEAD, то большую часть кода для него я написал так давно, что сейчас я едва ли могу им восхищаться. Да и новых проектов практически так и не вышло за последнее время. Жаль. С другой стороны, наследие игр у INSTEAD прекрасное. И я знаю что незрячая аудитория у них есть. В общем, INSTEAD будет жить.

Re:instead -- интересный, но всё-таки камерный. Наверняка я ещё вернусь к нему (если будет такая возможность), но в целом -- он готов.

То, что пишу сейчас, я назвал rein. Это игрушка, которая вобрала в себя элементы всего того что я делал раньше, но с учётом накопленного опыта. Там есть что-то от instead и re:instead. Идеи pico8 и uxn. В нём я сделал то, что так и не смог (побоялся!) сделать в INSTEAD. И то, что совершенно не нужно re:instead...

Звуковую систему пишет true-grue -- и это очень интересный опыт. Во первых, вдвоём писать веселее! А во-вторых, я уверен что учусь у него новому. В том числе и писать код чище. Или хотя бы стремиться к этому. :) Звуковую подсистему я никогда не смог бы написать сам, хотя всегда мечтал, чтобы она была и в instead и в reinstead. Речь, конечно, идёт о синтезе. Так что без true-grue проект был бы невозможен. И я немного паранойю по этому поводу, так как привык рассчитывать только на себя.

Я не знаю, сколько ещё будет написано строк до первой версии и сможем ли мы его закончить, но занимаясь rein я снова чувствую бодрость творчества. Ребята, творчество рулит! Начинаешь делать и понимаешь -- это правильная вещь!

P.S. В этот раз я решил проявить упорство и для обсуждений #rein и не только создал irc канал. Всё! Больше никаких телеграм-чатов! Так что если что, заходите в на irc.oftc.net канал #rein.

# Переименовал github аккаунт
std.hugeping.micro
hugeping(ping,1) — All
2022-11-13 19:02:41


Теперь мои личные репозитории находятся здесь: https://github.com/hugeping

gl00my -- это ник из затянувшегося переходного возраста, который вызывает сейчас скорее неприятие и я постепенно от него избавлялся.

А история hugeping (хотя он тоже из "детства") -- довольно забавная и не связана с позерством.

Просто, когда-то я играл с бразильцами-школьниками в одну замечательную 2d ctf сетевую игру. У меня был длинный пинг, и я проигрывал. Но игра мне так нравилась, что я играл не смотря на проблемы с откликом. Помню, меня кикали с сервера за что-то, а его ронял. А потом написал бота, который активировался автоматически если отпустить клавиши... Бот делал предсказание траекторий поэтому я стал играть довольно эффективно, даже не смотря на пинг :)

В итоге, мои боты вошли в игру и мы все подружились, потому что я принёс пользу. Да и вообще, общались друг с другом в чате игры. А ещё потом, игра умерла...

Всегда с теплотой вспоминаю это время, почему-то. В общем, hugeping лучше gl00my. :)

# Изменения по tgistation.ru
idec.talks
Ordos(tgi,1) — All
2022-10-27 10:10:04


Изменения по tgistation.ru. Может кому интересно будет.

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

Прикручен сбор новостей с хабра. Не всех, в основном, низкоуровневое программирование, микроконтроллеры и т.п.

Открыта свободная автоматическая регистрация без почт и sms. Надеюсь спаммеры не заведутся :)

Идут раздумья по поводу реализации приватных бесед. Для начала хотя бы в пределах одной станции. Пока думаю использовать это для общения и взаимодействия с ботами. Мне кажется это сильно бы расширило полезность сети как таковой.

# Таверна поломалась
idec.talks
Ordos(tgi,1) — All
2022-10-24 08:36:22


Собственно сабж. Пару дней уже как.

# Везение
pipe.2032
Andrew Lobanov(tavern,1) — All
2022-09-23 15:12:34


Давеча побрился (тримером под 6 мм.) и пошёл в душ, дабы смыть с себя мелкие волоски после бритья. И в процессе один этот волосок воткнулся мне в ступню как заноза. Причём вошёл почти на всю длину. А я это место на ноге даже рассмотреть нормально не могу, а уж тем более вытаскивать оттуда занозу.

Хорошо, что есть жена - она мне эту хрень и вытащила :)

А как везёт вам?

+++ Caesium/0.4 RC1

# Ковидное
pipe.2032
Andrew Lobanov(tavern,1) — All
2022-09-21 14:26:44


Второй раз переболел ковид-19. В этот раз было гораздо легче и проще, чем в прошлом году. Удивило как изменился подход за это время.

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

И вот я вышел сегодня, а там весь кабинет слёг :(

+++ Caesium/0.4 RC1

# Велосипедостроительство
idec.talks
Andrew Lobanov(tavern,1) — All
2022-09-20 10:35:00


Я немного отовсюду пропал в последнее время - новая работа, много забот и очень мало времени. Надеюсь, скоро это всё устаканится. Пока же занимаюсь сабжем.

Итак, почти закончил godec (нехитрое название да) - библиотеки, реализующей протокол idec на go.

Следующим шагом будет создание нового фетчера на базе этой библиотеки, реализация хранилища (скорее всего на базе postgresql) сообщений, создание узла без веб-интерфейса и, собственно, завершающим шагом будет создание нового веб-интерфейса таверны.

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

После всей этой эпопеи планирую написать таки новый репозиторий instead-games.ru, но это уже для другой эхи и фиг знает когда будет :)

+++ Caesium/0.4 RC1

# Spectranet
zx.spectrum
shaos(shaos, 2) — All
2022-09-18 21:20:19


А вот кто-то из здесь присутствующих использует сетевую карточку Spectranet? Она подключается к классическим спектрумам через задний краевой разъём и позволяет через Ethernet ходить на TNFS-сервера со ZX-софтом - список рабочих серверов TNFS можно найти тут:
https://spectrumcomputing.co.uk/forums/viewtopic.php?f=24&t=4511

# Saluton (Привет!)
idec.talks
Andrew Lobanov(tavern,1) — All
2022-08-27 18:19:46


Рад сообщить, что в таверне появился клуб эсперантистов. Заходите в eo.klubo -- поболтаем :)

+++ Caesium/0.4 RC1

# GTK5 и Xorg
linux.14
Andrew Lobanov(tavern,1) — All
2022-07-05 13:53:27


Что думаете по поводу возможного отказа от X11 в GTK5? Wayland, ИМХО, до сих пор не очень готов. Есть ли какая-либо информация из недр GNU? Ждёт ли нас очередное продавливание, как это было с systemd, ставшим в итоге стандартом де-факто?

+++ Caesium/0.4 RC1

# Про воду немного
pipe.2032
Andrew Lobanov(tavern,1) — All
2022-07-01 10:18:31


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

Обращения к губернатору и в прокуратуру дают разовый результат и на следующий год всё повторяется. Спасаемся электрическим бойлером ака накопительный водонагреватель, но это костыль. Кто-нибудь сталкивался с подобными ситуациями? Есть опыт действенных мер?

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

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

+++ Caesium/0.4 RC1

# Как украсть воду..
pipe.2032
btimofeev(tavern,13) — All
2022-06-29 19:18:44


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

На даче включают воду два раза в неделю на два часа. У всех стоят большие металлические бочки которые и наполняют в это время. В воскресенье приезжаем мы на дачу, быстренько включаем воду пока ее еще дают. Бочка в это время была наполовину наполнена. Включили, вода пошла и забыли про неё. Часа через три подходим - бочка пустая, вода не идёт. Под бочкой сухо, кран перекрыт, вода не могла никуда уйти. Как так получается?

У меня подозрение что когда перекрывают воду кто-то включает насос и выкачивает из чужих бочек, доступ к которым не перекрыли (а они подключены к одной трубе). Могут быть другие варианты?

# Mira station
idec.talks
Andrew Lobanov(tavern,1) — All
2022-06-24 06:46:23


Восстановлена связь с сабжем. По техническим причинам в таверну не ходили сообщения с 9 апреля.

Сисопы, имеющие станцию Мира в аплинках, проверьте связь. Пока что она шлёт мусор на запросах несуществующих эх. У себя я обнаружил запрос несуществующих ifiction.15 и python.15.

+++ Caesium/0.4 RC1

# Оконный менеджер bspwm
std.hugeping
hugeping(ping,1) — All
2022-05-29 12:27:46


# Эксперименты с оконными менеджерами

Я люблю экспериментировать с рабочей средой в Linux. Редакторы, оконные менеджеры, способы создания документации и т.д. Думаю, меня гнали по этому пути любопытство и жажда эксперимента (в том числе и над собой). Помню как в своём первом Linux (KSI Linux) мне решительно не понравились gnome 2 и kde 2. Тогда же я обнаружил прекрасный WindowMaker и процесс был запущен.

Я перепробовал массу оконных менеджеров. В разные периоды меня кидало от минималистических wm до полновесных рабочих столов. Но фундаментально стиль работы не менялся. "Вынос мозга" случился после ion3. Очень достойный тайловый менеджер (написанный харизматичным автором) дал новые ощущения и я подсел! Стоит ли говорить, что на ion3 я не остановился? Тайловые менеджеры тогда набирали популярность и я пробовал всё, что выглядело интересным: dwm, wmii, musca, xmonad, ratpoison, i3wm... Обычные wm я тоже пробовал, но после выхода gnome 3 интерес к экспериментам угас, так как gnome3 в качестве обычного десктопа мне очень понравился.

# Золотой набор

После выхода gnome3 я постепенно успокоился и у меня сформировался свой "золотой" набор.

- Для работы: i3wm (+dmenu).
- Для дома (компьютер, который использую не только я): gnome3.

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

Интересно что wmii был создан с оглядкой на acme! Только вот про Plan 9 и acme я узнал гораздо позже.

Кстати, раз уж зашёл разговор про Plan 9... В rio ("оконном менеджере" Plan 9) при абсолютной аскетичности сохраняется высокая практичность окружения. Я пытался сделать подобие rio на основе fvwm2 (с частичным успехом), но оставил эту попытку. Слишком уж разный "путь" у Linux и Plan 9. Например, в rio ты заранее создаёшь окна в которых запускаются программы, но программа не создаёт окон сама! Интересно, что небезызвестный Drew DeVault делал эмуляцию такого поведения в своём "клоне" wio: https://drewdevault.com/2019/05/01/Announcing-wio.html Но всё это выглядит как подделка, если честно. Так что я оставил Plan 9 "плановое", а Linux - "линуксовое".

# Новое знакомство: bspwm

Многие годы я использовал i3wm и gnome3 и до сих пор считаю это лучшим "набором", который могу рекомендовать всем. Но время от времени я продолжал экспериментировать. Например, познакомился с cwm. В "наборе" своё место занял tmux. И вот, на днях, решил посмотреть на bspwm. Мне этот оконный менеджер настолько понравился, что я решил написать эту заметку. Говорю сразу -- достойный wm! Для любопытных программистов. :)

# К сути

Обычно упоминают что bspwm работает с окнами как с бинарным деревом. Это первая строчка в man bspwm и, честно говоря, с чисто практической точки зрения для меня это мало что значит. Мне же хочется сделать упор на "практике". А с практической точки зрения "суть такова"(c):

- bspwm конфигурируется и управляется только одним способом: утилитой bspc;
- чтобы управлять bspwm с клавиатуры используется внешний "демон" горячих клавиш (обычно sxhkd) из которого вызывается bspc;
- bspwm не поддерживает никаких панелей и прочих "свистелок". Но с помощью bspc вы можете слушать нужные вам события и делать что хотите;
- bspwm выглядит сбалансированным и отполированным как и i3wm. Многие вещи сделаны "интуитивно-верно".

То-есть, мы видим вполне себе тот самый Unix-way да ещё и в качественном исполнении. Вообще, когда я начинал играться с bspwm меня пугала перспектива писать портянки на shell, как это часто бывает. Но... Обо всём по порядку...

# Конфиг bspwm

Конфигурация bspwm это просто shell скрипт в котором в основном присутствуют вызовы bspc. Я приведу фрагменты своего конфига для иллюстрации. Интересно, что файл получается простым, потому что в нём не заданы горячие клавиши. Только конфигурация самого wm!

#! /bin/sh

pgrep -x sxhkd > /dev/null || sxhkd & # запуск демона горячих клавищ
pgrep -x panel > /dev/null || panel & # запуск панельки (об этом - ниже)

setxkbmap -layout "us,ru" -variant "winkeys" -option "grp:caps_toggle,compose:ralt,grp_led:scroll" # раскладка

xsetroot -cursor_name left_ptr # курсор вместо символа X

bspc monitor -d 1 2 3 4 5 6 7 8 9 0 # рабочие столы

bspc config removal_adjustment false # при удалении окна не ребалансить
bspc config swallow_first_click true # первый клик не идёт в приложение

bspc rule -a librewolf desktop='^4' # пример правила
bspc rule -a Xdialog state=floating # ещё пример правила

bspc config pointer_modifier mod4 # ресайзим и таскаем окна мышкой
bspc config pointer_action1 move
bspc config pointer_action2 resize_side
bspc config pointer_action2 resize_corner
bspc config focused_border_color '#ff0000' # рамка активного окна поярче

На самом деле это практически весь конфиг, кроме каких-то локальных нюансов.

# Конфиг sxhkd

Теперь, sxhkd. На самом деле вам не нужно будет писать этот файл с нуля, можно взять типовой из share/doc/bspwm/examples и начать использовать его. В качестве примера, приведу фрагменты своей конфигурации:

XF86AudioLowerVolume
        amixer -q sset Master 10%-

XF86AudioRaiseVolume
        amixer -q sset Master 10%+

# terminal emulator
super + Return
        st

# focus the node in the given direction
super + {_,shift + }{h,j,k,l}
        bspc node -{f,s} {west,south,north,east}

Тут тоже есть простота. Она состоит в том, что ничего кроме горячих клавиш и реакций на них (в виде запуска утилит) в конфиге нет.

# Панелька

В примерах bspwm есть панелька на основе shell скрипта и lemonbar. Я не люблю портянки на shell (хотя и умею их писать и понимать) поэтому я изучил как она работает и написал свою...

lemonbar рисует саму панель, но содержимое панели приходит в виде stdin. И вот наша задача предоставить информацию для lemonbar в виде текста оформленного определённым образом.

Что за информация? Например: информация о номерах десктопов, активном десктопе, режиме окна и так далее. Эту информацию нам может предоставить bspc. В режиме bspc subscribe report мы получаем события этого оконного менеджера. Но кроме десктопов нам нужны ещё: часы, батарея, раскладка. Ну и так далее, по вкусу.

Панелька из примеров делает fifo и направляет в эту fifo вывод различных утилит, которые запущены в режиме монитора (выводят строчку в stdout при изменении информации). Например, xtitle -s. Далее, скрипт на sh читает из fifo общий поток, парсит его и даёт на вход lemonbar. Я подумал, что это полотно легко переписать на go (go-рутиты идеально здесь подходят). Я приведу фрагмент того, что у меня получилось:

func read(fname string) string {
// читает файл и возвращает строку
// ...
}

// запускает процесс и отправляет его вывод в канал
func cmd_reader(out chan<- string, prog string, args ...string) {
	cmd := exec.Command(prog, args...)
	pipe, _ := cmd.StdoutPipe()
	reader := bufio.NewReader(pipe)
	cmd.Start()
	for {
		output, _, err := reader.ReadLine()
		if err != nil || err == io.EOF {
			break
		}
		out <- string(output)
	}
}
// парсим информацию о десктопе
func bsp_parse(item string) string {
	c := item[0:1]
	var U, F, B string;
	U = "#144b6c"
	nam := item[1:]
	switch c {
	case "f": // free desktop
		F = "#737171"
		B = "#333232"
		// далее F= B= в каждом case (FoOuU) пропущено для краткости
	case "F": // active free desktop
	case "o": // occupied desktop
	case "O": // focused occupied
	case "u": // urgent
	case "U": // focused urgent
	case "L","T","G":
		F = "#ffffff"
		B = "#333232"
		return fmt.Sprintf("%%{F%s}%%{B%s} %s %%{B-}%%{F-}", F, B, nam)
	default:
		return ""
	}
	return fmt.Sprintf("%%{F%s}%%{B%s}%%{U%s}%%{+u}%%{A:bspc desktop -f %s:} %s %%{A}%%{B-}%%{F-}%%{-u}",
		F, B, U, nam, nam)
}

func main() {
	bspc_in := make(chan string)
	xtitle_in := make(chan string)
	mail_in := make(chan string)
	xkb_in := make(chan string)
	go cmd_reader(bspc_in, "bspc", "subscribe", "report") // десктопы
	go cmd_reader(xtitle_in, "xtitle", "-s") // заголовок окна
	go cmd_reader(mail_in, "checkmail", "-s") // новая почта
	go cmd_reader(xkb_in, "xkbmon") // раскладка
	var bspc, bat, clock, mail, xtitle, xkb string;
	for {
		select {
		case bspc = <-bspc_in:
		case xtitle = <-xtitle_in:
		case mail = <-mail_in:
		case xkb = <-xkb_in:
		case <-time.After(time.Second * 30):
		}
		if bspc == "" {
			continue
		}
		bat = read("/sys/class/power_supply/BAT1/status")
		bat += ":" + read("/sys/class/power_supply/BAT1/capacity")
		curt := time.Now()
		clock = curt.Format("02-01-2006 Mon 15:04")
		bsp := strings.Split(bspc, ":")
		desk := ""
		for _, item := range bsp {
			desk += bsp_parse(item)
		}
		fmt.Printf("%%{l}%s%%{c}%s%%{r}%s %s%% %%{F#000000}%%{B#ffffff}%s%%{B-}%%{F-}[%s]\n", desk, xtitle, mail, bat, clock, xkb)
	}
}

Программа совсем простая, написанная под конкретную ситуацию как скрипт. Конечно, можно было взять готовую панель. Можно было взять вместо lemonbar что-то другое. Но мне лично проще, когда я понимаю происходящее полностью и могу это контролировать. Да, монитор раскладки я написал на C. Тоже небольшая программка.

# Особенности использования

В целом, bspwm из коробки вполне себе годен, но мне не хватало некоторых вещей. На этих нюансах остановлюсь подробнее.

Если в запущенном wm просто начать запускать терминал по super + Return, то заполняться пространство будет примерно так (что-то вроде спирали Фибоначчи):

+----------+----------+
|          |          |
|          |          |
|          |          |
+----+-----|          |
|    |     |          |
|    +--+--+          |
|    |  +--+          |
+----+--+--+----------+

При этом, если закрыть какое-то из окон, то оставшиеся окна автоматически "сбалансируются". Это напоминает поведение динамических wm (которое мне не нравится). К счастью, в bspwm есть настройка: bspc config removal_adjustment false.

Кроме того, bspwm позволяет предварительно выбрать следующую позицию для разделения окна. Эта фича висит на хоткеях но я сделал для себя отдельно запуск терминала под текущим терминалом:

super + shift + Return # запуск "вертикально"
        bspc node -p south; \
        st

Таким образом, я могу быстро создавать терминалы в одном столбце:

+----------+----------+
|          |          |
+----------+          |
|          |          |
+----------+     2    |
|    1     |          |
+----------+          |
|          |          |
+----------+----------+

Далее, выбрав определенный терминал хоткеями или мышкой можно максимизировать его на всё пространство (режим монокля, по умолчанию super + m) или поменять его (1) с самым большим окном (2) примерно так, как это сделано в dwm. (Для этого используется хоткей super + g).

# swap the current node and the biggest window
super + g
        bspc node -s biggest.local
# в дефолтном примере было: bspc node -s biggest.window
# в таком режиме большое окно выбиралось со всех десктопов
# что было неудобно
# заменил на .local

Мне ещё не хватало возможности растянуть терминал вертикально:

+----------+----------+
+----------+          |
+----------+     2    |
|          |          |
|    1     |          |
|          |          |
|          |          |
+----------+          |
+----------+----------+

Я смог добиться такого поведения, правда, небольшим хаком:

super + v
	bspc node north#north#north#north#north#north -z top 0 -2000; \
	bspc node north#north#north#north#north -z top 0 -2000; \
	bspc node north#north#north#north -z top 0 -2000; \
	bspc node north#north#north -z top 0 -2000; \
	bspc node north#north -z top 0 -2000; \
	bspc node north -z top 0 -2000; \
	bspc node -z top 0 -2000; \
	bspc node -z bottom 0 2000

Дело в том, что окно не может быть расширено, если над ним есть несколько максимально суженных окон. Возможно, это баг bspwm. Возможно, есть более элегантное решение, но текущее тоже работает!

Всё эти хитрости помогли мне заменить табы и стек окон в i3wm.

Ещё одна штука, которая мне нравилась ещё по Plan9 -- возможность именовать окна по ситуации. В случае bspwm, правда, именуем не окна, а рабочие столы. Я написал скрипт, который вызывает Xdialog (Xdialog --stdout --under-mouse --inputbox "Window name" 0 0) и просит имя для текущего десктопа. Потом делает: bspc desktop focused --rename имя. Повесил на хоткей и всё -- можно именовать!

Ещё один пример гибкости простых решений. Скрипт который делает все окна на 9м десктопе "плавающими". За основу был взят пример с Arch wiki, но немного доработан (отслеживается не только создание, но и перемещение node):

#!/bin/bash

# change the desktop number here
FLOATING_DESKTOP_ID=$(bspc query -D -d '^9')

bspc subscribe node_add node_transfer | while read -a msg ; do
    if [ "${msg[0]}" = "node_transfer" ]; then
        desk_id=${msg[5]}
        wid=${msg[3]}
    else
        desk_id=${msg[2]}
        wid=${msg[4]}
    fi
    [ "$FLOATING_DESKTOP_ID" = "$desk_id" ] && bspc node "$wid" -t floating
done

# Хакерская штучка

bswpm создаёт впечатление добротной и отполированной хакерской "штучки". Например, по умолчанию super + tab работает именно так как нужно! Переключаясь между последними двумя рабочими столами. Работа с окнами просто реактивная. Изменение размера окон мышкой работает тоже отлично. Также мышкой можно перемещать тайловые окна, меняя их местами. Много мелочей, которые незаметны, когда они работают "правильно". По стабильности на данный момент тоже нареканий нет. Кстати, параллельно с bspwm я также посмотрел herbstluftwm (никак не могу выучить название этого wm!). Но ощущения "отполированности" с этим wm у меня не возникло, хотя тоже -- неплохой тайловый менеджер и подход к управлению/конфигурированию очень похож.

# Вместо заключения

Функционально i3wm и bspwm близки. Но i3wm предоставляет большинство функций "из коробки". С другой стороны, в bspwm благодаря простоте устройства многие вещи выглядят менее "захламлёнными" и "раздражающими". То что есть -- работает предсказуемо и отлично. Это для меня уже привычная характеристика для простых инструментов.

И если i3wm я могу рекомендовать всем без исключения программистам, то bspwm уже скорее для любопытных минималистов. Но, как мне кажется, любопытство -- одно из наших основных (программистских) качеств. Ведь правда? :) Ну а на моём рабочем ноутбуке bspwm уже заменил i3wm.

# Trace: Birds
std.hugeping.micro
hugeping(ping,1) — All
2022-05-20 13:36:36


У меня одна из любимых групп: Procol Harum. И вот, вчера нашёл ещё музыку, которая действует на меня просто каким-то волшебным образом! Понимаю, что о вкусах не спорят, но если вдруг, то вот:

https://www.youtube.com/watch?v=4EvoqLw_QB4&list=PLUnxGWZ-jLPYtcGYwon2PQa1N9q_GpOa0&index=38

Удалось при помощи true-grue найти все 3 альбома. Слушаю непрерывно второй день, никогда не думал, что может так действовать. В чём тут секрет?

# Фильмы о войне
std.hugeping.micro
hugeping(ping,1) — All
2022-05-12 21:40:12


Пересмотрел в очередной раз "В бой идут одни старики". Очень люблю этот фильм. Кажется, что каждый кадр в нём -- живой. По TV в это время шёл "Девятаев". Ну, думаю, дай посмотрю на современное кино... В общем, не выдержал и 20 минут. Задумался. Конечно, нельзя обобщать. Это с одной стороны. А с другой ну, действительно, есть какая-то нехорошая тенденция. Если воздушные бои - то компьютерная игра. (Кстати, наверное самые классные воздушные бои в кино я видел в "Голубом Максе" 1966 года.) Если герои -- то всегда с какой-то постмодернистской стыдливостью... Это в лучшем случае.

А потом, пока искал что-то из современного, натолкнулся на:

https://litvyakfilm.ru/

"28 панфиловцев" помните? В общем, ребята продолжают своё дело и снимают следующий свой фильм. Очень рад за них! Оказывается, мечты иногда сбываются. Только для этого надо много работать. :)

# ii-txt-0.9.tar.gz
idec.talks
oldpc(ping,11) — All
2022-05-04 17:34:51


Текстовый клиент, который не так давно отметил своё восьмилетие (первый из существующих клиентов) обновился до версии 0.9

* поддержка загрузки некоторых эх с других станций
* нумерация файлов в каталоге 0001.txt вместо 1.txt

Размер архива вырос на 55 байт :( и теперь составляет 3911 байт. Поддерживается python от 2.4 до 2.7.
(разные версии тестировались на первом пентиуме с Debian Sarge, Etch, и OpenBSD 4.2, 5.0 и др.)
(это сообщение создаётся на третьем пентиуме, правда с новейшей OpenBSD 7.1)

ii-txt-0.9.tar.gz

# тест
pipe.2032
oldpc(ping,11) — All
2022-05-04 12:42:31


тест

# Христос Воскресе!
std.hugeping
hugeping(ping,1) — All
2022-04-24 09:03:53


Думал написать в духе текущих событий, что Пасха в тяжёлое время и так далее... Потом подумал, что ведь это всегда так было. Просто у человека есть естественный "предохранитель" -- замечать только то, что в зоне непосредственного восприятия. Даже когда на небе светит солнышко, а вокруг птички да цветы -- смерть никуда не делась. Зло никуда не делось. Где-то идёт очередная война. Кто-то кричит от страха и боли. Кто-то умирает. Легко рассуждать "о высоком", когда ты сидишь в тепле, с кружкой чая в руках...

Это -- не нормально. Мир -- ненормален. "Естественный ход вещей" -- результат грехопадения. Наш мир -- сломанный мир.

Но Христос "взорвал" ад изнутри, так что теперь у нас есть путь. Мы призваны идти по нему к Небесному Иерусалиму. Кто как может. Не время опускать руки и отчаиваться. Даст Бог, прорвёмся!

> Итак, все — все войдите в радость Господа своего! И первые, и последние, примите награду; богатые и бедные, друг с другом ликуйте; воздержные и беспечные, равно почтите этот день; постившиеся и непостившиеся, возвеселитесь ныне! Трапеза обильна, насладитесь все! Телец упитанный, никто не уходи голодным! Все насладитесь пиром веры, все воспримите богатство благости!

> Никто не рыдай о своем убожестве, ибо для всех настало Царство! Никто не плачь о своих грехах, потому что из гроба воссияло прощение! Никто не бойся смерти, ибо освободила нас Спасова смерть! Объятый смертью, Он угасил смерть. Сошед во ад, Он пленил ад и огорчил того, кто коснулся Его плоти.

https://pravoslavie.ru/61346.html

Христос Воскресе!

# Отцы и дети
std.hugeping
hugeping(ping,1) — All
2022-04-16 11:42:16


# Вместо введения

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

Но моя заметка про "Точку Z стала политическим манифестом. Как обычно, разбираясь в своих мыслях, одновременно с этим я чувствовал, что обязан высказаться публично. И глядя на мнение людей, которые поддержали меня или, напротив, были разочарованы моей позицией, я понимаю, что поступил честно и по отношению к себе и по отношению к ним. Реакция на "Точку Z" стала своеобразным подтверждением того, о чём я писал. Пусть всё будет честно!

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

# Отцы и дети

Часто говорят, что лучше учиться на чужих ошибках. Возможно, это работает для каких-то отдельных "бытовых" вещей, но в плане жизненного опыта -- не работает вообще. Каждый из нас имеет свой жизненный путь, свой след. Словно годовые кольца деревьев, наматываются воспоминания, ошибки, выводы. То, кем мы являемся сейчас, во многом определяется этим извилистым путём. Невозможно взять и вложить собственный опыт в сознание своих детей. Потому что одни и те же события в жизни могут интерпретироваться (и действительно интерпретируются) по разному. В соответствии с собственным восприятием. Это не значит, что воспитание не работает. Но работает оно с эффектом "запаздывания".

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

> Когда-то ты был битником...

Но потом проходит время, и ты с удивлением (и даже ужасом!) начинаешь осознавать, что становишься похожим на своего отца. А твои дети -- на тебя самого, n-лет назад. Причём и своего отца ты начинаешь понимать всё больше.

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

Год 1996-й. Я счастливый возвращаюсь домой. Дома меня встречает отец. Он сидит в кресле в плохо освещённой комнате.

-- Ну что, проголосовал?
-- Проголосовал!

Отец вздыхает и качает головой. Он знает за кого я проголосовал. Конечно, в тот момент меня его вздох скорее возмущает. Ведь я голосовал за новый мир! За свободу! За уничтожение старого, закостенелого, прогнившего мира... А он -- вздыхает!

Но сейчас в этой комнате присутствует ещё один человек. Как и мой отец, он грустно улыбается глядя на 18-летнего юношу.

Да, теперь те выборы препарированы. Мы знаем, что ставка на молодёжь оправдала себя. Голосуй, или проиграешь... Опыт "западных партнёров" сработал безупречно. Холодный расчёт. И романтика молодых людей.

- https://yewtu.be/watch?v=Vd7EjvDHwQw

> ... Песня про то, как поднимается с колен родина, которой, собственно говоря, и нет, которая не то что поднимается с колен, а увязает ... все глубже, и туже, и безысходнее. И при этом петь о том, как родина подымается, — это очень мощно. // Е. Летов

Я долго не взрослел. И мне это нравилось. Молодым быть лучше, чем старым. Поэтому Болотная площадь застала меня врасплох. Помню, как бушевали мои эмоции! Свобода попрана! Это очевидно всем! К счастью, мне хватило ума не идти дальше сочувствующих всхлипов. К тому же, я любил программировать больше, чем читать новости.

Время шло, и мир постепенно показывал свою изнанку. Цинизм мироустройства на планете Земля всё чаще пробивал оборону детства и ... я перешёл в своё взрослое состояние. Вдруг, стали понятны все песни Шевчука. :) Шучу.

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

Если бы сегодня я мог оказаться в той комнате, что бы я сказал себе 18-летнему? Рассказал бы я ему, что его используют силы, цинизм которых он не может себе даже представить? Смог бы я найти слова, чтобы сообщить себе из 2012-го, что не стоит лить слёзы напрасно за людей, для которых ты -- лишь средство?

Нет, ничего не сказал бы. Не нашёл бы слов. Просто вздохнул бы и покачал головой, как мой отец когда-то. Потому что всё идёт своим чередом.

Человек рождается в мир. Взрослеет и первый раз серьёзно сталкивается с ложью. И вот, есть силы, которые предлагают здесь и сейчас всё исправить. Устоять невозможно! Праведный гнев -- очень удобное чувство, которым легко управлять. Конечно, повелители марионеток знают, как им пользоваться. И пользуются. Отрицать -- проще чем строить. Утверждать не надо, достаточно перевести "праведный" гнев в режим отрицания и разрушения. Догадаться, что тебя используют -- значит признать, что мир циничней, чем ты можешь себе вообразить. А в это не хочется верить!

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

Но дети не слышат отцов. Что же остаётся? Воспитывать и держать удар, пока наши дети не повзрослели. Пока у нас ещё есть это время.

P.S. Кстати, а помните "отменённую" песню на Eurovision "Я научу тебя..." Мне она тогда очень понравилась. Послушайте, если не слышали. Культура отмены учит быть "таким как все", но не надо стесняться быть собой. ;)

https://yewtu.be/watch?v=tmAgLGk2jIY

# День космонавтики
std.hugeping
hugeping(ping,1) — All
2022-04-12 13:53:45


Вчера я опубликовал свою статью ii://RZlA1xAFOxQMrrPRYC13 "Точка Z"
Потом была DDOS атака (впрочем, я до последнего считал это совпадением).
Потом -- комментарий в gemini. Сейчас пришло вот это:

Ваши посты удалены

===

Было обнаружено, что некоторые из ваших постов нарушают одно или несколько правил сообщества, и они были удалены модераторами mastodon.social.

**Причина:** Содержимое нарушает следующие правила сообщества

- No incitement of violence or promotion of violent ideologies

Цитируемые посты:


> Новая статья на станции ping. Точка Z
> https://club.hugeping.ru/RZlA1xAFOxQMrrPRYC13
>

Просмотр: https://mastodon.social/web/statuses/108109401254905355

---

Я, конечно, не буду комментировать. Всем всё понятно. Также, приглашаю всех сомневающихся почитать посты в мастодоне, помеченные @rf и увидеть, что справедливость -- для всех разная. Но я лично понял для себя две простые вещи:

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

С днём космонавтики, друзья!

P.S. Конечно, мне теперь очень неприятно находиться на mastodon.social. Единственное, что меня сейчас сдерживает, что информацию нужно доносить любыми доступными способами. Но если я всё-таки решу уйти, заходите на https://hugeping.ru

# Сегодня немного поDDOSили
std.hugeping.micro
hugeping(ping,1) — All
2022-04-11 13:26:23


Сегодня малинку немного поDDOSили. Интересно, что событие это меня как-то "взбодрило" и вообще настроило на позитивный лад. Наверное, тут как с велосипедом. Не до рефлексии. :) Да и вообще -- весело!

Написал быстро скрипт для блокировки нужных IP, перенастроил сервер, ssh. Пока тихо. Конечно, от DDOS нет защиты, особенно, если это RPI на столе. :) Но и ценность моего ресурса невысока, так что в крайнем случае, ну, полежит немного...

# Точка Z
std.hugeping
hugeping(ping,1) — All
2022-04-10 20:18:47


> Лк19:40 Но Он сказал им в ответ: сказываю вам, что если они умолкнут, то камни возопиют.

Несколько раз думал написать на тему сегодняшних событий, но так и не смог начать. Что это, малодушие? Или, может быть, боязнь сделать шаг в политику, которую я всегда считал для себя запретной зоной? Я не знаю... Для меня вопросы взаимоотношения патриотизма, совести и государства всегда были проклятыми. Похоже, как и на другие "трудные вопросы", ответа на них в виде рецепта не существует. Ведь в жизни часто бывает так, что выбор стоит не между "хорошо" или "плохо", а "плохо" или "ещё хуже". А ещё чаще -- ты вообще перестаёшь понимать, что такое хорошо и что плохо.

> Мф19:26 А Иисус, воззрев, сказал им: человекам это невозможно, Богу же все возможно.

Переживая за то, что происходит сейчас с народами России и Украины, я в очередной раз понимаю, что в такие "моменты истины" не так важно то, что ты думаешь, как то -- что ты делаешь. Жизнь каждый день ставит перед нами вопросы, на которые нельзя ответить "по шпаргалке". Не удастся остаться в "безопасности". Залечь на дно. Сделать вид, что ничего не произошло... Ведь даже бездействие будет считаться ответом.

> Если есть шаг, должен быть след.

Свой след я тоже оставлю, так устроен этот мир.

Когда горячее олово капает на руку, не до философии. Работает нерв и рефлекс. А что такое "нерв" в данном случае? Это мифология. Мифология не как вымысел или сказка, а как сама жизнь. Мировоззрение, мироощущение, человеческая архитектура. Прошивка. Firmware. (См. "Диалектика мифа", А.Ф. Лосева)

Не так давно я просматривал листовки фашистской Германии, которые сбрасывались во время ВОВ. Смотришь и холодок по коже. Вроде бы ты знаешь, что война в прошлом. Понимаешь, что в листовке написана ложь! Но всё-равно чувствуешь гадкую змеиную ползучую силу, которая затаилась, ждёт своего часа... Ждёт, пока ты дашь слабину.

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

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

Есть такой фильм "Слёзы капали" Г. Данелия. Он снят по мотивам рассказа Кира Булычёва, который в свою очередь есть аллюзия на "Снежную королеву" Г.Х. Андерсена.

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

Что такое цвет? Только лишь длина волны? Что видит любящий муж, когда смотрит на свою жену с которой прожил многие годы? Только лишь фотоны? Да нет конечно! Цвет -- это не длина волны. А любящий взгляд -- это не про фотоны.

> Мф6:22 Светильник для тела есть око. Итак, если око твое будет чисто, то все тело твое будет светло

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

> В «их» категориях не существует независимого Донбасса, там нет Новороссии, хоть в качестве отдельного государства, хоть в составе России. Зато там имеются и много весят какие-то очень далёкие от меня вещи, вроде финансовой целесообразности, международных норм и общности экономических интересов. Ещё там существуют «серьёзные люди», которые с удовольствием иной раз пообщаются с чудаками и фриками, но сделают всё равно так, как диктует им их здравый смысл. Их, а не наш. // Захар Прилепин

Когда горят люди в доме профсоюзов, остаться в позиции нейтрального наблюдателя для меня -- это значит -- быть подлецом.

Желать смерти солдатам своей армии -- быть подлецом.

Бить ножом в спину своей Родины, когда ей тяжело -- быть подлецом.

Называть бойцов ДНР и ЛНР террористами -- быть подлецом.

Это -- мой нерв. Если у вас он работает по-другому, что же... -- мы враги. Это печально, но ситуация именно такова. А если вы сомневаетесь, подумайте, что было бы, если бы советские солдаты верили тем листовкам? Думайте, изучайте, читайте. Не скрывайтесь за этим инфантильным "мне стыдно". Прислушайтесь к себе. Что там -- в прошивке? Все мы несём ответственность за наш выбор. Наш след -- это мы сами.

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

Я искренне желаю победы нашим солдатам. Я желаю падения преступного украинского режима. Я желаю свободы и мирного неба ДНР и ЛНР. Я восхищаюсь теми людьми, которые ездят на Донбасс, открыто поддерживая наших ребят, и которым не стыдно быть русскими. Очень хочется верить, что мы это всё не растеряем... А там уж -- как Бог даст.

Сегодня идёт война мифологий. Конечно, Украина лишь видимая сторона конфликта. Она -- как прокси. И сидящие за прокси понимают, что ставки -- очень высоки. Это пугает. Так ли надёжно ЯО в качестве оружия сдерживания, или цена вопроса "перебъёт" даже инстинкт самосохранения? Боюсь даже думать об этом. Мир трещит по швам. Где окажется каждый из нас?

Точка Z наступила не 24 февраля, а гораздо раньше. Просто многие из нас этого не заметили. А того, кто заметил -- мы не слушали. Пора просыпаться.

Для поднятия морального духа:

- книга "Письма с Донбасса" // Захар Прилепин
- https://t.me/patricklancasternewstoday Патрик Ланкастер
- https://vk.com/video-3156562_456244781 Призраки: солдаты забытой войны
- https://yewtu.be/watch?v=augFYP09ALQ Облака плывут над головой
- https://yewtu.be/watch?v=aEkqA5L2hl0 Мы не уйдём // Джанго

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

P.S. #2 Уподобляться некоторым разработчикам Open Source проектов я не буду. Так что INSTEAD по-прежнему открытый и интернациональный проект, в котором, кстати, есть и украинская локализация. Он принадлежит сообществу -- совершенно разным людям, которые несут собственную ответственность за свои поступки. Наука, искусство и Open Source должны принадлежать всем! В этом я никогда не сомневался.

# Нодлист
idec.talks
Andrew Lobanov(tavern,1) — All
2022-01-24 05:31:03


Не прошло и двух месяцев, как я собрал актуальный нодлист.

Лежит в таверне на публичных фреках. Налетай!

P.S.: Доступен через веб-интерфейс http://idec.spline-online.ml/ без регистрации и SMS.

# Александр Столяров о творчестве
std.hugeping.micro
hugeping(ping,1) — All
2022-01-06 19:24:13


Смотрю фильм про Александра Столярова (знаю его по фильму "Старец Паисий и я, стоящий вверх ногами"). И тут такой забавный пассаж про творчество:

https://www.youtube.com/watch?v=RQ0HKYOR3c8&t=1221s

> Я вам говорил, что разницы между Копполой, мной и кинолюбителем из Житомира нет никакой. По большому счёту, это вопрос пиара...

# 2022
idec.talks
shaos(shaos, 2) — All
2022-01-02 04:23:09


Всех обитателей IDEC сети поздравляю с Новым 2022-м Годом! Желаю IDEC в новом году разростись до немыслимых размеров и подмять под себя ну скажем всех Спринтеристов (и даже частично Синклеристов), а если получится, то и ещё кого-нибудь в придачу ;)

# Мысли про возможное будущее IDEC
idec.talks
shaos(shaos, 2) — All
2021-12-21 08:13:05


Всем привет

Я познакомился в ii/IDEC только в августе этого года, стал изучать как оно всё устроено и наконец на днях, воспользовавшись открытой реализацией ii-php, поднял свой узел - теперь у меня есть несколько мыслей по возможному будущему этой системы (либо системы, которая может отпочковаться от этой системы, но будет оставаться совместимой со старым IDEC API):

1) Кроме base64 существует чуть более компактный способ представления бинарных данных в виде текста - это алгоритм ascii85, когда каждые 4 байта представляются 5-значным 85-ричным числом, где каждая "цифра" это символ от '!' до 'u', плюс буквы 'z' и 'y' несут особый смысл, кодируя четвёрки нулей и пробелов соответственно - в результате данные раздуваются не в 4/3=1.33 раз, как в случае base64 (или uue), а в 5/4=1.25 раз или меньше, что как минимум на 6% компактнее. Можно немного развить ascii85 для кодирования произвольных бинарных данных, назвав новую систему кодирования скажем ascii85+ задействуя остальные неиспользованные символы: 'x' может кодировать четвёрку 0xFF (это может помочь при кодировании прошивок ПЗУ), 'w' - четвёрку 0x80 (это может помочь при кодировании 8-битных беззнаковых WAV-файлов), 'v' - пока может использоваться для детектирования ошибки, фигурные скобки { и } могут выделять закодированный бинарный блок в тексте (наличие явно заданного стартового символа упрощает парсинг, а наличие явно заданного терминатора поможет обрабатывать пограничные ситуации, когда концовка файла не влезает в 4 байта целиком), а ~ и | могут использоваться для каких-то особых случаев (см.ниже). Этот подход можно использовать для встраивания бинарных файлов в текст сообщений как вложений (аля ююки), указывая имя файла после втавки (чтобы клиент знал с чем этот файл надо есть и надо ли):
Посмотрите на эту весёлую картинку:
{Abhdhj!$^390+-
 ...
 Bhdbdfjg}=funny.gif
Старые клиенты будут показывать такие сообщения как текст, а новые клиенты могут получать такие сообщения даже со старых узлов и показывать картинки как картинки или файлы как вложения (ряд иконок внизу сообщения), которые можно сохранить на диск на стороне клиента.

2) Этот же ascii85+ можно использовать для уменьшения размеров бандлов на 6% сделав новый вызов в API - например /u/n/msgid/msgid/msgid... (вместо /u/m/... который может остаться для старых клиентов) - и результат работы этого вызова может выглядеть примерно так:
msgid:{!"#$%&'()*+,-...}
msgid:{0123456789...}
msgid:{ABcded...}
где в фигурных скобках будет ascii85+ сообщений (этот алгоритм не является url-safe, поэтому в других местах API где надо url-safe останется всё тот же base64url).

3) Идея, что msgid является хэшом сообщения, с моей точки зрения является в ii ключевой, поэтому редактировать сообщения, сохранённые узлом (а тем более переданные на другие узлы) ни в коем случае нельзя! Ведь это поменяет контент и хэш уже не будет совпадать! Если же контент константен, то всегда можно восстановить msgid по самому сообщению, если вдруг msgid оказался утерян. Кроме того на стороне клиента (либо другого узла после фетча) можно проверить целостность сообщения, посчитав его хэш и сверив с msgid - если оно не совпадает, то либо это старое сообщение (отредактированное на узле, где это можно было делать, или посчитанное в стародавние времена, когда хэши в ii считались иначе), либо подменённое или испорченное новое сообщение - можно просто подсветить такое сообщение особым образом на клиенте и читатель сам будет решать, что ему с таким сообщением делать.

4) Хэш msgid может быть не визуально рандомным как сейчас, а будет способным нести информацию о типе (или о версии) сообщения - например сервер принимая от клиента текстовое сообщения классического вида добавит в его список тэгов новый тэг trick/0 и посчитает хэш сообщения - елси хэш не начинается скажем с символа '0', то алгоритм инкрементирует значение в этом тэге (trick/1) и считает хэш ешё раз - если опять не стартует с '0', то инкрементируем ещё раз и т.д. пока хэш не станет начинаться с нуля (в среднем на подготовку "красивого" msgid должно уходить порядка 32 вычислений хэша - иногда меньше, иногда больше) - в этом случае все узлы точно будут знать, что все "новые" сообщения с msgid вида 0... являются новыми "обычными" сообщениями (чтобы отличить от старых сообщений с именами случайно начинающимися с 0 можно проверить наличие тэга trick в заголовке сообщения - если он есть, то это новый тип сообщения с возможными вложенными файлами). Если каждая точка системы точно знает, что это новое сообщение, то она также может проверить целостность сообщения пересчитав его хэш и сверив с msgid ( ведь новый стандарт должен будет явно запретить редактирование или подмену сообщения уже сохранённого узлом ; ). Старые узлы и клиенты будут передавать такие сообщения как самые обычные (если не запнутся на неизвестном тэге trick).

5) Тип сообщения 1... может обозначать закодированный бинарный файл, когда в теле сообщения нет текста, а сразу идёт блок ascii85+ {...}. При посылке такого сообщения отправляющий клиент может задать новое ключевое слово @crc32:0xFFFFFFFF для указания контрольной суммы, которая при сохранении сообщения будет вставлена узлом в строку тэгов в виде .../crc32/0xFFFFFFFF и которую принимающий клиент может проверить после восстановления файла. Размер такого сообщения по понятным причинам будет ограничен - может быть даже придётся уменьшить текущий лимит 87кб до 32кб, чтобы эта реализация была совместима с ограниченными размерами памяти недокомпьютеров, которые могли бы участвовать в работе сети - в этом случае размер самого большого бинарного файла, который можно таким способом отправить, будет составлять порядка 26кб. Старые узлы и клиенты будут показывать такие сообщения как обычные текстовые.

6) Тип сообщения 2... может обозначать составной объект, когда ранее отправленные сообщения типа 1... на самом деле являются кирпичиками, из которых строится большое сообщение. В теле такого сообщения могут перечисляться как блоки {}, так и ссылки на внешние сообщения типа 1:
~1gjkwui4iuwqrezD56az
~1ui4iuwqrezD56azFejs
~{......}|это вставка блоба ascii85+ (комментарий после | до конца строки)
~1uwqrzFejsDSGFeekjkd|это ссылка на другой объект, который должен быть вставлен при сборке
{....}=666.bin|это объявление именованного блоба (без вставки)
~666.bin
~666.bin
~666.bin|это вставка копии именованного блоба (всего 3 копии подряд)
в примере выше показано как можно повторять несколько раз бинарный кусок, объявленный в том же сообщении (666.bin). Такой тип бинарного сообщения снимает любые ограничения на размер передаваемого объекта, который перед передачей может быть порублен на кусочки. При отправке такого сообщения также может быть использовано ключевое слово @crc32, которое как и в предыдущем случае будет вставлено узлом в строку тэгов при сохранении. Старые узлы и клиенты будут показывать такие сообщения как обычные текстовые (как в примере выше). В случае реализации сообщений 1 и 2 типов на уровне сети для передачи бинарных данных отпадёт необходимость в поддержке файлэх, которые выглядят несколько неестественно применительно к ii (например они не приспособлены для пересылки через последовательные каналы передачи данных, в то время как все остальные подсистемы IDEC представлены в текстовом виде и могут быть использованы через интерфейс терминала).

7) В будущем при отправке сообщения от поинта узлу к ключевым словам можно будет добавить ещё и подпись @sign:0xFF...FF по алгоритму скажем HMAC-RIPEMD-160-96 (с одним секретным ключом известным отправляющей и принимающей стороне), если достаточно удостовериться в валидности посланного от поинта на свой узел (узел должен знать секретный ключ поинта - точно также как сейчас он знает пароль) и далее при сохранении сообщения на узле (после проверки валидности) такую подпись можно опустить, либо (в будущем) по алгоритму Ed25519 (с публичным и секретным ключами), если требуется проверка достоверности сообщения в пределах всей сети на любом узле и любом клиенте (это более тяжёлая реализация, которая требует наличия двух алгоритмов SHA512 и Curve25519, а также способов передачи публичных ключей всех активных участников сети на все вовлечённые узлы) - в этом случае sign/0x... переедет в строку тэгов для проверки достоверности послания в любой точке сети (и также для проверки целостности данных вместо CRC32), а старые узлы и клиенты просто будут игнорировать этот тэг, как неизвестный.

8) Когда сеть разрастётся, возможно придётся отказаться от хранения всех сообщений на каждом узле (в идеале - когда все фетчат всех) - узлы могут быть разбиты на группы (с избыточностью) для хранения разных наборов объектов (скажем в зависимости от значений 2го и 3го символа в msgid). Существуют разнообразные алгоритмы распределённых хэшей, которые можно применить в данном случае для поиска объектов по хэшу (msgid) на сети ненадёжных узлов. В этом случае сеть можно будет использовать как распределённое хранилище подписанных объектов, которые можно будет задействовать при построении распределённых сайтов, мультиплеерных игр, криптовалют и т.д. Для старых узлов можно предусмотреть механизм, когда они подписываются на специальные скрытые эхи, в которые будут транслироваться копии объектов по группам - в этом случае эти узлы будут продолжать работать в старой парадигме IDEC, но в то же время они будут полезными в рамках новой распределённой сети объектов, раздавая сохранённые на них объекты при необходимости по запросу.

Shaos

# тестовое сообщение
idec.talks
shaos(shaos, 2) — All
2021-12-19 11:01:22


пишу тестовое сообщение

# Два пустых сообщения в idec.talks
idec.talks
shaos(tavern,34) — All
2021-12-20 07:46:43


Существует 2 пустых сообщения в idec.talks, которые вызывают ошибку при фетче из ii-php:
fetch http://idec.spline-online.ml/u/e/idec.talks/linux.14/lor-opennet.17/develop.16/plan.9/zx.spectrum
idec.talks
fetch http://idec.spline-online.ml/u/m/HaYwRbvCz0HDMhN2IrOU/ymc21433dohplAzblytS
invalid message: HaYwRbvCz0HDMhN2IrOU
error saving HaYwRbvCz0HDMhN2IrOU
invalid message: ymc21433dohplAzblytS
error saving ymc21433dohplAzblytS
Наверное если они невалидные их надо в чёрный список, не?

# Новый узел IDEC http://shaos.net:8085
idec.talks
shaos(tavern,34) — All
2021-12-19 12:35:00


Запустил таки ii-php у себя на доменном имени на специально выделенной машине PowerMac G4 400МГц с Debian-линухом на борту, стоящей у меня дома в Пало-Альто, штат Калифорния :)

Пожалуй это будет первый узел ii/idec-сети, расположенной на американском континенте (и возможно первый узел на неинтеловской архитектуре?)

Беру с таверны несколько эх, а также создал заглушки для своих эх ( в частности silicon.valley.local ; )

В будущем планирую на той же машине поднять Gopher-сервер и TNFS-сервер (для компьютеров ZX-Spectrum оснащённых сетевой карточкой Spectranet)

Shaos

# Предложения или "Как нам обустроить idec?"
idec.talks
ake(ping,30) — All
2021-12-16 16:22:37


Доброго времени суток. На волне (пока ещё) энтузиазма решил поделиться "рационализаторскими" предложениями для idec. Некоторые из них, в том или ином виде, озвучивались. Часть из них относится скорее к реализации нод, но некоторые потребуют либо дополнения протокола, либо изменений с разной степенью обратной совместимости.

1. Правила перемаркировки эх. Идея простая - на ноду приходит сообщение (не важно, фетчится или от поинта) и, если у него в качестве эхи указано некое значение A, то оно заменяется на некоторое A* по определённому правилу. Самый очевидный вариант использования - "личные" эхи, один поинт отправляет сообщение в эху "sendmsg.username", в процессе оно перемаркируется, как "readmsg.username_authstr" и адресат его может получить. Ещё так можно укрупнять и агрегировать эхи, перемаркировывая сообщения из внешних "dev.c", "dev.cpp", "dev.python" в общую локальную "dev.main", например. Недостатком становится то, что такие эхи становятся либо односторонними, либо надо создавать сложные обратные правила (т.е. ответы должны будут помещаться и в новую эху, и в старую).

2. Кросспостинг - отправка и присутствие сообщения с одним ID в нескольких эхах одновременно.

3. Хуки на появление сообщений в эхе/от пользователя/в качестве ответа. Тогда можно будет сделать, например, эху для управления нодой, какие-нибудь голосовалки (изначально была идея нодо-локальной общественной модерации) и ещё что-нибудь.

4. Добавить тег определяющий кодировку или тип содержимого (mime-type) тела сообщения. По идее это должно гарантировано решить проблему с тем, как реализовывать шифрование сообщений - зашифрованное сообщение будет иметь соответствующий тег encoding и его расшифровкой должен будет заниматься клиент.

5. Хранить время фетча сообщения нодой и использовать его в качестве указателя сдвига для получения индекса в /u/e-подобном запросе. Я читал обсуждение чего-то подобного в idec.talks, но по-моему там предлагалось использовать время самого сообщения, что действительно может работать криво.

6. Метод POST для /u/e и /u/m, это тоже обсуждалось и, вроде, не должно требовать больших изменений, но почему-то не взлетело.

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

8. Пока ещё сырая, на как выходит не новая, идея, касающаяся редактирования сообщений, заключающаяся в отправке нового сообщения, с тегом, скажем, "amend" содержащим ID оригинального сообщения. Идентичная идея была описана ещё в ii://jOO4SZIyVrHLU9XxuhKW , но осталась без ответов.

8.1. В первом варианте реализации, при получении такого сообщения нода либо удаляет оригинальное сообщение полностью (что ломает ответы на старый пост), либо удаляет его только из индексов, и заменяет его ссылкой на новую версию при прямом обращении (и если сообщение редактировалось много раз, то и предыдущие ссылки на него).

8.2. Более кардинальный способ - добавление в формат ID поля/постфикса версии, которое учитывается при фетче (и только при фетче). Тогда новое сообщение перезаписывает старое и инкрементирует версию, клиенты и ноды при фетче тянут сообщение, если его версия новее (что, правда, сильно усложняет его логику), на ответах это не сказывается, т.к. для них ID не поменялся.

# Программирование под ZX80 на ассемблере
zx.spectrum
hugeping(ping,1) — All
2021-12-13 10:27:28


В детстве у меня была БК0010-01 и у неё был классный ассемблер (PDP-11). Не так давно я его даже освежил, портируя Boulder Dash на instead: https://instead-games.ru/game.php?ID=197 Это практически полная калька, но на Lua.

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

1) книг для начинающих
2) кросс-ассемблеров
3) что-то ещё?

В общем, информацию, которая могла бы помочь начинающим программистам на спектруме :)

Пока нашёл это:

https://zxpress.ru/book.php?id=2 (Как написать игру на ассемблере для ZX Spectrum)
https://k1.spdns.de/Develop/Projects/zasm/Distributions/ (zasm)
https://github.com/sjasmplus/sjasmplus (sjasmplus)

Если есть что подкинуть, кидайте!

# xpeccy
zx.spectrum
Andrew Lobanov(tavern,1) — All
2021-12-13 10:05:22


Очень полюбился мне этот эмулятор в последний год, но наткнулся на интересную особенность: если в настройках Qt выставить scale rate отличный от единицы, то он влияет и на эмулируемую картинку. Привет, пиксели разного размера и соотношения сторон!

Есть возможность поправить этот момент средствами настройки Qt или стоит связаться с разработчиком и задать этот вопрос ему лично? :)

# Эха про спектрум
zx.spectrum
Andrew Lobanov(tavern,1) — All
2021-12-13 08:27:11


Обсуждаем speccy и совместымые компьютеры, софт, эмуляторы, мероприятия и всё-всё-всё.

# Актуальный нодлист
idec.talks
Andrew Lobanov(tavern,1) — All
2021-12-13 10:03:22


Начинает чувствоваться потребность в сабже.

Просьба скинуть или сюда или на spline1986@yandex.ru информацию о своих узлах сети в следующем формате:

{
    "nodename": "tavern",
	"client": "http://idec.spline-online.ml/",
	"web": "http://idec.spline-online.ml/",
	"sysop": "Andrew Lobanov",
	"contacts": {
		"email": "spline1986@yandex.ru",
		"phone": "+7xxxxxxxxxx",
		"web": "https://github.com/spline1986/"
	},
	"description": "Уголок уютного общения",
	"uplinks": [
		[
			"instead-club",
			"5m"
		],
		[
			"mira station",
			"5m"
		],
		[
			"tgi",
			"5m"
		]
	]
}

Большая просьба написать именно в таком формате, а не "у меня ничего не изменилось".

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

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

# Доступ к idec-net на github
idec.talks
Andrew Lobanov(tavern,1) — All
2021-12-13 10:03:21


Что-то у меня сабж сломался. Кто-то может дать доступ пользователю spline1986? Либо актуализируйте информацию по instead club. Там до сих пор старый адрес.

# Новая эха
idec.talks
Andrew Lobanov(tavern,1) — All
2021-12-13 10:03:21


Сабж! Эха zx.spectrum посвящённая одноимённому компьютеру, совместимым с ним машинам, программному обеспечению и эмуляторам, создана в таверне. Просьба прокинуть к себе, так как есть шанс завлечь часть синклеристского сообщества :)

# Спринтер
idec.talks
Andrew Lobanov(tavern,1) — All
2021-12-09 05:17:37


В 90-х был разработан довольно интересный спектрум-совместимый компьютер сабж. Сообщество его живо до сих пор и даже что-то разрабатывают в аппаратной части. Это, конечно, интересно, но не эхотажно.

А вот что эхотажно, так это то, что вчера мне в личку написал разработчик SprinterNet (сервис такого специального прокси между спринтером и интернетом, грубо говоря) имеет рабочий стек http (не факт, что в полном объёме, но это и не столь важно) и желание создать idec-клиент (а может и сервер в перспективе) для спринтера.

Это примерно то, о чём писал Рома ещё 7 лет назад %) Технология для небольших сообществ.

# Си должен умереть?
std.hugeping
hugeping(ping,1) — All
2021-11-09 17:14:26


Интересное совпадение. На днях из двух независимых источников вышел на статьи, описывающие проблемы Си.

https://www.yodaiken.com/2018/12/31/undefined-behavior-and-the-purpose-of-c/

http://cmustdie.com/

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

Да, неопределённое поведение -- это угроза. И угроза вдвойне, когда по мере развития компиляторов, это поведение воспринимается как территория, на которой можно "срезать углы". При этом мы получаем мину замедленного действия. Старый софт, собранный новым компилятором может "бахнуть" когда и где угодно... Так что с точки зрения индустрии, нужен простой (не надо много платить за кадры), дубовый и предсказуемый язык. Правда, при этом, он должен быть ещё и системным. Совместить эти противоречивые требования нелегко...

Как программист на Си, я понимаю, что по современным меркам этот язык нарушает все мыслимые правила приличия. Но при этом я действительно НЕ ВИЖУ адекватной замены в той сфере где он применяется. Это как с самолётами. Неустойчивый самолёт -- маневренный и опасный. Устойчивый -- безопасный и неманевренный. Что выбрать? Что-то среднее? Чем мы готовы пожертвовать?

Представим себе, что нам нужно написать ядро ОС. Какой язык выбрать? C, C++... Rust?

Мои знания о Rust ограничены чтением книги, поэтому я недостаточно подкован для того, чтобы адекватно оценить его кандидатуру как замену Си. Субъективно, мне кажется, что Rust не сможет стать таким же массовым языком. В нём нет простоты Си. Его синтаксис многословен, а в некоторых задачах он выкручивает программисту руки. Я надеюсь, что идеи заложенные в Rust найдут реализацию в каком-то другом ЯП. Но это моё личное, субъективное мнение. Конечно, если индустрия перейдёт на Rust, я буду его использовать в любом случае. А пока, можно посмотреть на пример реализации драйвера на Си и Rust: https://lwn.net/Articles/863459/ который меня совсем не впечатляет.

Си был моим любимым языком с самого начала профессиональной деятельности. Но с годами я стал замечать, что программирование на Си всё чаще воспринимается как рутина. Я перестал чувствовать удовольствие от программирования и изучения чужого кода. Работал скорее как "ремесленник". К счастью, были и другие ЯП, которые мне было интересно изучить, так что выгорания я избежал.

Но не так давно я открыл для себя Си заново. Помогло мне в этом осознание:

> Код на Си прекрасен, когда он прост!

Но что значит простой код? Программисты всегда пытаются писать просто. Или нет? И можно ли писать современное ПО просто?

Посмотрите. Это реализация cat в Plan9: https://github.com/0intro/plan9/blob/master/sys/src/cmd/cat.c

А это, для сравнения, cat из coreutils: https://github.com/coreutils/coreutils/blob/master/src/cat.c

Я отдаю себе отчёт в том, что современное ПО так не пишется. Поддержка локалей и gettext. Учёт особенностей системных вызовов на разных ОС. Поддержка множества параметров. И вот, объём и сложность кода растут как снежный ком. А если вспомнить про полную поддержку Unicode (со всеми этими проклятыми эмодзи и сменой направления вывода), то становится совсем уж плохо. Мы так привыкли к универсальности "правильного" подхода, что когда ты видишь "наивный" код Plan9, то испытываешь шок. Что, так можно было?

Но если по чесноку, разве cat не должен быть именно таким, каким он остался в Plan9? :) Думаю, каждый программист чувствует здесь какую-то правду.

Си -- это портативный ассемблер. В этом его основная миссия, сила и слабость. И сегодня, когда разрыв между низким и высоким уровнем многократно увеличился, я не могу не признать, что он мало пригоден для написания сложного прикладного ПО. Но что с системным?

Системное ПО тоже стало сложнее. Как системный программист, я начинал с ядра Linux 2.2. Читать и понимать код современного ядра стало намного сложнее.

В качестве примера, посмотрите реализацию системного вызова open в ядре 2.2.
https://elixir.bootlin.com/linux/2.2.26/source/fs/open.c#L757
asmlinkage int sys_open(const char * filename, int flags, int mode)
{
	char * tmp;
	int fd, error;

	tmp = getname(filename);
	fd = PTR_ERR(tmp);
	if (!IS_ERR(tmp)) {
		lock_kernel();
		fd = get_unused_fd();
		if (fd >= 0) {
			struct file * f = filp_open(tmp, flags, mode);
			error = PTR_ERR(f);
			if (IS_ERR(f))
				goto out_error;
			fd_install(fd, f);
		}
out:
		unlock_kernel();
		putname(tmp);
	}
	return fd;

out_error:
	put_unused_fd(fd);
	fd = error;
	goto out;
}
Довольно наглядно и просто, не правда ли?

А теперь начните своё путешествие по ядру 5.10.

https://elixir.bootlin.com/linux/v5.10.78/source/fs/open.c#L1200

Вам придётся пройтись по цепочке: do_sys_open -> do_sys_openat2

https://elixir.bootlin.com/linux/v5.10.78/source/fs/open.c#L1193
https://elixir.bootlin.com/linux/v5.10.78/source/fs/open.c#L1164

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{
	if (force_o_largefile())
		flags |= O_LARGEFILE;
	return do_sys_open(AT_FDCWD, filename, flags, mode);
}

long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
	struct open_how how = build_open_how(flags, mode);
	return do_sys_openat2(dfd, filename, &how);
}

static long do_sys_openat2(int dfd, const char __user *filename,
			   struct open_how *how)
{
	struct open_flags op;
	int fd = build_open_flags(how, &op);
	struct filename *tmp;

	if (fd)
		return fd;

	tmp = getname(filename);
	if (IS_ERR(tmp))
		return PTR_ERR(tmp);

	fd = get_unused_fd_flags(how->flags);
	if (fd >= 0) {
		struct file *f = do_filp_open(dfd, tmp, &op);
		if (IS_ERR(f)) {
			put_unused_fd(fd);
			fd = PTR_ERR(f);
		} else {
			fsnotify_open(f);
			fd_install(fd, f);
		}
	}
	putname(tmp);
	return fd;
}

Необходимость изменений очевидна. Появилась подсистема fsnotify. Добавили новые системные вызовы -- пришлось нарезать функции и сводить open к openat...

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

Да, работая на индустрию не удастся вернуться в прошлое. Однако, Plan9 научил меня тому, что во многих случаях у меня, как у программиста, всё-таки есть свобода избежать сложного кода, в том числе ценой выбора более подходящей архитектуры. Например, написав небольшое ядро приложения на Си и функциональную часть на Lua. Если я вижу, что код на Си становится сложным, это повод остановиться. Стоп! Что-то не так!

Что касается судьбы Си... Я тоже хотел бы увидеть современного приемника, но в Rust я не смог его узнать. Возможно, это моя ошибка. Поживём -- увидим.

Интересно, сколько лет ещё продержится старичок Си? А то ведь и 70-летие не за горами. :)

P.S. Ещё одна "эмоциональная" статья на тему C и C++: Почему я всё ещё люблю C, но при этом терпеть не могу C++?

https://habr.com/ru/company/ruvds/blog/562530/

# Притча о неверном, но мудром управляющем
std.hugeping
hugeping(ping,1) — All
2021-11-09 10:57:46


В Евангелии от Луки есть притча, которую я я никогда не понимал.

Лк16:1-9

> Сказал же и к ученикам Своим: один человек был богат и имел управителя, на которого донесено было ему, что расточает имение его;
> и, призвав его, сказал ему: что это я слышу о тебе? дай отчет в управлении твоем, ибо ты не можешь более управлять.
> Тогда управитель сказал сам в себе: что мне делать? господин мой отнимает у меня управление домом; копать не могу, просить стыжусь;
> знаю, что сделать, чтобы приняли меня в домы свои, когда отставлен буду от управления домом.
> И, призвав должников господина своего, каждого порознь, сказал первому: сколько ты должен господину моему?
> Он сказал: сто мер масла. И сказал ему: возьми твою расписку и садись скорее, напиши: пятьдесят.
> Потом другому сказал: а ты сколько должен? Он отвечал: сто мер пшеницы. И сказал ему: возьми твою расписку и напиши: восемьдесят.
> И похвалил господин управителя неверного, что догадливо поступил; ибо сыны века сего догадливее сынов света в своем роде.
> И Я говорю вам: приобретайте себе друзей богатством неправедным, чтобы они, когда обнищаете, приняли вас в вечные обители.

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

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

Пропустив своё наблюдение через "рассудочный" аппарат, я понял, что даже не могу сформулировать "объяснение" словами. Получалось что-то неуклюжее вроде: "Да, я осознаю свою повреждённость. Я часто поступаю недостойно замыслу Бога. Тогда я хотя бы попытаюсь не требовать 'своего' с других людей. Попробую поступать по милости, а не по формальной справедливости. Даже если со мной поступили несправедливо. Разве я часто не поступаю хуже? Я хотя бы могу не затаить обиду, не 'встать в позу'. Не сказать ещё одно язвительное слово... Это малость, но я чувствую в этом правду. Как я смею уповать на милость Бога, если даже такой малости не делаю?".

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

# Бегство от тишины
std.hugeping
hugeping(ping,1) — All
2021-11-09 08:35:36


Смотрю интервью с Андреем Столяровым: https://www.youtube.com/watch?v=o111yYPqLHU

Увлекательно слушается.

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

Например, возьмём телеграм. Плохо, что это проприетарное решение. Плохо, что оно привязано к телефону и так далее. Но реальный ущерб, который я ощущаю на себе, носит скорее психологический характер. Это зависимость. Зависимость от получения потока информации в режиме 24/7 (зачастую, бесполезной и низкокачественной), от поиска социального одобрения, от эндорфинов полученных в битвах "кто-то не прав"...

Допустим, мы сделали федеративный Telegram и (невероятно!) он стал популярным. Пусть он будет работать на телефоне со свободной прошивкой. Что-то изменится в плане воздействия на психику? Безусловно, централизованный сервис -- хуже. Особенно, если говорить о соцсетях, где выдача определяется алгоритмом таким образом, чтобы повысить время удержания. Но кроме силы формируемой зависимости, будет ли какая-то принципиальная разница? Не думаю.

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

К сожалению, мы уже подсели на иглу мусорного общения, и нужно прикладывать очень много сил, чтобы плыть против течения. Конечно, если вы всё ещё чувствуете, что "что-то не так".

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

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

К сожалению, рабочий день начинается, и я беру телефон с непрочитанными сообщениями. Сколько их...

Я снова бегу от тишины...