- PVSM.RU - https://www.pvsm.ru -
В МИС шаблон протокола исследования больше похож на конструктор, который может состоять из деталей разной формы и размера. В качестве строительного материала выступают рассмотренные ранее теги и их атрибуты [1]. С их помощью в протокол можно добавить все поля, которые должны быть в нем обязательно. Однако порой возникают случаи, когда требуется расширить возможности текущего протокола исследования, добавив в него дополнительные блоки измерений. Подобные дополнительные части мы назвали вставками. В целом вставок может быть неограниченное количество. Шаблоны дополнительных частей состоят из тех же тегов, что и шаблон самого протокола, но для обозначения места вставки и описания её типа используются другие теги.
Особого внимания также требует описание удалённых органов или анатомических частей тела. Никакого отношения к вставкам они не имеют, так как потенциальные для удаления органы находятся сугубо в стандартном протоколе исследования. По умолчанию в шаблоне присутствуют все описываемые анатомии, а факт отсутствия регулируется специальным тегом. Он содержит статус соответствующей анатомии.
Рассмотрим подробнее механику работы дополнительных тегов.
Один из типов вставок – образования. Её характерные черты:
С помощью вставки с типом «образования» можно описать следующие виды патологий:
Если для «стандартных» органов врач может ознакомиться с динамикой изменений и комментариев, то для образований помимо уже перечисленных типов динамики также важна и динамика развития самого образования. Для этого была добавлена еще одна сущность – anatomy addon. Кроме просмотра динамики сохранение каждого образования способствует при следующих визитах пациента описывать уже существующие образования, а не дублировать одни и те же.
С учетом того, что один вид описываемых патологий может оккупировать разные органы или один орган в разных местах, было введено такое понятие как локализация. Во-первых, она позволяет четко понять, где находится патология или в каком именно месте произведено измерение. Во-вторых, становится возможным только один раз разложить патологию по сущностям «анатомия» и «измерение», а не создавать эту патологию по несколько раз для каждого органа.
Рассмотрим кисту. Она представляет собой патологическую полость в тканях или органах, имеющую стенку и содержащую жидкость. Её размер, строение и содержимое зависит от многих факторов, и одним из них является локализация. По концентрации кист в пределах одной локализации выделяют единичные и множественные кисты. Вместо того чтобы создавать анатомии единичная киста левой доли щитовидной железы, единичная киста правой доли щитовидной железы, единичная киста поджелудочной железы и т. д., в БД добавлена одна анатомия «единичная киста» с нужными измерениями. В свою очередь, в качестве локализации уже выступают анатомии: левая доля щитовидной железы, правая доля щитовидной железы, поджелудочная железа и т. д.
Есть одна анатомия в организме человека, о статусе которой не утихают споры в разных областях науки и по сей день. Это плод. К примеру, юристы спорят о правах эмбриона, в биоэтике ставят вопрос признания за эмбрионом и плодом статуса «человек» и т. п. В рамках МИС для анатомии «плод» мы выделили две важные особенности. Во-первых, данная анатомия появляется в женском организме, а не присутствует там исконно. Во-вторых, в материнской утробе может развиваться сразу несколько плодов (многоплодная беременность). Как говорится: «если нечто выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, утка и есть». С учетом характерных черт этой анатомии, а не её сути, плод добавляется в протокол исследования как рассмотренные выше патологии – с помощью вставки «образования».
Второй тип вставок – дополнительно описываемые анатомии, которые мы сокращенно называем – дополнительные анатомии. В отличие от объектов, описываемых через вставку «образования», вставка «дополнительные анатомии» предназначена для анатомий, которые присутствуют в организме изначально, но если они не находятся в измененном состоянии, то их не описывают. Если анатомия изменена, то она попадает в anatomy addon. К подобным анатомиям относятся: позвонки всех отделов позвоночника, паращитовидная железа, подъязычные слюнные железы, молочные железы и т. п.
Третий тип вставок – дополнительные измерения. Несколько примеров:
Сами вставки обозначаются в шаблоне тегами insertion-place и insertion-template-builder. В редактируемой форме заключения на месте тега insertion-place появляется специальная кнопка. При нажатии на неё врачу показывается диалог со всеми возможными образованиями, дополнительными анатомиями и дополнительными измерениями, которые указаны в шаблоне данного протокола исследования.
Используется для указания места вставки. Содержит тег insertion-template-builder.
Используется для обозначения конкретного образования, дополнительной анатомии или дополнительных измерений:
Иногда встречаются сложные локализации, для которых словесного описания (четкого указания анатомии-локализации) может быть недостаточно. Для таких случаев был разработан специальный компонент. Он представляет собой картинку-подложку (изображение анатомии-локализации) с областями, на которые можно нажать. Выбранная область (место расположения образования) подсвечивается заданным цветом.
Этот компонент можно использовать для указания протрузий/грыж межпозвонковых дисков, атероматозных бляшек в сосудах и т. п.
Вернёмся к кистам. Они могут образовываться из-за нарушений, возникших в период эмбрионального развития, травм, инфекций, генетической предрасположенности, воспалительных процессов, стресса и т. п. Это новообразование может со временем измениться в размере. В некоторых случаях она самостоятельно рассасывается. Когда киста достигает определенного размера, она начинает мешать расположенным рядом органам, вызывая неприятные ощущения у человека.
Некоторые кисты можно обнаружить самостоятельно. Например, на груди, коже, ретенционные кисты губ. Последние появляются на поверхности языка, щеке, нижней губе. Они возникают обычно из-за прикусывания или других травм. Кисты во внутренних органах диагностируют при помощи различных методов обследования (УЗИ, МРТ и прочее).
Рассмотрим добавление единичной и множественной кист в протокол исследования УЗИ щитовидной железы.
Шаблон единичной кисты:
<template>
<line>
<measurement id="2401" max-width="246" comment="Структура"/>
<measurement id="2402" measurement-name="Контуры" comment="Контуры четкость"/>
<measurement id="2421" max-width="51" empty-name="true" comment="Контуры ровность"/>
</line>
<measurement-group id="83" is-short="false"/>
<anatomy-comment comment-id="302" comment-type="comment" spacing-before="NONE" use-default="false" comment="Комментарий киста" />
</template>
Шаблон множественной кисты:
<template>
<line>
<measurement id="2423" max-width="246" comment="Структура наибольшей кисты"/>
<measurement id="2424" measurement-name="Контуры наибольшей кисты" comment="Контуры наибольшей кисты четкость"/>
<measurement id="2425" max-width="51" empty-name="true" comment="Контуры наибольшей кисты ровность"/>
</line>
<measurement-group id="84" is-short="false"/>
<anatomy-comment comment-id="303" comment-type="comment" spacing-before="NONE" use-default="false" comment="Комментарий киста"/>
</template>
Часть шаблона щитовидной железы для добавления кисты:
<insertion-place>
<!-- киста единичная -->
<insertion-template-builder anatomy-id="821" anatomy-width="100" name-width="136" need-template-builder="false" localization-id="23,1021,1022,1023,24,1024,1025,1026,25" need-status="false" localization-width="177" localization-marker-type="word" id="538"/>
<!-- киста множественная -->
<insertion-template-builder anatomy-id="822" anatomy-width="100" name-width="136" need-template-builder="false" localization-id="23,1021,1022,1023,24,1024,1025,1026,25" need-status="false" localization-width="177" localization-marker-type="word" id="540"/>
</insertion-place>
Диалог вставки:
При добавлении в протокол исследования единичной и множественной кист, получим следующий результат:
Сидячий образ жизни, лишний вес, искривление позвоночника, слабые мышцы спины, остеохондроз, серьезные нагрузки на позвоночник, нарушение обмена веществ – вот что провоцирует появление изменений в межпозвонковых дисках. Межпозвонковый диск получает все питательные вещества из соседних тканей с помощью диффузии, так как в самом диске кровеносные сосуды отсутствуют. Он состоит из пульпозного (студенистого) ядра и окружающего его фиброзного кольца. Когда обмен веществ прекращается, начинаются дистрофические изменения в фиброзном кольце, что приводит к его утоньшению, потере эластичности и появлению трещин, а пульпозное ядро начинает медленно перемещаться в сторону. Когда студенистое ядро достигает края диска, оно начинает выходить за его пределы, растягивая волокна фиброзного кольца. Так образуется протрузия. Если фиброзное кольцо разрывается, то протрузия начинает считаться грыжей.
Для описания протрузий и грыж используется сложная локализация. Структура шаблона для них одинаковая:
<template>
<insertion-picture id="3" is-short="true" selection-color="#FFB6AC" />
<measurement id="2622" is-short="true" comment="Структура"/>
<line is-short="true">
<measurement id="8821" measurement-name="Расположение" comment="Расположение переднеезаднее"/>
<measurement id="8822" max-width="70" empty-name="true" comment="Расположение латеральное"/>
<measurement id="8823" empty-name="true" comment="Расположение сегментное"/>
</line>
<measurement id="2624" is-short="true" comment="Размер выпячивания диска"/>
<anatomy-comment comment-id="279" comment-type="comment" spacing-before="NONE"/>
</template>
Часть шаблона МРТ грудного отдела позвоночника:
<insertion-place>
<insertion-template-builder anatomy-width="145" name-width="28" status-width="30" localization-width="150" found-date-width="55" template-builder-width="45" anatomy-id="901" localization-id="869, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1450" id="582,542" use-template-builder-name="true" localization-marker-type="icon"/>
</insertion-place>
В атрибуте id значение 582 – номер шаблона протрузии, а 542 – грыжи. Анатомия 901 (атрибут anatomy-id) – грыжа межпозвонкового диска.
Рассмотрим шаблон УЗИ «мягкие ткани и лимфоузлы шеи, слюнные железы», где можно описать подъязычную слюнную железу.
<template>
<line is-short="false" comment="Справа-Слева">
<text text-label=" " />
<text text-label="справа" max-width="193" is-color-selection="true"/>
<text text-label="слева" max-width="193" is-color-selection="true"/>
</line>
<line is-short="false">
<measurement id="3969" comment="Структура подъязычных слюнных желез справа" />
<measurement id="3981" max-width="193" empty-name="true" comment="слева" />
</line>
<line is-short="false">
<measurement id="3970" comment="Контуры подъязычных слюнных желез справа" />
<measurement id="3982" max-width="193" empty-name="true" comment="слева" />
</line>
<line is-short="false">
<measurement id="3971" comment="Эхогенность подчелюстных слюнных желез справа" />
<measurement id="3983" max-width="193" empty-name="true" comment="слева" />
</line>
<line is-short="false">
<measurement id="3972" comment="Сосудистый рисунок подчелюстных слюнных желез справа" />
<measurement id="3984" max-width="193" empty-name="true" comment="слева" />
</line>
<line is-short="false">
<measurement id="3973" comment="Выводные протоки подъязычных слюнных желез справа" />
<measurement id="3985" max-width="193" empty-name="true" comment="слева" />
</line>
<line is-short="false">
<measurement id="12481" comment="Размер подъязычных слюнных желез справа" />
<measurement id="12501" max-width="193" empty-name="true" comment="слева" />
</line>
<anatomy-comment comment-id="379" is-conclusion="false" spacing-before="NONE" comment="к подъязычным слюнным железам" />
</template>
<template>
<line>
<anatomy id="1261" font-size="10" font-bold="true" font-underline="false" is-short="false" comment="Мягкие ткани шеи" />
<measurement id="3861" comment="Структура мягких тканей шеи" />
</line>
<line is-short="false" comment="Справа-Слева">
<text text-label=" " />
<text text-label="справа" max-width="193" is-color-selection="true"/>
<text text-label="слева" max-width="193" is-color-selection="true"/>
</line>
<template-builder id="597" comment="Подчелюстные слюнные железы"/>
<template-builder id="598" comment="Околоушные слюнные железы"/>
<insertion-place>
<insertion-template-builder anatomy-width="180" need-template-builder="false" anatomy-id="1283" id="599" comment="Подъязычные слюнные железы"/>
<insertion-template-builder anatomy-width="180" need-template-builder="false" anatomy-id="1307" id="595 comment="Лимфатические узлы"/>
</insertion-place>
<anatomy-comment comment-id="111"/>
<conclusion-label spacing-before="HALF"/>
<anatomy-comment comment-id="51" comment-type="conclusion"/>
</template>
Рассмотренный ранее рефлекс Бауэра [2] находится во вставке с рефлексами детей до года.
Шаблон вставки:
<template>
<line>
<measurement id="8621" comment="Сосательный рефлекс" />
<measurement id="8622" comment="Поисковый рефлекс" />
</line>
<line>
<measurement id="8623" comment="Хоботковый рефлекс" />
<measurement id="8624" comment="Ладонно-ротовой рефлекс" />
</line>
<line>
<measurement id="8625" comment="Рефлекс Моро" />
<measurement id="8626" comment="Хватательный рефлекс" />
</line>
<line>
<measurement id="8627" comment="Защитный рефлекс" />
<measurement id="8628" comment="Рефлекс Галанта" />
</line>
<line>
<measurement id="8629" comment="Рефлекс Бауэра" />
<measurement id="8630" comment="Опорно-шаговый рефлекс" />
</line>
</template>
Часть шаблона осмотра врача-педиатра:
<insertion-place>
<!-- Измерения для детей до года -->
<insertion-template-builder font-bold="false" font-underline="true" need-template-builder="false" name-overriden-button="Измерения для детей до года" name-overriden="Измерения для детей до года" anatomy-width="200" id="921"/>
<!-- Рефлексы детей до года -->
<insertion-template-builder font-bold="false" font-underline="true" need-template-builder="false" name-overriden-button="Рефлексы детей до года" name-overriden="Рефлексы детей до года" anatomy-width="200" id="922"/>
</insertion-place>
Разберемся с добавлением подтверждающего теста для гепатита С. Шаблон самого теста:
<template>
<measurement id="2365" comment="Подтверждающий тест на антитела к вирусу гепатита С (Anti HCV)"/>
<measurement id="2362" comment="Антитела к структурному белку Core вируса гепатита С (Anti HCV-Core)"/>
<measurement id="2381" comment="Антитела к неструктурному белку NS3 вируса гепатита С (Anti HCV-NS3)"/>
<measurement id="2363" comment="Антитела к неструктурному белку NS4 вируса гепатита С (Anti HCV-NS4)"/>
<measurement id="2364" comment="Антитела к неструктурному белку NS5 вируса гепатита С (Anti HCV-NS5)"/>
</template>
Шаблон «Антитела к вирусу гепатита С (Anti HCV)»:
<template>
<measurement id="90" comment="Гепатит С (Anti HCV) IgG"/>
<insertion-place>
<insertion-template-builder font-bold="false" font-underline="true" need-template-builder="false" anatomy-width="180" name-overriden="Гепатит С. подтверждающий тест" id="572"/>
</insertion-place>
<anatomy-comment comment-id="355" comment-type="comment" spacing-before="NONE" comment="Кровь. Антитела к Гепатиту С"/>
</template>
Как известно, человек может адаптироваться к жизни без некоторых органов. Однако история помнит времена, когда в умах учёных возникали дикие мысли о «лишних органах», которые не влияют на жизнедеятельность организма и подлежат удалению, и печальные последствия их воплощения в реальности. Так в конце XIX – начале XX века эта идея достигла своего апогея.
Немецкий анатом Роберт Видерсгейм в работе «Строение человека со сравнительно-анатомической точки зрения» (1890 г.) дал обширный список рудиментарных органов. К ранее рассмотренным Дарвином добавились миндалины, щитовидная железа, слёзные железы, некоторые клапаны вен и т. д.
Русский биолог Илья Ильич Мечников в своем труде «Этюды о природе человека» (1913 г.) упоминает работы Дарвина и Видерсгейма, а также рассуждает о несовершенстве и дисгармонии человеческого организма. Одна из глав посвящена пищеварительной системе, где упоминается бесполезность аппендикса и всячески отвергается предположение, высказанное голландским врачом Кольбругге, о полезности червеобразного отростка (аппендикса), так как там развивается кишечная бактерия, предохраняющая организм от некоторых болезней пищеварительной системы. Однако никаких весомых доказательств Кольбругге в пользу своей теории не предъявлял. В опалу Мечникова попала и толстая кишка, полезные функции которой сводились к минимуму, а вот проблемы, связанные с ней, наоборот, весьма подробно рассматривались (запоры, всасывание вредных веществ, очаг опасных болезней и частое место злокачественных опухолей). Поэтому, на взгляд Мечникова, удаление этого органа в целом привело бы к положительным результатам. Хоть сам ученый и не проверял свое утверждение, но оно нашло подтверждение в практике некоторых хирургов, проводивших подобные операции. Были и врачи, которые с большим энтузиазмом отнеслись к его словам и отрезали орган порой без всякой необходимости. Однако не все пациенты выживали или могли продолжить свою обычную жизнь. Только через десятилетия подобный метод лечения подвергся серьезной критике.
Идея заблаговременного удаления аппендикса многим врачам пришлась по вкусу, так как от аппендицита умирало немало пациентов. Не стеснялись удалять и миндалины с гландами. Наибольшее распространение идея удаления этих органов у детей в раннем возрасте получила в Европе и США. Однако спустя некоторое время специалистами были осознаны их ошибки. Дети без аппендикса плохо усваивали материнское молоко, отставали в развитии, чаще болели и испытывали проблемы с пищеварением. Врачам было не понятно, почему так происходило. Только в 2007 году американские ученые из университета Дьюка (Duke University) выяснили, что в аппендиксе находятся бактерии необходимые для нормальной работы кишечника. Роль миндалин и гланд узнали также позже, а до того момента врачи заметили, что дети без них чаще остальных подвержены болезням бронхов и легких.
В целом развитие идеи «лишних» органов можно объяснить банальным незнанием о работе и функциях предполагаемых рудиментов.
Порой практиковались достаточно странные методы лечения некоторых заболеваний. Некоторые из них основывались на удалении органов. Например:
На сегодняшний день к удалению органов и анатомических частей тела (эктомии) врачи прибегают только в крайних случаях: травмы или серьезные патологии. Удален может быть как и один из парных органов (глаз, почка, легкое и т. п.) в случае нормальной работы другого, так и непарный. К последним относятся:
Для фиксирования информации об удаленном органе или анатомической части тела был добавлен тег anatomy-status.
Представляет собой выпадающий список из трех статусов: есть, нет, не визуализируется. Для корректного отображения протокола исследования необходимо учитывать особенности языка. Так для каждого рода и числа можно отдельно настроить варианты статусов, а для анатомии – нужный список. Например:
Кроме очевидных статусов есть/нет был добавлен «не визуализируется». Как видно из названия его применяют в тех случаях, когда какой-то орган не видно при обследовании. Например, из-за скопления газов в кишечнике может быть не видно некоторые органы брюшной полости.
В целом, сущность со статусами анатомий используется не только для тега anatomy-status и удаляемых органов, но и во вставках с типом «образование». Например:
Тег anatomy-status работает следующим образом: при выборе статусов «нет» и «не визуализируется» убираются все измерения, которые относятся к этой анатомии, и остается строка с названием анатомии и её статусом. Для того чтобы это сработало, весь код, относящийся к удаляемой анатомии, выделяют в отдельный шаблон и прописывают ссылку на него (тег template-builder) в основном шаблоне.
Когда для анатомии выставляют статус «нет» или «не визуализируется», она сохраняется в anatomy-addon.
Таким образом, в сущность anatomy-addon могут попасть следующие анатомии:
Тег anatomy-status содержит несколько атрибутов:
Шаблон УЗИ щитовидной железы является одним из тех шаблонов, которые претерпели значительные структурные изменения в ходе разработки системы.
<template image-id="5" need-warning="true" image-position="left-top-corner">
<anatomy id="22" font-size="10" font-bold="true" font-underline="false" is-short="true" comment="Щитовидная железа" />
<line is-short="true" spacing-before="HALF">
<measurement id="310" max-width="156" comment="Эхоструктура"/>
<measurement id="341" max-width="156" comment="Эхогенность"/>
</line>
<line is-short="true">
<measurement id="308" max-width="156" comment="Расположение"/>
<measurement id="342" max-width="156" comment="Контуры"/>
</line>
<anatomy id="24" font-size="10" font-bold="false" font-underline="false" anatomy-name="Размеры правой доли щитовидной железы:" is-short="true" spacing-before="HALF"/>
<measurement-group id="2" is-short="true" is-color-selection="true"/>
<anatomy id="23" font-size="10" font-bold="false" font-underline="false" anatomy-name="Размеры левой доли щитовидной железы:" is-short="true" spacing-before="HALF"/>
<measurement-group id="1" is-short="true" is-color-selection="true"/>
<measurement id="307" is-short="true" measurement-name="Толщина перешейка"spacing-before="HALF"/>
<measurement id="309" measurement-name="Объем долей щитовидной железы"/>
<anatomy-comment comment-id="9" is-conclusion="false" spacing-before="HALF"/>
<anatomy-comment comment-id="8" is-conclusion="true" spacing-before="HALF"/>
</template>
<template image-id="5" need-warning="true" image-position="left-top-corner">
<anatomy id="22" font-size="10" font-bold="true" font-underline="false" is-short="true" comment="Щитовидная железа"/>
<line is-short="true" spacing-before="HALF">
<measurement id="310" max-width="156" comment="Эхоструктура"/>
<measurement id="341" max-width="156" comment="Эхогенность"/>
</line>
<line is-short="true">
<measurement id="308" max-width="156" comment="Расположение"/>
<measurement id="342" max-width="156" comment="Контуры"/>
</line>
<template-builder id="253" is-short="true"/>
<template-builder id="254" is-short="true"/>
<measurement id="307" is-short="true" measurement-name="Толщина перешейка" spacing-before="HALF" />
<measurement id="309" measurement-name="Объем долей щитовидной железы"/>
<insertion-place>
<!-- узел -->
<insertion-template-builder anatomy-id="1041" anatomy-width="100" name-width="136" need-template-builder="false" localization-id="23,1021,1022,1023,24,1024,1025,1026,25" need-status="false" localization-width="177" localization-marker-type="word" id="578"/>
<insertion-template-builder anatomy-id="1042" anatomy-width="100" name-width="136" need-template-builder="false" localization-id="23,1021,1022,1023,24,1024,1025,1026,25" need-status="false" localization-width="177" localization-marker-type="word" id="580"/>
<!-- киста -->
<insertion-template-builder anatomy-id="821" anatomy-width="100" name-width="136" need-template-builder="false" localization-id="23,1021,1022,1023,24,1024,1025,1026,25" need-status="false" localization-width="177" localization-marker-type="word" id="538"/>
<insertion-template-builder anatomy-id="822" anatomy-width="100" name-width="136" need-template-builder="false" localization-id="23,1021,1022,1023,24,1024,1025,1026,25" need-status="false" localization-width="177" localization-marker-type="word" id="540"/>
<!-- Кровоток -->
<insertion-template-builder font-bold="false" font-underline="true" need-template-builder="false" anatomy-width="180" name-overriden="Кровоток сосудов щитовидной железы" id="537"/>
</insertion-place>
<anatomy-comment comment-id="9" comment-type="comment" spacing-before="HALF"/>
<conclusion-label spacing-before="HALF"/>
<anatomy-comment comment-id="8" comment-type="conclusion"/>
</template>
Правая доля:
<template>
<line is-short="true">
<anatomy id="24" font-size="10" font-bold="true" font-underline="false" spacing-before="HALF" comment="Правая доля"/>
<anatomy-status anatomy-id="24" />
</line>
<measurement-group id="2" is-color-selection="true" is-short="true"/>
</template>
Левая доля:
<template>
<line is-short="true">
<anatomy id="23" font-size="10" font-bold="true" font-underline="false" spacing-before="HALF" comment="Левая доля"/>
<anatomy-status anatomy-id="23" />
</line>
<measurement-group id="1" is-color-selection="true" is-short="true"/>
</template>
Когда мы начинали, шаблон каждого протокола исследования состоял из комментария и заключения. Стремление к формализации вылилось в первую очередь в создание системы хранения числовых данных и описание анатомий человека. В итоге комментарии уменьшились и стали использоваться в качестве пояснений к основным данным.
Если присмотреться к заключениям, то среди информации, которая обычно туда попадает, можно выделить следующие типы данных:
Таким образом, заключение осталось «логовом» неформализованной информации. Поэтому дальнейшее развитие системы хранения медицинских данных направлено на формализацию этих сущностей.
Автор: tikale
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/292016
Ссылки в тексте:
[1] рассмотренные ранее теги и их атрибуты: https://habr.com/company/inobitec/blog/416645/
[2] Рассмотренный ранее рефлекс Бауэра: https://habr.com/company/inobitec/blog/412747/#reflex_bayer
[3] Источник: https://habr.com/post/422483/?utm_source=habrahabr&utm_medium=rss&utm_campaign=422483
Нажмите здесь для печати.