init commit

This commit is contained in:
localhost_frssoft 2023-08-08 14:15:17 +03:00
commit 8a766816dd
19 changed files with 12253 additions and 0 deletions

21
EN-custom/README.md Normal file
View File

@ -0,0 +1,21 @@
Hello there. I just stranger from the Internet.
I just user of compilators and interpreters, not programmer :3
## Fediverse
My nick is frssoft
My primary alias for nick: localhost
Other aliases: Локал, Локалка, Локалхост, Локахост, ФырФырСофт, Фырфыр
Fediverse life: 02.11.2021 - now
Primary account: [@frssoft@udongein.xyz](https://udongein.xyz/users/frssoft)
[alts in the Fediverse](../any/fedi_alts.gmi)
## Shitcode and other
https://git.phreedom.club/localhost_frssoft Phreedom Forgejo (main)
mirros:
https://inex.dev/localhost_frssoft Inex Gitea
https://code.criminallycute.fi/localhost_frssoft Criminally Cute Gitea
https://git.macaw.me/localhost_frssoft Macaw Gitea
https://git.vector1.dev/localhost_frssoft Vector1dev Forgejo

24
README.md Normal file
View File

@ -0,0 +1,24 @@
Warning: migrate from gemtext to markdown (can contain errors and mistakes)
Select language:
[EN (custom)](EN-custom)
[RU](RU)
Cutie list (aka webring, aka web wibes):
[Inex Code](https://inex.rocks/)
[Avi Kafazen](https://cryptoschizo.club/)
[Dr. Quadragon ❌](https://mastodon.ml/@drq)
[Mo R. (beautiful gemini capsule)](gemini://mo.rijndael.cc/)
[Mo Rijndael](https://mo.rijndael.cc/)
[⭐️Сара Кварц🍋](https://sarahquartz.leemoon.network/)
[Siina](https://criminallycute.fi/)
[Анна](https://sysrq.in/ru/)
[Блю](https://macaw.me/)
[Айсылу](https://foxhaven.cyou)
...and some [thanks](any/thanks.md)
___
[Site txt icon](icon.txt)

32
RU/README.md Normal file
View File

@ -0,0 +1,32 @@
Добро пожаловать Вас приветствует localhost :)
Простой не программист, а пользователь интерпретаторов
[Длинные заметки](articles)
## Fediverse
Обитаю в основном под ником frssoft, который можно сказать набран рандомно на клавиатуре. Однако псевдоним localhost к нику был придуман только для того, чтобы людям было легче прочитывать вслух. (отсылка к старым стримам Лиэс...)
В Федивёрсе уже чуть больше года, если взять в качестве отсчета мой старый аккаунт мастодона на fosstodon.org, а если быть точнее пришёл 2021-11-02. Годовщины принципиально не праздную, потому что столько всего происходит за год, что мне трудно подводить итоги, но одно скажу точно, что Федивёрс всё еще пока прекрасен.
Основной аккаунт: [@frssoft@udongein.xyz](https://udongein.xyz/users/frssoft)
[Альты(?) в Федивёрсе](../any/fedi_alts.md)
Псевдонимы к нику: Локалхост, Локал, Локалка, Локахост, ФырФырСофт, Фырфыр
```
This capsule is a part of the fediring
=> gemini://fediring.net/previous/@frssoft@udongein.xyz Previous
=> gemini://fediring.net/next/@frssoft@udongein.xyz Next
=> gemini://fediring.net/random Random
=> gemini://fediring.net/ Learn more
```
## Всякий разный говнокод и прочее
https://git.phreedom.club/localhost_frssoft Phreedom Forgejo (main)
зеркала (разной степени прозеркаленности):
https://inex.dev/localhost_frssoft Inex Gitea
https://code.criminallycute.fi/localhost_frssoft Criminally Cute Gitea
https://git.macaw.me/localhost_frssoft Macaw Gitea
https://git.vector1.dev/localhost_frssoft Vector1dev Forgejo
[Список просмотренных фильмов FMN (Fediverse Movie Night)](https://pub.phreedom.club/~localhost/fmn_watched.gmi)
[Проекты на будущее (наверное)](projects_for_the_future_maybe.md)
[Разные ASCII каракули](../any/ascii.md)

View File

@ -0,0 +1,21 @@
# Форматы файлов и сжатие
Ахтунг! Это тестовая статья, я не несу ответственности за прочтение этой статьи
Не так давно пришёл к тому, что люди далеко не всегда эффективно используют пространство на диске, скорее всего из-за лишней мороки с конвертированием файлов в более экономичные форматы с минимальными потерями качества.
Ну, вот к примеру, возьмем какую-нибудь коллекцию mp3 320kbps, условно весит 1 гб, но ведь довольно давно существует открытый формат ogg/vorbis, он жмёт лучше и при этом качество бывает выше, чем у mp3. По умолчанию ffmpeg конвертирует в ogg с битрейтом 128, но если у вас оборудование не hi-res, то разницу услышать будет весьма проблематично, а вот вес коллекции может поубавиться аж в 1.5-2 раза!
Конечно могут проявится ньюансы, в виде того, что ogg может просто напросто не поддерживаться вашим физическим mp3-плеером, но это скорее исключение чем правило. (Чаще всего это происходит если оборудование было создано до появления того или иного формата)
Для фоток аналогично, webp, хотя и название прямо намекает, что этот формат для веба, но если у Вас места на диске не особо много, то сие очень спасает.
Для видео не всё так одназначно, с одной стороны есть webm и ogv, но скорость перекодирования столь медленная, что одно видео длящееся 1 час можно перекодировать 2-3 часа подряд, и насколько я знаю, они не поддерживают аппаратное ускорение видеокарты, потому процессор вскипит.
А вот тексты, неплохо было бы сжимать и доставать необходимый из архива (да, ведь необязательно распаковывать весь архив, чтобы читать один из файлов). Причём, тексты именно чистые text/plain данные, потому что офисные форматы чаще всего уже сами себя архивируют внутрь, а жать архив в архиве бесполезно.
Хотя, я не исключаю то, что навело мысль о написании этой недостатьи наличие у самого малого пространства на диске, но это если сравнивать относительно террабайтников, я то живу на 128 гб, и где-то занимаю половину из этого.
### Replies
=> gemini://pub.phreedom.club/~kornilovnet/reply.gmi > 2023-03-25 14:15 MSK
=> .. Back

View File

@ -0,0 +1,51 @@
# "Замеры" жизни под 64 kbit/s интернетом основанные на личном опыте
Поправка: Скорость не постоянная. В среднем 5-6 Кбайт/с на самом деле.
Поправка 2: Отдача 32 kbit
В общем, шёл 14 день, как я выживаю на медленном интернете, в виду финансовых проблем (и не только). Такой интернет примерно симулирует олдовый средний интернет через dial-up модем.
=> gemini://gemi.dev/cgi-bin/wp.cgi/view/ru?Коммутируемый+доступ Немного о скоростях dial-up на Gemipedia
В целом, 64kbps в современном вебе просто уже с трудом справляется, вероятность что, что-то отвалится по таймауту довольно высока, особенно при активной параллельной загрузке, пожалуй просто приведу список, как ведет себя что-либо при такой скорости (возможно будет пополняться).
___
Обычные сайты "большого" веба - весьма всё плохо, если зайти на сайт с отключенными картинками, можно успеть выпить чашку чая пока он загружается... Если отключить вообще всё, кроме стилей, то уже намного лучше, но потребуется от 10 секунд. С сжимающими прокси загружаются гораздо лучше, у многих сайтов не минифицирован JS и CSS, так же редка поддержка сжатия brotli на серверах, да и на клиентских браузерах не всегда присутствует\запрашивается.
Сайты смолвеба (HTML) - открываются довольно шустро, даже в links они открываются быстрее (а, он умеет прямо на лету отображать загружаемый html).
RSS (XML) - same смолвеб, исключая длинные фиды
gemini/gopher/finger - открываются почти нативно без ожидания, ну оно и понятно, голый текст в основном, но думаю с сжатием они бы открывались вообще на скорости ракеты! Правда вот gemini из-за шифрования TLS открывается несколько дольше, но это в целом про любой обмен данными, где нужно дополнительно сделать секьюрити рупожатие и обменяться ключами.
I2P - Для работы необходимо поставить в конфигах самый минимальный bandwidth 32 kbps, иначе он съедаёт всю скорость канала и сам же отваливается. Первичная инициализация может быть _значительно_ дольше. Когда роутеров достаточно и i2pd уже проинициализован, не все ноды открываются сразу, нужно "пнуть" соединение с i2p сайтом несколько раз, предварительно подождав минуту-две. В целом, сайты могут открываться, но я очень рекомендую отключить вообще все плюшки и делать это через консольные браузеры. Стриминг (i2p радио) на такой скорости просто отваливается по таймауту или EOF. Проблема в основном с коннектом к outbound tunnels, многие из них failed. Так же, пользоваться клирнетом, пока I2P включен не выйдёт - будет отвал по таймауту.
Yggdrasil v4 - очень нестабильно, но относительно (значительно быстрее I2P) быстро работает. Довольно легко теряются соединения с пирами.
ssh -C - работает, иначе как бы я юзал пабникс? :) Но, есть парочка нюансов, если вдруг из output полезет гора текста в терминал, то можно довольно долго наблюдать, пока он его весь выведет. Ввод очень сильно лагает (сказывается скорость 32 кбита на аплинк), особенно если параллельно программа выводит какие-то изменяющиеся данные, буквально ~1 секунда на символ.
git clone; git push - работает вполне сносно, разве что git clone на больших репозиториях стоит выполнять с --depth 1. А коммиты посылать мелкими порциями, а не одним огромным, хотя git всё равно пакует в один архив при отправке\получении.
Pleroma/Mastodon и другие JSON API\ActivityPub (Get) - работает вполне неплохо (+ сжатие), но response довольно долгий, а вот их оригинальные вебни в основном не предусматривают использование такого медленного коннекта, но думаю, если сравнивать с тем, что есть у централизованных сервисов, эти вебни будут меньше
Matrix - работает, но сообщения долго отправляются иногда, так же вероятность словить "Матрикс момент" (с), связанный с тем, что сообщение пришло, а ключей к нему нет для расшифровки повышается в разы
Jabber/IRC/netcat chat/others text messengers - работают нативно, как раз были созданы в условиях низкоскоростных передач :)
Jitsi Meet - присоединяется к конференции (если это приложение, в случае вебни придётся ждать вечность), но не юзабельно: от собеседников слышно примерно часть от одного слова, а на отправку примерно так же. (Естественно, audio-only)
Mumble - Работает на самом низком пресете качества. Присоединяется к комнате, собеседников слышно через слово, возможно если попросить их убавить у себя качество, то будет нормально. Переодически возможны переподключения. Чат стабилен.
HedgeDoc - После ожидания минут 4-5 страница с колабаративным документом таки загрузится, в принципе работает, но довольно сильно пролагивает, быстро редактировать документ не получится вместе.
OpenStreetMap - Медленно, но работает, на такой случай лучше использовать оффлайн карты
Любая не сжатая медиа - долго, можно сразу поставить на загрузку и пережидать прогон мегабайтов по кбитному каналу в IRL (попить чай не спеша например)
Аудио пожатое (mono) - 8kbps, 16, 32 => fine, pretty good; 64 => работает, но с всё таки прерываясь на пределе в буферизацию
Видео пожатое - HEVC 128x96 с битрейтом в 64, 12 кадров в секунду, работает, но смотрибельность оставляет желать лучшего, если вы любитель высококачественного и владелец мониторов высокого разрешения.
У обоих пунктов выше, желательно при реалтаймовой передаче использовать mpegts с модифицированным размером пакета, например -ts_packetsize 1024, но я пока не уверен помогает ли это. Вот, для примера можете посмотреть скрипты [CGI], для перекодирования с помощью ffmpeg
=> https://gitea.phreedom.club/localhost_frssoft/transcoders_cgi.git [CGI]
___
=> .. back

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,21 @@
# tut vs bloat-fe
Дошли руки написать, ну что-то типа краткого сравнения фронтенда bloat и клиента tut. Оба достаточно минималистичны, bloat работает в любом браузере (что несколько жирновато, если это современный браузер), tut консольный. Оба юзают mastodon-like API. На данный момент пользуюсь чаще tut, вот он кстати
=> https://github.com/RasmusLindroth/tut
=> https://gh.phreedom.club/RasmusLindroth/tut
В нём есть всё необходимое, в том числе поддерживается реал-таймовое обновление лент, цветовые темы, умеет создавать опросы, добавлять описания к картинкам и проставлять локаль поста. Одного там только не хватает - поиска по постам, ну и иногда его сегфолтит, но редко. Попытка как-то приляпать в код поиск по постам не увенчалась успехом, код там несколько замудренней (ну или у меня лапы просто) чем у bloat'a. Картинки и аватарки заранее не подгружает, что очень хорошо, если трафик сильно лимитирован или скорость 64 кбит/с :)
Bloat тоже неплох, но например если нужно открыть несколько аккаунтов, то есть пару костылей - юзать профили\контейнеры браузера или поднимать по инстанции bloat на разные порты. Ещё, он не умеет прикреплять описание к картинкам и не имеет возможности получать ленты в реальном времени, скорее всего для реализации этих плюшек придётся таки обмазаться JavaScript'ом или делать костыль в виде "недозагруженной" страницы. Собственно, вот апстримная версия bloat
=> https://git.freesoftwareextremist.com/bloat
А вот мой форк, на ветке localhost-custom, там немного фич добавлено, в основном для плеромы (эмодзи-реакции), поиск по тегам, кастомная видимость репоста, а ещё добавил страницу для регистрации прямо из фронтенда (но, скорее всего оно не работает). Ну и по мелочи там всякий хлам. В целях безопасности рекомендую использовать только как локальный, а не публичный (расшаренный в WWW). Изредка синхронизирую изменения с апстримом, вручную исправляя конфликты слияний. К слову говоря, ранее параметры пользователя хранились на стороне самого bloat'а на диске, а сейчас не так давно автор отрефакторил код и теперь всё в куках.
=> https://git.phreedom.club/localhost_frssoft/bloat
Note: Сравнение клиента нативного с сетевым может выглядить несколько некорректно, пардон.
=> .. back

View File

@ -0,0 +1,23 @@
# Сравнение протоколов в виде таблицы (условное ИМО)
```
1 - Есть много клиентов под протокол, или может быть открыт встроенными средствами системы (+)
2 - Легкое дружелюбное текстовое форматирование (+)
3 - Позволяет добавлять много заголовков (privacy -)
4 - Легко проксируется в оверлейные сети (+)
5 - Является спрятанным сокровищем на видном месте (+)
6 - Имеет большое комьюнити (+/-)
7 - Может быть использован для загрузки трекинга, рекламы и прочего блоата (-)
_________________________________________
||| Gemini | Gopher | Spartan | HTTP |
|1| да | да | ~ | да |
|2| да | 50/50 | да | нет |
|3| нет | нет | нет | да |
|4| 50/50 | да | да | да |
|5| да | да | ~ | нет |
|6| да | да | нет | all web |
|7| нет | нет | нет | да |
'''''''''''''''''''''''''''''''''''''''''
```

View File

@ -0,0 +1,87 @@
# Инициатива по федерации через i2p-only (deprecated; недоделано)
```
---------------------------------------------------------------+
|
x000O. |
x0000000O. |
'000000000o |
':;O00000000' |
,oooood,cO0000d;0x +------------------
'cooooo, .:co;dxk'oKKKO I2P
.,,,,,' clooool. .:::. :oo; l0KK0.
',,,,,,,;'lo. .:::. .ool lKKKO. +------------------
,,,,,,,,,.:xxxo:. .:::. loo. cKKK0. |
',,,,,,,,.xkkkkkkkl,:::.oxxo;. .. ;KKKl'ddo, |
',,,,..:l. ,:::.dkkkkkkkkkxkkkkkko;,oOkkkOOOd |
,,,..::::. '::: ...;ldxkkkkx;kkOOOOOOkc |
.;;' .::::..::; :od; c;kkOOOOOOk, |
.;;, ;;;;.. 'ooc .cooooo,dOOOOOk. |
,;;. ;::;. .ooo'ooool. .odd, |
';;. ,:;.;:::. .l'coo,:. .loo, |
.;;, ;::, ;::;..ooooo:'ooc .ooo' |
;;;. ,::, .:cloool. .loo. .ooo' |
','.,;:' .llooooc.'c, coo' .ooo. |
.,,,,,;.;loooo; ,:::, 'ooc 'ooo. |
.''''''''':; ,:::;.olc;ooo. |
''''''''''.:;;;;'.. ,:.;lllll, |
.'''''''' ..,,,,,,,,,,,;;,.lllllllll |
.''. ..'',lllllllll. |
clllllll: |
:lll; |
---------------------------------------------------------------+
```
## Замер плюсов и минусов
Плюсы:
* полная анонимность федерации (без разницы где оно будет находится)
* не нужен https (шифрование на транспортном уровне уже есть)
* независимость от DNS (по возможности без красивых доменов, чтобы не наводить сложности server side, base32 домены)
* каждый сможет поднять инстанс даже на своей домашней машине не имея статического IP и домена в клирнете
* более гиковское сообщество без возможности резкого наплыва
* участие в сети I2P и соответственно её ускорение и повышение устойчивости со связностью
* пока Fediblock не существует в I2P глобально
Минусы:
* мало кто станет использовать хэндлы вида @user@aaaaaaaaaaaкакмногабукавбубубуlksamdlfmfkjiewjflksxmd.b32.i2p (может стать причиной спама длинными упоминаниями)
* федерироваться нужно только внутри i2p, чтобы не наводить сложности смешивая с клирнетом
* федерация не будет работать пока i2p-роутер не пробудет в сети достаточно долго, чтобы собрать рисунок сети больших масштабов
* Довольно большое потребление оперативной памяти (в будущем), что не подойдёт для хостинга на одноплатнике
* скорее всего это не будет работать с многим уже существующим ПО Федивёрса, могут вылезти странные баги
* большие медиа аттачи не рекомендуются (опционально, кто-то ведь даже видео гоняет по i2p)
* неизвестные последствия при росте такой федерации
* очень шумная и трафико-нагрузочная сеть, при отдаче полной скорости канала в i2p
* I2P сообщество уже и так общается через ирку например и форумы, вряд ли им понравится AP реализация over i2p добавляющая только головную боль. Чем проще - тем лучше
* богатые возможности для троллинга и спама - нет сдерживающих факторов как оформление домена, покупка сервера и прочие этапы добавляющие финансовые сложности
Минусов довольно много, скорее всего инициатива будет мало полезна. Не рекомендуется к применению, проще всего реализовать в рамках yggdrasil туннеля (практически как в обычном клирнете).
## Техническая составляющая (относительно простыми словами)
### base32 или ааааааааапроститео_будут_такие_адреса_вместоормальныхоменовsaldm.b32.i2p или DNS как заноза в одном месте
Так как будем опираться на base32 (ну или если точнее хэши от них) домены, то наличие конкретного адреса в адресной книжке не обязательно, однако можно в принципе сделать какой-то "центр" регистрации доменов для Феди I2P по аналогии с reg.i2p и им подобным, но это уже выходит какой-то DNS. Это если ещё не учесть конфликты, если кто-то решит вести несколько таких "центров" выдачи, будем иметь разные книги на разных хостах - всё поломается скорее всего.
В base32 доменах есть преимущество, если сервер A реквестирует какой-то домен такого вида, то он будет его тут же запрашивать у i2pd роутера, а тот будет опрашивать других, так скажем естественный процесс без вмешательств обёрток красивых DNS и адресных книг (аналог hosts), представьте федерацию на уровне IP адресов, тут примерно так же, но здесь будут использоваться эти псевдо-домены. Да, конечно некрасиво и не удобно, иметь хэндлы с овер большим доменом, но зато меньше думать о проблеме вида "вот у меня этот домен резолвится и всё работает", а у другого "у меня ничего не работает, this address not found in address book".
У федеративных сетей и так есть проблемы и в обычном Интернете без оверлеев, что уж говорить, о попытке завернуть их в оверлей.
В прочем, с base32 доменами могут возникнуть проблемы, когда I2P-роутер только-только появился в сети, он ещё "не разжился" известными роутерами другими, а значит его нужно держать в онлайне какое-то время, чтобы успешно подключаться к другим инстансам. Ну, день например вы просто включаете его и бродите по разным сайтами (чтобы увеличить эффективность), ну и должен быть стабильный коннект, а со статическим IP без NAT (например на VPS) вы сможете расширить рисунок сети I2P-роутера буквально за часов 10 при скорости в 256 KBps с включенным транзитом. А потом можете уже поднимать инстанс. Как альтернативу ожиданию, можно ещё обмениваться папками NetDb друг с другом, но это не очень безопасно, лучше дать роутеру найти свежие самому.
### Привязки ключей от инстанса к псевдо-домену
Тут не должно возникнуть сложностей, по крайней мере, до тех пор, пока не потеряете ключ от туннеля, иначе вам придётся пересоздать и туннель и инстанс, начав с нового листа (аналогично ситуации с обычным Интернетом, когда нужно переехать с домена на домен)
### Совместимость ПО
При желании можно прокинуть любой федеративный движок в i2p, но как минимум движок не должен требовать https шифрования, а значит придётся менять код. Клиенты должны поддерживать http прокси, иначе - строить клиентские туннели до инстанса. В Pleroma есть поддержка I2P (не нативно, а через fedproxy) и даже есть инструкция по поднятию (не без нюансов конечно)
=> https://docs-develop.pleroma.social/backend/configuration/i2p/ I2P Federation and Accessability
=> ../misc/external_articles/pleroma_I2P_Federation_and_Accessability.gmi (gemini copy)
При необходимости, можно заставить парсить заголовок "X-I2P-DestB32", для корректного определения входящих запросов на федерацию
### Что сейчас есть
В I2P я ещё не встречал инстансы, которые именно работают по i2p, в большинстве случаев это просто прокси веб-интерфейса из клирнета в i2p, вот некоторые из них:
=> http://fedi.vern.i2p Mastodon Vern
=> http://mastodon.chudo.i2p/ Mastodon Chudo
=> http://bloat.clubcyberia.i2p Bloat-FE (не инстанс)
=> http://diasporg.i2p/ Diaspora* (федерируется только с собой)
Это неплохо, но годится разве что, для того чтобы обойти блокировки, ну или анонимно полистать ленту (хотя, я не уверен, что с включенным JS это хорошая идея, но API должно работать). Так же такой вариант не позволяет общаться с инстансами, которые расположены внутри i2p (если когда-нибудь вообще будут)
UPD: 21-04-2023 23:53 UTC+0

6
RU/articles/README.md Normal file
View File

@ -0,0 +1,6 @@
[Инициатива по федерации через i2p-only (deprecated; Недоделано)](2023-04-05_i2p_federation_initiative.gmi)
[Сравнение протоколов в виде таблицы (условное ИМО)](2023-04-03_proto_diff.gmi)
[tut vs bloat-fe](2023-03-18_tut_vs_bloatfe.gmi)
[(Не совсем статья) Сборник всяких-разных ссылок найденный на https://based.coom.tech/](2023-01-19_clearnet_url_pack_share.gmi)
[Замеры жизни под 64 kbit/s интернетом основанные на личном опыте](2023-01-14_64kbps.gmi)
[Форматы файлов и сжатие (пробная статья)](2022-03-08_data-files-formats.gmi)

View File

@ -0,0 +1,16 @@
# Проекты на будущее (наверное)
(ну или вдруг кто-то опередит в реализации, скажите где-нибудь. Но, вероятно это будет просто дальний ящик для "проектов")
## Вакансии на карте OSM (OpenStreetMap)
Суть: Вывод всех доступных вакансий в виде точек на карте слоем поверх основной карты OSM. Сами точки должны содержать хотя бы минимальный набор контактных данных и название компании/ИП, остальное опционально, но чем подробнее тем лучше.
Дополнения: Возможность добавлять\удалять (по причине неактуальности) вакансии любому желающему, при этом защитить от массовых изменений.
Что нужно: какой-то базовый набор данных с вакансиями всех регионов, содержащий координаты вакансий; скорее всего выделенный сервер; придумать как сделать это максимально тривиально, при этом не прибегая к всяким жирным фреймворкам.
Для чего: Находить вакансии по своему региону/городу/району, не прибегая к помощи больших корпораций, так как у многих сайтов по поиску вакансий если и есть карта, то она обязательно 99% яндексовская -_-, помимо всего прочего аналитического говна и жирных js requests.
## Нейрозаменитель человека
Суть: Создать какую-то супер продвинутую нейросеть на основе своих же данных, характера, эмоций, привычек, стилей и так далее, по сути цифровая копия себя в виде нейросети. Сделать независимым от хоста, в случае чего будет "кочевать" по принципу ботнета.
Для чего: Заменить себя и прибывать в вечной сетевой жизни. Но, вообще это не проект вовсе, а скорее на "помечтать", однако возможно когда-то это станет реальностью, если доживём конечно.

150
any/ascii.md Normal file
View File

@ -0,0 +1,150 @@
# Просто разные ASCII каракули
Note: не стоит воспринимать всерьёз, это лишь каракули, смысл может быть искажен или понят неверно.
Все арты распространяются под "лицензией" CC0 frssoft
``` Мем с айсбергом и глубиной
_/-. [HTTP]
/ \
-'/ '-_
/ \
~~~~~/ \~~~~~~~~~~~
\````````````````/
'\ _--. / [Gemini]
\_ _/ \/
\_/
'''''''''''''''''''''''''''''''''
[Spartan (?)]
'''`'''`''''`'''`'`'''`''`''`''`'`
[Gopher]
'`````````````````````````````````
[IP]
[TCP]
[FTP]
[NCP]
[Telnet]
```
```
'
. | . ' ' . .
Spartan ___._______ . . ' "
||||||| \ /
|||/ / \Gemini/ ' , '
||| / ||TLS| . '
|||/ ||||||
||| Gopher |||||| . , . " '
|||||||||||||||||||||
||||||||||||||||||||| x . .
\TEXT|TEXT|TEXT|TEXT/
. ' x ' ' <>
, ' '
' " . '
```
```
______________________
|| $_ ||
|| ||
|| ||
|| ||
||__________________||
//. . . . . . . . . //
// . . . . . . . . //
//. . . . . . . . . //
//______[ . . ]_____//
```
```
Layer 1
__________________________________________________
| |
| |
| |
_________| |
/ ` ' _____ |
_______________ / ./\ / | CORPO |
| | | | | | | | / ` . / | |
||||||||||||||_______/. `()/ |________________________________________________|
| |Analytics|| . BIG DATA/ / ____ ____\
||||||||||||||___________/ / \``/ Super crawler; analyzer; data science; \``/ \
| | | | |SEO| | / aggregator data of all layers; scanner; \
\\\\\\\\/////// / big corpo ass and other eyes orgs; spy \
\|Trackers|--|/ / \
\| WWW/http |/ \~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/
\|AD|AD|AD|AD|/ ...........................................................
|BLOAT\\/////// ///////////////////////////////////////////////////////////
__________
Layer 2
_____ ____
/\ | | | |
/ \ | | | |
/____\ |____|-----|____|--+
| | / |
| [] |____/ -+- |
|____| _____ ____| |
\ | | |Local| |
\| | |crawl| |
|_____|-----|_____|---|
__________ |
Layer 3 |
/|\
.....
....................
.../\...../\....?...
...\/.,...\/........
.,..,.,........../\.
............... /?.\
... /\....?.....\../
.../..\..........\/.
...\./.......?......
________ || \ / |
Layer 4 || / \ |
/ | / \ |
""'',"" . "," ,`"`'`'`. " `.."'', ' ,```.` `" `."`..'"."` ``
''..,'.,'``. ,""" '" "``,'` '.'"'."..`". `""".." `.".'"``
" '", "..''`..'`"`,''''`.,..`'.. "'` `',"..'`,.', ,`""" `,, '.
``"" ' ". .'` ",,,',""",... ,`. "`" `,,`.'`.`,"""`,".`'.. ". ',
".""','.`"". ``', ". ., ,., ' ,"""" . '""..`,`. '.``'`.,.`,"`
,'`.' " ',.`' ",,,,,"`,.,".".`'. .".".' `'.. `,"..`"`''....,.'"",
..".``".'`" ,```'''",",`."..",.. `` `.".'"'`''. ` ""'"',.'`.`,"".'.
'.'` `,.,`'.. "'`,`,,',`"`'"'.` .",'. `" .".''" ''`.''.` ,.`',, ` ,
`'`.` ",, " .,`",,. "." .'" ','`','","`'".."""".',,.``. .,
.`` ,, `''"".,``",,`"""`.,'`."'.'"""..', ."` .` "`,`. "'"."'`"`
. `'.','". .',,`"','".," " , ',.,. ,.' `' ' .,",`,.,.`
',` ',`''.."',,`.`, .,` `"`.,".'.'',. "."`` " ,',..' ''`
,'`',`.''" ,',".""'".," , """'",`,',,'", ",`,,` ",,"' ,`",' ,.
,,"' ' .,` ``` ., '`` "` "'` ,",,"'` ",,`. ", ."`'
'`"..'"". ,, ." ""," ,".",`. `." '. ``.'.'".'.',' ,"'`.' ,' "'".
, " '`.` ,,". "`, `,'.`,'`.''.`.','","".``,. ,'. `,""`.,`.
` `,`"``'", `,', ."`.'".' `. `"`,.` ..,`"' ``` '' ,,.`',.,.
."`'`.'.`` ",."",' .""'", ..`,,` ."."` "","., ".`
,... '``",`,,`"`, ,," ' `".. "`
```

View File

@ -0,0 +1,5 @@
Копии некоторых страниц на всякий случай
Copies
[Using the I2P network with OpenBSD and NixOS](article-i2p-intro.md)
[I2P Federation and Accessability](pleroma_I2P_Federation_and_Accessability.md)
[Ledger (accounting tool) documentation](ledger3.md)

View File

@ -0,0 +1,194 @@
Source: gopher://dataswamp.org:70/1/~solene/article-i2p-intro
Title: Using the I2P network with OpenBSD and NixOS
Author: Solène
Date: 20 June 2021
Tags: i2p tor openbsd nixos networking
NIL# Introduction
In this text I will explain what is the I2P network and how to provide
a service over I2P on OpenBSD and how to use to connect to an I2P
service from NixOS.
# I2P
This acronym stands for Invisible Internet Project and is a network
over the network (Internet). It is quite an old project from 2003 and
is considered stable and reliable. The idea of I2P is to build a
network of relays (people running an i2p daemon) to make tunnels from a
client to a server, but a single TCP session (or UDP) between a client
and a server could use many tunnels of n hops across relays.
Basically, when you start your I2P service, the program will get some
information about the relays available and prepare many tunnels in
advance that will be used to reach a destination when you connect.
Some benefits from I2P network:
* your network is reliable because it doesn't take care of operator
peering
* your network is secure because packets are encrypted, and you can
even use usual encryption to reach your remote services (TLS, SSH)
* provides privacy because nobody can tell where you are connecting to
* can prevent against habits tracking (if you also relay data to
participate to i2p, bandwidth allocated is used at 100% all the time,
and any traffic you do over I2P can't be discriminated from standard
relay!)
* can only allow declared I2P nodes to access a server if you don't
want anyone to connect to a port you expose
It is possible to host a website on I2P (by exposing your web server
port), it is called an eepsite and can be accessed using the SOCKs
proxy provided by your I2P daemon. I never played with them though but
this is a thing and you may be interested into looking more in depth.
=> https://geti2p.net/en/ I2P project and I2P implementation (java) page
=> https://i2pd.website/ i2pd project (a recent C++ implementation that I use for this tutorial)
=> https://en.wikipedia.org/wiki/I2P Wikipedia page about I2P
# I2P vs Tor
Obviously, many people would question why not using Tor which seems
similar. While I2P can seem very close to Tor hidden services, the
implementation is really different. Tor is designed to reach the
outside while I2P is meant to build a reliable and anonymous network.
When started, Tor creates a path of relays named a Circuit that will
remain static for an approximate duration of 12 hours, everything you
do over Tor will pass through this circuit (usually 3 relays), on the
other hand I2P creates many tunnels all the time with a very low
lifespan. Small difference, I2P can relay UDP protocol while Tor only
supports TCP.
Tor is very widespread and using a tor hidden service for hosting a
private website (if you don't have a public IP or a domain name for
example) would be better to reach an audience, I2P is not very well
known and that's partially why I'm writing this. It is a fantastic
piece of software and only require more users.
Relays in I2P doesn't have any weight and can be seen as a huge P2P
network while Tor network is built using scores (consensus) of relaying
servers depending of their throughput and availability. Fastest and
most reliable relays will be elected as "Guard server" which are entry
points to the Tor network.
I've been running a test over 10 hours to compare bandwidth usage of
I2P and Tor to keep a tunnel / hidden service available (they have not
been used). Please note that relaying/transit were desactivated so
it's only the uploaded data in order to keep the service working.
* I2P sent 55.47 MB of data in 114 430 packets. Total / 10 hours = 1.58
kB/s average.
* Tor sent 6.98 MB of data in 14 759 packets. Total / 10 hours = 0.20
kB/s average.
Tor was a lot more bandwidth efficient than I2P for the same task:
keeping the network access (tor or i2p) alive.
# Quick explanation about how it works
There are three components in an I2P usage.
- a computer running an I2P daemon configured with tunnels servers (to
expose a TCP/UDP port from this machine, not necessarily from localhost
though)
- a computer running an I2P daemon configured with tunnel client (with
information that match the server tunnel)
- computers running I2P and allowing relay, they will receive data from
other I2P daemons and pass the encrypted packets. They are the core of
the network.
In this text we will use an OpenBSD system to share its localhost ssh
access over I2P and a NixOS client to reach the OpenBSD ssh port.
# OpenBSD
The setup is quite simple, we will use i2pd and not the i2p java
program.
```shell commands
pkg_add i2pd
# read /usr/local/share/doc/pkg-readmes/i2pd for open files limits
cat <<EOF > /etc/i2pd/tunnels.conf
[SSH]
type = server
port = 22
host = 127.0.0.1
keys = ssh.dat
EOF
rcctl enable i2pd
rcctl start i2pd
```
You can edit the file /etc/i2pd/i2pd.conf to uncomment the line
"notransit = true" if you don't want to relay. I would encourage
people to contribute to the network by relaying packets but this would
require some explanations about a nice tuning to limit the bandwidth
correctly. If you disable transit, you won't participate into the
network but I2P won't use any CPU and virtually no data if your tunnel
is in use.
Visit http://localhost:7070/ for the admin interface and check the menu
"I2P Tunnels", you should see a line "SSH => " with a long address
ending by .i2p with :22 added to it. This is the address of your
tunnel on I2P, we will need it (without the :22) to configure the
client.
# Nixos
As usual, on NixOS we will only configure the
/etc/nixos/configuration.nix file to declare the service and its
configuration.
We will name the tunnel "ssh-solene" and use the destination seen on
the administration interface on the OpenBSD server and expose that port
to 127.0.0.1:2222 on our NixOS box.
```nixos configuration file
services.i2pd.enable = true;
services.i2pd.notransit = true;
services.i2pd.outTunnels = {
ssh-solene = {
```
enable = true;
name = "ssh";
destination = "gajcbkoosoztqklad7kosh226tlt5wr2srr2tm4zbcadulxw2o5a.b32.i2p";
address = "127.0.0.1";
port = 2222;
};
```
};
```
Now you can use "nixos-rebuild switch" as root to apply changes.
Note that the equivalent NixOS configuration for any other OS would
look like that for any I2P setup in the file "tunnel.conf" (on OpenBSD
it would be in /etc/i2pd/tunnels.conf).
```i2pd tunnels.conf
[ssh-solene]
type = client
address = 127.0.0.1 # optional, default is 127.0.0.1
port = 2222
destination = gajcbkoosoztqklad7kosh226tlt5wr2srr2tm4zbcadulxw2o5a.b32.i2p
```
# Test the setup
From the NixOS client you should be able to run "ssh -p 2222 localhost"
and get access to the OpenBSD ssh server.
Both systems have a http://localhost:7070/ interface because it's a
default setting that is not bad (except if you have multiple people who
can access the box).
# Conclusion
I2P is a nice way to share services on a reliable and privacy friendly
network, it may not be fast but shouldn't drop you when you need it.
Because it can easily bypass NAT or dynamic IP it's perfectly fine for
a remote system you need to access when you can use NAT or VPN.

9544
any/copies-texts/ledger3.md Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,244 @@
Source: https://docs-develop.pleroma.social/backend/configuration/i2p/
Pleroma Documentation I2P Federation and Accessability
# I2P Federation and Accessability ¶
This guide is going to focus on the Pleroma federation aspect. The actual installation is neatly explained in the official documentation, and more likely to remain up-to-date. It might be added to this guide if there will be a need for that.
We're going to use I2PD for its lightweightness over the official client. Follow the documentation according to your distro: https://i2pd.readthedocs.io/en/latest/user-guide/install/#installing
How to run it: https://i2pd.readthedocs.io/en/latest/user-guide/run/
## I2P Federation ¶
There are 2 ways to go about this. One using the config, and one using external software (fedproxy). The external software works better so far.
### Using the Config ¶
Warning: So far, everytime I followed this way of federating using I2P, the rest of my federation stopped working. I'm leaving this here in case it will help with making it work.
Assuming you're running in prod, cd to your Pleroma folder and append the following to config/prod.secret.exs :
```
config :pleroma, :http, proxy_url: {:socks5, :localhost, 4447}
```
And then run the following:
```
su pleroma
MIX_ENV=prod mix deps.get
MIX_ENV=prod mix ecto.migrate
exit
```
You can restart I2PD here and finish if you don't wish to make your instance viewable or accessible over I2P.
```
systemctl stop i2pd.service --no-block
systemctl start i2pd.service
```
Notice: The stop command initiates a graceful shutdown process, i2pd stops after finishing to route transit tunnels (maximum 10 minutes).
You can change the socks proxy port in /etc/i2pd/i2pd.conf.
### Using Fedproxy ¶
Fedproxy passes through clearnet requests direct to where they are going. It doesn't force anything over Tor.
To use fedproxy you'll need to install Golang.
```
apt install golang
```
Use a different user than pleroma or root. Run the following to add the Gopath to your ~/.bashrc.
```
echo "export GOPATH=/home/ren/.go" >> ~/.bashrc
```
Restart that bash session (you can exit and log back in). Run the following to get fedproxy.
```
go get -u github.com/majestrate/fedproxy$
cp $(GOPATH)/bin/fedproxy /usr/local/bin/fedproxy
```
And then the following to start it for I2P only.
```
fedproxy 127.0.0.1:2000 127.0.0.1:4447
```
If you want to also use it for Tor, add 127.0.0.1:9050 to that command. You'll also need to modify your Pleroma config.
=> https://github.com/majestrate/fedproxy fedproxy
Assuming you're running in prod, cd to your Pleroma folder and append the following to config/prod.secret.exs :
```
config :pleroma, :http, proxy_url: {:socks5, :localhost, 2000}
```
And then run the following:
```
su pleroma
MIX_ENV=prod mix deps.get
MIX_ENV=prod mix ecto.migrate
exit
```
You can restart I2PD here and finish if you don't wish to make your instance viewable or accessible over I2P.
```
systemctl stop i2pd.service --no-block
systemctl start i2pd.service
```
Notice: The stop command initiates a graceful shutdown process, i2pd stops after finishing to route transit tunnels (maximum 10 minutes).
You can change the socks proxy port in /etc/i2pd/i2pd.conf.
## I2P Instance Access ¶
Make your instance accessible using I2P.
Add the following to your I2PD config /etc/i2pd/tunnels.conf :
```
[pleroma]
type = http
host = 127.0.0.1
port = 14447
keys = pleroma.dat
```
Restart I2PD:
```
systemctl stop i2pd.service --no-block
systemctl start i2pd.service
```
Notice: The stop command initiates a graceful shutdown process, i2pd stops after finishing to route transit tunnels (maximum 10 minutes).
Now you'll have to find your address. To do that you can download and use I2PD tools.[^1]
Or you'll need to access your web-console on localhost:7070. If you don't have a GUI, you'll have to SSH tunnel into it like this: ssh -L 7070:127.0.0.1:7070 user@ip -p port. Now you can access it at localhost:7070. Go to I2P tunnels page. Look for Server tunnels and you will see an address that ends with.b32.i2p next to "pleroma". This is your site's address.
### I2P-only Instance ¶
If creating an I2P-only instance, open config/prod.secret.exs and under "config :pleroma, Pleroma.Web.Endpoint," edit "https" and "port: 443" to the following:
```
url: [host: "i2paddress", scheme: "http", port: 80],
```
In addition to that, replace the existing nginx config's contents with the example below.
### Existing Instance (Clearnet Instance) ¶
If not an I2P-only instance, add the nginx config below to your existing config at /etc/nginx/sites-enabled/pleroma.nginx.
And for both cases, disable CSP in Pleroma's config (STS is disabled by default) so you can define those yourself separately from the clearnet (if your instance is also on the clearnet). Copy the following into the config/prod.secret.exs in your Pleroma folder (/home/pleroma/pleroma/):
```
config :pleroma, :http_security,
enabled: false
```
Use this as the Nginx config:
```
proxy_cache_path /tmp/pleroma-media-cache levels=1:2 keys_zone=pleroma_media_cache:10m max_size=10g inactive=720m use_temp_path=off;
# The above already exists in a clearnet instance's config.
# If not, add it.
server {
listen 127.0.0.1:14447;
server_name youri2paddress;
# Comment to enable logs
access_log /dev/null;
error_log /dev/null;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/activity+json application/atom+xml;
client_max_body_size 16m;
location / {
add_header X-XSS-Protection "1; mode=block";
add_header X-Permitted-Cross-Domain-Policies none;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header Referrer-Policy same-origin;
add_header X-Download-Options noopen;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_pass http://localhost:4000;
client_max_body_size 16m;
}
location /proxy {
proxy_cache pleroma_media_cache;
proxy_cache_lock on;
proxy_ignore_client_abort on;
proxy_pass http://localhost:4000;
}
}
```
reload Nginx:
```
systemctl stop i2pd.service --no-block
systemctl start i2pd.service
```
Notice: The stop command initiates a graceful shutdown process, i2pd stops after finishing to route transit tunnels (maximum 10 minutes).
You should now be able to both access your instance using I2P and federate with other I2P instances!
[^1]: I2PD tools to print information about a router info file or an I2P private key, generate an I2P private key, and generate vanity addresses.
=> https://github.com/purplei2p/i2pd-tools I2PD tools
### Possible Issues ¶
Will be added when encountered.
___
Made with Material for MkDocs
=> https://squidfunk.github.io/mkdocs-material/ Material for MkDocs

20
any/fedi_alts.md Normal file
View File

@ -0,0 +1,20 @@
# my alts
## Most active
-
## Periodical active
@frssoft@mastodon.ml
@frssoft@fedi.criminallycute.fi
@frssoft@lamp.leemoon.network
@frssoft@videos.redeyes.site
## Non-active
@frssoft@fosstodon.org First Fedi account
## Died
@frssoft@stars.leemoon.network 2023.06-2023.07 Instance destroyed ([PQ hosting issue](https://lamp.leemoon.network/notes/9gaq1o4a6r))
@frssoft@expired.mentality.rip 2022.03-2023.05 Instance destroyed and respawned to suya.place (Pleroma database)
@frssoft@soc.uneex.net 2022.10-2022.12 Instance destroyed (unknown)
@frssoft@soc.phreedom.club 2022.01-2022.09 Second account. Instance destroyed (Pleroma database)

35
any/thanks.md Normal file
View File

@ -0,0 +1,35 @@
# Благодарности и всё в таком духе
Спасибо Толстоевский, что так долго сопровождал и улучшал проект Phreedom, спасибо за капсулу на пабе, спасибо за Forgejo и некоторые другие сервисы, и за статьи с гайдами и музыку самописную. Спасибо за распространение инфы о Феди и gemini. Спасибо taxuswc за то, что подхватил штурвал от Phreedom и не дал ему потонуть, буду надеяться, что Phreedom будет жить и дальше размеренно и медленно.
=> gemini://phreedom.club/ Phreedom Club
=> gemini://pub.phreedom.club/~tolstoevsky Капсула Толстоевского (Архивировано)
=> gemini://pub.phreedom.club/~taxuswc Капсула taxuswc
Спасибо Саре Кварц за её сервисы Leemoon Network с кислинкой~, а в частности за: капсулу, которая в данный момент зеркалирует содержимое капсулы на Phreedom; За опенсорсный аналог и убийцу Netflix - Jellyfin, да, пусть библиотека и не содержит всех фильмов, но в масштабе селфхоста там достаточно много (!) всяких разных сериалов, фильмов, мультиков и даже немного книг с музыкой; За сервер minetest mineclone2 под названием "Цитриния"; За то что увлеклась gemini штуками и в целом стала немножко админшей своего селфхоста, а я помню времена когда это был лишь сайт-блог на Neocities :) Ах да, и за стримы прошлые и возможно будущие (не зря же ты свой OwnCast подняла) тоже спасибо :D
=> https://leemoon.network/ ⭐Leemoon Network🍋
=> gemini://things.leemoon.network/sarah/ ⭐️Сара Кварц🍋
=> https://durochka.leemoon.network/ Дурочка Стримит (кстати можно подписаться)
Thanks NaiJi and Duponin for cute udongein.xyz Pleroma instance. This instance has died and revived 3 times, thanks for keeping it alive for so long! By the way, since then, now the main admin is Duponin. And not forget - Inex also has help fix Pleroma database ROT, thanks!
Also thanks for Touhou music collection 🐇
Спасибо Найджи и Дупонину за прекрасный инстанс плеромы udongein.xyz. Этот инстанс умирал и оживал 3 раза (как минимум), спасибо, что сохраняете его так долго живым! Кстати, с тех пор, главный админ сервера Дупонин. И не забыть - Инекс тоже помогал пофиксить так называемый Pleroma database ROT (переполнение базы данных за длительное время и попытка сколько-то дней всё это проиндексировать), спасибо!
Так же, спасибо за коллекцию музыки Touhou 🐇
=> https://udongein.xyz/users/duponin duponin FUMO FUNGUS
=> https://reisen.church/users/NaiJi NaiJi
=> https://social.inex.rocks/@inexcode Inex Code
Спасибо Инексу за матрикс сервер и за другие сервисы, которые он хостит, особенно спасибо за funkwhale, музончик там что надо :)
Так же спасибо, что держит ру индекс комьюнити Федивёрса и пытается бороться с попытками Fediblock сойти с ума (те, кто блокируют его инстанс без причины в частности). Спасибо за быстрое устранение неполадок и помощь в техническом плане знакомым по ру-феди :blobfoxthumbsup:
Спасибо за старые стримы VR, и кодингу приложения для SelfPrivacy.org прямо в прямом эфире!
=> https://inex.rocks Main site
=> https://owncast.inex.rocks Owncast
=> https://ru.index.community/ Index.Community
````
_____ _ _
|_ _| |__ __ _ _ __ | | _____
| | | '_ \ / _` | '_ \| |/ / __|
| | | | | | (_| | | | | <\__ \
|_| |_| |_|\__,_|_| |_|_|\_\___/
````

34
icon.txt Normal file
View File

@ -0,0 +1,34 @@
| ------ ----- ------ ------ |
| | | | | | | |
| ____ | | | | | | |
| | | | | | | |
| | | | | | | |
| |____ | * |____| * |____|* |
;cxkxxxxkkkkkkkkxxo;... .. ..................;;;:;,'.....;odooooooooo
'coddxxdooodxkxxdo,...............................;:;,'...,c:;:clooooooo
.,:looddoolccddo:............................... ..:;,'';c:'..,,;:::::::
.,;:::clllcc:lo,.............................. ..'cccc;''''''''''...,:
',;;;;;;;;;:cc,................................ ....,c;,''.....''',;::,'
',,;,,,;;;:;;'............. .......................',',,'';:clddolcc::
c:;,''',,;;;:.............. .... . ... ....'....,coxkkkkkkkkx
:cllllllcc:;,....................... .... ....,,''.';:cccclodxxd
;;,,,;;::cllc..............kkk.,..... ...... ....,,'..''....':cc;',
ccccc:;;;:;,' ...........;'kxk'l....'.. ..''..........','....,:cll;.....
;;;:::::;;,'' .........co:xkx;d;;'.'l:''.';,........,odollcclolccclllc:
looddddoolc;,.......c;..c,:lxdxxodxkoolloddddc'......';,;::ccccc:;;,,'.'
dxxxxxxxxxdl:'......ooddlcccdkkOOOOO0Od:..';:xl'...'.:lc:;'...',,;;;:::;
xxxxxxxxxxxdo;';....xx,;'..'xO00000K00Oklclkxkd.'cl..cl,'.....';:::cc:;;
xxxxdolloooolc;... ,oxodl;:dO00000000K00OkkOOOx',....;lccc::cool;,,,;:cc
xxxdddddddoc;;,....;ckkxxdxkO00O0K00000000000Ox......';cccc;'.';::c:,'..
xkkxxxddoc:,',,'.....,dxxdxkO00O0000000000000kc......,'',:olc;,;:,'..,,,
ddxxdollc:'..''',cc. ,dxdxkO00OOO00000OOOOOO:......'':c:;;lolccc::;;;,.
lc::::;,,,,,;;:ooc,.....;dxxkkOOOOO000Okkkkd'. .....':;:::ccloooooolc::c
.....,,.....,lo:,,,'';,' .'cdxkkkkkOOOOkkkx'......''''........,cc,;coc;;
.,;lol:'..,coc,.',,,:odo;...'loodxkkkOkxxxx:',....,,,,'.........':;.,cc'
odoc;,,'':oc,''...''';odo;..,ololldooxkkxxxx;,...';,,,;;,,,,,,,,;;;;'.';
c:;;;,,:lc'.......'',,:odo,,llloddkxkOOkkkkkx:...';,'''..........''....'
;;;;;coo;....','';;;;;;coddollodxkOkkOOkkkkkkk,...;;,'..................
,,,:ooc,''',,,;:clloodxxkkkxddxkkkkOOOOkxxxxkkd...:;,,'.................
.':oo:'''''':dxxkkkxxxxxkOOOkxkOkkxkOOOkkxxkkkk; oxl;..................