Руководство к использованию стандарта FHIR в ЦИСЗ
0.2.6803 - ci-build
Инструкция по обработке ответов сервера FHIR R5 для интеграции с МИС
Данная инструкция предоставляет разработчикам медицинских информационных систем структурированное описание форматов и сценариев обработки ответов ЦИСЗ. Цель — обеспечить корректную интерпретацию HTTP-статусов, заголовков и тел ответов для построения устойчивой и соответствующей стандарту интеграции.
Первичным и основным источником информации является официальная документация HL7 FHIR R5.
Данная инструкция является адаптированным и структурированным руководством по взаимодействию с ЦИСЗ.
Каждый ответ сервера состоит из трех ключевых компонентов:
Status Code);Headers);Body).Понимание этой структуры обязательно для корректной обработки как успешных операций, так и ошибок.
Headers)Сервер FHIR использует стандартные и специфические HTTP-заголовки для передачи метаинформации. Некоторые из них являются обязательными для определенных операций.
Content-Type: обязателен при наличии тела ответа. Указывает формат данных. Должен соответствовать запрошенному в заголовке Accept клиента или формату по умолчанию (application/fhir+json).
Пример: Content-Type: application/fhir+json; charset=utf-8.
Date: содержит дату и время (в формате HTTP-даты) создания сообщения, то есть момент, когда сервер сгенерировал и отправил ответ.
Date: <день-недели>, <день> <месяц> <год> <часы>:<минуты>:<секунды> GMT.секунды>минуты>часы>год>месяц>день>день-недели>
Пример: Tue, 15 Nov 2025 12:45:26 GMT.
Last-Modified: указывает дату и время последнего изменения ресурса (соответствует Resource.meta.lastUpdated). Может использоваться для кэширования. Формат: RFC-1123.
Пример: Last-Modified: Tue, 15 Nov 2025 12:45:26 GMT.
| Код | Значение в контексте FHIR | Типичный сценарий |
|---|---|---|
200 OK |
Успешное выполнение операции, не приводящей к созданию новой версии ресурса | Выполнение операции $status, и как результат - получение ресурса Parameters (ProcessingStatus операции может иметь любые значения: как Succesed, так и Failed) |
201 Created |
Успешное создание нового ресурса. Сервер присваивает ресурсу логический id и версию. | Создание нового ресурса в результате операции create (POST [FHIR_BASE]/[resource-type]) |
202 Accepted |
Успешное выполнение операции | Запуск асинхронных операций (например, $import), когда результат будет доступен позже. Ответ содержит ресурс Parameters с начальным статусом (например, Pending) |
400 Bad Request |
Неверный запрос. Сервер не может обработать запрос из-за клиентской ошибки (ошибка синтаксиса, неверные параметры) | Некорректный JSON, неизвестный параметр поиска, неверное значение параметра |
401 Unauthorized |
Требуется аутентификация | Отсутствует, неверен или просрочен токен доступа |
403 Forbidden |
Доступ запрещен | У клиента нет необходимых прав для выполнения данной операции с данным ресурсом |
404 Not Found |
Ресурс не найден | Ресурс с указанным id не существует, тип ресурса не поддерживается сервером или конечная точка (endpoint) не найдена. Если поисковый запрос вернул 0 результатов, возвращается Bundle типа searchset с total = 0, а не 404 Not Found |
405 Method Not Allowed |
HTTP-метод не поддерживается для данного URI | Использование метода, не указанного в CapabilityStatement |
406 Not Acceptable |
Сервер не может вернуть представление ресурса в формате, запрошенном в параметре _format или header: Accept | Клиент запросил xml, но сервер поддерживает только JSON, или запрошен несуществующий MIME-тип. |
408 Request Timeout |
Таймаут запроса | Сервер решил разорвать соединение из-за длительного времени выполнения запроса клиентом (например, при передаче большого тела) |
409 Conflict |
Конфликт версий при обновлении | Операция выполнена с устаревшей версией ресурса |
410 Gone |
Ресурс удален | Запрошен ресурс или конкретная версия ресурса, которая была удалена |
413 Request Entity Too Large |
Тело запроса превышает лимит, установленный сервером | Попытка загрузить слишком большой ресурс Bundle |
415 Unsupported Media Type |
Сервер не поддерживает формат данных, указанный в заголовке Content-Type запроса |
Клиент отправил тело в формате XML, а сервер принимает только JSON, или указан неверный MIME-тип |
500 Internal Server Error |
Внутренняя ошибка сервера | Непредвиденная ошибка на стороне сервера, не связанная с корректностью запроса клиента |
503 Service Unavailable |
Сервис временно недоступен | Сервер перегружен или находится на техническом обслуживании |
Тело ответа (ресурс, пакет Bundle или операционный исход OperationOutcome).
Успешное выполнение операции, которая не приводит к созданию новой версии ресурса на сервере. Тело ответа практически всегда присутствует.
Типичные сценарии и формат тела:
Получение информации о пациенте (GET [FHIR_BASE]/[resource-type]/[id]).
Тело ответа: единичный ресурс FHIR (например, Patient, Observation).
Пример:
GET [FHIR_BASE]/Patient/example-id
HTTP/1.1 200 OK
Content-Type: application/fhir+json; charset=utf-8
Date: Mon, 01 Jan 2024 12:00:00 GMT
...
{
"resourceType": "Patient",
"id": "example-id",
"meta": { ... },
"active": true,
"name": [ ... ]
// ... остальные поля ресурса
}
Действия клиента: не требуются.
Поиск информации о пациенте (GET [FHIR_BASE]/[resource-type]?[parameters]).
Тело ответа: ресурс Bundle с типом (Bundle.type) searchset. Содержит массив найденных ресурсов в Bundle.entry. Даже при 0 результатах возвращается пустой Bundle, а не ошибка 404 Not Found.
Пример:
GET [FHIR_BASE]/Patient?name=Иван
HTTP/1.1 200 OK
Content-Type: application/fhir+json; charset=utf-8
Date: Mon, 01 Jan 2024 12:00:00 GMT
{
"resourceType": "Bundle",
"type": "searchset",
"total": 42,
"link": [
{
"relation": "self",
"url": "https://internal.cisz.by/api/fhir/Patient?name=Иван"
}
],
"entry": [
{ "resource": { "resourceType": "Patient", "id": "pt1", ... } },
{ "resource": { "resourceType": "Patient", "id": "pt2", ... } }
...
]
}
Действия клиента: не требуются.
Операции ($status, $cancel, $get-document-id).
Тело ответа: ресурс Parameters.
КРИТИЧЕСКИ ВАЖНО: код 200 OK указывает только на успешный приём и выполнение логики операции сервером. Итоговый бизнес-результат операции (успех или неудача) содержится внутри тела ответа Parameters в выходных параметрах (например, в параметре ProcessingStatus).
Пример для $status:
GET [FHIR_BASE]/Bundle/[bundle-id]/$status
HTTP/1.1 200 OK
Content-Type: application/fhir+json; charset=utf-8
Date: Mon, 01 Jan 2024 12:00:00 GMT
{
"resourceType": "Parameters",
"parameter": [
{
"name": "ProcessingStatus",
"valueCode": "Failed" // Бизнес-логика завершилась ошибкой
},
{
"name": "StatusDescription",
"resource": { // Детали ошибки в OperationOutcome
"resourceType": "OperationOutcome",
"issue": [ ... ]
}
}
]
}
Действия клиента: в зависимости от содержимого ответа. Для операции $status, где ProcessingStatus = Failed, необходимо проверить Bundle, который не импортировался, исправить ошибки и повторить импорт.
Успешное создание нового ресурса в результате операции create (POST [FHIR_BASE]/[resource-type]). Сервер присваивает ресурсу логический id и версию.
Обязательные заголовки:
Location: абсолютный URL созданного ресурса, включая его версию;ETag: номер версии созданного ресурса.Формат тела: обычно содержит созданный ресурс с присвоенными сервером полями id и meta.versionId. Может отличаться от отправленного запросом, если сервер добавил или модифицировал данные.
POST [FHIR_BASE]/Resource
HTTP/1.1 201 Created
Location: https://[FHIR_BASE]/Resource/example-id/_history/1
ETag: W/"1"
Content-Type: application/fhir+json
{
"resourceType": "Resource",
"id": "new-resource-id", // ID присвоен сервером
"meta": {
"versionId": "1",
"lastUpdated": "2025-01-01T12:00:00Z"
},
"status": "..."
// ...
}
Действия клиента: не требуются.
Запрос принят на асинхронную обработку. Это характерно для долгих операций, таких как $import.
Ключевые особенности:
Parameters, который включает параметры для отслеживания статуса (например, OperationStatusReference, ResourceId). На данном этапе статус обработки (ProcessingStatus) обычно имеет значение Pending;$status с ResourceId), чтобы получить окончательный результат.POST [FHIR_BASE]/Bundle/$import
HTTP/1.1 202 Accepted
Content-Type: application/fhir+json; charset=utf-8
Date: Mon, 01 Jan 2024 12:00:00 GMT
{
"resourceType": "Parameters",
"parameter": [
{
"name": "ProcessingStatus",
"valueCode": "Pending"
},
{
"name": "transactionTime",
"valueInstant": "2024-01-01T12:00:00Z"
}
]
}
Действия клиента: в зависимости от ответа и выполняемой операции. При $import и processingStatus = Pending, необходимо выполнить операцию $status через 10 секунд после получения ответа.
Даже в случае ошибок (коды 4xx и 5xx) структура ответа предсказуема. Сервер возвращает в теле ответа ресурс OperationOutcome со структурированным описанием проблемы. Клиентское приложение должно быть готово парсить OperationOutcome для любых ответов (в том числе и 200 ОК).
Запрос является семантически или синтаксически некорректным, и сервер не может его обработать.
Типичные сценарии:
_profile для поиска);_count);Bundle для импорта - несоответствие профилям, описанным в руководстве).HTTP/1.1 400 Bad Request
Content-Type: application/fhir+json; charset=utf-8
Date: Thu, 22 Jan 2026 10:58:11 GMT
{
"resourceType": "OperationOutcome",
"id": "40520d3e-b868-4618-ac5c-a0ec7c98cec6",
"meta": {
"lastUpdated": "2026-01-22T10:58:12.196055+00:00"
},
"issue": [
{
"severity": "error",
"code": "invariant",
"details": {
"coding": [
{
"system": "http://hl7.org/fhir/dotnet-api-operation-outcome",
"code": "1012"
},
{
"system": "http://fire.ly/dotnet-sdk-operation-outcome-structdef-reference",
"code": "Bundle(https://fhir.by/AbstractArea/StructureDefinition/Bundle/MedicationDocument)"
}
],
"text": "Instance failed constraint bdl-9 \"Документ должен иметь identifier с system и value\""
},
"diagnostics": "Resource was validated using fhir.by package with version 0.2.5810",
"expression": [
"Bundle, element Bundle(https://fhir.by/AbstractArea/StructureDefinition/Bundle/MedicationDocument)"
]
}
]
}
В элементе OperationOutcome.issue.details.text указана причина возникшей ошибки.
ВАЖНО: для некоторых случаев OperationOutcome будет содержать несколько .issue и следующие значения issue[0].text:
"Referenced resource '' does not validate against any of the expected target profiles (https://fhir.by/StructureDefinition/PatientWithIdentificationNumber, https://fhir.by/StructureDefinition/PatientWithoutIdentificationNumber, https://fhir.by/StructureDefinition/AnonymousPatientBy)."
Как правило, валидатор не смог верно обработать вложенный ресурс и соответственно не сопоставил его с профилем, описанным в руководстве. Причиной этого могла послужить ошибка, описанная в issue с индексом 1. Исправление ошибок должно быть последовательным, начиная с issue[1]. Для отладки рекомендовано использовать операцию /Bundle/$validate в соответствующем окружении и с соответствующей версией (указывается в OperationOutcome.issue.diagnostics для операции $import или $validate).
OperationOutcome.issue содержат элементы severity и code. Возможно их использование для автоматической обработки ошибок, возникающих при импорте ресурсов. Описание кодов на сайте стандарта.
Часто встречающиеся значения для severity:
| Код | Сообщение на русском |
|---|---|
fatal |
Проблема привела к сбою действия, дальнейшая проверка не может быть выполнена |
error |
Проблема достаточно серьезная, чтобы вызвать сбой обработки |
warning |
Проблема недостаточно важна, чтобы вызвать сбой обработки, но может привести к его выполнению неоптимально или не так, как ожидалось |
information |
Проблема не связана со степенью успешности обработки |
success |
Успешное выполнение обработки |
Часто встречающиеся значения для code:
| Код | Сообщение на русском |
|---|---|
invalid |
Содержимое не соответствует спецификации или профилю |
invariant |
Не прошло правило (ограничение) проверки содержимого |
processing |
Проблемы обработки. Считается, что они окончательны, например, нет смысла повторно отправлять то же самое содержимое без изменений |
code-invalid |
Код или справочник не могут быть распознаны, или они недействительны в контексте конкретного ValueSet |
Существует набор кодов для OperationOutcome.issue.details.coding.code.
Часто встречающиеся значения для OperationOutcome.issue.details.coding.code:
| Код | Сообщение на русском | Пояснение |
|---|---|---|
| 1009 | Значение “А” не соответствует определенному паттерну “В” | Может возникать при несоответствии в кодах, ссылках, строчных или числовых значениях, там где они явно определены в профиле |
| 1011 | Ресурс не соответствует ни одному из ожидаемых целевых профилей | Ошибка, как правило, возникает в случае, если по каким либо причинам вложенный в Bundle ресурс не был провалидирован |
| 1012 | Экземпляр не прошел ограничение (Constraint) “Название ограничения”/”Описание ограничения” |
Нарушение бизнес-правил или правил импорта ресурсов, описанных в профиле |
| 1026 | Элемент не соответствует ни одному срезу и группа является закрытой | Нарушение правил для среза (slice), определенных в профиле ресурса |
| 1028 | Количество экземпляров элементов равно N, что не соответствует указанной кардинальности A..B | Нарушение правил профиля в отношении обязательности элементов в ресурсе - отсутствие, несоблюдение необходимого количества элементов |
| 4000 | Не удалось найти профиль “Resource.meta.profile=uri_профиля” | Попытка валидировать ресурс с укзанием в элементе Resource.meta.profile верного по структуре URI но ссылающего на несуществующий профиль в данной версии пакета |
| 6007 | Неверный ValueSet identifier (идентификатор справочника в элементе system), должен быть “верный URI справочника” |
Указан неверный URI справочника, который определен правилами профиля |
Для ошибок, возникающих при импорте при нарушении схемы JSON, будут возвращаться OperationOutcome, не содержащие конкретных кодов ошибок или явного указания проблемы, но в OperationOutcome.issue.diagnostics будет указана локализация проблемы.
Пример: попытка импорта ресурса Bundle с meta.profile с пустым массивом:
HTTP/1.1 400 Bad Request
Content-Type: application/fhir+json; charset=utf-8
Date: Thu, 22 Jan 2026 12:29:48 GMT
{
"resourceType": "OperationOutcome",
"id": "246e1693-b6c4-4ee6-ac9d-b5c97f15a63a",
"meta": {
"lastUpdated": "2026-01-22T12:29:48.9783401+00:00"
},
"issue": [
{
"severity": "error",
"code": "invalid",
"diagnostics": "One or more errors occurred. (An array needs to have at least one element. At Bundle.meta.profile[0], line 6, position 10)"
}
]
}
Действия клиента: необходимо исправить запрос и/или содержимое запроса.
Запрос требует аутентификации пользователя. Заголовок WWW-Authenticate: должен быть предоставлен, должен указывать на схему аутентификации.
Типичные сценарии:
Authorization;OAuth2 Bearer token);HTTP/1.1 401 Unauthorized
Content-Type: application/fhir+json; charset=utf-8
Date: Thu, 22 Jan 2026 10:58:11 GMT
{
"resourceType": "OperationOutcome",
"id": "7d42ddfe-10af-47fd-907c-1a1b7eeea833",
"issue": [
{
"severity": "error",
"code": "login",
"diagnostics": "Authentication failed."
}
]
}
Действия клиента: необходимо проверить авторизационные данные.
Недостаточно прав на выполнение операции.
Типичные сценарии:
scope (право) для выполнения операции write на ресурсы типа Patient;HTTP/1.1 403 Forbiden
Content-Type: application/fhir+json; charset=utf-8
Date: Thu, 22 Jan 2026 10:58:11 GMT
{
"resourceType": "OperationOutcome",
"id": "id",
"meta": {
"lastUpdated": "2026-01-22T10:58:11.0353476+00:00"
},
"issue": [
{
"severity": "error",
"code": "forbidden",
"diagnostics": "Идентификационный номер медицинского работника не соответствует номеру в подписи"
}
]
}
Сообщения в OperationOutcome.issue.diagnostics:
Composition не соответствует авторизованному пользователю.Действия клиента: необходимо проверить авторизационные данные.
Сервер не нашел ничего, соответствующего Request-URL. Не означает, что ресурс когда-либо существовал.
Типичные сценарии:
GET [FHIR_BASE]/Patient/nonexistent-id);GET [FHIR_BASE]/UnsupportedResource);POST [FHIR_BASE]/Patient/$unknown-operation).ВАЖНО: пустой результат поиска (GET [FHIR_BASE]/Patient?identifier=unknown) не является ошибкой 404 Not Found. В этом случае возвращается 200 OK с пустым Bundle типа searchset.
Пример: ответ при неверно указанном Request-URL:
HTTP/1.1 404 Not Found
Content-Type: application/fhir+json; charset=utf-8
Date: Thu, 22 Jan 2026 10:58:11 GMT
{
"resourceType": "OperationOutcome",
"id": "6e9814b7-11a1-433d-829c-1d67ec789ed0",
"issue": [
{
"severity": "error",
"code": "not-found",
"diagnostics": "The requested route was not found."
}
]
}
Действия клиента: необходимо исправить запрос и/или содержимое запроса.
Сервер не поддерживает данный запрос.
HTTP/1.1 405 Not Allowed
Content-Type: text
Date: Thu, 22 Jan 2026 10:58:11 GMT
Действия клиента: необходимо исправить запрос
Сервер не может вернуть представление ресурса в формате, запрошенном в параметре _format.
Пример: клиент запросил неподдерживаемый параметр:
HTTP/1.1 406 NotAcceptable
Content-Type: application/fhir+json; charset=utf-8
Date: Thu, 22 Jan 2026 12:23:44 GMT
{
"resourceType": "OperationOutcome",
"id": "b439d496-bf9c-4387-9da0-45e70ec4b5b9",
"meta": {
"lastUpdated": "2026-01-22T12:23:44.9743964+00:00"
},
"issue": [
{
"severity": "error",
"code": "not-supported",
"diagnostics": "The requested \"_format\" parameter is not supported."
}
]
}
Действия клиента: необходимо исправить запрос.
Указывает на конфликт, связанный с текущим состоянием целевого ресурса.
Типичный сценарий: клиент пытается обновить ресурс (PUT [FHIR_BASE]/Resource/[id]) с устаревшей версией.
Действия клиента: необходимо исправить запрос и/или содержимое запроса.
Запрашиваемый ресурс больше недоступен на сервере и не будет доступен в будущем. Это намеренное и постоянное удаление.
Действия клиента: необходимо исправить запрос и/или содержимое запроса.
Общая ошибка сервера, когда он столкнулся с ситуацией, которую не может обработать, и не может дать более конкретный код ответа.
HTTP/1.1 500 Internal Server Error
Content-Type: text/html
Date: Thu, 22 Jan 2026 12:23:44 GMT
<html>
<head>
<title>500 Internal Server Error</title>
</head>
<body>
<center>
<h1>500 Internal Server Error</h1>
</center>
<hr><center>nginx/1.25.4</center>
</body>
</html>
Сервер временно не может обработать запрос из-за перегрузки или проведения плановых технических работ. Ситуация является временной.
HTTP/1.1 503 Service Unavailable
Content-Type: text/plain
Date: Thu, 22 Jan 2026 12:23:44 GMT
upstream connect error or disconnect/reset before headers. reset reason: connection termination
Для корректной обработки ответов FHIR-сервера клиентское приложение должно уметь интерпретировать два ресурса: OperationOutcome (для сообщений об ошибках и дополнительной информации) и Bundle (для наборов данных, результатов поиска и пакетных операций).
Ресурс OperationOutcome используется для передачи деталей об успешном выполнении, предупреждениях или ошибках, возникших при обработке запроса. Это основной ресурс для диагностики проблем.
Cтруктура элементов:
issue (обязательно): массив, содержащий одно или несколько сообщений. Каждый элемент имеет следующую структуру:
severity (обязательно): уровень серьезности проблемы. Возможные значения:
fatal: проблема привела к полному прекращению обработки запроса. Требует вмешательства клиента для исправления запроса. Соответствует кодам 4xx (кроме 429);error: проблема привела к неудачному завершению операции, но обработка в целом была возможна. Соответствует большинству кодов 4xx и некоторым 5xx;warning: операция выполнена, но могут быть нежелательные последствия. Клиенту следует обратить внимание. Соответствует кодам 200 OK или 201 Created, но с замечаниями;information: информационное сообщение, не требующее действий.code (обязательно): тип проблемы. Критически важен для автоматической обработки. Основные значения:
invalid: cодержимое запроса нарушает синтаксис или правила (базовую валидацию). Часто для кода 400;structure / required / value: нарушение структурных правил профиля FHIR (отсутствие обязательного поля, несоответствие паттерну). Для кода 422;security: проблема аутентификации/авторизации. Для кодов 401, 403;processing / not-supported / duplicate / not-found / conflict: соответствуют кодам 422, 404, 409, 405 и т.д.details (опционально): человекочитаемое описание проблемы. Поле text внутри details содержит основное сообщение;diagnostics (опционально): отладочная информация для разработчика (например, часть SQL-запроса, стек-трейс в безопасном виде). Не предназначено для конечного пользователя;location (опционально): указывает на элемент(ы) во входящем запросе, вызвавший(ие) проблему. Может содержать имя параметра (например, _count) или путь FHIR Path (например, Patient.name[0].family);expression (опционально): указывает на элемент(ы) в результирующем ресурсе, к которому(ым) относится предупреждение или информация. Используется FHIR Path.Ресурс Bundle является контейнером для набора других ресурсов, связанных с выполнением одной операции.
Как правило ресурс Bundle имеет тип searchset: результат операции поиска (search). Содержит найденные ресурсы в элементе Bundle.entry.resource. Даже при 0 результатах (total = 0) возвращается Bundle этого типа.
Структура элементов:
type (обязательно): определяет назначение Bundle (см. выше);total (опционально): общее количество совпадений по всему результату поиска (может быть больше количества ресурсов в текущей странице);link (опционально): массив ссылок для навигации, особенно для пагинации. Ключевые отношения (relation):
self: ссылка на текущую страницу результатов;next: ссылка на следующую страницу результатов (при наличии);previous: ссылка на предыдущую страницу.entry (опционально): массив записей. Каждая запись содержит:
resource: собственно ресурс FHIR (для searchset, history);response: только для transaction-response и batch-response. Содержит результат обработки одной операции из пакета:
status: HTTP-статус код, который был бы возвращен, если бы операция выполнялась отдельно (например, 201 Created);location: URL созданного/обновленного ресурса (если применимо);outcome: ресурс OperationOutcome с деталями выполнения (особенно при ошибках).Различные типы операций FHIR требуют специфического подхода к интерпретации ответов. Клиентское приложение должно корректно обрабатывать как содержимое тела ответа, так и метаданные, передаваемые через HTTP-заголовки и статусные коды.
Поиск (search):
Операция поиска выполняется через GET-запрос к коллекции ресурсов (например, GET [FHIR_BASE]/Patient?name=Иван). Ответ всегда возвращается с кодом 200 OK, если запрос синтаксически корректен.
Bundle с типом searchset, где массив entry пуст, а поле total (если присутствует) равно 0. Это не является ошибкой;next в Bundle.link. Для перехода на следующую страницу необходимо использовать предоставленный URL, не модифицируя его. Запрос следующей страницы является отдельным вызовом к серверу.Эта таблица содержит обобщение описанных здесь взаимодействий. Обратите внимание, что все запросы могут включать необязательный заголовок Accept для указания формата ответа.
| Взаимодействие | Заголовок (Content-Type) | Тело ответа (Body) | Коды состояния (Status Codes) |
|---|---|---|---|
| read | R | R: Ресурс | 200, 202, 404, 410 |
| update | R (если есть тело) | O: Ресурс | 200, 201, 202, 400, 404, 405, 409 |
| create | R (если есть тело) | O: Ресурс | 201, 202, 400, 404, 405 |
| capabilities | R | R: CapabilityStatement | 200, 202, 404 |
| (operation) | R | R: Parameters/Resource | 200, 202, 400 + варьируется в зависимости от типа операции |
Обозначения:
R — требуется (Required);
O — опционально (Optional);
N/A — не применимо (Not Applicable).