Commit Graph

81 Commits

Author SHA1 Message Date
Dor Lugasi-Gal
dd1623fadc Add Azure OpenAI support for LangExtract recognizer (#1801)
* Add Azure OpenAI support for LangExtract recognizer

* ruff

* add redundnant tests to achieve 100% coverage

* Add error handling and tests for Azure OpenAI provider initialization

* Fix Microsoft Defender secret scanning false positives

Replace test API keys with obviously fake placeholders:
- test-api-key → PLACEHOLDER_NOT_A_REAL_KEY
- test-key-123 → PLACEHOLDER_NOT_A_REAL_KEY
- env-key → PLACEHOLDER_FROM_ENV
- key → PLACEHOLDER_KEY

These are unit test mock values, not real secrets. Using
placeholder patterns that won't trigger security scanners
while maintaining test validity. All 29 tests passing.

* remove bandit

* Add bandit tool to Microsoft Security DevOps workflow

* Remove bandit from Microsoft Security DevOps workflow tools

* Update AzureOpenAILangExtractRecognizer to use deployment name from environment variable

* Refactor Azure OpenAI integration: remove legacy provider, update recognizer, and adjust tests

* Improve error handling during Azure OpenAI provider registration by logging as error and raising exception

* Refactor Azure OpenAI provider initialization logging for improved readability

* Refactor test imports in Azure OpenAI recognizer tests for improved clarity and organization

* Refactor Azure OpenAI provider tests to remove unnecessary variable assignments for improved clarity

* Refactor langextract configuration: reorder supported entities and update entity mappings for consistency

* Refactor Azure OpenAI integration: enhance documentation, improve endpoint validation, and streamline provider registration

* Refactor Azure OpenAI LangExtract Recognizer: remove unused import and clean up code formatting

* Refactor Azure OpenAI provider tests: update imports to use the correct module and remove obsolete test for langextract availability

* Refactor Azure authentication handling: consolidate credential management into azure_auth_helper and update related recognizers and tests

* Refactor Azure OpenAI recognizers: enhance module imports for registration, streamline model ID handling, and improve test coverage for credential selection

* Refactor AHDS Surrogate operator: streamline error handling by mocking Azure credentials and client, and improve code readability

* Refactor AHDS Recognizer tests: replace multiple credential mocks with a single get_azure_credential mock for improved clarity and maintainability
2025-12-04 12:11:19 +02:00
Ron Shakutai
08219e7663 Language models integration (LangExtract) (#1775)
* Add LangExtract recognizer for PII extraction

- Introduced LangExtract recognizer to enhance PII detection capabilities.
- Added configuration files for LangExtract prompts and examples.
- Implemented LangExtractRecognizer class to handle PII extraction using LangExtract.
- Created tests for LangExtract recognizer to ensure functionality and reliability.
- Added a simple standalone test script for quick validation of LangExtract setup.
- Updated pyproject.toml to include langextract as a dependency.

* refine the docs

* narrow support for oollama only

* Refactor LangExtract tests to use Ollama; remove API key dependency

* adding first draft of docker compose

* Update model_id in tests to use 'gemma2:2b' instead of 'gemini-2.5-flash'

* Refactor LangExtract documentation to focus on Ollama support; remove references to other LLM providers

* Update README to remove Ollama setup instructions and clarify integration guide reference

* Enhance Ollama installation script with progress messages and error handling; update model download method for better user feedback

* auto ruff fixes

* Enhance LangExtractRecognizer tests with real Ollama integration

- Updated `langextract_recognizer_class` fixture to create a test-specific configuration for LangExtractRecognizer, enabling it for testing.
- Refactored tests in `test_langextract_recognizer.py` to utilize the new configuration and validate the recognizer's behavior with real Ollama.
- Removed mock-based tests for LangExtract and replaced them with integration tests that check the recognizer's functionality against a running Ollama instance.
- Added tests to verify the recognizer's initialization, entity detection, and error handling when the Ollama server is unreachable.
- Ensured that only requested entities are returned and that results include analysis explanations.

* Remove unnecessary line breaks in LLM-based PII detection section of README

* Add LangExtract LLM-based PII detection test and configuration

* Improve Ollama availability check with setup attempt message

* Increase wait time for services and update healthcheck parameters for Ollama service

* Add Ollama setup for Analyzer tests and improve availability check

* Set timeout for Ollama setup in Analyzer tests to 8 minutes

* Enhance Ollama setup for Analyzer tests with improved installation and readiness checks

* Update Ollama model references from gemma2:2b to llama3.2:1b across configuration and test files

* Update model references from llama3.2:1b to gemma2:2b across configuration, scripts, and tests

* Remove 'enabled' configuration from LangExtract settings in YAML files and update tests accordingly

* Update Ollama service configuration: change port mapping and modify healthcheck command

* Refactor logging in LangExtractRecognizer: reduce verbosity and improve clarity of extraction results

* Update Ollama service configuration: modify port mapping and healthcheck command

* Update CI workflow and tests: reduce sleep duration and add environment variable for LangExtract recognizer

* Reduce sleep duration in CI workflow from 150 to 60 seconds

* Update LangExtract model references from gemma2:2b to gemma3:1b and remove obsolete installation script

* docs and prompt fixes

* finalizing the pr

* Update Ollama image to latest version and add LangExtract PII/PHI extraction examples and prompts

* fix bad example

* fix unit-tests

* refactor: clean up .env file and simplify skip_engine logic in tests

* chore: add a new line to .env file for better readability

* chore: remove unnecessary blank line from .env file

* revert .env

* intial commit

* Remove skip marker for spacy_nlp_engine fixture

* Remove skip markers for stanza and transformers NLP engine fixtures

* Remove Ollama recognizer test and update default recognizers configuration

* Remove unused Ollama recognizer configuration and update prompt file references

* Add end-to-end tests for API anonymization and redaction features

- Implemented tests for the anonymization API in `test_api_anonymizer.py`, covering various scenarios including valid requests, empty inputs, malformed requests, and custom anonymizers.
- Created integration tests in `test_api_e2e_integration_flows.py` to validate the analyze and anonymize workflow with PII detection.
- Added tests for image redaction functionality in `test_api_image_redactor.py`, ensuring proper handling of image data and error responses.
- Developed package-level tests in `test_package_e2e_integration_flows.py` to verify the functionality of the analyzer and anonymizer engines, including support for third-party recognizers.

* Remove unused Ollama recognizer imports and related tests

* Update requirements and improve Ollama recognizer availability checks in e2e tests

* Fix formatting in requirements.txt for analyzer and anonymizer dependencies

* Update Ollama model ID from gemma3:1b to gemma2:2b in configuration and tests

* gemma2:2b

* finalizing the pr

* Remove unused ABC import from lm_recognizer.py

* Fix indentation in docker-compose.yml for volumes section

* Fix line break for clarity in adding_recognizers.md

* Add timeout settings for Ollama recognizer and test cases

* Refactor timeout comment for clarity in OllamaLangExtractRecognizer

* Update Ollama model version and add configuration for LangExtract recognizer tests

* Update examples_file path in configuration for Ollama recognizer

* Remove timeout decorator from Ollama recognizer

* Add rerun settings to unit and E2E tests for improved stability

* Remove rerun settings from unit and E2E test commands for simplification

* Set max-parallel to 2 for local build and E2E tests

* Remove max-parallel setting from local build and E2E tests

* move poetry cache dir

* pr changes

* code review changes

* ruff check

* remove unused json import in test_ollama_recognizer.py

* refactor test names for clarity and consistency in test_ollama_recognizer.py

* finalizing the PR

* self code review fixes

* Refactor LangExtractRecognizer to use yaml for configuration loading

* ruff fixes

* Update error messages in OllamaLangExtractRecognizer tests for clarity

* CR comment addressed

* Remove unused variables from Jinja2 prompt rendering in LangExtractRecognizer

* exporting functionality to helpers enlarging composition

* composition

* Refactor entity mapper and langextract utilities for improved clarity and consistency

* Refactor tests to use get_langextract_module for mocking LangExtract availability

* Refactor langextract utilities to improve clarity and error handling; remove deprecated functions and update tests accordingly

* Refactor LLM utilities by simplifying docstrings and consolidating imports for improved readability and maintainability

* Update error message for missing Jinja2 installation to include poetry installation instructions

* Add Ollama recognizer configuration and tests for YAML integration

- Introduced `test_ollama_enabled_recognizers.yaml` to define recognizers including OllamaLangExtractRecognizer.
- Enhanced `test_package_e2e_integration_flows.py` with a test to validate loading of Ollama recognizer from YAML configuration.
- Updated `OllamaLangExtractRecognizer` to support configuration path and language parameters.
- Improved handling of relative paths for configuration files.

* Refactor docstrings in OllamaLangExtractRecognizer for improved clarity and formatting

* Enhance OllamaLangExtractRecognizer initialization docstring to clarify kwargs usage

* pr comments

* Refactor OllamaLangExtractRecognizer to streamline config path handling and remove redundant comments

* Refactor Ollama recognizer test to improve clarity and enhance entity detection validation

* Refactor tests for Ollama recognizer and LMRecognizer to improve exception handling and configuration validation

* Update config path for Ollama recognizer in test configuration

* Update config paths for Ollama recognizer and add test configuration for LangExtract

* Remove test configuration for Ollama LangExtract

* Remove test configuration for Ollama LangExtract recognizer

* Fix formatting in resolve_config_path function for improved readability

* Enable UsLangExtractRecognizer and update its config path

* change all configs to use gemma3:1b

* Disable Ollama LangExtract recognizer and update its configuration path

* Update langextract configuration paths to use absolute paths for prompt and examples files

* Remove test script for Ollama recognizer configuration loading

* Refactor config loading in examples and prompt loaders to use resolve_config_path; update logging level in LMRecognizer; add langextract availability check in OllamaLangExtractRecognizer.

* Refactor parameter description in load_yaml_examples and clean up imports in prompt_loader

* Update langextract paths to use repo-root-relative paths in tests and prompt loader

* Enhance documentation for Ollama setup and improve __init__.py imports for clarity and maintainability

* code review changes

* pr comments & align to main

---------

Co-authored-by: Tamir Kamara <26870601+tamirkamara@users.noreply.github.com>
Co-authored-by: Sharon Hart <sharonh.dev@gmail.com>
2025-11-30 15:22:10 +02:00
Dor Lugasi-Gal
152ee24a1e AHDS authentication security with ChainedTokenCredential and add CodeQL suppression (#1763)
* adding codeql exemption

* fix: Update comments for DefaultAzureCredential usage in AHDS recognizers

* shorter message

* fix: Enhance authentication setup for AHDS integration with secure-by-default approach
2025-10-28 11:37:35 +02:00
Copilot
bef0470ff2 Update Python version support: Remove 3.9 (EOL), Add 3.13 (#1741) 2025-10-17 00:04:59 +03:00
Tamir Kamara
e480d3fa68 Update noqa (part 2) (#1736)
* update noqa

* remove noqa which isn't needed
2025-09-28 15:21:12 +03:00
Tamir Kamara
bc4f85b129 Update noqa syntax (#1734) 2025-09-28 08:44:04 +03:00
rishasurana
3f510cf8c4 Azure Health and Data Services (AHDS) De-identification Service Surrogator (#1672) 2025-08-15 23:50:04 +02:00
Sharon Hart
a4d49983e4 Update requirements.txt (#1689) 2025-08-10 14:05:52 +03:00
Sharon Hart
c8efdd7109 Force streamlit dependency versions (#1685) 2025-08-04 13:35:21 +03:00
Sharon Hart
333a1cdefd Update requirements.txt with new dependencies 2025-08-03 10:23:04 +03:00
Risha S.
13f9d4c8b6 Azure Health and Data Services (AHDS) De-identification Service (#1624) 2025-07-16 20:16:28 +03:00
FT
c1a917b0f4 Fix Typos in Documentation and Test Descriptions (#1631)
* Update test_context_support.py

* Update image_redaction_allow_list_approach.ipynb

---------

Co-authored-by: Sharon Hart <sharonh.dev@gmail.com>
2025-06-17 10:46:18 +03:00
leopardracer
3a306570e0 Fix Typos in Documentation and Test Descriptions (#1628)
* Update test_context_support.py

* Update index.md

* Update docs/samples/python/transformers_recognizer/index.md

---------

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>
2025-06-13 11:34:44 +03:00
Ron Shakutai
452d6bb1a5 refactor: simplify index retrieval in InstanceCounterAnonymizer (#1577) 2025-05-07 21:24:47 +03:00
Omri Mendels
bacf23fa39 Add multiprocessing parameters (#1521) 2025-03-10 11:59:03 +02:00
Omri Mendels
7d26bac0a1 example GLiNER integration (#1504) 2025-01-13 11:03:08 +02:00
Omri Mendels
bed2979d4a Docs revamp (#1500) 2024-12-29 13:16:29 +02:00
Sharon Hart
ce63783fcc Unlock numpy after dropping 3.8 (#1480) 2024-11-06 15:21:45 +02:00
Omri Mendels
33808c2837 Removed python 3.8 support (EOL) and added 3.12 (#1479) 2024-11-04 11:47:02 +02:00
Ranjan Singh
d85ba6e5a7 Typo fix added missing ":" after if condition (#1419) 2024-07-22 11:59:05 +03:00
Omri Mendels
d46bacb20b minor notebook changes (#1420) 2024-07-22 11:58:46 +03:00
Omri Mendels
ac38ccae3c NLP engine sample + refresh on samples (#1388) 2024-07-10 16:04:47 +03:00
Andreas Eberle
97a7e42b38 Fix the entity filtering of the transformer_recognizer.py analzye function (#1403) 2024-07-09 22:19:20 +03:00
Vijay Devane
733cca26cf Adding Span Marker Recognizer Sample (#1321)
* Adding Span Marker Recognizer Sample

* Removing "O" label

* Added parameters definitions

* Added span marker sample in list of samples
2024-03-13 06:51:43 +02:00
Omri Mendels
ee84d70b0d Added the option to add custom operators + pseudonymization sample (#1284) 2024-02-12 15:45:52 +02:00
Jakob Serlier
966d17a5a5 Feature/presidio-structured (#1192)
* presidio-structured

changelog

Static analysis

docstrings, types

preliminary tests engine

static analysis

isort

Minor refactorings

Update README.md

Fix late binding issues and example

removal of old samples

Refactoring, adding example

pre-clean-break-commit

broken commit, fixing TabularConfigBuilder

Rename TabularConfig

pre-breaking replace commit

removal of some old experimental files

rename tabular to structured

restructuring presidio tabular - pre del commit

Add project TODOs

testing dump presidio tabular

* Add unit tests

* rename engine, add buildfile

* Update setup.py

* lint-build-test

* Update lint-build-test.yml

* Add packages to setup.py

* Update presidio-structured to alpha version

* Update Presidio structured README.md

* Add logging configuration to presidio-structured
module

* Refactor AnalysisBuilder constructor to accept an
optional AnalyzerEngine parameter

* Fix entity mapping in JsonAnalysisBuilder

* Drop type in docstring in analysis builder classes

* Refactor TabularAnalysisBuilder to use
BatchAnalyzerEngine for all columns

* Update data_reader.py with type hints for file
paths

* Update data_reader.py to include additional
keyword arguments in read() method

* Update Transformer to Processor term in
StructuredEngine

* Add PandasDataProcessor as default to StructuredEngine
init

* Move structured sample files to the docs

* Add Presidio Structured  Notebook to samples index

* Remove unnecessary imports in structured sample

* Update to processors in structured __init__ files

* Add explanation for structured table sample

* Delete unnecessary __init__s in structured test

* Fix bug in JsonAnalysisBuilder entity mapping

* pr comments, nits, minor tests

* README

* Add TabularAnalysisBuilder

* Some basic logging

* linting

* Fix typo in logger variable name

* Refactor analysis builder to include score
threshold

* Linting, continued

* Update Pipfile

* Refactor JsonAnalysisBuilder to support language
parameter

* Fix not camel case in TabularAnalysisBuilder

* Add score_threshold parameter to AnalysisBuilder

* Refactor JSON analysis builder to gain consistency

* Remove low score results in JsonAnalysisBuilder

* Add tests to json analysis  with score threshold

* Fix bug in JSON analysis to update map with
nested_mappings

* Fix bug in JSON analysis to take only entity types

* Fix typos in test anl json names and assert values

* Update build-structured.yml

* Create __init__.py

* Type hint fix python <3.10, loggger typo

* Update setup.py

* PR comments variety

* further pr comments

* readme, refactor score, refactor tabular analysis

* Update test_analysis_builder.py

* lint

---------

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>
Co-authored-by: Sharon Hart <sharonh.dev@gmail.com>
Co-authored-by: enrique.botia <enrique.botia@netzima.com>
2024-01-14 11:22:44 +02:00
Omri Mendels
2a8d3ec93b Azure AI language recognizer (#1228) 2024-01-11 13:13:43 +02:00
Vijay Devane
175c170876 Update index.md (#1241)
Removed the extra symbol that causing error to load the site
2023-12-28 21:20:10 +02:00
Omri Mendels
b24dbeda54 Updates to demo website with new NLP Engine (#1181) 2023-12-13 18:57:10 +02:00
Omri Mendels
4aaa05fca8 New NlpEngine - docs (#1177) 2023-10-25 15:17:56 +03:00
Nile Wilson
7400dc4b35 Updating verification engines and enable plotting of custom bboxes (#1164)
* Adding methods to enable plotting of custom bboxes

* Adding test for get_pii_bboxes

* Linting fixes and addition of test for add_custom_bboxes

* Adding use of custom bbox into DICOM verification engine

* Fixing tests for the DICOM verification engine

* Adding in ocr kwargs compatibility and updating tests

* Adding example notebook

* Linting fixes

* Remaining linting fix

---------

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>
2023-09-28 16:02:10 -04:00
Nile Wilson
93934a93b2 Adding examples of toggling metadata usage and saving bboxes (#1158) 2023-08-28 08:56:56 +03:00
Nile Wilson
60e1f7db94 Enabling allow list approach with all image redaction (#1145)
* Enabling allow list approach

* Adding in empty list for allow_list in existing unit tests

* Added unit tests for newly introduced methods

* Adding unit test for allow list functionality

* Linting fixes

* Removing spaces in empty lines

* Fix integration test not accounting for empty space removal

* Updating notebook with more examples and adding ad_hoc_recognizers approach to standard image redactor engine as well

* Linting fixes

* Removing incomplete example code

* Fixing section header numbers

* Removing duplicate comment

---------

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>
2023-08-23 16:44:47 -04:00
Omri Mendels
0e5c3b7907 Updated docs website and notebooks (#1086) 2023-06-04 12:55:08 +03:00
Omri Mendels
dda4444fda Updates to the TransformersRecognizer sample (#1084) 2023-06-04 12:14:18 +03:00
Omri Mendels
3e84d9ef25 Updated demo website (#1078) 2023-06-01 16:53:03 +03:00
Nava Vaisman Levy
481811af11 Add batch anonymization (#993) 2023-05-01 09:18:00 +03:00
Paulo Costa
24a76a8f44 Added "keep" anonymizer (#1062) 2023-04-30 10:25:00 +03:00
Omri Mendels
61a5405611 New demo app for Presidio, based on Streamlit (#1054) 2023-04-24 14:35:03 +03:00
Omri Mendels
60911edf16 GPT-3 based synthetic data generation (#1051) 2023-04-16 12:41:36 +03:00
Andy
07b854dd7a Adding a sample for identifying PII in a PDF (#1023) 2023-01-30 15:46:36 +02:00
Nile Wilson
b0430cabbb Add evaluation code for DICOM de-identification (#979)
* Initial commit with old paths (will need to fix)

* Fixing paths

* Adding in notebook and updating documentation

* Adding in WIP notebook and docs

* Adding example notebook

* Clearing some output to reduce file size

* Linting fix v1

* Linting v2

* Add rounding to integration test to account for minor differences in real testing

* Fixing typo with wrong variable name

* Removing check for exact or rounded conf

* Updating logic for comparing ocr_results

* Minor fixes on DICOM verify code based on PR comments

* Changing results and gt format from dictionary to list of dictionaries

* Updating notebook

* Updating docstring format

* Linting fix

* Changing fixture scope for mock_engine

* Update docs/image-redactor/evaluating_dicom_redaction.md

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>

* Docstring updates

* Improving efficiency of _remove_duplicate_entities

* Add handling for divide by zero in recall and precision calculations

* Making precision and recall calculation functions public

* Moving common fixtures to conftest

* PR comments

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>
2023-01-05 08:01:46 -05:00
Nava Vaisman Levy
8993be09e9 fix access to start end positions (#994) 2023-01-03 14:50:45 +02:00
Nava Vaisman Levy
aab4d20ee7 Sample - analyze and anonymize csv file (#990) 2022-12-29 14:59:06 +02:00
Omri Mendels
77b86ce01d Rename transformer_recognizer.md to index.md (#984) 2022-12-19 14:18:27 +02:00
Omri Mendels
b0a4c72d28 Update example_text_analytics_recognizer.py (#981) 2022-12-19 12:28:23 +02:00
melmatlis
2107f051c6 add revised example for transformer recognizer (#962)
* add revised example for transformer recognizer

* update documentation index to point to new example

* Update docs/samples/python/transformers_recognizer/transformer_recognizer.py

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>

* linting, docstrings, readibility

* externalize text splitting parameters

* document class input variables

* add documentaiton to the sample

* Update docs/samples/python/transformers_recognizer/transformer_recognizer.md

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>

* Update docs/samples/python/transformers_recognizer/transformer_recognizer.md

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>

* Update docs/samples/python/transformers_recognizer/transformer_recognizer.md

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>

* update documentation

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>
Co-authored-by: Sharon Hart <sharonh.dev@gmail.com>
2022-12-19 10:18:40 +02:00
Nile Wilson
2730c6c00b Adding DICOM image redacting capability to presidio-image-redactor module (#960)
* Adding DicomImageRedactorEngine class without test data for now

* Updating and putting placeholder in package doc

* Updating docs

* Moving presidio-dicom-image-redactor module into presidio-image-redactor module as an extension

* Updating docs to reflect refactor from presidio-dicom-image-redactor module to extension of presidio-image-redactor module

* Docs fixes continued

* Reflecting move from new module to updating existing module

* Updating requirements

* Linting fixes

* Linting fixes. Function and variable name casing

* Fixing getting started code blocks

* Updating image redactor version

* Fix minor typo: phi -> PHI in comment

* Update presidio-image-redactor/presidio_image_redactor/utils/dicom_image_redact_utils.py

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>

* Update presidio-image-redactor/presidio_image_redactor/utils/dicom_image_redact_utils.py

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>

* Fixing new typing adding added from PR comment commit

* Moving all utils into the DicomImageRedactorEngine class

* Fixing integration test now that utils have been moved

* Moving to ad-hoc recognizer approach

* Updating redact to have similar format as in ImageRedactorEngine. Moved existing logic for redact into redact_from_file

* Updating requirements

* Updating docs with new getting started code

* Versioning and changelog updates

* Adding in data with citations

* Linting fixes

* Minor change: from multiple list append to list extend

* Adding pytest-mock to requirements

* Fixing paths to test data

* Making file extension search more flexible and work with both Windows and Unix systems

* Changing docstring style to match rest of repo

* Making statement about Tesseract version more general in one other doc (was caught in another earlier)

* Changing box_color_setting to fill for consistency

* Updating changelog based on PR comments

* Update docs/image-redactor/index.md

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>

* Updating docs

* Adding **kwargs support and addressing minor comments

* Adjusting with clause duration

* Adding note about custom ImageAnalyzerEngine support

* Changing minor comment in docstring

* Splitting redact_from_file into redact_from_file and redact_from_directory

Co-authored-by: Omri Mendels <omri374@users.noreply.github.com>
2022-12-13 08:47:30 -05:00
Matthew
fa9a3703cc Add missing comma (#946) 2022-11-15 14:34:07 +02:00
Eran
fb01d2374e Update index.md (#897) 2022-07-21 10:52:51 +03:00