What Has been Created?
DEMI Interfaces - DEMI Piplene Publishing Interface and GPT DEMI Portal Builder.
Register your work today with Hash and Time Stamp and develop your ideas with AI assistance.
DEMI Anchoring Logic
Most people cannot. They email the file to themselves, or post it, or trust that nobody will ask. None of that survives a determined question.Большинство людей не смогут. Они отправляют файл самим себе по почте, публикуют его или надеются, что никто не спросит. Ничто из этого не выдержит настойчивого вопроса.
This is a record of a small system that answers it, built over several weeks and running now. It costs nine dollars. The file never leaves your computer. And the date it fixes does not depend on anyone continuing to exist — including the people who built it.Это запись о небольшой системе, которая на такой вопрос отвечает. Она построена за несколько недель и работает сейчас. Она стоит девять долларов. Файл не покидает ваш компьютер. А зафиксированная дата не зависит от того, продолжает ли кто-либо существовать — включая тех, кто её построил.
How it works, in four sentencesКак это работает, в четырёх предложениях
You drop a file onto a web page. Your own computer reduces it to a 64-character fingerprint — the file itself goes nowhere. That fingerprint is published, with a date, in a public register. Periodically the whole register is summarised into one number and written into the Ethereum blockchain, where no one can alter it.Вы перетаскиваете файл на веб-страницу. Ваш собственный компьютер сводит его к отпечатку из 64 символов — сам файл никуда не отправляется. Этот отпечаток публикуется вместе с датой в публичном Реестре. Периодически всё состояние Реестра сводится к одному числу, которое записывается в блокчейн Ethereum, где его никто не может изменить.
Afterwards, anyone holding your original file can recompute the fingerprint with a standard command and compare. If it matches, the file is unchanged and existed before that block. They do not have to ask us anything, and they do not have to believe us.После этого любой, у кого есть ваш исходный файл, может пересчитать отпечаток стандартной командой и сравнить. Если совпадает — файл не изменён и существовал до этого блока. Им не нужно ни о чём нас спрашивать, и им не нужно нам верить.
The part that took longest to get rightТо, что оказалось труднее всего сделать правильно
It is not enough to send a blockchain transaction and point at it. A transaction that moves value proves only that one account paid another — nothing about anyone’s file.Недостаточно отправить транзакцию в блокчейн и указать на неё. Транзакция, которая перемещает ценность, доказывает лишь то, что один счёт заплатил другому — и ничего о чьём-либо файле.
Why you pay by card and never touch cryptocurrencyПочему вы платите картой и никогда не касаетесь криптовалюты
These are two different jobs, and mixing them helps nobody.Это две разные задачи, и их смешение никому не помогает.
A card payment identifies who paid, because their bank identified them long before we existed. A blockchain fixes when something happened, because no single party controls it. So you pay by card — the ordinary way, with no wallet, no exchange, no price to watch — and the operator spends a fraction of a cent of its own cryptocurrency writing the number to the chain.Оплата картой указывает, кто заплатил, потому что банк идентифицировал этого человека задолго до того, как появились мы. Блокчейн фиксирует, когда это произошло, потому что его не контролирует ни одна сторона. Поэтому вы платите картой — обычным способом, без кошелька, без биржи, без курса, за которым надо следить, — а оператор тратит долю цента собственной криптовалюты, записывая число в цепочку.
Your certificate then carries a transaction reference you can look up on a public explorer. You never buy, hold or send any cryptocurrency. The regulatory question that surrounds accepting it never arises, because nothing is accepted.Ваш сертификат затем содержит ссылку на транзакцию, которую вы можете открыть в публичном обозревателе. Вы никогда не покупаете, не храните и не отправляете криптовалюту. Регулятивный вопрос, связанный с её приёмом, не возникает, потому что ничего не принимается.
What it deliberately does not claimЧего система намеренно не утверждает
It does not say who wrote the work. It does not say who owns it. It does not create copyright — copyright exists without any of this. It cannot show that nobody else had the same thing earlier.Она не говорит, кто создал работу. Она не говорит, кому она принадлежит. Она не создаёт авторское право — авторское право существует и без всего этого. Она не может показать, что ни у кого другого раньше не было того же самого.
It says: this exact file existed by this time, and has not changed. That is a small claim, and the smallness is the point. Small claims can be checked by anyone and are hard to dispute. Large ones invite argument.Она говорит: именно этот файл существовал к этому времени и не изменился. Это небольшое утверждение, и его небольшой размер — и есть суть. Небольшие утверждения может проверить кто угодно, и их трудно оспорить. Крупные — приглашают спор.
Try it before you read the restПопробуйте, прежде чем читать дальше
The fingerprint step is free, takes seconds, and creates no record. Drop any file — a song, a video, a manuscript, a photograph — and the page will show you its SHA-256. Check it yourself:Шаг с отпечатком бесплатен, занимает секунды и не создаёт записи. Перетащите любой файл — песню, видео, рукопись, фотографию — и страница покажет его SHA-256. Проверьте сами:
Get-FileHash <file> -Algorithm SHA256 # Windows PowerShell shasum -a 256 <file> # macOS, Linux
The two values must match, character for character. If they do, you have just verified the whole foundation of the system on your own machine, without trusting anybody.Два значения должны совпасть символ в символ. Если совпали — вы только что проверили всю основу системы на собственной машине, никому не доверяя.
The state of it, as of this articleСостояние на момент этой статьи
This section is a record rather than a proposal. Everything below is running.Этот раздел — запись, а не предложение. Всё перечисленное ниже работает.
| WhatЧто | StateСостояние |
|---|---|
| Browser fingerprinting, any file formatОтпечатки в браузере, любой формат файла | Live. Used in public.Работает. Используется публично. |
| Provenance manifest for audio, video, imagesМанифест происхождения для аудио, видео, изображений | Live.Работает. |
| Cited fingerprints read from a document’s textОтпечатки, прочитанные из текста документа | Live.Работает. |
| Card registration, payment verified server-sideРегистрация по карте, оплата проверяется на сервере | Live. Third-party customers.Работает. Есть сторонние клиенты. |
| Public register, certificates, landing pages, JSONПубличный Реестр, сертификаты, страницы, JSON | Live. 30 records.Работает. 30 записей. |
| Server-side screening of published fieldsСерверная проверка публикуемых полей | Live.Работает. |
| Blockchain anchoring of the registerПривязка Реестра к блокчейну | Live. Block 25957654.Работает. Блок 25957654. |
| Automated signing by the serverАвтоматическая подпись на сервере | Not built. Anchors are made by hand.Не построено. Привязка выполняется вручную. |
| RFC 3161 timestamping as a second witnessОтметка времени по RFC 3161 как второй свидетель | Not built.Не построено. |
The anchorПривязка
On 12 September 2026 the register’s state was committed to the Ethereum blockchain.12 сентября 2026 года состояние Реестра было зафиксировано в блокчейне Ethereum.
| FieldПоле | ValueЗначение |
|---|---|
| DigestДайджест | 75ee0099272519a306813777ca6d19527aa45414c4c21c5eb8ad15b27fd4b13b |
| TransactionТранзакция | 0x243936896d07db6f477f211cff02cdcbe2f68529d302fb80923121a611d26603 |
| From and toОт и кому | 0xc6712b82Ff263Ff49E18DD68940Dc3D0B33c5861 |
| BlockБлок | 25957654 |
| Block time (UTC)Время блока (UTC) | 2026-09-12T00:09:47.000Z |
| Records coveredОхвачено записей | 30 |
| Value transferredПереведено средств | 0 |
| Network feeКомиссия сети | USD 0.12 |
Every record made before that block now carries an independent timestamp, including registrations paid by card. The certificate is generated when it is requested rather than frozen at registration, so records made earlier gained the anchor retroactively.Каждая запись, сделанная до этого блока, теперь несёт независимую отметку времени, включая регистрации, оплаченные картой. Сертификат формируется в момент запроса, а не замораживается при регистрации, поэтому более ранние записи получили привязку задним числом.
What the whole thing costВо что всё это обошлось
The anchoring mechanism, from first attempt to working: four transactions totalling 34 US cents. Two of those were failures, described in Part Three. Ongoing cost is roughly twelve cents per anchor, and one anchor covers the entire register regardless of how many records it holds.Механизм привязки, от первой попытки до работающего результата: четыре транзакции общей стоимостью 34 цента США. Две из них были неудачными и описаны в Части третьей. Текущая стоимость — около двенадцати центов за одну привязку, и одна привязка охватывает весь Реестр независимо от числа записей в нём.
The rest of the system runs on services with free tiers. There is no infrastructure here that a person could not afford as a hobby, which is the point: the barrier to doing this properly was never money.Остальная часть системы работает на сервисах с бесплатными тарифами. Здесь нет инфраструктуры, которую человек не мог бы позволить себе как хобби, — и в этом суть: препятствием к тому, чтобы сделать это как следует, никогда не были деньги.
Written for someone implementing this, human or machine. Version 1 gave away the design; this part gives away what it costs to get right.Написано для того, кто будет это реализовывать, — человека или машины. Версия 1 раскрыла конструкцию; эта часть раскрывает, чего стоит сделать её правильно.
1. What is anchored1. Что именно привязывается
Not an individual record. SHA-256 of the register index, with a snapshot of the exact records covered stored against the digest, so the set can be reproduced later:Не отдельная запись. SHA-256 индекса Реестра, при этом снимок точного набора охваченных записей сохраняется рядом с дайджестом, чтобы этот набор можно было воспроизвести позже:
digest = SHA-256( canonical JSON of the register index )
transaction = { to: ANCHOR_WALLET, from: ANCHOR_WALLET,
value: 0, data: "0x" + digest }
Batching is what makes this economical. One transaction covers the entire register, so cost is constant rather than per-record. The trade is latency: a record registered after the last anchor is uncovered until the next one.Именно пакетная обработка делает это экономичным. Одна транзакция охватывает весь Реестр, поэтому стоимость постоянна, а не зависит от числа записей. Плата за это — задержка: запись, сделанная после последней привязки, не охвачена до следующей.
2. Verification, in three independent levels2. Проверка в трёх независимых уровнях
Level 1 — file against recordУровень 1 — файл против записи
- Compute SHA-256 of the file in hand.Вычислить SHA-256 имеющегося файла.
- Fetch
/registry/<upl>.json.Получить/registry/<upl>.json. - Compare with
file_sha256.Сравнить сfile_sha256.
Level 2 — record against snapshotУровень 2 — запись против снимка
- Fetch
/registry/anchors.jsonand take the covering anchor.Получить/registry/anchors.jsonи взять охватывающую привязку. - Fetch
/registry/anchor/<digest>.json.Получить/registry/anchor/<дайджест>.json. - Confirm the record appears in
records_json.Убедиться, что запись присутствует вrecords_json. - Compute SHA-256 of
records_json; it must equal the digest.Вычислить SHA-256 отrecords_json; результат должен равняться дайджесту.
Level 3 — snapshot against chainУровень 3 — снимок против цепочки
- Open the transaction on any block explorer.Открыть транзакцию в любом обозревателе блоков.
- Read its input data; it must equal the digest.Прочитать её входные данные; они должны равняться дайджесту.
- Read the block timestamp.Прочитать отметку времени блока.
No step at Level 3 involves the operator. The register is public JSON, the chain is public, and a block explorer is a read-only view of the same data. This is the level that survives the operator ceasing to exist.Ни один шаг Уровня 3 не затрагивает оператора. Реестр — публичный JSON, цепочка публична, а обозреватель блоков — лишь способ просмотра тех же данных. Это тот уровень, который переживёт прекращение существования оператора.
3. Four things that cost money to learn3. Четыре вещи, за знание которых пришлось заплатить
None of these appear in any specification. Each was found by doing it.Ни одной из них нет ни в одной спецификации. Каждая найдена на практике.
3.1 A mobile wallet has no data field3.1 В мобильном кошельке нет поля данных
MetaMask’s mobile application offers no way to attach transaction data. A self-transfer sent from a phone therefore carries no digest, is indistinguishable from an ordinary transfer, and is correctly refused by the verifying code. Cost of discovery: eleven cents.Мобильное приложение MetaMask не предлагает способа прикрепить данные к транзакции. Перевод самому себе, отправленный с телефона, поэтому не несёт дайджеста, неотличим от обычного перевода и справедливо отклоняется проверяющим кодом. Стоимость открытия: одиннадцать центов.
3.2 The browser extension hides it by default3.2 Расширение для браузера скрывает это поле по умолчанию
The extension does have the field, but it is off until enabled at Settings → Transactions → Show hex data. Until then the Send flow simply omits it, with no warning. A second eleven cents.В расширении поле есть, но оно выключено, пока его не включить: Settings → Transactions → Show hex data. До этого форма отправки просто не показывает его и ничем не предупреждает. Ещё одиннадцать центов.
3.3 textContent discards block boundaries3.3 textContent отбрасывает границы блоков
Extracting text from converted HTML with textContent inserts no whitespace between block elements. A table cell’s text runs into the next cell’s, producing strings such as “File SHA-256c50bfeee…”. A 64-character match bounded by word boundaries cannot occur inside a 67-character run of word characters, so quoted fingerprints became invisible. It also degraded every extract taken from a document with tables or headings. The fix is to insert a newline after each closing block tag before parsing.Извлечение текста из преобразованного HTML через textContent не вставляет пробелов между блочными элементами. Текст ячейки таблицы сливается с текстом следующей, образуя строки вида «File SHA-256c50bfeee…». Совпадение из 64 символов, ограниченное границами слова, не может произойти внутри непрерывной последовательности из 67 символов, поэтому процитированные отпечатки становились невидимыми. Это же ухудшало любой отрывок, взятый из документа с таблицами или заголовками. Решение — вставлять перевод строки после каждого закрывающего блочного тега перед разбором.
3.4 A word list refuses honest titles3.4 Список запрещённых слов отклоняет честные названия
A first screening list contained the stem “pedo” and refused “The Pedometer Study” — a legitimate title, and exactly the kind of thing a medical author might register. Terms short enough to resist evasion are short enough to insult honest users. The remedy is an allow-list of legitimate words removed from the text before matching, so “pedometer” passes while “pedophile pedometer” does not.Первый вариант списка содержал основу «pedo» и отклонил название «The Pedometer Study» — правомерное название и ровно то, что мог бы зарегистрировать медицинский автор. Термины, достаточно короткие, чтобы противостоять обходу, достаточно коротки и для того, чтобы оскорбить честного пользователя. Решение — список разрешённых слов, удаляемых из текста до сопоставления, так что «pedometer» проходит, а «pedophile pedometer» — нет.
4. Where the regulatory boundary falls4. Где проходит регулятивная граница
The open question for any operator accepting cryptocurrency as a service fee is whether that constitutes a regulated activity. Under this design the question does not arise, because nothing is accepted:Открытый вопрос для любого оператора, принимающего криптовалюту в качестве платы за услугу, — считается ли это регулируемой деятельностью. При данной конструкции вопрос не возникает, поскольку ничего не принимается:
- The customer pays in ordinary currency by card, through a merchant of record.Клиент платит обычной валютой по карте, через продавца записи (merchant of record).
- The operator spends a fraction of a cent of its own holdings on a network fee.Оператор тратит долю цента собственных средств на комиссию сети.
- The transaction is sent from the operator’s wallet to itself: no counterparty, no recipient, no transfer of value to any person, no deposit into an exchange.Транзакция отправляется с кошелька оператора на него же: нет контрагента, нет получателя, нет передачи ценности какому-либо лицу, нет внесения средств на биржу.
The boundary is not between blockchain and no blockchain. It is between receiving value from another person and not receiving it. A public ledger used purely as a notarial surface — recording that something existed, transferring nothing — occupies a different position from the same ledger used to move value. Systems designed with that distinction in mind obtain the durability of the ledger without engaging the regimes that govern payments.Граница проходит не между блокчейном и его отсутствием. Она проходит между получением ценности от другого лица и его отсутствием. Публичный реестр, используемый исключительно как нотариальная поверхность — фиксирующий, что нечто существовало, и не передающий ничего, — занимает иное положение, чем тот же реестр, используемый для перемещения ценности. Системы, спроектированные с учётом этого различия, получают долговечность реестра, не затрагивая режимы, регулирующие платежи.
This is an explanation of the design, not legal advice, and should be confirmed by a practitioner in the relevant jurisdiction.Это объяснение конструкции, а не юридическая консультация; оно должно быть подтверждено практикующим юристом в соответствующей юрисдикции.
5. The components, and what each must be trusted for5. Компоненты и то, чему в каждом нужно доверять
| ComponentКомпонент | Trust requiredТребуемое доверие |
|---|---|
| Browser (fingerprinting)Браузер (вычисление отпечатка) | The author trusts their own machine. Nothing else.Автор доверяет собственной машине. Больше ничему. |
| Serverless worker (record, screening, certificates)Бессерверный обработчик (запись, проверка, сертификаты) | A reader trusts the operator — until an anchor removes that dependency.Читатель доверяет оператору — пока привязка не снимет эту зависимость. |
| Payment processor (merchant of record)Платёжный провайдер (merchant of record) | Ordinary card-payment trust. The operator never sees card details.Обычное доверие к оплате картой. Оператор не видит данных карты. |
| Language model (Conceptual Core)Языковая модель (Концептуальное Ядро) | None for the evidence. It reads the extract and produces a summary; the hashes are computed independently.Никакого — для доказательства. Она читает отрывок и составляет изложение; хеши вычисляются независимо. |
| Public blockchainПубличный блокчейн | None. Independently readable by anyone.Никакого. Читается независимо кем угодно. |
| Block explorerОбозреватель блоков | None. Any explorer, or a node, gives the same answer.Никакого. Любой обозреватель или узел даст тот же ответ. |
The services used are ordinary and interchangeable: a serverless platform, a payment processor acting as merchant of record, a language model API, and a public blockchain with a public explorer. Nothing here is bespoke infrastructure, and nothing requires a commercial relationship beyond an account. Any equivalent service would do.Используемые сервисы обычны и взаимозаменяемы: бессерверная платформа, платёжный провайдер как продавец записи, API языковой модели и публичный блокчейн с публичным обозревателем. Здесь нет заказной инфраструктуры и не требуется коммерческих отношений сверх наличия учётной записи. Подойдёт любой эквивалентный сервис.
Records that find each otherЗаписи, которые находят друг друга
Each registration already produces a landing page carrying machine-readable metadata, and a document that quotes another registration’s fingerprint has that citation recorded as data rather than prose. Version 2 of this article cites version 1 by fingerprint; this version cites both.Каждая регистрация уже создаёт страницу с машиночитаемыми метаданными, а документ, цитирующий отпечаток другой регистрации, сохраняет эту ссылку как данные, а не как прозу. Версия 2 этой статьи цитирует версию 1 по отпечатку; настоящая версия цитирует обе.
If that were extended, a register would stop being a list and become a graph: works pointing at the works they build on, in a form a search system or an AI could follow. The author suggests this could let people working on the same problem find one another through what they have registered, rather than through who they already know. That is a suggestion, not a result.Если это развить, Реестр перестанет быть списком и станет графом: работы указывают на работы, на которых они построены, в форме, которую может проследить поисковая система или ИИ. Автор предполагает, что это позволило бы людям, работающим над одной задачей, находить друг друга через то, что они зарегистрировали, а не через тех, кого они уже знают. Это предположение, а не результат.
Compatible references across separate registersСовместимые ссылки между отдельными Реестрами
The mechanism described here is public and free to implement. Anyone can run their own register; some will. The question that decides whether that becomes fragmentation or a federation is whether the reference format is compatible.Описанный механизм публичен и свободен для реализации. Любой может вести собственный Реестр; некоторые будут. Вопрос, который решает, станет ли это раздробленностью или федерацией, — совместим ли формат ссылки.
A DEMI Activation Reference has the form DEMI:⟨namespace⟩:⟨code⟩:⟨check⟩, with the check character computed by ISO 7064 MOD 37,36 — the scheme used by ISNI and GRID. The namespace distinguishes operators. If separate registers minted under distinct namespaces in this format, a reference issued by one would be recognisable to all, and a work could cite a work registered elsewhere.DEMI Activation Reference имеет вид DEMI:⟨пространство имён⟩:⟨код⟩:⟨контрольный символ⟩, где контрольный символ вычисляется по ISO 7064 MOD 37,36 — схеме, используемой ISNI и GRID. Пространство имён различает операторов. Если бы отдельные Реестры выпускали коды в разных пространствах имён в этом формате, ссылка одного была бы распознаваема всеми, и работа могла бы цитировать работу, зарегистрированную в другом месте.
That would need an allocation authority, which is an ordinary institutional arrangement — the same shape as ISBN agencies or DOI registrars. It has not been established, and this article does not claim it exists.Для этого потребовался бы орган распределения — обычное институциональное устройство, того же вида, что агентства ISBN или регистраторы DOI. Он не создан, и эта статья не утверждает, что он существует.
An application the author considers significantПрименение, которое автор считает значимым
Payment systems are national. Card networks do not reach everyone, correspondent banking has withdrawn from whole regions, and two parties in different jurisdictions frequently cannot pay each other at all.Платёжные системы национальны. Карточные сети охватывают не всех, корреспондентские банковские отношения свёрнуты в целых регионах, и две стороны в разных юрисдикциях нередко вообще не могут заплатить друг другу.
Verification has no such constraint. Two parties who cannot transact can still compute the same fingerprint with free tools and read the same block on the same public chain. Neither needs an account with the other’s institution, or with any institution.У проверки такого ограничения нет. Две стороны, которые не могут совершить сделку, всё же могут вычислить один и тот же отпечаток бесплатными средствами и прочитать один и тот же блок в одной и той же публичной цепочке. Ни одной из них не нужен счёт в учреждении другой — или в каком-либо учреждении вообще.
The author suggests this matters most where specialist judgement is distributed and payment is not — medical research being the example he knows best. A finding registered in one country could be cited, verified and built upon by specialists elsewhere, with the record of who established what and when independent of whether any bank connects them. Whether that is useful in practice is untested.Автор предполагает, что это важнее всего там, где специальное суждение распределено, а платёж — нет; медицинские исследования здесь тот пример, который он знает лучше всего. Результат, зарегистрированный в одной стране, мог бы цитироваться, проверяться и развиваться специалистами в других странах, причём запись о том, кто и когда что установил, не зависела бы от того, связывает ли их какой-либо банк. Полезно ли это на практике — не проверено.
A record establishes that a file bearing a stated fingerprint existed no later than a stated time and has not changed. It does not establish authorship, ownership, priority over any other person, or any legal right. It creates no copyright. It is not a government or institutional registration, and it is not legal advice.Запись устанавливает, что файл с указанным отпечатком существовал не позднее указанного времени и не изменялся. Она не устанавливает авторство, право собственности, приоритет перед каким-либо иным лицом или какое-либо юридическое право. Она не создаёт авторского права. Она не является государственной или институциональной регистрацией и не является юридической консультацией.
Blockchain anchoring is also not the only way to obtain an independent timestamp, and an honest account should say so. RFC 3161 produces a signed token from an accredited timestamping authority — free from several providers, needing no wallet, no key and no ledger, and already recognised in legal and standards contexts. OpenTimestamps has provided free Bitcoin-anchored timestamping since 2016. The argument for a ledger anchor is that it does not depend on the issuing authority continuing to exist; the argument for doing both is stronger than either.Привязка к блокчейну — также не единственный способ получить независимую отметку времени, и честное изложение должно это сказать. RFC 3161 даёт подписанный токен от аккредитованного органа отметок времени — бесплатно у нескольких поставщиков, без кошелька, без ключа и без цепочки, и уже признан в юридическом и стандартизационном контексте. OpenTimestamps предоставляет бесплатные отметки времени на основе Bitcoin с 2016 года. Довод в пользу привязки к реестру состоит в том, что она не зависит от дальнейшего существования выдающего органа; довод в пользу того, чтобы делать и то и другое, сильнее любого из них.
Version historyИстория версий
| VersionВерсия | Registry codeКод Реестра | What it recordedЧто зафиксировано |
|---|---|---|
| 1 — 9 Sep 20261 — 9 сен 2026 | UPL-TECH-26-193688-EN | A design, not yet implemented.Конструкция, ещё не реализованная. |
| 2 — 10 Sep 20262 — 10 сен 2026 | UPL-TECH-26-398499-EN | Three faults the first registration exposed, and their correction.Три недостатка, выявленные первой регистрацией, и их исправление. |
| 3 — 12 Sep 20263 — 12 сен 2026 | — | The system running, anchored at block 25957654.Работающая система, привязанная в блоке 25957654. |
Each version cites its predecessor by fingerprint, so the chain is machine-readable in the register rather than only in prose. That was not a demonstration arranged for the article; it is how the software works.Каждая версия цитирует предшествующую по отпечатку, поэтому цепочка машиночитаема в самом Реестре, а не только в тексте. Это не демонстрация, устроенная ради статьи; так работает программа.
Fingerprint a file — free →Получить отпечаток файла — бесплатно →
© 2026 Dmitri Tcherkas (Skydle) / UplitAU Pty Ltd. The method described here is published so that others may implement it.© 2026 Дмитрий Черкас (Skydle) / UplitAU Pty Ltd. Описанный здесь метод публикуется для того, чтобы другие могли его реализовать.

